From f01ab65054c0d519b148e01919a02092dc8e7676 Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 11 Dec 2024 22:37:15 +0800 Subject: [PATCH 001/124] Update Repo --- .editorconfig | 13 + .env.example | 1 + .github/CONTRIBUTING.md | 79 +- .github/ISSUE_TEMPLATE/Bug_report.md | 13 +- .github/PULL_REQUEST_TEMPLATE.md | 9 +- .github/SECURITY.md | 2 +- .github/dependabot.yml | 19 - .github/labels.yml | 24 + .github/renovate.json | 27 + .github/scripts/checkCoverage.ts | 54 + .github/workflows/UpdateDocs.yml | 81 + .github/workflows/ci-cd-18x.yml | 84 - .github/workflows/ci-cd-20x.yml | 84 - .github/workflows/ci-cd.yml | 132 + .github/workflows/docs.yml | 43 - .github/workflows/prettier.yml | 25 - .gitignore | 53 +- .npmignore | 32 +- .prettierignore | 6 + .vscode/extensions.json | 11 + .vscode/launch.json | 15 - .vscode/settings.json | 7 + README.md | 42 +- docs/general/errorHandling.md | 17 - docs/general/welcome.md | 63 - docs/index.yml | 38 - docs/methods/getAPIStatus.md | 65 - docs/methods/getBoosters.md | 67 - docs/methods/getEndedSkyblockAuctions.md | 70 - docs/methods/getGuild.md | 94 - docs/methods/getLeaderboards.md | 169 - docs/methods/getPlayer.md | 131 - docs/methods/getRecentGames.md | 52 - docs/methods/getServerInfo.md | 53 - docs/methods/getSkyblockAuctions.md | 138 - docs/methods/getSkyblockAuctionsByPlayer.md | 101 - docs/methods/getSkyblockBazaar.md | 65 - docs/methods/getSkyblockMember.md | 138 - docs/methods/getSkyblockProfiles.md | 74 - docs/methods/getStatus.md | 45 - docs/methods/getWatchdogStats.md | 44 - eslint.config.mjs => eslint.config.js | 30 +- package-lock.json | 4815 ----------------- package.json | 62 +- pnpm-lock.yaml | 2758 ++++++++++ src/API/getAPIStatus.js | 8 - src/API/getAchievements.js | 7 - src/API/getAchievements.test.ts | 103 + src/API/getAchievements.ts | 21 + src/API/getActiveHouses.test.ts | 44 + src/API/getActiveHouses.ts | 21 + src/API/getBoosters.js | 7 - src/API/getBoosters.test.ts | 74 + src/API/getBoosters.ts | 21 + src/API/getChallenges.js | 7 - src/API/getChallenges.test.ts | 51 + src/API/getChallenges.ts | 20 + src/API/getGameCounts.js | 7 - src/API/getGameCounts.test.ts | 27 + src/API/getGameCounts.ts | 21 + src/API/getGuild.js | 19 - src/API/getGuild.test.ts | 606 +++ src/API/getGuild.ts | 38 + src/API/getGuildAchievements.js | 7 - src/API/getGuildAchievements.test.ts | 83 + src/API/getGuildAchievements.ts | 21 + src/API/getHouse.test.ts | 51 + src/API/getHouse.ts | 22 + src/API/getLeaderboards.js | 15 - src/API/getLeaderboards.test.ts | 65 + src/API/getLeaderboards.ts | 28 + src/API/getPlayer.js | 23 - src/API/getPlayer.test.ts | 664 +++ src/API/getPlayer.ts | 31 + src/API/getPlayerHouses.test.ts | 52 + src/API/getPlayerHouses.ts | 23 + src/API/getQuests.js | 7 - src/API/getQuests.test.ts | 62 + src/API/getQuests.ts | 21 + src/API/getRecentGames.js | 14 - src/API/getRecentGames.test.ts | 55 + src/API/getRecentGames.ts | 23 + src/API/getServerInfo.js | 71 - src/API/getSkyblockAuction.test.ts | 376 ++ src/API/getSkyblockAuction.ts | 37 + src/API/getSkyblockAuctions.test.ts | 358 ++ src/API/getSkyblockAuctions.ts | 55 + src/API/getSkyblockAuctionsByPlayer.test.ts | 250 + src/API/getSkyblockAuctionsByPlayer.ts | 23 + src/API/getSkyblockBazaar.test.ts | 51 + src/API/getSkyblockBazaar.ts | 21 + src/API/getSkyblockBingo.test.ts | 43 + src/API/getSkyblockBingo.ts | 21 + src/API/getSkyblockFireSales.test.ts | 60 + src/API/getSkyblockFireSales.ts | 21 + src/API/getSkyblockGarden.test.ts | 53 + src/API/getSkyblockGarden.ts | 22 + src/API/getSkyblockGovernment.test.ts | 62 + src/API/getSkyblockGovernment.ts | 21 + src/API/getSkyblockMember.test.ts | 657 +++ src/API/getSkyblockMember.ts | 42 + src/API/getSkyblockMuseum.test.ts | 96 + src/API/getSkyblockMuseum.ts | 26 + src/API/getSkyblockNews.test.ts | 38 + src/API/getSkyblockNews.ts | 21 + src/API/getSkyblockProfiles.test.ts | 159 + src/API/getSkyblockProfiles.ts | 40 + src/API/getStatus.js | 9 - src/API/getStatus.test.ts | 59 + src/API/getStatus.ts | 22 + src/API/getWatchdogStats.js | 7 - src/API/getWatchdogStats.test.ts | 38 + src/API/getWatchdogStats.ts | 21 + src/API/housing/getActiveHouses.js | 7 - src/API/housing/getHouse.js | 9 - src/API/housing/getPlayerHouses.js | 11 - src/API/index.js | 35 - src/API/index.ts | 56 + src/API/skyblock/getAuction.js | 21 - src/API/skyblock/getAuctions.js | 74 - src/API/skyblock/getAuctionsByPlayer.js | 11 - src/API/skyblock/getBazaar.js | 8 - src/API/skyblock/getBingo.js | 7 - src/API/skyblock/getBingoByPlayer.js | 14 - src/API/skyblock/getEndedAuctions.js | 11 - src/API/skyblock/getFireSales.js | 7 - src/API/skyblock/getGarden.js | 11 - src/API/skyblock/getGovernment.js | 7 - src/API/skyblock/getMember.js | 35 - src/API/skyblock/getMuseum.js | 15 - src/API/skyblock/getNews.js | 7 - src/API/skyblock/getProfiles.js | 49 - src/Client.js | 547 -- src/Client.test.ts | 149 + src/Client.ts | 243 + src/Errors.js | 68 - src/Errors.ts | 45 + src/Private/CacheHandler.test.ts | 49 + src/Private/CacheHandler.ts | 41 + src/Private/Endpoint.test.ts | 23 + src/Private/Endpoint.ts | 14 + src/Private/Functions.test.ts | 54 + src/Private/Functions.ts | 20 + src/Private/RateLimit.test.ts | 92 + src/Private/RateLimit.ts | 38 + src/Private/RequestData.ts | 28 + src/Private/RequestHandler.test.ts | 100 + src/Private/RequestHandler.ts | 133 + src/Private/Updater.test.ts | 76 + src/Private/Updater.ts | 47 + src/Private/defaultCache.js | 77 - src/Private/rateLimit.js | 83 - src/Private/requests.js | 82 - src/Private/updater.js | 34 - src/Private/uuidCache.js | 30 - src/Private/validate.js | 108 - src/Structures/Boosters/Booster.test.ts | 8 + src/Structures/Boosters/Booster.ts | 41 + src/Structures/Color.test.ts | 25 + src/Structures/Color.ts | 83 + src/Structures/Game.ts | 42 + src/Structures/GameCounts.ts | 24 + src/Structures/Guild/Guild.test.ts | 61 + src/Structures/Guild/Guild.ts | 68 + src/Structures/Guild/GuildMember.test.ts | 31 + src/Structures/Guild/GuildMember.ts | 34 + src/Structures/Guild/GuildRank.test.ts | 24 + src/Structures/Guild/GuildRank.ts | 22 + src/Structures/House.test.ts | 25 + src/Structures/House.ts | 24 + src/Structures/Housing.ts | 42 + src/Structures/ItemBytes.ts | 12 + src/Structures/Leaderboard.test.ts | 27 + src/Structures/Leaderboard.ts | 18 + .../MiniGames/Arcade/Arcade.test.ts | 70 + src/Structures/MiniGames/Arcade/Arcade.ts | 66 + .../MiniGames/Arcade/BlockingDead.test.ts | 18 + .../MiniGames/Arcade/BlockingDead.ts | 12 + .../MiniGames/Arcade/BountyHunters.test.ts | 30 + .../MiniGames/Arcade/BountyHunters.ts | 22 + .../MiniGames/Arcade/DragonWars.test.ts | 15 + src/Structures/MiniGames/Arcade/DragonWars.ts | 10 + .../MiniGames/Arcade/Dropper.test.ts | 33 + src/Structures/MiniGames/Arcade/Dropper.ts | 27 + .../MiniGames/Arcade/DropperMap.test.ts | 15 + src/Structures/MiniGames/Arcade/DropperMap.ts | 10 + .../MiniGames/Arcade/EnderSpleef.test.ts | 30 + .../MiniGames/Arcade/EnderSpleef.ts | 22 + .../MiniGames/Arcade/FarmHunt.test.ts | 45 + src/Structures/MiniGames/Arcade/FarmHunt.ts | 30 + .../MiniGames/Arcade/Football.test.ts | 21 + src/Structures/MiniGames/Arcade/Football.ts | 14 + .../MiniGames/Arcade/GalaxyWars.test.ts | 36 + src/Structures/MiniGames/Arcade/GalaxyWars.ts | 27 + .../MiniGames/Arcade/HideAndSeek.test.ts | 21 + .../MiniGames/Arcade/HideAndSeek.ts | 17 + .../MiniGames/Arcade/HoleInTheWall.test.ts | 16 + .../MiniGames/Arcade/HoleInTheWall.ts | 16 + .../MiniGames/Arcade/HypixelSays.test.ts | 21 + .../MiniGames/Arcade/HypixelSays.ts | 14 + .../MiniGames/Arcade/MiniWalls.test.ts | 42 + src/Structures/MiniGames/Arcade/MiniWalls.ts | 31 + .../MiniGames/Arcade/PartyGames.test.ts | 18 + src/Structures/MiniGames/Arcade/PartyGames.ts | 12 + .../MiniGames/Arcade/PartyPooper.test.ts | 18 + .../MiniGames/Arcade/PartyPooper.ts | 12 + .../MiniGames/Arcade/PixelParty.test.ts | 40 + src/Structures/MiniGames/Arcade/PixelParty.ts | 31 + .../Arcade/PixelPartyGameMode.test.ts | 27 + .../MiniGames/Arcade/PixelPartyGameMode.ts | 21 + .../MiniGames/Arcade/PropHunt.test.ts | 18 + src/Structures/MiniGames/Arcade/PropHunt.ts | 12 + .../MiniGames/Arcade/ThrowOut.test.ts | 21 + src/Structures/MiniGames/Arcade/ThrowOut.ts | 16 + .../MiniGames/Arcade/Zombies.test.ts | 37 + src/Structures/MiniGames/Arcade/Zombies.ts | 39 + .../MiniGames/Arcade/ZombiesStats.test.ts | 45 + .../MiniGames/Arcade/ZombiesStats.ts | 33 + .../MiniGames/ArenaBrawl/ArenaBrawl.test.ts | 33 + .../MiniGames/ArenaBrawl/ArenaBrawl.ts | 27 + .../ArenaBrawl/ArenaBrawlMode.test.ts | 39 + .../MiniGames/ArenaBrawl/ArenaBrawlMode.ts | 29 + .../MiniGames/BedWars/BedWars.test.ts | 91 + src/Structures/MiniGames/BedWars/BedWars.ts | 143 + .../MiniGames/BedWars/BedWarsBeds.ts | 16 + .../BedWars/BedWarsCollectedItems.ts | 14 + .../MiniGames/BedWars/BedWarsDreamMode.ts | 13 + .../MiniGames/BedWars/BedWarsDreamStats.ts | 18 + .../MiniGames/BedWars/BedWarsMode.ts | 36 + .../BedWars/Practice/BedWarsPracticeBase.ts | 10 + .../BedWarsPracticeBaseBlocksPlaced.ts | 11 + .../Practice/BedWarsPracticeBridging.ts | 12 + .../BedWarsPracticeBridgingRecords.ts | 14 + .../Practice/BedWarsPracticeModeAttempts.ts | 12 + .../BedWars/Practice/BedWarsPracticeRecord.ts | 14 + .../BedWarsPracticeRecordElevation.ts | 16 + .../BedWars/Practice/BedWarsPracticeStats.ts | 21 + .../BlitzSurvivalGames.test.ts | 2241 ++++++++ .../BlitzSurvivalGames/BlitzSurvivalGames.ts | 132 + .../BlitzSurvivalGamesKit.ts | 47 + src/Structures/MiniGames/BuildBattle.test.ts | 44 + src/Structures/MiniGames/BuildBattle.ts | 30 + .../CopsAndCrims/CopsAndCrims.test.ts | 165 + .../MiniGames/CopsAndCrims/CopsAndCrims.ts | 128 + .../CopsAndCrims/CopsAndCrimsGamemode.test.ts | 38 + .../CopsAndCrims/CopsAndCrimsGamemode.ts | 29 + .../CopsAndCrims/CopsAndCrimsGun.test.ts | 29 + .../MiniGames/CopsAndCrims/CopsAndCrimsGun.ts | 22 + src/Structures/MiniGames/Duels/Duels.test.ts | 1860 +++++++ src/Structures/MiniGames/Duels/Duels.ts | 95 + src/Structures/MiniGames/Duels/DuelsBridge.ts | 146 + .../MiniGames/Duels/DuelsGamemode.ts | 47 + .../MiniGames/Duels/DuelsMegaWalls.ts | 52 + src/Structures/MiniGames/Duels/DuelsOP.ts | 52 + .../MiniGames/Duels/DuelsSkyWars.ts | 52 + src/Structures/MiniGames/Duels/DuelsUHC.ts | 66 + .../MiniGames/MegaWalls/MegaWalls.test.ts | 129 + .../MiniGames/MegaWalls/MegaWalls.ts | 109 + .../MegaWalls/MegaWallsKitStats.test.ts | 71 + .../MiniGames/MegaWalls/MegaWallsKitStats.ts | 52 + .../MegaWalls/MegaWallsModeStats.test.ts | 66 + .../MiniGames/MegaWalls/MegaWallsModeStats.ts | 48 + .../MurderMystery/MurderMystery.test.ts | 75 + .../MiniGames/MurderMystery/MurderMystery.ts | 55 + .../MurderMysteryModeStats.test.ts | 51 + .../MurderMystery/MurderMysteryModeStats.ts | 37 + src/Structures/MiniGames/Paintball.test.ts | 52 + src/Structures/MiniGames/Paintball.ts | 39 + src/Structures/MiniGames/Pit/Pit.test.ts | 221 + src/Structures/MiniGames/Pit/Pit.ts | 128 + .../MiniGames/Pit/PitInventoryItem.ts | 20 + .../MiniGames/Quakecraft/Quakecraft.test.ts | 68 + .../MiniGames/Quakecraft/Quakecraft.ts | 58 + .../Quakecraft/QuakecraftMode.test.ts | 33 + .../MiniGames/Quakecraft/QuakecraftMode.ts | 25 + src/Structures/MiniGames/SkyWars/SkyWars.ts | 153 + .../MiniGames/SkyWars/SkyWarsKit.ts | 19 + .../MiniGames/SkyWars/SkyWarsKits.ts | 13 + .../MiniGames/SkyWars/SkyWarsMode.test.ts | 27 + .../MiniGames/SkyWars/SkyWarsMode.ts | 21 + .../SkyWars/SkyWarsModeStats.test.ts | 86 + .../MiniGames/SkyWars/SkyWarsModeStats.ts | 62 + .../MiniGames/SkyWars/SkyWarsPackages.ts | 26 + .../MiniGames/SkyWars/Skywars.test.ts | 142 + .../MiniGames/SmashHeroes/SmashHeoresHero.ts | 31 + .../MiniGames/SmashHeroes/SmashHeroes.test.ts | 85 + .../MiniGames/SmashHeroes/SmashHeroes.ts | 73 + .../MiniGames/SmashHeroes/SmashHeroesMode.ts | 21 + .../MiniGames/SpeedUHC/SpeedUHC.test.ts | 67 + src/Structures/MiniGames/SpeedUHC/SpeedUHC.ts | 51 + .../MiniGames/SpeedUHC/SpeedUHCMode.test.ts | 39 + .../MiniGames/SpeedUHC/SpeedUHCMode.ts | 29 + .../MiniGames/TNTGames/BowSpleef.test.ts | 21 + .../MiniGames/TNTGames/BowSpleef.ts | 16 + .../MiniGames/TNTGames/PVPRun.test.ts | 39 + src/Structures/MiniGames/TNTGames/PVPRun.ts | 29 + .../MiniGames/TNTGames/TNTGames.test.ts | 33 + src/Structures/MiniGames/TNTGames/TNTGames.ts | 28 + .../MiniGames/TNTGames/TNTRun.test.ts | 30 + src/Structures/MiniGames/TNTGames/TNTRun.ts | 22 + .../MiniGames/TNTGames/TNTTag.test.ts | 36 + src/Structures/MiniGames/TNTGames/TNTTag.ts | 27 + .../MiniGames/TNTGames/TNTWizards.test.ts | 36 + .../MiniGames/TNTGames/TNTWizards.ts | 27 + .../TurboKartRacers/TurboKartRacers.test.ts | 58 + .../TurboKartRacers/TurboKartRacers.ts | 45 + .../TurboKartRacersMap.test.ts | 27 + .../TurboKartRacers/TurboKartRacersMap.ts | 20 + src/Structures/MiniGames/UHC/UHC.test.ts | 57 + src/Structures/MiniGames/UHC/UHC.ts | 96 + .../MiniGames/UHC/UHCGamemode.test.ts | 27 + src/Structures/MiniGames/UHC/UHCGamemode.ts | 24 + .../MiniGames/VampireZ/VampireZ.test.ts | 37 + src/Structures/MiniGames/VampireZ/VampireZ.ts | 29 + .../MiniGames/VampireZ/VampireZRole.test.ts | 24 + .../MiniGames/VampireZ/VampireZRole.ts | 19 + src/Structures/MiniGames/Walls.test.ts | 33 + src/Structures/MiniGames/Walls.ts | 24 + .../MiniGames/Warlords/Warlords.test.ts | 72 + src/Structures/MiniGames/Warlords/Warlords.ts | 62 + .../MiniGames/Warlords/WarlordsClass.test.ts | 30 + .../MiniGames/Warlords/WarlordsClass.ts | 23 + .../WoolGames/CaptureTheWool.test.ts | 39 + .../MiniGames/WoolGames/CaptureTheWool.ts | 28 + .../MiniGames/WoolGames/SheepWars.test.ts | 57 + .../MiniGames/WoolGames/SheepWars.ts | 40 + .../MiniGames/WoolGames/WoolGames.test.ts | 41 + .../MiniGames/WoolGames/WoolGames.ts | 44 + .../MiniGames/WoolGames/WoolWars.test.ts | 55 + .../MiniGames/WoolGames/WoolWars.ts | 44 + .../MiniGames/WoolGames/WoolWarsClass.test.ts | 39 + .../MiniGames/WoolGames/WoolWarsClass.ts | 30 + src/Structures/Player/Cosmetics.test.ts | 35 + src/Structures/Player/Cosmetics.ts | 56 + src/Structures/Player/Gifting.test.ts | 25 + src/Structures/Player/Gifting.ts | 18 + src/Structures/Player/MonthlyCrate.test.ts | 21 + src/Structures/Player/MonthlyCrate.ts | 18 + src/Structures/Player/Parkour.test.ts | 17 + src/Structures/Player/Parkour.ts | 17 + src/Structures/Player/Pet.test.ts | 43 + src/Structures/Player/Pet.ts | 41 + src/Structures/Player/PetConsumables.test.ts | 90 + src/Structures/Player/PetConsumables.ts | 60 + src/Structures/Player/Pets.test.ts | 19 + src/Structures/Player/Pets.ts | 17 + src/Structures/Player/Player.test.ts | 184 + src/Structures/Player/Player.ts | 145 + .../Player/PlayerAchievements.test.ts | 23 + src/Structures/Player/PlayerAchievements.ts | 20 + .../Player/PlayerAchievementsRewards.test.ts | 9 + .../Player/PlayerAchievementsRewards.ts | 19 + .../Player/Quests/PlayerQuest.test.ts | 14 + src/Structures/Player/Quests/PlayerQuest.ts | 12 + .../Quests/PlayerQuestCompletion.test.ts | 15 + .../Player/Quests/PlayerQuestCompletion.ts | 12 + .../Quests/PlayerQuestCompletions.test.ts | 15 + .../Player/Quests/PlayerQuestCompletions.ts | 15 + .../Player/Quests/PlayerQuests.test.ts | 14 + src/Structures/Player/Quests/PlayerQuests.ts | 15 + src/Structures/Player/Rewards.test.ts | 28 + src/Structures/Player/Rewards.ts | 29 + src/Structures/Player/Seasonal/Season.test.ts | 15 + src/Structures/Player/Seasonal/Season.ts | 14 + .../Player/Seasonal/SeasonBingo.test.ts | 16 + src/Structures/Player/Seasonal/SeasonBingo.ts | 14 + .../Player/Seasonal/SeasonBingoTier.test.ts | 13 + .../Player/Seasonal/SeasonBingoTier.ts | 10 + .../Player/Seasonal/SeasonYear.test.ts | 22 + src/Structures/Player/Seasonal/SeasonYear.ts | 20 + .../Player/Seasonal/Seasonal.test.ts | 23 + src/Structures/Player/Seasonal/Seasonal.ts | 20 + src/Structures/Player/SocialMedia.test.ts | 14 + src/Structures/Player/SocialMedia.ts | 18 + src/Structures/Player/Tourney/Tourney.test.ts | 20 + src/Structures/Player/Tourney/Tourney.ts | 21 + .../Player/Tourney/TourneyData.test.ts | 21 + src/Structures/Player/Tourney/TourneyData.ts | 14 + src/Structures/RecentGame.ts | 28 + src/Structures/RecentGames.test.ts | 29 + src/Structures/SkyBlock/Auctions/Auction.ts | 43 + .../SkyBlock/Auctions/AuctionInfo.ts | 16 + .../SkyBlock/Auctions/BaseAuction.test.ts | 22 + .../SkyBlock/Auctions/BaseAuction.ts | 22 + src/Structures/SkyBlock/Auctions/Bid.ts | 22 + src/Structures/SkyBlock/Bazaar/Order.test.ts | 24 + src/Structures/SkyBlock/Bazaar/Order.ts | 18 + .../SkyBlock/Bazaar/Product.test.ts | 50 + src/Structures/SkyBlock/Bazaar/Product.ts | 26 + src/Structures/SkyBlock/News/SkyblockNews.ts | 35 + .../SkyBlock/SkyblockGarden.test.ts | 30 + .../SkyBlock/SkyblockGarden.ts} | 109 +- src/Structures/SkyBlock/SkyblockGemstone.ts | 12 + .../SkyBlock/SkyblockInventoryItem.ts | 75 + .../SkyBlock/SkyblockMember.test.ts | 77 + src/Structures/SkyBlock/SkyblockMember.ts | 239 + .../SkyBlock/SkyblockMemberMinion.ts | 34 + .../SkyBlock/SkyblockMemberMinions.ts | 32 + .../SkyBlock/SkyblockMemberStats.ts | 140 + src/Structures/SkyBlock/SkyblockMuseum.ts | 43 + src/Structures/SkyBlock/SkyblockMuseumItem.ts | 26 + src/Structures/SkyBlock/SkyblockPet.ts | 31 + src/Structures/SkyBlock/SkyblockProfile.ts | 45 + src/Structures/SkyBlock/Static/Bingo.ts | 50 + src/Structures/SkyBlock/Static/BingoData.ts | 21 + src/Structures/SkyBlock/Static/Candidate.ts | 26 + src/Structures/SkyBlock/Static/FireSale.ts | 24 + src/Structures/SkyBlock/Static/Government.ts | 42 + src/Structures/SkyBlock/Static/Perk.ts | 10 + .../Static/Achievements/Achievements.ts | 17 + .../Static/Achievements/BaseAchievement.ts | 20 + .../Static/Achievements/GameAchievements.ts | 23 + .../Static/Achievements/GuildAchievements.ts | 21 + .../Static/Achievements/OneTimeAchivement.ts | 15 + .../Static/Achievements/TieredAchivement.ts | 12 + src/Structures/Static/Challenge.ts | 14 + src/Structures/Static/Challenges.ts | 17 + src/Structures/Static/GameChallenges.ts | 12 + src/Structures/Static/GameQuests.ts | 12 + src/Structures/Static/Quest.test.ts | 25 + src/Structures/Static/Quest.ts | 25 + src/Structures/Static/QuestObjective.ts | 14 + src/Structures/Static/Quests.ts | 17 + src/Structures/Status.test.ts | 20 + src/Structures/Status.ts | 20 + src/Structures/WatchdogStats.test.ts | 24 + src/Structures/WatchdogStats.ts | 16 + src/Types/API.d.ts | 26 + src/Types/Booster.d.ts | 1 + src/Types/Client.d.ts | 10 + src/Types/Color.d.ts | 71 + src/Types/Game.d.ts | 95 + src/Types/Guild.d.ts | 6 + src/Types/Player.d.ts | 594 ++ src/Types/Requests.d.ts | 4 + src/Types/Skyblock.d.ts | 416 ++ src/Types/Static.d.ts | 18 + .../Constants.js => Utils/Constants.ts} | 1937 ++----- src/Utils/Divide.test.ts | 13 + src/{utils/divide.js => Utils/Divide.ts} | 4 +- src/Utils/Guild.ts | 83 + src/Utils/Oscillation.test.ts | 18 + src/Utils/Oscillation.ts | 14 + src/Utils/PlayerUtils.test.ts | 82 + src/Utils/PlayerUtils.ts | 90 + src/Utils/RemoveSnakeCase.ts | 20 + src/Utils/Romanize.test.ts | 9 + src/{utils/romanize.js => Utils/Romanize.ts} | 7 +- src/Utils/SkyblockUtils.test.ts | 9 + .../SkyblockUtils.ts} | 642 +-- src/index.js | 96 - src/index.ts | 355 ++ src/structures/APIIncident.js | 71 - src/structures/APIStatus.js | 46 - src/structures/Boosters/Booster.js | 84 - src/structures/Color.js | 174 - src/structures/Game.js | 166 - src/structures/GameCounts.js | 151 - src/structures/Guild/Guild.js | 191 - src/structures/Guild/GuildMember.js | 66 - src/structures/Guild/GuildRank.js | 48 - src/structures/House.js | 54 - src/structures/ItemBytes.js | 33 - src/structures/Leaderboard.js | 31 - src/structures/MiniGames/Arcade.js | 986 ---- src/structures/MiniGames/ArenaBrawl.js | 118 - src/structures/MiniGames/BedWars.js | 554 -- .../MiniGames/BlitzSurvivalGames.js | 424 -- src/structures/MiniGames/BuildBattle.js | 64 - src/structures/MiniGames/CopsAndCrims.js | 318 -- src/structures/MiniGames/Duels.js | 1013 ---- src/structures/MiniGames/MegaWalls.js | 478 -- src/structures/MiniGames/MurderMystery.js | 214 - src/structures/MiniGames/Paintball.js | 87 - src/structures/MiniGames/Pit.js | 247 - src/structures/MiniGames/PitInventoryItem.js | 43 - src/structures/MiniGames/Quakecraft.js | 164 - src/structures/MiniGames/SkyWars.js | 669 --- src/structures/MiniGames/SmashHeroes.js | 272 - src/structures/MiniGames/SpeedUHC.js | 168 - src/structures/MiniGames/TNTGames.js | 285 - src/structures/MiniGames/TurboKartRacers.js | 141 - src/structures/MiniGames/UHC.js | 193 - src/structures/MiniGames/VampireZ.js | 93 - src/structures/MiniGames/Walls.js | 52 - src/structures/MiniGames/Warlords.js | 187 - src/structures/MiniGames/WoolGames.js | 405 -- src/structures/Pet.js | 96 - src/structures/Pets.js | 64 - src/structures/Player.js | 346 -- src/structures/PlayerCosmetics.js | 155 - src/structures/RecentGame.js | 57 - src/structures/ServerInfo.js | 78 - src/structures/SkyBlock/Auctions/Auction.js | 106 - .../SkyBlock/Auctions/AuctionInfo.js | 56 - .../SkyBlock/Auctions/BaseAuction.js | 49 - src/structures/SkyBlock/Auctions/Bid.js | 49 - .../SkyBlock/Auctions/PartialAuction.js | 26 - src/structures/SkyBlock/Bazzar/Order.js | 38 - src/structures/SkyBlock/Bazzar/Product.js | 53 - src/structures/SkyBlock/News/SkyblockNews.js | 60 - src/structures/SkyBlock/PlayerBingo.js | 49 - .../SkyBlock/SkyblockInventoryItem.js | 168 - src/structures/SkyBlock/SkyblockMember.js | 594 -- src/structures/SkyBlock/SkyblockMuseum.js | 60 - src/structures/SkyBlock/SkyblockMuseumItem.js | 54 - src/structures/SkyBlock/SkyblockPet.js | 71 - src/structures/SkyBlock/SkyblockProfile.js | 81 - src/structures/SkyBlock/Static/Bingo.js | 101 - src/structures/SkyBlock/Static/BingoData.js | 45 - src/structures/SkyBlock/Static/Candidate.js | 50 - src/structures/SkyBlock/Static/FireSale.js | 55 - src/structures/SkyBlock/Static/Government.js | 79 - src/structures/SkyBlock/Static/Perk.js | 23 - src/structures/Static/Achievement.js | 87 - src/structures/Static/AchievementTier.js | 33 - src/structures/Static/Achievements.js | 30 - src/structures/Static/Challenges.js | 29 - src/structures/Static/GameAchievements.js | 36 - src/structures/Static/GameChallenges.js | 40 - src/structures/Static/GameQuests.js | 24 - src/structures/Static/GuildAchievements.js | 34 - src/structures/Static/Quest.js | 66 - src/structures/Static/Quests.js | 31 - src/structures/Status.js | 41 - src/structures/Watchdog/Stats.js | 36 - src/utils/Guild.js | 89 - src/utils/Player.js | 112 - src/utils/arrayTools.js | 4 - src/utils/index.js | 14 - src/utils/isGuildID.js | 3 - src/utils/isUUID.js | 5 - src/utils/oscillation.js | 17 - src/utils/removeSnakeCase.js | 33 - src/utils/rgbToHexColor.js | 8 - src/utils/toUuid.js | 24 - src/utils/varInt.js | 17 - tests/Client#getAPIStatus.js | 22 - tests/Client#getBoosters.js | 27 - tests/Client#getChallenges.js | 42 - tests/Client#getGameCounts.js | 242 - tests/Client#getGuild.js | 416 -- tests/Client#getLeaderboards.js | 29 - tests/Client#getPlayer.js | 467 -- tests/Client#getRecentGames.js | 88 - tests/Client#getServerInfo.js | 184 - tests/Client#getStatus.js | 56 - tests/Client#getWatchdogStats.js | 20 - tests/Client.js | 5 - tests/data.js | 95 - tests/housing/Client#getActiveHouses.js | 19 - tests/housing/Client#getHouse.js | 22 - tests/housing/Client#getPlayerHouses.js | 38 - tests/skyblock/Client#getSkyblockBingo.js | 17 - tests/skyblock/Client#getSkyblockFireSales.js | 19 - tests/skyblock/Client#getSkyblockGarden.js | 23 - .../skyblock/Client#getSkyblockGovernment.js | 32 - tests/skyblock/Client#getSkyblockMember.js | 53 - tests/skyblock/Client#getSkyblockNews.js | 21 - tests/skyblock/Client#getSkyblockProfiles.js | 108 - tsconfig.json | 28 + typedoc.json | 16 + typings/index.d.ts | 4335 --------------- vitest.config.ts | 8 + vitest.setup.ts | 31 + 565 files changed, 26442 insertions(+), 28459 deletions(-) create mode 100644 .editorconfig create mode 100644 .env.example delete mode 100644 .github/dependabot.yml create mode 100644 .github/labels.yml create mode 100644 .github/renovate.json create mode 100644 .github/scripts/checkCoverage.ts create mode 100644 .github/workflows/UpdateDocs.yml delete mode 100644 .github/workflows/ci-cd-18x.yml delete mode 100644 .github/workflows/ci-cd-20x.yml create mode 100644 .github/workflows/ci-cd.yml delete mode 100644 .github/workflows/docs.yml delete mode 100644 .github/workflows/prettier.yml create mode 100644 .prettierignore create mode 100644 .vscode/extensions.json delete mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json delete mode 100644 docs/general/errorHandling.md delete mode 100644 docs/general/welcome.md delete mode 100644 docs/index.yml delete mode 100644 docs/methods/getAPIStatus.md delete mode 100644 docs/methods/getBoosters.md delete mode 100644 docs/methods/getEndedSkyblockAuctions.md delete mode 100644 docs/methods/getGuild.md delete mode 100644 docs/methods/getLeaderboards.md delete mode 100644 docs/methods/getPlayer.md delete mode 100644 docs/methods/getRecentGames.md delete mode 100644 docs/methods/getServerInfo.md delete mode 100644 docs/methods/getSkyblockAuctions.md delete mode 100644 docs/methods/getSkyblockAuctionsByPlayer.md delete mode 100644 docs/methods/getSkyblockBazaar.md delete mode 100644 docs/methods/getSkyblockMember.md delete mode 100644 docs/methods/getSkyblockProfiles.md delete mode 100644 docs/methods/getStatus.md delete mode 100644 docs/methods/getWatchdogStats.md rename eslint.config.mjs => eslint.config.js (72%) delete mode 100644 package-lock.json create mode 100644 pnpm-lock.yaml delete mode 100644 src/API/getAPIStatus.js delete mode 100644 src/API/getAchievements.js create mode 100644 src/API/getAchievements.test.ts create mode 100644 src/API/getAchievements.ts create mode 100644 src/API/getActiveHouses.test.ts create mode 100644 src/API/getActiveHouses.ts delete mode 100644 src/API/getBoosters.js create mode 100644 src/API/getBoosters.test.ts create mode 100644 src/API/getBoosters.ts delete mode 100644 src/API/getChallenges.js create mode 100644 src/API/getChallenges.test.ts create mode 100644 src/API/getChallenges.ts delete mode 100644 src/API/getGameCounts.js create mode 100644 src/API/getGameCounts.test.ts create mode 100644 src/API/getGameCounts.ts delete mode 100644 src/API/getGuild.js create mode 100644 src/API/getGuild.test.ts create mode 100644 src/API/getGuild.ts delete mode 100644 src/API/getGuildAchievements.js create mode 100644 src/API/getGuildAchievements.test.ts create mode 100644 src/API/getGuildAchievements.ts create mode 100644 src/API/getHouse.test.ts create mode 100644 src/API/getHouse.ts delete mode 100644 src/API/getLeaderboards.js create mode 100644 src/API/getLeaderboards.test.ts create mode 100644 src/API/getLeaderboards.ts delete mode 100644 src/API/getPlayer.js create mode 100644 src/API/getPlayer.test.ts create mode 100644 src/API/getPlayer.ts create mode 100644 src/API/getPlayerHouses.test.ts create mode 100644 src/API/getPlayerHouses.ts delete mode 100644 src/API/getQuests.js create mode 100644 src/API/getQuests.test.ts create mode 100644 src/API/getQuests.ts delete mode 100644 src/API/getRecentGames.js create mode 100644 src/API/getRecentGames.test.ts create mode 100644 src/API/getRecentGames.ts delete mode 100644 src/API/getServerInfo.js create mode 100644 src/API/getSkyblockAuction.test.ts create mode 100644 src/API/getSkyblockAuction.ts create mode 100644 src/API/getSkyblockAuctions.test.ts create mode 100644 src/API/getSkyblockAuctions.ts create mode 100644 src/API/getSkyblockAuctionsByPlayer.test.ts create mode 100644 src/API/getSkyblockAuctionsByPlayer.ts create mode 100644 src/API/getSkyblockBazaar.test.ts create mode 100644 src/API/getSkyblockBazaar.ts create mode 100644 src/API/getSkyblockBingo.test.ts create mode 100644 src/API/getSkyblockBingo.ts create mode 100644 src/API/getSkyblockFireSales.test.ts create mode 100644 src/API/getSkyblockFireSales.ts create mode 100644 src/API/getSkyblockGarden.test.ts create mode 100644 src/API/getSkyblockGarden.ts create mode 100644 src/API/getSkyblockGovernment.test.ts create mode 100644 src/API/getSkyblockGovernment.ts create mode 100644 src/API/getSkyblockMember.test.ts create mode 100644 src/API/getSkyblockMember.ts create mode 100644 src/API/getSkyblockMuseum.test.ts create mode 100644 src/API/getSkyblockMuseum.ts create mode 100644 src/API/getSkyblockNews.test.ts create mode 100644 src/API/getSkyblockNews.ts create mode 100644 src/API/getSkyblockProfiles.test.ts create mode 100644 src/API/getSkyblockProfiles.ts delete mode 100644 src/API/getStatus.js create mode 100644 src/API/getStatus.test.ts create mode 100644 src/API/getStatus.ts delete mode 100644 src/API/getWatchdogStats.js create mode 100644 src/API/getWatchdogStats.test.ts create mode 100644 src/API/getWatchdogStats.ts delete mode 100644 src/API/housing/getActiveHouses.js delete mode 100644 src/API/housing/getHouse.js delete mode 100644 src/API/housing/getPlayerHouses.js delete mode 100644 src/API/index.js create mode 100644 src/API/index.ts delete mode 100644 src/API/skyblock/getAuction.js delete mode 100644 src/API/skyblock/getAuctions.js delete mode 100644 src/API/skyblock/getAuctionsByPlayer.js delete mode 100644 src/API/skyblock/getBazaar.js delete mode 100644 src/API/skyblock/getBingo.js delete mode 100644 src/API/skyblock/getBingoByPlayer.js delete mode 100644 src/API/skyblock/getEndedAuctions.js delete mode 100644 src/API/skyblock/getFireSales.js delete mode 100644 src/API/skyblock/getGarden.js delete mode 100644 src/API/skyblock/getGovernment.js delete mode 100644 src/API/skyblock/getMember.js delete mode 100644 src/API/skyblock/getMuseum.js delete mode 100644 src/API/skyblock/getNews.js delete mode 100644 src/API/skyblock/getProfiles.js delete mode 100644 src/Client.js create mode 100644 src/Client.test.ts create mode 100644 src/Client.ts delete mode 100644 src/Errors.js create mode 100644 src/Errors.ts create mode 100644 src/Private/CacheHandler.test.ts create mode 100644 src/Private/CacheHandler.ts create mode 100644 src/Private/Endpoint.test.ts create mode 100644 src/Private/Endpoint.ts create mode 100644 src/Private/Functions.test.ts create mode 100644 src/Private/Functions.ts create mode 100644 src/Private/RateLimit.test.ts create mode 100644 src/Private/RateLimit.ts create mode 100644 src/Private/RequestData.ts create mode 100644 src/Private/RequestHandler.test.ts create mode 100644 src/Private/RequestHandler.ts create mode 100644 src/Private/Updater.test.ts create mode 100644 src/Private/Updater.ts delete mode 100644 src/Private/defaultCache.js delete mode 100644 src/Private/rateLimit.js delete mode 100644 src/Private/requests.js delete mode 100644 src/Private/updater.js delete mode 100644 src/Private/uuidCache.js delete mode 100644 src/Private/validate.js create mode 100644 src/Structures/Boosters/Booster.test.ts create mode 100644 src/Structures/Boosters/Booster.ts create mode 100644 src/Structures/Color.test.ts create mode 100644 src/Structures/Color.ts create mode 100644 src/Structures/Game.ts create mode 100644 src/Structures/GameCounts.ts create mode 100644 src/Structures/Guild/Guild.test.ts create mode 100644 src/Structures/Guild/Guild.ts create mode 100644 src/Structures/Guild/GuildMember.test.ts create mode 100644 src/Structures/Guild/GuildMember.ts create mode 100644 src/Structures/Guild/GuildRank.test.ts create mode 100644 src/Structures/Guild/GuildRank.ts create mode 100644 src/Structures/House.test.ts create mode 100644 src/Structures/House.ts create mode 100644 src/Structures/Housing.ts create mode 100644 src/Structures/ItemBytes.ts create mode 100644 src/Structures/Leaderboard.test.ts create mode 100644 src/Structures/Leaderboard.ts create mode 100644 src/Structures/MiniGames/Arcade/Arcade.test.ts create mode 100644 src/Structures/MiniGames/Arcade/Arcade.ts create mode 100644 src/Structures/MiniGames/Arcade/BlockingDead.test.ts create mode 100644 src/Structures/MiniGames/Arcade/BlockingDead.ts create mode 100644 src/Structures/MiniGames/Arcade/BountyHunters.test.ts create mode 100644 src/Structures/MiniGames/Arcade/BountyHunters.ts create mode 100644 src/Structures/MiniGames/Arcade/DragonWars.test.ts create mode 100644 src/Structures/MiniGames/Arcade/DragonWars.ts create mode 100644 src/Structures/MiniGames/Arcade/Dropper.test.ts create mode 100644 src/Structures/MiniGames/Arcade/Dropper.ts create mode 100644 src/Structures/MiniGames/Arcade/DropperMap.test.ts create mode 100644 src/Structures/MiniGames/Arcade/DropperMap.ts create mode 100644 src/Structures/MiniGames/Arcade/EnderSpleef.test.ts create mode 100644 src/Structures/MiniGames/Arcade/EnderSpleef.ts create mode 100644 src/Structures/MiniGames/Arcade/FarmHunt.test.ts create mode 100644 src/Structures/MiniGames/Arcade/FarmHunt.ts create mode 100644 src/Structures/MiniGames/Arcade/Football.test.ts create mode 100644 src/Structures/MiniGames/Arcade/Football.ts create mode 100644 src/Structures/MiniGames/Arcade/GalaxyWars.test.ts create mode 100644 src/Structures/MiniGames/Arcade/GalaxyWars.ts create mode 100644 src/Structures/MiniGames/Arcade/HideAndSeek.test.ts create mode 100644 src/Structures/MiniGames/Arcade/HideAndSeek.ts create mode 100644 src/Structures/MiniGames/Arcade/HoleInTheWall.test.ts create mode 100644 src/Structures/MiniGames/Arcade/HoleInTheWall.ts create mode 100644 src/Structures/MiniGames/Arcade/HypixelSays.test.ts create mode 100644 src/Structures/MiniGames/Arcade/HypixelSays.ts create mode 100644 src/Structures/MiniGames/Arcade/MiniWalls.test.ts create mode 100644 src/Structures/MiniGames/Arcade/MiniWalls.ts create mode 100644 src/Structures/MiniGames/Arcade/PartyGames.test.ts create mode 100644 src/Structures/MiniGames/Arcade/PartyGames.ts create mode 100644 src/Structures/MiniGames/Arcade/PartyPooper.test.ts create mode 100644 src/Structures/MiniGames/Arcade/PartyPooper.ts create mode 100644 src/Structures/MiniGames/Arcade/PixelParty.test.ts create mode 100644 src/Structures/MiniGames/Arcade/PixelParty.ts create mode 100644 src/Structures/MiniGames/Arcade/PixelPartyGameMode.test.ts create mode 100644 src/Structures/MiniGames/Arcade/PixelPartyGameMode.ts create mode 100644 src/Structures/MiniGames/Arcade/PropHunt.test.ts create mode 100644 src/Structures/MiniGames/Arcade/PropHunt.ts create mode 100644 src/Structures/MiniGames/Arcade/ThrowOut.test.ts create mode 100644 src/Structures/MiniGames/Arcade/ThrowOut.ts create mode 100644 src/Structures/MiniGames/Arcade/Zombies.test.ts create mode 100644 src/Structures/MiniGames/Arcade/Zombies.ts create mode 100644 src/Structures/MiniGames/Arcade/ZombiesStats.test.ts create mode 100644 src/Structures/MiniGames/Arcade/ZombiesStats.ts create mode 100644 src/Structures/MiniGames/ArenaBrawl/ArenaBrawl.test.ts create mode 100644 src/Structures/MiniGames/ArenaBrawl/ArenaBrawl.ts create mode 100644 src/Structures/MiniGames/ArenaBrawl/ArenaBrawlMode.test.ts create mode 100644 src/Structures/MiniGames/ArenaBrawl/ArenaBrawlMode.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWars.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWars.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsBeds.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsCollectedItems.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsDreamMode.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsDreamStats.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsMode.ts create mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBase.ts create mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBaseBlocksPlaced.ts create mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridging.ts create mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridgingRecords.ts create mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeModeAttempts.ts create mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecord.ts create mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecordElevation.ts create mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeStats.ts create mode 100644 src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.test.ts create mode 100644 src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.ts create mode 100644 src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesKit.ts create mode 100644 src/Structures/MiniGames/BuildBattle.test.ts create mode 100644 src/Structures/MiniGames/BuildBattle.ts create mode 100644 src/Structures/MiniGames/CopsAndCrims/CopsAndCrims.test.ts create mode 100644 src/Structures/MiniGames/CopsAndCrims/CopsAndCrims.ts create mode 100644 src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGamemode.test.ts create mode 100644 src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGamemode.ts create mode 100644 src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.test.ts create mode 100644 src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.ts create mode 100644 src/Structures/MiniGames/Duels/Duels.test.ts create mode 100644 src/Structures/MiniGames/Duels/Duels.ts create mode 100644 src/Structures/MiniGames/Duels/DuelsBridge.ts create mode 100644 src/Structures/MiniGames/Duels/DuelsGamemode.ts create mode 100644 src/Structures/MiniGames/Duels/DuelsMegaWalls.ts create mode 100644 src/Structures/MiniGames/Duels/DuelsOP.ts create mode 100644 src/Structures/MiniGames/Duels/DuelsSkyWars.ts create mode 100644 src/Structures/MiniGames/Duels/DuelsUHC.ts create mode 100644 src/Structures/MiniGames/MegaWalls/MegaWalls.test.ts create mode 100644 src/Structures/MiniGames/MegaWalls/MegaWalls.ts create mode 100644 src/Structures/MiniGames/MegaWalls/MegaWallsKitStats.test.ts create mode 100644 src/Structures/MiniGames/MegaWalls/MegaWallsKitStats.ts create mode 100644 src/Structures/MiniGames/MegaWalls/MegaWallsModeStats.test.ts create mode 100644 src/Structures/MiniGames/MegaWalls/MegaWallsModeStats.ts create mode 100644 src/Structures/MiniGames/MurderMystery/MurderMystery.test.ts create mode 100644 src/Structures/MiniGames/MurderMystery/MurderMystery.ts create mode 100644 src/Structures/MiniGames/MurderMystery/MurderMysteryModeStats.test.ts create mode 100644 src/Structures/MiniGames/MurderMystery/MurderMysteryModeStats.ts create mode 100644 src/Structures/MiniGames/Paintball.test.ts create mode 100644 src/Structures/MiniGames/Paintball.ts create mode 100644 src/Structures/MiniGames/Pit/Pit.test.ts create mode 100644 src/Structures/MiniGames/Pit/Pit.ts create mode 100644 src/Structures/MiniGames/Pit/PitInventoryItem.ts create mode 100644 src/Structures/MiniGames/Quakecraft/Quakecraft.test.ts create mode 100644 src/Structures/MiniGames/Quakecraft/Quakecraft.ts create mode 100644 src/Structures/MiniGames/Quakecraft/QuakecraftMode.test.ts create mode 100644 src/Structures/MiniGames/Quakecraft/QuakecraftMode.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWars.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsKit.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsKits.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsMode.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsMode.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsModeStats.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsModeStats.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsPackages.ts create mode 100644 src/Structures/MiniGames/SkyWars/Skywars.test.ts create mode 100644 src/Structures/MiniGames/SmashHeroes/SmashHeoresHero.ts create mode 100644 src/Structures/MiniGames/SmashHeroes/SmashHeroes.test.ts create mode 100644 src/Structures/MiniGames/SmashHeroes/SmashHeroes.ts create mode 100644 src/Structures/MiniGames/SmashHeroes/SmashHeroesMode.ts create mode 100644 src/Structures/MiniGames/SpeedUHC/SpeedUHC.test.ts create mode 100644 src/Structures/MiniGames/SpeedUHC/SpeedUHC.ts create mode 100644 src/Structures/MiniGames/SpeedUHC/SpeedUHCMode.test.ts create mode 100644 src/Structures/MiniGames/SpeedUHC/SpeedUHCMode.ts create mode 100644 src/Structures/MiniGames/TNTGames/BowSpleef.test.ts create mode 100644 src/Structures/MiniGames/TNTGames/BowSpleef.ts create mode 100644 src/Structures/MiniGames/TNTGames/PVPRun.test.ts create mode 100644 src/Structures/MiniGames/TNTGames/PVPRun.ts create mode 100644 src/Structures/MiniGames/TNTGames/TNTGames.test.ts create mode 100644 src/Structures/MiniGames/TNTGames/TNTGames.ts create mode 100644 src/Structures/MiniGames/TNTGames/TNTRun.test.ts create mode 100644 src/Structures/MiniGames/TNTGames/TNTRun.ts create mode 100644 src/Structures/MiniGames/TNTGames/TNTTag.test.ts create mode 100644 src/Structures/MiniGames/TNTGames/TNTTag.ts create mode 100644 src/Structures/MiniGames/TNTGames/TNTWizards.test.ts create mode 100644 src/Structures/MiniGames/TNTGames/TNTWizards.ts create mode 100644 src/Structures/MiniGames/TurboKartRacers/TurboKartRacers.test.ts create mode 100644 src/Structures/MiniGames/TurboKartRacers/TurboKartRacers.ts create mode 100644 src/Structures/MiniGames/TurboKartRacers/TurboKartRacersMap.test.ts create mode 100644 src/Structures/MiniGames/TurboKartRacers/TurboKartRacersMap.ts create mode 100644 src/Structures/MiniGames/UHC/UHC.test.ts create mode 100644 src/Structures/MiniGames/UHC/UHC.ts create mode 100644 src/Structures/MiniGames/UHC/UHCGamemode.test.ts create mode 100644 src/Structures/MiniGames/UHC/UHCGamemode.ts create mode 100644 src/Structures/MiniGames/VampireZ/VampireZ.test.ts create mode 100644 src/Structures/MiniGames/VampireZ/VampireZ.ts create mode 100644 src/Structures/MiniGames/VampireZ/VampireZRole.test.ts create mode 100644 src/Structures/MiniGames/VampireZ/VampireZRole.ts create mode 100644 src/Structures/MiniGames/Walls.test.ts create mode 100644 src/Structures/MiniGames/Walls.ts create mode 100644 src/Structures/MiniGames/Warlords/Warlords.test.ts create mode 100644 src/Structures/MiniGames/Warlords/Warlords.ts create mode 100644 src/Structures/MiniGames/Warlords/WarlordsClass.test.ts create mode 100644 src/Structures/MiniGames/Warlords/WarlordsClass.ts create mode 100644 src/Structures/MiniGames/WoolGames/CaptureTheWool.test.ts create mode 100644 src/Structures/MiniGames/WoolGames/CaptureTheWool.ts create mode 100644 src/Structures/MiniGames/WoolGames/SheepWars.test.ts create mode 100644 src/Structures/MiniGames/WoolGames/SheepWars.ts create mode 100644 src/Structures/MiniGames/WoolGames/WoolGames.test.ts create mode 100644 src/Structures/MiniGames/WoolGames/WoolGames.ts create mode 100644 src/Structures/MiniGames/WoolGames/WoolWars.test.ts create mode 100644 src/Structures/MiniGames/WoolGames/WoolWars.ts create mode 100644 src/Structures/MiniGames/WoolGames/WoolWarsClass.test.ts create mode 100644 src/Structures/MiniGames/WoolGames/WoolWarsClass.ts create mode 100644 src/Structures/Player/Cosmetics.test.ts create mode 100644 src/Structures/Player/Cosmetics.ts create mode 100644 src/Structures/Player/Gifting.test.ts create mode 100644 src/Structures/Player/Gifting.ts create mode 100644 src/Structures/Player/MonthlyCrate.test.ts create mode 100644 src/Structures/Player/MonthlyCrate.ts create mode 100644 src/Structures/Player/Parkour.test.ts create mode 100644 src/Structures/Player/Parkour.ts create mode 100644 src/Structures/Player/Pet.test.ts create mode 100644 src/Structures/Player/Pet.ts create mode 100644 src/Structures/Player/PetConsumables.test.ts create mode 100644 src/Structures/Player/PetConsumables.ts create mode 100644 src/Structures/Player/Pets.test.ts create mode 100644 src/Structures/Player/Pets.ts create mode 100644 src/Structures/Player/Player.test.ts create mode 100644 src/Structures/Player/Player.ts create mode 100644 src/Structures/Player/PlayerAchievements.test.ts create mode 100644 src/Structures/Player/PlayerAchievements.ts create mode 100644 src/Structures/Player/PlayerAchievementsRewards.test.ts create mode 100644 src/Structures/Player/PlayerAchievementsRewards.ts create mode 100644 src/Structures/Player/Quests/PlayerQuest.test.ts create mode 100644 src/Structures/Player/Quests/PlayerQuest.ts create mode 100644 src/Structures/Player/Quests/PlayerQuestCompletion.test.ts create mode 100644 src/Structures/Player/Quests/PlayerQuestCompletion.ts create mode 100644 src/Structures/Player/Quests/PlayerQuestCompletions.test.ts create mode 100644 src/Structures/Player/Quests/PlayerQuestCompletions.ts create mode 100644 src/Structures/Player/Quests/PlayerQuests.test.ts create mode 100644 src/Structures/Player/Quests/PlayerQuests.ts create mode 100644 src/Structures/Player/Rewards.test.ts create mode 100644 src/Structures/Player/Rewards.ts create mode 100644 src/Structures/Player/Seasonal/Season.test.ts create mode 100644 src/Structures/Player/Seasonal/Season.ts create mode 100644 src/Structures/Player/Seasonal/SeasonBingo.test.ts create mode 100644 src/Structures/Player/Seasonal/SeasonBingo.ts create mode 100644 src/Structures/Player/Seasonal/SeasonBingoTier.test.ts create mode 100644 src/Structures/Player/Seasonal/SeasonBingoTier.ts create mode 100644 src/Structures/Player/Seasonal/SeasonYear.test.ts create mode 100644 src/Structures/Player/Seasonal/SeasonYear.ts create mode 100644 src/Structures/Player/Seasonal/Seasonal.test.ts create mode 100644 src/Structures/Player/Seasonal/Seasonal.ts create mode 100644 src/Structures/Player/SocialMedia.test.ts create mode 100644 src/Structures/Player/SocialMedia.ts create mode 100644 src/Structures/Player/Tourney/Tourney.test.ts create mode 100644 src/Structures/Player/Tourney/Tourney.ts create mode 100644 src/Structures/Player/Tourney/TourneyData.test.ts create mode 100644 src/Structures/Player/Tourney/TourneyData.ts create mode 100644 src/Structures/RecentGame.ts create mode 100644 src/Structures/RecentGames.test.ts create mode 100644 src/Structures/SkyBlock/Auctions/Auction.ts create mode 100644 src/Structures/SkyBlock/Auctions/AuctionInfo.ts create mode 100644 src/Structures/SkyBlock/Auctions/BaseAuction.test.ts create mode 100644 src/Structures/SkyBlock/Auctions/BaseAuction.ts create mode 100644 src/Structures/SkyBlock/Auctions/Bid.ts create mode 100644 src/Structures/SkyBlock/Bazaar/Order.test.ts create mode 100644 src/Structures/SkyBlock/Bazaar/Order.ts create mode 100644 src/Structures/SkyBlock/Bazaar/Product.test.ts create mode 100644 src/Structures/SkyBlock/Bazaar/Product.ts create mode 100644 src/Structures/SkyBlock/News/SkyblockNews.ts create mode 100644 src/Structures/SkyBlock/SkyblockGarden.test.ts rename src/{structures/SkyBlock/SkyblockGarden.js => Structures/SkyBlock/SkyblockGarden.ts} (52%) create mode 100644 src/Structures/SkyBlock/SkyblockGemstone.ts create mode 100644 src/Structures/SkyBlock/SkyblockInventoryItem.ts create mode 100644 src/Structures/SkyBlock/SkyblockMember.test.ts create mode 100644 src/Structures/SkyBlock/SkyblockMember.ts create mode 100644 src/Structures/SkyBlock/SkyblockMemberMinion.ts create mode 100644 src/Structures/SkyBlock/SkyblockMemberMinions.ts create mode 100644 src/Structures/SkyBlock/SkyblockMemberStats.ts create mode 100644 src/Structures/SkyBlock/SkyblockMuseum.ts create mode 100644 src/Structures/SkyBlock/SkyblockMuseumItem.ts create mode 100644 src/Structures/SkyBlock/SkyblockPet.ts create mode 100644 src/Structures/SkyBlock/SkyblockProfile.ts create mode 100644 src/Structures/SkyBlock/Static/Bingo.ts create mode 100644 src/Structures/SkyBlock/Static/BingoData.ts create mode 100644 src/Structures/SkyBlock/Static/Candidate.ts create mode 100644 src/Structures/SkyBlock/Static/FireSale.ts create mode 100644 src/Structures/SkyBlock/Static/Government.ts create mode 100644 src/Structures/SkyBlock/Static/Perk.ts create mode 100644 src/Structures/Static/Achievements/Achievements.ts create mode 100644 src/Structures/Static/Achievements/BaseAchievement.ts create mode 100644 src/Structures/Static/Achievements/GameAchievements.ts create mode 100644 src/Structures/Static/Achievements/GuildAchievements.ts create mode 100644 src/Structures/Static/Achievements/OneTimeAchivement.ts create mode 100644 src/Structures/Static/Achievements/TieredAchivement.ts create mode 100644 src/Structures/Static/Challenge.ts create mode 100644 src/Structures/Static/Challenges.ts create mode 100644 src/Structures/Static/GameChallenges.ts create mode 100644 src/Structures/Static/GameQuests.ts create mode 100644 src/Structures/Static/Quest.test.ts create mode 100644 src/Structures/Static/Quest.ts create mode 100644 src/Structures/Static/QuestObjective.ts create mode 100644 src/Structures/Static/Quests.ts create mode 100644 src/Structures/Status.test.ts create mode 100644 src/Structures/Status.ts create mode 100644 src/Structures/WatchdogStats.test.ts create mode 100644 src/Structures/WatchdogStats.ts create mode 100644 src/Types/API.d.ts create mode 100644 src/Types/Booster.d.ts create mode 100644 src/Types/Client.d.ts create mode 100644 src/Types/Color.d.ts create mode 100644 src/Types/Game.d.ts create mode 100644 src/Types/Guild.d.ts create mode 100644 src/Types/Player.d.ts create mode 100644 src/Types/Requests.d.ts create mode 100644 src/Types/Skyblock.d.ts create mode 100644 src/Types/Static.d.ts rename src/{utils/Constants.js => Utils/Constants.ts} (55%) create mode 100644 src/Utils/Divide.test.ts rename src/{utils/divide.js => Utils/Divide.ts} (61%) create mode 100644 src/Utils/Guild.ts create mode 100644 src/Utils/Oscillation.test.ts create mode 100644 src/Utils/Oscillation.ts create mode 100644 src/Utils/PlayerUtils.test.ts create mode 100644 src/Utils/PlayerUtils.ts create mode 100644 src/Utils/RemoveSnakeCase.ts create mode 100644 src/Utils/Romanize.test.ts rename src/{utils/romanize.js => Utils/Romanize.ts} (78%) create mode 100644 src/Utils/SkyblockUtils.test.ts rename src/{utils/SkyblockUtils.js => Utils/SkyblockUtils.ts} (50%) delete mode 100644 src/index.js create mode 100644 src/index.ts delete mode 100644 src/structures/APIIncident.js delete mode 100644 src/structures/APIStatus.js delete mode 100644 src/structures/Boosters/Booster.js delete mode 100644 src/structures/Color.js delete mode 100644 src/structures/Game.js delete mode 100644 src/structures/GameCounts.js delete mode 100644 src/structures/Guild/Guild.js delete mode 100644 src/structures/Guild/GuildMember.js delete mode 100644 src/structures/Guild/GuildRank.js delete mode 100644 src/structures/House.js delete mode 100644 src/structures/ItemBytes.js delete mode 100644 src/structures/Leaderboard.js delete mode 100644 src/structures/MiniGames/Arcade.js delete mode 100644 src/structures/MiniGames/ArenaBrawl.js delete mode 100644 src/structures/MiniGames/BedWars.js delete mode 100644 src/structures/MiniGames/BlitzSurvivalGames.js delete mode 100644 src/structures/MiniGames/BuildBattle.js delete mode 100644 src/structures/MiniGames/CopsAndCrims.js delete mode 100644 src/structures/MiniGames/Duels.js delete mode 100644 src/structures/MiniGames/MegaWalls.js delete mode 100644 src/structures/MiniGames/MurderMystery.js delete mode 100644 src/structures/MiniGames/Paintball.js delete mode 100644 src/structures/MiniGames/Pit.js delete mode 100644 src/structures/MiniGames/PitInventoryItem.js delete mode 100644 src/structures/MiniGames/Quakecraft.js delete mode 100644 src/structures/MiniGames/SkyWars.js delete mode 100644 src/structures/MiniGames/SmashHeroes.js delete mode 100644 src/structures/MiniGames/SpeedUHC.js delete mode 100644 src/structures/MiniGames/TNTGames.js delete mode 100644 src/structures/MiniGames/TurboKartRacers.js delete mode 100644 src/structures/MiniGames/UHC.js delete mode 100644 src/structures/MiniGames/VampireZ.js delete mode 100644 src/structures/MiniGames/Walls.js delete mode 100644 src/structures/MiniGames/Warlords.js delete mode 100644 src/structures/MiniGames/WoolGames.js delete mode 100644 src/structures/Pet.js delete mode 100644 src/structures/Pets.js delete mode 100644 src/structures/Player.js delete mode 100644 src/structures/PlayerCosmetics.js delete mode 100644 src/structures/RecentGame.js delete mode 100644 src/structures/ServerInfo.js delete mode 100644 src/structures/SkyBlock/Auctions/Auction.js delete mode 100644 src/structures/SkyBlock/Auctions/AuctionInfo.js delete mode 100644 src/structures/SkyBlock/Auctions/BaseAuction.js delete mode 100644 src/structures/SkyBlock/Auctions/Bid.js delete mode 100644 src/structures/SkyBlock/Auctions/PartialAuction.js delete mode 100644 src/structures/SkyBlock/Bazzar/Order.js delete mode 100644 src/structures/SkyBlock/Bazzar/Product.js delete mode 100644 src/structures/SkyBlock/News/SkyblockNews.js delete mode 100644 src/structures/SkyBlock/PlayerBingo.js delete mode 100644 src/structures/SkyBlock/SkyblockInventoryItem.js delete mode 100644 src/structures/SkyBlock/SkyblockMember.js delete mode 100644 src/structures/SkyBlock/SkyblockMuseum.js delete mode 100644 src/structures/SkyBlock/SkyblockMuseumItem.js delete mode 100644 src/structures/SkyBlock/SkyblockPet.js delete mode 100644 src/structures/SkyBlock/SkyblockProfile.js delete mode 100644 src/structures/SkyBlock/Static/Bingo.js delete mode 100644 src/structures/SkyBlock/Static/BingoData.js delete mode 100644 src/structures/SkyBlock/Static/Candidate.js delete mode 100644 src/structures/SkyBlock/Static/FireSale.js delete mode 100644 src/structures/SkyBlock/Static/Government.js delete mode 100644 src/structures/SkyBlock/Static/Perk.js delete mode 100644 src/structures/Static/Achievement.js delete mode 100644 src/structures/Static/AchievementTier.js delete mode 100644 src/structures/Static/Achievements.js delete mode 100644 src/structures/Static/Challenges.js delete mode 100644 src/structures/Static/GameAchievements.js delete mode 100644 src/structures/Static/GameChallenges.js delete mode 100644 src/structures/Static/GameQuests.js delete mode 100644 src/structures/Static/GuildAchievements.js delete mode 100644 src/structures/Static/Quest.js delete mode 100644 src/structures/Static/Quests.js delete mode 100644 src/structures/Status.js delete mode 100644 src/structures/Watchdog/Stats.js delete mode 100644 src/utils/Guild.js delete mode 100644 src/utils/Player.js delete mode 100644 src/utils/arrayTools.js delete mode 100644 src/utils/index.js delete mode 100644 src/utils/isGuildID.js delete mode 100644 src/utils/isUUID.js delete mode 100644 src/utils/oscillation.js delete mode 100644 src/utils/removeSnakeCase.js delete mode 100644 src/utils/rgbToHexColor.js delete mode 100644 src/utils/toUuid.js delete mode 100644 src/utils/varInt.js delete mode 100644 tests/Client#getAPIStatus.js delete mode 100644 tests/Client#getBoosters.js delete mode 100644 tests/Client#getChallenges.js delete mode 100644 tests/Client#getGameCounts.js delete mode 100644 tests/Client#getGuild.js delete mode 100644 tests/Client#getLeaderboards.js delete mode 100644 tests/Client#getPlayer.js delete mode 100644 tests/Client#getRecentGames.js delete mode 100644 tests/Client#getServerInfo.js delete mode 100644 tests/Client#getStatus.js delete mode 100644 tests/Client#getWatchdogStats.js delete mode 100644 tests/Client.js delete mode 100644 tests/data.js delete mode 100644 tests/housing/Client#getActiveHouses.js delete mode 100644 tests/housing/Client#getHouse.js delete mode 100644 tests/housing/Client#getPlayerHouses.js delete mode 100644 tests/skyblock/Client#getSkyblockBingo.js delete mode 100644 tests/skyblock/Client#getSkyblockFireSales.js delete mode 100644 tests/skyblock/Client#getSkyblockGarden.js delete mode 100644 tests/skyblock/Client#getSkyblockGovernment.js delete mode 100644 tests/skyblock/Client#getSkyblockMember.js delete mode 100644 tests/skyblock/Client#getSkyblockNews.js delete mode 100644 tests/skyblock/Client#getSkyblockProfiles.js create mode 100644 tsconfig.json create mode 100644 typedoc.json delete mode 100644 typings/index.d.ts create mode 100644 vitest.config.ts create mode 100644 vitest.setup.ts diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..0f969bc8b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +max_line_length = 120 + +[*.{md,markdown}] +trim_trailing_whitespace = false diff --git a/.env.example b/.env.example new file mode 100644 index 000000000..9e05036a1 --- /dev/null +++ b/.env.example @@ -0,0 +1 @@ +HYPIXEL_KEY=HYPIXEL_API_KEY \ No newline at end of file diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 2196e0fc8..f5fbf0e6e 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -2,9 +2,78 @@ If you want to contribute to hypixel-api-reborn, feel free to fork the repository and submit pull request. -## Setup +## Table of contents -1. Fork the repository. -2. Run `npm ci`. -3. Code your idea. -4. Run `npm run eslint` to run ESlint. +- [Requirements](#requirements) +- [Project Setup](#project-setup) +- [Testing your changes](#testing-your-changes) +- [Submitting a pull request](#submitting-a-pull-request) +- [Common issues](#common-issues) + +### Requirements + +- [Node v20.16.0 or higher](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs) +- [pnpm v9.7.1 or higher](https://pnpm.io/installation) + +### Project Setup + +Once you have the requirements installed, you can clone the repository and install the dependencies. + +```bash +pnpm install +``` + +Once you have all the packages installed, you will need to create a `.env` file. This file will contain the Hypixel API +key. You can get one by going to the [Hypixel Developer Portal.](https://developer.hypixel.net/) This key will be used +in the tests. Your `.env` file should look like this: + +```env +HYPIXEL_KEY=HYPIXEL_API_KEY +``` + +**If your using vscode** With vscode we have a few recommended extensions that you can install to help with development. +You will be promoted to install these when you open the project in vscode. If you don't see the prompt, you can install +the extensions manually. Here are the recommended extensions: + +- [Editor Config](https://marketplace.visualstudio.com/items?itemName=editorconfig.editorconfig) +- [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) +- [Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) +- [Gitlens](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens) +- [Better Comments](https://marketplace.visualstudio.com/items?itemName=aaron-bond.better-comments) +- [Vitest](https://marketplace.visualstudio.com/items?itemName=vitest.explorer) +- [GitHub Pull Requests](https://marketplace.visualstudio.com/items?itemName=github.vscode-pull-request-github) + +### Testing your changes + +Before submitting a pull request, make sure to test your changes. You can run the tests with the following command: + +```bash +pnpm test +``` + +### Submitting a pull request + +When submitting a pull request, make sure to provide a detailed description of the changes you made. If you are adding a +new feature, make sure to include tests for it. If you are fixing a bug, make sure to include the bug report +information. When making a pull request we have a few requirements: + +- Tests must pass (`pnpm test`) +- Code must be linted (`pnpm lint`) +- Code must be formatted (`pnpm prettier`) +- A clear and detailed description of the changes that you have done +- Checkboxes for the changes you made +- Screenshots of the code running (if applicable) + +### Common issues + +There are a few common issues that can come up when contributing to the project. Here are a few of them: + +- **Tests failing**: Tests will fail when making a pull request. This is because it's missing an API key set in github + actions. If this is the case, you can ignore the tests and someone will run them for you when reviewing the pull + request. + +- **Code formatting**: Code must be formatted and the github actions will check for this. If the code is not formatted, + the github action will fail and you will need to correct this before the pull request can be merged. + +- **Code using npm**: Any code that includes an npm lock file will not be accepted. This is because we use pnpm for + package management. If you have an npm lock file, you will need to remove it and use pnpm to install the packages. diff --git a/.github/ISSUE_TEMPLATE/Bug_report.md b/.github/ISSUE_TEMPLATE/Bug_report.md index fcff3ccdc..9a9d6d32d 100644 --- a/.github/ISSUE_TEMPLATE/Bug_report.md +++ b/.github/ISSUE_TEMPLATE/Bug_report.md @@ -5,5 +5,14 @@ about: Report a bug ### Bug report -- Part of code where error occurred -- What error occurred +- Part of code where error occurred: +- What error occurred: + +### Expected behavior + +- What you expected to happen: + +### Additional context + +- Node version: +- Package version: diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index b81bce490..36576c886 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -14,12 +14,11 @@
Checkboxes -- [x] I've added new features. (methods or parameters) -- [ ] I've added jsdoc and typings. +- [ ] I've added new features. (methods or parameters) - [ ] I've fixed bug. (_optional_ you can mention a issue if there is one) - [ ] I've corrected the spelling in README, documentation, etc. -- [ ] I've tested my code. (`npm run tests`) -- [ ] I've check for issues. (`npm run eslint`) -- [ ] I've fixed my formatting. (`npm run prettier`) +- [ ] I've tested my code. (`pnpm test`) +- [ ] I've check for issues. (`pnpm lint`) +- [ ] I've fixed my formatting. (`pnpm prettier`)
diff --git a/.github/SECURITY.md b/.github/SECURITY.md index eafeff54f..9e79f949f 100644 --- a/.github/SECURITY.md +++ b/.github/SECURITY.md @@ -17,5 +17,5 @@ be no issue and the team will be greatful for your actions. To report a vulnerability you can do so in the [Discord Server](https://discord.gg/NSEBNMM) by openeing a support ticket or you can contact the primary contributor of this repository using the following contact methods: -- @kathund. on Discord +- @.kathund on Discord - @kathundd on Telegram diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 96baa6d25..000000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,19 +0,0 @@ -version: 2 -updates: - - package-ecosystem: npm - directory: '/' - schedule: - interval: 'weekly' - assignees: - - 'kathund' - reviewers: - - 'kathund' - commit-message: - prefix: '🟨' - prefix-development: '🟦' - open-pull-requests-limit: 10 - labels: - - 'dependencies' - ignore: - - dependency-name: 'chai' - - dependency-name: 'mocha' diff --git a/.github/labels.yml b/.github/labels.yml new file mode 100644 index 000000000..79f07a0ae --- /dev/null +++ b/.github/labels.yml @@ -0,0 +1,24 @@ +XS: + name: size/XS + lines: 0 + color: 3CBF00 +S: + name: size/S + lines: 50 + color: 5D9801 +M: + name: size/M + lines: 200 + color: 7F7203 +L: + name: size/L + lines: 1000 + color: A14C05 +XL: + name: size/XL + lines: 3000 + color: C32607 +XXL: + name: size/XXL + lines: 7500 + color: E50009 diff --git a/.github/renovate.json b/.github/renovate.json new file mode 100644 index 000000000..82e70252d --- /dev/null +++ b/.github/renovate.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": ["config:base", "group:allNonMajor"], + "rebaseWhen": "behind-base-branch", + "ignoreDeps": ["pnpm", "node"], + "semanticCommits": "enabled", + "labels": ["dependencies"], + "schedule": ["* 0 * * *"], + "enabledManagers": ["npm"], + "rangeStrategy": "bump", + "prConcurrentLimit": 5, + "includeForks": true, + "prHourlyLimit": 0, + "timezone": "UTC", + "packageRules": [ + { + "matchPackageNames": ["skyhelper-networth"], + "updateTypes": ["minor"], + "automerge": true + }, + { + "matchUpdateTypes": ["minor", "patch"], + "matchCurrentVersion": "!/^0/", + "commitMessagePrefix": "chore(deps):" + } + ] +} diff --git a/.github/scripts/checkCoverage.ts b/.github/scripts/checkCoverage.ts new file mode 100644 index 000000000..574bcd08f --- /dev/null +++ b/.github/scripts/checkCoverage.ts @@ -0,0 +1,54 @@ +import { parseString } from 'xml2js'; +import { readFile } from 'fs'; + +function parseXMLFile(): Promise { + return new Promise((resolve, reject) => { + readFile('.github/coverageData.xml', 'utf8', (err, data) => { + if (err) { + reject('File Dose not exist!'); + return; + } + + parseString(data, (err, result) => { + if (err) { + reject('Something Went wrong!'); + return; + } + + resolve(result); + }); + }); + }); +} + +const data = await parseXMLFile(); +const codeStats = data.coverage.project[0].metrics[0].$; +const info = { + statements: Number(codeStats.statements), + coveredstatements: Number(codeStats.coveredstatements), + conditionals: Number(codeStats.conditionals), + coveredconditionals: Number(codeStats.coveredconditionals), + methods: Number(codeStats.methods), + coveredmethods: Number(codeStats.coveredmethods) +}; + +if (95 > (info.coveredstatements / info.statements) * 100) { + throw new Error('Statements is required to be 95% or higher'); +} + +if (95 > (info.coveredconditionals / info.conditionals) * 100) { + throw new Error('Conditionals is required to be 95% or higher'); +} + +if (95 > (info.coveredmethods / info.methods) * 100) { + throw new Error('Methods is required to be 95% or higher'); +} + +if ( + 95 > + ((info.coveredstatements + info.coveredconditionals + info.coveredmethods) / + (info.statements + info.conditionals + info.methods)) * + 100 +) { + throw new Error('Everythng Combinded is required to be 95% or higher'); +} diff --git a/.github/workflows/UpdateDocs.yml b/.github/workflows/UpdateDocs.yml new file mode 100644 index 000000000..0363d4650 --- /dev/null +++ b/.github/workflows/UpdateDocs.yml @@ -0,0 +1,81 @@ +name: 'Update Docs' +on: + push: + paths: + - src/** + branches: + - master + workflow_dispatch: + +env: + NODE_VERSION: '20' + +jobs: + pnpm: + name: Install dependencies (pnpm) + runs-on: ubuntu-latest + steps: + - name: Git checkout + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + + - name: Use Node.js ${{ env.NODE_VERSION }} + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + cache: 'pnpm' + + - name: Install node dependencies + run: pnpm install + + UpdateDocs: + name: Update Documentation + needs: [pnpm] + runs-on: ubuntu-latest + steps: + - name: Git checkout + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + + - name: Use Node.js ${{ env.NODE_VERSION }} + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + cache: 'pnpm' + + - name: Install node dependencies + run: pnpm install + + - name: Generate Documentation + run: pnpm docgen + + - name: Move new documentation to temp directory + run: mv documentation/ tmp/ + + - name: Switch to documentation branch + run: | + git fetch --all + git checkout docs + + - name: Clear Old Documentation files + run: + rm -rf assets/ classes/ functions/ interfaces/ modules/ types/ variables/ 404.html hierarchy.html index.html + modules.html sitemap.xml .nojekyll + + - name: Move new Documentation files into place + run: | + mv tmp/.nojekyll ./ + mv tmp/* ./ + rm -r tmp/ + + - name: Commit and push changes + run: | + git config --global user.name "Docs Updater[bot]" + git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add . + git commit -m "Update Documentation" || echo "No changes to commit" + git push origin documentation diff --git a/.github/workflows/ci-cd-18x.yml b/.github/workflows/ci-cd-18x.yml deleted file mode 100644 index a64c042c1..000000000 --- a/.github/workflows/ci-cd-18x.yml +++ /dev/null @@ -1,84 +0,0 @@ -# This CI Workflow was deployed and configured by WarpWing and Nate. -name: CI/CD (18.x) - -on: - push: - paths: - - src/** - pull_request: - workflow_dispatch: - -env: - NODE_VERSION: '18.x' - -jobs: - es-lint: - runs-on: ubuntu-latest - steps: - - name: Git checkout - uses: actions/checkout@v3 - - - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@v3 - with: - node-version: ${{ env.NODE_VERSION }} - - - name: Install node dependencies - run: npm i - - - name: es-lint - run: npm run lint - - tests: - runs-on: ubuntu-latest - environment: env - steps: - - name: Git checkout - uses: actions/checkout@v3 - - - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@v3 - with: - node-version: ${{ env.NODE_VERSION }} - - - name: Install node dependencies - run: npm i - - - name: Run Tests - run: npm run tests - env: - HYPIXEL_KEY: ${{ secrets.HYPIXEL_KEY }} - - build: - runs-on: ubuntu-latest - steps: - - name: Git checkout - uses: actions/checkout@v3 - - - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@v3 - with: - node-version: ${{ env.NODE_VERSION }} - - - name: Install node dependencies - run: npm i - - - name: Build - run: npm run build --if-present - - prettier: - runs-on: ubuntu-latest - steps: - - name: Git checkout - uses: actions/checkout@v3 - - - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@v3 - with: - node-version: ${{ env.NODE_VERSION }} - - - name: Install node dependencies - run: npm i - - - name: prettier - run: npm run prettier:check diff --git a/.github/workflows/ci-cd-20x.yml b/.github/workflows/ci-cd-20x.yml deleted file mode 100644 index 6ab821aea..000000000 --- a/.github/workflows/ci-cd-20x.yml +++ /dev/null @@ -1,84 +0,0 @@ -# This CI Workflow was deployed and configured by WarpWing and Nate. -name: CI/CD (20.x) - -on: - push: - paths: - - src/** - pull_request: - workflow_dispatch: - -env: - NODE_VERSION: '20.x' - -jobs: - es-lint: - runs-on: ubuntu-latest - steps: - - name: Git checkout - uses: actions/checkout@v3 - - - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@v3 - with: - node-version: ${{ env.NODE_VERSION }} - - - name: Install node dependencies - run: npm i - - - name: es-lint - run: npm run lint - - tests: - runs-on: ubuntu-latest - environment: env - steps: - - name: Git checkout - uses: actions/checkout@v3 - - - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@v3 - with: - node-version: ${{ env.NODE_VERSION }} - - - name: Install node dependencies - run: npm i - - - name: Run Tests - env: - HYPIXEL_KEY: ${{ secrets.HYPIXEL_KEY }} - run: npm run tests - - build: - runs-on: ubuntu-latest - steps: - - name: Git checkout - uses: actions/checkout@v3 - - - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@v3 - with: - node-version: ${{ env.NODE_VERSION }} - - - name: Install node dependencies - run: npm i - - - name: Build - run: npm run build --if-present - - prettier: - runs-on: ubuntu-latest - steps: - - name: Git checkout - uses: actions/checkout@v3 - - - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@v3 - with: - node-version: ${{ env.NODE_VERSION }} - - - name: Install node dependencies - run: npm i - - - name: prettier - run: npm run prettier:check diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml new file mode 100644 index 000000000..afe71c66f --- /dev/null +++ b/.github/workflows/ci-cd.yml @@ -0,0 +1,132 @@ +name: 'CI/CD' +on: + push: + paths: + - src/** + branches: + - master + workflow_dispatch: + pull_request: + +env: + NODE_VERSION: '20' + +jobs: + pnpm: + name: install dependencies (pnpm) + runs-on: ubuntu-latest + steps: + - name: Git checkout + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + + - name: Use Node.js ${{ env.NODE_VERSION }} + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + cache: 'pnpm' + + - name: Install node dependencies + run: pnpm i + + prettier: + name: check linting (prettier) + needs: [pnpm] + runs-on: ubuntu-latest + steps: + - name: Git checkout + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + + - name: Use Node.js ${{ env.NODE_VERSION }} + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + cache: 'pnpm' + + - name: Install node dependencies + run: pnpm i + + - name: Check prettier + run: pnpm prettier:check + + eslint: + name: check linting (eslint) + needs: [pnpm] + runs-on: ubuntu-latest + steps: + - name: Git checkout + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + + - name: Use Node.js ${{ env.NODE_VERSION }} + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + cache: 'pnpm' + + - name: Install node dependencies + run: pnpm i + + - name: Check eslint + run: pnpm lint:check + + build: + name: build + needs: [pnpm, eslint] + runs-on: ubuntu-latest + steps: + - name: Git checkout + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + + - name: Use Node.js ${{ env.NODE_VERSION }} + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + cache: 'pnpm' + + - name: Install node dependencies + run: pnpm i + + - name: Check build + run: pnpm build + + tests: + name: tests + needs: [pnpm, eslint, build] + runs-on: ubuntu-latest + steps: + - name: Git checkout + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + + - name: Use Node.js ${{ env.NODE_VERSION }} + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + cache: 'pnpm' + + - name: Install node dependencies + run: pnpm i + + - name: Check tests + env: + HYPIXEL_KEY: ${{ secrets.HYPIXEL_KEY }} + run: pnpm test:coverage + + - name: Move Coverage Data + run: mv coverage/clover.xml .github/coverageData.xml + + - name: Check Coverage + run: npx tsx .github/scripts/checkCoverage.ts diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml deleted file mode 100644 index 74d83f3d2..000000000 --- a/.github/workflows/docs.yml +++ /dev/null @@ -1,43 +0,0 @@ -name: Update Docs - -on: - push: - paths: - - src/** - branches: - - master - workflow_dispatch: - -jobs: - UpdateDocs: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v3 - - - name: Install dependencies - run: npm install - - - name: Generate docs - run: | - mkdir tmp - npm run docgen - mv ./master.json tmp/master.json - - - name: Switch to docs branch - run: | - git fetch --all - git checkout docs -- - - - name: Replace master.json in docs branch - run: | - rm master.json - mv tmp/master.json master.json - - - name: Commit and push changes - run: | - git config --global user.name "Docs Updater[bot]" - git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" - git commit -am "Update Docs" - git push origin docs diff --git a/.github/workflows/prettier.yml b/.github/workflows/prettier.yml deleted file mode 100644 index 463a760e0..000000000 --- a/.github/workflows/prettier.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Write Prettier - -on: - workflow_dispatch: - -jobs: - WritePrettier: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v3 - - - name: Install dependencies - run: npm install - - - name: Run Prettier - run: npm run prettier - - - name: Commit and push changes - run: | - git config --global user.name "Prettier Updater[bot]" - git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" - git commit -am "style(prettier): run prettier on all files (auto-commit)" - git push origin master diff --git a/.gitignore b/.gitignore index d183da86b..0899c99e7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,49 +1,8 @@ -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json -pids -*.pid -*.seed -*.pid.lock -lib-cov -coverage -*.lcov -.nyc_output -.grunt -bower_components -.lock-wscript -build/Release node_modules/ -jspm_packages/ -*.tsbuildinfo -.npm -.eslintcache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ -.node_repl_history -*.tgz -.yarn-integrity -.env.test -.cache -.next -.nuxt -dist -.cache/ -.vuepress/dist -.serverless/ -.fusebox/ -.dynamodb/ -yarn.lock -.tern-port -testing/ -.circleci/ -changelog.md -master.json +oldreborn/ .env -.vscode/settings.json +dist/ +.eslintcache +coverage/ +.github/coverageData.xml +documentation/ diff --git a/.npmignore b/.npmignore index 4f71b9358..9d11b2ea3 100644 --- a/.npmignore +++ b/.npmignore @@ -1,27 +1,9 @@ node_modules/ -.*.swp -._* -.DS_Store -.git -.hg -.npmrc -.lock-wscript -.svn -.wafpickle-* -config.gypi -CVS -npm-debug.log -.eslintignore -.eslintrc. -testing/ -.github -.travis.yml -.vscode/ -.circleci/ -docs/ -tests/ -typings/*.json -master.json +oldreborn/ .env -dtslint.json -.eslintcache \ No newline at end of file +.eslintcache +.git +.gitignore +coverage/ +.github/coverageData.xml +documentation/ diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000..b7bf0c868 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,6 @@ +node_modules +coverage +dist +.env +.env.example +pnpm-lock.yaml diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 000000000..6e11a125a --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,11 @@ +{ + "recommendations": [ + "editorconfig.editorconfig", + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "eamodio.gitlens", + "aaron-bond.better-comments", + "vitest.explorer", + "github.vscode-pull-request-github" + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index f897489f4..000000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "type": "node", - "request": "launch", - "name": "Launch Program", - "skipFiles": ["/**"], - "program": "${workspaceFolder}\\testing\\globaltest.js" - } - ] -} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..fe19bb9e6 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "editor.tabSize": 2, + "prettier.useTabs": false, + "files.insertFinalNewline": true, + "files.trimTrailingWhitespace": true, + "editor.trimAutoWhitespace": true +} diff --git a/README.md b/README.md index 976e86e08..86a7779be 100644 --- a/README.md +++ b/README.md @@ -18,50 +18,16 @@ [Discord Support](https://discord.gg/NSEBNMM) | [Documentation](https://hypixel-api-reborn.github.io/) | [NPM](https://www.npmjs.com/package/hypixel-api-reborn) | [GitHub](https://github.com/Hypixel-API-Reborn/hypixel-api-reborn) | -[ToDo](https://github.com/Hypixel-API-Reborn/hypixel-api-reborn/projects/1) | -[CLI](https://github.com/Hypixel-API-Reborn/cli) #### Requirements -**For Node.js users >= v18.18.0**
**For TypeScript users >= v3.5** +**For Node.js users >= v20.16.0**
**For TypeScript users >= v5.5.4** ### Installation & Usage ```shell -npm i hypixel-api-reborn +npm i hypixel-api-reborn@next ``` -```js -const Hypixel = require('hypixel-api-reborn'); -const hypixel = new Hypixel.Client('API-KEY'); - -// getPlayer -hypixel - .getPlayer('StavZDev') - .then((player) => { - console.log(player.level); // 141 - }) - .catch((e) => { - console.error(e); - }); - -// getGuild -hypixel - .getGuild('name', 'The Foundation') - .then((guild) => { - console.log(guild.level); // 111 - }) - .catch((e) => { - console.error(e); - }); -``` - -For more examples go to our [documentation](https://hypixel-api-reborn.github.io/). - -## Changelog - -[v11.0.0](https://github.com/Hypixel-API-Reborn/hypixel-api-reborn/releases/tag/11.0.0) - -### Try it now - -**[Code Sandbox](https://codesandbox.io/s/clever-babbage-xqmfw?file=/src/index.js)** +**Do note that you are installing a beta version of v12.0.0.** Any issues or bugs you encounter, please report them in +the [Discord Support](https://discord.gg/NSEBNMM). diff --git a/docs/general/errorHandling.md b/docs/general/errorHandling.md deleted file mode 100644 index 53069e6d8..000000000 --- a/docs/general/errorHandling.md +++ /dev/null @@ -1,17 +0,0 @@ -# Error Handling - -Example of error handling in `getPlayer` method. - -```js -const { Errors } = require('hypixel-api-reborn'); -// invalid nickname -hypixel - .getPlayer('3424242') - .then((player) => {}) - .catch((e) => { - if (e.message === Errors.PLAYER_DOES_NOT_EXIST) { - console.log(`Player doesn't exist!`); - // here you can replace default error message with yours. - } - }); -``` diff --git a/docs/general/welcome.md b/docs/general/welcome.md deleted file mode 100644 index 202692fe6..000000000 --- a/docs/general/welcome.md +++ /dev/null @@ -1,63 +0,0 @@ -
- - - - - - - - - - - -
- -

Welcome to the hypixel-api-reborn documentation

-
- -# About - -Hypixel API • Reborn is a feature-rich Hypixel API wrapper for Node.js/Typescript.
- -- 100% Promise-based.
-- Speedy and efficient.
-- Intellisense support. [(?)](https://code.visualstudio.com/docs/editor/intellisense) - -# Installation - -``` -// npm -npm i hypixel-api-reborn - -// yarn -yarn add hypixel-api-reborn -``` - -## Example usage - -```js -const Hypixel = require('hypixel-api-reborn'); -const hypixel = new Hypixel.Client('API-KEY'); - -hypixel - .getPlayer('StavZDev') - .then((player) => { - console.log(player.level); // 141 - }) - .catch((e) => { - console.error(e); - }); -``` - -## Links - -- [Hypixel API • Reborn Discord Server](https://discord.gg/NSEBNMM) -- [GitHub](https://github.com/Hypixel-API-Reborn) -- [NPM](https://www.npmjs.com/package/hypixel-api-reborn) - -# Contributing - -[Contributing.md](https://github.com/Hypixel-API-Reborn/hypixel-api-reborn/blob/master/.github/CONTRIBUTING.md) - -Make sure before creating an issue that it hasn't already reported. Please, don't create an issue for feature request, -you can do it on our [discord server](https://discord.gg/NSEBNMM). diff --git a/docs/index.yml b/docs/index.yml deleted file mode 100644 index 603b766fd..000000000 --- a/docs/index.yml +++ /dev/null @@ -1,38 +0,0 @@ -- name: General - files: - - name: Welcome - path: welcome.md - - name: Error Handling - path: errorHandling.md -- name: Methods - files: - - name: getPlayer - path: getPlayer.md - - name: getGuild - path: getGuild.md - - name: getStatus - path: getStatus.md - - name: getRecentGames - path: getRecentGames.md - - name: getWatchdogStats - path: getWatchdogStats.md - - name: getLeaderboards - path: getLeaderboards.md - - name: getAPIStatus - path: getAPIStatus.md - - name: getBoosters - path: getBoosters.md - - name: getServerInfo - path: getServerInfo.md - - name: getSkyblockProfiles - path: getSkyblockProfiles.md - - name: getSkyblockMember - path: getSkyblockMember.md - - name: getSkyblockBazaar - path: getSkyblockBazaar.md - - name: getSkyblockAuctions - path: getSkyblockAuctions.md - - name: getSkyblockAuctionsByPlayer - path: getSkyblockAuctionsByPlayer.md - - name: getEndedSkyblockAuctions - path: getEndedSkyblockAuctions.md diff --git a/docs/methods/getAPIStatus.md b/docs/methods/getAPIStatus.md deleted file mode 100644 index 831a40618..000000000 --- a/docs/methods/getAPIStatus.md +++ /dev/null @@ -1,65 +0,0 @@ -# getAPIStatus - -Allows you to get the Hypixel API's Status and past Incidents, no key needed. - -## Arguments - -## Example usage - -```js -const Hypixel = require('hypixel-api-reborn'); -const hypixel = new Hypixel.Client('API-KEY'); - -hypixel - .getAPIStatus() - .then((apistatus) => { - console.log(apistatus); - }) - .catch((e) => { - console.error(e); - }); - -// async/await -const apistatus = await hypixel.getAPIStatus().catch((e) => console.error(e)); -console.log(apistatus); -``` - -## Example response - -```js -APIStatus { - sourceUrl: null, - title: 'Hypixel Status - Incident History', - description: 'Statuspage', - incidents: [ - APIIncident { - link: 'https://status.hypixel.net/incidents/v1kgjvxxbcrk', - start: 2021-01-15T20:06:01.000Z, - startFormatted: 'Fri, 15 Jan 2021 15:06:01 -0500', - startTimestamp: 1610741161000, - author: null, - HTMLContent: '\n' + - "

Jan 15, 15:06 EST
Completed - The scheduled maintenance has been completed.

Jan 15, 07:55 EST
Update - Maintenance is currently still in progress, maintenance will last a few hours longer than originally intended.

Jan 14, 09:30 EST
In progress - Scheduled maintenance is currently in progress. We will provide updates as necessary.

Jan 14, 09:10 EST
Scheduled - SkyBlock will be undergoing maintenance for a game update. There is not currently an exact ETA for when the maintenance will end.

", - snippet: 'Jan 15, 15:06 EST\n' + - 'Completed - The scheduled maintenance has been completed.\n' + - 'Jan 15, 07:55 EST\n' + - 'Update - Maintenance is currently still in progress, maintenance will last a few hours longer than originally intended.\n' + - 'Jan 14, 09:30 EST\n' + - 'In progress - Scheduled maintenance is currently in progress. We will provide updates as necessary.\n' + - 'Jan 14, 09:10 EST\n' + - 'Scheduled - SkyBlock will be undergoing maintenance for a game update. There is not currently an exact ETA for when the maintenance will end.', - TextContent: '\n' + - 'Jan 15, 15:06 ESTCompleted - The scheduled maintenance has been completed.Jan 15, 07:55 ESTUpdate - Maintenance is currently still in progress, maintenance will last a few hours longer than originally intended.Jan 14, 09:30 ESTIn progress - Scheduled maintenance is currently in progress. We will provide updates as necessary.Jan 14, 09:10 ESTScheduled - SkyBlock will be undergoing maintenance for a game update. There is not currently an exact ETA for when the maintenance will end. ', - guid: 'v1kgjvxxbcrk', - categories: [] - }, - ... - ] -} -``` - -## Links - -- [getAPIStatus](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Client?scrollTo=getAPIStatus) -- [APIStatus](https://hypixel-api-reborn.github.io/#/docs/main/master/class/APIStatus) -- [APIIncident](https://hypixel-api-reborn.github.io/#/docs/main/master/class/APIIncident) diff --git a/docs/methods/getBoosters.md b/docs/methods/getBoosters.md deleted file mode 100644 index e0fcd1b03..000000000 --- a/docs/methods/getBoosters.md +++ /dev/null @@ -1,67 +0,0 @@ -# getBoosters - -Allows you to get all active boosters. - -## Arguments - -- [Method options](https://hypixel-api-reborn.github.io/#/docs/main/master/typedef/MethodOptions) (optional) - -## Example usage - -```js -const Hypixel = require('hypixel-api-reborn'); -const hypixel = new Hypixel.Client('API-KEY'); - -hypixel - .getBoosters() - .then((boosters) => { - console.log(boosters); - }) - .catch((e) => { - console.error(e); - }); - -// async/await -const boosters = await hypixel.getBoosters().catch((e) => console.error(e)); -console.log(boosters); -``` - -## Example response - -```js -[ - Booster { - purchaser: '978ddb705a8e43618e41749178c020b0', - amount: 2, - originalLength: 3600, - remaining: 3595, - activatedTimestamp: 1545244519133, - activated: 2018-12-19T18:35:19.133Z, - game: Game { game: 24, id: 24, code: 'SUPER_SMASH' } - }, - Booster { - purchaser: 'dfe1bb0a4220421486506ba487cdb530', - amount: 3, - originalLength: 3600, - remaining: 3600, - activatedTimestamp: 1586351429371, - activated: 2020-04-08T13:10:29.371Z, - game: Game { game: 23, id: 23, code: 'BATTLEGROUND' } - }, - Booster { - purchaser: 'f456fe17ba9741f68d2938907b443313', - amount: 2.7, - originalLength: 3600, - remaining: 1744, - activatedTimestamp: 1609097441466, - activated: 2020-12-27T19:30:41.466Z, - game: Game { game: 51, id: 51, code: 'SKYWARS' } - }, - ... -] -``` - -## Links - -- [getBoosters](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Client?scrollTo=getBoosters) -- [Booster](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Booster) diff --git a/docs/methods/getEndedSkyblockAuctions.md b/docs/methods/getEndedSkyblockAuctions.md deleted file mode 100644 index 0aad66f3d..000000000 --- a/docs/methods/getEndedSkyblockAuctions.md +++ /dev/null @@ -1,70 +0,0 @@ -# getEndedSkyblockAuctions - -Allows you to get all ended auctions in around the last 60 seconds - -## Arguments - -- Boolean - include item bytes (`false` by default) -- [Method options](https://hypixel-api-reborn.github.io/#/docs/main/master/typedef/MethodOptions) (optional) - -## Example usage - -```js -const Hypixel = require('hypixel-api-reborn'); -const hypixel = new Hypixel.Client('API-KEY'); - -hypixel - .getEndedSkyblockAuctions() - .then((data) => { - console.log(data); - }) - .catch((e) => { - console.error(e); - }); - -// async/await -const data = await hypixel.getEndedSkyblockAuctions().catch((e) => console.error(e)); -console.log(data); -``` - -## Example response - -```js -{ - info: AuctionInfo { - page: 0, - totalPages: 1, - totalAuctions: 409, - lastUpdatedTimestamp: 1635958343258, - lastUpdatedAt: 2021-11-03T16:52:23.258Z, - age: 0 - }, - auctions: [ - PartialAuction { - auctionId: '0c296cb0369249339b9e7e0dab224091', - auctioneerUuid: '5ec150a8026e4c299fbf9619f9bf10c9', - auctioneerProfile: '83c5c5f87aca47f5a5c079ca9bfe2828', - bin: true, - itemBytes: null, - buyer: '91a5a476b2d94632bf542d71c56b4cd3', - price: 60000 - }, - PartialAuction { - auctionId: '3ac36e5ed54e487d9a876b3be58bed2f', - auctioneerUuid: '3e4cbd18866140da88d5ffed25f34d1e', - auctioneerProfile: '3e4cbd18866140da88d5ffed25f34d1e', - bin: true, - itemBytes: null, - buyer: '840f212f11c640088ea2ce375b70b6a2', - price: 2690000 - }, - ... 309 more items - ] -} -``` - -## Links - -- [getEndedSkyblockAuctions](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Client?scrollTo=getEndedSkyblockAuctions) -- [AuctionInfo](https://hypixel-api-reborn.github.io/#/docs/main/master/class/AuctionInfo) -- [Partial](https://hypixel-api-reborn.github.io/#/docs/main/master/class/PartialAuction) diff --git a/docs/methods/getGuild.md b/docs/methods/getGuild.md deleted file mode 100644 index 8f491b1c9..000000000 --- a/docs/methods/getGuild.md +++ /dev/null @@ -1,94 +0,0 @@ -# getGuild - -Allows you to get statistics of hypixel guild. - -## Arguments - -- Search parameter. ('player', 'name' or 'id') -- Player UUID/Nickname or Guild Name or Guild ID -- [Method options](https://hypixel-api-reborn.github.io/#/docs/main/master/typedef/MethodOptions) (optional) - -## Example usage - -```js -const Hypixel = require('hypixel-api-reborn'); -const hypixel = new Hypixel.Client('API-KEY'); - -hypixel - .getGuild('name', 'The Foundation') - .then((guild) => { - console.log(guild.level); // 112 - }) - .catch((e) => { - console.error(e); - }); - -// async/await -const guild = await hypixel.getGuild('player', 'StavZDev').catch((e) => console.error(e)); -console.log(guild); // null (player isn't in guild) -``` - -## Example response - -```js -Guild { - id: '52e5719284ae51ed0c716c69', - name: 'The Foundation', - description: 'Hax <3 Ays Forum thread: https://hypixel.net/threads/the-foundation-f-1-legacy-guild-applications-open-questing-all-games.695949/', - experience: 317328400, - level: 112, - members: [ - [GuildMember], [GuildMember], [GuildMember], [GuildMember], [GuildMember], - [GuildMember], [GuildMember], [GuildMember], [GuildMember], [GuildMember], - [GuildMember], [GuildMember], [GuildMember], [GuildMember], [GuildMember], - [GuildMember], [GuildMember], [GuildMember], [GuildMember], [GuildMember], - [GuildMember], [GuildMember], [GuildMember], [GuildMember], [GuildMember], - [GuildMember], [GuildMember], [GuildMember], [GuildMember], [GuildMember], - [GuildMember], [GuildMember], [GuildMember], [GuildMember], [GuildMember], - ... - ], - ranks: [ [GuildRank], [GuildRank], [GuildRank], [GuildRank], [GuildRank] ], - totalWeeklyGexp: 13093255, - getRanksByNewest: [Function (anonymous)], - getMemberUUIDMap: [Function (anonymous)], - getRankByPriority: [Function (anonymous)], - createdAtTimestamp: 1390768530176, - createdAt: 2014-01-26T20:35:30.176Z, - joinable: true, - publiclyListed: false, - chatMuteUntilTimestamp: null, - chatMuteUntil: null, - banner: { Base: '0', Patterns: [Array] }, - tag: 'F', - tagColor: Color { color: 'YELLOW' }, - legacyRank: 1, - expHistory: [ - { day: '2021-01-13', exp: 123713 }, - { day: '2021-01-12', exp: 2252825 }, - { day: '2021-01-11', exp: 1942112 }, - { day: '2021-01-10', exp: 1976094 }, - { day: '2021-01-09', exp: 2425690 }, - { day: '2021-01-08', exp: 2345603 }, - { day: '2021-01-07', exp: 2027218 } -], - achievements: { winners: 2627, experienceKings: 489954, onlinePlayers: 125 }, - preferredGames: [ - [Game], [Game], [Game], - [Game], [Game], [Game], - [Game], [Game], [Game], - [Game], [Game], [Game], - [Game], [Game], [Game], - [Game], [Game], [Game], - [Game] - ] -} -``` - -## Links - -- [getGuild](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Client?scrollTo=getGuild) -- [Guild](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Guild) -- [GuildMember](https://hypixel-api-reborn.github.io/#/docs/main/master/class/GuildMember) -- [GuildRank](https://hypixel-api-reborn.github.io/#/docs/main/master/class/GuildRank) -- [Color](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Color) -- [Game](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Game) diff --git a/docs/methods/getLeaderboards.md b/docs/methods/getLeaderboards.md deleted file mode 100644 index bab0c5c3e..000000000 --- a/docs/methods/getLeaderboards.md +++ /dev/null @@ -1,169 +0,0 @@ -# getLeaderboards - -Gets all leaderboards. - -## Arguments - -- [Method options](https://hypixel-api-reborn.github.io/#/docs/main/master/typedef/MethodOptions) (optional) - -## Example usage - -```js -const Hypixel = require('hypixel-api-reborn'); -const hypixel = new Hypixel.Client('API-KEY'); - -hypixel - .getLeaderboards() - .then((leaderboards) => { - console.log(leaderboards); - }) - .catch((e) => { - console.error(e); - }); - -// async/await -const leaderboards = await hypixel.getLeaderboards().catch((e) => console.error(e)); -console.log(leaderboards); -``` - -## Example response - -```js -{ - ARENA: [ - Leaderboard { name: 'Overall', title: 'Rating', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Overall', title: '1v1 Wins', playerCount: 10, leaders: [Array] } - ], - COPS_AND_CRIMS: [ - Leaderboard { name: 'Overall', title: 'Kills', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Monthly', title: 'Defusal Wins', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Weekly', title: 'Defusal Wins', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Monthly', title: 'Deathmatch Wins', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Weekly', title: 'Deathmatch Wins', playerCount: 10, leaders: [Array] } - ], - WARLORDS: [ - Leaderboard { name: 'Overall', title: 'Wins', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Overall', title: 'DOM Wins', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Overall', title: 'TDM Wins', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Overall', title: 'CTF Wins', playerCount: 10, leaders: [Array] } - ], - BLITZ_SURVIVAL_GAMES: [ - Leaderboard { name: 'Overall', title: 'Kills', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Overall', title: 'Solo Wins', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Overall', title: 'Teams Wins', playerCount: 10, leaders: [Array] } - ], - UHC: [ - Leaderboard { name: 'Overall', title: 'Kills', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Monthly', title: 'Kills', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Overall', title: 'Wins', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Monthly', title: 'Wins', playerCount: 10, leaders: [Array] } - ], - WALLS: [ - Leaderboard { name: 'Overall', title: 'Kills', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Monthly', title: 'Kills', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Weekly', title: 'Kills', playerCount: 10, leaders: [Array] } - ], - PROTOTYPE: [], - PAINTBALL: [ - Leaderboard { name: 'Overall', title: 'Kills', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Monthly', title: 'Kills', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Weekly', title: 'Kills', playerCount: 10, leaders: [Array] } - ], - SKYWARS: [ - Leaderboard { name: 'Overall', title: 'Rating', playerCount: 14, leaders: [] }, - Leaderboard { name: 'Overall', title: 'Wins', playerCount: 14, leaders: [Array] }, - Leaderboard { name: 'Overall', title: 'Kills', playerCount: 14, leaders: [Array] }, - Leaderboard { name: 'Monthly', title: 'Kills', playerCount: 14, leaders: [Array] }, - Leaderboard { name: 'Weekly', title: 'Kills', playerCount: 14, leaders: [Array] } - ], - MURDER_MYSTERY: [ - Leaderboard { name: 'Overall', title: 'Wins', playerCount: 14, leaders: [Array] }, - Leaderboard { name: 'Weekly', title: 'Wins', playerCount: 14, leaders: [Array] }, - Leaderboard { name: 'Overall', title: 'Kills', playerCount: 14, leaders: [Array] }, - Leaderboard { name: 'Weekly', title: 'Kills', playerCount: 14, leaders: [Array] }, - Leaderboard { name: 'Overall', title: 'Kills as Murderer', playerCount: 14, leaders: [Array] }, - Leaderboard { name: 'Weekly', title: 'Kills as Murderer', playerCount: 14, leaders: [Array] } - ], - SMASH_HEROES: [ - Leaderboard { name: 'Overall', title: 'Smash Level', playerCount: 14, leaders: [Array] }, - Leaderboard { name: 'Overall', title: 'Kills', playerCount: 14, leaders: [Array] }, - Leaderboard { name: 'Monthly', title: 'Kills', playerCount: 14, leaders: [Array] }, - Leaderboard { name: 'Weekly', title: 'Kills', playerCount: 14, leaders: [Array] } - ], - DUELS: [ - Leaderboard { name: 'Weekly', title: 'Wins', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Monthly', title: 'Wins', playerCount: 10, leaders: [Array] } - ], - SPEED_UHC: [ - Leaderboard { name: 'Total', title: 'Salt', playerCount: 16, leaders: [Array] }, - Leaderboard { name: 'Normal', title: 'Kills', playerCount: 16, leaders: [Array] }, - Leaderboard { name: 'Normal', title: 'Wins', playerCount: 16, leaders: [Array] }, - Leaderboard { name: 'Insane', title: 'Kills', playerCount: 16, leaders: [Array] }, - Leaderboard { name: 'Insane', title: 'Wins', playerCount: 16, leaders: [Array] } - ], - TNTGAMES: [ - Leaderboard { name: 'Overall', title: 'TNT Run Wins', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Overall', title: 'PVP Run Wins', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Overall', title: 'Wizards Wins', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Overall', title: 'TNT Tag Wins', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Overall', title: 'Spleef Wins', playerCount: 10, leaders: [Array] } - ], - BEDWARS: [ - Leaderboard { name: 'Current', title: 'Level', playerCount: 14, leaders: [Array] }, - Leaderboard { name: 'Overall', title: 'Wins', playerCount: 14, leaders: [Array] }, - Leaderboard { name: 'Weekly', title: 'Wins', playerCount: 14, leaders: [Array] }, - Leaderboard { name: 'Overall', title: 'Final Kills', playerCount: 14, leaders: [Array] }, - Leaderboard { name: 'Weekly', title: 'Final Kills', playerCount: 14, leaders: [Array] } - ], - TURBO_KART_RACERS: [ - Leaderboard { name: 'Overall', title: 'Gold Trophies', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Monthly', title: 'Gold Trophies', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Weekly', title: 'Gold Trophies', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Overall', title: 'Laps Completed', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Grand Prix', title: 'Points', playerCount: 10, leaders: [Array] } - ], - BUILD_BATTLE: [ - Leaderboard { name: 'Lifetime', title: 'Score', playerCount: 14, leaders: [Array] }, - Leaderboard { name: 'Lifetime', title: 'Coins', playerCount: 14, leaders: [Array] }, - Leaderboard { name: 'Lifetime', title: 'Wins', playerCount: 14, leaders: [Array] } - ], - ARCADE: [ - Leaderboard { name: 'Current', title: 'Coins', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Weekly', title: 'Coins', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Monthly', title: 'Coins', playerCount: 10, leaders: [Array] } - ], - SKYCLASH: [ - Leaderboard { name: 'Total', title: 'Kills', playerCount: 14, leaders: [Array] }, - Leaderboard { name: 'Solo', title: 'Wins', playerCount: 14, leaders: [Array] }, - Leaderboard { name: 'Doubles', title: 'Wins', playerCount: 14, leaders: [Array] }, - Leaderboard { name: 'TeamWar', title: 'Wins', playerCount: 14, leaders: [Array] }, - Leaderboard { name: 'Monthly', title: 'Kills', playerCount: 14, leaders: [] } - ], - QUAKECRAFT: [ - Leaderboard { name: 'Overall', title: 'Kills', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Monthly', title: 'Kills', playerCount: 10, leaders: [] }, - Leaderboard { name: 'Weekly', title: 'Kills', playerCount: 10, leaders: [] } - ], - CRAZY_WALLS: [ - Leaderboard { name: 'Overall', title: 'Wins', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Overall', title: 'Kills', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Monthly', title: 'Kills', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Weekly', title: 'Kills', playerCount: 10, leaders: [Array] } - ], - MEGA_WALLS: [ - Leaderboard { name: 'Overall', title: 'Final Kills', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Monthly', title: 'Final Kills', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Weekly', title: 'Final Kills', playerCount: 10, leaders: [Array] } - ], - VAMPIREZ: [ - Leaderboard { name: 'Overall', title: 'Human Wins', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Monthly', title: 'Human Wins', playerCount: 10, leaders: [Array] }, - Leaderboard { name: 'Weekly', title: 'Human Wins', playerCount: 10, leaders: [Array] } - ] -} -``` - -## Links - -- [getLeaderboards](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Client?scrollTo=getLeaderboards) -- [Leaderboard](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Leaderboard) diff --git a/docs/methods/getPlayer.md b/docs/methods/getPlayer.md deleted file mode 100644 index 5d4030425..000000000 --- a/docs/methods/getPlayer.md +++ /dev/null @@ -1,131 +0,0 @@ -# getPlayer - -Allows you to get statistics of player. - -## Arguments - -- Player nickname or UUID -- [Method options](https://hypixel-api-reborn.github.io/#/docs/main/master/typedef/PlayerMethodOptions) (optional) - -## Example usage - -```js -const Hypixel = require('hypixel-api-reborn'); -const hypixel = new Hypixel.Client('API-KEY'); - -hypixel - .getPlayer('StavZDev') - .then((player) => { - console.log(player); - }) - .catch((e) => { - console.error(e); - }); - -// async/await -const player = await hypixel.getPlayer('StavZDev').catch((e) => console.error(e)); -console.log(player); // if player doesn't exist will return null - -// include player's guild in Player -hypixel - .getPlayer('StavZDev', { guild: true }) - .then((player) => { - console.log(player); - }) - .catch((e) => { - console.error(e); - }); -``` - -## Example response - -```js -Player { - nickname: 'StavZDev', - uuid: '52d9a36f66ce4cdf9a56ad9724ae9fb4', - history: [ - 'StavZ', - 'GravitonSurge', - 'StavZDev' - ], - rank: 'MVP+', - mcVersion: '1.8.9', - channel: 'PARTY', - firstLoginTimestamp: 1505345803214, - firstLogin: 2017-09-13T23:36:43.214Z, - lastLoginTimestamp: 1609782932833, - lastLogin: 2021-01-04T17:55:32.833Z, - lastLogoutTimestamp: 1609783056053, - lastLogout: 2021-01-04T17:57:36.053Z, - recentlyPlayedGame: Game { game: 'BEDWARS' }, - plusColor: Color { color: 'DARK_GREEN' }, - guild: null, - karma: 4747751, - achievements: { - skywarsKillsTeam: 3853, - skywarsCages: 26, - skywarsWinsTeam: 403, - skywarsWinsMega: 5, - skywarsKitsSolo: 23, - skywarsKitsTeam: 25, - skywarsWinsSolo: 2767, - skywarsKillsSolo: 19580, - skywarsKillsMega: 83, - skywarsKitsMega: 10, - generalChallenger: 2838, - generalQuestMaster: 2183, - generalWins: 6602, - ... - }, - achievementPoints: 4155, - totalExperience: 25842562, - level: 141.33, - socialMedia: [ - { name: 'Twitter', link: 'https://twitter.com/StavZDev', id: 'TWITTER' }, - { name: 'YouTube', link: 'https://www.youtube.com/channel/UCQcOYjpXiDEWpb34eBtObtQ', id: 'YOUTUBE' }, - { name: 'Discord', link: 'StavZDev#6469', id: 'DISCORD' }, - { name: 'Hypixel', link: 'https://hypixel.net/members/imstavz.1246904/', id: 'HYPIXEL' } - ], - giftsSent: 25, - giftsReceived: 6, - isOnline: false, - lastDailyReward: 2021-01-03T18:37:11.800Z, - lastDailyRewardTimestamp: 1609699031800, - getRecentGames: [Function (anonymous)], - stats: { - skywars: SkyWars, - bedwars: BedWars, - uhc: UHC, - speeduhc: SpeedUHC, - murdermystery: MurderMystery, - duels: Duels, - buildbattle: BuildBattle, - megawalls: MegaWalls, - copsandcrims: CopsAndCrims, - tntgames: TNTGames, - smashheroes: SmashHeroes, - vampirez: VampireZ, - blitzsg: BlitzSurvivalGames, - arena: ArenaBrawl - } -} -``` - -## Links - -- [getPlayer](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Client?scrollTo=getPlayer) -- [Player](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Player) -- [SkyWars](https://hypixel-api-reborn.github.io/#/docs/main/master/class/SkyWars) -- [BedWars](https://hypixel-api-reborn.github.io/#/docs/main/master/class/BedWars) -- [UHC](https://hypixel-api-reborn.github.io/#/docs/main/master/class/UHC) -- [Speed UHC](https://hypixel-api-reborn.github.io/#/docs/main/master/class/SpeedUHC) -- [Murder Mystery](https://hypixel-api-reborn.github.io/#/docs/main/master/class/MurderMystery) -- [Duels](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Duels) -- [BuildBattle](https://hypixel-api-reborn.github.io/#/docs/main/master/class/BuildBattle) -- [MegaWalls](https://hypixel-api-reborn.github.io/#/docs/main/master/class/MegaWalls) -- [Cops And Crims](https://hypixel-api-reborn.github.io/#/docs/main/master/class/CopsAndCrims) -- [The TNT Games](https://hypixel-api-reborn.github.io/#/docs/main/master/class/TNTGames) -- [Smash Heroes](https://hypixel-api-reborn.github.io/#/docs/main/master/class/ShashHeroes) -- [VampireZ](https://hypixel-api-reborn.github.io/#/docs/main/master/class/VampireZ) -- [Blitz Survival Games](https://hypixel-api-reborn.github.io/#/docs/main/master/class/BlitzSurvivalGames) -- [Arena Brawl](https://hypixel-api-reborn.github.io/#/docs/main/master/class/ArenaBrawl) diff --git a/docs/methods/getRecentGames.md b/docs/methods/getRecentGames.md deleted file mode 100644 index 25352d783..000000000 --- a/docs/methods/getRecentGames.md +++ /dev/null @@ -1,52 +0,0 @@ -# getRecentGames - -Allows you to get recent games of a player. - -## Arguments - -- Player nickname or UUID -- [Method options](https://hypixel-api-reborn.github.io/#/docs/main/master/typedef/MethodOptions) (optional) - -## Example usage - -```js -const Hypixel = require('hypixel-api-reborn'); -const hypixel = new Hypixel.Client('API-KEY'); - -hypixel - .getRecentGames('StavZDev') - .then((recentGames) => { - console.log(recentGames); - }) - .catch((e) => { - console.error(e); - }); - -// async/await -const recentGames = await hypixel.getRecentGames('StavZDev').catch((e) => console.error(e)); -console.log(recentGames); // if player doesn't exist will return null. -``` - -## Example response - -```js -[ - RecentGame { - game: 'SKYWARS', - id: 51, - code: 'SKYWARS', - dateTimestamp: 1612067873760, - date: 2021-01-31T04:37:53.760Z, - mode: 'solo_insane', - map: 'Aquarius', - ongoing: true, - endedAt: null, - endedTimestamp: null - } -] -``` - -## Links - -- [getRecentGames](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Client?scrollTo=getRecentGames) -- [RecentGame](https://hypixel-api-reborn.github.io/#/docs/main/master/class/RecentGame) diff --git a/docs/methods/getServerInfo.md b/docs/methods/getServerInfo.md deleted file mode 100644 index 6954fbb6c..000000000 --- a/docs/methods/getServerInfo.md +++ /dev/null @@ -1,53 +0,0 @@ -# getServerInfo - -Sends a STATUS packet to hypixel and parses the return info - -## Arguments - -- Repeats (Sends x amount of ping requests and gets the average. Should be between 1 and 10) (optional) - -## Example usage - -```js -const Hypixel = require('hypixel-api-reborn'); -const hypixel = new Hypixel.Client('API-KEY'); - -hypixel - .getServerInfo() - .then((serverInfo) => { - console.log(serverInfo); - }) - .catch((e) => { - console.error(e); - }); - -// async/await -const serverInfo = await hypixel.getServerInfo().catch((e) => console.error(e)); -console.log(serverInfo); -``` - -## Example response - -```js -ServerInfo { - protocolUsed: 736, - versionInfo: 'Requires MC 1.8 / 1.16', - players: { - max: 200000, - online: 50225, - players: [], - toString: [Function: toString] - }, - rawMOTD: '§aHypixel Network §c[1.8-1.16]\n' + '§6§lSKYBLOCK 0.11 §7- §5§lDWARVEN MINES', - cleanMOTD: 'Hypixel Network [1.8-1.16]\n' + 'SKYBLOCK 0.11 - DWARVEN MINES', - textMOTD: 'Hypixel Network [1.8-1.16]\nSKYBLOCK 0.11 - DWARVEN MINES', - faviconB64: 'data:image/png;base64,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', - favicon: , - ping: 163 -} -``` - -## Links - -- [getServerInfo](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Client?scrollTo=getServerInfo) -- [ServerInfo](https://hypixel-api-reborn.github.io/#/docs/main/master/class/ServerInfo) diff --git a/docs/methods/getSkyblockAuctions.md b/docs/methods/getSkyblockAuctions.md deleted file mode 100644 index e71733c7d..000000000 --- a/docs/methods/getSkyblockAuctions.md +++ /dev/null @@ -1,138 +0,0 @@ -# getSkyblockAuctions - -Allows you to get skyblock auctions - -## Arguments - -- "\*", a page number, or an array with the start and the end page number (automatically sorted) -- [Method options](https://hypixel-api-reborn.github.io/#/docs/main/master/typedef/auctionsOptions) (optional) - -## Example usage - -```js -const Hypixel = require('hypixel-api-reborn'); -const hypixel = new Hypixel.Client('API-KEY'); - -hypixel - .getSkyblockAuctions(1) - .then((data) => { - console.log(data); - }) - .catch((e) => { - console.error(e); - }); - -// async/await -const data = await hypixel.getSkyblockAuctions(1).catch((e) => console.error(e)); -console.log(data); -``` - -## Example response - -```js -{ - auctions: [ - Auction { - auctionId: '739762c5556848008bd719df6b027bd8', - auctioneerUuid: 'b62f419ed8dd40bbaf0d2e8c075a0e1a', - auctioneerProfile: 'b62f419ed8dd40bbaf0d2e8c075a0e1a', - bin: true, - itemBytes: null, - coop: [Array], - auctionStartTimestamp: 1635954533152, - auctionStart: 2021-11-03T15:48:53.152Z, - auctionEnd: 2021-11-03T21:48:53.152Z, - auctionEndTimestamp: 1635976133152, - item: 'Gemstone Mixture', - itemLore: 'A collection of finely treated\n' + - 'Gemstones held together by\n' + - 'the sturdiest of sticky\n' + - 'substances.\n' + - '\n' + - 'RARE', - itemLoreRaw: '§7§7A collection of finely treated\n' + - '§7§dGemstones §7held together by\n' + - '§7the sturdiest of §asticky\n' + - '§a§7substances.\n' + - '\n' + - '§9§lRARE', - rarity: 'RARE', - startingBid: 1200000, - highestBid: 1200000, - bids: [], - claimed: false, - claimedBidders: [] - }, - Auction { - auctionId: '5b27b677b59b4059b9502aa958b9b3a5', - auctioneerUuid: 'dea9145c3b384f57a23299fa5b7d8ff9', - auctioneerProfile: '06c2bf868f154bf0b6446fc7f099b5c9', - bin: true, - itemBytes: null, - coop: [Array], - auctionStartTimestamp: 1635915150654, - auctionStart: 2021-11-03T04:52:30.654Z, - auctionEnd: 2021-11-17T04:52:30.654Z, - auctionEndTimestamp: 1637124750654, - item: 'Rock Gemstone', - itemLore: 'Reforge Stone\n' + - '\n' + - 'Can be used in a Reforge Anvil\n' + - 'or with the Dungeon Blacksmith\n' + - 'to apply the Auspicious\n' + - 'reforge to a pickaxe.\n' + - '\n' + - 'oThe lowest gemstone in the\n' + - 'ofood chain.\n' + - '\n' + - 'Auspicious (Legendary):\n' + - 'Mining Speed: +45\n' + - '\n' + - 'Requires Mining Skill Level\n' + - 'XXI!\n' + - '\n' + - 'RARE REFORGE STONE', - itemLoreRaw: '§8Reforge Stone\n' + - '\n' + - '§7Can be used in a Reforge Anvil\n' + - '§7or with the Dungeon Blacksmith\n' + - '§7to apply the §9Auspicious\n' + - '§9§7reforge to a pickaxe.\n' + - '\n' + - '§7§8§oThe lowest gemstone in the\n' + - '§8§ofood chain.\n' + - '\n' + - '§9Auspicious §7(§6Legendary§7):\n' + - '§7Mining Speed: §a+45\n' + - '\n' + - '§7Requires §aMining Skill Level\n' + - '§aXXI§7!\n' + - '\n' + - '§9§lRARE REFORGE STONE', - rarity: 'RARE', - startingBid: 1800000, - highestBid: 1800000, - bids: [], - claimed: false, - claimedBidders: [] - } - ... 900 more items - ], - info: AuctionInfo { - page: 1, - totalPages: 59, - totalAuctions: 58497, - lastUpdatedTimestamp: 1635957623258, - lastUpdatedAt: 2021-11-03T16:40:23.258Z, - age: 11, - failedPages: [] - } -} -``` - -## Links - -- [getSkyblockAuctions](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Client?scrollTo=getSkyblockAuctions) -- [AuctionInfo](https://hypixel-api-reborn.github.io/#/docs/main/master/class/AuctionInfo) -- [Auction](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Auction) -- [Bid](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Bid) diff --git a/docs/methods/getSkyblockAuctionsByPlayer.md b/docs/methods/getSkyblockAuctionsByPlayer.md deleted file mode 100644 index 729583220..000000000 --- a/docs/methods/getSkyblockAuctionsByPlayer.md +++ /dev/null @@ -1,101 +0,0 @@ -# getSkyblockAuctions - -Allows you to get player's skyblock auctions - -## Arguments - -- Player nickname or UUID -- Boolean - include item bytes (`false` by default) -- [Method options](https://hypixel-api-reborn.github.io/#/docs/main/master/typedef/MethodOptions) (optional) - -## Example usage - -```js -const Hypixel = require('hypixel-api-reborn'); -const hypixel = new Hypixel.Client('API-KEY'); - -hypixel - .getSkyblockAuctionsByPlayer('StavZDev') - .then((data) => { - console.log(data); - }) - .catch((e) => { - console.error(e); - }); - -// async/await -const data = await hypixel.getSkyblockAuctionsByPlayer('StavZDev').catch((e) => console.error(e)); -console.log(data); -``` - -## Example response - -```js -[ - Auction { - auctionId: 'f213f4499d3341959d1fe5a7f78dc14d', - auctioneerUuid: '28667672039044989b0019b14a2c34d6', - auctioneerProfile: 'd3df3cccffd3473fbbba311d5329bd25', - bin: false, - itemBytes: null, - coop: [ - '4ce231a79af8473faf1dab7ecf4de2ad', - '28667672039044989b0019b14a2c34d6', - '0e3713522c0f4b63a20e2474724ae761', - 'ed32a0660fc948378dcf8ed717d1188c' - ], - auctionStartTimestamp: 1565028554338, - auctionStart: 2019-08-05T18:09:14.338Z, - auctionEnd: 2019-08-06T06:09:14.338Z, - auctionEndTimestamp: 1565071754338, - item: 'Protector Dragon Fragment', - itemLore: 'Right-click to view recipes!\n\nEPIC', - itemLoreRaw: '§eRight-click to view recipes!\n\n§5§lEPIC', - rarity: 'EPIC', - startingBid: 800, - highestBid: 80000, - bids: [ [Bid], [Bid], [Bid], [Bid], [Bid] ], - claimed: true, - claimedBidders: [ - '9e93a11bdced49279afb87e1bd205098', - 'd500749d2666436b814b8e34717a3b51', - '8ce05c84824b404faa0397614be6cac5', - '56b9c409d8cf4fdda08a131dd6b37579' - ] - }, - Auction { - auctionId: '9b714581da774c729ea95ee0dc38a089', - auctioneerUuid: '28667672039044989b0019b14a2c34d6', - auctioneerProfile: 'd3df3cccffd3473fbbba311d5329bd25', - bin: false, - itemBytes: null, - coop: [ - 'd8a5686cae794419aafc72a93afb7b26', - '4ce231a79af8473faf1dab7ecf4de2ad', - '40884fdda30c4c26ba00abef570469e0', - '28667672039044989b0019b14a2c34d6', - '32eda389f6d1446f8c26b30fe1384550' - ], - auctionStartTimestamp: 1570978114450, - auctionStart: 2019-10-13T14:48:34.450Z, - auctionEnd: 2019-10-13T14:53:34.450Z, - auctionEndTimestamp: 1570978414450, - item: 'Rotten Flesh', - itemLore: 'COMMON', - itemLoreRaw: '§f§lCOMMON', - rarity: 'COMMON', - startingBid: 2, - highestBid: 532647, - bids: [ [Bid] ], - claimed: true, - claimedBidders: [] - } - ... 153 more items -] -``` - -## Links - -- [getSkyblockAuctionsByPlayer](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Client?scrollTo=getSkyblockAuctionsByPlayer) -- [Auction](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Auction) -- [Bid](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Bid) diff --git a/docs/methods/getSkyblockBazaar.md b/docs/methods/getSkyblockBazaar.md deleted file mode 100644 index bba7bebe1..000000000 --- a/docs/methods/getSkyblockBazaar.md +++ /dev/null @@ -1,65 +0,0 @@ -# getSkyblockBazaar - -Allows you to get list of products - -## Arguments - -- [Method options](https://hypixel-api-reborn.github.io/#/docs/main/master/typedef/MethodOptions) (optional) - -## Example usage - -```js -const Hypixel = require('hypixel-api-reborn'); -const hypixel = new Hypixel.Client('API-KEY'); - -hypixel - .getSkyblockBazaar() - .then((products) => { - console.log(products); - }) - .catch((e) => { - console.error(e); - }); - -// async/await -const products = await hypixel.getSkyblockMember().catch((e) => console.error(e)); -console.log(products); -``` - -## Example response - -```js -[ - Product { - productId: 'INK_SACK:3', - sellSummary: [ [Order], [Order], [Order], [Order], [Order], [Order] ], - buySummary: [ - [Order], [Order], [Order], [Order], - [Order], [Order], [Order], [Order], - [Order], [Order], [Order], [Order], - [Order], [Order], [Order], [Order], - [Order], [Order], [Order], [Order], - [Order], [Order], [Order], [Order], - [Order], [Order], [Order], [Order], - [Order], [Order] - ], - status: { - sellPrice: 2, - buyPrice: 3, - sellVolume: 2340181, - buyVolume: 2555183, - sellMovingWeek: 27628511, - buyMovingWeek: 7376853, - sellOrders: 34, - buyOrders: 337 - } - } - ... 204 more items -] -``` - -## Links - -- [getSkyblockBazaar](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Client?scrollTo=getSkyblockBazaar) -- [Product](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Product) -- [Order](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Order) diff --git a/docs/methods/getSkyblockMember.md b/docs/methods/getSkyblockMember.md deleted file mode 100644 index 3dbdfb97f..000000000 --- a/docs/methods/getSkyblockMember.md +++ /dev/null @@ -1,138 +0,0 @@ -# getSkyblockMember - -Allows you to get a player's skyblock member data from all their profiles - -## Arguments - -- Player nickname or UUID -- [Method options](https://hypixel-api-reborn.github.io/#/docs/main/master/typedef/MethodOptions) (optional) - -## Example usage - -```js -const Hypixel = require('hypixel-api-reborn'); -const hypixel = new Hypixel.Client('API-KEY'); - -hypixel - .getSkyblockMember('StavZDev') - .then((map) => { - console.log(map); // if player has no skyblock profiles will return an empty Map - }) - .catch((e) => { - console.error(e); - // if player doesn't exist will throw an error - }); - -// async/await -const map = await hypixel.getSkyblockMember('StavZDev').catch((e) => console.error(e)); -console.log(map); -``` - -## Example response - -```js -Map(1) { - 'Lime' => SkyblockMember { - uuid: '52d9a36f66ce4cdf9a56ad9724ae9fb4', - player: null, - profileName: 'Lime', - firstJoinTimestamp: 1560352500017, - firstJoinAt: 2019-06-12T15:15:00.017Z, - firstJoinHubTimestamp: 848208, - firstJoinHubAt: 2019-06-12T15:29:08.225Z, - lastSave: 1615632015391, - lastSaveAt: 2021-03-13T10:40:15.391Z, - lastDeathAt: 2020-02-14T16:11:05.000Z, - lastDeath: 21420965, - getArmor: [AsyncFunction (anonymous)], - getWardrobe: [AsyncFunction (anonymous)], - fairySouls: 14, - fairyExchanges: 0, - skills: { - farming: [Object], - mining: [Object], - combat: [Object], - foraging: [Object], - fishing: [Object], - enchanting: [Object], - alchemy: [Object], - taming: [Object], - carpentry: [Object], - runecrafting: [Object] - }, - slayer: { zombie: [Object], spider: [Object], wolf: [Object] }, - dungeons: { types: [Object], classes: [Object] }, - collections: { - LOG: 19, - SEEDS: 7430, - COBBLESTONE: 6206, - COAL: 92, - CARROT_ITEM: 1225, - ROTTEN_FLESH: 38, - 'LOG:2': 84, - 'LOG:1': 2, - 'LOG_2:1': 69, - WHEAT: 7770, - IRON_INGOT: 118, - GOLD_INGOT: 52, - SULPHUR: 2, - 'INK_SACK:4': 37, - REDSTONE: 66, - SPIDER_EYE: 1, - STRING: 1, - BONE: 14, - ENDER_PEARL: 1, - MELON: 96, - PUMPKIN: 6, - POTATO_ITEM: 89, - PORK: 15, - FEATHER: 9, - RAW_CHICKEN: 9, - MUTTON: 31, - SUGAR_CANE: 25, - RABBIT: 14, - MUSHROOM_COLLECTION: 63, - LEATHER: 12 - }, - getEnderChest: [AsyncFunction (anonymous)], - getInventory: [AsyncFunction (anonymous)], - purse: 5089.609042968747, - stats: { - highestCritDamage: 2259.52084, - kills: 140, - killsZombie: 33, - deaths: 13, - deathsVoid: 5, - killsInvisibleCreeper: 2, - killsLapisZombie: 2, - killsRedstonePigman: 1, - deathsRedstonePigman: 1, - deathsLapisZombie: 1, - deathsZombie: 3, - deathsSkeleton: 1, - killsSpider: 1, - killsSkeleton: 13, - killsEnderman: 2, - highestCriticalDamage: 60.196500000000015, - deathsUnburriedZombie: 2, - killsPig: 15, - killsChicken: 9, - killsSheep: 31, - killsRabbit: 14, - killsCow: 12, - killsZombieVillager: 5, - giftsReceived: 2, - giftsGiven: 6, - auctionsCreated: 1, - auctionsFees: 45 - }, - pets: [], - jacob: { medals: [Object], perks: [Object], contests: [Object] } - } -} -``` - -## Links - -- [getSkyblockMember](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Client?scrollTo=getSkyblockMember) -- [SkyblockMember](https://hypixel-api-reborn.github.io/#/docs/main/master/class/SkyblockMember) diff --git a/docs/methods/getSkyblockProfiles.md b/docs/methods/getSkyblockProfiles.md deleted file mode 100644 index 382651deb..000000000 --- a/docs/methods/getSkyblockProfiles.md +++ /dev/null @@ -1,74 +0,0 @@ -# getSkyblockProfiles - -Allows you to get all skyblock profiles of player. - -## Arguments - -- Player nickname or UUID -- [Method options](https://hypixel-api-reborn.github.io/#/docs/main/master/typedef/SkyblockMethodOptions) (optional) - -## Example usage - -```js -const Hypixel = require('hypixel-api-reborn'); -const hypixel = new Hypixel.Client('API-KEY'); - -hypixel - .getSkyblockProfiles('StavZDev') - .then((profiles) => { - console.log(profiles); // if player has no skyblock profiles will return an empty array - }) - .catch((e) => { - console.error(e); - // if player doesn't exist will throw an error - }); - -// async/await -const profiles = await hypixel.getSkyblockProfiles('StavZDev').catch((e) => console.error(e)); -console.log(profiles); -``` - -## Example response - -```js -[ - SkyblockProfile { - profileId: '65feab38f8434631b77d616bb40e1987', - profileName: 'Lime', - members: [ [SkyblockMember] ], - me: SkyblockMember { - uuid: '52d9a36f66ce4cdf9a56ad9724ae9fb4', - player: null, - profileName: 'Lime', - firstJoinTimestamp: 1560352500017, - firstJoinAt: 2019-06-12T15:15:00.017Z, - firstJoinHubTimestamp: 848208, - firstJoinHubAt: 2019-06-12T15:29:08.225Z, - lastSave: 1615632015391, - lastSaveAt: 2021-03-13T10:40:15.391Z, - lastDeathAt: 2020-02-14T16:11:05.000Z, - lastDeath: 21420965, - getArmor: [AsyncFunction (anonymous)], - getWardrobe: [AsyncFunction (anonymous)], - fairySouls: 14, - fairyExchanges: 0, - skills: [Object], - slayer: [Object], - dungeons: [Object], - collections: [Object], - getEnderChest: [AsyncFunction (anonymous)], - getInventory: [AsyncFunction (anonymous)], - purse: 5089.609042968747, - stats: [Object], - pets: [], - jacob: [Object] - } - } -] -``` - -## Links - -- [getSkyblockProfiles](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Client?scrollTo=getSkyblockProfiles) -- [SkyblockProfile](https://hypixel-api-reborn.github.io/#/docs/main/master/class/SkyblockProfile) -- [SkyblockMember](https://hypixel-api-reborn.github.io/#/docs/main/master/class/SkyblockMember) diff --git a/docs/methods/getStatus.md b/docs/methods/getStatus.md deleted file mode 100644 index f77cbce1a..000000000 --- a/docs/methods/getStatus.md +++ /dev/null @@ -1,45 +0,0 @@ -# getStatus - -Allows you to get the status of a player. - -## Arguments - -- Player nickname or UUID -- [Method options](https://hypixel-api-reborn.github.io/#/docs/main/master/typedef/MethodOptions) (optional) - -## Example usage - -```js -const Hypixel = require('hypixel-api-reborn'); -const hypixel = new Hypixel.Client('API-KEY'); - -hypixel - .getStatus('StavZDev') - .then((status) => { - console.log(status); - }) - .catch((e) => { - console.error(e); - }); - -// async/await -const status = await hypixel.getStatus('StavZDev').catch((e) => console.error(e)); -console.log(status); // if player doesn't exist will return null -``` - -## Example response - -```js -Status { - online: true, - game: Game { game: 'SKYWARS', id: 51, code: 'SKYWARS' }, - mode: 'LOBBY', - map: null -} -``` - -## Links - -- [getStatus](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Client?scrollTo=getStatus) -- [Status](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Status) -- [Game](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Game) diff --git a/docs/methods/getWatchdogStats.md b/docs/methods/getWatchdogStats.md deleted file mode 100644 index f31befd82..000000000 --- a/docs/methods/getWatchdogStats.md +++ /dev/null @@ -1,44 +0,0 @@ -# getWatchdogStats - -Allows you to get statistics of watchdog, the server anticheat. - -## Arguments - -- [Method options](https://hypixel-api-reborn.github.io/#/docs/main/master/typedef/MethodOptions) (optional) - -## Example usage - -```js -const Hypixel = require('hypixel-api-reborn'); -const hypixel = new Hypixel.Client('API-KEY'); - -hypixel - .getWatchdogStats() - .then((watchdog) => { - console.log(watchdog); - }) - .catch((e) => { - console.error(e); - }); - -// async/await -const watchdog = await hypixel.getWatchdogStats().catch((e) => console.error(e)); -console.log(watchdog); -``` - -## Example response - -```js -WatchdogStats { - byWatchdogTotal: 6122345, - byWatchdogLastMinute: 7, - byWatchdogRollingDay: 6374, - byStaffTotal: 2143182, - byStaffRollingDay: 2248 -} -``` - -## Links - -- [getWatchdogStats](https://hypixel-api-reborn.github.io/#/docs/main/master/class/Client?scrollTo=getWatchdogStats) -- [WatchdogStats](https://hypixel-api-reborn.github.io/#/docs/main/master/class/WatchdogStats) diff --git a/eslint.config.mjs b/eslint.config.js similarity index 72% rename from eslint.config.mjs rename to eslint.config.js index 01c98f0d0..646370d79 100644 --- a/eslint.config.mjs +++ b/eslint.config.js @@ -1,45 +1,47 @@ -import jsdoc from 'eslint-plugin-jsdoc'; import globals from 'globals'; -import js from '@eslint/js'; +import prettier from 'eslint-config-prettier'; +import sortImports from '@j4cobi/eslint-plugin-sort-imports'; +import ts from 'typescript-eslint'; export default [ - js.configs.recommended, + ...ts.configs.recommended, + prettier, { - ignores: ['docs/**', 'tests/**', 'node_modules/*'], - plugins: { jsdoc: jsdoc }, + ignores: ['**/node_modules/', '**/build/', '**/pnpm-lock.yaml'], languageOptions: { - ecmaVersion: 2021, - sourceType: 'commonjs', + ecmaVersion: 2022, + sourceType: 'module', globals: { - ...globals.commonjs, - ...globals.es2021, + ...globals.es2022, ...globals.node } }, + plugins: { 'sort-imports': sortImports }, rules: { + 'sort-imports/sort-imports': [ + 'error', + { ignoreCase: false, ignoreMemberSort: false, memberSyntaxSortOrder: ['all', 'single', 'multiple', 'none'] } + ], 'max-len': ['error', { code: 120, ignoreUrls: true, ignoreComments: true }], + '@typescript-eslint/no-unused-vars': ['error', { args: 'none' }], 'no-constant-condition': ['error', { checkLoops: false }], 'prefer-const': ['warn', { destructuring: 'all' }], - 'no-unused-vars': ['error', { args: 'none' }], curly: ['warn', 'multi-line', 'consistent'], + '@typescript-eslint/no-explicit-any': 'off', 'logical-assignment-operators': 'warn', 'no-template-curly-in-string': 'error', 'quote-props': ['error', 'as-needed'], - 'jsdoc/no-undefined-types': 'warn', 'comma-dangle': ['error', 'never'], 'no-useless-constructor': 'error', 'no-useless-assignment': 'error', 'no-inner-declarations': 'error', 'no-implicit-coercion': 'error', - 'jsdoc/require-jsdoc': 'error', 'no-use-before-define': 'warn', 'no-underscore-dangle': 'warn', 'no-unneeded-ternary': 'error', - 'jsdoc/check-values': 'error', 'default-param-last': 'error', 'one-var': ['warn', 'never'], 'no-inline-comments': 'warn', - 'jsdoc/valid-types': 'error', 'no-empty-function': 'error', 'no-useless-return': 'error', 'no-useless-rename': 'warn', diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 4708630ef..000000000 --- a/package-lock.json +++ /dev/null @@ -1,4815 +0,0 @@ -{ - "name": "hypixel-api-reborn", - "version": "11.3.7", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "hypixel-api-reborn", - "version": "11.3.7", - "license": "MIT", - "dependencies": { - "node-cache": "^5.1.2", - "node-fetch": "^3.3.2", - "prismarine-nbt": "^2.6.0", - "rss-parser": "^3.13.0", - "skyhelper-networth": "^1.26.0" - }, - "devDependencies": { - "@discordjs/docgen": "github:discordjs/docgen", - "@types/node": "^22.10.1", - "chai": "^4.3.4", - "eslint": "^9.16.0", - "eslint-plugin-jsdoc": "^50.6.0", - "globals": "^15.13.0", - "mocha": "^10.4.0", - "node-env-run": "^4.0.2", - "path": "^0.12.7", - "prettier": "^3.4.2", - "typescript": "^5.7.2" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.26.3" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@discordjs/docgen": { - "version": "0.11.1", - "resolved": "git+ssh://git@github.com/discordjs/docgen.git#a06a15db5f57a9dde2af50b78480ec59237030a7", - "dev": true, - "dependencies": { - "eslint": "^6.3.0", - "js-yaml": "^3.13.1", - "jsdoc-to-markdown": "^5.0.1", - "tsubaki": "^1.3.2", - "yargs": "^14.0.0" - }, - "bin": { - "docgen": "src/index.js" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@discordjs/docgen/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/@discordjs/docgen/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@discordjs/docgen/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@discordjs/docgen/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@discordjs/docgen/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@discordjs/docgen/node_modules/cross-spawn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/@discordjs/docgen/node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@discordjs/docgen/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@discordjs/docgen/node_modules/eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@discordjs/docgen/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@discordjs/docgen/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@discordjs/docgen/node_modules/espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@discordjs/docgen/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@discordjs/docgen/node_modules/file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "dependencies": { - "flat-cache": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@discordjs/docgen/node_modules/flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "dependencies": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@discordjs/docgen/node_modules/flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "node_modules/@discordjs/docgen/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@discordjs/docgen/node_modules/globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "dependencies": { - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@discordjs/docgen/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@discordjs/docgen/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@discordjs/docgen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@discordjs/docgen/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/@discordjs/docgen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@discordjs/docgen/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@discordjs/docgen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@discordjs/docgen/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@discordjs/docgen/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@discordjs/docgen/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@discordjs/docgen/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@discordjs/docgen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@discordjs/docgen/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@discordjs/docgen/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/@es-joy/jsdoccomment": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.49.0.tgz", - "integrity": "sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==", - "dev": true, - "dependencies": { - "comment-parser": "1.4.1", - "esquery": "^1.6.0", - "jsdoc-type-pratt-parser": "~4.1.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", - "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", - "dev": true, - "dependencies": { - "@eslint/object-schema": "^2.1.5", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz", - "integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", - "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/js": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.16.0.tgz", - "integrity": "sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", - "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz", - "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==", - "dev": true, - "dependencies": { - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "dev": true, - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", - "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", - "dev": true, - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/@types/common-tags": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/@types/common-tags/-/common-tags-1.8.4.tgz", - "integrity": "sha512-S+1hLDJPjWNDhcGxsxEbepzaxWqURP/o+3cP4aa2w7yBXgdcmKGQtZzP8JbyfOd0m+33nh+8+kvxYE2UJtBDkg==", - "dev": true - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dev": true, - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", - "dev": true - }, - "node_modules/@types/markdown-it": { - "version": "12.2.3", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", - "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", - "dev": true, - "dependencies": { - "@types/linkify-it": "*", - "@types/mdurl": "*" - } - }, - "node_modules/@types/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", - "dev": true - }, - "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", - "dev": true - }, - "node_modules/@types/node": { - "version": "22.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz", - "integrity": "sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==", - "dev": true, - "dependencies": { - "undici-types": "~6.20.0" - } - }, - "node_modules/@types/yargs": { - "version": "15.0.19", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", - "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escape-sequences": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.1.0.tgz", - "integrity": "sha512-dzW9kHxH011uBsidTXd14JXgzye/YLb2LzeKZ4bsgl/Knwx8AtbSFkkGxagdNOoh0DlqHCmfiEjWKBaqjOanVw==", - "dev": true, - "dependencies": { - "array-back": "^3.0.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/ansi-escape-sequences/node_modules/array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/are-docs-informative": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", - "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/axios": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/cache-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cache-point/-/cache-point-1.0.0.tgz", - "integrity": "sha512-ZqrZp9Hi5Uq7vfSGmNP2bUT/9DzZC2Y/GXjHB8rUJN1a+KLmbV05+vxHipNsg8+CSVgjcVVzLV8VZms6w8ZeRw==", - "dev": true, - "dependencies": { - "array-back": "^4.0.0", - "fs-then-native": "^2.0.0", - "mkdirp2": "^1.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/catharsis": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", - "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", - "dev": true, - "dependencies": { - "lodash": "^4.17.15" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/chai": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", - "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/collect-all": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/collect-all/-/collect-all-1.0.4.tgz", - "integrity": "sha512-RKZhRwJtJEP5FWul+gkSMEnaK6H3AGPTTWOiRimCcs+rc/OmQE3Yhy1Q7A7KsdkG3ZXVdZq68Y6ONSdvkeEcKA==", - "dev": true, - "dependencies": { - "stream-connect": "^1.0.2", - "stream-via": "^1.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/command-line-args": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", - "dev": true, - "dependencies": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/command-line-args/node_modules/array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/command-line-args/node_modules/typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/command-line-tool": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/command-line-tool/-/command-line-tool-0.8.0.tgz", - "integrity": "sha512-Xw18HVx/QzQV3Sc5k1vy3kgtOeGmsKIqwtFFoyjI4bbcpSgnw2CWVULvtakyw4s6fhyAdI6soQQhXc2OzJy62g==", - "dev": true, - "dependencies": { - "ansi-escape-sequences": "^4.0.0", - "array-back": "^2.0.0", - "command-line-args": "^5.0.0", - "command-line-usage": "^4.1.0", - "typical": "^2.6.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/command-line-tool/node_modules/array-back": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", - "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", - "dev": true, - "dependencies": { - "typical": "^2.6.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz", - "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==", - "dev": true, - "dependencies": { - "ansi-escape-sequences": "^4.0.0", - "array-back": "^2.0.0", - "table-layout": "^0.4.2", - "typical": "^2.6.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/command-line-usage/node_modules/array-back": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", - "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", - "dev": true, - "dependencies": { - "typical": "^2.6.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/comment-parser": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", - "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", - "dev": true, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/common-sequence": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/common-sequence/-/common-sequence-2.0.2.tgz", - "integrity": "sha512-jAg09gkdkrDO9EWTdXfv80WWH3yeZl5oT69fGfedBNS9pXUKYInVJ1bJ+/ht2+Moeei48TmSbQDYMc8EOx9G0g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/config-master": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/config-master/-/config-master-3.1.0.tgz", - "integrity": "sha512-n7LBL1zBzYdTpF1mx5DNcZnZn05CWIdsdvtPL4MosvqbBUK3Rq6VWEtGUuF3Y0s9/CIhMejezqlSkP6TnCJ/9g==", - "dev": true, - "dependencies": { - "walk-back": "^2.0.1" - } - }, - "node_modules/config-master/node_modules/walk-back": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-2.0.1.tgz", - "integrity": "sha512-Nb6GvBR8UWX1D+Le+xUq0+Q1kFmRBIWVrfLnQAOmcpEzA9oAxwJ9gIr36t9TWYfzvWRvuMtjHiVsJYEkXWaTAQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-eql": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", - "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dmd": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/dmd/-/dmd-4.0.6.tgz", - "integrity": "sha512-7ZYAnFQ6jGm4SICArwqNPylJ83PaOdPTAkds3Z/s1ueFqSc5ilJ2F0b7uP+35W1PUbemH++gn5/VlC3KwEgiHQ==", - "dev": true, - "dependencies": { - "array-back": "^4.0.1", - "cache-point": "^1.0.0", - "common-sequence": "^2.0.0", - "file-set": "^3.0.0", - "handlebars": "^4.5.3", - "marked": "^0.7.0", - "object-get": "^2.1.0", - "reduce-flatten": "^3.0.0", - "reduce-unique": "^2.0.1", - "reduce-without": "^1.0.1", - "test-value": "^3.0.0", - "walk-back": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.16.0.tgz", - "integrity": "sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.9.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.16.0", - "@eslint/plugin-kit": "^0.2.3", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.5", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-jsdoc": { - "version": "50.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.6.0.tgz", - "integrity": "sha512-tCNp4fR79Le3dYTPB0dKEv7yFyvGkUCa+Z3yuTrrNGGOxBlXo9Pn0PEgroOZikUQOGjxoGMVKNjrOHcYEdfszg==", - "dev": true, - "dependencies": { - "@es-joy/jsdoccomment": "~0.49.0", - "are-docs-informative": "^0.0.2", - "comment-parser": "1.4.1", - "debug": "^4.3.6", - "escape-string-regexp": "^4.0.0", - "espree": "^10.1.0", - "esquery": "^1.6.0", - "parse-imports": "^2.1.1", - "semver": "^7.6.3", - "spdx-expression-parse": "^4.0.0", - "synckit": "^0.9.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", - "dev": true, - "dependencies": { - "acorn": "^8.14.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/file-set": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/file-set/-/file-set-3.0.0.tgz", - "integrity": "sha512-B/SdeSIeRv7VlOgIjtH3dkxMI+tEy5m+OeCXfAUsirBoVoY+bGtsmvmmTFPm/G23TBY4RiTtjpcgePCfwXRjqA==", - "dev": true, - "dependencies": { - "array-back": "^4.0.0", - "glob": "^7.1.5" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "dev": true, - "dependencies": { - "array-back": "^3.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/find-replace/node_modules/array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/fs-then-native": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fs-then-native/-/fs-then-native-2.0.0.tgz", - "integrity": "sha512-X712jAOaWXkemQCAmWeg5rOT2i+KOpWz1Z/txk/cW0qlOu2oQ9H61vc5w3X/iyuUEfq/OyaFJ78/cZAQD1/bgA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "15.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.13.0.tgz", - "integrity": "sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/inquirer/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/inquirer/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/js2xmlparser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", - "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", - "dev": true, - "dependencies": { - "xmlcreate": "^2.0.4" - } - }, - "node_modules/jsdoc": { - "version": "3.6.11", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.11.tgz", - "integrity": "sha512-8UCU0TYeIYD9KeLzEcAu2q8N/mx9O3phAGl32nmHlE0LpaJL71mMkP4d+QE5zWfNt50qheHtOZ0qoxVrsX5TUg==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.9.4", - "@types/markdown-it": "^12.2.3", - "bluebird": "^3.7.2", - "catharsis": "^0.9.0", - "escape-string-regexp": "^2.0.0", - "js2xmlparser": "^4.0.2", - "klaw": "^3.0.0", - "markdown-it": "^12.3.2", - "markdown-it-anchor": "^8.4.1", - "marked": "^4.0.10", - "mkdirp": "^1.0.4", - "requizzle": "^0.2.3", - "strip-json-comments": "^3.1.0", - "taffydb": "2.6.2", - "underscore": "~1.13.2" - }, - "bin": { - "jsdoc": "jsdoc.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/jsdoc-api": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/jsdoc-api/-/jsdoc-api-5.0.4.tgz", - "integrity": "sha512-1KMwLnfo0FyhF06TQKzqIm8BiY1yoMIGICxRdJHUjzskaHMzHMmpLlmNFgzoa4pAC8t1CDPK5jWuQTvv1pBsEQ==", - "dev": true, - "dependencies": { - "array-back": "^4.0.0", - "cache-point": "^1.0.0", - "collect-all": "^1.0.3", - "file-set": "^2.0.1", - "fs-then-native": "^2.0.0", - "jsdoc": "^3.6.3", - "object-to-spawn-args": "^1.1.1", - "temp-path": "^1.0.0", - "walk-back": "^3.0.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/jsdoc-api/node_modules/file-set": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/file-set/-/file-set-2.0.1.tgz", - "integrity": "sha512-XgOUUpgR6FbbfYcniLw0qm1Am7PnNYIAkd+eXxRt42LiYhjaso0WiuQ+VmrNdtwotyM+cLCfZ56AZrySP3QnKA==", - "dev": true, - "dependencies": { - "array-back": "^2.0.0", - "glob": "^7.1.3" - } - }, - "node_modules/jsdoc-api/node_modules/file-set/node_modules/array-back": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", - "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", - "dev": true, - "dependencies": { - "typical": "^2.6.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/jsdoc-api/node_modules/walk-back": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-3.0.1.tgz", - "integrity": "sha512-umiNB2qLO731Sxbp6cfZ9pwURJzTnftxE4Gc7hq8n/ehkuXC//s9F65IEIJA2ZytQZ1ZOsm/Fju4IWx0bivkUQ==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/jsdoc-parse": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsdoc-parse/-/jsdoc-parse-4.0.1.tgz", - "integrity": "sha512-qIObw8yqYZjrP2qxWROB5eLQFLTUX2jRGLhW9hjo2CC2fQVlskidCIzjCoctwsDvauBp2a/lR31jkSleczSo8Q==", - "dev": true, - "dependencies": { - "array-back": "^4.0.0", - "lodash.omit": "^4.5.0", - "lodash.pick": "^4.4.0", - "reduce-extract": "^1.0.0", - "sort-array": "^2.0.0", - "test-value": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jsdoc-to-markdown": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/jsdoc-to-markdown/-/jsdoc-to-markdown-5.0.3.tgz", - "integrity": "sha512-tQv5tBV0fTYidRQtE60lJKxE98mmuLcYuITFDKQiDPE9hGccpeEGUNFcVkInq1vigyuPnZmt79bQ8wv2GKjY0Q==", - "dev": true, - "dependencies": { - "array-back": "^4.0.1", - "command-line-tool": "^0.8.0", - "config-master": "^3.1.0", - "dmd": "^4.0.5", - "jsdoc-api": "^5.0.4", - "jsdoc-parse": "^4.0.1", - "walk-back": "^4.0.0" - }, - "bin": { - "jsdoc2md": "bin/cli.js" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/jsdoc-type-pratt-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", - "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", - "dev": true, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/jsdoc/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jsdoc/node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/klaw": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", - "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.9" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", - "dev": true, - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.omit": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", - "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==", - "dev": true - }, - "node_modules/lodash.padend": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", - "integrity": "sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw==", - "dev": true - }, - "node_modules/lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", - "dev": true - }, - "node_modules/lodash.reduce": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it-anchor": { - "version": "8.6.7", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", - "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", - "dev": true, - "peerDependencies": { - "@types/markdown-it": "*", - "markdown-it": "*" - } - }, - "node_modules/markdown-it/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/marked": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz", - "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==", - "dev": true, - "bin": { - "marked": "bin/marked" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", - "dev": true - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mkdirp2": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/mkdirp2/-/mkdirp2-1.0.5.tgz", - "integrity": "sha512-xOE9xbICroUDmG1ye2h4bZ8WBie9EGmACaco8K8cx6RlkJJrxGIqjGqztAI+NMhexXBcdGbSEzI6N3EJPevxZw==", - "dev": true - }, - "node_modules/mocha": { - "version": "10.8.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", - "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.3", - "browser-stdout": "^1.3.1", - "chokidar": "^3.5.3", - "debug": "^4.3.5", - "diff": "^5.2.0", - "escape-string-regexp": "^4.0.0", - "find-up": "^5.0.0", - "glob": "^8.1.0", - "he": "^1.2.0", - "js-yaml": "^4.1.0", - "log-symbols": "^4.1.0", - "minimatch": "^5.1.6", - "ms": "^2.1.3", - "serialize-javascript": "^6.0.2", - "strip-json-comments": "^3.1.1", - "supports-color": "^8.1.1", - "workerpool": "^6.5.1", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9", - "yargs-unparser": "^2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/mocha/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/mocha/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/mocha/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/mocha/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mocha/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/mocha/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/mocha/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/node-cache": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz", - "integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==", - "dependencies": { - "clone": "2.x" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-env-run": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/node-env-run/-/node-env-run-4.0.2.tgz", - "integrity": "sha512-qAGmXrM32xUGdaCBmkQG8RIgm+8Oj22rURkAoX9HuKDQiM0Vm66QebkWEnU5nozYgPbO/PFPrPmerI6ZEPp8UQ==", - "dev": true, - "dependencies": { - "@types/common-tags": "^1.4.0", - "@types/debug": "^4.1.5", - "@types/node": "^10.17.28", - "@types/yargs": "^15.0.5", - "common-tags": "^1.7.2", - "cross-spawn": "^7.0.3", - "debug": "^4.1.1", - "dotenv": "^8.2.0", - "pkginfo": "^0.4.1", - "upath": "^1.2.0", - "yargs": "^15.4.1" - }, - "bin": { - "node-env-run": "dist/bin/node-env-run.js", - "nodenv": "dist/bin/node-env-run.js" - } - }, - "node_modules/node-env-run/node_modules/@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", - "dev": true - }, - "node_modules/node-env-run/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-env-run/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/node-env-run/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/node-env-run/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/node-env-run/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-env-run/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-env-run/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-env-run/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/node-env-run/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-env-run/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-env-run/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-env-run/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-env-run/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-env-run/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-get": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-get/-/object-get-2.1.1.tgz", - "integrity": "sha512-7n4IpLMzGGcLEMiQKsNR7vCe+N5E9LORFrtNUVy4sO3dj9a3HedZCxEL2T7QuLhcHN1NBuBsMOKaOsAYI9IIvg==", - "dev": true - }, - "node_modules/object-to-spawn-args": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-to-spawn-args/-/object-to-spawn-args-1.1.1.tgz", - "integrity": "sha512-d6xH8b+QdNj+cdndsL3rVCzwW9PqSSXQBDVj0d8fyaCqMimUEz+sW+Jtxp77bxaSs7C5w7XOH844FG7p2A0cFw==", - "dev": true - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-imports": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.2.1.tgz", - "integrity": "sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==", - "dev": true, - "dependencies": { - "es-module-lexer": "^1.5.3", - "slashes": "^3.0.12" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", - "dev": true, - "dependencies": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkginfo": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", - "integrity": "sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", - "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prismarine-nbt": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/prismarine-nbt/-/prismarine-nbt-2.6.0.tgz", - "integrity": "sha512-z65ijm6hVlYOmhg8IEzdYfUz1u3AOiQtzyTSAwD8NLBCr96ZUPtUH5o/6sGAoDaN+rkDe0DNBCiO7bvXXO1fkQ==", - "dependencies": { - "protodef": "^1.9.0" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/protodef": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/protodef/-/protodef-1.17.0.tgz", - "integrity": "sha512-mnpNPV3xwu63u3NwZuXM1RCp979vjHxUGHzVrb6dxbvof5Fx+b8Rs0G0c3xtEuFDreGAMWS7VrlNkDUDBMsFWQ==", - "dependencies": { - "lodash.get": "^4.4.2", - "lodash.reduce": "^4.6.0", - "protodef-validator": "^1.3.0", - "readable-stream": "^4.4.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/protodef-validator": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/protodef-validator/-/protodef-validator-1.3.1.tgz", - "integrity": "sha512-lZ5FWKZYR9xOjpMw1+EfZRfCjzNRQWPq+Dk+jki47Sikl2EeWEPnTfnJERwnU/EwFq6us+0zqHHzSsmLeYX+Lg==", - "dependencies": { - "ajv": "^6.5.4" - }, - "bin": { - "protodef-validator": "cli.js" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/reduce-extract": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/reduce-extract/-/reduce-extract-1.0.0.tgz", - "integrity": "sha512-QF8vjWx3wnRSL5uFMyCjDeDc5EBMiryoT9tz94VvgjKfzecHAVnqmXAwQDcr7X4JmLc2cjkjFGCVzhMqDjgR9g==", - "dev": true, - "dependencies": { - "test-value": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/reduce-extract/node_modules/array-back": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", - "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==", - "dev": true, - "dependencies": { - "typical": "^2.6.0" - }, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/reduce-extract/node_modules/test-value": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/test-value/-/test-value-1.1.0.tgz", - "integrity": "sha512-wrsbRo7qP+2Je8x8DsK8ovCGyxe3sYfQwOraIY/09A2gFXU9DYKiTF14W4ki/01AEh56kMzAmlj9CaHGDDUBJA==", - "dev": true, - "dependencies": { - "array-back": "^1.0.2", - "typical": "^2.4.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/reduce-flatten": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-3.0.1.tgz", - "integrity": "sha512-bYo+97BmUUOzg09XwfkwALt4PQH1M5L0wzKerBt6WLm3Fhdd43mMS89HiT1B9pJIqko/6lWx3OnV4J9f2Kqp5Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/reduce-unique": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/reduce-unique/-/reduce-unique-2.0.1.tgz", - "integrity": "sha512-x4jH/8L1eyZGR785WY+ePtyMNhycl1N2XOLxhCbzZFaqF4AXjLzqSxa2UHgJ2ZVR/HHyPOvl1L7xRnW8ye5MdA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/reduce-without": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/reduce-without/-/reduce-without-1.0.1.tgz", - "integrity": "sha512-zQv5y/cf85sxvdrKPlfcRzlDn/OqKFThNimYmsS3flmkioKvkUGn2Qg9cJVoQiEvdxFGLE0MQER/9fZ9sUqdxg==", - "dev": true, - "dependencies": { - "test-value": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/reduce-without/node_modules/array-back": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", - "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==", - "dev": true, - "dependencies": { - "typical": "^2.6.0" - }, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/reduce-without/node_modules/test-value": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz", - "integrity": "sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w==", - "dev": true, - "dependencies": { - "array-back": "^1.0.3", - "typical": "^2.6.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true, - "engines": { - "node": ">=6.5.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/requizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", - "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", - "dev": true, - "dependencies": { - "lodash": "^4.17.21" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/rss-parser": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.13.0.tgz", - "integrity": "sha512-7jWUBV5yGN3rqMMj7CZufl/291QAhvrrGpDNE4k/02ZchL0npisiYYqULF71jCEKoIiHvK/Q2e6IkDwPziT7+w==", - "dependencies": { - "entities": "^2.0.3", - "xml2js": "^0.5.0" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" - }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/skyhelper-networth": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/skyhelper-networth/-/skyhelper-networth-1.26.0.tgz", - "integrity": "sha512-QkBfMKt+tref6D3T+zmKzWwjJ135QEigXN/VpEmlD0FK0mJPSxuBxvnDYe3F9r3UyWpXVP7w6tge4s9tA8Hc1Q==", - "dependencies": { - "axios": "^1.6.2", - "prismarine-nbt": "^2.2.1" - }, - "funding": { - "type": "patreon", - "url": "https://patreon.com/skyhelper" - } - }, - "node_modules/slashes": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz", - "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==", - "dev": true - }, - "node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/sort-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-array/-/sort-array-2.0.0.tgz", - "integrity": "sha512-nZI3lq+nPRImxYqQY5iwpOPVLdDEMr2k6rCOAz5hRcpyYFsrR+2m5Kw0tZaTt452nx/9wZrKaMEMrX03I7ChqQ==", - "dev": true, - "dependencies": { - "array-back": "^1.0.4", - "object-get": "^2.1.0", - "typical": "^2.6.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sort-array/node_modules/array-back": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", - "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==", - "dev": true, - "dependencies": { - "typical": "^2.6.0" - }, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", - "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", - "dev": true - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/stream-connect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-connect/-/stream-connect-1.0.2.tgz", - "integrity": "sha512-68Kl+79cE0RGKemKkhxTSg8+6AGrqBt+cbZAXevg2iJ6Y3zX4JhA/sZeGzLpxW9cXhmqAcE7KnJCisUmIUfnFQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "array-back": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stream-connect/node_modules/array-back": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", - "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==", - "dev": true, - "dependencies": { - "typical": "^2.6.0" - }, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/stream-via": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/stream-via/-/stream-via-1.0.4.tgz", - "integrity": "sha512-DBp0lSvX5G9KGRDTkR/R+a29H+Wk2xItOF+MpZLLNDWbEV9tGPnqLPxHEYjmiz8xGtJHRIqmI+hCjmNzqoA4nQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/synckit": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", - "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", - "dev": true, - "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "dependencies": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/table-layout": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.5.tgz", - "integrity": "sha512-zTvf0mcggrGeTe/2jJ6ECkJHAQPIYEwDoqsiqBjI24mvRmQbInK5jq33fyypaCBxX08hMkfmdOqj6haT33EqWw==", - "dev": true, - "dependencies": { - "array-back": "^2.0.0", - "deep-extend": "~0.6.0", - "lodash.padend": "^4.6.1", - "typical": "^2.6.1", - "wordwrapjs": "^3.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/table-layout/node_modules/array-back": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", - "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", - "dev": true, - "dependencies": { - "typical": "^2.6.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/taffydb": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", - "integrity": "sha512-y3JaeRSplks6NYQuCOj3ZFMO3j60rTwbuKCvZxsAraGYH2epusatvZ0baZYA01WsGqJBq/Dl6vOrMUJqyMj8kA==", - "dev": true - }, - "node_modules/temp-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-path/-/temp-path-1.0.0.tgz", - "integrity": "sha512-TvmyH7kC6ZVTYkqCODjJIbgvu0FKiwQpZ4D1aknE7xpcDf/qEOB8KZEK5ef2pfbVoiBhNWs3yx4y+ESMtNYmlg==", - "dev": true - }, - "node_modules/test-value": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz", - "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==", - "dev": true, - "dependencies": { - "array-back": "^2.0.0", - "typical": "^2.6.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/test-value/node_modules/array-back": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", - "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", - "dev": true, - "dependencies": { - "typical": "^2.6.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true - }, - "node_modules/tsubaki": { - "version": "1.3.14", - "resolved": "https://registry.npmjs.org/tsubaki/-/tsubaki-1.3.14.tgz", - "integrity": "sha512-FnrXnBkTVtfSGWWL74X1lON1DMKwQ0Q6lBVhliHSQLAF2fT9PEH/r+yvT9A1sQUbJ90I/klurOgp3fUkr+uphw==", - "dev": true, - "engines": { - "node": ">=6.0.0", - "npm": ">=6.0.0" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", - "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typical": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", - "integrity": "sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==", - "dev": true - }, - "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true - }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/underscore": { - "version": "1.13.7", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", - "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==", - "dev": true - }, - "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", - "dev": true - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dev": true, - "dependencies": { - "inherits": "2.0.3" - } - }, - "node_modules/util/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "node_modules/v8-compile-cache": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", - "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", - "dev": true - }, - "node_modules/walk-back": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-4.0.0.tgz", - "integrity": "sha512-kudCA8PXVQfrqv2mFTG72vDBRi8BKWxGgFLwPpzHcpZnSwZk93WMwUDVcLHWNsnm+Y0AC4Vb6MUNRgaHfyV2DQ==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "node_modules/wordwrapjs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz", - "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==", - "dev": true, - "dependencies": { - "reduce-flatten": "^1.0.1", - "typical": "^2.6.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/wordwrapjs/node_modules/reduce-flatten": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz", - "integrity": "sha512-j5WfFJfc9CoXv/WbwVLHq74i/hdTUpy+iNC534LxczMRP67vJeK3V9JOdnL0N1cIRbn9mYhE2yVjvvKXDxvNXQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/workerpool": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", - "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "dependencies": { - "mkdirp": "^0.5.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/write/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/xml2js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xmlcreate": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", - "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", - "dev": true - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/yargs": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", - "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^15.0.1" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser/node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.3.tgz", - "integrity": "sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/package.json b/package.json index 8e3be0f1b..25891beff 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,10 @@ { "name": "hypixel-api-reborn", - "version": "11.3.7", + "version": "12.0.0-6", "description": "Feature-rich Hypixel API wrapper for Node.js", - "main": "./src/index.js", - "types": "./typings/index.d.ts", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "module": "dist/index.js", "keywords": [ "minecraft", "client", @@ -16,41 +17,58 @@ "url": "https://github.com/Hypixel-API-Reborn/hypixel-api-reborn/issues" }, "scripts": { - "lint": "npx eslint src/", - "lint:fix": "npx eslint src/ --fix", - "tests": "npx mocha tests --exit --recursive", - "docgen": " npx docgen -s src/ --custom docs/index.yml -o ./master.json", - "prettier": "npx prettier --write src/ typings/", - "prettier:check": "npx prettier --check src/ typings/" + "lint:check": "npx eslint src/", + "lint": "npx eslint src/ --fix", + "prettier:check": "npx prettier --check .", + "prettier": "npx prettier --write .", + "build": "npx tsc && cp -r ./src/Types dist/", + "test": "npx vitest run", + "test:coverage": "npx vitest run --coverage", + "test:ui": "npx vitest --ui --coverage", + "docgen": "npx typedoc" }, "engines": { - "node": ">=18.18.0" + "node": ">=20.16.0" }, - "author": "StavZ", + "type": "module", + "packageManager": "pnpm@9.7.1", + "author": "Kathund", "dependencies": { + "farming-weight": "^0.7.1", "node-cache": "^5.1.2", - "node-fetch": "^3.3.2", "prismarine-nbt": "^2.6.0", "rss-parser": "^3.13.0", "skyhelper-networth": "^1.26.0" }, "license": "MIT", - "readme": "https://hypixel.stavzdev.me/", + "readme": "https://github.com/Hypixel-API-Reborn/hypixel-api-reborn?tab=readme-ov-file#hypixel-api--reborn", "repository": { - "url": "https://github.com/Hypixel-API-Reborn/hypixel-api-reborn" + "url": "git+https://github.com/Hypixel-API-Reborn/hypixel-api-reborn.git" }, - "publisher": "StavZ", + "files": [ + "dist/**/*" + ], + "publisher": "Kathund", "devDependencies": { - "@discordjs/docgen": "github:discordjs/docgen", + "@8hobbies/typedoc-plugin-404": "^3.1.0", + "@eslint/js": "^9.16.0", + "@j4cobi/eslint-plugin-sort-imports": "^1.0.2", + "@types/eslint": "^9.6.1", "@types/node": "^22.10.1", - "chai": "^4.3.4", + "@types/xml2js": "^0.4.14", + "@vitest/coverage-v8": "^2.1.8", + "@vitest/ui": "^2.1.8", + "dotenv": "^16.4.7", "eslint": "^9.16.0", - "eslint-plugin-jsdoc": "^50.6.0", + "eslint-config-prettier": "^9.1.0", "globals": "^15.13.0", - "mocha": "^10.4.0", - "node-env-run": "^4.0.2", - "path": "^0.12.7", "prettier": "^3.4.2", - "typescript": "^5.7.2" + "typedoc": "^0.27.3", + "typedoc-material-theme": "^1.2.0", + "typedoc-plugin-rename-defaults": "^0.7.2", + "typescript": "^5.7.2", + "typescript-eslint": "^8.17.0", + "vitest": "^2.1.8", + "xml2js": "^0.6.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 000000000..1abfa5cb4 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,2758 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + farming-weight: + specifier: ^0.7.1 + version: 0.7.1 + node-cache: + specifier: ^5.1.2 + version: 5.1.2 + prismarine-nbt: + specifier: ^2.6.0 + version: 2.6.0 + rss-parser: + specifier: ^3.13.0 + version: 3.13.0 + skyhelper-networth: + specifier: ^1.26.0 + version: 1.26.0 + devDependencies: + '@8hobbies/typedoc-plugin-404': + specifier: ^3.1.0 + version: 3.1.0(typedoc@0.27.3(typescript@5.7.2)) + '@eslint/js': + specifier: ^9.16.0 + version: 9.16.0 + '@j4cobi/eslint-plugin-sort-imports': + specifier: ^1.0.2 + version: 1.0.2(eslint@9.16.0)(typescript@5.7.2) + '@types/eslint': + specifier: ^9.6.1 + version: 9.6.1 + '@types/node': + specifier: ^22.10.1 + version: 22.10.1 + '@types/xml2js': + specifier: ^0.4.14 + version: 0.4.14 + '@vitest/coverage-v8': + specifier: ^2.1.8 + version: 2.1.8(vitest@2.1.8(@types/node@22.10.1)(@vitest/ui@2.1.8)) + '@vitest/ui': + specifier: ^2.1.8 + version: 2.1.8(vitest@2.1.8) + dotenv: + specifier: ^16.4.7 + version: 16.4.7 + eslint: + specifier: ^9.16.0 + version: 9.16.0 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@9.16.0) + globals: + specifier: ^15.13.0 + version: 15.13.0 + prettier: + specifier: ^3.4.2 + version: 3.4.2 + typedoc: + specifier: ^0.27.3 + version: 0.27.3(typescript@5.7.2) + typedoc-material-theme: + specifier: ^1.2.0 + version: 1.2.0(typedoc@0.27.3(typescript@5.7.2)) + typedoc-plugin-rename-defaults: + specifier: ^0.7.2 + version: 0.7.2(typedoc@0.27.3(typescript@5.7.2)) + typescript: + specifier: ^5.7.2 + version: 5.7.2 + typescript-eslint: + specifier: ^8.17.0 + version: 8.17.0(eslint@9.16.0)(typescript@5.7.2) + vitest: + specifier: ^2.1.8 + version: 2.1.8(@types/node@22.10.1)(@vitest/ui@2.1.8) + xml2js: + specifier: ^0.6.2 + version: 0.6.2 + +packages: + + '@8hobbies/typedoc-plugin-404@3.1.0': + resolution: {integrity: sha512-37XsNnSyoeLOTLnlMz9MF9v2DUjaS3V6k1qcI9EHZRnxO68qA3gzdtEIpvQRU+LFDcVhO6hF/bxttku9zJHiUg==} + engines: {node: ^18 || ^20 || ^22 || >= 23} + peerDependencies: + typedoc: ^0.26.11 || ^0.27.2 + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.1': + resolution: {integrity: sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.26.0': + resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.19.0': + resolution: {integrity: sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.9.0': + resolution: {integrity: sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.2.0': + resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.16.0': + resolution: {integrity: sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.4': + resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.3': + resolution: {integrity: sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@gerrit0/mini-shiki@1.24.0': + resolution: {integrity: sha512-eopM3SyeUZQZSBu1VCV8/d1LtJXDd0aMpLjyWpGkjD6ux3sNwoLNeuEb5xmiWVfQvFeMUXa1WTjh06lqm3KETA==} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.1': + resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + engines: {node: '>=18.18'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@j4cobi/eslint-plugin-sort-imports@1.0.2': + resolution: {integrity: sha512-0bTHYIohk2RnWW8+FQoE06s/80aF1iPxP62JiS2+9chUFrs9D7+p0niFtNctcZGRPo5aOKG9q/ypPlT8OWcwyg==} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@material/material-color-utilities@0.3.0': + resolution: {integrity: sha512-ztmtTd6xwnuh2/xu+Vb01btgV8SQWYCaK56CkRK8gEkWe5TuDyBcYJ0wgkMRn+2VcE9KUmhvkz+N9GHrqw/C0g==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@polka/url@1.0.0-next.25': + resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} + + '@rollup/rollup-android-arm-eabi@4.20.0': + resolution: {integrity: sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.20.0': + resolution: {integrity: sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.20.0': + resolution: {integrity: sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.20.0': + resolution: {integrity: sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.20.0': + resolution: {integrity: sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.20.0': + resolution: {integrity: sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.20.0': + resolution: {integrity: sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.20.0': + resolution: {integrity: sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': + resolution: {integrity: sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.20.0': + resolution: {integrity: sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.20.0': + resolution: {integrity: sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.20.0': + resolution: {integrity: sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.20.0': + resolution: {integrity: sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.20.0': + resolution: {integrity: sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.20.0': + resolution: {integrity: sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.20.0': + resolution: {integrity: sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==} + cpu: [x64] + os: [win32] + + '@shikijs/engine-oniguruma@1.24.0': + resolution: {integrity: sha512-Eua0qNOL73Y82lGA4GF5P+G2+VXX9XnuUxkiUuwcxQPH4wom+tE39kZpBFXfUuwNYxHSkrSxpB1p4kyRW0moSg==} + + '@shikijs/types@1.24.0': + resolution: {integrity: sha512-aptbEuq1Pk88DMlCe+FzXNnBZ17LCiLIGWAeCWhoFDzia5Q5Krx3DgnULLiouSdd6+LUM39XwXGppqYE0Ghtug==} + + '@shikijs/vscode-textmate@9.3.0': + resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@22.10.1': + resolution: {integrity: sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/xml2js@0.4.14': + resolution: {integrity: sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==} + + '@typescript-eslint/eslint-plugin@8.17.0': + resolution: {integrity: sha512-HU1KAdW3Tt8zQkdvNoIijfWDMvdSweFYm4hWh+KwhPstv+sCmWb89hCIP8msFm9N1R/ooh9honpSuvqKWlYy3w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@8.17.0': + resolution: {integrity: sha512-Drp39TXuUlD49F7ilHHCG7TTg8IkA+hxCuULdmzWYICxGXvDXmDmWEjJYZQYgf6l/TFfYNE167m7isnc3xlIEg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@8.16.0': + resolution: {integrity: sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/scope-manager@8.17.0': + resolution: {integrity: sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.17.0': + resolution: {integrity: sha512-q38llWJYPd63rRnJ6wY/ZQqIzPrBCkPdpIsaCfkR3Q4t3p6sb422zougfad4TFW9+ElIFLVDzWGiGAfbb/v2qw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@8.16.0': + resolution: {integrity: sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/types@8.17.0': + resolution: {integrity: sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.16.0': + resolution: {integrity: sha512-E2+9IzzXMc1iaBy9zmo+UYvluE3TW7bCGWSF41hVWUE01o8nzr1rvOQYSxelxr6StUvRcTMe633eY8mXASMaNw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@8.17.0': + resolution: {integrity: sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@8.16.0': + resolution: {integrity: sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@8.17.0': + resolution: {integrity: sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/visitor-keys@8.16.0': + resolution: {integrity: sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/visitor-keys@8.17.0': + resolution: {integrity: sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vitest/coverage-v8@2.1.8': + resolution: {integrity: sha512-2Y7BPlKH18mAZYAW1tYByudlCYrQyl5RGvnnDYJKW5tCiO5qg3KSAy3XAxcxKz900a0ZXxWtKrMuZLe3lKBpJw==} + peerDependencies: + '@vitest/browser': 2.1.8 + vitest: 2.1.8 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/expect@2.1.8': + resolution: {integrity: sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==} + + '@vitest/mocker@2.1.8': + resolution: {integrity: sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@2.1.8': + resolution: {integrity: sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==} + + '@vitest/runner@2.1.8': + resolution: {integrity: sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==} + + '@vitest/snapshot@2.1.8': + resolution: {integrity: sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==} + + '@vitest/spy@2.1.8': + resolution: {integrity: sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==} + + '@vitest/ui@2.1.8': + resolution: {integrity: sha512-5zPJ1fs0ixSVSs5+5V2XJjXLmNzjugHRyV11RqxYVR+oMcogZ9qTuSfKW+OcTV0JeFNznI83BNylzH6SSNJ1+w==} + peerDependencies: + vitest: 2.1.8 + + '@vitest/utils@2.1.8': + resolution: {integrity: sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.7.7: + resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} + + chai@5.1.2: + resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} + engines: {node: '>=12'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.16.0: + resolution: {integrity: sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + expect-type@1.1.0: + resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + engines: {node: '>=12.0.0'} + + farming-weight@0.7.1: + resolution: {integrity: sha512-C7ANMZg9JmnGLpxh7O9oYHX0PTmQlQS/WKuPIuVCdeWRT87ulg1gvwfS16gh8FpFN+Hzk+k1kBgVy/H3C8W6aw==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fdir@6.4.2: + resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@15.13.0: + resolution: {integrity: sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==} + engines: {node: '>=18'} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.reduce@4.6.0: + resolution: {integrity: sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==} + + loupe@3.1.2: + resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + + magic-string@0.30.12: + resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} + + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mrmime@2.0.0: + resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-cache@5.1.2: + resolution: {integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==} + engines: {node: '>= 8.0.0'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + postcss@8.4.41: + resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@3.4.2: + resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + engines: {node: '>=14'} + hasBin: true + + prismarine-nbt@2.6.0: + resolution: {integrity: sha512-z65ijm6hVlYOmhg8IEzdYfUz1u3AOiQtzyTSAwD8NLBCr96ZUPtUH5o/6sGAoDaN+rkDe0DNBCiO7bvXXO1fkQ==} + + protodef-validator@1.3.1: + resolution: {integrity: sha512-lZ5FWKZYR9xOjpMw1+EfZRfCjzNRQWPq+Dk+jki47Sikl2EeWEPnTfnJERwnU/EwFq6us+0zqHHzSsmLeYX+Lg==} + hasBin: true + + protodef@1.15.0: + resolution: {integrity: sha512-bZ2Omw8dT+DACjJHLrBWZlqN4MlT9g9oSpJDdkUAJOStUzgJp+Zn42FJfPUdwutUxjaxA0PftN0PDlNa2XbneA==} + engines: {node: '>=14'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@4.20.0: + resolution: {integrity: sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rss-parser@3.13.0: + resolution: {integrity: sha512-7jWUBV5yGN3rqMMj7CZufl/291QAhvrrGpDNE4k/02ZchL0npisiYYqULF71jCEKoIiHvK/Q2e6IkDwPziT7+w==} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sirv@3.0.0: + resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} + engines: {node: '>=18'} + + skyhelper-networth@1.26.0: + resolution: {integrity: sha512-QkBfMKt+tref6D3T+zmKzWwjJ135QEigXN/VpEmlD0FK0mJPSxuBxvnDYe3F9r3UyWpXVP7w6tge4s9tA8Hc1Q==} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.8.0: + resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.1: + resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} + + tinyglobby@0.2.10: + resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + engines: {node: '>=12.0.0'} + + tinypool@1.0.1: + resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typedoc-material-theme@1.2.0: + resolution: {integrity: sha512-pZ07hqdxbyRtM+Tsu0s8BFLdANAyh2CWF0J2X07B9ldmvwbmVEfNdgpE0EYky/oFah9shv2o/KjElPtpnQi1+w==} + engines: {node: '>=18.0.0', npm: '>=8.6.0'} + peerDependencies: + typedoc: ^0.25.13 || ^0.26.x + + typedoc-plugin-rename-defaults@0.7.2: + resolution: {integrity: sha512-9oa1CsMN4p/xuVR2JW2YDD6xE7JcrIth3KAfjR8YBi6NnrDk2Q72o4lbArybLDjxKAkOzk7N1uUdGwJlooLEOg==} + peerDependencies: + typedoc: '>=0.22.x <0.28.x' + + typedoc@0.27.3: + resolution: {integrity: sha512-oWT7zDS5oIaxYL5yOikBX4cL99CpNAZn6mI24JZQxsYuIHbtguSSwJ7zThuzNNwSE0wqhlfTSd99HgqKu2aQXQ==} + engines: {node: '>= 18'} + hasBin: true + peerDependencies: + typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x + + typescript-eslint@8.17.0: + resolution: {integrity: sha512-409VXvFd/f1br1DCbuKNFqQpXICoTB+V51afcwG1pn1a3Cp92MqAUges3YjwEdQ0cMUoCIodjVDAYzyD8h3SYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + typescript@5.7.2: + resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vite-node@2.1.8: + resolution: {integrity: sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite@5.4.0: + resolution: {integrity: sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest@2.1.8: + resolution: {integrity: sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.8 + '@vitest/ui': 2.1.8 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + xml2js@0.5.0: + resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} + engines: {node: '>=4.0.0'} + + xml2js@0.6.2: + resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} + engines: {node: '>=4.0.0'} + + xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + + yaml@2.6.1: + resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} + engines: {node: '>= 14'} + hasBin: true + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@8hobbies/typedoc-plugin-404@3.1.0(typedoc@0.27.3(typescript@5.7.2))': + dependencies: + typedoc: 0.27.3(typescript@5.7.2) + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/parser@7.26.1': + dependencies: + '@babel/types': 7.26.0 + + '@babel/types@7.26.0': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@bcoe/v8-coverage@0.2.3': {} + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@9.16.0)': + dependencies: + eslint: 9.16.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/config-array@0.19.0': + dependencies: + '@eslint/object-schema': 2.1.4 + debug: 4.3.7 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/core@0.9.0': {} + + '@eslint/eslintrc@3.2.0': + dependencies: + ajv: 6.12.6 + debug: 4.3.7 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.16.0': {} + + '@eslint/object-schema@2.1.4': {} + + '@eslint/plugin-kit@0.2.3': + dependencies: + levn: 0.4.1 + + '@gerrit0/mini-shiki@1.24.0': + dependencies: + '@shikijs/engine-oniguruma': 1.24.0 + '@shikijs/types': 1.24.0 + '@shikijs/vscode-textmate': 9.3.0 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.1': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@j4cobi/eslint-plugin-sort-imports@1.0.2(eslint@9.16.0)(typescript@5.7.2)': + dependencies: + '@typescript-eslint/utils': 8.16.0(eslint@9.16.0)(typescript@5.7.2) + transitivePeerDependencies: + - eslint + - supports-color + - typescript + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@material/material-color-utilities@0.3.0': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@polka/url@1.0.0-next.25': {} + + '@rollup/rollup-android-arm-eabi@4.20.0': + optional: true + + '@rollup/rollup-android-arm64@4.20.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.20.0': + optional: true + + '@rollup/rollup-darwin-x64@4.20.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.20.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.20.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.20.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.20.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.20.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.20.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.20.0': + optional: true + + '@shikijs/engine-oniguruma@1.24.0': + dependencies: + '@shikijs/types': 1.24.0 + '@shikijs/vscode-textmate': 9.3.0 + + '@shikijs/types@1.24.0': + dependencies: + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@9.3.0': {} + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + + '@types/estree@1.0.5': {} + + '@types/estree@1.0.6': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/json-schema@7.0.15': {} + + '@types/node@22.10.1': + dependencies: + undici-types: 6.20.0 + + '@types/unist@3.0.3': {} + + '@types/xml2js@0.4.14': + dependencies: + '@types/node': 22.10.1 + + '@typescript-eslint/eslint-plugin@8.17.0(@typescript-eslint/parser@8.17.0(eslint@9.16.0)(typescript@5.7.2))(eslint@9.16.0)(typescript@5.7.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.17.0(eslint@9.16.0)(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.17.0 + '@typescript-eslint/type-utils': 8.17.0(eslint@9.16.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.17.0(eslint@9.16.0)(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.17.0 + eslint: 9.16.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.7.2) + optionalDependencies: + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.17.0(eslint@9.16.0)(typescript@5.7.2)': + dependencies: + '@typescript-eslint/scope-manager': 8.17.0 + '@typescript-eslint/types': 8.17.0 + '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.17.0 + debug: 4.3.7 + eslint: 9.16.0 + optionalDependencies: + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.16.0': + dependencies: + '@typescript-eslint/types': 8.16.0 + '@typescript-eslint/visitor-keys': 8.16.0 + + '@typescript-eslint/scope-manager@8.17.0': + dependencies: + '@typescript-eslint/types': 8.17.0 + '@typescript-eslint/visitor-keys': 8.17.0 + + '@typescript-eslint/type-utils@8.17.0(eslint@9.16.0)(typescript@5.7.2)': + dependencies: + '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.7.2) + '@typescript-eslint/utils': 8.17.0(eslint@9.16.0)(typescript@5.7.2) + debug: 4.3.7 + eslint: 9.16.0 + ts-api-utils: 1.3.0(typescript@5.7.2) + optionalDependencies: + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.16.0': {} + + '@typescript-eslint/types@8.17.0': {} + + '@typescript-eslint/typescript-estree@8.16.0(typescript@5.7.2)': + dependencies: + '@typescript-eslint/types': 8.16.0 + '@typescript-eslint/visitor-keys': 8.16.0 + debug: 4.3.7 + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.7.2) + optionalDependencies: + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@8.17.0(typescript@5.7.2)': + dependencies: + '@typescript-eslint/types': 8.17.0 + '@typescript-eslint/visitor-keys': 8.17.0 + debug: 4.3.7 + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.7.2) + optionalDependencies: + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.16.0(eslint@9.16.0)(typescript@5.7.2)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.16.0) + '@typescript-eslint/scope-manager': 8.16.0 + '@typescript-eslint/types': 8.16.0 + '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.7.2) + eslint: 9.16.0 + optionalDependencies: + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.17.0(eslint@9.16.0)(typescript@5.7.2)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.16.0) + '@typescript-eslint/scope-manager': 8.17.0 + '@typescript-eslint/types': 8.17.0 + '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.7.2) + eslint: 9.16.0 + optionalDependencies: + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.16.0': + dependencies: + '@typescript-eslint/types': 8.16.0 + eslint-visitor-keys: 4.2.0 + + '@typescript-eslint/visitor-keys@8.17.0': + dependencies: + '@typescript-eslint/types': 8.17.0 + eslint-visitor-keys: 4.2.0 + + '@vitest/coverage-v8@2.1.8(vitest@2.1.8(@types/node@22.10.1)(@vitest/ui@2.1.8))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.3.7 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + magic-string: 0.30.12 + magicast: 0.3.5 + std-env: 3.8.0 + test-exclude: 7.0.1 + tinyrainbow: 1.2.0 + vitest: 2.1.8(@types/node@22.10.1)(@vitest/ui@2.1.8) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@2.1.8': + dependencies: + '@vitest/spy': 2.1.8 + '@vitest/utils': 2.1.8 + chai: 5.1.2 + tinyrainbow: 1.2.0 + + '@vitest/mocker@2.1.8(vite@5.4.0(@types/node@22.10.1))': + dependencies: + '@vitest/spy': 2.1.8 + estree-walker: 3.0.3 + magic-string: 0.30.12 + optionalDependencies: + vite: 5.4.0(@types/node@22.10.1) + + '@vitest/pretty-format@2.1.8': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/runner@2.1.8': + dependencies: + '@vitest/utils': 2.1.8 + pathe: 1.1.2 + + '@vitest/snapshot@2.1.8': + dependencies: + '@vitest/pretty-format': 2.1.8 + magic-string: 0.30.12 + pathe: 1.1.2 + + '@vitest/spy@2.1.8': + dependencies: + tinyspy: 3.0.2 + + '@vitest/ui@2.1.8(vitest@2.1.8)': + dependencies: + '@vitest/utils': 2.1.8 + fflate: 0.8.2 + flatted: 3.3.1 + pathe: 1.1.2 + sirv: 3.0.0 + tinyglobby: 0.2.10 + tinyrainbow: 1.2.0 + vitest: 2.1.8(@types/node@22.10.1)(@vitest/ui@2.1.8) + + '@vitest/utils@2.1.8': + dependencies: + '@vitest/pretty-format': 2.1.8 + loupe: 3.1.2 + tinyrainbow: 1.2.0 + + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + argparse@2.0.1: {} + + assertion-error@2.0.1: {} + + asynckit@0.4.0: {} + + axios@1.7.7: + dependencies: + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + cac@6.7.14: {} + + callsites@3.1.0: {} + + camelcase@8.0.0: {} + + chai@5.1.2: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.2 + pathval: 2.0.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + check-error@2.1.1: {} + + clone@2.1.2: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + concat-map@0.0.1: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + deep-eql@5.0.2: {} + + deep-is@0.1.4: {} + + delayed-stream@1.0.0: {} + + dotenv@16.4.7: {} + + eastasianwidth@0.2.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + entities@2.2.0: {} + + entities@4.5.0: {} + + es-module-lexer@1.5.4: {} + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escape-string-regexp@4.0.0: {} + + eslint-config-prettier@9.1.0(eslint@9.16.0): + dependencies: + eslint: 9.16.0 + + eslint-scope@8.2.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.0: {} + + eslint@9.16.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.16.0) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.19.0 + '@eslint/core': 0.9.0 + '@eslint/eslintrc': 3.2.0 + '@eslint/js': 9.16.0 + '@eslint/plugin-kit': 0.2.3 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.1 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.3.7 + escape-string-regexp: 4.0.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + + espree@10.3.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.6 + + esutils@2.0.3: {} + + expect-type@1.1.0: {} + + farming-weight@0.7.1: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fdir@6.4.2(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + fflate@0.8.2: {} + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + + flatted@3.3.1: {} + + follow-redirects@1.15.6: {} + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + fsevents@2.3.3: + optional: true + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + + globals@14.0.0: {} + + globals@15.13.0: {} + + graphemer@1.4.0: {} + + has-flag@4.0.0: {} + + html-escaper@2.0.2: {} + + ignore@5.3.1: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inherits@2.0.4: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.3.7 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.get@4.4.2: {} + + lodash.merge@4.6.2: {} + + lodash.reduce@4.6.0: {} + + loupe@3.1.2: {} + + lru-cache@10.4.3: {} + + lunr@2.3.9: {} + + magic-string@0.30.12: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + magicast@0.3.5: + dependencies: + '@babel/parser': 7.26.1 + '@babel/types': 7.26.0 + source-map-js: 1.2.0 + + make-dir@4.0.0: + dependencies: + semver: 7.6.3 + + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + mdurl@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minipass@7.1.2: {} + + mrmime@2.0.0: {} + + ms@2.1.3: {} + + nanoid@3.3.7: {} + + natural-compare@1.4.0: {} + + node-cache@5.1.2: + dependencies: + clone: 2.1.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + package-json-from-dist@1.0.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + pathe@1.1.2: {} + + pathval@2.0.0: {} + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + postcss@8.4.41: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + prelude-ls@1.2.1: {} + + prettier@3.4.2: {} + + prismarine-nbt@2.6.0: + dependencies: + protodef: 1.15.0 + + protodef-validator@1.3.1: + dependencies: + ajv: 6.12.6 + + protodef@1.15.0: + dependencies: + lodash.get: 4.4.2 + lodash.reduce: 4.6.0 + protodef-validator: 1.3.1 + readable-stream: 3.6.2 + + proxy-from-env@1.1.0: {} + + punycode.js@2.3.1: {} + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + resolve-from@4.0.0: {} + + reusify@1.0.4: {} + + rollup@4.20.0: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.20.0 + '@rollup/rollup-android-arm64': 4.20.0 + '@rollup/rollup-darwin-arm64': 4.20.0 + '@rollup/rollup-darwin-x64': 4.20.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.20.0 + '@rollup/rollup-linux-arm-musleabihf': 4.20.0 + '@rollup/rollup-linux-arm64-gnu': 4.20.0 + '@rollup/rollup-linux-arm64-musl': 4.20.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.20.0 + '@rollup/rollup-linux-riscv64-gnu': 4.20.0 + '@rollup/rollup-linux-s390x-gnu': 4.20.0 + '@rollup/rollup-linux-x64-gnu': 4.20.0 + '@rollup/rollup-linux-x64-musl': 4.20.0 + '@rollup/rollup-win32-arm64-msvc': 4.20.0 + '@rollup/rollup-win32-ia32-msvc': 4.20.0 + '@rollup/rollup-win32-x64-msvc': 4.20.0 + fsevents: 2.3.3 + + rss-parser@3.13.0: + dependencies: + entities: 2.2.0 + xml2js: 0.5.0 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.2.1: {} + + sax@1.4.1: {} + + semver@7.6.3: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + siginfo@2.0.0: {} + + signal-exit@4.1.0: {} + + sirv@3.0.0: + dependencies: + '@polka/url': 1.0.0-next.25 + mrmime: 2.0.0 + totalist: 3.0.1 + + skyhelper-networth@1.26.0: + dependencies: + axios: 1.7.7 + prismarine-nbt: 2.6.0 + transitivePeerDependencies: + - debug + + source-map-js@1.2.0: {} + + stackback@0.0.2: {} + + std-env@3.8.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-json-comments@3.1.1: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + test-exclude@7.0.1: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.4.5 + minimatch: 9.0.5 + + tinybench@2.9.0: {} + + tinyexec@0.3.1: {} + + tinyglobby@0.2.10: + dependencies: + fdir: 6.4.2(picomatch@4.0.2) + picomatch: 4.0.2 + + tinypool@1.0.1: {} + + tinyrainbow@1.2.0: {} + + tinyspy@3.0.2: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + totalist@3.0.1: {} + + ts-api-utils@1.3.0(typescript@5.7.2): + dependencies: + typescript: 5.7.2 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typedoc-material-theme@1.2.0(typedoc@0.27.3(typescript@5.7.2)): + dependencies: + '@material/material-color-utilities': 0.3.0 + typedoc: 0.27.3(typescript@5.7.2) + + typedoc-plugin-rename-defaults@0.7.2(typedoc@0.27.3(typescript@5.7.2)): + dependencies: + camelcase: 8.0.0 + typedoc: 0.27.3(typescript@5.7.2) + + typedoc@0.27.3(typescript@5.7.2): + dependencies: + '@gerrit0/mini-shiki': 1.24.0 + lunr: 2.3.9 + markdown-it: 14.1.0 + minimatch: 9.0.5 + typescript: 5.7.2 + yaml: 2.6.1 + + typescript-eslint@8.17.0(eslint@9.16.0)(typescript@5.7.2): + dependencies: + '@typescript-eslint/eslint-plugin': 8.17.0(@typescript-eslint/parser@8.17.0(eslint@9.16.0)(typescript@5.7.2))(eslint@9.16.0)(typescript@5.7.2) + '@typescript-eslint/parser': 8.17.0(eslint@9.16.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.17.0(eslint@9.16.0)(typescript@5.7.2) + eslint: 9.16.0 + optionalDependencies: + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + typescript@5.7.2: {} + + uc.micro@2.1.0: {} + + undici-types@6.20.0: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + vite-node@2.1.8(@types/node@22.10.1): + dependencies: + cac: 6.7.14 + debug: 4.3.7 + es-module-lexer: 1.5.4 + pathe: 1.1.2 + vite: 5.4.0(@types/node@22.10.1) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite@5.4.0(@types/node@22.10.1): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.41 + rollup: 4.20.0 + optionalDependencies: + '@types/node': 22.10.1 + fsevents: 2.3.3 + + vitest@2.1.8(@types/node@22.10.1)(@vitest/ui@2.1.8): + dependencies: + '@vitest/expect': 2.1.8 + '@vitest/mocker': 2.1.8(vite@5.4.0(@types/node@22.10.1)) + '@vitest/pretty-format': 2.1.8 + '@vitest/runner': 2.1.8 + '@vitest/snapshot': 2.1.8 + '@vitest/spy': 2.1.8 + '@vitest/utils': 2.1.8 + chai: 5.1.2 + debug: 4.3.7 + expect-type: 1.1.0 + magic-string: 0.30.12 + pathe: 1.1.2 + std-env: 3.8.0 + tinybench: 2.9.0 + tinyexec: 0.3.1 + tinypool: 1.0.1 + tinyrainbow: 1.2.0 + vite: 5.4.0(@types/node@22.10.1) + vite-node: 2.1.8(@types/node@22.10.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.10.1 + '@vitest/ui': 2.1.8(vitest@2.1.8) + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + xml2js@0.5.0: + dependencies: + sax: 1.4.1 + xmlbuilder: 11.0.1 + + xml2js@0.6.2: + dependencies: + sax: 1.4.1 + xmlbuilder: 11.0.1 + + xmlbuilder@11.0.1: {} + + yaml@2.6.1: {} + + yocto-queue@0.1.0: {} diff --git a/src/API/getAPIStatus.js b/src/API/getAPIStatus.js deleted file mode 100644 index dacf897ba..000000000 --- a/src/API/getAPIStatus.js +++ /dev/null @@ -1,8 +0,0 @@ -const Rss = require('rss-parser'); -const Parser = new Rss(); -module.exports = async function (options) { - const Status = require('../structures/APIStatus.js'); - const parsed = await Parser.parseURL('https://status.hypixel.net/history.rss'); - if (options && options.raw) return parsed; - return new Status(parsed); -}; diff --git a/src/API/getAchievements.js b/src/API/getAchievements.js deleted file mode 100644 index 392aac51e..000000000 --- a/src/API/getAchievements.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = async function () { - const Achievements = require('../structures/Static/Achievements'); - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest('/resources/achievements'); - if (res.raw) return res; - return new Achievements(res); -}; diff --git a/src/API/getAchievements.test.ts b/src/API/getAchievements.test.ts new file mode 100644 index 000000000..658c819a3 --- /dev/null +++ b/src/API/getAchievements.test.ts @@ -0,0 +1,103 @@ +import Achievements from '../Structures/Static/Achievements/Achievements.js'; +import Client from '../Client.js'; +import GameAchievements from '../Structures/Static/Achievements/GameAchievements.js'; +import OneTimeAchivement from '../Structures/Static/Achievements/OneTimeAchivement.js'; +import RequestData from '../Private/RequestData.js'; +import TieredAchivement from '../Structures/Static/Achievements/TieredAchivement.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { AchivementTier } from '../Types/Static.js'; + +test('getAchievements (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getAchievements({ raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getAchievements', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getAchievements(); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Achievements); + expectTypeOf(data).toEqualTypeOf(); + data = data as Achievements; + expect(data.lastUpdatedTimestamp).toBeDefined(); + expect(data.lastUpdatedTimestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.lastUpdatedTimestamp).toEqualTypeOf(); + expect(data.lastUpdatedAt).toBeDefined(); + expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); + expect(data.achievementsPerGame).toBeDefined(); + expectTypeOf(data.achievementsPerGame).toEqualTypeOf>(); + Object.keys(data.achievementsPerGame).forEach((game) => { + const gameData = data.achievementsPerGame[game] as GameAchievements; + expect(gameData).toBeDefined(); + expect(gameData).toBeInstanceOf(GameAchievements); + expectTypeOf(gameData).toEqualTypeOf(); + expect(gameData.game).toBeDefined(); + expectTypeOf(gameData.game).toEqualTypeOf(); + expect(gameData.points).toBeDefined(); + expect(gameData.points).toBeGreaterThanOrEqual(0); + expectTypeOf(gameData.points).toEqualTypeOf(); + expect(gameData.legacyPoints).toBeDefined(); + expect(gameData.legacyPoints).toBeGreaterThanOrEqual(0); + expectTypeOf(gameData.legacyPoints).toEqualTypeOf(); + expect(gameData.oneTimeAchievements).toBeDefined(); + expectTypeOf(gameData.oneTimeAchievements).toEqualTypeOf(); + gameData.oneTimeAchievements.forEach((achievement) => { + expect(achievement.codeName).toBeDefined(); + expectTypeOf(achievement.codeName).toEqualTypeOf(); + expect(achievement.name).toBeDefined(); + expectTypeOf(achievement.name).toEqualTypeOf(); + expect(achievement.description).toBeDefined(); + expectTypeOf(achievement.description).toEqualTypeOf(); + expect(achievement.secret).toBeDefined(); + expectTypeOf(achievement.secret).toEqualTypeOf(); + expect(achievement.legacy).toBeDefined(); + expectTypeOf(achievement.legacy).toEqualTypeOf(); + expect(achievement.points).toBeDefined(); + expectTypeOf(achievement.points).toEqualTypeOf(); + expect(achievement.gamePercentUnlocked).toBeDefined(); + expectTypeOf(achievement.gamePercentUnlocked).toEqualTypeOf(); + expect(achievement.globalPercentUnlocked).toBeDefined(); + expectTypeOf(achievement.globalPercentUnlocked).toEqualTypeOf(); + expect(achievement.toString()).toBeDefined(); + expect(achievement.toString()).toBe(achievement.codeName); + expectTypeOf(achievement.toString()).toEqualTypeOf(); + }); + expect(gameData.tieredAchievements).toBeDefined(); + expectTypeOf(gameData.tieredAchievements).toEqualTypeOf(); + gameData.tieredAchievements.forEach((achievement) => { + expect(achievement.codeName).toBeDefined(); + expectTypeOf(achievement.codeName).toEqualTypeOf(); + expect(achievement.name).toBeDefined(); + expectTypeOf(achievement.name).toEqualTypeOf(); + expect(achievement.description).toBeDefined(); + expectTypeOf(achievement.description).toEqualTypeOf(); + expect(achievement.secret).toBeDefined(); + expectTypeOf(achievement.secret).toEqualTypeOf(); + expect(achievement.legacy).toBeDefined(); + expectTypeOf(achievement.legacy).toEqualTypeOf(); + expect(achievement.tiers).toBeDefined(); + expectTypeOf(achievement.tiers).toEqualTypeOf(); + achievement.tiers.forEach((tier) => { + expect(tier).toBeDefined(); + expectTypeOf(tier).toEqualTypeOf(); + expect(tier.tier).toBeDefined(); + expect(tier.tier).toBeGreaterThanOrEqual(0); + expectTypeOf(tier.tier).toEqualTypeOf(); + expect(tier.points).toBeDefined(); + expect(tier.points).toBeGreaterThanOrEqual(0); + expectTypeOf(tier.points).toEqualTypeOf(); + expect(tier.amount).toBeDefined(); + expect(tier.amount).toBeGreaterThanOrEqual(0); + expectTypeOf(tier.amount).toEqualTypeOf(); + }); + expect(achievement.toString()).toBeDefined(); + expect(achievement.toString()).toBe(achievement.codeName); + expectTypeOf(achievement.toString()).toEqualTypeOf(); + }); + }); + client.destroy(); +}); diff --git a/src/API/getAchievements.ts b/src/API/getAchievements.ts new file mode 100644 index 000000000..e0b996eef --- /dev/null +++ b/src/API/getAchievements.ts @@ -0,0 +1,21 @@ +import Achievements from '../Structures/Static/Achievements/Achievements.js'; +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import RequestData from '../Private/RequestData.js'; +import type { RequestOptions } from '../Types/Requests.js'; + +class getAchievements extends Endpoint { + readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute(options?: RequestOptions): Promise { + const res = await this.client.requestHandler.request('/resources/achievements', options); + if (res.options.raw) return res; + return new Achievements(res.data); + } +} + +export default getAchievements; diff --git a/src/API/getActiveHouses.test.ts b/src/API/getActiveHouses.test.ts new file mode 100644 index 000000000..d39c7498c --- /dev/null +++ b/src/API/getActiveHouses.test.ts @@ -0,0 +1,44 @@ +import Client from '../Client.js'; +import House from '../Structures/House.js'; +import RequestData from '../Private/RequestData.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('getActiveHouses (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getActiveHouses({ raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getActiveHouses', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getActiveHouses(); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as House[]; + data.forEach((house: House) => { + expect(house).toBeDefined(); + expect(house).toBeInstanceOf(House); + expectTypeOf(house).toEqualTypeOf(); + expect(house.name).toBeDefined(); + expectTypeOf(house.name).toEqualTypeOf(); + expect(house.uuid).toBeDefined(); + expectTypeOf(house.uuid).toEqualTypeOf(); + expect(house.owner).toBeDefined(); + expectTypeOf(house.owner).toEqualTypeOf(); + expect(house.createdAtTimestamp).toBeDefined(); + expectTypeOf(house.createdAtTimestamp).toEqualTypeOf(); + expect(house.createdAt).toBeDefined(); + expectTypeOf(house.createdAt).toEqualTypeOf(); + expect(house.players).toBeDefined(); + expectTypeOf(house.players).toEqualTypeOf(); + expect(house.cookies).toBeDefined(); + expectTypeOf(house.cookies).toEqualTypeOf(); + expect(house.toString()).toBeDefined(); + expectTypeOf(house.toString()).toEqualTypeOf(); + expect(house.toString()).toBe(house.name); + }); + client.destroy(); +}); diff --git a/src/API/getActiveHouses.ts b/src/API/getActiveHouses.ts new file mode 100644 index 000000000..e4ec89211 --- /dev/null +++ b/src/API/getActiveHouses.ts @@ -0,0 +1,21 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import House from '../Structures/House.js'; +import RequestData from '../Private/RequestData.js'; +import type { RequestOptions } from '../Types/Requests.js'; + +class getActiveHouses extends Endpoint { + readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute(options?: RequestOptions): Promise { + const res = await this.client.requestHandler.request('/housing/active', options); + if (res.options.raw) return res; + return res.data.map((b: any) => new House(b)); + } +} + +export default getActiveHouses; diff --git a/src/API/getBoosters.js b/src/API/getBoosters.js deleted file mode 100644 index 0660ca845..000000000 --- a/src/API/getBoosters.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = async function () { - const Booster = require('../structures/Boosters/Booster'); - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest('/boosters'); - if (res.raw) return res; - return res.boosters.length ? res.boosters.map((b) => new Booster(b)).reverse() : []; -}; diff --git a/src/API/getBoosters.test.ts b/src/API/getBoosters.test.ts new file mode 100644 index 000000000..d71b71630 --- /dev/null +++ b/src/API/getBoosters.test.ts @@ -0,0 +1,74 @@ +import Booster from '../Structures/Boosters/Booster.js'; +import Client from '../Client.js'; +import Game from '../Structures/Game.js'; +import RequestData from '../Private/RequestData.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { GameCode, GameID, GameString } from '../Types/Game.js'; + +test('getBoosters (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getBoosters({ raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getBoosters', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getBoosters(); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as Booster[]; + data.forEach((booster: Booster) => { + expect(booster).toBeDefined(); + expect(booster).toBeInstanceOf(Booster); + expectTypeOf(booster).toEqualTypeOf(); + expect(booster.purchaser).toBeDefined(); + expectTypeOf(booster.purchaser).toEqualTypeOf(); + expect(booster.amount).toBeDefined(); + expectTypeOf(booster.amount).toEqualTypeOf(); + expect(booster.originalLength).toBeDefined(); + expectTypeOf(booster.originalLength).toEqualTypeOf(); + expect(booster.remaining).toBeDefined(); + expectTypeOf(booster.remaining).toEqualTypeOf(); + expect(booster.activatedTimestamp).toBeDefined(); + expectTypeOf(booster.activatedTimestamp).toEqualTypeOf(); + expect(booster.activated).toBeDefined(); + expectTypeOf(booster.activated).toEqualTypeOf(); + expect(booster.game).toBeDefined(); + expectTypeOf(booster.game).toEqualTypeOf(); + expect(booster.game).toBeDefined(); + expectTypeOf(booster.game).toEqualTypeOf(); + expect(booster.game.game).toBeDefined(); + expectTypeOf(booster.game.game).toEqualTypeOf(); + expect(booster.game.id).toBeDefined(); + expectTypeOf(booster.game.id).toEqualTypeOf(); + expect(booster.game.code).toBeDefined(); + expectTypeOf(booster.game.code).toEqualTypeOf(); + expect(booster.game.name).toBeDefined(); + expectTypeOf(booster.game.name).toEqualTypeOf(); + expect(booster.game.found).toBeDefined(); + expectTypeOf(booster.game.found).toEqualTypeOf(); + expect(booster.game.toString()).toBeDefined(); + expect(booster.game.toString()).toBe(booster.game.name); + expectTypeOf(booster.game.toString()).toEqualTypeOf(); + expect(Game.IDS).toBeDefined(); + expectTypeOf(Game.IDS).toEqualTypeOf(); + expect(Game.CODES).toBeDefined(); + expectTypeOf(Game.CODES).toEqualTypeOf(); + expect(Game.NAMES).toBeDefined(); + expectTypeOf(Game.NAMES).toEqualTypeOf(); + expect(booster.isActive).toBeDefined(); + expectTypeOf(booster.isActive).toEqualTypeOf(); + expect(booster.type).toBeDefined(); + expectTypeOf(booster.type).toEqualTypeOf<'STACKED' | 'QUEUED' | 'ACTIVE'>(); + expect(booster.stackers).toBeDefined(); + expectTypeOf(booster.stackers).toEqualTypeOf(); + expect(booster.expired).toBeDefined(); + expectTypeOf(booster.expired).toEqualTypeOf(); + expect(booster.toString()).toBeDefined(); + expectTypeOf(booster.toString()).toEqualTypeOf(); + }); + client.destroy(); +}); diff --git a/src/API/getBoosters.ts b/src/API/getBoosters.ts new file mode 100644 index 000000000..fc4015771 --- /dev/null +++ b/src/API/getBoosters.ts @@ -0,0 +1,21 @@ +import Booster from '../Structures/Boosters/Booster.js'; +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import RequestData from '../Private/RequestData.js'; +import type { RequestOptions } from '../Types/Requests.js'; + +class getBoosters extends Endpoint { + readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute(options?: RequestOptions): Promise { + const res = await this.client.requestHandler.request('/boosters', options); + if (res.options.raw) return res; + return res.data.boosters.map((b: any) => new Booster(b)).reverse(); + } +} + +export default getBoosters; diff --git a/src/API/getChallenges.js b/src/API/getChallenges.js deleted file mode 100644 index dc0d79489..000000000 --- a/src/API/getChallenges.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = async function () { - const Challenges = require('../structures/Static/Challenges'); - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest('/resources/challenges'); - if (res.raw) return res; - return new Challenges(res); -}; diff --git a/src/API/getChallenges.test.ts b/src/API/getChallenges.test.ts new file mode 100644 index 000000000..ca1917155 --- /dev/null +++ b/src/API/getChallenges.test.ts @@ -0,0 +1,51 @@ +import Challenge from '../Structures/Static/Challenge.js'; +import Challenges from '../Structures/Static/Challenges.js'; +import Client from '../Client.js'; +import GameChallenges from '../Structures/Static/GameChallenges.js'; +import RequestData from '../Private/RequestData.js'; +import { ChallengeReward } from '../Types/Static.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('getChallenges (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getChallenges({ raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getChallenges', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getChallenges(); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Challenges); + expectTypeOf(data).toEqualTypeOf(); + data = data as Challenges; + expect(data.lastUpdatedTimestamp).toBeDefined(); + expect(data.lastUpdatedTimestamp).toBeGreaterThan(0); + expectTypeOf(data.lastUpdatedTimestamp).toEqualTypeOf(); + expect(data.lastUpdatedAt).toBeDefined(); + expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); + expect(data.challengesPerGame).toBeDefined(); + expectTypeOf(data.challengesPerGame).toEqualTypeOf>(); + Object.keys(data.challengesPerGame).forEach((gameName) => { + if (undefined === data.challengesPerGame[gameName]) return; + expect(data.challengesPerGame[gameName]).toBeDefined(); + expect(data.challengesPerGame[gameName]).toBeInstanceOf(GameChallenges); + expectTypeOf(data.challengesPerGame[gameName]).toEqualTypeOf(); + expect(data.challengesPerGame[gameName].category).toBeDefined(); + expect(data.challengesPerGame[gameName].category).toEqual(gameName); + expect(data.challengesPerGame[gameName].challenges).toBeDefined(); + expectTypeOf(data.challengesPerGame[gameName].challenges).toEqualTypeOf(); + data.challengesPerGame[gameName].challenges.forEach((challenge: Challenge) => { + expect(challenge.id).toBeDefined(); + expectTypeOf(challenge.id).toEqualTypeOf(); + expect(challenge.name).toBeDefined(); + expectTypeOf(challenge.name).toEqualTypeOf(); + expect(challenge.rewards).toBeDefined(); + expectTypeOf(challenge.rewards).toEqualTypeOf(); + }); + }); + client.destroy(); +}); diff --git a/src/API/getChallenges.ts b/src/API/getChallenges.ts new file mode 100644 index 000000000..d68e025da --- /dev/null +++ b/src/API/getChallenges.ts @@ -0,0 +1,20 @@ +import Challenges from '../Structures/Static/Challenges.js'; +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import RequestData from '../Private/RequestData.js'; +import type { RequestOptions } from '../Types/Requests.js'; + +class getChallenges extends Endpoint { + readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute(options?: RequestOptions): Promise { + const res = await this.client.requestHandler.request('/resources/challenges', options); + if (res.options.raw) return res; + return new Challenges(res.data); + } +} +export default getChallenges; diff --git a/src/API/getGameCounts.js b/src/API/getGameCounts.js deleted file mode 100644 index 3378f40d2..000000000 --- a/src/API/getGameCounts.js +++ /dev/null @@ -1,7 +0,0 @@ -const GameCounts = require('../structures/GameCounts'); -module.exports = async function () { - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest('/counts'); - if (res.raw) return res; - return new GameCounts(res); -}; diff --git a/src/API/getGameCounts.test.ts b/src/API/getGameCounts.test.ts new file mode 100644 index 000000000..ba28897f8 --- /dev/null +++ b/src/API/getGameCounts.test.ts @@ -0,0 +1,27 @@ +import Client from '../Client.js'; +import GameCounts from '../Structures/GameCounts.js'; +import RequestData from '../Private/RequestData.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('getGameCounts (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getGameCounts({ raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getGameCounts', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getGameCounts(); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCounts); + expectTypeOf(data).toEqualTypeOf(); + data = data as GameCounts; + expect(data.playerCount).toBeDefined(); + expectTypeOf(data.playerCount).toEqualTypeOf(); + expect(data.toString()).toBeDefined(); + expectTypeOf(data.toString()).toEqualTypeOf(); + client.destroy(); +}); diff --git a/src/API/getGameCounts.ts b/src/API/getGameCounts.ts new file mode 100644 index 000000000..279993d39 --- /dev/null +++ b/src/API/getGameCounts.ts @@ -0,0 +1,21 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import GameCounts from '../Structures/GameCounts.js'; +import RequestData from '../Private/RequestData.js'; +import type { RequestOptions } from '../Types/Requests.js'; + +class getGameCounts extends Endpoint { + readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute(options?: RequestOptions): Promise { + const res = await this.client.requestHandler.request('/counts', options); + if (res.options.raw) return res; + return new GameCounts(res.data); + } +} + +export default getGameCounts; diff --git a/src/API/getGuild.js b/src/API/getGuild.js deleted file mode 100644 index fa28b0704..000000000 --- a/src/API/getGuild.js +++ /dev/null @@ -1,19 +0,0 @@ -const Errors = require('../Errors'); -const toUuid = require('../utils/toUuid'); -const isGuildID = require('../utils/isGuildID'); -module.exports = async function (searchParameter, query) { - if (!query) throw new Error(Errors.NO_GUILD_QUERY); - const Guild = require('../structures/Guild/Guild'); - if ('id' === searchParameter && !isGuildID(query)) throw new Error(Errors.INVALID_GUILD_ID); - const isPlayerQuery = 'player' === searchParameter; - if (isPlayerQuery) query = await toUuid(query, this.options.mojangCacheTime, this.options.useThirdPartyAPI); - if (!['id', 'name', 'player'].includes(searchParameter)) throw new Error(Errors.INVALID_GUILD_SEARCH_PARAMETER); - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest(`/guild?${searchParameter}=${encodeURI(query)}`); - if (res.raw) return res; - if (!res.guild && 'player' !== searchParameter) { - throw new Error(Errors.GUILD_DOES_NOT_EXIST); - } - - return res.guild ? new Guild(res.guild, isPlayerQuery ? query : null) : null; -}; diff --git a/src/API/getGuild.test.ts b/src/API/getGuild.test.ts new file mode 100644 index 000000000..8dcea3493 --- /dev/null +++ b/src/API/getGuild.test.ts @@ -0,0 +1,606 @@ +import Client from '../Client.js'; +import Color from '../Structures/Color.js'; +import Game from '../Structures/Game.js'; +import Guild from '../Structures/Guild/Guild.js'; +import GuildMember from '../Structures/Guild/GuildMember.js'; +import GuildRank from '../Structures/Guild/GuildRank.js'; +import RequestData from '../Private/RequestData.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { ColorCode, ColorHex, ColorString, InGameCode } from '../Types/Color.js'; +import type { ExpHistory } from '../Types/Guild.js'; +import type { GameCode, GameID, GameString } from '../Types/Game.js'; + +test('Invalid Guild Type', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + expect(() => client.getGuild('invalid', 'invalid')).rejects.toThrowError( + client.errors.INVALID_GUILD_SEARCH_PARAMETER + ); + client.destroy(); +}); + +test('Invalid Guild', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + expect(() => client.getGuild('name', 'this guild dose not exist')).rejects.toThrowError( + client.errors.GUILD_DOES_NOT_EXIST + ); + client.destroy(); +}); + +test('Invalid Guild ID', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + expect(() => client.getGuild('id', 'invalid guild id')).rejects.toThrowError(client.errors.INVALID_GUILD_ID); + client.destroy(); +}); + +test('No Guild Query', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + expect(() => client.getGuild('id')).rejects.toThrowError(client.errors.NO_GUILD_QUERY); + client.destroy(); +}); + +test('User not in a guild', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getGuild('player', '37501e7512b845ab8796e2baf9e9677a'); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getGuild (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getGuild('name', 'Pixelic', { raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getGuild (Name)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getGuild('name', 'Pixelic'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Guild); + expectTypeOf(data).toEqualTypeOf(); + data = data as Guild; + expect(data.id).toBeDefined(); + expectTypeOf(data.id).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.description).toBeDefined(); + expectTypeOf(data.description).toEqualTypeOf(); + expect(data.experience).toBeDefined(); + expectTypeOf(data.experience).toEqualTypeOf(); + expect(data.experience).toBeGreaterThanOrEqual(0); + expect(data.level).toBeDefined(); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.members).toBeDefined(); + expectTypeOf(data.members).toEqualTypeOf(); + data.members.forEach((member: GuildMember) => { + expect(member).toBeDefined(); + expectTypeOf(member).toEqualTypeOf(); + expect(member.uuid).toBeDefined(); + expectTypeOf(member.uuid).toEqualTypeOf(); + expect(member.joinedAtTimestamp).toBeDefined(); + expectTypeOf(member.joinedAtTimestamp).toEqualTypeOf(); + expect(member.joinedAt).toBeDefined(); + expectTypeOf(member.joinedAt).toEqualTypeOf(); + expect(member.questParticipation).toBeDefined(); + expectTypeOf(member.questParticipation).toEqualTypeOf(); + expect(member.rank).toBeDefined(); + expectTypeOf(member.rank).toEqualTypeOf(); + expect(member.mutedUntilTimestamp).toBeDefined(); + expectTypeOf(member.mutedUntilTimestamp).toEqualTypeOf(); + expect(member.mutedUntil).toBeDefined(); + expectTypeOf(member.mutedUntil).toEqualTypeOf(); + expect(member.expHistory).toBeDefined(); + expectTypeOf(member.expHistory).toEqualTypeOf(); + expect(member.weeklyExperience).toBeDefined(); + expectTypeOf(member.weeklyExperience).toEqualTypeOf(); + expect(member.weeklyExperience).toBeGreaterThanOrEqual(0); + expect(member.toString()).toBeDefined(); + expectTypeOf(member.toString()).toEqualTypeOf(); + expect(member.toString()).toEqual(member.uuid); + }); + expect(data.me).toBeDefined(); + expectTypeOf(data.me).toEqualTypeOf(); + if (null !== data.me) { + expect(data.me).toBeDefined(); + expectTypeOf(data.me).toEqualTypeOf(); + expect(data.me.uuid).toBeDefined(); + expectTypeOf(data.me.uuid).toEqualTypeOf(); + expect(data.me.joinedAtTimestamp).toBeDefined(); + expectTypeOf(data.me.joinedAtTimestamp).toEqualTypeOf(); + expect(data.me.joinedAt).toBeDefined(); + expectTypeOf(data.me.joinedAt).toEqualTypeOf(); + expect(data.me.questParticipation).toBeDefined(); + expectTypeOf(data.me.questParticipation).toEqualTypeOf(); + expect(data.me.rank).toBeDefined(); + expectTypeOf(data.me.rank).toEqualTypeOf(); + expect(data.me.mutedUntilTimestamp).toBeDefined(); + expectTypeOf(data.me.mutedUntilTimestamp).toEqualTypeOf(); + expect(data.me.mutedUntil).toBeDefined(); + expectTypeOf(data.me.mutedUntil).toEqualTypeOf(); + expect(data.me.expHistory).toBeDefined(); + expectTypeOf(data.me.expHistory).toEqualTypeOf(); + expect(data.me.weeklyExperience).toBeDefined(); + expectTypeOf(data.me.weeklyExperience).toEqualTypeOf(); + expect(data.me.weeklyExperience).toBeGreaterThanOrEqual(0); + expect(data.me.toString()).toBeDefined(); + expectTypeOf(data.me.toString()).toEqualTypeOf(); + expect(data.me.toString()).toEqual(data.me.uuid); + } + expect(data.ranks).toBeDefined(); + expectTypeOf(data.ranks).toEqualTypeOf(); + data.ranks.forEach((rank: GuildRank) => { + expect(rank).toBeDefined(); + expect(rank).toBeInstanceOf(GuildRank); + expectTypeOf(rank).toEqualTypeOf(); + expect(rank.name).toBeDefined(); + expectTypeOf(rank.name).toEqualTypeOf(); + expect(rank.default).toBeDefined(); + expectTypeOf(rank.default).toEqualTypeOf(); + expect(rank.tag).toBeDefined(); + expectTypeOf(rank.tag).toEqualTypeOf(); + expect(rank.createdAtTimestamp).toBeDefined(); + expectTypeOf(rank.createdAtTimestamp).toEqualTypeOf(); + expect(rank.createdAt).toBeDefined(); + expectTypeOf(rank.createdAt).toEqualTypeOf(); + expect(rank.priority).toBeDefined(); + expectTypeOf(rank.priority).toEqualTypeOf(); + expect(rank.toString()).toBeDefined(); + expectTypeOf(rank.toString()).toEqualTypeOf(); + expect(rank.toString()).toEqual(rank.name); + }); + expect(data.totalWeeklyGexp).toBeDefined(); + expectTypeOf(data.totalWeeklyGexp).toEqualTypeOf(); + expect(data.createdAtTimestamp).toBeDefined(); + expectTypeOf(data.createdAtTimestamp).toEqualTypeOf(); + expect(data.createdAt).toBeDefined(); + expectTypeOf(data.createdAt).toEqualTypeOf(); + expect(data.joinable).toBeDefined(); + expectTypeOf(data.joinable).toEqualTypeOf(); + expect(data.publiclyListed).toBeDefined(); + expectTypeOf(data.publiclyListed).toEqualTypeOf(); + expect(data.chatMuteUntilTimestamp).toBeDefined(); + expectTypeOf(data.chatMuteUntilTimestamp).toEqualTypeOf(); + expect(data.chatMuteUntil).toBeDefined(); + expectTypeOf(data.chatMuteUntil).toEqualTypeOf(); + expect(data.banner).toBeDefined(); + expectTypeOf(data.banner).toEqualTypeOf<{ Pattern: string; Color: string }[]>(); + expect(data.tag).toBeDefined(); + expectTypeOf(data.tag).toEqualTypeOf(); + expect(data.tagColor).toBeDefined(); + expectTypeOf(data.tagColor).toEqualTypeOf(); + if (data.tagColor) { + expect(data.tagColor).toBeDefined(); + expectTypeOf(data.tagColor).toEqualTypeOf(); + expect(data.tagColor.color).toBeDefined(); + expectTypeOf(data.tagColor.color).toEqualTypeOf(); + expect(data.tagColor.toString).toBeDefined(); + expectTypeOf(data.tagColor.toString).toEqualTypeOf<() => ColorString>(); + expect(data.tagColor.toString()).toBeDefined(); + expectTypeOf(data.tagColor.toString()).toEqualTypeOf(); + expect(data.tagColor.toHex).toBeDefined(); + expectTypeOf(data.tagColor.toHex).toEqualTypeOf<() => ColorHex>(); + expect(data.tagColor.toHex()).toBeDefined(); + expectTypeOf(data.tagColor.toHex()).toEqualTypeOf(); + expect(data.tagColor.toCode).toBeDefined(); + expectTypeOf(data.tagColor.toCode).toEqualTypeOf<() => ColorCode>(); + expect(data.tagColor.toCode()).toBeDefined(); + expectTypeOf(data.tagColor.toCode()).toEqualTypeOf(); + expect(data.tagColor.toInGameCode).toBeDefined(); + expectTypeOf(data.tagColor.toInGameCode).toEqualTypeOf<() => InGameCode>(); + expect(data.tagColor.toInGameCode()).toBeDefined(); + expectTypeOf(data.tagColor.toInGameCode()).toEqualTypeOf(); + } + expect(data.expHistory).toBeDefined(); + expectTypeOf(data.expHistory).toEqualTypeOf(); + expect(data.achievements).toBeDefined(); + expectTypeOf(data.achievements).toEqualTypeOf<{ winners: number; experienceKings: number; onlinePlayers: number }>(); + expect(data.achievements.winners).toBeDefined(); + expectTypeOf(data.achievements.winners).toEqualTypeOf(); + expect(data.achievements.winners).toBeGreaterThanOrEqual(0); + expect(data.achievements.experienceKings).toBeDefined(); + expectTypeOf(data.achievements.experienceKings).toEqualTypeOf(); + expect(data.achievements.experienceKings).toBeGreaterThanOrEqual(0); + expect(data.preferredGames).toBeDefined(); + expectTypeOf(data.preferredGames).toEqualTypeOf(); + data.preferredGames.forEach((game: Game) => { + expect(game).toBeDefined(); + expectTypeOf(game).toEqualTypeOf(); + expect(game.game).toBeDefined(); + expectTypeOf(game.game).toEqualTypeOf(); + expect(game.id).toBeDefined(); + expectTypeOf(game.id).toEqualTypeOf(); + expect(game.code).toBeDefined(); + expectTypeOf(game.code).toEqualTypeOf(); + expect(game.name).toBeDefined(); + expectTypeOf(game.name).toEqualTypeOf(); + expect(game.found).toBeDefined(); + expectTypeOf(game.found).toEqualTypeOf(); + expect(game.toString()).toBeDefined(); + expect(game.toString()).toBe(game.name); + expectTypeOf(game.toString()).toEqualTypeOf(); + expect(Game.IDS).toBeDefined(); + expectTypeOf(Game.IDS).toEqualTypeOf(); + expect(Game.CODES).toBeDefined(); + expectTypeOf(Game.CODES).toEqualTypeOf(); + expect(Game.NAMES).toBeDefined(); + expectTypeOf(Game.NAMES).toEqualTypeOf(); + }); + expect(data.toString()).toBeDefined(); + expectTypeOf(data.toString()).toEqualTypeOf(); + expect(data.guildMaster()).toBeDefined(); + expect(data.guildMaster()).toBeInstanceOf(GuildMember); + expect(['Guild Master', 'GUILDMASTER']).toContain(data.guildMaster()?.rank); + expectTypeOf(data.guildMaster()).toEqualTypeOf(); + client.destroy(); +}); + +test('getGuild (Id)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getGuild('id', '64b54f9d8ea8c96aaedafe84'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Guild); + expectTypeOf(data).toEqualTypeOf(); + data = data as Guild; + expect(data.id).toBeDefined(); + expectTypeOf(data.id).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.description).toBeDefined(); + expectTypeOf(data.description).toEqualTypeOf(); + expect(data.experience).toBeDefined(); + expectTypeOf(data.experience).toEqualTypeOf(); + expect(data.experience).toBeGreaterThanOrEqual(0); + expect(data.level).toBeDefined(); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.members).toBeDefined(); + expectTypeOf(data.members).toEqualTypeOf(); + data.members.forEach((member: GuildMember) => { + expect(member).toBeDefined(); + expectTypeOf(member).toEqualTypeOf(); + expect(member.uuid).toBeDefined(); + expectTypeOf(member.uuid).toEqualTypeOf(); + expect(member.joinedAtTimestamp).toBeDefined(); + expectTypeOf(member.joinedAtTimestamp).toEqualTypeOf(); + expect(member.joinedAt).toBeDefined(); + expectTypeOf(member.joinedAt).toEqualTypeOf(); + expect(member.questParticipation).toBeDefined(); + expectTypeOf(member.questParticipation).toEqualTypeOf(); + expect(member.rank).toBeDefined(); + expectTypeOf(member.rank).toEqualTypeOf(); + expect(member.mutedUntilTimestamp).toBeDefined(); + expectTypeOf(member.mutedUntilTimestamp).toEqualTypeOf(); + expect(member.mutedUntil).toBeDefined(); + expectTypeOf(member.mutedUntil).toEqualTypeOf(); + expect(member.expHistory).toBeDefined(); + expectTypeOf(member.expHistory).toEqualTypeOf(); + expect(member.weeklyExperience).toBeDefined(); + expectTypeOf(member.weeklyExperience).toEqualTypeOf(); + expect(member.weeklyExperience).toBeGreaterThanOrEqual(0); + expect(member.toString()).toBeDefined(); + expectTypeOf(member.toString()).toEqualTypeOf(); + expect(member.toString()).toEqual(member.uuid); + }); + expect(data.me).toBeDefined(); + expectTypeOf(data.me).toEqualTypeOf(); + if (null !== data.me) { + expect(data.me).toBeDefined(); + expectTypeOf(data.me).toEqualTypeOf(); + expect(data.me.uuid).toBeDefined(); + expectTypeOf(data.me.uuid).toEqualTypeOf(); + expect(data.me.joinedAtTimestamp).toBeDefined(); + expectTypeOf(data.me.joinedAtTimestamp).toEqualTypeOf(); + expect(data.me.joinedAt).toBeDefined(); + expectTypeOf(data.me.joinedAt).toEqualTypeOf(); + expect(data.me.questParticipation).toBeDefined(); + expectTypeOf(data.me.questParticipation).toEqualTypeOf(); + expect(data.me.rank).toBeDefined(); + expectTypeOf(data.me.rank).toEqualTypeOf(); + expect(data.me.mutedUntilTimestamp).toBeDefined(); + expectTypeOf(data.me.mutedUntilTimestamp).toEqualTypeOf(); + expect(data.me.mutedUntil).toBeDefined(); + expectTypeOf(data.me.mutedUntil).toEqualTypeOf(); + expect(data.me.expHistory).toBeDefined(); + expectTypeOf(data.me.expHistory).toEqualTypeOf(); + expect(data.me.weeklyExperience).toBeDefined(); + expectTypeOf(data.me.weeklyExperience).toEqualTypeOf(); + expect(data.me.weeklyExperience).toBeGreaterThanOrEqual(0); + expect(data.me.toString()).toBeDefined(); + expectTypeOf(data.me.toString()).toEqualTypeOf(); + expect(data.me.toString()).toEqual(data.me.uuid); + } + expect(data.ranks).toBeDefined(); + expectTypeOf(data.ranks).toEqualTypeOf(); + data.ranks.forEach((rank: GuildRank) => { + expect(rank).toBeDefined(); + expect(rank).toBeInstanceOf(GuildRank); + expectTypeOf(rank).toEqualTypeOf(); + expect(rank.name).toBeDefined(); + expectTypeOf(rank.name).toEqualTypeOf(); + expect(rank.default).toBeDefined(); + expectTypeOf(rank.default).toEqualTypeOf(); + expect(rank.tag).toBeDefined(); + expectTypeOf(rank.tag).toEqualTypeOf(); + expect(rank.createdAtTimestamp).toBeDefined(); + expectTypeOf(rank.createdAtTimestamp).toEqualTypeOf(); + expect(rank.createdAt).toBeDefined(); + expectTypeOf(rank.createdAt).toEqualTypeOf(); + expect(rank.priority).toBeDefined(); + expectTypeOf(rank.priority).toEqualTypeOf(); + expect(rank.toString()).toBeDefined(); + expectTypeOf(rank.toString()).toEqualTypeOf(); + expect(rank.toString()).toEqual(rank.name); + }); + expect(data.totalWeeklyGexp).toBeDefined(); + expectTypeOf(data.totalWeeklyGexp).toEqualTypeOf(); + expect(data.createdAtTimestamp).toBeDefined(); + expectTypeOf(data.createdAtTimestamp).toEqualTypeOf(); + expect(data.createdAt).toBeDefined(); + expectTypeOf(data.createdAt).toEqualTypeOf(); + expect(data.joinable).toBeDefined(); + expectTypeOf(data.joinable).toEqualTypeOf(); + expect(data.publiclyListed).toBeDefined(); + expectTypeOf(data.publiclyListed).toEqualTypeOf(); + expect(data.chatMuteUntilTimestamp).toBeDefined(); + expectTypeOf(data.chatMuteUntilTimestamp).toEqualTypeOf(); + expect(data.chatMuteUntil).toBeDefined(); + expectTypeOf(data.chatMuteUntil).toEqualTypeOf(); + expect(data.banner).toBeDefined(); + expectTypeOf(data.banner).toEqualTypeOf<{ Pattern: string; Color: string }[]>(); + expect(data.tag).toBeDefined(); + expectTypeOf(data.tag).toEqualTypeOf(); + expect(data.tagColor).toBeDefined(); + expectTypeOf(data.tagColor).toEqualTypeOf(); + if (data.tagColor) { + expect(data.tagColor).toBeDefined(); + expectTypeOf(data.tagColor).toEqualTypeOf(); + expect(data.tagColor.color).toBeDefined(); + expectTypeOf(data.tagColor.color).toEqualTypeOf(); + expect(data.tagColor.toString).toBeDefined(); + expectTypeOf(data.tagColor.toString).toEqualTypeOf<() => ColorString>(); + expect(data.tagColor.toString()).toBeDefined(); + expectTypeOf(data.tagColor.toString()).toEqualTypeOf(); + expect(data.tagColor.toHex).toBeDefined(); + expectTypeOf(data.tagColor.toHex).toEqualTypeOf<() => ColorHex>(); + expect(data.tagColor.toHex()).toBeDefined(); + expectTypeOf(data.tagColor.toHex()).toEqualTypeOf(); + expect(data.tagColor.toCode).toBeDefined(); + expectTypeOf(data.tagColor.toCode).toEqualTypeOf<() => ColorCode>(); + expect(data.tagColor.toCode()).toBeDefined(); + expectTypeOf(data.tagColor.toCode()).toEqualTypeOf(); + expect(data.tagColor.toInGameCode).toBeDefined(); + expectTypeOf(data.tagColor.toInGameCode).toEqualTypeOf<() => InGameCode>(); + expect(data.tagColor.toInGameCode()).toBeDefined(); + expectTypeOf(data.tagColor.toInGameCode()).toEqualTypeOf(); + } + expect(data.expHistory).toBeDefined(); + expectTypeOf(data.expHistory).toEqualTypeOf(); + expect(data.achievements).toBeDefined(); + expectTypeOf(data.achievements).toEqualTypeOf<{ winners: number; experienceKings: number; onlinePlayers: number }>(); + expect(data.achievements.winners).toBeDefined(); + expectTypeOf(data.achievements.winners).toEqualTypeOf(); + expect(data.achievements.winners).toBeGreaterThanOrEqual(0); + expect(data.achievements.experienceKings).toBeDefined(); + expectTypeOf(data.achievements.experienceKings).toEqualTypeOf(); + expect(data.achievements.experienceKings).toBeGreaterThanOrEqual(0); + expect(data.preferredGames).toBeDefined(); + expectTypeOf(data.preferredGames).toEqualTypeOf(); + data.preferredGames.forEach((game: Game) => { + expect(game).toBeDefined(); + expectTypeOf(game).toEqualTypeOf(); + expect(game.game).toBeDefined(); + expectTypeOf(game.game).toEqualTypeOf(); + expect(game.id).toBeDefined(); + expectTypeOf(game.id).toEqualTypeOf(); + expect(game.code).toBeDefined(); + expectTypeOf(game.code).toEqualTypeOf(); + expect(game.name).toBeDefined(); + expectTypeOf(game.name).toEqualTypeOf(); + expect(game.found).toBeDefined(); + expectTypeOf(game.found).toEqualTypeOf(); + expect(game.toString()).toBeDefined(); + expect(game.toString()).toBe(game.name); + expectTypeOf(game.toString()).toEqualTypeOf(); + expect(Game.IDS).toBeDefined(); + expectTypeOf(Game.IDS).toEqualTypeOf(); + expect(Game.CODES).toBeDefined(); + expectTypeOf(Game.CODES).toEqualTypeOf(); + expect(Game.NAMES).toBeDefined(); + expectTypeOf(Game.NAMES).toEqualTypeOf(); + }); + expect(data.toString()).toBeDefined(); + expectTypeOf(data.toString()).toEqualTypeOf(); + expect(data.guildMaster()).toBeDefined(); + expect(data.guildMaster()).toBeInstanceOf(GuildMember); + expect(['Guild Master', 'GUILDMASTER']).toContain(data.guildMaster()?.rank); + expectTypeOf(data.guildMaster()).toEqualTypeOf(); + client.destroy(); +}); + +test('getGuild (Player)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getGuild('player', '14727faefbdc4aff848cd2713eb9939e'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Guild); + expectTypeOf(data).toEqualTypeOf(); + data = data as Guild; + expect(data.id).toBeDefined(); + expectTypeOf(data.id).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.description).toBeDefined(); + expectTypeOf(data.description).toEqualTypeOf(); + expect(data.experience).toBeDefined(); + expectTypeOf(data.experience).toEqualTypeOf(); + expect(data.experience).toBeGreaterThanOrEqual(0); + expect(data.level).toBeDefined(); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.members).toBeDefined(); + expectTypeOf(data.members).toEqualTypeOf(); + data.members.forEach((member: GuildMember) => { + expect(member).toBeDefined(); + expectTypeOf(member).toEqualTypeOf(); + expect(member.uuid).toBeDefined(); + expectTypeOf(member.uuid).toEqualTypeOf(); + expect(member.joinedAtTimestamp).toBeDefined(); + expectTypeOf(member.joinedAtTimestamp).toEqualTypeOf(); + expect(member.joinedAt).toBeDefined(); + expectTypeOf(member.joinedAt).toEqualTypeOf(); + expect(member.questParticipation).toBeDefined(); + expectTypeOf(member.questParticipation).toEqualTypeOf(); + expect(member.rank).toBeDefined(); + expectTypeOf(member.rank).toEqualTypeOf(); + expect(member.mutedUntilTimestamp).toBeDefined(); + expectTypeOf(member.mutedUntilTimestamp).toEqualTypeOf(); + expect(member.mutedUntil).toBeDefined(); + expectTypeOf(member.mutedUntil).toEqualTypeOf(); + expect(member.expHistory).toBeDefined(); + expectTypeOf(member.expHistory).toEqualTypeOf(); + expect(member.weeklyExperience).toBeDefined(); + expectTypeOf(member.weeklyExperience).toEqualTypeOf(); + expect(member.weeklyExperience).toBeGreaterThanOrEqual(0); + expect(member.toString()).toBeDefined(); + expectTypeOf(member.toString()).toEqualTypeOf(); + expect(member.toString()).toEqual(member.uuid); + }); + expect(data.me).toBeDefined(); + expectTypeOf(data.me).toEqualTypeOf(); + if (null !== data.me) { + expect(data.me).toBeDefined(); + expectTypeOf(data.me).toEqualTypeOf(); + expect(data.me.uuid).toBeDefined(); + expectTypeOf(data.me.uuid).toEqualTypeOf(); + expect(data.me.joinedAtTimestamp).toBeDefined(); + expectTypeOf(data.me.joinedAtTimestamp).toEqualTypeOf(); + expect(data.me.joinedAt).toBeDefined(); + expectTypeOf(data.me.joinedAt).toEqualTypeOf(); + expect(data.me.questParticipation).toBeDefined(); + expectTypeOf(data.me.questParticipation).toEqualTypeOf(); + expect(data.me.rank).toBeDefined(); + expectTypeOf(data.me.rank).toEqualTypeOf(); + expect(data.me.mutedUntilTimestamp).toBeDefined(); + expectTypeOf(data.me.mutedUntilTimestamp).toEqualTypeOf(); + expect(data.me.mutedUntil).toBeDefined(); + expectTypeOf(data.me.mutedUntil).toEqualTypeOf(); + expect(data.me.expHistory).toBeDefined(); + expectTypeOf(data.me.expHistory).toEqualTypeOf(); + expect(data.me.weeklyExperience).toBeDefined(); + expectTypeOf(data.me.weeklyExperience).toEqualTypeOf(); + expect(data.me.weeklyExperience).toBeGreaterThanOrEqual(0); + expect(data.me.toString()).toBeDefined(); + expectTypeOf(data.me.toString()).toEqualTypeOf(); + expect(data.me.toString()).toEqual(data.me.uuid); + } + expect(data.ranks).toBeDefined(); + expectTypeOf(data.ranks).toEqualTypeOf(); + data.ranks.forEach((rank: GuildRank) => { + expect(rank).toBeDefined(); + expect(rank).toBeInstanceOf(GuildRank); + expectTypeOf(rank).toEqualTypeOf(); + expect(rank.name).toBeDefined(); + expectTypeOf(rank.name).toEqualTypeOf(); + expect(rank.default).toBeDefined(); + expectTypeOf(rank.default).toEqualTypeOf(); + expect(rank.tag).toBeDefined(); + expectTypeOf(rank.tag).toEqualTypeOf(); + expect(rank.createdAtTimestamp).toBeDefined(); + expectTypeOf(rank.createdAtTimestamp).toEqualTypeOf(); + expect(rank.createdAt).toBeDefined(); + expectTypeOf(rank.createdAt).toEqualTypeOf(); + expect(rank.priority).toBeDefined(); + expectTypeOf(rank.priority).toEqualTypeOf(); + expect(rank.toString()).toBeDefined(); + expectTypeOf(rank.toString()).toEqualTypeOf(); + expect(rank.toString()).toEqual(rank.name); + }); + expect(data.totalWeeklyGexp).toBeDefined(); + expectTypeOf(data.totalWeeklyGexp).toEqualTypeOf(); + expect(data.createdAtTimestamp).toBeDefined(); + expectTypeOf(data.createdAtTimestamp).toEqualTypeOf(); + expect(data.createdAt).toBeDefined(); + expectTypeOf(data.createdAt).toEqualTypeOf(); + expect(data.joinable).toBeDefined(); + expectTypeOf(data.joinable).toEqualTypeOf(); + expect(data.publiclyListed).toBeDefined(); + expectTypeOf(data.publiclyListed).toEqualTypeOf(); + expect(data.chatMuteUntilTimestamp).toBeDefined(); + expectTypeOf(data.chatMuteUntilTimestamp).toEqualTypeOf(); + expect(data.chatMuteUntil).toBeDefined(); + expectTypeOf(data.chatMuteUntil).toEqualTypeOf(); + expect(data.banner).toBeDefined(); + expectTypeOf(data.banner).toEqualTypeOf<{ Pattern: string; Color: string }[]>(); + expect(data.tag).toBeDefined(); + expectTypeOf(data.tag).toEqualTypeOf(); + expect(data.tagColor).toBeDefined(); + expectTypeOf(data.tagColor).toEqualTypeOf(); + if (data.tagColor) { + expect(data.tagColor).toBeDefined(); + expectTypeOf(data.tagColor).toEqualTypeOf(); + expect(data.tagColor.color).toBeDefined(); + expectTypeOf(data.tagColor.color).toEqualTypeOf(); + expect(data.tagColor.toString).toBeDefined(); + expectTypeOf(data.tagColor.toString).toEqualTypeOf<() => ColorString>(); + expect(data.tagColor.toString()).toBeDefined(); + expectTypeOf(data.tagColor.toString()).toEqualTypeOf(); + expect(data.tagColor.toHex).toBeDefined(); + expectTypeOf(data.tagColor.toHex).toEqualTypeOf<() => ColorHex>(); + expect(data.tagColor.toHex()).toBeDefined(); + expectTypeOf(data.tagColor.toHex()).toEqualTypeOf(); + expect(data.tagColor.toCode).toBeDefined(); + expectTypeOf(data.tagColor.toCode).toEqualTypeOf<() => ColorCode>(); + expect(data.tagColor.toCode()).toBeDefined(); + expectTypeOf(data.tagColor.toCode()).toEqualTypeOf(); + expect(data.tagColor.toInGameCode).toBeDefined(); + expectTypeOf(data.tagColor.toInGameCode).toEqualTypeOf<() => InGameCode>(); + expect(data.tagColor.toInGameCode()).toBeDefined(); + expectTypeOf(data.tagColor.toInGameCode()).toEqualTypeOf(); + } + expect(data.expHistory).toBeDefined(); + expectTypeOf(data.expHistory).toEqualTypeOf(); + expect(data.achievements).toBeDefined(); + expectTypeOf(data.achievements).toEqualTypeOf<{ winners: number; experienceKings: number; onlinePlayers: number }>(); + expect(data.achievements.winners).toBeDefined(); + expectTypeOf(data.achievements.winners).toEqualTypeOf(); + expect(data.achievements.winners).toBeGreaterThanOrEqual(0); + expect(data.achievements.experienceKings).toBeDefined(); + expectTypeOf(data.achievements.experienceKings).toEqualTypeOf(); + expect(data.achievements.experienceKings).toBeGreaterThanOrEqual(0); + expect(data.preferredGames).toBeDefined(); + expectTypeOf(data.preferredGames).toEqualTypeOf(); + data.preferredGames.forEach((game: Game) => { + expect(game).toBeDefined(); + expectTypeOf(game).toEqualTypeOf(); + expect(game.game).toBeDefined(); + expectTypeOf(game.game).toEqualTypeOf(); + expect(game.id).toBeDefined(); + expectTypeOf(game.id).toEqualTypeOf(); + expect(game.code).toBeDefined(); + expectTypeOf(game.code).toEqualTypeOf(); + expect(game.name).toBeDefined(); + expectTypeOf(game.name).toEqualTypeOf(); + expect(game.found).toBeDefined(); + expectTypeOf(game.found).toEqualTypeOf(); + expect(game.toString()).toBeDefined(); + expect(game.toString()).toBe(game.name); + expectTypeOf(game.toString()).toEqualTypeOf(); + expect(Game.IDS).toBeDefined(); + expectTypeOf(Game.IDS).toEqualTypeOf(); + expect(Game.CODES).toBeDefined(); + expectTypeOf(Game.CODES).toEqualTypeOf(); + expect(Game.NAMES).toBeDefined(); + expectTypeOf(Game.NAMES).toEqualTypeOf(); + }); + expect(data.toString()).toBeDefined(); + expectTypeOf(data.toString()).toEqualTypeOf(); + expect(data.guildMaster()).toBeDefined(); + expect(data.guildMaster()).toBeInstanceOf(GuildMember); + expect(['Guild Master', 'GUILDMASTER']).toContain(data.guildMaster()?.rank); + expectTypeOf(data.guildMaster()).toEqualTypeOf(); + client.destroy(); +}); diff --git a/src/API/getGuild.ts b/src/API/getGuild.ts new file mode 100644 index 000000000..bafe9113c --- /dev/null +++ b/src/API/getGuild.ts @@ -0,0 +1,38 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import Guild from '../Structures/Guild/Guild.js'; +import RequestData from '../Private/RequestData.js'; +import { GuildFetchOptions } from '../Types/API.js'; +import type { RequestOptions } from '../Types/Requests.js'; + +class getGuild extends Endpoint { + readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute( + searchParameter: GuildFetchOptions, + query: string, + options?: RequestOptions + ): Promise { + if (!query) throw new Error(this.client.errors.NO_GUILD_QUERY); + if ('id' === searchParameter && !this.client.functions.isGuildID(query)) { + throw new Error(this.client.errors.INVALID_GUILD_ID); + } + const isPlayerQuery = 'player' === searchParameter; + if (isPlayerQuery) query = await this.client.requestHandler.toUUID(query); + if (!['id', 'name', 'player'].includes(searchParameter)) { + throw new Error(this.client.errors.INVALID_GUILD_SEARCH_PARAMETER); + } + const res = await this.client.requestHandler.request(`/guild?${searchParameter}=${encodeURI(query)}`, options); + if (res.options.raw) return res; + if (!res.data.guild && 'player' !== searchParameter) { + throw new Error(this.client.errors.GUILD_DOES_NOT_EXIST); + } + return res.data.guild ? new Guild(res.data.guild, isPlayerQuery ? query : undefined) : null; + } +} + +export default getGuild; diff --git a/src/API/getGuildAchievements.js b/src/API/getGuildAchievements.js deleted file mode 100644 index 982ebc7a1..000000000 --- a/src/API/getGuildAchievements.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = async function () { - const GuildAchievements = require('../structures/Static/GuildAchievements'); - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest('/resources/guilds/achievements'); - if (res.raw) return res; - return new GuildAchievements(res); -}; diff --git a/src/API/getGuildAchievements.test.ts b/src/API/getGuildAchievements.test.ts new file mode 100644 index 000000000..a66392d61 --- /dev/null +++ b/src/API/getGuildAchievements.test.ts @@ -0,0 +1,83 @@ +import Client from '../Client.js'; +import GuildAchievements from '../Structures/Static/Achievements/GuildAchievements.js'; +import OneTimeAchivement from '../Structures/Static/Achievements/OneTimeAchivement.js'; +import RequestData from '../Private/RequestData.js'; +import TieredAchivement from '../Structures/Static/Achievements/TieredAchivement.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { AchivementTier } from '../Types/Static.js'; + +test('getGuildAchievements (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getGuildAchievements({ raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getGuildAchievements', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getGuildAchievements(); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as GuildAchievements; + expect(data.lastUpdatedTimestamp).toBeDefined(); + expectTypeOf(data.lastUpdatedTimestamp).toEqualTypeOf(); + expect(data.lastUpdatedAt).toBeDefined(); + expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); + expect(data.oneTimeAchievements).toBeDefined(); + expectTypeOf(data.oneTimeAchievements).toEqualTypeOf(); + data.oneTimeAchievements.forEach((achievement: OneTimeAchivement) => { + expect(achievement.codeName).toBeDefined(); + expectTypeOf(achievement.codeName).toEqualTypeOf(); + expect(achievement.name).toBeDefined(); + expectTypeOf(achievement.name).toEqualTypeOf(); + expect(achievement.description).toBeDefined(); + expectTypeOf(achievement.description).toEqualTypeOf(); + expect(achievement.secret).toBeDefined(); + expectTypeOf(achievement.secret).toEqualTypeOf(); + expect(achievement.legacy).toBeDefined(); + expectTypeOf(achievement.legacy).toEqualTypeOf(); + expect(achievement.points).toBeDefined(); + expectTypeOf(achievement.points).toEqualTypeOf(); + expect(achievement.gamePercentUnlocked).toBeDefined(); + expectTypeOf(achievement.gamePercentUnlocked).toEqualTypeOf(); + expect(achievement.globalPercentUnlocked).toBeDefined(); + expectTypeOf(achievement.globalPercentUnlocked).toEqualTypeOf(); + expect(achievement.toString()).toBeDefined(); + expect(achievement.toString()).toBe(achievement.codeName); + expectTypeOf(achievement.toString()).toEqualTypeOf(); + }); + expect(data.tieredAchievements).toBeDefined(); + expectTypeOf(data.tieredAchievements).toEqualTypeOf(); + data.tieredAchievements.forEach((achievement: TieredAchivement) => { + expect(achievement.codeName).toBeDefined(); + expectTypeOf(achievement.codeName).toEqualTypeOf(); + expect(achievement.name).toBeDefined(); + expectTypeOf(achievement.name).toEqualTypeOf(); + expect(achievement.description).toBeDefined(); + expectTypeOf(achievement.description).toEqualTypeOf(); + expect(achievement.secret).toBeDefined(); + expectTypeOf(achievement.secret).toEqualTypeOf(); + expect(achievement.legacy).toBeDefined(); + expectTypeOf(achievement.legacy).toEqualTypeOf(); + expect(achievement.tiers).toBeDefined(); + expectTypeOf(achievement.tiers).toEqualTypeOf(); + achievement.tiers.forEach((tier) => { + expect(tier).toBeDefined(); + expectTypeOf(tier).toEqualTypeOf(); + expect(tier.tier).toBeDefined(); + expect(tier.tier).toBeGreaterThanOrEqual(0); + expectTypeOf(tier.tier).toEqualTypeOf(); + expect(tier.points).toBeUndefined(); + expectTypeOf(tier.points).toEqualTypeOf(); + expect(tier.amount).toBeDefined(); + expect(tier.amount).toBeGreaterThanOrEqual(0); + expectTypeOf(tier.amount).toEqualTypeOf(); + }); + expect(achievement.toString()).toBeDefined(); + expect(achievement.toString()).toBe(achievement.codeName); + expectTypeOf(achievement.toString()).toEqualTypeOf(); + }); + client.destroy(); +}); diff --git a/src/API/getGuildAchievements.ts b/src/API/getGuildAchievements.ts new file mode 100644 index 000000000..8104e4c49 --- /dev/null +++ b/src/API/getGuildAchievements.ts @@ -0,0 +1,21 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import GuildAchievements from '../Structures/Static/Achievements/GuildAchievements.js'; +import RequestData from '../Private/RequestData.js'; +import type { RequestOptions } from '../Types/Requests.js'; + +class getGuildAchievements extends Endpoint { + readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute(options?: RequestOptions): Promise { + const res = await this.client.requestHandler.request('/resources/guilds/achievements', options); + if (res.options.raw) return res; + return new GuildAchievements(res.data); + } +} + +export default getGuildAchievements; diff --git a/src/API/getHouse.test.ts b/src/API/getHouse.test.ts new file mode 100644 index 000000000..7a66fa334 --- /dev/null +++ b/src/API/getHouse.test.ts @@ -0,0 +1,51 @@ +import Client from '../Client.js'; +import House from '../Structures/House.js'; +import RequestData from '../Private/RequestData.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('getHouse (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const houses = (await client.getActiveHouses()) as House[]; + if (undefined === houses[0]) return; + const data = await client.getHouse(houses[0].uuid, { raw: true }); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getHouse (no input)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + expect(() => client.getHouse()).rejects.toThrowError(client.errors.NO_UUID); + client.destroy(); +}); + +test('getHouse', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const houses = (await client.getActiveHouses()) as House[]; + if (undefined === houses[0]) return; + expect(houses).toBeDefined(); + expectTypeOf(houses).toEqualTypeOf(); + let data = await client.getHouse(houses[0].uuid); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as House; + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.uuid).toBeDefined(); + expectTypeOf(data.uuid).toEqualTypeOf(); + expect(data.owner).toBeDefined(); + expectTypeOf(data.owner).toEqualTypeOf(); + expect(data.createdAtTimestamp).toBeDefined(); + expectTypeOf(data.createdAtTimestamp).toEqualTypeOf(); + expect(data.createdAt).toBeDefined(); + expectTypeOf(data.createdAt).toEqualTypeOf(); + expect(data.players).toBeDefined(); + expectTypeOf(data.players).toEqualTypeOf(); + expect(data.cookies).toBeDefined(); + expectTypeOf(data.cookies).toEqualTypeOf(); + expect(data.toString()).toBeDefined(); + expectTypeOf(data.toString()).toEqualTypeOf(); + client.destroy(); +}); diff --git a/src/API/getHouse.ts b/src/API/getHouse.ts new file mode 100644 index 000000000..cc783a3d2 --- /dev/null +++ b/src/API/getHouse.ts @@ -0,0 +1,22 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import House from '../Structures/House.js'; +import RequestData from '../Private/RequestData.js'; +import type { RequestOptions } from '../Types/Requests.js'; + +class getHouse extends Endpoint { + readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute(query: string, options?: RequestOptions): Promise { + if (!query) throw new Error(this.client.errors.NO_UUID); + const res = await this.client.requestHandler.request(`/housing/house?house=${query}`, options); + if (res.options.raw) return res; + return new House(res.data); + } +} + +export default getHouse; diff --git a/src/API/getLeaderboards.js b/src/API/getLeaderboards.js deleted file mode 100644 index d7e17a86f..000000000 --- a/src/API/getLeaderboards.js +++ /dev/null @@ -1,15 +0,0 @@ -const Errors = require('../Errors'); -module.exports = async function () { - const Leaderboard = require('../structures/Leaderboard'); - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest('/leaderboards'); - if (res.raw) return res; - if (!res.leaderboards) throw new Error(Errors.SOMETHING_WENT_WRONG.replace(/{cause}/, 'Try again.')); - const lbnames = Object.create(require('../utils/Constants').leaderboardNames); - for (const name in lbnames) { - lbnames[name] = res.leaderboards[lbnames[name]].length - ? res.leaderboards[lbnames[name]].map((lb) => new Leaderboard(lb)) - : []; - } - return lbnames; -}; diff --git a/src/API/getLeaderboards.test.ts b/src/API/getLeaderboards.test.ts new file mode 100644 index 000000000..c0b0fb316 --- /dev/null +++ b/src/API/getLeaderboards.test.ts @@ -0,0 +1,65 @@ +import Client from '../Client.js'; +import Leaderboard from '../Structures/Leaderboard.js'; +import RequestData from '../Private/RequestData.js'; +import { defaultRequestData } from '../../vitest.setup.js'; +import { expect, expectTypeOf, test, vi } from 'vitest'; + +test('getLeaderboards (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getLeaderboards({ raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf | RequestData>(); + client.destroy(); +}); + +test('getLeaderboards', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getLeaderboards(); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf | RequestData>(); + data = data as Record; + Object.keys(data).forEach((key) => { + if (undefined === data[key]) return; + expect(data[key]).toBeDefined(); + expectTypeOf(data[key]).toEqualTypeOf(); + data[key].forEach((leaderboard: Leaderboard) => { + expect(leaderboard).toBeDefined(); + expect(leaderboard).instanceOf(Leaderboard); + expectTypeOf(leaderboard).toEqualTypeOf(); + + expect(leaderboard.path).toBeDefined(); + expectTypeOf(leaderboard.path).toEqualTypeOf(); + expect(leaderboard.prefix).toBeDefined(); + expectTypeOf(leaderboard.prefix).toEqualTypeOf(); + expect(leaderboard.title).toBeDefined(); + expectTypeOf(leaderboard.title).toEqualTypeOf(); + expect(leaderboard.location).toBeDefined(); + expectTypeOf(leaderboard.location).toEqualTypeOf(); + expect(leaderboard.count).toBeDefined(); + expect(leaderboard.count).toBeGreaterThanOrEqual(0); + expectTypeOf(leaderboard.count).toEqualTypeOf(); + expect(leaderboard.leaders).toBeDefined(); + expectTypeOf(leaderboard.leaders).toEqualTypeOf(); + leaderboard.leaders.forEach((leader: string) => { + expect(leader).toBeDefined(); + expectTypeOf(leader).toEqualTypeOf(); + }); + }); + }); + client.destroy(); +}); + +test('getLeaderboards (Missing Data)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? ''); + vi.spyOn(global, 'fetch').mockResolvedValue({ + ...defaultRequestData, + json: () => Promise.resolve({ success: true }) + } as any); + + expect(() => client.getLeaderboards()).rejects.toThrowError( + client.errors.SOMETHING_WENT_WRONG.replace(/{cause}/, 'Try again.') + ); + vi.restoreAllMocks(); + client.destroy(); +}); diff --git a/src/API/getLeaderboards.ts b/src/API/getLeaderboards.ts new file mode 100644 index 000000000..440069366 --- /dev/null +++ b/src/API/getLeaderboards.ts @@ -0,0 +1,28 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import Leaderboard from '../Structures/Leaderboard.js'; +import RequestData from '../Private/RequestData.js'; +import type { RequestOptions } from '../Types/Requests.js'; + +class getLeaderboards extends Endpoint { + readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute(options?: RequestOptions): Promise | RequestData> { + const res = await this.client.requestHandler.request('/leaderboards', options); + if (res.options.raw) return res; + if (!res.data.leaderboards) { + throw new Error(this.client.errors.SOMETHING_WENT_WRONG.replace(/{cause}/, 'Try again.')); + } + const leaderboards: Record = {}; + Object.keys(res.data.leaderboards).forEach((key) => { + leaderboards[key] = res.data.leaderboards[key].map((l: Record) => new Leaderboard(l)); + }); + return leaderboards; + } +} + +export default getLeaderboards; diff --git a/src/API/getPlayer.js b/src/API/getPlayer.js deleted file mode 100644 index c305cb03f..000000000 --- a/src/API/getPlayer.js +++ /dev/null @@ -1,23 +0,0 @@ -const Errors = require('../Errors'); -const toUuid = require('../utils/toUuid'); -const getGuild = require('./getGuild'); -const getRecentGames = require('./getRecentGames'); -module.exports = async function (query, options = { guild: false, recentGames: false }) { - if (!query) throw new Error(Errors.NO_NICKNAME_UUID); - const Player = require('../structures/Player'); - query = await toUuid(query, this.options.mojangCacheTime, this.options.useThirdPartyAPI); - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest(`/player?uuid=${query}`); - if (res.raw) return res; - if (query && !res.player) throw new Error(Errors.PLAYER_HAS_NEVER_LOGGED); - let guild = null; - let recentGames = null; - if (options.guild) { - guild = getGuild.call(this, 'player', query); - } - if (options.recentGames) { - recentGames = getRecentGames.call(this, query); - } - [guild, recentGames] = await Promise.all([guild, recentGames]); - return new Player(res.player, { guild, recentGames }); -}; diff --git a/src/API/getPlayer.test.ts b/src/API/getPlayer.test.ts new file mode 100644 index 000000000..a08580e43 --- /dev/null +++ b/src/API/getPlayer.test.ts @@ -0,0 +1,664 @@ +import Arcade from '../Structures/MiniGames/Arcade/Arcade.js'; +import ArenaBrawl from '../Structures/MiniGames/ArenaBrawl/ArenaBrawl.js'; +import BedWars from '../Structures/MiniGames/BedWars/BedWars.js'; +import BlitzSurvivalGames from '../Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.js'; +import BuildBattle from '../Structures/MiniGames/BuildBattle.js'; +import Client from '../Client.js'; +import Color from '../Structures/Color.js'; +import CopsAndCrims from '../Structures/MiniGames/CopsAndCrims/CopsAndCrims.js'; +import Cosmetics from '../Structures/Player/Cosmetics.js'; +import Duels from '../Structures/MiniGames/Duels/Duels.js'; +import Gifting from '../Structures/Player/Gifting.js'; +import Guild from '../Structures/Guild/Guild.js'; +import House from '../Structures/House.js'; +import Housing from '../Structures/Housing.js'; +import MegaWalls from '../Structures/MiniGames/MegaWalls/MegaWalls.js'; +import MurderMystery from '../Structures/MiniGames/MurderMystery/MurderMystery.js'; +import Paintball from '../Structures/MiniGames/Paintball.js'; +import Parkour from '../Structures/Player/Parkour.js'; +import Pit from '../Structures/MiniGames/Pit/Pit.js'; +import Player from '../Structures/Player/Player.js'; +import PlayerAchievements from '../Structures/Player/PlayerAchievements.js'; +import PlayerQuests from '../Structures/Player/Quests/PlayerQuests.js'; +import Quakecraft from '../Structures/MiniGames/Quakecraft/Quakecraft.js'; +import RecentGame from '../Structures/RecentGame.js'; +import RequestData from '../Private/RequestData.js'; +import Rewards from '../Structures/Player/Rewards.js'; +import Seasonal from '../Structures/Player/Seasonal/Seasonal.js'; +import SkyWars from '../Structures/MiniGames/SkyWars/SkyWars.js'; +import SmashHeroes from '../Structures/MiniGames/SmashHeroes/SmashHeroes.js'; +import SocialMedia from '../Structures/Player/SocialMedia.js'; +import SpeedUHC from '../Structures/MiniGames/SpeedUHC/SpeedUHC.js'; +import TNTGames from '../Structures/MiniGames/TNTGames/TNTGames.js'; +import Tourney from '../Structures/Player/Tourney/Tourney.js'; +import TurboKartRacers from '../Structures/MiniGames/TurboKartRacers/TurboKartRacers.js'; +import UHC from '../Structures/MiniGames/UHC/UHC.js'; +import VampireZ from '../Structures/MiniGames/VampireZ/VampireZ.js'; +import Walls from '../Structures/MiniGames/Walls.js'; +import Warlords from '../Structures/MiniGames/Warlords/Warlords.js'; +import WoolGames from '../Structures/MiniGames/WoolGames/WoolGames.js'; +import { ChatChannel, Language, LevelProgress, PlayerRank, PlayerStats, ScorpiusBribe } from '../Types/Player.js'; +import { defaultRequestData } from '../../vitest.setup.js'; +import { expect, expectTypeOf, test, vi } from 'vitest'; + +test('getPlayer (never joinned hypixel)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + vi.spyOn(global, 'fetch').mockResolvedValue({ + ...defaultRequestData, + json: () => Promise.resolve({ success: true }) + } as any); + + await expect(() => client.getPlayer('14727faefbdc4aff848cd2713eb9939e')).rejects.toThrowError( + client.errors.PLAYER_HAS_NEVER_LOGGED + ); + vi.restoreAllMocks(); + client.destroy(); +}); + +test('getPlayer (no input)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + expect(() => client.getPlayer()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); + client.destroy(); +}); + +test('getPLayer (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getPlayer('4855c53ee4fb4100997600a92fc50984', { raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getPlayer (guild)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getPlayer('28667672039044989b0019b14a2c34d6', { guild: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Player); + expectTypeOf(data).toEqualTypeOf(); + data = data as Player; + expect(data.uuid).toBeDefined(); + expectTypeOf(data.uuid).toEqualTypeOf(); + expect(data.nickname).toBeDefined(); + expectTypeOf(data.nickname).toEqualTypeOf(); + expect(data.rank).toBeDefined(); + expectTypeOf(data.rank).toEqualTypeOf(); + expect(data.mvpPlusColor).toBeDefined(); + expectTypeOf(data.mvpPlusColor).toEqualTypeOf(); + expect(data.mvpPlusPlusColor).toBeDefined(); + expectTypeOf(data.mvpPlusPlusColor).toEqualTypeOf(); + expect(data.gifting).toBeDefined(); + expectTypeOf(data.gifting).toEqualTypeOf(); + expect(data.socialMedia).toBeDefined(); + expectTypeOf(data.socialMedia).toEqualTypeOf(); + expect(data.firstLoginTimestamp).toBeDefined(); + expect(data.firstLoginTimestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.firstLoginTimestamp).toEqualTypeOf(); + expect(data.firstLoginAt).toBeDefined(); + expectTypeOf(data.firstLoginAt).toEqualTypeOf(); + expect(data.lastLoginTimestamp).toBeDefined(); + expectTypeOf(data.lastLoginTimestamp).toEqualTypeOf(); + expect(data.lastLoginAt).toBeDefined(); + expectTypeOf(data.lastLoginAt).toEqualTypeOf(); + expect(data.achievements).toBeDefined(); + expectTypeOf(data.achievements).toEqualTypeOf(); + expect(data.language).toBeDefined(); + expectTypeOf(data.language).toEqualTypeOf(); + expect(data.channel).toBeDefined(); + expectTypeOf(data.channel).toEqualTypeOf(); + expect(data.exp).toBeDefined(); + expect(data.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.exp).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.seasonal).toBeDefined(); + expectTypeOf(data.seasonal).toEqualTypeOf(); + expect(data.karma).toBeDefined(); + expect(data.karma).toBeGreaterThanOrEqual(0); + expectTypeOf(data.karma).toEqualTypeOf(); + expect(data.freeSkyblockCookie).toBeDefined(); + expectTypeOf(data.freeSkyblockCookie).toEqualTypeOf(); + expect(data.tourney).toBeDefined(); + expectTypeOf(data.tourney).toEqualTypeOf(); + expect(data.rewards).toBeDefined(); + expectTypeOf(data.rewards).toEqualTypeOf(); + expect(data.challenges).toBeDefined(); + expectTypeOf(data.challenges).toEqualTypeOf(); + expect(data.parkour).toBeDefined(); + expectTypeOf(data.parkour).toEqualTypeOf(); + expect(data.housing).toBeDefined(); + expectTypeOf(data.housing).toEqualTypeOf(); + expect(data.cosmetics).toBeDefined(); + expectTypeOf(data.cosmetics).toEqualTypeOf(); + expect(data.scorpiusBribes).toBeDefined(); + expectTypeOf(data.scorpiusBribes).toEqualTypeOf(); + expect(data.quests).toBeDefined(); + expectTypeOf(data.quests).toEqualTypeOf(); + expect(data.guild).toBeDefined(); + expect(data.guild).toBeInstanceOf(Guild); + expectTypeOf(data.guild).toEqualTypeOf(); + expect(data.houses).toBeDefined(); + expect(data.houses).toBeNull(); + expectTypeOf(data.houses).toEqualTypeOf(); + expect(data.recentGames).toBeDefined(); + expect(data.recentGames).toBeNull(); + expectTypeOf(data.recentGames).toEqualTypeOf(); + expect(data.stats).toBeDefined(); + expectTypeOf(data.stats).toEqualTypeOf(); + expect(data.stats.arcade).toBeDefined(); + expect(data.stats.arcade).toBeInstanceOf(Arcade); + expectTypeOf(data.stats.arcade).toEqualTypeOf(); + expect(data.stats.arenaBrawl).toBeDefined(); + expect(data.stats.arenaBrawl).toBeInstanceOf(ArenaBrawl); + expectTypeOf(data.stats.arenaBrawl).toEqualTypeOf(); + expect(data.stats.bedwars).toBeDefined(); + expect(data.stats.bedwars).toBeInstanceOf(BedWars); + expectTypeOf(data.stats.bedwars).toEqualTypeOf(); + expect(data.stats.blitzsg).toBeDefined(); + expect(data.stats.blitzsg).toBeInstanceOf(BlitzSurvivalGames); + expectTypeOf(data.stats.blitzsg).toEqualTypeOf(); + expect(data.stats.buildbattle).toBeDefined(); + expect(data.stats.buildbattle).toBeInstanceOf(BuildBattle); + expectTypeOf(data.stats.buildbattle).toEqualTypeOf(); + expect(data.stats.copsandcrims).toBeDefined(); + expect(data.stats.copsandcrims).toBeInstanceOf(CopsAndCrims); + expectTypeOf(data.stats.copsandcrims).toEqualTypeOf(); + expect(data.stats.duels).toBeDefined(); + expect(data.stats.duels).toBeInstanceOf(Duels); + expectTypeOf(data.stats.duels).toEqualTypeOf(); + expect(data.stats.megawalls).toBeDefined(); + expect(data.stats.megawalls).toBeInstanceOf(MegaWalls); + expectTypeOf(data.stats.megawalls).toEqualTypeOf(); + expect(data.stats.murdermystery).toBeDefined(); + expect(data.stats.murdermystery).toBeInstanceOf(MurderMystery); + expectTypeOf(data.stats.murdermystery).toEqualTypeOf(); + expect(data.stats.paintball).toBeDefined(); + expect(data.stats.paintball).toBeInstanceOf(Paintball); + expectTypeOf(data.stats.paintball).toEqualTypeOf(); + expect(data.stats.pit).toBeDefined(); + expect(data.stats.pit).toBeInstanceOf(Pit); + expectTypeOf(data.stats.pit).toEqualTypeOf(); + expect(data.stats.quakecraft).toBeDefined(); + expect(data.stats.quakecraft).toBeInstanceOf(Quakecraft); + expectTypeOf(data.stats.quakecraft).toEqualTypeOf(); + expect(data.stats.skywars).toBeDefined(); + expect(data.stats.skywars).toBeInstanceOf(SkyWars); + expectTypeOf(data.stats.skywars).toEqualTypeOf(); + expect(data.stats.smashheroes).toBeDefined(); + expect(data.stats.smashheroes).toBeInstanceOf(SmashHeroes); + expectTypeOf(data.stats.smashheroes).toEqualTypeOf(); + expect(data.stats.speeduhc).toBeDefined(); + expect(data.stats.speeduhc).toBeInstanceOf(SpeedUHC); + expectTypeOf(data.stats.speeduhc).toEqualTypeOf(); + expect(data.stats.tntgames).toBeDefined(); + expect(data.stats.tntgames).toBeInstanceOf(TNTGames); + expectTypeOf(data.stats.tntgames).toEqualTypeOf(); + expect(data.stats.turbokartracers).toBeDefined(); + expect(data.stats.turbokartracers).toBeInstanceOf(TurboKartRacers); + expectTypeOf(data.stats.turbokartracers).toEqualTypeOf(); + expect(data.stats.uhc).toBeDefined(); + expect(data.stats.uhc).toBeInstanceOf(UHC); + expectTypeOf(data.stats.uhc).toEqualTypeOf(); + expect(data.stats.vampirez).toBeDefined(); + expect(data.stats.vampirez).toBeInstanceOf(VampireZ); + expectTypeOf(data.stats.vampirez).toEqualTypeOf(); + expect(data.stats.walls).toBeDefined(); + expect(data.stats.walls).toBeInstanceOf(Walls); + expectTypeOf(data.stats.walls).toEqualTypeOf(); + expect(data.stats.warlords).toBeDefined(); + expect(data.stats.warlords).toBeInstanceOf(Warlords); + expectTypeOf(data.stats.warlords).toEqualTypeOf(); + expect(data.stats.woolgames).toBeDefined(); + expect(data.stats.woolgames).toBeInstanceOf(WoolGames); + expectTypeOf(data.stats.woolgames).toEqualTypeOf(); + client.destroy(); +}); + +test('getPlayer (houses)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getPlayer('618a96fec8b0493fa89427891049550b', { houses: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Player); + expectTypeOf(data).toEqualTypeOf(); + data = data as Player; + expect(data.houses).toBeDefined(); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Player); + expectTypeOf(data).toEqualTypeOf(); + expect(data.uuid).toBeDefined(); + expectTypeOf(data.uuid).toEqualTypeOf(); + expect(data.nickname).toBeDefined(); + expectTypeOf(data.nickname).toEqualTypeOf(); + expect(data.rank).toBeDefined(); + expectTypeOf(data.rank).toEqualTypeOf(); + expect(data.mvpPlusColor).toBeDefined(); + expectTypeOf(data.mvpPlusColor).toEqualTypeOf(); + expect(data.mvpPlusPlusColor).toBeDefined(); + expectTypeOf(data.mvpPlusPlusColor).toEqualTypeOf(); + expect(data.gifting).toBeDefined(); + expectTypeOf(data.gifting).toEqualTypeOf(); + expect(data.socialMedia).toBeDefined(); + expectTypeOf(data.socialMedia).toEqualTypeOf(); + expect(data.firstLoginTimestamp).toBeDefined(); + expect(data.firstLoginTimestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.firstLoginTimestamp).toEqualTypeOf(); + expect(data.firstLoginAt).toBeDefined(); + expectTypeOf(data.firstLoginAt).toEqualTypeOf(); + expect(data.lastLoginTimestamp).toBeDefined(); + expectTypeOf(data.lastLoginTimestamp).toEqualTypeOf(); + expect(data.lastLoginAt).toBeDefined(); + expectTypeOf(data.lastLoginAt).toEqualTypeOf(); + expect(data.achievements).toBeDefined(); + expectTypeOf(data.achievements).toEqualTypeOf(); + expect(data.language).toBeDefined(); + expectTypeOf(data.language).toEqualTypeOf(); + expect(data.channel).toBeDefined(); + expectTypeOf(data.channel).toEqualTypeOf(); + expect(data.exp).toBeDefined(); + expect(data.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.exp).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.seasonal).toBeDefined(); + expectTypeOf(data.seasonal).toEqualTypeOf(); + expect(data.karma).toBeDefined(); + expect(data.karma).toBeGreaterThanOrEqual(0); + expectTypeOf(data.karma).toEqualTypeOf(); + expect(data.freeSkyblockCookie).toBeDefined(); + expectTypeOf(data.freeSkyblockCookie).toEqualTypeOf(); + expect(data.tourney).toBeDefined(); + expectTypeOf(data.tourney).toEqualTypeOf(); + expect(data.rewards).toBeDefined(); + expectTypeOf(data.rewards).toEqualTypeOf(); + expect(data.challenges).toBeDefined(); + expectTypeOf(data.challenges).toEqualTypeOf(); + expect(data.parkour).toBeDefined(); + expectTypeOf(data.parkour).toEqualTypeOf(); + expect(data.housing).toBeDefined(); + expectTypeOf(data.housing).toEqualTypeOf(); + expect(data.cosmetics).toBeDefined(); + expectTypeOf(data.cosmetics).toEqualTypeOf(); + expect(data.scorpiusBribes).toBeDefined(); + expectTypeOf(data.scorpiusBribes).toEqualTypeOf(); + expect(data.quests).toBeDefined(); + expectTypeOf(data.quests).toEqualTypeOf(); + expect(data.guild).toBeDefined(); + expect(data.guild).toBeNull(); + expectTypeOf(data.guild).toEqualTypeOf(); + expectTypeOf(data.houses).toEqualTypeOf(); + if (data.houses) { + data.houses.forEach((house: House) => { + expect(house).toBeDefined(); + expect(house).toBeInstanceOf(House); + expectTypeOf(house).toEqualTypeOf(); + }); + } + expect(data.recentGames).toBeDefined(); + expect(data.recentGames).toBeNull(); + expectTypeOf(data.recentGames).toEqualTypeOf(); + expect(data.stats).toBeDefined(); + expectTypeOf(data.stats).toEqualTypeOf(); + expect(data.stats.arcade).toBeDefined(); + expect(data.stats.arcade).toBeInstanceOf(Arcade); + expectTypeOf(data.stats.arcade).toEqualTypeOf(); + expect(data.stats.arenaBrawl).toBeDefined(); + expect(data.stats.arenaBrawl).toBeInstanceOf(ArenaBrawl); + expectTypeOf(data.stats.arenaBrawl).toEqualTypeOf(); + expect(data.stats.bedwars).toBeDefined(); + expect(data.stats.bedwars).toBeInstanceOf(BedWars); + expectTypeOf(data.stats.bedwars).toEqualTypeOf(); + expect(data.stats.blitzsg).toBeDefined(); + expect(data.stats.blitzsg).toBeInstanceOf(BlitzSurvivalGames); + expectTypeOf(data.stats.blitzsg).toEqualTypeOf(); + expect(data.stats.buildbattle).toBeDefined(); + expect(data.stats.buildbattle).toBeInstanceOf(BuildBattle); + expectTypeOf(data.stats.buildbattle).toEqualTypeOf(); + expect(data.stats.copsandcrims).toBeDefined(); + expect(data.stats.copsandcrims).toBeInstanceOf(CopsAndCrims); + expectTypeOf(data.stats.copsandcrims).toEqualTypeOf(); + expect(data.stats.duels).toBeDefined(); + expect(data.stats.duels).toBeInstanceOf(Duels); + expectTypeOf(data.stats.duels).toEqualTypeOf(); + expect(data.stats.megawalls).toBeDefined(); + expect(data.stats.megawalls).toBeInstanceOf(MegaWalls); + expectTypeOf(data.stats.megawalls).toEqualTypeOf(); + expect(data.stats.murdermystery).toBeDefined(); + expect(data.stats.murdermystery).toBeInstanceOf(MurderMystery); + expectTypeOf(data.stats.murdermystery).toEqualTypeOf(); + expect(data.stats.paintball).toBeDefined(); + expect(data.stats.paintball).toBeInstanceOf(Paintball); + expectTypeOf(data.stats.paintball).toEqualTypeOf(); + expect(data.stats.pit).toBeDefined(); + expect(data.stats.pit).toBeInstanceOf(Pit); + expectTypeOf(data.stats.pit).toEqualTypeOf(); + expect(data.stats.quakecraft).toBeDefined(); + expect(data.stats.quakecraft).toBeInstanceOf(Quakecraft); + expectTypeOf(data.stats.quakecraft).toEqualTypeOf(); + expect(data.stats.skywars).toBeDefined(); + expect(data.stats.skywars).toBeInstanceOf(SkyWars); + expectTypeOf(data.stats.skywars).toEqualTypeOf(); + expect(data.stats.smashheroes).toBeDefined(); + expect(data.stats.smashheroes).toBeInstanceOf(SmashHeroes); + expectTypeOf(data.stats.smashheroes).toEqualTypeOf(); + expect(data.stats.speeduhc).toBeDefined(); + expect(data.stats.speeduhc).toBeInstanceOf(SpeedUHC); + expectTypeOf(data.stats.speeduhc).toEqualTypeOf(); + expect(data.stats.tntgames).toBeDefined(); + expect(data.stats.tntgames).toBeInstanceOf(TNTGames); + expectTypeOf(data.stats.tntgames).toEqualTypeOf(); + expect(data.stats.turbokartracers).toBeDefined(); + expect(data.stats.turbokartracers).toBeInstanceOf(TurboKartRacers); + expectTypeOf(data.stats.turbokartracers).toEqualTypeOf(); + expect(data.stats.uhc).toBeDefined(); + expect(data.stats.uhc).toBeInstanceOf(UHC); + expectTypeOf(data.stats.uhc).toEqualTypeOf(); + expect(data.stats.vampirez).toBeDefined(); + expect(data.stats.vampirez).toBeInstanceOf(VampireZ); + expectTypeOf(data.stats.vampirez).toEqualTypeOf(); + expect(data.stats.walls).toBeDefined(); + expect(data.stats.walls).toBeInstanceOf(Walls); + expectTypeOf(data.stats.walls).toEqualTypeOf(); + expect(data.stats.warlords).toBeDefined(); + expect(data.stats.warlords).toBeInstanceOf(Warlords); + expectTypeOf(data.stats.warlords).toEqualTypeOf(); + expect(data.stats.woolgames).toBeDefined(); + expect(data.stats.woolgames).toBeInstanceOf(WoolGames); + expectTypeOf(data.stats.woolgames).toEqualTypeOf(); + client.destroy(); +}); + +test('getPlayer (recent games)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getPlayer('37501e7512b845ab8796e2baf9e9677a', { recentGames: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Player); + expectTypeOf(data).toEqualTypeOf(); + data = data as Player; + expect(data.uuid).toBeDefined(); + expectTypeOf(data.uuid).toEqualTypeOf(); + expect(data.nickname).toBeDefined(); + expectTypeOf(data.nickname).toEqualTypeOf(); + expect(data.rank).toBeDefined(); + expectTypeOf(data.rank).toEqualTypeOf(); + expect(data.mvpPlusColor).toBeDefined(); + expectTypeOf(data.mvpPlusColor).toEqualTypeOf(); + expect(data.mvpPlusPlusColor).toBeDefined(); + expectTypeOf(data.mvpPlusPlusColor).toEqualTypeOf(); + expect(data.gifting).toBeDefined(); + expectTypeOf(data.gifting).toEqualTypeOf(); + expect(data.socialMedia).toBeDefined(); + expectTypeOf(data.socialMedia).toEqualTypeOf(); + expect(data.firstLoginTimestamp).toBeDefined(); + expect(data.firstLoginTimestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.firstLoginTimestamp).toEqualTypeOf(); + expect(data.firstLoginAt).toBeDefined(); + expectTypeOf(data.firstLoginAt).toEqualTypeOf(); + expect(data.lastLoginTimestamp).toBeDefined(); + expectTypeOf(data.lastLoginTimestamp).toEqualTypeOf(); + expect(data.lastLoginAt).toBeDefined(); + expectTypeOf(data.lastLoginAt).toEqualTypeOf(); + expect(data.achievements).toBeDefined(); + expectTypeOf(data.achievements).toEqualTypeOf(); + expect(data.language).toBeDefined(); + expectTypeOf(data.language).toEqualTypeOf(); + expect(data.channel).toBeDefined(); + expectTypeOf(data.channel).toEqualTypeOf(); + expect(data.exp).toBeDefined(); + expect(data.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.exp).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.seasonal).toBeDefined(); + expectTypeOf(data.seasonal).toEqualTypeOf(); + expect(data.karma).toBeDefined(); + expect(data.karma).toBeGreaterThanOrEqual(0); + expectTypeOf(data.karma).toEqualTypeOf(); + expect(data.freeSkyblockCookie).toBeDefined(); + expectTypeOf(data.freeSkyblockCookie).toEqualTypeOf(); + expect(data.tourney).toBeDefined(); + expectTypeOf(data.tourney).toEqualTypeOf(); + expect(data.rewards).toBeDefined(); + expectTypeOf(data.rewards).toEqualTypeOf(); + expect(data.challenges).toBeDefined(); + expectTypeOf(data.challenges).toEqualTypeOf(); + expect(data.parkour).toBeDefined(); + expectTypeOf(data.parkour).toEqualTypeOf(); + expect(data.housing).toBeDefined(); + expectTypeOf(data.housing).toEqualTypeOf(); + expect(data.cosmetics).toBeDefined(); + expectTypeOf(data.cosmetics).toEqualTypeOf(); + expect(data.scorpiusBribes).toBeDefined(); + expectTypeOf(data.scorpiusBribes).toEqualTypeOf(); + expect(data.quests).toBeDefined(); + expectTypeOf(data.quests).toEqualTypeOf(); + expect(data.guild).toBeDefined(); + expect(data.guild).toBeNull(); + expectTypeOf(data.guild).toEqualTypeOf(); + expect(data.houses).toBeDefined(); + expect(data.houses).toBeNull(); + expectTypeOf(data.houses).toEqualTypeOf(); + expect(data.recentGames).toBeDefined(); + expectTypeOf(data.recentGames).toEqualTypeOf(); + if (data.recentGames) { + data.recentGames.forEach((game: RecentGame) => { + expect(game).toBeDefined(); + expect(game).toBeInstanceOf(RecentGame); + expectTypeOf(game).toEqualTypeOf(); + }); + } + expect(data.stats).toBeDefined(); + expectTypeOf(data.stats).toEqualTypeOf(); + expect(data.stats.arcade).toBeDefined(); + expect(data.stats.arcade).toBeInstanceOf(Arcade); + expectTypeOf(data.stats.arcade).toEqualTypeOf(); + expect(data.stats.arenaBrawl).toBeDefined(); + expect(data.stats.arenaBrawl).toBeInstanceOf(ArenaBrawl); + expectTypeOf(data.stats.arenaBrawl).toEqualTypeOf(); + expect(data.stats.bedwars).toBeDefined(); + expect(data.stats.bedwars).toBeInstanceOf(BedWars); + expectTypeOf(data.stats.bedwars).toEqualTypeOf(); + expect(data.stats.blitzsg).toBeDefined(); + expect(data.stats.blitzsg).toBeInstanceOf(BlitzSurvivalGames); + expectTypeOf(data.stats.blitzsg).toEqualTypeOf(); + expect(data.stats.buildbattle).toBeDefined(); + expect(data.stats.buildbattle).toBeInstanceOf(BuildBattle); + expectTypeOf(data.stats.buildbattle).toEqualTypeOf(); + expect(data.stats.copsandcrims).toBeDefined(); + expect(data.stats.copsandcrims).toBeInstanceOf(CopsAndCrims); + expectTypeOf(data.stats.copsandcrims).toEqualTypeOf(); + expect(data.stats.duels).toBeDefined(); + expect(data.stats.duels).toBeInstanceOf(Duels); + expectTypeOf(data.stats.duels).toEqualTypeOf(); + expect(data.stats.megawalls).toBeDefined(); + expect(data.stats.megawalls).toBeInstanceOf(MegaWalls); + expectTypeOf(data.stats.megawalls).toEqualTypeOf(); + expect(data.stats.murdermystery).toBeDefined(); + expect(data.stats.murdermystery).toBeInstanceOf(MurderMystery); + expectTypeOf(data.stats.murdermystery).toEqualTypeOf(); + expect(data.stats.paintball).toBeDefined(); + expect(data.stats.paintball).toBeInstanceOf(Paintball); + expectTypeOf(data.stats.paintball).toEqualTypeOf(); + expect(data.stats.pit).toBeDefined(); + expect(data.stats.pit).toBeInstanceOf(Pit); + expectTypeOf(data.stats.pit).toEqualTypeOf(); + expect(data.stats.quakecraft).toBeDefined(); + expect(data.stats.quakecraft).toBeInstanceOf(Quakecraft); + expectTypeOf(data.stats.quakecraft).toEqualTypeOf(); + expect(data.stats.skywars).toBeDefined(); + expect(data.stats.skywars).toBeInstanceOf(SkyWars); + expectTypeOf(data.stats.skywars).toEqualTypeOf(); + expect(data.stats.smashheroes).toBeDefined(); + expect(data.stats.smashheroes).toBeInstanceOf(SmashHeroes); + expectTypeOf(data.stats.smashheroes).toEqualTypeOf(); + expect(data.stats.speeduhc).toBeDefined(); + expect(data.stats.speeduhc).toBeInstanceOf(SpeedUHC); + expectTypeOf(data.stats.speeduhc).toEqualTypeOf(); + expect(data.stats.tntgames).toBeDefined(); + expect(data.stats.tntgames).toBeInstanceOf(TNTGames); + expectTypeOf(data.stats.tntgames).toEqualTypeOf(); + expect(data.stats.turbokartracers).toBeDefined(); + expect(data.stats.turbokartracers).toBeInstanceOf(TurboKartRacers); + expectTypeOf(data.stats.turbokartracers).toEqualTypeOf(); + expect(data.stats.uhc).toBeDefined(); + expect(data.stats.uhc).toBeInstanceOf(UHC); + expectTypeOf(data.stats.uhc).toEqualTypeOf(); + expect(data.stats.vampirez).toBeDefined(); + expect(data.stats.vampirez).toBeInstanceOf(VampireZ); + expectTypeOf(data.stats.vampirez).toEqualTypeOf(); + expect(data.stats.walls).toBeDefined(); + expect(data.stats.walls).toBeInstanceOf(Walls); + expectTypeOf(data.stats.walls).toEqualTypeOf(); + expect(data.stats.warlords).toBeDefined(); + expect(data.stats.warlords).toBeInstanceOf(Warlords); + expectTypeOf(data.stats.warlords).toEqualTypeOf(); + expect(data.stats.woolgames).toBeDefined(); + expect(data.stats.woolgames).toBeInstanceOf(WoolGames); + expectTypeOf(data.stats.woolgames).toEqualTypeOf(); + client.destroy(); +}); + +test('getPlayer', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getPlayer('14727faefbdc4aff848cd2713eb9939e'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Player); + expectTypeOf(data).toEqualTypeOf(); + data = data as Player; + expect(data.uuid).toBeDefined(); + expectTypeOf(data.uuid).toEqualTypeOf(); + expect(data.nickname).toBeDefined(); + expectTypeOf(data.nickname).toEqualTypeOf(); + expect(data.rank).toBeDefined(); + expectTypeOf(data.rank).toEqualTypeOf(); + expect(data.mvpPlusColor).toBeDefined(); + expectTypeOf(data.mvpPlusColor).toEqualTypeOf(); + expect(data.mvpPlusPlusColor).toBeDefined(); + expectTypeOf(data.mvpPlusPlusColor).toEqualTypeOf(); + expect(data.gifting).toBeDefined(); + expectTypeOf(data.gifting).toEqualTypeOf(); + expect(data.socialMedia).toBeDefined(); + expectTypeOf(data.socialMedia).toEqualTypeOf(); + expect(data.firstLoginTimestamp).toBeDefined(); + expect(data.firstLoginTimestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.firstLoginTimestamp).toEqualTypeOf(); + expect(data.firstLoginAt).toBeDefined(); + expectTypeOf(data.firstLoginAt).toEqualTypeOf(); + expect(data.lastLoginTimestamp).toBeDefined(); + expectTypeOf(data.lastLoginTimestamp).toEqualTypeOf(); + expect(data.lastLoginAt).toBeDefined(); + expectTypeOf(data.lastLoginAt).toEqualTypeOf(); + expect(data.achievements).toBeDefined(); + expectTypeOf(data.achievements).toEqualTypeOf(); + expect(data.language).toBeDefined(); + expectTypeOf(data.language).toEqualTypeOf(); + expect(data.channel).toBeDefined(); + expectTypeOf(data.channel).toEqualTypeOf(); + expect(data.exp).toBeDefined(); + expect(data.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.exp).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.seasonal).toBeDefined(); + expectTypeOf(data.seasonal).toEqualTypeOf(); + expect(data.karma).toBeDefined(); + expect(data.karma).toBeGreaterThanOrEqual(0); + expectTypeOf(data.karma).toEqualTypeOf(); + expect(data.freeSkyblockCookie).toBeDefined(); + expectTypeOf(data.freeSkyblockCookie).toEqualTypeOf(); + expect(data.tourney).toBeDefined(); + expectTypeOf(data.tourney).toEqualTypeOf(); + expect(data.rewards).toBeDefined(); + expectTypeOf(data.rewards).toEqualTypeOf(); + expect(data.challenges).toBeDefined(); + expectTypeOf(data.challenges).toEqualTypeOf(); + expect(data.parkour).toBeDefined(); + expectTypeOf(data.parkour).toEqualTypeOf(); + expect(data.housing).toBeDefined(); + expectTypeOf(data.housing).toEqualTypeOf(); + expect(data.cosmetics).toBeDefined(); + expectTypeOf(data.cosmetics).toEqualTypeOf(); + expect(data.scorpiusBribes).toBeDefined(); + expectTypeOf(data.scorpiusBribes).toEqualTypeOf(); + expect(data.quests).toBeDefined(); + expectTypeOf(data.quests).toEqualTypeOf(); + expect(data.guild).toBeDefined(); + expect(data.guild).toBeNull(); + expectTypeOf(data.guild).toEqualTypeOf(); + expect(data.houses).toBeDefined(); + expect(data.houses).toBeNull(); + expectTypeOf(data.houses).toEqualTypeOf(); + expect(data.recentGames).toBeDefined(); + expect(data.recentGames).toBeNull(); + expectTypeOf(data.recentGames).toEqualTypeOf(); + expect(data.stats).toBeDefined(); + expectTypeOf(data.stats).toEqualTypeOf(); + expect(data.stats.arcade).toBeDefined(); + expect(data.stats.arcade).toBeInstanceOf(Arcade); + expectTypeOf(data.stats.arcade).toEqualTypeOf(); + expect(data.stats.arenaBrawl).toBeDefined(); + expect(data.stats.arenaBrawl).toBeInstanceOf(ArenaBrawl); + expectTypeOf(data.stats.arenaBrawl).toEqualTypeOf(); + expect(data.stats.bedwars).toBeDefined(); + expect(data.stats.bedwars).toBeInstanceOf(BedWars); + expectTypeOf(data.stats.bedwars).toEqualTypeOf(); + expect(data.stats.blitzsg).toBeDefined(); + expect(data.stats.blitzsg).toBeInstanceOf(BlitzSurvivalGames); + expectTypeOf(data.stats.blitzsg).toEqualTypeOf(); + expect(data.stats.buildbattle).toBeDefined(); + expect(data.stats.buildbattle).toBeInstanceOf(BuildBattle); + expectTypeOf(data.stats.buildbattle).toEqualTypeOf(); + expect(data.stats.copsandcrims).toBeDefined(); + expect(data.stats.copsandcrims).toBeInstanceOf(CopsAndCrims); + expectTypeOf(data.stats.copsandcrims).toEqualTypeOf(); + expect(data.stats.duels).toBeDefined(); + expect(data.stats.duels).toBeInstanceOf(Duels); + expectTypeOf(data.stats.duels).toEqualTypeOf(); + expect(data.stats.megawalls).toBeDefined(); + expect(data.stats.megawalls).toBeInstanceOf(MegaWalls); + expectTypeOf(data.stats.megawalls).toEqualTypeOf(); + expect(data.stats.murdermystery).toBeDefined(); + expect(data.stats.murdermystery).toBeInstanceOf(MurderMystery); + expectTypeOf(data.stats.murdermystery).toEqualTypeOf(); + expect(data.stats.paintball).toBeDefined(); + expect(data.stats.paintball).toBeInstanceOf(Paintball); + expectTypeOf(data.stats.paintball).toEqualTypeOf(); + expect(data.stats.pit).toBeDefined(); + expect(data.stats.pit).toBeInstanceOf(Pit); + expectTypeOf(data.stats.pit).toEqualTypeOf(); + expect(data.stats.quakecraft).toBeDefined(); + expect(data.stats.quakecraft).toBeInstanceOf(Quakecraft); + expectTypeOf(data.stats.quakecraft).toEqualTypeOf(); + expect(data.stats.skywars).toBeDefined(); + expect(data.stats.skywars).toBeInstanceOf(SkyWars); + expectTypeOf(data.stats.skywars).toEqualTypeOf(); + expect(data.stats.smashheroes).toBeDefined(); + expect(data.stats.smashheroes).toBeInstanceOf(SmashHeroes); + expectTypeOf(data.stats.smashheroes).toEqualTypeOf(); + expect(data.stats.speeduhc).toBeDefined(); + expect(data.stats.speeduhc).toBeInstanceOf(SpeedUHC); + expectTypeOf(data.stats.speeduhc).toEqualTypeOf(); + expect(data.stats.tntgames).toBeDefined(); + expect(data.stats.tntgames).toBeInstanceOf(TNTGames); + expectTypeOf(data.stats.tntgames).toEqualTypeOf(); + expect(data.stats.turbokartracers).toBeDefined(); + expect(data.stats.turbokartracers).toBeInstanceOf(TurboKartRacers); + expectTypeOf(data.stats.turbokartracers).toEqualTypeOf(); + expect(data.stats.uhc).toBeDefined(); + expect(data.stats.uhc).toBeInstanceOf(UHC); + expectTypeOf(data.stats.uhc).toEqualTypeOf(); + expect(data.stats.vampirez).toBeDefined(); + expect(data.stats.vampirez).toBeInstanceOf(VampireZ); + expectTypeOf(data.stats.vampirez).toEqualTypeOf(); + expect(data.stats.walls).toBeDefined(); + expect(data.stats.walls).toBeInstanceOf(Walls); + expectTypeOf(data.stats.walls).toEqualTypeOf(); + expect(data.stats.warlords).toBeDefined(); + expect(data.stats.warlords).toBeInstanceOf(Warlords); + expectTypeOf(data.stats.warlords).toEqualTypeOf(); + expect(data.stats.woolgames).toBeDefined(); + expect(data.stats.woolgames).toBeInstanceOf(WoolGames); + expectTypeOf(data.stats.woolgames).toEqualTypeOf(); + client.destroy(); +}); diff --git a/src/API/getPlayer.ts b/src/API/getPlayer.ts new file mode 100644 index 000000000..72ddf63f3 --- /dev/null +++ b/src/API/getPlayer.ts @@ -0,0 +1,31 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import Guild from '../Structures/Guild/Guild.js'; +import House from '../Structures/House.js'; +import Player from '../Structures/Player/Player.js'; +import RecentGame from '../Structures/RecentGame.js'; +import RequestData from '../Private/RequestData.js'; +import { PlayerRequestOptions } from '../Types/API.js'; + +class getPlayer extends Endpoint { + readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute(query: string, options?: PlayerRequestOptions): Promise { + if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); + query = await this.client.requestHandler.toUUID(query); + const res = await this.client.requestHandler.request(`/player?uuid=${query}`, options); + if (res.options.raw) return res; + if (query && !res.data.player) throw new Error(this.client.errors.PLAYER_HAS_NEVER_LOGGED); + return new Player(res.data.player, { + guild: options?.guild ? ((await this.client.getGuild('player', query)) as Guild) : null, + houses: options?.houses ? ((await this.client.getPlayerHouses(query)) as House[]) : null, + recentGames: options?.recentGames ? ((await this.client.getRecentGames(query)) as RecentGame[]) : null + }); + } +} + +export default getPlayer; diff --git a/src/API/getPlayerHouses.test.ts b/src/API/getPlayerHouses.test.ts new file mode 100644 index 000000000..8a083eaf5 --- /dev/null +++ b/src/API/getPlayerHouses.test.ts @@ -0,0 +1,52 @@ +import Client from '../Client.js'; +import House from '../Structures/House.js'; +import RequestData from '../Private/RequestData.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('getPlayerHouses (No input)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + expect(() => client.getPlayerHouses()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); + client.destroy(); +}); + +test('getPlayerHouses (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getPlayerHouses('69e04609da2a4e7dabb83546a971969e', { raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getPlayerHouses', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getPlayerHouses('69e04609da2a4e7dabb83546a971969e'); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as House[]; + data.forEach((house: House) => { + expect(house).toBeDefined(); + expect(house).toBeInstanceOf(House); + expectTypeOf(house).toEqualTypeOf(); + expect(house.name).toBeDefined(); + expectTypeOf(house.name).toEqualTypeOf(); + expect(house.uuid).toBeDefined(); + expectTypeOf(house.uuid).toEqualTypeOf(); + expect(house.owner).toBeDefined(); + expectTypeOf(house.owner).toEqualTypeOf(); + expect(house.createdAtTimestamp).toBeDefined(); + expectTypeOf(house.createdAtTimestamp).toEqualTypeOf(); + expect(house.createdAt).toBeDefined(); + expectTypeOf(house.createdAt).toEqualTypeOf(); + expect(house.players).toBeDefined(); + expectTypeOf(house.players).toEqualTypeOf(); + expect(house.cookies).toBeDefined(); + expectTypeOf(house.cookies).toEqualTypeOf(); + expect(house.toString()).toBeDefined(); + expectTypeOf(house.toString()).toEqualTypeOf(); + expect(house.toString()).toBe(house.name); + }); + client.destroy(); +}); diff --git a/src/API/getPlayerHouses.ts b/src/API/getPlayerHouses.ts new file mode 100644 index 000000000..3f337cf25 --- /dev/null +++ b/src/API/getPlayerHouses.ts @@ -0,0 +1,23 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import House from '../Structures/House.js'; +import RequestData from '../Private/RequestData.js'; +import type { RequestOptions } from '../Types/Requests.js'; + +class getPlayerHouses extends Endpoint { + readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute(query: string, options?: RequestOptions): Promise { + if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); + query = await this.client.requestHandler.toUUID(query); + const res = await this.client.requestHandler.request(`/housing/houses?player=${query}`, options); + if (res.options.raw) return res; + return res.data.map((h: any) => new House(h)); + } +} + +export default getPlayerHouses; diff --git a/src/API/getQuests.js b/src/API/getQuests.js deleted file mode 100644 index 1c6e4d634..000000000 --- a/src/API/getQuests.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = async function () { - const Quests = require('../structures/Static/Quests'); - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest('/resources/quests'); - if (res.raw) return res; - return new Quests(res); -}; diff --git a/src/API/getQuests.test.ts b/src/API/getQuests.test.ts new file mode 100644 index 000000000..0f432f113 --- /dev/null +++ b/src/API/getQuests.test.ts @@ -0,0 +1,62 @@ +import Client from '../Client.js'; +import GameQuests from '../Structures/Static/GameQuests.js'; +import Quest from '../Structures/Static/Quest.js'; +import QuestObjective from '../Structures/Static/QuestObjective.js'; +import Quests from '../Structures/Static/Quests.js'; +import RequestData from '../Private/RequestData.js'; +import { QuestReward, QuestType } from '../Types/Static.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('getQuests (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getQuests({ raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getQuests', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getQuests(); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Quests); + expectTypeOf(data).toEqualTypeOf(); + data = data as Quests; + expect(data.lastUpdatedTimestamp).toBeDefined(); + expectTypeOf(data.lastUpdatedTimestamp).toEqualTypeOf(); + expect(data.lastUpdatedTimestamp).toBeGreaterThanOrEqual(0); + expect(data.lastUpdatedAt).toBeDefined(); + expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); + expect(data.questsPerGame).toBeDefined(); + expectTypeOf(data.questsPerGame).toEqualTypeOf>(); + Object.keys(data.questsPerGame).forEach((game) => { + if (undefined === data.questsPerGame[game]) return; + expect(data.questsPerGame[game]).toBeDefined(); + expect(data.questsPerGame[game]).toBeInstanceOf(GameQuests); + expectTypeOf(data.questsPerGame[game]).toEqualTypeOf(); + expect(data.questsPerGame[game].game).toBeDefined(); + expect(data.questsPerGame[game].game).toBe(game); + expectTypeOf(data.questsPerGame[game].game).toEqualTypeOf(); + expect(data.questsPerGame[game].quests).toBeDefined(); + expectTypeOf(data.questsPerGame[game].quests).toEqualTypeOf(); + data.questsPerGame[game].quests.forEach((quest: Quest) => { + expect(quest).toBeDefined(); + expect(quest).toBeInstanceOf(Quest); + expectTypeOf(quest).toEqualTypeOf(); + expect(quest.id).toBeDefined(); + expectTypeOf(quest.id).toEqualTypeOf(); + expect(quest.name).toBeDefined(); + expectTypeOf(quest.name).toEqualTypeOf(); + expect(quest.description).toBeDefined(); + expectTypeOf(quest.description).toEqualTypeOf(); + expect(quest.rewards).toBeDefined(); + expectTypeOf(quest.rewards).toEqualTypeOf(); + expect(quest.type).toBeDefined(); + expectTypeOf(quest.type).toEqualTypeOf(); + expect(quest.objectives).toBeDefined(); + expectTypeOf(quest.objectives).toEqualTypeOf(); + }); + }); + client.destroy(); +}); diff --git a/src/API/getQuests.ts b/src/API/getQuests.ts new file mode 100644 index 000000000..90916181f --- /dev/null +++ b/src/API/getQuests.ts @@ -0,0 +1,21 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import Quests from '../Structures/Static/Quests.js'; +import RequestData from '../Private/RequestData.js'; +import type { RequestOptions } from '../Types/Requests.js'; + +class getQuests extends Endpoint { + readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute(options?: RequestOptions): Promise { + const res = await this.client.requestHandler.request('/resources/quests', options); + if (res.options.raw) return res; + return new Quests(res.data); + } +} + +export default getQuests; diff --git a/src/API/getRecentGames.js b/src/API/getRecentGames.js deleted file mode 100644 index eb4b69e42..000000000 --- a/src/API/getRecentGames.js +++ /dev/null @@ -1,14 +0,0 @@ -const toUuid = require('../utils/toUuid'); -const Errors = require('../Errors'); -module.exports = async function (query) { - if (!query) throw new Error(Errors.NO_NICKNAME_UUID); - const RecentGame = require('../structures/RecentGame'); - query = await toUuid(query, this.options.mojangCacheTime, this.options.useThirdPartyAPI); - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest(`/recentgames?uuid=${query}`); - if (res.raw) return res; - if (0 === res.games.length) { - return []; - } - return res.games.map((x) => new RecentGame(x)); -}; diff --git a/src/API/getRecentGames.test.ts b/src/API/getRecentGames.test.ts new file mode 100644 index 000000000..e9afa9ff4 --- /dev/null +++ b/src/API/getRecentGames.test.ts @@ -0,0 +1,55 @@ +import Client from '../Client.js'; +import Game from '../Structures/Game.js'; +import RecentGame from '../Structures/RecentGame.js'; +import RequestData from '../Private/RequestData.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('getRecentGames (no input)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + expect(() => client.getRecentGames()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); + client.destroy(); +}); + +test('getRecentGames (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getRecentGames('3b76b69ae5134296a730ed49171ad6f8', { raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getRecentGames', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getRecentGames('ea805d40e8284d8d8e64e9fc8ac301ca'); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as RecentGame[]; + data.forEach((game: RecentGame) => { + expect(game).toBeDefined(); + expectTypeOf(game).toEqualTypeOf(); + expect(game).toBeInstanceOf(RecentGame); + expect(game.game).toBeDefined(); + expectTypeOf(game.game).toEqualTypeOf(); + expect(game.dateTimestamp).toBeDefined(); + expectTypeOf(game.dateTimestamp).toEqualTypeOf(); + expect(game.dateAt).toBeDefined(); + expectTypeOf(game.dateAt).toEqualTypeOf(); + expect(game.mode).toBeDefined(); + expectTypeOf(game.mode).toEqualTypeOf(); + expect(game.map).toBeDefined(); + expectTypeOf(game.map).toEqualTypeOf(); + expect(game.ongoing).toBeDefined(); + expectTypeOf(game.ongoing).toEqualTypeOf(); + expect(game.endedTimestamp).toBeDefined(); + expectTypeOf(game.endedTimestamp).toEqualTypeOf(); + expect(game.endedAt).toBeDefined(); + expectTypeOf(game.endedAt).toEqualTypeOf(); + expect(game.toString()).toBeDefined(); + expect(game.toString()).toEqual(game.mode); + expectTypeOf(game.toString()).toEqualTypeOf(); + }); + client.destroy(); +}); diff --git a/src/API/getRecentGames.ts b/src/API/getRecentGames.ts new file mode 100644 index 000000000..b9630a804 --- /dev/null +++ b/src/API/getRecentGames.ts @@ -0,0 +1,23 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import RecentGame from '../Structures/RecentGame.js'; +import RequestData from '../Private/RequestData.js'; +import type { RequestOptions } from '../Types/Requests.js'; + +class getRecentGames extends Endpoint { + readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute(query: string, options?: RequestOptions): Promise { + if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); + query = await this.client.requestHandler.toUUID(query); + const res = await this.client.requestHandler.request(`/recentgames?uuid=${query}`, options); + if (res.options.raw) return res; + return res.data.games.map((x: any) => new RecentGame(x)); + } +} + +export default getRecentGames; diff --git a/src/API/getServerInfo.js b/src/API/getServerInfo.js deleted file mode 100644 index 505a16b03..000000000 --- a/src/API/getServerInfo.js +++ /dev/null @@ -1,71 +0,0 @@ -/* eslint-disable jsdoc/require-jsdoc */ -const ServerInfo = require('../structures/ServerInfo'); -const varInt = require('../utils/varInt'); -const Errors = require('../Errors'); -const net = require('net'); -const packetsToSend = ['1500E0050E6D632E6879706978656C2E6E657463DD01', '0100', '09010000000000000000'].map((x) => - // To avoid dependency hell, these are precompiled as hex. - Buffer.from(x, 'hex') -); - -async function ping(cli) { - await cli.write(packetsToSend[2]); - const time = Date.now(); - return new Promise((resolve) => { - cli.once('data', () => { - resolve(Date.now() - time); - }); - }); -} - -async function getPing(amount, cli) { - let pingSum = 0; - for (let i = 0; i < amount; i++) { - pingSum += await ping(cli); - } - cli.destroy(); - return Math.round(pingSum / amount); -} - -function parseData(stringJson, ping) { - try { - return new ServerInfo(JSON.parse(stringJson), ping); - } catch { - return undefined; - } -} - -module.exports = async function (repeats) { - if (0 > repeats || 'number' !== typeof repeats) repeats = 3; - if (10 < repeats) repeats = 10; - let aggregatedData = ''; - let dataLength = 0; - return await new Promise((resolve, reject) => { - const cli = net.createConnection(25565, 'mc.hypixel.net', () => { - cli.write(packetsToSend[0]); - cli.write(packetsToSend[1]); - }); - cli.on('error', () => { - reject(Errors.CONNECTION_ERROR); - }); - cli.on('data', async (data) => { - if (!aggregatedData) { - const varIntBorder = data.findIndex((x) => 0x00 === x) + 1; - dataLength = varInt( - data - .toString('hex', 0, varIntBorder) - .match(/(..)/g) - .map((x) => parseInt(x, 16)) - ); - dataLength -= varIntBorder * 8; - aggregatedData += data.toString('utf-8', 5); - } else { - aggregatedData += data.toString('utf-8'); - } - - if (dataLength >= aggregatedData.length) return; - cli.removeAllListeners('data'); - resolve(parseData(aggregatedData, await getPing(repeats, cli))); - }); - }); -}; diff --git a/src/API/getSkyblockAuction.test.ts b/src/API/getSkyblockAuction.test.ts new file mode 100644 index 000000000..2e2ef548e --- /dev/null +++ b/src/API/getSkyblockAuction.test.ts @@ -0,0 +1,376 @@ +import Auction from '../Structures/SkyBlock/Auctions/Auction.js'; +import Bid from '../Structures/SkyBlock/Auctions/Bid.js'; +import Client from '../Client.js'; +import ItemBytes from '../Structures/ItemBytes.js'; +import RequestData from '../Private/RequestData.js'; +import { Rarity } from '../Types/Skyblock.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('getSkyblockAuction (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const auctions = await client.getSkyblockAuctions(1); + if (undefined === auctions.auctions[0]) return; + if (!auctions.auctions[0].auctioneerUuid) throw new Error("Something wen't wrong while fetching auctions"); + const data = await client.getSkyblockAuction('player', auctions.auctions[0].auctioneerUuid, { raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getSkyblockAuction (No Query)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + expect(() => client.getSkyblockAuction('auction', '')).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); + client.destroy(); +}); + +test('getSkyblockAuction (Bad Filter)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + expect(() => client.getSkyblockAuction('meow')).rejects.toThrowError(client.errors.BAD_AUCTION_FILTER); + client.destroy(); +}); + +test('getSkyblockAuction (Auction)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const auctions = await client.getSkyblockAuctions(1); + if (undefined === auctions.auctions[0]) return; + if (!auctions.auctions[0].auctioneerUuid) throw new Error("Something wen't wrong while fetching auctions"); + let data = await client.getSkyblockAuction('auction', auctions.auctions[0].auctioneerUuid); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as Auction[]; + expect(data.length).toBeGreaterThanOrEqual(0); + expectTypeOf(data.length).toEqualTypeOf(); + data.forEach((auction: Auction) => { + expect(auction).toBeDefined(); + expect(auction).toBeInstanceOf(Auction); + expectTypeOf(auction).toEqualTypeOf(); + expect(auction.auctionId).toBeDefined(); + expectTypeOf(auction.auctionId).toEqualTypeOf(); + expect(auction.auctioneerUuid).toBeDefined(); + expectTypeOf(auction.auctioneerUuid).toEqualTypeOf(); + expect(auction.auctioneerProfile).toBeDefined(); + expectTypeOf(auction.auctioneerProfile).toEqualTypeOf(); + expect(auction.bin).toBeDefined(); + expectTypeOf(auction.bin).toEqualTypeOf(); + expect(auction.itemBytes).toBeDefined(); + expect(auction.itemBytes).toBeNull(); + expectTypeOf(auction.itemBytes).toEqualTypeOf(); + expect(auction.coop).toBeDefined(); + expectTypeOf(auction.coop).toEqualTypeOf(); + expect(auction.auctionStartTimestamp).toBeDefined(); + expect(auction.auctionStartTimestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(auction.auctionStartTimestamp).toEqualTypeOf(); + expect(auction.auctionStart).toBeDefined(); + expectTypeOf(auction.auctionStart).toEqualTypeOf(); + expect(auction.auctionEndTimestamp).toBeDefined(); + expectTypeOf(auction.auctionEndTimestamp).toEqualTypeOf(); + expect(auction.auctionEnd).toBeDefined(); + expectTypeOf(auction.auctionEnd).toEqualTypeOf(); + expect(auction.item).toBeDefined(); + expectTypeOf(auction.item).toEqualTypeOf(); + expect(auction.itemLore).toBeDefined(); + expectTypeOf(auction.itemLore).toEqualTypeOf(); + expect(auction.itemLoreRaw).toBeDefined(); + expectTypeOf(auction.itemLoreRaw).toEqualTypeOf(); + expect(auction.rarity).toBeDefined(); + expectTypeOf(auction.rarity).toEqualTypeOf(); + expect(auction.startingBid).toBeDefined(); + expectTypeOf(auction.startingBid).toEqualTypeOf(); + expect(auction.highestBid).toBeDefined(); + expectTypeOf(auction.highestBid).toEqualTypeOf(); + expect(auction.bids).toBeDefined(); + expectTypeOf(auction.bids).toEqualTypeOf(); + auction.bids.forEach((bid: Bid) => { + expect(bid).toBeDefined(); + expect(bid).toBeInstanceOf(Bid); + expectTypeOf(bid).toEqualTypeOf(); + expect(bid.auctionId).toBeDefined(); + expectTypeOf(bid.auctionId).toEqualTypeOf(); + expect(bid.profileId).toBeDefined(); + expectTypeOf(bid.profileId).toEqualTypeOf(); + expect(bid.amount).toBeDefined(); + expect(bid.amount).toBeGreaterThanOrEqual(0); + expectTypeOf(bid.amount).toEqualTypeOf(); + expect(bid.timestamp).toBeDefined(); + expectTypeOf(bid.timestamp).toEqualTypeOf(); + expect(bid.at).toBeDefined(); + expectTypeOf(bid.at).toEqualTypeOf(); + expect(bid.bidder).toBeDefined(); + expectTypeOf(bid.bidder).toEqualTypeOf(); + expect(bid.toString()).toBeDefined(); + expect(bid.toString()).toBe(`${bid.bidder} bid ${bid.amount} coins`); + expectTypeOf(bid.toString()).toEqualTypeOf(); + }); + expect(auction.claimed).toBeDefined(); + expectTypeOf(auction.claimed).toEqualTypeOf(); + expect(auction.claimedBidders).toBeDefined(); + expectTypeOf(auction.claimedBidders).toEqualTypeOf(); + expect(auction.toString()).toBeDefined(); + expect(auction.toString()).toEqual(auction.item); + expectTypeOf(auction.toString()).toEqualTypeOf(); + }); + client.destroy(); +}); + +test('getSkyblockAuction (Player)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const auctions = await client.getSkyblockAuctions(1); + if (undefined === auctions.auctions[0]) return; + if (!auctions.auctions[0].auctioneerUuid) throw new Error("Something wen't wrong while fetching auctions"); + let data = await client.getSkyblockAuction('player', auctions.auctions[0].auctioneerUuid); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as Auction[]; + expect(data.length).toBeGreaterThanOrEqual(0); + expectTypeOf(data.length).toEqualTypeOf(); + data.forEach((auction: Auction) => { + expect(auction).toBeDefined(); + expect(auction).toBeInstanceOf(Auction); + expectTypeOf(auction).toEqualTypeOf(); + expect(auction.auctionId).toBeDefined(); + expectTypeOf(auction.auctionId).toEqualTypeOf(); + expect(auction.auctioneerUuid).toBeDefined(); + expectTypeOf(auction.auctioneerUuid).toEqualTypeOf(); + expect(auction.auctioneerProfile).toBeDefined(); + expectTypeOf(auction.auctioneerProfile).toEqualTypeOf(); + expect(auction.bin).toBeDefined(); + expectTypeOf(auction.bin).toEqualTypeOf(); + expect(auction.itemBytes).toBeNull(); + expect(auction.itemBytes).toBeDefined(); + expectTypeOf(auction.itemBytes).toEqualTypeOf(); + expect(auction.coop).toBeDefined(); + expectTypeOf(auction.coop).toEqualTypeOf(); + expect(auction.auctionStartTimestamp).toBeDefined(); + expect(auction.auctionStartTimestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(auction.auctionStartTimestamp).toEqualTypeOf(); + expect(auction.auctionStart).toBeDefined(); + expectTypeOf(auction.auctionStart).toEqualTypeOf(); + expect(auction.auctionEndTimestamp).toBeDefined(); + expectTypeOf(auction.auctionEndTimestamp).toEqualTypeOf(); + expect(auction.auctionEnd).toBeDefined(); + expectTypeOf(auction.auctionEnd).toEqualTypeOf(); + expect(auction.item).toBeDefined(); + expectTypeOf(auction.item).toEqualTypeOf(); + expect(auction.itemLore).toBeDefined(); + expectTypeOf(auction.itemLore).toEqualTypeOf(); + expect(auction.itemLoreRaw).toBeDefined(); + expectTypeOf(auction.itemLoreRaw).toEqualTypeOf(); + expect(auction.rarity).toBeDefined(); + expectTypeOf(auction.rarity).toEqualTypeOf(); + expect(auction.startingBid).toBeDefined(); + expectTypeOf(auction.startingBid).toEqualTypeOf(); + expect(auction.highestBid).toBeDefined(); + expectTypeOf(auction.highestBid).toEqualTypeOf(); + expect(auction.bids).toBeDefined(); + expectTypeOf(auction.bids).toEqualTypeOf(); + auction.bids.forEach((bid: Bid) => { + expect(bid).toBeDefined(); + expect(bid).toBeInstanceOf(Bid); + expectTypeOf(bid).toEqualTypeOf(); + expect(bid.auctionId).toBeDefined(); + expectTypeOf(bid.auctionId).toEqualTypeOf(); + expect(bid.profileId).toBeDefined(); + expectTypeOf(bid.profileId).toEqualTypeOf(); + expect(bid.amount).toBeDefined(); + expect(bid.amount).toBeGreaterThanOrEqual(0); + expectTypeOf(bid.amount).toEqualTypeOf(); + expect(bid.timestamp).toBeDefined(); + expectTypeOf(bid.timestamp).toEqualTypeOf(); + expect(bid.at).toBeDefined(); + expectTypeOf(bid.at).toEqualTypeOf(); + expect(bid.bidder).toBeDefined(); + expectTypeOf(bid.bidder).toEqualTypeOf(); + expect(bid.toString()).toBeDefined(); + expect(bid.toString()).toBe(`${bid.bidder} bid ${bid.amount} coins`); + expectTypeOf(bid.toString()).toEqualTypeOf(); + }); + expect(auction.claimed).toBeDefined(); + expectTypeOf(auction.claimed).toEqualTypeOf(); + expect(auction.claimedBidders).toBeDefined(); + expectTypeOf(auction.claimedBidders).toEqualTypeOf(); + expect(auction.toString()).toBeDefined(); + expect(auction.toString()).toEqual(auction.item); + expectTypeOf(auction.toString()).toEqualTypeOf(); + }); + client.destroy(); +}); + +test('getSkyblockAuction (Profile)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const auctions = await client.getSkyblockAuctions(1); + if (undefined === auctions.auctions[0]) return; + if (!auctions.auctions[0].auctioneerProfile) throw new Error("Something wen't wrong while fetching auctions"); + let data = await client.getSkyblockAuction('profile', auctions.auctions[0].auctioneerProfile); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as Auction[]; + expect(data.length).toBeGreaterThanOrEqual(0); + expectTypeOf(data.length).toEqualTypeOf(); + data.forEach((auction: Auction) => { + expect(auction).toBeDefined(); + expect(auction).toBeInstanceOf(Auction); + expectTypeOf(auction).toEqualTypeOf(); + expect(auction.auctionId).toBeDefined(); + expectTypeOf(auction.auctionId).toEqualTypeOf(); + expect(auction.auctioneerUuid).toBeDefined(); + expectTypeOf(auction.auctioneerUuid).toEqualTypeOf(); + expect(auction.auctioneerProfile).toBeDefined(); + expectTypeOf(auction.auctioneerProfile).toEqualTypeOf(); + expect(auction.bin).toBeDefined(); + expectTypeOf(auction.bin).toEqualTypeOf(); + expect(auction.itemBytes).toBeDefined(); + expect(auction.itemBytes).toBeNull(); + expectTypeOf(auction.itemBytes).toEqualTypeOf(); + expect(auction.coop).toBeDefined(); + expectTypeOf(auction.coop).toEqualTypeOf(); + expect(auction.auctionStartTimestamp).toBeDefined(); + expect(auction.auctionStartTimestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(auction.auctionStartTimestamp).toEqualTypeOf(); + expect(auction.auctionStart).toBeDefined(); + expectTypeOf(auction.auctionStart).toEqualTypeOf(); + expect(auction.auctionEndTimestamp).toBeDefined(); + expectTypeOf(auction.auctionEndTimestamp).toEqualTypeOf(); + expect(auction.auctionEnd).toBeDefined(); + expectTypeOf(auction.auctionEnd).toEqualTypeOf(); + expect(auction.item).toBeDefined(); + expectTypeOf(auction.item).toEqualTypeOf(); + expect(auction.itemLore).toBeDefined(); + expectTypeOf(auction.itemLore).toEqualTypeOf(); + expect(auction.itemLoreRaw).toBeDefined(); + expectTypeOf(auction.itemLoreRaw).toEqualTypeOf(); + expect(auction.rarity).toBeDefined(); + expectTypeOf(auction.rarity).toEqualTypeOf(); + expect(auction.startingBid).toBeDefined(); + expectTypeOf(auction.startingBid).toEqualTypeOf(); + expect(auction.highestBid).toBeDefined(); + expectTypeOf(auction.highestBid).toEqualTypeOf(); + expect(auction.bids).toBeDefined(); + expectTypeOf(auction.bids).toEqualTypeOf(); + auction.bids.forEach((bid: Bid) => { + expect(bid).toBeDefined(); + expect(bid).toBeInstanceOf(Bid); + expectTypeOf(bid).toEqualTypeOf(); + expect(bid.auctionId).toBeDefined(); + expectTypeOf(bid.auctionId).toEqualTypeOf(); + expect(bid.profileId).toBeDefined(); + expectTypeOf(bid.profileId).toEqualTypeOf(); + expect(bid.amount).toBeDefined(); + expect(bid.amount).toBeGreaterThanOrEqual(0); + expectTypeOf(bid.amount).toEqualTypeOf(); + expect(bid.timestamp).toBeDefined(); + expectTypeOf(bid.timestamp).toEqualTypeOf(); + expect(bid.at).toBeDefined(); + expectTypeOf(bid.at).toEqualTypeOf(); + expect(bid.bidder).toBeDefined(); + expectTypeOf(bid.bidder).toEqualTypeOf(); + expect(bid.toString()).toBeDefined(); + expect(bid.toString()).toBe(`${bid.bidder} bid ${bid.amount} coins`); + expectTypeOf(bid.toString()).toEqualTypeOf(); + }); + expect(auction.claimed).toBeDefined(); + expectTypeOf(auction.claimed).toEqualTypeOf(); + expect(auction.claimedBidders).toBeDefined(); + expectTypeOf(auction.claimedBidders).toEqualTypeOf(); + expect(auction.toString()).toBeDefined(); + expect(auction.toString()).toEqual(auction.item); + expectTypeOf(auction.toString()).toEqualTypeOf(); + }); + client.destroy(); +}); + +test('getSkyblockAuction (Include Item Bytes)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const auctions = await client.getSkyblockAuctions(1); + if (undefined === auctions.auctions[0]) return; + if (!auctions.auctions[0].auctioneerProfile) throw new Error("Something wen't wrong while fetching auctions"); + let data = await client.getSkyblockAuction('profile', auctions.auctions[0].auctioneerProfile, { + includeItemBytes: true + }); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as Auction[]; + expect(data.length).toBeGreaterThanOrEqual(0); + expectTypeOf(data.length).toEqualTypeOf(); + data.forEach((auction: Auction) => { + expect(auction).toBeDefined(); + expect(auction).toBeInstanceOf(Auction); + expectTypeOf(auction).toEqualTypeOf(); + expect(auction.auctionId).toBeDefined(); + expectTypeOf(auction.auctionId).toEqualTypeOf(); + expect(auction.auctioneerUuid).toBeDefined(); + expectTypeOf(auction.auctioneerUuid).toEqualTypeOf(); + expect(auction.auctioneerProfile).toBeDefined(); + expectTypeOf(auction.auctioneerProfile).toEqualTypeOf(); + expect(auction.bin).toBeDefined(); + expectTypeOf(auction.bin).toEqualTypeOf(); + expect(auction.itemBytes).toBeDefined(); + expectTypeOf(auction.itemBytes).toEqualTypeOf(); + expect(auction.itemBytes).toBeDefined(); + if (auction.itemBytes) { + expect(auction.itemBytes).instanceOf(ItemBytes); + expect(auction.itemBytes.bytesBuffer).toBeDefined(); + expectTypeOf(auction.itemBytes.bytesBuffer).toEqualTypeOf(); + expect(auction.itemBytes.base64).toBeDefined(); + expectTypeOf(auction.itemBytes.base64).toEqualTypeOf<() => string>(); + expect(auction.itemBytes.base64()).toBeDefined(); + expectTypeOf(auction.itemBytes.base64()).toEqualTypeOf(); + } + expect(auction.coop).toBeDefined(); + expectTypeOf(auction.coop).toEqualTypeOf(); + expect(auction.auctionStartTimestamp).toBeDefined(); + expect(auction.auctionStartTimestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(auction.auctionStartTimestamp).toEqualTypeOf(); + expect(auction.auctionStart).toBeDefined(); + expectTypeOf(auction.auctionStart).toEqualTypeOf(); + expect(auction.auctionEndTimestamp).toBeDefined(); + expectTypeOf(auction.auctionEndTimestamp).toEqualTypeOf(); + expect(auction.auctionEnd).toBeDefined(); + expectTypeOf(auction.auctionEnd).toEqualTypeOf(); + expect(auction.item).toBeDefined(); + expectTypeOf(auction.item).toEqualTypeOf(); + expect(auction.itemLore).toBeDefined(); + expectTypeOf(auction.itemLore).toEqualTypeOf(); + expect(auction.itemLoreRaw).toBeDefined(); + expectTypeOf(auction.itemLoreRaw).toEqualTypeOf(); + expect(auction.rarity).toBeDefined(); + expectTypeOf(auction.rarity).toEqualTypeOf(); + expect(auction.startingBid).toBeDefined(); + expectTypeOf(auction.startingBid).toEqualTypeOf(); + expect(auction.highestBid).toBeDefined(); + expectTypeOf(auction.highestBid).toEqualTypeOf(); + expect(auction.bids).toBeDefined(); + expectTypeOf(auction.bids).toEqualTypeOf(); + auction.bids.forEach((bid: Bid) => { + expect(bid).toBeDefined(); + expect(bid).toBeInstanceOf(Bid); + expectTypeOf(bid).toEqualTypeOf(); + expect(bid.auctionId).toBeDefined(); + expectTypeOf(bid.auctionId).toEqualTypeOf(); + expect(bid.profileId).toBeDefined(); + expectTypeOf(bid.profileId).toEqualTypeOf(); + expect(bid.amount).toBeDefined(); + expect(bid.amount).toBeGreaterThanOrEqual(0); + expectTypeOf(bid.amount).toEqualTypeOf(); + expect(bid.timestamp).toBeDefined(); + expectTypeOf(bid.timestamp).toEqualTypeOf(); + expect(bid.at).toBeDefined(); + expectTypeOf(bid.at).toEqualTypeOf(); + expect(bid.bidder).toBeDefined(); + expectTypeOf(bid.bidder).toEqualTypeOf(); + expect(bid.toString()).toBeDefined(); + expect(bid.toString()).toBe(`${bid.bidder} bid ${bid.amount} coins`); + expectTypeOf(bid.toString()).toEqualTypeOf(); + }); + expect(auction.claimed).toBeDefined(); + expectTypeOf(auction.claimed).toEqualTypeOf(); + expect(auction.claimedBidders).toBeDefined(); + expectTypeOf(auction.claimedBidders).toEqualTypeOf(); + expect(auction.toString()).toBeDefined(); + expect(auction.toString()).toEqual(auction.item); + expectTypeOf(auction.toString()).toEqualTypeOf(); + }); + client.destroy(); +}); diff --git a/src/API/getSkyblockAuction.ts b/src/API/getSkyblockAuction.ts new file mode 100644 index 000000000..9a60cc459 --- /dev/null +++ b/src/API/getSkyblockAuction.ts @@ -0,0 +1,37 @@ +import Auction from '../Structures/SkyBlock/Auctions/Auction.js'; +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import RequestData from '../Private/RequestData.js'; +import { AuctionFetchOptions, AuctionRequestOptions } from '../Types/API.js'; + +class getSkyblockAction extends Endpoint { + readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute( + type: AuctionFetchOptions, + query: string, + options?: AuctionRequestOptions + ): Promise { + let filter; + if ('profile' === type) { + filter = 'profile'; + } else if ('player' === type && query) { + query = await this.client.requestHandler.toUUID(query); + filter = 'player'; + } else if ('auction' === type) { + filter = 'uuid'; + } else { + throw new Error(this.client.errors.BAD_AUCTION_FILTER); + } + if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); + const res = await this.client.requestHandler.request(`/skyblock/auction?${filter}=${query}`, options); + if (res.options.raw) return res; + return res.data.auctions.map((a: any) => new Auction(a, options?.includeItemBytes ?? false)); + } +} + +export default getSkyblockAction; diff --git a/src/API/getSkyblockAuctions.test.ts b/src/API/getSkyblockAuctions.test.ts new file mode 100644 index 000000000..0e80ae8f2 --- /dev/null +++ b/src/API/getSkyblockAuctions.test.ts @@ -0,0 +1,358 @@ +import Auction from '../Structures/SkyBlock/Auctions/Auction.js'; +import AuctionInfo from '../Structures/SkyBlock/Auctions/AuctionInfo.js'; +import Bid from '../Structures/SkyBlock/Auctions/Bid.js'; +import Client from '../Client.js'; +import ItemBytes from '../Structures/ItemBytes.js'; +import { Rarity } from '../Types/Skyblock.js'; +import { SkyblockAuctionsResult } from '../Types/API.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('getSkyblockAuctions (No input)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + expect(() => client.getSkyblockAuctions()).rejects.toThrowError(client.errors.INVALID_OPTION_VALUE); + client.destroy(); +}); + +test('getSkyblockAuctions (Negative Input)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + expect(() => client.getSkyblockAuctions(-1)).rejects.toThrowError(client.errors.INVALID_OPTION_VALUE); + client.destroy(); +}); + +test('getSkyblockAuctions (Page 0)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + expect(() => client.getSkyblockAuctions(0)).rejects.toThrowError(client.errors.INVALID_OPTION_VALUE); + client.destroy(); +}); + +test('getSkyblockAuctions (String Input)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + expect(() => client.getSkyblockAuctions('hi')).rejects.toThrowError(client.errors.INVALID_OPTION_VALUE); + client.destroy(); +}); + +test('getSkyblockAuctions (One Page)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getSkyblockAuctions(1); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + expect(data.info).toBeDefined(); + expect(data.info).toBeInstanceOf(AuctionInfo); + expectTypeOf(data.info).toEqualTypeOf(); + expect(data.info.page).toBeDefined(); + expect(data.info.page).toBeGreaterThanOrEqual(0); + expectTypeOf(data.info.page).toEqualTypeOf(); + expect(data.info.totalPages).toBeDefined(); + expect(data.info.totalPages).toBeGreaterThanOrEqual(0); + expectTypeOf(data.info.totalPages).toEqualTypeOf(); + expect(data.info.totalAuctions).toBeDefined(); + expect(data.info.totalAuctions).toBeGreaterThanOrEqual(0); + expectTypeOf(data.info.totalAuctions).toEqualTypeOf(); + expect(data.info.lastUpdatedTimestamp).toBeDefined(); + expect(data.info.lastUpdatedTimestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.info.lastUpdatedTimestamp).toEqualTypeOf(); + expect(data.info.lastUpdatedAt).toBeDefined(); + expectTypeOf(data.info.lastUpdatedAt).toEqualTypeOf(); + expect(data.auctions).toBeDefined(); + expectTypeOf(data.auctions).toEqualTypeOf(); + expect(data.auctions.length).toBeGreaterThanOrEqual(0); + expectTypeOf(data.auctions.length).toEqualTypeOf(); + data.auctions.forEach((auction: Auction) => { + expect(auction).toBeDefined(); + expect(auction).toBeInstanceOf(Auction); + expectTypeOf(auction).toEqualTypeOf(); + expect(auction.auctionId).toBeDefined(); + expectTypeOf(auction.auctionId).toEqualTypeOf(); + expect(auction.auctioneerUuid).toBeDefined(); + expectTypeOf(auction.auctioneerUuid).toEqualTypeOf(); + expect(auction.auctioneerProfile).toBeDefined(); + expectTypeOf(auction.auctioneerProfile).toEqualTypeOf(); + expect(auction.bin).toBeDefined(); + expectTypeOf(auction.bin).toEqualTypeOf(); + expect(auction.itemBytes).toBeDefined(); + expectTypeOf(auction.itemBytes).toEqualTypeOf(); + if (auction.itemBytes) { + expect(auction.itemBytes).toBeDefined(); + expectTypeOf(auction.itemBytes).toEqualTypeOf(); + expect(auction.itemBytes.bytesBuffer).toBeDefined(); + expectTypeOf(auction.itemBytes.bytesBuffer).toEqualTypeOf(); + expect(auction.itemBytes.base64).toBeDefined(); + expectTypeOf(auction.itemBytes.base64).toEqualTypeOf<() => string>(); + expect(auction.itemBytes.base64()).toBeDefined(); + expectTypeOf(auction.itemBytes.base64()).toEqualTypeOf(); + } + expect(auction.coop).toBeDefined(); + expectTypeOf(auction.coop).toEqualTypeOf(); + expect(auction.auctionStartTimestamp).toBeDefined(); + expect(auction.auctionStartTimestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(auction.auctionStartTimestamp).toEqualTypeOf(); + expect(auction.auctionStart).toBeDefined(); + expectTypeOf(auction.auctionStart).toEqualTypeOf(); + expect(auction.auctionEndTimestamp).toBeDefined(); + expectTypeOf(auction.auctionEndTimestamp).toEqualTypeOf(); + expect(auction.auctionEnd).toBeDefined(); + expectTypeOf(auction.auctionEnd).toEqualTypeOf(); + expect(auction.item).toBeDefined(); + expectTypeOf(auction.item).toEqualTypeOf(); + expect(auction.itemLore).toBeDefined(); + expectTypeOf(auction.itemLore).toEqualTypeOf(); + expect(auction.itemLoreRaw).toBeDefined(); + expectTypeOf(auction.itemLoreRaw).toEqualTypeOf(); + expect(auction.rarity).toBeDefined(); + expectTypeOf(auction.rarity).toEqualTypeOf(); + expect(auction.startingBid).toBeDefined(); + expectTypeOf(auction.startingBid).toEqualTypeOf(); + expect(auction.highestBid).toBeDefined(); + expectTypeOf(auction.highestBid).toEqualTypeOf(); + expect(auction.bids).toBeDefined(); + expectTypeOf(auction.bids).toEqualTypeOf(); + auction.bids.forEach((bid: Bid) => { + expect(bid).toBeDefined(); + expect(bid).toBeInstanceOf(Bid); + expectTypeOf(bid).toEqualTypeOf(); + expect(bid.auctionId).toBeDefined(); + expectTypeOf(bid.auctionId).toEqualTypeOf(); + expect(bid.profileId).toBeDefined(); + expectTypeOf(bid.profileId).toEqualTypeOf(); + expect(bid.amount).toBeDefined(); + expect(bid.amount).toBeGreaterThanOrEqual(0); + expectTypeOf(bid.amount).toEqualTypeOf(); + expect(bid.timestamp).toBeDefined(); + expectTypeOf(bid.timestamp).toEqualTypeOf(); + expect(bid.at).toBeDefined(); + expectTypeOf(bid.at).toEqualTypeOf(); + expect(bid.bidder).toBeDefined(); + expectTypeOf(bid.bidder).toEqualTypeOf(); + expect(bid.toString()).toBeDefined(); + expect(bid.toString()).toBe(`${bid.bidder} bid ${bid.amount} coins`); + expectTypeOf(bid.toString()).toEqualTypeOf(); + }); + expect(auction.claimed).toBeDefined(); + expectTypeOf(auction.claimed).toEqualTypeOf(); + expect(auction.claimedBidders).toBeDefined(); + expectTypeOf(auction.claimedBidders).toEqualTypeOf(); + expect(auction.toString()).toBeDefined(); + expect(auction.toString()).toEqual(auction.item); + expectTypeOf(auction.toString()).toEqualTypeOf(); + }); + client.destroy(); +}); + +test('getSkyblockAuctions (One Page Include Item Bytes)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getSkyblockAuctions(1, { includeItemBytes: true }); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf<{ info: AuctionInfo; auctions: Auction[] }>(); + expect(data.info).toBeDefined(); + expect(data.info).toBeInstanceOf(AuctionInfo); + expectTypeOf(data.info).toEqualTypeOf(); + expect(data.info.page).toBeDefined(); + expect(data.info.page).toBeGreaterThanOrEqual(0); + expectTypeOf(data.info.page).toEqualTypeOf(); + expect(data.info.totalPages).toBeDefined(); + expect(data.info.totalPages).toBeGreaterThanOrEqual(0); + expectTypeOf(data.info.totalPages).toEqualTypeOf(); + expect(data.info.totalAuctions).toBeDefined(); + expect(data.info.totalAuctions).toBeGreaterThanOrEqual(0); + expectTypeOf(data.info.totalAuctions).toEqualTypeOf(); + expect(data.info.lastUpdatedTimestamp).toBeDefined(); + expect(data.info.lastUpdatedTimestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.info.lastUpdatedTimestamp).toEqualTypeOf(); + expect(data.info.lastUpdatedAt).toBeDefined(); + expectTypeOf(data.info.lastUpdatedAt).toEqualTypeOf(); + expect(data.auctions).toBeDefined(); + expectTypeOf(data.auctions).toEqualTypeOf(); + expect(data.auctions.length).toBeGreaterThanOrEqual(0); + expectTypeOf(data.auctions.length).toEqualTypeOf(); + data.auctions.forEach((auction: Auction) => { + expect(auction).toBeDefined(); + expect(auction).toBeInstanceOf(Auction); + expectTypeOf(auction).toEqualTypeOf(); + expect(auction.auctionId).toBeDefined(); + expectTypeOf(auction.auctionId).toEqualTypeOf(); + expect(auction.auctioneerUuid).toBeDefined(); + expectTypeOf(auction.auctioneerUuid).toEqualTypeOf(); + expect(auction.auctioneerProfile).toBeDefined(); + expectTypeOf(auction.auctioneerProfile).toEqualTypeOf(); + expect(auction.bin).toBeDefined(); + expectTypeOf(auction.bin).toEqualTypeOf(); + expect(auction.itemBytes).toBeDefined(); + expectTypeOf(auction.itemBytes).toEqualTypeOf(); + if (auction.itemBytes) { + expect(auction.itemBytes).toBeDefined(); + expectTypeOf(auction.itemBytes).toEqualTypeOf(); + expect(auction.itemBytes.bytesBuffer).toBeDefined(); + expectTypeOf(auction.itemBytes.bytesBuffer).toEqualTypeOf(); + expect(auction.itemBytes.base64).toBeDefined(); + expectTypeOf(auction.itemBytes.base64).toEqualTypeOf<() => string>(); + expect(auction.itemBytes.base64()).toBeDefined(); + expectTypeOf(auction.itemBytes.base64()).toEqualTypeOf(); + } + expect(auction.coop).toBeDefined(); + expectTypeOf(auction.coop).toEqualTypeOf(); + expect(auction.auctionStartTimestamp).toBeDefined(); + expect(auction.auctionStartTimestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(auction.auctionStartTimestamp).toEqualTypeOf(); + expect(auction.auctionStart).toBeDefined(); + expectTypeOf(auction.auctionStart).toEqualTypeOf(); + expect(auction.auctionEndTimestamp).toBeDefined(); + expectTypeOf(auction.auctionEndTimestamp).toEqualTypeOf(); + expect(auction.auctionEnd).toBeDefined(); + expectTypeOf(auction.auctionEnd).toEqualTypeOf(); + expect(auction.item).toBeDefined(); + expectTypeOf(auction.item).toEqualTypeOf(); + expect(auction.itemLore).toBeDefined(); + expectTypeOf(auction.itemLore).toEqualTypeOf(); + expect(auction.itemLoreRaw).toBeDefined(); + expectTypeOf(auction.itemLoreRaw).toEqualTypeOf(); + expect(auction.rarity).toBeDefined(); + expectTypeOf(auction.rarity).toEqualTypeOf(); + expect(auction.startingBid).toBeDefined(); + expectTypeOf(auction.startingBid).toEqualTypeOf(); + expect(auction.highestBid).toBeDefined(); + expectTypeOf(auction.highestBid).toEqualTypeOf(); + expect(auction.bids).toBeDefined(); + expectTypeOf(auction.bids).toEqualTypeOf(); + auction.bids.forEach((bid: Bid) => { + expect(bid).toBeDefined(); + expect(bid).toBeInstanceOf(Bid); + expectTypeOf(bid).toEqualTypeOf(); + expect(bid.auctionId).toBeDefined(); + expectTypeOf(bid.auctionId).toEqualTypeOf(); + expect(bid.profileId).toBeDefined(); + expectTypeOf(bid.profileId).toEqualTypeOf(); + expect(bid.amount).toBeDefined(); + expect(bid.amount).toBeGreaterThanOrEqual(0); + expectTypeOf(bid.amount).toEqualTypeOf(); + expect(bid.timestamp).toBeDefined(); + expectTypeOf(bid.timestamp).toEqualTypeOf(); + expect(bid.at).toBeDefined(); + expectTypeOf(bid.at).toEqualTypeOf(); + expect(bid.bidder).toBeDefined(); + expectTypeOf(bid.bidder).toEqualTypeOf(); + expect(bid.toString()).toBeDefined(); + expect(bid.toString()).toBe(`${bid.bidder} bid ${bid.amount} coins`); + expectTypeOf(bid.toString()).toEqualTypeOf(); + }); + expect(auction.claimed).toBeDefined(); + expectTypeOf(auction.claimed).toEqualTypeOf(); + expect(auction.claimedBidders).toBeDefined(); + expectTypeOf(auction.claimedBidders).toEqualTypeOf(); + expect(auction.toString()).toBeDefined(); + expect(auction.toString()).toEqual(auction.item); + expectTypeOf(auction.toString()).toEqualTypeOf(); + }); + client.destroy(); +}); + +test('getSkyblockAuctions (All Pages)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false }); + + const data = await client.getSkyblockAuctions('*'); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf<{ info: AuctionInfo; auctions: Auction[] }>(); + expect(data.info).toBeDefined(); + expect(data.info).toBeInstanceOf(AuctionInfo); + expectTypeOf(data.info).toEqualTypeOf(); + expect(data.info.page).toBeDefined(); + expect(data.info.page).toBeGreaterThanOrEqual(0); + expectTypeOf(data.info.page).toEqualTypeOf(); + expect(data.info.totalPages).toBeDefined(); + expect(data.info.totalPages).toBeGreaterThanOrEqual(0); + expectTypeOf(data.info.totalPages).toEqualTypeOf(); + expect(data.info.totalAuctions).toBeDefined(); + expect(data.info.totalAuctions).toBeGreaterThanOrEqual(0); + expectTypeOf(data.info.totalAuctions).toEqualTypeOf(); + expect(data.info.lastUpdatedTimestamp).toBeDefined(); + expect(data.info.lastUpdatedTimestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.info.lastUpdatedTimestamp).toEqualTypeOf(); + expect(data.info.lastUpdatedAt).toBeDefined(); + expectTypeOf(data.info.lastUpdatedAt).toEqualTypeOf(); + expect(data.auctions).toBeDefined(); + expectTypeOf(data.auctions).toEqualTypeOf(); + expect(data.auctions.length).toBeGreaterThanOrEqual(0); + expectTypeOf(data.auctions.length).toEqualTypeOf(); + data.auctions.forEach((auction: Auction) => { + expect(auction).toBeDefined(); + expect(auction).toBeInstanceOf(Auction); + expectTypeOf(auction).toEqualTypeOf(); + expect(auction.auctionId).toBeDefined(); + expectTypeOf(auction.auctionId).toEqualTypeOf(); + expect(auction.auctioneerUuid).toBeDefined(); + expectTypeOf(auction.auctioneerUuid).toEqualTypeOf(); + expect(auction.auctioneerProfile).toBeDefined(); + expectTypeOf(auction.auctioneerProfile).toEqualTypeOf(); + expect(auction.bin).toBeDefined(); + expectTypeOf(auction.bin).toEqualTypeOf(); + expect(auction.itemBytes).toBeDefined(); + expectTypeOf(auction.itemBytes).toEqualTypeOf(); + if (auction.itemBytes) { + expect(auction.itemBytes).toBeDefined(); + expectTypeOf(auction.itemBytes).toEqualTypeOf(); + expect(auction.itemBytes.bytesBuffer).toBeDefined(); + expectTypeOf(auction.itemBytes.bytesBuffer).toEqualTypeOf(); + expect(auction.itemBytes.base64).toBeDefined(); + expectTypeOf(auction.itemBytes.base64).toEqualTypeOf<() => string>(); + expect(auction.itemBytes.base64()).toBeDefined(); + expectTypeOf(auction.itemBytes.base64()).toEqualTypeOf(); + } + expect(auction.coop).toBeDefined(); + expectTypeOf(auction.coop).toEqualTypeOf(); + expect(auction.auctionStartTimestamp).toBeDefined(); + expect(auction.auctionStartTimestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(auction.auctionStartTimestamp).toEqualTypeOf(); + expect(auction.auctionStart).toBeDefined(); + expectTypeOf(auction.auctionStart).toEqualTypeOf(); + expect(auction.auctionEndTimestamp).toBeDefined(); + expectTypeOf(auction.auctionEndTimestamp).toEqualTypeOf(); + expect(auction.auctionEnd).toBeDefined(); + expectTypeOf(auction.auctionEnd).toEqualTypeOf(); + expect(auction.item).toBeDefined(); + expectTypeOf(auction.item).toEqualTypeOf(); + expect(auction.itemLore).toBeDefined(); + expectTypeOf(auction.itemLore).toEqualTypeOf(); + expect(auction.itemLoreRaw).toBeDefined(); + expectTypeOf(auction.itemLoreRaw).toEqualTypeOf(); + expect(auction.rarity).toBeDefined(); + expectTypeOf(auction.rarity).toEqualTypeOf(); + expect(auction.startingBid).toBeDefined(); + expectTypeOf(auction.startingBid).toEqualTypeOf(); + expect(auction.highestBid).toBeDefined(); + expectTypeOf(auction.highestBid).toEqualTypeOf(); + expect(auction.bids).toBeDefined(); + expectTypeOf(auction.bids).toEqualTypeOf(); + auction.bids.forEach((bid: Bid) => { + expect(bid).toBeDefined(); + expect(bid).toBeInstanceOf(Bid); + expectTypeOf(bid).toEqualTypeOf(); + expect(bid.auctionId).toBeDefined(); + expectTypeOf(bid.auctionId).toEqualTypeOf(); + expect(bid.profileId).toBeDefined(); + expectTypeOf(bid.profileId).toEqualTypeOf(); + expect(bid.amount).toBeDefined(); + expect(bid.amount).toBeGreaterThanOrEqual(0); + expectTypeOf(bid.amount).toEqualTypeOf(); + expect(bid.timestamp).toBeDefined(); + expectTypeOf(bid.timestamp).toEqualTypeOf(); + expect(bid.at).toBeDefined(); + expectTypeOf(bid.at).toEqualTypeOf(); + expect(bid.bidder).toBeDefined(); + expectTypeOf(bid.bidder).toEqualTypeOf(); + expect(bid.toString()).toBeDefined(); + expect(bid.toString()).toBe(`${bid.bidder} bid ${bid.amount} coins`); + expectTypeOf(bid.toString()).toEqualTypeOf(); + }); + expect(auction.claimed).toBeDefined(); + expectTypeOf(auction.claimed).toEqualTypeOf(); + expect(auction.claimedBidders).toBeDefined(); + expectTypeOf(auction.claimedBidders).toEqualTypeOf(); + expect(auction.toString()).toBeDefined(); + expect(auction.toString()).toEqual(auction.item); + expectTypeOf(auction.toString()).toEqualTypeOf(); + }); + client.destroy(); +}); diff --git a/src/API/getSkyblockAuctions.ts b/src/API/getSkyblockAuctions.ts new file mode 100644 index 000000000..32e84cc49 --- /dev/null +++ b/src/API/getSkyblockAuctions.ts @@ -0,0 +1,55 @@ +import Auction from '../Structures/SkyBlock/Auctions/Auction.js'; +import AuctionInfo from '../Structures/SkyBlock/Auctions/AuctionInfo.js'; +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import { AuctionRequestOptions, SkyblockAuctionsResult } from '../Types/API.js'; + +class getSkyblockAuctions extends Endpoint { + readonly client: Client; + declare options: AuctionRequestOptions; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute(query: number | '*', options?: AuctionRequestOptions): Promise { + if (!query) throw new Error(this.client.errors.INVALID_OPTION_VALUE); + if ('number' === typeof query && 0 >= query) throw new Error(this.client.errors.INVALID_OPTION_VALUE); + if ('number' !== typeof query && '*' !== query) throw new Error(this.client.errors.INVALID_OPTION_VALUE); + this.options = this.parseOptions(options); + if ('*' === query) return await this.getAllPages(); + return await this.getPage(query); + } + + async getAllPages(): Promise { + const page = 0; + const { info, auctions } = await this.getPage(page); + const pages = info.totalPages; + const requests = []; + for (let i = 1; i < pages; i++) { + requests.push(this.getPage(i)); + } + const results = await Promise.all(requests); + results.forEach(({ auctions: newAuctions }) => { + auctions.push(...newAuctions); + }); + return { info, auctions }; + } + + async getPage(page: number): Promise { + const res = await this.client.requestHandler.request(`/skyblock/auctions?page=${page}`, this.options); + return { + info: new AuctionInfo(res.data), + auctions: res.data.auctions.map((a: any) => new Auction(a)) + }; + } + + private parseOptions(options: any): AuctionRequestOptions { + return { + includeItemBytes: options?.includeItemBytes ?? false, + noCache: options?.noCache ?? false + }; + } +} + +export default getSkyblockAuctions; diff --git a/src/API/getSkyblockAuctionsByPlayer.test.ts b/src/API/getSkyblockAuctionsByPlayer.test.ts new file mode 100644 index 000000000..d1520dc1a --- /dev/null +++ b/src/API/getSkyblockAuctionsByPlayer.test.ts @@ -0,0 +1,250 @@ +import Auction from '../Structures/SkyBlock/Auctions/Auction.js'; +import Bid from '../Structures/SkyBlock/Auctions/Bid.js'; +import Client from '../Client.js'; +import ItemBytes from '../Structures/ItemBytes.js'; +import RequestData from '../Private/RequestData.js'; +import { Rarity } from '../Types/Skyblock.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('getSkyblockAuctionsByPlayer (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const auctions = await client.getSkyblockAuctions(1); + if (undefined === auctions.auctions[0]) return; + if (!auctions.auctions[0].auctioneerUuid) throw new Error("Something wen't wrong while fetching auctions"); + const data = await client.getSkyblockAuctionsByPlayer(auctions.auctions[0].auctioneerUuid, { raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getSkyblockAuctionsByPlayer (No Input)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + expect(() => client.getSkyblockAuctionsByPlayer()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); + client.destroy(); +}); + +test('getSkyblockAuctionsByPlayer', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const auctions = await client.getSkyblockAuctions(1); + if (undefined === auctions.auctions[0]) return; + if (!auctions.auctions[0].auctioneerUuid) throw new Error("Something wen't wrong while fetching auctions"); + let data = await client.getSkyblockAuctionsByPlayer(auctions.auctions[0].auctioneerUuid); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as Auction[]; + data.forEach((auction: Auction) => { + expect(auction).toBeDefined(); + expect(auction).toBeInstanceOf(Auction); + expectTypeOf(auction).toEqualTypeOf(); + + expect(auction.auctionId).toBeDefined(); + expectTypeOf(auction.auctionId).toEqualTypeOf(); + + expect(auction.auctioneerUuid).toBeDefined(); + expectTypeOf(auction.auctioneerUuid).toEqualTypeOf(); + + expect(auction.auctioneerProfile).toBeDefined(); + expectTypeOf(auction.auctioneerProfile).toEqualTypeOf(); + + expect(auction.bin).toBeDefined(); + expectTypeOf(auction.bin).toEqualTypeOf(); + + expect(auction.itemBytes).toBeDefined(); + expectTypeOf(auction.itemBytes).toEqualTypeOf(); + expect(auction.itemBytes).toBeDefined(); + expectTypeOf(auction.itemBytes).toEqualTypeOf(); + if (auction.itemBytes) { + expect(auction.itemBytes).toBeDefined(); + expectTypeOf(auction.itemBytes).toEqualTypeOf(); + expect(auction.itemBytes.bytesBuffer).toBeDefined(); + expectTypeOf(auction.itemBytes.bytesBuffer).toEqualTypeOf(); + expect(auction.itemBytes.base64).toBeDefined(); + expectTypeOf(auction.itemBytes.base64).toEqualTypeOf<() => string>(); + expect(auction.itemBytes.base64()).toBeDefined(); + expectTypeOf(auction.itemBytes.base64()).toEqualTypeOf(); + } + expect(auction.coop).toBeDefined(); + expectTypeOf(auction.coop).toEqualTypeOf(); + + expect(auction.auctionStartTimestamp).toBeDefined(); + expect(auction.auctionStartTimestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(auction.auctionStartTimestamp).toEqualTypeOf(); + + expect(auction.auctionStart).toBeDefined(); + expectTypeOf(auction.auctionStart).toEqualTypeOf(); + + expect(auction.auctionEndTimestamp).toBeDefined(); + expectTypeOf(auction.auctionEndTimestamp).toEqualTypeOf(); + + expect(auction.auctionEnd).toBeDefined(); + expectTypeOf(auction.auctionEnd).toEqualTypeOf(); + + expect(auction.item).toBeDefined(); + expectTypeOf(auction.item).toEqualTypeOf(); + + expect(auction.itemLore).toBeDefined(); + expectTypeOf(auction.itemLore).toEqualTypeOf(); + + expect(auction.itemLoreRaw).toBeDefined(); + expectTypeOf(auction.itemLoreRaw).toEqualTypeOf(); + + expect(auction.rarity).toBeDefined(); + expectTypeOf(auction.rarity).toEqualTypeOf(); + + expect(auction.startingBid).toBeDefined(); + expectTypeOf(auction.startingBid).toEqualTypeOf(); + + expect(auction.highestBid).toBeDefined(); + expectTypeOf(auction.highestBid).toEqualTypeOf(); + + expect(auction.bids).toBeDefined(); + expectTypeOf(auction.bids).toEqualTypeOf(); + auction.bids.forEach((bid: Bid) => { + expect(bid).toBeDefined(); + expect(bid).toBeInstanceOf(Bid); + expectTypeOf(bid).toEqualTypeOf(); + expect(bid.auctionId).toBeDefined(); + expectTypeOf(bid.auctionId).toEqualTypeOf(); + expect(bid.profileId).toBeDefined(); + expectTypeOf(bid.profileId).toEqualTypeOf(); + expect(bid.amount).toBeDefined(); + expect(bid.amount).toBeGreaterThanOrEqual(0); + expectTypeOf(bid.amount).toEqualTypeOf(); + expect(bid.timestamp).toBeDefined(); + expectTypeOf(bid.timestamp).toEqualTypeOf(); + expect(bid.at).toBeDefined(); + expectTypeOf(bid.at).toEqualTypeOf(); + expect(bid.bidder).toBeDefined(); + expectTypeOf(bid.bidder).toEqualTypeOf(); + expect(bid.toString()).toBeDefined(); + expect(bid.toString()).toBe(`${bid.bidder} bid ${bid.amount} coins`); + expectTypeOf(bid.toString()).toEqualTypeOf(); + }); + + expect(auction.claimed).toBeDefined(); + expectTypeOf(auction.claimed).toEqualTypeOf(); + + expect(auction.claimedBidders).toBeDefined(); + expectTypeOf(auction.claimedBidders).toEqualTypeOf(); + + expect(auction.toString()).toBeDefined(); + expect(auction.toString()).toEqual(auction.item); + expectTypeOf(auction.toString()).toEqualTypeOf(); + }); + + client.destroy(); +}); + +test('getSkyblockAuctionsByPlayer (Item Bytes)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const auctions = await client.getSkyblockAuctions(1); + if (undefined === auctions.auctions[0]) return; + if (!auctions.auctions[0].auctioneerUuid) throw new Error("Something wen't wrong while fetching auctions"); + let data = await client.getSkyblockAuctionsByPlayer(auctions.auctions[0].auctioneerUuid, { includeItemBytes: true }); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as Auction[]; + data.forEach((auction: Auction) => { + expect(auction).toBeDefined(); + expect(auction).toBeInstanceOf(Auction); + expectTypeOf(auction).toEqualTypeOf(); + + expect(auction.auctionId).toBeDefined(); + expectTypeOf(auction.auctionId).toEqualTypeOf(); + + expect(auction.auctioneerUuid).toBeDefined(); + expectTypeOf(auction.auctioneerUuid).toEqualTypeOf(); + + expect(auction.auctioneerProfile).toBeDefined(); + expectTypeOf(auction.auctioneerProfile).toEqualTypeOf(); + + expect(auction.bin).toBeDefined(); + expectTypeOf(auction.bin).toEqualTypeOf(); + + expect(auction.itemBytes).toBeDefined(); + expectTypeOf(auction.itemBytes).toEqualTypeOf(); + if (auction.itemBytes) { + expect(auction.itemBytes).toBeDefined(); + expectTypeOf(auction.itemBytes).toEqualTypeOf(); + expect(auction.itemBytes.bytesBuffer).toBeDefined(); + expectTypeOf(auction.itemBytes.bytesBuffer).toEqualTypeOf(); + expect(auction.itemBytes.base64).toBeDefined(); + expectTypeOf(auction.itemBytes.base64).toEqualTypeOf<() => string>(); + expect(auction.itemBytes.base64()).toBeDefined(); + expectTypeOf(auction.itemBytes.base64()).toEqualTypeOf(); + } + + expect(auction.coop).toBeDefined(); + expectTypeOf(auction.coop).toEqualTypeOf(); + + expect(auction.auctionStartTimestamp).toBeDefined(); + expect(auction.auctionStartTimestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(auction.auctionStartTimestamp).toEqualTypeOf(); + + expect(auction.auctionStart).toBeDefined(); + expectTypeOf(auction.auctionStart).toEqualTypeOf(); + + expect(auction.auctionEndTimestamp).toBeDefined(); + expectTypeOf(auction.auctionEndTimestamp).toEqualTypeOf(); + + expect(auction.auctionEnd).toBeDefined(); + expectTypeOf(auction.auctionEnd).toEqualTypeOf(); + + expect(auction.item).toBeDefined(); + expectTypeOf(auction.item).toEqualTypeOf(); + + expect(auction.itemLore).toBeDefined(); + expectTypeOf(auction.itemLore).toEqualTypeOf(); + + expect(auction.itemLoreRaw).toBeDefined(); + expectTypeOf(auction.itemLoreRaw).toEqualTypeOf(); + + expect(auction.rarity).toBeDefined(); + expectTypeOf(auction.rarity).toEqualTypeOf(); + + expect(auction.startingBid).toBeDefined(); + expectTypeOf(auction.startingBid).toEqualTypeOf(); + + expect(auction.highestBid).toBeDefined(); + expectTypeOf(auction.highestBid).toEqualTypeOf(); + + expect(auction.bids).toBeDefined(); + expectTypeOf(auction.bids).toEqualTypeOf(); + auction.bids.forEach((bid: Bid) => { + expect(bid).toBeDefined(); + expect(bid).toBeInstanceOf(Bid); + expectTypeOf(bid).toEqualTypeOf(); + expect(bid.auctionId).toBeDefined(); + expectTypeOf(bid.auctionId).toEqualTypeOf(); + expect(bid.profileId).toBeDefined(); + expectTypeOf(bid.profileId).toEqualTypeOf(); + expect(bid.amount).toBeDefined(); + expect(bid.amount).toBeGreaterThanOrEqual(0); + expectTypeOf(bid.amount).toEqualTypeOf(); + expect(bid.timestamp).toBeDefined(); + expectTypeOf(bid.timestamp).toEqualTypeOf(); + expect(bid.at).toBeDefined(); + expectTypeOf(bid.at).toEqualTypeOf(); + expect(bid.bidder).toBeDefined(); + expectTypeOf(bid.bidder).toEqualTypeOf(); + expect(bid.toString()).toBeDefined(); + expect(bid.toString()).toBe(`${bid.bidder} bid ${bid.amount} coins`); + expectTypeOf(bid.toString()).toEqualTypeOf(); + }); + + expect(auction.claimed).toBeDefined(); + expectTypeOf(auction.claimed).toEqualTypeOf(); + + expect(auction.claimedBidders).toBeDefined(); + expectTypeOf(auction.claimedBidders).toEqualTypeOf(); + + expect(auction.toString()).toBeDefined(); + expect(auction.toString()).toEqual(auction.item); + expectTypeOf(auction.toString()).toEqualTypeOf(); + }); + + client.destroy(); +}); diff --git a/src/API/getSkyblockAuctionsByPlayer.ts b/src/API/getSkyblockAuctionsByPlayer.ts new file mode 100644 index 000000000..07fd57079 --- /dev/null +++ b/src/API/getSkyblockAuctionsByPlayer.ts @@ -0,0 +1,23 @@ +import Auction from '../Structures/SkyBlock/Auctions/Auction.js'; +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import RequestData from '../Private/RequestData.js'; +import { AuctionRequestOptions } from '../Types/API.js'; + +class getSkyblockActionsByPlayer extends Endpoint { + readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute(query: string, options?: AuctionRequestOptions): Promise { + if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); + query = await this.client.requestHandler.toUUID(query); + const res = await this.client.requestHandler.request(`/skyblock/auction?player=${query}`, options); + if (res.options.raw) return res; + return res.data.auctions.map((a: any) => new Auction(a, options?.includeItemBytes ?? false)); + } +} + +export default getSkyblockActionsByPlayer; diff --git a/src/API/getSkyblockBazaar.test.ts b/src/API/getSkyblockBazaar.test.ts new file mode 100644 index 000000000..554843a50 --- /dev/null +++ b/src/API/getSkyblockBazaar.test.ts @@ -0,0 +1,51 @@ +import Client from '../Client.js'; +import Order from '../Structures/SkyBlock/Bazaar/Order.js'; +import Product from '../Structures/SkyBlock/Bazaar/Product.js'; +import RequestData from '../Private/RequestData.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('getSkyblockBazarr (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getSkyblockBazaar({ raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); +test('getSkyblockBazarr', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getSkyblockBazaar(); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as Product[]; + data.forEach((product: Product) => { + expect(product).toBeDefined(); + expect(product).toBeInstanceOf(Product); + expectTypeOf(product).toEqualTypeOf(); + expect(product.productId).toBeDefined(); + expectTypeOf(product.productId).toEqualTypeOf(); + expect(product.sellSummary).toBeDefined(); + expectTypeOf(product.sellSummary).toEqualTypeOf(); + product.sellSummary.forEach((sell: Order) => { + expect(sell).toBeDefined(); + expect(sell).toBeInstanceOf(Order); + expectTypeOf(sell).toEqualTypeOf(); + expect(sell.amount).toBeDefined(); + expectTypeOf(sell.amount).toEqualTypeOf(); + expect(sell.amount).toBeGreaterThanOrEqual(0); + expect(sell.pricePerUnit).toBeDefined(); + expectTypeOf(sell.pricePerUnit).toEqualTypeOf(); + expect(sell.pricePerUnit).toBeGreaterThanOrEqual(0); + expect(sell.totalPrice).toBeDefined(); + expectTypeOf(sell.totalPrice).toEqualTypeOf(); + expect(sell.totalPrice).toBeGreaterThanOrEqual(0); + expect(sell.orders).toBeDefined(); + expectTypeOf(sell.orders).toEqualTypeOf(); + expect(sell.orders).toBeGreaterThanOrEqual(0); + expect(sell.toString()).toBeDefined(); + expect(sell.toString()).toEqual(sell.totalPrice); + expectTypeOf(sell.toString()).toEqualTypeOf(); + }); + }); + client.destroy(); +}); diff --git a/src/API/getSkyblockBazaar.ts b/src/API/getSkyblockBazaar.ts new file mode 100644 index 000000000..f520d1165 --- /dev/null +++ b/src/API/getSkyblockBazaar.ts @@ -0,0 +1,21 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import Product from '../Structures/SkyBlock/Bazaar/Product.js'; +import RequestData from '../Private/RequestData.js'; +import type { RequestOptions } from '../Types/Requests.js'; + +class getSkyblockBazaar extends Endpoint { + readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute(options?: RequestOptions): Promise { + const res = await this.client.requestHandler.request('/skyblock/bazaar', options); + if (res.options.raw) return res; + return Object.keys(res.data.products).map((x) => new Product(res.data.products[x])); + } +} + +export default getSkyblockBazaar; diff --git a/src/API/getSkyblockBingo.test.ts b/src/API/getSkyblockBingo.test.ts new file mode 100644 index 000000000..31ed08de3 --- /dev/null +++ b/src/API/getSkyblockBingo.test.ts @@ -0,0 +1,43 @@ +import Bingo from '../Structures/SkyBlock/Static/Bingo.js'; +import BingoData from '../Structures/SkyBlock/Static/BingoData.js'; +import Client from '../Client.js'; +import RequestData from '../Private/RequestData.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('getSkyblockBingo (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getSkyblockBingo({ raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getSkyblockBingo', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getSkyblockBingo(); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as BingoData; + expect(data.lastUpdatedTimestamp).toBeDefined(); + expectTypeOf(data.lastUpdatedTimestamp).toEqualTypeOf(); + expect(data.lastUpdatedAt).toBeDefined(); + expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); + expect(data.id).toBeDefined(); + expectTypeOf(data.id).toEqualTypeOf(); + expect(data.goals).toBeDefined(); + expectTypeOf(data.goals).toEqualTypeOf(); + if (data.goals) { + data.goals.forEach((goal: Bingo) => { + expect(goal).toBeDefined(); + expectTypeOf(goal).toEqualTypeOf(); + expect(goal).toBeInstanceOf(Bingo); + expect(goal.toString()).toBeDefined(); + expect(goal.toString()).toBe(goal.id); + expectTypeOf(goal.toString()).toEqualTypeOf(); + }); + } + expect(data.getGoal(1, 1)).toBeDefined(); + expectTypeOf(data.getGoal(1, 1)).toEqualTypeOf(); + client.destroy(); +}); diff --git a/src/API/getSkyblockBingo.ts b/src/API/getSkyblockBingo.ts new file mode 100644 index 000000000..ec6bc76bf --- /dev/null +++ b/src/API/getSkyblockBingo.ts @@ -0,0 +1,21 @@ +import BingoData from '../Structures/SkyBlock/Static/BingoData.js'; +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import RequestData from '../Private/RequestData.js'; +import type { RequestOptions } from '../Types/Requests.js'; + +class getSkyblockBingo extends Endpoint { + readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute(options?: RequestOptions): Promise { + const res = await this.client.requestHandler.request('/resources/skyblock/bingo', options); + if (res.options.raw) return res; + return new BingoData(res.data); + } +} + +export default getSkyblockBingo; diff --git a/src/API/getSkyblockFireSales.test.ts b/src/API/getSkyblockFireSales.test.ts new file mode 100644 index 000000000..b68941245 --- /dev/null +++ b/src/API/getSkyblockFireSales.test.ts @@ -0,0 +1,60 @@ +import Client from '../Client.js'; +import FireSale from '../Structures/SkyBlock/Static/FireSale.js'; +import RequestData from '../Private/RequestData.js'; +import { defaultRequestData } from '../../vitest.setup.js'; +import { expect, expectTypeOf, test, vi } from 'vitest'; + +test('getSkyblockFireSales (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getSkyblockFireSales({ raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getSkyblockFireSales', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + vi.spyOn(global, 'fetch').mockResolvedValue({ + ...defaultRequestData, + json: () => + /* eslint-disable camelcase */ + Promise.resolve({ + success: true, + sales: [ + { item_id: 'PET_SKIN_LION_WHITE', start: 1725120000000, end: 1725552000000, amount: 6500, price: 650 }, + { item_id: 'PET_SKIN_LION_BLACK', start: 1725120000000, end: 1725552000000, amount: 6500, price: 650 } + ] + }) + /* eslint-enable camelcase */ + } as any); + + let data = await client.getSkyblockFireSales(); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as FireSale[]; + data.forEach((firesale: FireSale) => { + expect(firesale).toBeDefined(); + expect(firesale).toBeInstanceOf(FireSale); + expectTypeOf(firesale).toEqualTypeOf(); + expect(firesale.itemId).toBeDefined(); + expectTypeOf(firesale.itemId).toEqualTypeOf(); + expect(firesale.startTimestamp).toBeDefined(); + expect(firesale.startTimestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(firesale.startTimestamp).toEqualTypeOf(); + expect(firesale.startAt).toBeDefined(); + expectTypeOf(firesale.startAt).toEqualTypeOf(); + expect(firesale.endTimestamp).toBeDefined(); + expectTypeOf(firesale.endTimestamp).toEqualTypeOf(); + expect(firesale.endTimestamp).toBeGreaterThanOrEqual(0); + expect(firesale.endAt).toBeDefined(); + expectTypeOf(firesale.endAt).toEqualTypeOf(); + expect(firesale.amount).toBeDefined(); + expectTypeOf(firesale.amount).toEqualTypeOf(); + expect(firesale.amount).toBeGreaterThanOrEqual(0); + expect(firesale.toString()).toBeDefined(); + expectTypeOf(firesale.toString()).toEqualTypeOf(); + expect(firesale.toString()).toBe(firesale.itemId); + }); + client.destroy(); +}); diff --git a/src/API/getSkyblockFireSales.ts b/src/API/getSkyblockFireSales.ts new file mode 100644 index 000000000..e09371ae4 --- /dev/null +++ b/src/API/getSkyblockFireSales.ts @@ -0,0 +1,21 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import FireSale from '../Structures/SkyBlock/Static/FireSale.js'; +import RequestData from '../Private/RequestData.js'; +import type { RequestOptions } from '../Types/Requests.js'; + +class getSkyblockFireSales extends Endpoint { + readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute(options?: RequestOptions): Promise { + const res = await this.client.requestHandler.request('/skyblock/firesales', options); + if (res.options.raw) return res; + return res.data.sales.map((a: any) => new FireSale(a)); + } +} + +export default getSkyblockFireSales; diff --git a/src/API/getSkyblockGarden.test.ts b/src/API/getSkyblockGarden.test.ts new file mode 100644 index 000000000..50647469b --- /dev/null +++ b/src/API/getSkyblockGarden.test.ts @@ -0,0 +1,53 @@ +import Client from '../Client.js'; +import RequestData from '../Private/RequestData.js'; +import SkyblockGarden from '../Structures/SkyBlock/SkyblockGarden.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { + SkillLevel, + SkyblockGardenComposter, + SkyblockGardenCropMilestones, + SkyblockGardenVisitor, + SkyblockGarenCrops +} from '../Types/Skyblock.js'; + +test('getSkyblockGarden (no input)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + expect(() => client.getSkyblockGarden()).rejects.toThrowError(client.errors.NO_UUID); + client.destroy(); +}); + +test('getSkyblockGarden (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getSkyblockGarden('805c9751-0ff1-4cb6-8e9c-1067bf3bc601', { raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getSkyblockGarden', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getSkyblockGarden('805c9751-0ff1-4cb6-8e9c-1067bf3bc601'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyblockGarden); + expectTypeOf(data).toEqualTypeOf(); + data = data as SkyblockGarden; + expect(data.level).toBeDefined(); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.barnSkin).toBeDefined(); + expectTypeOf(data.barnSkin).toEqualTypeOf(); + expect(data.unlockedPlots).toBeDefined(); + expectTypeOf(data.unlockedPlots).toEqualTypeOf(); + expect(data.visitors).toBeDefined(); + expectTypeOf(data.visitors).toEqualTypeOf(); + expect(data.cropMilestones).toBeDefined(); + expectTypeOf(data.cropMilestones).toEqualTypeOf(); + expect(data.composter).toBeDefined(); + expectTypeOf(data.composter).toEqualTypeOf(); + expect(data.cropUpgrades).toBeDefined(); + expectTypeOf(data.cropUpgrades).toEqualTypeOf(); + + client.destroy(); +}); diff --git a/src/API/getSkyblockGarden.ts b/src/API/getSkyblockGarden.ts new file mode 100644 index 000000000..924f2d977 --- /dev/null +++ b/src/API/getSkyblockGarden.ts @@ -0,0 +1,22 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import RequestData from '../Private/RequestData.js'; +import SkyblockGarden from '../Structures/SkyBlock/SkyblockGarden.js'; +import type { RequestOptions } from '../Types/Requests.js'; + +class getSkyblockGarden extends Endpoint { + readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute(profileId: string, options?: RequestOptions): Promise { + if (!profileId) throw new Error(this.client.errors.NO_UUID); + const res = await this.client.requestHandler.request(`/skyblock/garden?profile=${profileId}`, options); + if (res.options.raw) return res; + return new SkyblockGarden(res.data); + } +} + +export default getSkyblockGarden; diff --git a/src/API/getSkyblockGovernment.test.ts b/src/API/getSkyblockGovernment.test.ts new file mode 100644 index 000000000..08c815fcf --- /dev/null +++ b/src/API/getSkyblockGovernment.test.ts @@ -0,0 +1,62 @@ +import Candidate from '../Structures/SkyBlock/Static/Candidate.js'; +import Client from '../Client.js'; +import GovernmentData from '../Structures/SkyBlock/Static/Government.js'; +import Perk from '../Structures/SkyBlock/Static/Perk.js'; +import RequestData from '../Private/RequestData.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('getSkyblockGovernment (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getSkyblockGovernment({ raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getSkyblockGovernment', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getSkyblockGovernment(); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GovernmentData); + expectTypeOf(data).toEqualTypeOf(); + data = data as GovernmentData; + expect(data.lastUpdatedTimestamp).toBeDefined(); + expect(data.lastUpdatedTimestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.lastUpdatedTimestamp).toEqualTypeOf(); + expect(data.lastUpdatedAt).toBeDefined(); + expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); + expect(data.lastElectionResults).toBeDefined(); + expectTypeOf(data.lastElectionResults).toEqualTypeOf>(); + data.lastElectionResults.forEach((candidate: Candidate) => { + expect(candidate).toBeDefined(); + expect(candidate).toBeInstanceOf(Candidate); + expectTypeOf(candidate).toEqualTypeOf(); + expect(candidate.name).toBeDefined(); + expectTypeOf(candidate.name).toEqualTypeOf(); + expect(candidate.keyBenefit).toBeDefined(); + expectTypeOf(candidate.keyBenefit).toEqualTypeOf(); + expect(candidate.perks).toBeDefined(); + expectTypeOf(candidate.perks).toEqualTypeOf(); + expect(candidate.isMayor).toBeDefined(); + expectTypeOf(candidate.isMayor).toEqualTypeOf(); + expect(candidate.votesReceived).toBeDefined(); + expectTypeOf(candidate.votesReceived).toEqualTypeOf(); + expect(candidate.toString()).toBeDefined(); + expect(candidate.toString()).toBe(candidate.name); + expectTypeOf(candidate.toString()).toEqualTypeOf(); + }); + expect(data.mayor).toBeDefined(); + expectTypeOf(data.mayor).toEqualTypeOf(); + expect(data.runningYear).toBeDefined(); + expect(data.runningYear).toBeGreaterThanOrEqual(0); + expectTypeOf(data.runningYear).toEqualTypeOf(); + expect(data.currentElectionResults).toBeDefined(); + expectTypeOf(data.currentElectionResults).toEqualTypeOf | null>(); + expect(data.currentElectionFor).toBeDefined(); + expectTypeOf(data.currentElectionFor).toEqualTypeOf(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.mayor?.name || ''); + expectTypeOf(data.toString()).toEqualTypeOf(); + client.destroy(); +}); diff --git a/src/API/getSkyblockGovernment.ts b/src/API/getSkyblockGovernment.ts new file mode 100644 index 000000000..62733fb18 --- /dev/null +++ b/src/API/getSkyblockGovernment.ts @@ -0,0 +1,21 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import GovernmentData from '../Structures/SkyBlock/Static/Government.js'; +import RequestData from '../Private/RequestData.js'; +import type { RequestOptions } from '../Types/Requests.js'; + +class getSkyblockGovernment extends Endpoint { + readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute(options?: RequestOptions): Promise { + const res = await this.client.requestHandler.request('/resources/skyblock/election', options); + if (res.options.raw) return res; + return new GovernmentData(res.data); + } +} + +export default getSkyblockGovernment; diff --git a/src/API/getSkyblockMember.test.ts b/src/API/getSkyblockMember.test.ts new file mode 100644 index 000000000..585cb14a8 --- /dev/null +++ b/src/API/getSkyblockMember.test.ts @@ -0,0 +1,657 @@ +import Client from '../Client.js'; +import RequestData from '../Private/RequestData.js'; +import SkyblockGarden from '../Structures/SkyBlock/SkyblockGarden.js'; +import SkyblockGemstone from '../Structures/SkyBlock/SkyblockGemstone.js'; +import SkyblockInventoryItem from '../Structures/SkyBlock/SkyblockInventoryItem.js'; +import SkyblockMember from '../Structures/SkyBlock/SkyblockMember.js'; +import SkyblockMemberStats from '../Structures/SkyBlock/SkyblockMemberStats.js'; +import SkyblockMuseum from '../Structures/SkyBlock/SkyblockMuseum.js'; +import SkyblockPet from '../Structures/SkyBlock/SkyblockPet.js'; +import { + Armor, + ChocolateFactoryData, + CrimsonIsle, + Dungeons, + Equipment, + HOTM, + JacobData, + Rarity, + Skills, + Slayer +} from '../Types/Skyblock.js'; +import { NetworthResult } from 'skyhelper-networth'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('getSkyblockMember (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getSkyblockMember('14727faefbdc4aff848cd2713eb9939e', { raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf | RequestData>(); + client.destroy(); +}); + +test('getSkyblockMember (no input)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + expect(() => client.getSkyblockMember()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); + client.destroy(); +}); + +test('getSkyblockMember (no profiles)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + expect(() => client.getSkyblockMember('b45add7b081443909fb00aa9a3e15eb0')).rejects.toThrowError( + client.errors.NO_SKYBLOCK_PROFILES + ); + client.destroy(); +}); + +test('getSkyblockMember (museum)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getSkyblockMember('add71246c46e455c8345c129ea6f146c', { museum: true }); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf | RequestData>(); + data = data as Map; + data.forEach(async (member: SkyblockMember) => { + expect(member).toBeDefined(); + expect(member).toBeInstanceOf(SkyblockMember); + expectTypeOf(member).toEqualTypeOf(); + expect(member.uuid).toBeDefined(); + expectTypeOf(member.uuid).toEqualTypeOf(); + expect(member.gameMode).toBeDefined(); + expectTypeOf(member.gameMode).toEqualTypeOf(); + expect(member.selected).toBeDefined(); + expectTypeOf(member.selected).toEqualTypeOf(); + expect(member.garden).toBeDefined(); + expect(member.garden).toBeNull(); + expectTypeOf(member.garden).toEqualTypeOf(); + expect(member.museum).toBeDefined(); + expectTypeOf(member.museum).toEqualTypeOf(); + expect(member.profileName).toBeDefined(); + expectTypeOf(member.profileName).toEqualTypeOf(); + expect(member.profileId).toBeDefined(); + expectTypeOf(member.profileId).toEqualTypeOf(); + expect(member.firstJoinTimestamp).toBeDefined(); + expectTypeOf(member.firstJoinTimestamp).toEqualTypeOf(); + expect(member.firstJoinAt).toBeDefined(); + expectTypeOf(member.firstJoinAt).toEqualTypeOf(); + expect(member.experience).toBeDefined(); + expect(member.experience).toBeGreaterThanOrEqual(0); + expectTypeOf(member.experience).toEqualTypeOf(); + expect(member.level).toBeDefined(); + expectTypeOf(member.level).toEqualTypeOf(); + expect(member.hotm).toBeDefined(); + expectTypeOf(member.hotm).toEqualTypeOf(); + expect(member.highestMagicalPower).toBeDefined(); + expectTypeOf(member.highestMagicalPower).toEqualTypeOf(); + expect(member.fairySouls).toBeDefined(); + expectTypeOf(member.fairySouls).toEqualTypeOf(); + expect(member.fairyExchanges).toBeDefined(); + expectTypeOf(member.fairyExchanges).toEqualTypeOf(); + expect(member.skills).toBeDefined(); + expectTypeOf(member.skills).toEqualTypeOf(); + expect(member.bestiary).toBeDefined(); + expectTypeOf(member.bestiary).toEqualTypeOf(); + expect(member.slayer).toBeDefined(); + expectTypeOf(member.slayer).toEqualTypeOf(); + expect(member.crimsonIsle).toBeDefined(); + expectTypeOf(member.crimsonIsle).toEqualTypeOf(); + expect(member.dungeons).toBeDefined(); + expectTypeOf(member.dungeons).toEqualTypeOf(); + expect(member.collections).toBeDefined(); + expectTypeOf(member.collections).toEqualTypeOf>(); + expect(member.purse).toBeDefined(); + expectTypeOf(member.purse).toEqualTypeOf(); + expect(member.stats).toBeDefined(); + expectTypeOf(member.stats).toEqualTypeOf(); + expect(member.pets).toBeDefined(); + expectTypeOf(member.pets).toEqualTypeOf(); + member.pets.forEach((pet: SkyblockPet) => { + expect(pet).toBeDefined(); + expect(pet).toBeInstanceOf(SkyblockPet); + expectTypeOf(pet).toEqualTypeOf(); + expect(pet.uuid).toBeDefined(); + expectTypeOf(pet.uuid).toEqualTypeOf(); + expect(pet.name).toBeDefined(); + expectTypeOf(pet.name).toEqualTypeOf(); + expect(pet.xp).toBeDefined(); + expect(pet.xp).toBeGreaterThanOrEqual(0); + expectTypeOf(pet.xp).toEqualTypeOf(); + expect(pet.active).toBeDefined(); + expectTypeOf(pet.active).toEqualTypeOf(); + expect(pet.rarity).toBeDefined(); + expectTypeOf(pet.rarity).toEqualTypeOf(); + expect(pet.petScore).toBeDefined(); + expect(pet.petScore).toBeGreaterThanOrEqual(0); + expectTypeOf(pet.petScore).toEqualTypeOf(); + expect(pet.heldItem).toBeDefined(); + expectTypeOf(pet.heldItem).toEqualTypeOf(); + expect(pet.candyUsed).toBeDefined(); + expect(pet.candyUsed).toBeGreaterThanOrEqual(0); + expectTypeOf(pet.candyUsed).toEqualTypeOf(); + expect(pet.skin).toBeDefined(); + expectTypeOf(pet.skin).toEqualTypeOf(); + expect(pet.toString()).toBeDefined(); + expect(pet.toString()).toBe(pet.name); + expectTypeOf(pet.toString()).toEqualTypeOf(); + }); + expect(member.jacob).toBeDefined(); + expectTypeOf(member.jacob).toEqualTypeOf(); + expect(member.chocolate).toBeDefined(); + expectTypeOf(member.chocolate).toEqualTypeOf(); + expect(member.getArmor()).toBeDefined(); + expectTypeOf(member.getArmor).toEqualTypeOf<() => Promise>(); + expectTypeOf(member.getArmor()).toEqualTypeOf>(); + expect(member.getWardrobe()).toBeDefined(); + expectTypeOf(member.getWardrobe).toEqualTypeOf<() => Promise>(); + expectTypeOf(member.getWardrobe()).toEqualTypeOf>(); + expect(member.getEnderChest()).toBeDefined(); + expectTypeOf(member.getEnderChest).toEqualTypeOf<() => Promise>(); + expectTypeOf(member.getEnderChest()).toEqualTypeOf>(); + expect(member.getInventory()).toBeDefined(); + expectTypeOf(member.getInventory).toEqualTypeOf<() => Promise>(); + expectTypeOf(member.getInventory()).toEqualTypeOf>(); + const inv = await member.getInventory(); + inv.forEach((item: SkyblockInventoryItem) => { + expect(item.itemId).toBeDefined(); + expect(item.itemId).toBeGreaterThanOrEqual(0); + expectTypeOf(item.itemId).toEqualTypeOf(); + expect(item.count).toBeDefined(); + expect(item.count).toBeGreaterThanOrEqual(0); + expectTypeOf(item.count).toEqualTypeOf(); + expect(item.name).toBeDefined(); + expectTypeOf(item.name).toEqualTypeOf(); + expect(item.lore).toBeDefined(); + expectTypeOf(item.lore).toEqualTypeOf(); + expect(item.loreArray).toBeDefined(); + expectTypeOf(item.loreArray).toEqualTypeOf(); + expect(item.loreForEmbed).toBeDefined(); + expectTypeOf(item.loreForEmbed).toEqualTypeOf(); + expect(item.color).toBeDefined(); + expectTypeOf(item.color).toEqualTypeOf(); + expect(item.enchantments).toBeDefined(); + expectTypeOf(item.enchantments).toEqualTypeOf>(); + expect(item.reforge).toBeDefined(); + expectTypeOf(item.reforge).toEqualTypeOf(); + expect(item.gemstones).toBeDefined(); + expectTypeOf(item.gemstones).toEqualTypeOf(); + expect(item.damage).toBeDefined(); + expect(item.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(item.damage).toEqualTypeOf(); + expect(item.rarity).toBeDefined(); + expectTypeOf(item.rarity).toEqualTypeOf(); + expect(item.dungeonStars).toBeDefined(); + expect(item.dungeonStars).toBeGreaterThanOrEqual(0); + expectTypeOf(item.dungeonStars).toEqualTypeOf(); + expect(item.gearScore).toBeDefined(); + expect(item.gearScore).toBeGreaterThanOrEqual(0); + expectTypeOf(item.gearScore).toEqualTypeOf(); + expect(item.uuid).toBeDefined(); + expectTypeOf(item.uuid).toEqualTypeOf(); + expect(item.soulbound).toBeDefined(); + expectTypeOf(item.soulbound).toEqualTypeOf(); + expect(item.artOfWar).toBeDefined(); + expect(item.artOfWar).toBeGreaterThanOrEqual(0); + expectTypeOf(item.artOfWar).toEqualTypeOf(); + expect(item.rune).toBeDefined(); + expectTypeOf(item.rune).toEqualTypeOf(); + expect(item.hotPotatoBooks).toBeDefined(); + expect(item.hotPotatoBooks).toBeGreaterThanOrEqual(0); + expectTypeOf(item.hotPotatoBooks).toEqualTypeOf(); + expect(item.recombobulated).toBeDefined(); + expectTypeOf(item.recombobulated).toEqualTypeOf(); + expect(item.attributes).toBeDefined(); + expectTypeOf(item.attributes).toEqualTypeOf(); + expect(item.hecatomb).toBeDefined(); + expect(item.hecatomb).toBeGreaterThanOrEqual(0); + expectTypeOf(item.hecatomb).toEqualTypeOf(); + expect(item.champion).toBeDefined(); + expect(item.champion).toBeGreaterThanOrEqual(0); + expectTypeOf(item.champion).toEqualTypeOf(); + expect(item.cultivating).toBeDefined(); + expect(item.cultivating).toBeGreaterThanOrEqual(0); + expectTypeOf(item.cultivating).toEqualTypeOf(); + expect(item.expertise).toBeDefined(); + expect(item.expertise).toBeGreaterThanOrEqual(0); + expectTypeOf(item.expertise).toEqualTypeOf(); + expect(item.compact).toBeDefined(); + expect(item.compact).toBeGreaterThanOrEqual(0); + expectTypeOf(item.compact).toEqualTypeOf(); + expect(item.blocksWalked).toBeDefined(); + expect(item.blocksWalked).toBeGreaterThanOrEqual(0); + expectTypeOf(item.blocksWalked).toEqualTypeOf(); + expect(item.toString()).toBeDefined(); + expect(item.toString()).toBe(item.name); + expectTypeOf(item.toString()).toEqualTypeOf(); + }); + expect(member.getPetScore()).toBeDefined(); + expectTypeOf(member.getPetScore).toEqualTypeOf<() => number>(); + expect(member.getPetScore()).toBeGreaterThanOrEqual(0); + expectTypeOf(member.getPetScore()).toEqualTypeOf(); + expect(member.getEquipment()).toBeDefined(); + expectTypeOf(member.getEquipment).toEqualTypeOf<() => Promise>(); + expectTypeOf(member.getEquipment()).toEqualTypeOf>(); + expect(member.getPersonalVault()).toBeDefined(); + expectTypeOf(member.getPersonalVault).toEqualTypeOf<() => Promise>(); + expectTypeOf(member.getPersonalVault()).toEqualTypeOf>(); + expect(member.getNetworth()).toBeDefined(); + expectTypeOf(member.getNetworth).toEqualTypeOf<() => Promise>(); + expectTypeOf(member.getNetworth()).toEqualTypeOf>(); + expect(member.getFarmingWeight()).toBeDefined(); + expectTypeOf(member.getFarmingWeight).toEqualTypeOf<() => number>(); + expect(member.getFarmingWeight()).toBeGreaterThanOrEqual(0); + expectTypeOf(member.getFarmingWeight()).toEqualTypeOf(); + expect(member.getFarmingWeight()).toBeGreaterThanOrEqual(0); + expect(member.toString()).toBeDefined(); + expect(member.toString()).toBe(member.uuid); + expectTypeOf(member.toString()).toEqualTypeOf(); + }); + client.destroy(); +}); + +test('getSkyblockMember (garden)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getSkyblockMember('add71246c46e455c8345c129ea6f146c', { garden: true }); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf | RequestData>(); + data = data as Map; + data.forEach(async (member: SkyblockMember) => { + expect(member).toBeDefined(); + expect(member).toBeInstanceOf(SkyblockMember); + expectTypeOf(member).toEqualTypeOf(); + expect(member.uuid).toBeDefined(); + expectTypeOf(member.uuid).toEqualTypeOf(); + expect(member.gameMode).toBeDefined(); + expectTypeOf(member.gameMode).toEqualTypeOf(); + expect(member.selected).toBeDefined(); + expectTypeOf(member.selected).toEqualTypeOf(); + expect(member.garden).toBeDefined(); + expectTypeOf(member.garden).toEqualTypeOf(); + expect(member.museum).toBeDefined(); + expect(member.museum).toBeNull(); + expectTypeOf(member.museum).toEqualTypeOf(); + expect(member.profileName).toBeDefined(); + expectTypeOf(member.profileName).toEqualTypeOf(); + expect(member.profileId).toBeDefined(); + expectTypeOf(member.profileId).toEqualTypeOf(); + expect(member.firstJoinTimestamp).toBeDefined(); + expectTypeOf(member.firstJoinTimestamp).toEqualTypeOf(); + expect(member.firstJoinAt).toBeDefined(); + expectTypeOf(member.firstJoinAt).toEqualTypeOf(); + expect(member.experience).toBeDefined(); + expect(member.experience).toBeGreaterThanOrEqual(0); + expectTypeOf(member.experience).toEqualTypeOf(); + expect(member.level).toBeDefined(); + expectTypeOf(member.level).toEqualTypeOf(); + expect(member.hotm).toBeDefined(); + expectTypeOf(member.hotm).toEqualTypeOf(); + expect(member.highestMagicalPower).toBeDefined(); + expectTypeOf(member.highestMagicalPower).toEqualTypeOf(); + expect(member.fairySouls).toBeDefined(); + expectTypeOf(member.fairySouls).toEqualTypeOf(); + expect(member.fairyExchanges).toBeDefined(); + expectTypeOf(member.fairyExchanges).toEqualTypeOf(); + expect(member.skills).toBeDefined(); + expectTypeOf(member.skills).toEqualTypeOf(); + expect(member.bestiary).toBeDefined(); + expectTypeOf(member.bestiary).toEqualTypeOf(); + expect(member.slayer).toBeDefined(); + expectTypeOf(member.slayer).toEqualTypeOf(); + expect(member.crimsonIsle).toBeDefined(); + expectTypeOf(member.crimsonIsle).toEqualTypeOf(); + expect(member.dungeons).toBeDefined(); + expectTypeOf(member.dungeons).toEqualTypeOf(); + expect(member.collections).toBeDefined(); + expectTypeOf(member.collections).toEqualTypeOf>(); + expect(member.purse).toBeDefined(); + expectTypeOf(member.purse).toEqualTypeOf(); + expect(member.stats).toBeDefined(); + expectTypeOf(member.stats).toEqualTypeOf(); + expect(member.pets).toBeDefined(); + expectTypeOf(member.pets).toEqualTypeOf(); + member.pets.forEach((pet: SkyblockPet) => { + expect(pet).toBeDefined(); + expect(pet).toBeInstanceOf(SkyblockPet); + expectTypeOf(pet).toEqualTypeOf(); + expect(pet.uuid).toBeDefined(); + expectTypeOf(pet.uuid).toEqualTypeOf(); + expect(pet.name).toBeDefined(); + expectTypeOf(pet.name).toEqualTypeOf(); + expect(pet.xp).toBeDefined(); + expect(pet.xp).toBeGreaterThanOrEqual(0); + expectTypeOf(pet.xp).toEqualTypeOf(); + expect(pet.active).toBeDefined(); + expectTypeOf(pet.active).toEqualTypeOf(); + expect(pet.rarity).toBeDefined(); + expectTypeOf(pet.rarity).toEqualTypeOf(); + expect(pet.petScore).toBeDefined(); + expect(pet.petScore).toBeGreaterThanOrEqual(0); + expectTypeOf(pet.petScore).toEqualTypeOf(); + expect(pet.heldItem).toBeDefined(); + expectTypeOf(pet.heldItem).toEqualTypeOf(); + expect(pet.candyUsed).toBeDefined(); + expect(pet.candyUsed).toBeGreaterThanOrEqual(0); + expectTypeOf(pet.candyUsed).toEqualTypeOf(); + expect(pet.skin).toBeDefined(); + expectTypeOf(pet.skin).toEqualTypeOf(); + expect(pet.toString()).toBeDefined(); + expect(pet.toString()).toBe(pet.name); + expectTypeOf(pet.toString()).toEqualTypeOf(); + }); + expect(member.jacob).toBeDefined(); + expectTypeOf(member.jacob).toEqualTypeOf(); + expect(member.chocolate).toBeDefined(); + expectTypeOf(member.chocolate).toEqualTypeOf(); + expect(member.getArmor()).toBeDefined(); + expectTypeOf(member.getArmor).toEqualTypeOf<() => Promise>(); + expectTypeOf(member.getArmor()).toEqualTypeOf>(); + expect(member.getWardrobe()).toBeDefined(); + expectTypeOf(member.getWardrobe).toEqualTypeOf<() => Promise>(); + expectTypeOf(member.getWardrobe()).toEqualTypeOf>(); + expect(member.getEnderChest()).toBeDefined(); + expectTypeOf(member.getEnderChest).toEqualTypeOf<() => Promise>(); + expectTypeOf(member.getEnderChest()).toEqualTypeOf>(); + expect(member.getInventory()).toBeDefined(); + expectTypeOf(member.getInventory).toEqualTypeOf<() => Promise>(); + expectTypeOf(member.getInventory()).toEqualTypeOf>(); + const inv = await member.getInventory(); + inv.forEach((item: SkyblockInventoryItem) => { + expect(item.itemId).toBeDefined(); + expect(item.itemId).toBeGreaterThanOrEqual(0); + expectTypeOf(item.itemId).toEqualTypeOf(); + expect(item.count).toBeDefined(); + expect(item.count).toBeGreaterThanOrEqual(0); + expectTypeOf(item.count).toEqualTypeOf(); + expect(item.name).toBeDefined(); + expectTypeOf(item.name).toEqualTypeOf(); + expect(item.lore).toBeDefined(); + expectTypeOf(item.lore).toEqualTypeOf(); + expect(item.loreArray).toBeDefined(); + expectTypeOf(item.loreArray).toEqualTypeOf(); + expect(item.loreForEmbed).toBeDefined(); + expectTypeOf(item.loreForEmbed).toEqualTypeOf(); + expect(item.color).toBeDefined(); + expectTypeOf(item.color).toEqualTypeOf(); + expect(item.enchantments).toBeDefined(); + expectTypeOf(item.enchantments).toEqualTypeOf>(); + expect(item.reforge).toBeDefined(); + expectTypeOf(item.reforge).toEqualTypeOf(); + expect(item.gemstones).toBeDefined(); + expectTypeOf(item.gemstones).toEqualTypeOf(); + expect(item.damage).toBeDefined(); + expect(item.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(item.damage).toEqualTypeOf(); + expect(item.rarity).toBeDefined(); + expectTypeOf(item.rarity).toEqualTypeOf(); + expect(item.dungeonStars).toBeDefined(); + expect(item.dungeonStars).toBeGreaterThanOrEqual(0); + expectTypeOf(item.dungeonStars).toEqualTypeOf(); + expect(item.gearScore).toBeDefined(); + expect(item.gearScore).toBeGreaterThanOrEqual(0); + expectTypeOf(item.gearScore).toEqualTypeOf(); + expect(item.uuid).toBeDefined(); + expectTypeOf(item.uuid).toEqualTypeOf(); + expect(item.soulbound).toBeDefined(); + expectTypeOf(item.soulbound).toEqualTypeOf(); + expect(item.artOfWar).toBeDefined(); + expect(item.artOfWar).toBeGreaterThanOrEqual(0); + expectTypeOf(item.artOfWar).toEqualTypeOf(); + expect(item.rune).toBeDefined(); + expectTypeOf(item.rune).toEqualTypeOf(); + expect(item.hotPotatoBooks).toBeDefined(); + expect(item.hotPotatoBooks).toBeGreaterThanOrEqual(0); + expectTypeOf(item.hotPotatoBooks).toEqualTypeOf(); + expect(item.recombobulated).toBeDefined(); + expectTypeOf(item.recombobulated).toEqualTypeOf(); + expect(item.attributes).toBeDefined(); + expectTypeOf(item.attributes).toEqualTypeOf(); + expect(item.hecatomb).toBeDefined(); + expect(item.hecatomb).toBeGreaterThanOrEqual(0); + expectTypeOf(item.hecatomb).toEqualTypeOf(); + expect(item.champion).toBeDefined(); + expect(item.champion).toBeGreaterThanOrEqual(0); + expectTypeOf(item.champion).toEqualTypeOf(); + expect(item.cultivating).toBeDefined(); + expect(item.cultivating).toBeGreaterThanOrEqual(0); + expectTypeOf(item.cultivating).toEqualTypeOf(); + expect(item.expertise).toBeDefined(); + expect(item.expertise).toBeGreaterThanOrEqual(0); + expectTypeOf(item.expertise).toEqualTypeOf(); + expect(item.compact).toBeDefined(); + expect(item.compact).toBeGreaterThanOrEqual(0); + expectTypeOf(item.compact).toEqualTypeOf(); + expect(item.blocksWalked).toBeDefined(); + expect(item.blocksWalked).toBeGreaterThanOrEqual(0); + expectTypeOf(item.blocksWalked).toEqualTypeOf(); + expect(item.toString()).toBeDefined(); + expect(item.toString()).toBe(item.name); + expectTypeOf(item.toString()).toEqualTypeOf(); + }); + expect(member.getPetScore()).toBeDefined(); + expectTypeOf(member.getPetScore).toEqualTypeOf<() => number>(); + expect(member.getPetScore()).toBeGreaterThanOrEqual(0); + expectTypeOf(member.getPetScore()).toEqualTypeOf(); + expect(member.getEquipment()).toBeDefined(); + expectTypeOf(member.getEquipment).toEqualTypeOf<() => Promise>(); + expectTypeOf(member.getEquipment()).toEqualTypeOf>(); + expect(member.getPersonalVault()).toBeDefined(); + expectTypeOf(member.getPersonalVault).toEqualTypeOf<() => Promise>(); + expectTypeOf(member.getPersonalVault()).toEqualTypeOf>(); + expect(member.getNetworth()).toBeDefined(); + expectTypeOf(member.getNetworth).toEqualTypeOf<() => Promise>(); + expectTypeOf(member.getNetworth()).toEqualTypeOf>(); + expect(member.getFarmingWeight()).toBeDefined(); + expectTypeOf(member.getFarmingWeight).toEqualTypeOf<() => number>(); + expect(member.getFarmingWeight()).toBeGreaterThanOrEqual(0); + expectTypeOf(member.getFarmingWeight()).toEqualTypeOf(); + expect(member.getFarmingWeight()).toBeGreaterThanOrEqual(0); + expect(member.toString()).toBeDefined(); + expect(member.toString()).toBe(member.uuid); + expectTypeOf(member.toString()).toEqualTypeOf(); + }); + client.destroy(); +}); +test('getSkyblockMember', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getSkyblockMember('14727faefbdc4aff848cd2713eb9939e'); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf | RequestData>(); + data = data as Map; + data.forEach(async (member: SkyblockMember) => { + expect(member).toBeDefined(); + expect(member).toBeInstanceOf(SkyblockMember); + expectTypeOf(member).toEqualTypeOf(); + expect(member.uuid).toBeDefined(); + expectTypeOf(member.uuid).toEqualTypeOf(); + expect(member.gameMode).toBeDefined(); + expectTypeOf(member.gameMode).toEqualTypeOf(); + expect(member.selected).toBeDefined(); + expectTypeOf(member.selected).toEqualTypeOf(); + expect(member.garden).toBeDefined(); + expect(member.garden).toBeNull(); + expectTypeOf(member.garden).toEqualTypeOf(); + expect(member.museum).toBeDefined(); + expect(member.museum).toBeNull(); + expectTypeOf(member.museum).toEqualTypeOf(); + expect(member.profileName).toBeDefined(); + expectTypeOf(member.profileName).toEqualTypeOf(); + expect(member.profileId).toBeDefined(); + expectTypeOf(member.profileId).toEqualTypeOf(); + expect(member.firstJoinTimestamp).toBeDefined(); + expectTypeOf(member.firstJoinTimestamp).toEqualTypeOf(); + expect(member.firstJoinAt).toBeDefined(); + expectTypeOf(member.firstJoinAt).toEqualTypeOf(); + expect(member.experience).toBeDefined(); + expect(member.experience).toBeGreaterThanOrEqual(0); + expectTypeOf(member.experience).toEqualTypeOf(); + expect(member.level).toBeDefined(); + expectTypeOf(member.level).toEqualTypeOf(); + expect(member.hotm).toBeDefined(); + expectTypeOf(member.hotm).toEqualTypeOf(); + expect(member.highestMagicalPower).toBeDefined(); + expectTypeOf(member.highestMagicalPower).toEqualTypeOf(); + expect(member.fairySouls).toBeDefined(); + expectTypeOf(member.fairySouls).toEqualTypeOf(); + expect(member.fairyExchanges).toBeDefined(); + expectTypeOf(member.fairyExchanges).toEqualTypeOf(); + expect(member.skills).toBeDefined(); + expectTypeOf(member.skills).toEqualTypeOf(); + expect(member.bestiary).toBeDefined(); + expectTypeOf(member.bestiary).toEqualTypeOf(); + expect(member.slayer).toBeDefined(); + expectTypeOf(member.slayer).toEqualTypeOf(); + expect(member.crimsonIsle).toBeDefined(); + expectTypeOf(member.crimsonIsle).toEqualTypeOf(); + expect(member.dungeons).toBeDefined(); + expectTypeOf(member.dungeons).toEqualTypeOf(); + expect(member.collections).toBeDefined(); + expectTypeOf(member.collections).toEqualTypeOf>(); + expect(member.purse).toBeDefined(); + expectTypeOf(member.purse).toEqualTypeOf(); + expect(member.stats).toBeDefined(); + expectTypeOf(member.stats).toEqualTypeOf(); + expect(member.pets).toBeDefined(); + expectTypeOf(member.pets).toEqualTypeOf(); + member.pets.forEach((pet: SkyblockPet) => { + expect(pet).toBeDefined(); + expect(pet).toBeInstanceOf(SkyblockPet); + expectTypeOf(pet).toEqualTypeOf(); + expect(pet.uuid).toBeDefined(); + expectTypeOf(pet.uuid).toEqualTypeOf(); + expect(pet.name).toBeDefined(); + expectTypeOf(pet.name).toEqualTypeOf(); + expect(pet.xp).toBeDefined(); + expect(pet.xp).toBeGreaterThanOrEqual(0); + expectTypeOf(pet.xp).toEqualTypeOf(); + expect(pet.active).toBeDefined(); + expectTypeOf(pet.active).toEqualTypeOf(); + expect(pet.rarity).toBeDefined(); + expectTypeOf(pet.rarity).toEqualTypeOf(); + expect(pet.petScore).toBeDefined(); + expect(pet.petScore).toBeGreaterThanOrEqual(0); + expectTypeOf(pet.petScore).toEqualTypeOf(); + expect(pet.heldItem).toBeDefined(); + expectTypeOf(pet.heldItem).toEqualTypeOf(); + expect(pet.candyUsed).toBeDefined(); + expect(pet.candyUsed).toBeGreaterThanOrEqual(0); + expectTypeOf(pet.candyUsed).toEqualTypeOf(); + expect(pet.skin).toBeDefined(); + expectTypeOf(pet.skin).toEqualTypeOf(); + expect(pet.toString()).toBeDefined(); + expect(pet.toString()).toBe(pet.name); + expectTypeOf(pet.toString()).toEqualTypeOf(); + }); + expect(member.jacob).toBeDefined(); + expectTypeOf(member.jacob).toEqualTypeOf(); + expect(member.chocolate).toBeDefined(); + expectTypeOf(member.chocolate).toEqualTypeOf(); + expect(member.getArmor()).toBeDefined(); + expectTypeOf(member.getArmor).toEqualTypeOf<() => Promise>(); + expectTypeOf(member.getArmor()).toEqualTypeOf>(); + expect(member.getWardrobe()).toBeDefined(); + expectTypeOf(member.getWardrobe).toEqualTypeOf<() => Promise>(); + expectTypeOf(member.getWardrobe()).toEqualTypeOf>(); + expect(member.getEnderChest()).toBeDefined(); + expectTypeOf(member.getEnderChest).toEqualTypeOf<() => Promise>(); + expectTypeOf(member.getEnderChest()).toEqualTypeOf>(); + expect(member.getInventory()).toBeDefined(); + expectTypeOf(member.getInventory).toEqualTypeOf<() => Promise>(); + expectTypeOf(member.getInventory()).toEqualTypeOf>(); + const inv = await member.getInventory(); + inv.forEach((item: SkyblockInventoryItem) => { + expect(item.itemId).toBeDefined(); + expect(item.itemId).toBeGreaterThanOrEqual(0); + expectTypeOf(item.itemId).toEqualTypeOf(); + expect(item.count).toBeDefined(); + expect(item.count).toBeGreaterThanOrEqual(0); + expectTypeOf(item.count).toEqualTypeOf(); + expect(item.name).toBeDefined(); + expectTypeOf(item.name).toEqualTypeOf(); + expect(item.lore).toBeDefined(); + expectTypeOf(item.lore).toEqualTypeOf(); + expect(item.loreArray).toBeDefined(); + expectTypeOf(item.loreArray).toEqualTypeOf(); + expect(item.loreForEmbed).toBeDefined(); + expectTypeOf(item.loreForEmbed).toEqualTypeOf(); + expect(item.color).toBeDefined(); + expectTypeOf(item.color).toEqualTypeOf(); + expect(item.enchantments).toBeDefined(); + expectTypeOf(item.enchantments).toEqualTypeOf>(); + expect(item.reforge).toBeDefined(); + expectTypeOf(item.reforge).toEqualTypeOf(); + expect(item.gemstones).toBeDefined(); + expectTypeOf(item.gemstones).toEqualTypeOf(); + expect(item.damage).toBeDefined(); + expect(item.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(item.damage).toEqualTypeOf(); + expect(item.rarity).toBeDefined(); + expectTypeOf(item.rarity).toEqualTypeOf(); + expect(item.dungeonStars).toBeDefined(); + expect(item.dungeonStars).toBeGreaterThanOrEqual(0); + expectTypeOf(item.dungeonStars).toEqualTypeOf(); + expect(item.gearScore).toBeDefined(); + expect(item.gearScore).toBeGreaterThanOrEqual(0); + expectTypeOf(item.gearScore).toEqualTypeOf(); + expect(item.uuid).toBeDefined(); + expectTypeOf(item.uuid).toEqualTypeOf(); + expect(item.soulbound).toBeDefined(); + expectTypeOf(item.soulbound).toEqualTypeOf(); + expect(item.artOfWar).toBeDefined(); + expect(item.artOfWar).toBeGreaterThanOrEqual(0); + expectTypeOf(item.artOfWar).toEqualTypeOf(); + expect(item.rune).toBeDefined(); + expectTypeOf(item.rune).toEqualTypeOf(); + expect(item.hotPotatoBooks).toBeDefined(); + expect(item.hotPotatoBooks).toBeGreaterThanOrEqual(0); + expectTypeOf(item.hotPotatoBooks).toEqualTypeOf(); + expect(item.recombobulated).toBeDefined(); + expectTypeOf(item.recombobulated).toEqualTypeOf(); + expect(item.attributes).toBeDefined(); + expectTypeOf(item.attributes).toEqualTypeOf(); + expect(item.hecatomb).toBeDefined(); + expect(item.hecatomb).toBeGreaterThanOrEqual(0); + expectTypeOf(item.hecatomb).toEqualTypeOf(); + expect(item.champion).toBeDefined(); + expect(item.champion).toBeGreaterThanOrEqual(0); + expectTypeOf(item.champion).toEqualTypeOf(); + expect(item.cultivating).toBeDefined(); + expect(item.cultivating).toBeGreaterThanOrEqual(0); + expectTypeOf(item.cultivating).toEqualTypeOf(); + expect(item.expertise).toBeDefined(); + expect(item.expertise).toBeGreaterThanOrEqual(0); + expectTypeOf(item.expertise).toEqualTypeOf(); + expect(item.compact).toBeDefined(); + expect(item.compact).toBeGreaterThanOrEqual(0); + expectTypeOf(item.compact).toEqualTypeOf(); + expect(item.blocksWalked).toBeDefined(); + expect(item.blocksWalked).toBeGreaterThanOrEqual(0); + expectTypeOf(item.blocksWalked).toEqualTypeOf(); + expect(item.toString()).toBeDefined(); + expect(item.toString()).toBe(item.name); + expectTypeOf(item.toString()).toEqualTypeOf(); + }); + expect(member.getPetScore()).toBeDefined(); + expectTypeOf(member.getPetScore).toEqualTypeOf<() => number>(); + expect(member.getPetScore()).toBeGreaterThanOrEqual(0); + expectTypeOf(member.getPetScore()).toEqualTypeOf(); + expect(member.getEquipment()).toBeDefined(); + expectTypeOf(member.getEquipment).toEqualTypeOf<() => Promise>(); + expectTypeOf(member.getEquipment()).toEqualTypeOf>(); + expect(member.getPersonalVault()).toBeDefined(); + expectTypeOf(member.getPersonalVault).toEqualTypeOf<() => Promise>(); + expectTypeOf(member.getPersonalVault()).toEqualTypeOf>(); + expect(member.getNetworth()).toBeDefined(); + expectTypeOf(member.getNetworth).toEqualTypeOf<() => Promise>(); + expectTypeOf(member.getNetworth()).toEqualTypeOf>(); + expect(member.getFarmingWeight()).toBeDefined(); + expectTypeOf(member.getFarmingWeight).toEqualTypeOf<() => number>(); + expect(member.getFarmingWeight()).toBeGreaterThanOrEqual(0); + expectTypeOf(member.getFarmingWeight()).toEqualTypeOf(); + expect(member.getFarmingWeight()).toBeGreaterThanOrEqual(0); + expect(member.toString()).toBeDefined(); + expect(member.toString()).toBe(member.uuid); + expectTypeOf(member.toString()).toEqualTypeOf(); + }); + client.destroy(); +}); diff --git a/src/API/getSkyblockMember.ts b/src/API/getSkyblockMember.ts new file mode 100644 index 000000000..c84bf5a01 --- /dev/null +++ b/src/API/getSkyblockMember.ts @@ -0,0 +1,42 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import RequestData from '../Private/RequestData.js'; +import SkyblockMember from '../Structures/SkyBlock/SkyblockMember.js'; +import { SkyblockRequestOptions } from '../Types/API.js'; + +class getSkyblockMember extends Endpoint { + readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute(query: string, options?: SkyblockRequestOptions): Promise | RequestData> { + if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); + query = await this.client.requestHandler.toUUID(query); + const res = await this.client.requestHandler.request(`/skyblock/profiles?uuid=${query}`, options); + if (res.options.raw) return res; + if (!res.data.profiles || !res.data.profiles.length) throw new Error(this.client.errors.NO_SKYBLOCK_PROFILES); + const memberByProfileName = new Map(); + for (const profile of res.data.profiles) { + memberByProfileName.set( + profile.cute_name, + new SkyblockMember({ + uuid: query, + profileId: profile.profile_id, + garden: options?.garden ? await this.client.getSkyblockGarden(profile.profile_id) : null, + museum: options?.museum ? await this.client.getSkyblockMuseum(query, profile.profile_id) : null, + profileName: profile.cute_name, + gameMode: profile.game_mode || null, + m: profile.members[query], + banking: profile.banking, + communityUpgrades: profile.community_upgrades, + selected: profile.selected + }) + ); + } + return memberByProfileName; + } +} + +export default getSkyblockMember; diff --git a/src/API/getSkyblockMuseum.test.ts b/src/API/getSkyblockMuseum.test.ts new file mode 100644 index 000000000..98456d2ff --- /dev/null +++ b/src/API/getSkyblockMuseum.test.ts @@ -0,0 +1,96 @@ +import Client from '../Client.js'; +import RequestData from '../Private/RequestData.js'; +import SkyblockInventoryItem from '../Structures/SkyBlock/SkyblockInventoryItem.js'; +import SkyblockMuseum from '../Structures/SkyBlock/SkyblockMuseum.js'; +import SkyblockMuseumItem from '../Structures/SkyBlock/SkyblockMuseumItem.js'; +import SkyblockProfile from '../Structures/SkyBlock/SkyblockProfile.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('getSkyblockMuseum (no input)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + expect(() => client.getSkyblockMuseum()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); + client.destroy(); +}); + +test('getSkyblockMuseum (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const profiles = (await client.getSkyblockProfiles('63fe6f4c4b0643b2abd02d15dc303e41')) as SkyblockProfile[]; + const profile = profiles.find((profile: SkyblockProfile) => true === profile.selected) || null; + if (null === profile) throw new Error("Something wen't wrong while fetching profiles"); + const data = await client.getSkyblockMuseum('63fe6f4c4b0643b2abd02d15dc303e41', profile.profileId, { raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getSkyblockMuseum', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const profiles = (await client.getSkyblockProfiles('63fe6f4c4b0643b2abd02d15dc303e41')) as SkyblockProfile[]; + const profile = profiles.find((profile: SkyblockProfile) => true === profile.selected) || null; + if (null === profile) throw new Error("Something wen't wrong while fetching profiles"); + let data = await client.getSkyblockMuseum('63fe6f4c4b0643b2abd02d15dc303e41', profile.profileId); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as SkyblockMuseum; + + expect(data.getItems()).toBeDefined(); + expectTypeOf(data.getItems).toEqualTypeOf<() => Promise>(); + expectTypeOf(data.getItems()).toEqualTypeOf>(); + + const items = await data.getItems(); + expect(items).toBeDefined(); + expectTypeOf(items).toEqualTypeOf(); + items.forEach((item: SkyblockMuseumItem) => { + expect(item).toBeDefined(); + expect(item).toBeInstanceOf(SkyblockMuseumItem); + expectTypeOf(item).toEqualTypeOf(); + + expect(item.name).toBeDefined(); + expectTypeOf(item.name).toEqualTypeOf(); + + expect(item.donated).toBeDefined(); + expectTypeOf(item.donated).toEqualTypeOf(); + + expect(item.featuredSlot).toBeDefined(); + expectTypeOf(item.featuredSlot).toEqualTypeOf(); + + expect(item.borrowing).toBeDefined(); + expectTypeOf(item.borrowing).toEqualTypeOf(); + + expect(item.items).toBeDefined(); + expectTypeOf(item.items).toEqualTypeOf(); + }); + + expect(data.getSpecial()).toBeDefined(); + expectTypeOf(data.getSpecial).toEqualTypeOf<() => Promise>(); + expectTypeOf(data.getSpecial()).toEqualTypeOf>(); + + const special = await data.getSpecial(); + expect(special).toBeDefined(); + expectTypeOf(special).toEqualTypeOf(); + special.forEach((item: SkyblockMuseumItem) => { + expect(item).toBeDefined(); + expect(item).toBeInstanceOf(SkyblockMuseumItem); + expectTypeOf(item).toEqualTypeOf(); + + expect(item.name).toBeDefined(); + expectTypeOf(item.name).toEqualTypeOf(); + + expect(item.donated).toBeDefined(); + expectTypeOf(item.donated).toEqualTypeOf(); + + expect(item.featuredSlot).toBeDefined(); + expectTypeOf(item.featuredSlot).toEqualTypeOf(); + + expect(item.borrowing).toBeDefined(); + expectTypeOf(item.borrowing).toEqualTypeOf(); + + expect(item.items).toBeDefined(); + expectTypeOf(item.items).toEqualTypeOf(); + }); + + client.destroy(); +}); diff --git a/src/API/getSkyblockMuseum.ts b/src/API/getSkyblockMuseum.ts new file mode 100644 index 000000000..6c900a420 --- /dev/null +++ b/src/API/getSkyblockMuseum.ts @@ -0,0 +1,26 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import RequestData from '../Private/RequestData.js'; +import SkyblockMuseum from '../Structures/SkyBlock/SkyblockMuseum.js'; +import type { RequestOptions } from '../Types/Requests.js'; + +class getSkyblockMuseum extends Endpoint { + readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute(query: string, profileId: string, options?: RequestOptions): Promise { + if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); + query = await this.client.requestHandler.toUUID(query); + const res = await this.client.requestHandler.request( + `/skyblock/museum?uuid=${query}&profile=${profileId}`, + options + ); + if (res.options.raw) return res; + return new SkyblockMuseum({ uuid: query, m: res.data, profileId: profileId }); + } +} + +export default getSkyblockMuseum; diff --git a/src/API/getSkyblockNews.test.ts b/src/API/getSkyblockNews.test.ts new file mode 100644 index 000000000..61904eebb --- /dev/null +++ b/src/API/getSkyblockNews.test.ts @@ -0,0 +1,38 @@ +import Client from '../Client.js'; +import RequestData from '../Private/RequestData.js'; +import SkyblockNews from '../Structures/SkyBlock/News/SkyblockNews.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('getSkyblockNews (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getSkyblockNews({ raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getSkyblockNews', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getSkyblockNews(); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as SkyblockNews[]; + data.forEach((news: SkyblockNews) => { + expect(news.title).toBeDefined(); + expectTypeOf(news.title).toEqualTypeOf(); + expect(news.link).toBeDefined(); + expectTypeOf(news.link).toEqualTypeOf(); + expect(news.rawDate).toBeDefined(); + expectTypeOf(news.rawDate).toEqualTypeOf(); + expect(news.date).toBeDefined(); + expectTypeOf(news.date).toEqualTypeOf(); + expect(news.version).toBeDefined(); + expectTypeOf(news.version).toEqualTypeOf(); + expect(news.toString()).toBeDefined(); + expect(news.toString()).toBe(news.title); + expectTypeOf(news.toString()).toEqualTypeOf(); + }); + + client.destroy(); +}); diff --git a/src/API/getSkyblockNews.ts b/src/API/getSkyblockNews.ts new file mode 100644 index 000000000..21a914ec8 --- /dev/null +++ b/src/API/getSkyblockNews.ts @@ -0,0 +1,21 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import RequestData from '../Private/RequestData.js'; +import SkyblockNews from '../Structures/SkyBlock/News/SkyblockNews.js'; +import type { RequestOptions } from '../Types/Requests.js'; + +class getSkyblockNews extends Endpoint { + readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute(options?: RequestOptions): Promise { + const res = await this.client.requestHandler.request('/skyblock/news', options); + if (res.options.raw) return res; + return res.data.items.map((i: any) => new SkyblockNews(i)); + } +} + +export default getSkyblockNews; diff --git a/src/API/getSkyblockProfiles.test.ts b/src/API/getSkyblockProfiles.test.ts new file mode 100644 index 000000000..a6a1bd2b5 --- /dev/null +++ b/src/API/getSkyblockProfiles.test.ts @@ -0,0 +1,159 @@ +import Client from '../Client.js'; +import RequestData from '../Private/RequestData.js'; +import SkyblockMember from '../Structures/SkyBlock/SkyblockMember.js'; +import SkyblockProfile from '../Structures/SkyBlock/SkyblockProfile.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('getSkyblockProfiles (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getSkyblockProfiles('14727faefbdc4aff848cd2713eb9939e', { raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getSkyblockProfiles (no input)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + expect(() => client.getSkyblockProfiles()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); + client.destroy(); +}); + +test('getSkyblockProfiles (no profiles)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + expect(() => client.getSkyblockProfiles('b45add7b081443909fb00aa9a3e15eb0')).rejects.toThrowError( + client.errors.NO_SKYBLOCK_PROFILES + ); + client.destroy(); +}); + +test('getSkyblockProfiles', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getSkyblockProfiles('14727faefbdc4aff848cd2713eb9939e'); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as SkyblockProfile[]; + + data.forEach((profile: SkyblockProfile) => { + expect(profile).toBeDefined(); + expectTypeOf(profile).toEqualTypeOf(); + + expect(profile.profileId).toBeDefined(); + expectTypeOf(profile.profileId).toEqualTypeOf(); + + expect(profile.profileName).toBeDefined(); + expectTypeOf(profile.profileName).toEqualTypeOf(); + + expect(profile.gameMode).toBeDefined(); + expectTypeOf(profile.gameMode).toEqualTypeOf(); + + expect(profile.banking).toBeDefined(); + expectTypeOf(profile.banking).toEqualTypeOf(); + + expect(profile.communityUpgrades).toBeDefined(); + expectTypeOf(profile.communityUpgrades).toEqualTypeOf(); + + expect(profile.selected).toBeDefined(); + expectTypeOf(profile.selected).toEqualTypeOf(); + + expect(profile.members).toBeDefined(); + expectTypeOf(profile.members).toEqualTypeOf(); + + expect(profile.me).toBeDefined(); + expectTypeOf(profile.me).toEqualTypeOf(); + + expect(profile.toString()).toBeDefined(); + expectTypeOf(profile.toString()).toEqualTypeOf(); + expect(profile.toString()).toBe(profile.profileName); + }); + + client.destroy(); +}); + +test('getSkyblockProfiles (garden)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getSkyblockProfiles('add71246c46e455c8345c129ea6f146c', { garden: true }); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as SkyblockProfile[]; + + data.forEach((profile: SkyblockProfile) => { + expect(profile).toBeDefined(); + expectTypeOf(profile).toEqualTypeOf(); + + expect(profile.profileId).toBeDefined(); + expectTypeOf(profile.profileId).toEqualTypeOf(); + + expect(profile.profileName).toBeDefined(); + expectTypeOf(profile.profileName).toEqualTypeOf(); + + expect(profile.gameMode).toBeDefined(); + expectTypeOf(profile.gameMode).toEqualTypeOf(); + + expect(profile.banking).toBeDefined(); + expectTypeOf(profile.banking).toEqualTypeOf(); + + expect(profile.communityUpgrades).toBeDefined(); + expectTypeOf(profile.communityUpgrades).toEqualTypeOf(); + + expect(profile.selected).toBeDefined(); + expectTypeOf(profile.selected).toEqualTypeOf(); + + expect(profile.members).toBeDefined(); + expectTypeOf(profile.members).toEqualTypeOf(); + + expect(profile.me).toBeDefined(); + expectTypeOf(profile.me).toEqualTypeOf(); + + expect(profile.toString()).toBeDefined(); + expectTypeOf(profile.toString()).toEqualTypeOf(); + expect(profile.toString()).toBe(profile.profileName); + }); + + client.destroy(); +}); + +test('getSkyblockProfiles (museum)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getSkyblockProfiles('63fe6f4c4b0643b2abd02d15dc303e41', { museum: true }); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as SkyblockProfile[]; + + data.forEach((profile: SkyblockProfile) => { + expect(profile).toBeDefined(); + expectTypeOf(profile).toEqualTypeOf(); + + expect(profile.profileId).toBeDefined(); + expectTypeOf(profile.profileId).toEqualTypeOf(); + + expect(profile.profileName).toBeDefined(); + expectTypeOf(profile.profileName).toEqualTypeOf(); + + expect(profile.gameMode).toBeDefined(); + expectTypeOf(profile.gameMode).toEqualTypeOf(); + + expect(profile.banking).toBeDefined(); + expectTypeOf(profile.banking).toEqualTypeOf(); + + expect(profile.communityUpgrades).toBeDefined(); + expectTypeOf(profile.communityUpgrades).toEqualTypeOf(); + + expect(profile.selected).toBeDefined(); + expectTypeOf(profile.selected).toEqualTypeOf(); + + expect(profile.members).toBeDefined(); + expectTypeOf(profile.members).toEqualTypeOf(); + + expect(profile.me).toBeDefined(); + expectTypeOf(profile.me).toEqualTypeOf(); + + expect(profile.toString()).toBeDefined(); + expectTypeOf(profile.toString()).toEqualTypeOf(); + expect(profile.toString()).toBe(profile.profileName); + }); + + client.destroy(); +}); diff --git a/src/API/getSkyblockProfiles.ts b/src/API/getSkyblockProfiles.ts new file mode 100644 index 000000000..7d6c7289a --- /dev/null +++ b/src/API/getSkyblockProfiles.ts @@ -0,0 +1,40 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import RequestData from '../Private/RequestData.js'; +import SkyblockProfile from '../Structures/SkyBlock/SkyblockProfile.js'; +import { SkyblockRequestOptions } from '../Types/API.js'; + +class getSkyblockProfiles extends Endpoint { + readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute(query: string, options?: SkyblockRequestOptions): Promise { + if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); + query = await this.client.requestHandler.toUUID(query); + const res = await this.client.requestHandler.request(`/skyblock/profiles?uuid=${query}`, options); + if (res.options.raw) return res; + if (!res.data.profiles || !res.data.profiles.length) throw new Error(this.client.errors.NO_SKYBLOCK_PROFILES); + const profiles = []; + for (let i = 0; i < res.data.profiles.length; i++) { + profiles.push({ + uuid: query, + profileId: res.data.profiles[i].profile_id, + profileName: res.data.profiles[i].cute_name, + gameMode: res.data.profiles[i].game_mode || null, + m: res.data.profiles[i].members[query], + banking: res.data.profiles[i].banking, + communityUpgrades: res.data.profiles[i].community_upgrades, + selected: res.data.profiles[i].selected, + members: res.data.profiles[i].members, + garden: options?.garden ? await this.client.getSkyblockGarden(res.data.profiles[i].profile_id) : null, + museum: options?.garden ? await this.client.getSkyblockMuseum(query, res.data.profiles[i].profile_id) : null + }); + } + return profiles.map((p) => new SkyblockProfile(p)); + } +} + +export default getSkyblockProfiles; diff --git a/src/API/getStatus.js b/src/API/getStatus.js deleted file mode 100644 index e66ec8eb8..000000000 --- a/src/API/getStatus.js +++ /dev/null @@ -1,9 +0,0 @@ -const toUuid = require('../utils/toUuid'); -module.exports = async function (query) { - const Status = require('../structures/Status'); - query = await toUuid(query, this.options.mojangCacheTime, this.options.useThirdPartyAPI); - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest(`/status?uuid=${query}`); - if (res.raw) return res; - return new Status(res.session); -}; diff --git a/src/API/getStatus.test.ts b/src/API/getStatus.test.ts new file mode 100644 index 000000000..d3846693b --- /dev/null +++ b/src/API/getStatus.test.ts @@ -0,0 +1,59 @@ +import Client from '../Client.js'; +import Game from '../Structures/Game.js'; +import RequestData from '../Private/RequestData.js'; +import Status from '../Structures/Status.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { GameCode, GameID, GameString } from '../Types/Game.js'; + +test('getStatus (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getStatus('4982eac19ae7422891b61a17a74c87a2', { raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getStatus', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getStatus('370d6421b761456fadf28c43fe5c4bcf'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Status); + expectTypeOf(data).toEqualTypeOf(); + data = data as Status; + expect(data.online).toBeDefined(); + expectTypeOf(data.online).toEqualTypeOf(); + expect(data.game).toBeDefined(); + expectTypeOf(data.game).toEqualTypeOf(); + if (data.game) { + expect(data.game).toBeDefined(); + expectTypeOf(data.game).toEqualTypeOf(); + expect(data.game.game).toBeDefined(); + expectTypeOf(data.game.game).toEqualTypeOf(); + expect(data.game.id).toBeDefined(); + expectTypeOf(data.game.id).toEqualTypeOf(); + expect(data.game.code).toBeDefined(); + expectTypeOf(data.game.code).toEqualTypeOf(); + expect(data.game.name).toBeDefined(); + expectTypeOf(data.game.name).toEqualTypeOf(); + expect(data.game.found).toBeDefined(); + expectTypeOf(data.game.found).toEqualTypeOf(); + expect(data.game.toString()).toBeDefined(); + expect(data.game.toString()).toBe(data.game.name); + expectTypeOf(data.game.toString()).toEqualTypeOf(); + expect(Game.IDS).toBeDefined(); + expectTypeOf(Game.IDS).toEqualTypeOf(); + expect(Game.CODES).toBeDefined(); + expectTypeOf(Game.CODES).toEqualTypeOf(); + expect(Game.NAMES).toBeDefined(); + expectTypeOf(Game.NAMES).toEqualTypeOf(); + } + expect(data.mode).toBeDefined(); + expectTypeOf(data.mode).toEqualTypeOf(); + expect(data.map).toBeDefined(); + expectTypeOf(data.map).toEqualTypeOf(); + expect(data.toString()).toBeDefined(); + expectTypeOf(data.toString()).toEqualTypeOf<'Online' | 'Offline'>(); + expect(data.toString()).toBe(data.online ? 'Online' : 'Offline'); + client.destroy(); +}); diff --git a/src/API/getStatus.ts b/src/API/getStatus.ts new file mode 100644 index 000000000..7e98e1832 --- /dev/null +++ b/src/API/getStatus.ts @@ -0,0 +1,22 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import RequestData from '../Private/RequestData.js'; +import Status from '../Structures/Status.js'; +import type { RequestOptions } from '../Types/Requests.js'; + +class getStatus extends Endpoint { + readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute(query: string, options?: RequestOptions): Promise { + query = await this.client.requestHandler.toUUID(query); + const res = await this.client.requestHandler.request(`/status?uuid=${query}`, options); + if (res.options.raw) return res; + return new Status(res.data.session); + } +} + +export default getStatus; diff --git a/src/API/getWatchdogStats.js b/src/API/getWatchdogStats.js deleted file mode 100644 index 693d73e10..000000000 --- a/src/API/getWatchdogStats.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = async function () { - const WatchdogStats = require('../structures/Watchdog/Stats'); - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest('/punishmentstats'); - if (res.raw) return res; - return new WatchdogStats(res); -}; diff --git a/src/API/getWatchdogStats.test.ts b/src/API/getWatchdogStats.test.ts new file mode 100644 index 000000000..8a6c404a2 --- /dev/null +++ b/src/API/getWatchdogStats.test.ts @@ -0,0 +1,38 @@ +import Client from '../Client.js'; +import RequestData from '../Private/RequestData.js'; +import WatchdogStats from '../Structures/WatchdogStats.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('getWatchdogStats (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getWatchdogStats({ raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getWatchdogStats', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getWatchdogStats(); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(WatchdogStats); + expectTypeOf(data).toEqualTypeOf(); + data = data as WatchdogStats; + expect(data.byWatchdogTotal).toBeDefined(); + expect(data.byWatchdogTotal).toBeGreaterThanOrEqual(0); + expectTypeOf(data.byWatchdogTotal).toEqualTypeOf(); + expect(data.byWatchdogLastMinute).toBeDefined(); + expect(data.byWatchdogLastMinute).toBeGreaterThanOrEqual(0); + expectTypeOf(data.byWatchdogLastMinute).toEqualTypeOf(); + expect(data.byWatchdogRollingDay).toBeDefined(); + expect(data.byWatchdogRollingDay).toBeGreaterThanOrEqual(0); + expectTypeOf(data.byWatchdogRollingDay).toEqualTypeOf(); + expect(data.byStaffTotal).toBeDefined(); + expect(data.byStaffTotal).toBeGreaterThanOrEqual(0); + expectTypeOf(data.byStaffTotal).toEqualTypeOf(); + expect(data.byStaffRollingDay).toBeDefined(); + expect(data.byStaffRollingDay).toBeGreaterThanOrEqual(0); + expectTypeOf(data.byStaffRollingDay).toEqualTypeOf(); + client.destroy(); +}); diff --git a/src/API/getWatchdogStats.ts b/src/API/getWatchdogStats.ts new file mode 100644 index 000000000..df7184dda --- /dev/null +++ b/src/API/getWatchdogStats.ts @@ -0,0 +1,21 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import RequestData from '../Private/RequestData.js'; +import WatchdogStats from '../Structures/WatchdogStats.js'; +import type { RequestOptions } from '../Types/Requests.js'; + +class getWatchdogStats extends Endpoint { + readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + async execute(options?: RequestOptions): Promise { + const res = await this.client.requestHandler.request('/punishmentstats', options); + if (res.options.raw) return res; + return new WatchdogStats(res.data); + } +} + +export default getWatchdogStats; diff --git a/src/API/housing/getActiveHouses.js b/src/API/housing/getActiveHouses.js deleted file mode 100644 index db04c041d..000000000 --- a/src/API/housing/getActiveHouses.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = async function () { - const House = require('../../structures/House'); - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest('/housing/active'); - if (res.raw) return res; - return res.length ? res.map((b) => new House(b)) : []; -}; diff --git a/src/API/housing/getHouse.js b/src/API/housing/getHouse.js deleted file mode 100644 index 6034403ac..000000000 --- a/src/API/housing/getHouse.js +++ /dev/null @@ -1,9 +0,0 @@ -const Errors = require('../../Errors'); -module.exports = async function (query) { - if (!query) throw new Error(Errors.NO_UUID); - const House = require('../../structures/House'); - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest(`/housing/house?house=${query}`); - if (res.raw) return res; - return new House(res); -}; diff --git a/src/API/housing/getPlayerHouses.js b/src/API/housing/getPlayerHouses.js deleted file mode 100644 index 4c5050389..000000000 --- a/src/API/housing/getPlayerHouses.js +++ /dev/null @@ -1,11 +0,0 @@ -const Errors = require('../../Errors'); -const toUuid = require('../../utils/toUuid'); -module.exports = async function (query) { - if (!query) throw new Error(Errors.NO_NICKNAME_UUID); - query = await toUuid(query, this.options.mojangCacheTime, this.options.useThirdPartyAPI); - const House = require('../../structures/House'); - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest(`/housing/houses?player=${query}`); - if (res.raw) return res; - return res.length ? res.map((b) => new House(b)) : []; -}; diff --git a/src/API/index.js b/src/API/index.js deleted file mode 100644 index 575ed9874..000000000 --- a/src/API/index.js +++ /dev/null @@ -1,35 +0,0 @@ -module.exports = { - getAchievements: require('./getAchievements.js'), - getAPIStatus: require('./getAPIStatus.js'), - getBoosters: require('./getBoosters.js'), - getChallenges: require('./getChallenges.js'), - getGameCounts: require('./getGameCounts.js'), - getGuild: require('./getGuild.js'), - getGuildAchievements: require('./getGuildAchievements.js'), - getLeaderboards: require('./getLeaderboards.js'), - getPlayer: require('./getPlayer.js'), - getQuests: require('./getQuests.js'), - getRecentGames: require('./getRecentGames.js'), - getServerInfo: require('./getServerInfo.js'), - getStatus: require('./getStatus.js'), - getWatchdogStats: require('./getWatchdogStats.js'), - - getSkyblockAuction: require('./skyblock/getAuction.js'), - getSkyblockAuctions: require('./skyblock/getAuctions.js'), - getSkyblockAuctionsByPlayer: require('./skyblock/getAuctionsByPlayer.js'), - getSkyblockBazaar: require('./skyblock/getBazaar.js'), - getSkyblockBingo: require('./skyblock/getBingo.js'), - getSkyblockBingoByPlayer: require('./skyblock/getBingoByPlayer.js'), - getSkyblockEndedAuctions: require('./skyblock/getEndedAuctions.js'), - getSkyblockFireSales: require('./skyblock/getFireSales.js'), - getSkyblockGarden: require('./skyblock/getGarden.js'), - getSkyblockGovernment: require('./skyblock/getGovernment.js'), - getSkyblockMember: require('./skyblock/getMember.js'), - getSkyblockMuseum: require('./skyblock/getMuseum.js'), - getSkyblockNews: require('./skyblock/getNews.js'), - getSkyblockProfiles: require('./skyblock/getProfiles.js'), - - getActiveHouses: require('./housing/getActiveHouses.js'), - getPlayerHouses: require('./housing/getPlayerHouses.js'), - getHouse: require('./housing/getHouse.js') -}; diff --git a/src/API/index.ts b/src/API/index.ts new file mode 100644 index 000000000..dc844e678 --- /dev/null +++ b/src/API/index.ts @@ -0,0 +1,56 @@ +import getAchievements from './getAchievements.js'; +import getActiveHouses from './getActiveHouses.js'; +import getBoosters from './getBoosters.js'; +import getChallenges from './getChallenges.js'; +import getGameCounts from './getGameCounts.js'; +import getGuild from './getGuild.js'; +import getGuildAchievements from './getGuildAchievements.js'; +import getHouse from './getHouse.js'; +import getLeaderboards from './getLeaderboards.js'; +import getPlayer from './getPlayer.js'; +import getPlayerHouses from './getPlayerHouses.js'; +import getQuests from './getQuests.js'; +import getRecentGames from './getRecentGames.js'; +import getSkyblockAuction from './getSkyblockAuction.js'; +import getSkyblockAuctions from './getSkyblockAuctions.js'; +import getSkyblockAuctionsByPlayer from './getSkyblockAuctionsByPlayer.js'; +import getSkyblockBazaar from './getSkyblockBazaar.js'; +import getSkyblockBingo from './getSkyblockBingo.js'; +import getSkyblockFireSales from './getSkyblockFireSales.js'; +import getSkyblockGarden from './getSkyblockGarden.js'; +import getSkyblockGovernment from './getSkyblockGovernment.js'; +import getSkyblockMember from './getSkyblockMember.js'; +import getSkyblockMuseum from './getSkyblockMuseum.js'; +import getSkyblockNews from './getSkyblockNews.js'; +import getSkyblockProfiles from './getSkyblockProfiles.js'; +import getStatus from './getStatus.js'; +import getWatchdogStats from './getWatchdogStats.js'; +export default { + getAchievements, + getActiveHouses, + getBoosters, + getChallenges, + getGameCounts, + getGuild, + getGuildAchievements, + getHouse, + getLeaderboards, + getPlayer, + getPlayerHouses, + getQuests, + getRecentGames, + getSkyblockAuction, + getSkyblockAuctions, + getSkyblockAuctionsByPlayer, + getSkyblockBazaar, + getSkyblockBingo, + getSkyblockFireSales, + getSkyblockGarden, + getSkyblockGovernment, + getSkyblockMember, + getSkyblockMuseum, + getSkyblockNews, + getSkyblockProfiles, + getStatus, + getWatchdogStats +}; diff --git a/src/API/skyblock/getAuction.js b/src/API/skyblock/getAuction.js deleted file mode 100644 index 390417e89..000000000 --- a/src/API/skyblock/getAuction.js +++ /dev/null @@ -1,21 +0,0 @@ -const Errors = require('../../Errors'); -const toUuid = require('../../utils/toUuid'); -module.exports = async function (type, query, includeItemBytes = false) { - if (!query) throw new Error(Errors.NO_NICKNAME_UUID); - const Auction = require('../../structures/SkyBlock/Auctions/Auction'); - let filter; - if ('PROFILE' === type) { - filter = 'profile'; - } else if ('PLAYER' === type) { - query = await toUuid(query, this.options.mojangCacheTime, this.options.useThirdPartyAPI); - filter = 'player'; - } else if ('AUCTION' === type) { - filter = 'uuid'; - } else { - throw new Error(Errors.BAD_AUCTION_FILTER); - } - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest(`/skyblock/auction?${filter}=${query}`); - if (res.raw) return res; - return res.auctions.length ? res.auctions.map((a) => new Auction(a, includeItemBytes)) : []; -}; diff --git a/src/API/skyblock/getAuctions.js b/src/API/skyblock/getAuctions.js deleted file mode 100644 index 2def61e71..000000000 --- a/src/API/skyblock/getAuctions.js +++ /dev/null @@ -1,74 +0,0 @@ -/* eslint-disable jsdoc/require-jsdoc */ -const Auction = require('../../structures/SkyBlock/Auctions/Auction'); -const AuctionInfo = require('../../structures/SkyBlock/Auctions/AuctionInfo'); -const Errors = require('../../Errors'); -// eslint-disable-next-line no-underscore-dangle -let _makeRequest; -async function getPage(page = 0, options = {}) { - const content = await _makeRequest(`/skyblock/auctions?page=${page}`, false); - const result = {}; - if (!options.noInfo) result.info = new AuctionInfo(content); - if (options.raw) result.auctions = content.auctions; - else if (options.noAuctions) result.auctions = []; - else result.auctions = content.auctions.map((x) => new Auction(x, options.includeItemBytes)); - return result; -} -async function noReject(promise, args = [], retries = 3, cooldown = 100) { - try { - const result = await promise.call(null, ...args); - return result; - } catch { - if (retries) { - await new Promise((resolve) => setTimeout(resolve, cooldown)); - return await noReject(promise, args, retries - 1, cooldown); - } - return null; - } -} -module.exports = async function (range, options = {}) { - // eslint-disable-next-line no-underscore-dangle - _makeRequest = this._makeRequest; - options.retries ||= 3; - options.cooldown ||= 100; - if (null === range || '*' === range) range = [0, (await getPage(0, { noAuctions: true })).info.totalPages]; - if (!Array.isArray(range)) range = [parseInt(range), parseInt(range)]; - if (isNaN(range[0])) throw new Error(Errors.PAGE_INDEX_ERROR); - if (parseInt(options.retries) !== options.retries || 10 < options.retries || 0 > options.retries) { - throw new Error(Errors.INVALID_OPTION_VALUE); - } - if (parseInt(options.cooldown) !== options.cooldown || 3000 < options.cooldown || 0 > options.cooldown) { - throw new Error(Errors.INVALID_OPTION_VALUE); - } - range = range.sort(); - const result = { info: null, Auctions: [] }; - const fetches = []; - const failedPages = []; - if (options.noAuctions) return { info: options.noInfo ? null : (await getPage(range[1], { noAuctions: true })).info }; - for (let i = range[0]; i <= range[1]; i++) { - if (options.race) { - fetches.push(noReject(getPage, [i, options], options.retries, options.cooldown)); - } else { - const resp = await noReject(getPage, [i, options], options.retries, options.cooldown); - if (resp) { - result.Auctions = result.Auctions.concat(resp.auctions); - if (resp.info) result.info = resp.info; - } else { - failedPages.push(i); - } - } - } - if (fetches.length) { - result.Auctions = (await Promise.all(fetches)).reduce((pV, cV, index) => { - if (!cV) { - failedPages.push(index + range[0]); - return pV; - } - if (cV.info) result.info = cV.info; - if (cV.auctions.length) return pV.concat(cV.auctions); - return pV; - }, []); - } - // eslint-disable-next-line no-underscore-dangle - result.info = result.info ? result.info._extend('failedPages', failedPages) : { failedPages }; - return result; -}; diff --git a/src/API/skyblock/getAuctionsByPlayer.js b/src/API/skyblock/getAuctionsByPlayer.js deleted file mode 100644 index 4e24f381b..000000000 --- a/src/API/skyblock/getAuctionsByPlayer.js +++ /dev/null @@ -1,11 +0,0 @@ -const Errors = require('../../Errors'); -const toUuid = require('../../utils/toUuid'); -module.exports = async function (query, includeItemBytes = false) { - if (!query) throw new Error(Errors.NO_NICKNAME_UUID); - const Auction = require('../../structures/SkyBlock/Auctions/Auction'); - query = await toUuid(query, this.options.mojangCacheTime, this.options.useThirdPartyAPI); - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest(`/skyblock/auction?player=${query}`); - if (res.raw) return res; - return res.auctions.length ? res.auctions.map((a) => new Auction(a, includeItemBytes)) : []; -}; diff --git a/src/API/skyblock/getBazaar.js b/src/API/skyblock/getBazaar.js deleted file mode 100644 index 1576917e8..000000000 --- a/src/API/skyblock/getBazaar.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = async function () { - const Product = require('../../structures/SkyBlock/Bazzar/Product'); - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest('/skyblock/bazaar'); - if (res.raw) return res; - const productsKeys = Object.keys(res.products); - return productsKeys.map((x) => new Product(res.products[x])); -}; diff --git a/src/API/skyblock/getBingo.js b/src/API/skyblock/getBingo.js deleted file mode 100644 index 978c9e0f2..000000000 --- a/src/API/skyblock/getBingo.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = async function () { - const BingoData = require('../../structures/SkyBlock/Static/BingoData'); - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest('/resources/skyblock/bingo'); - if (res.raw) return res; - return new BingoData(res); -}; diff --git a/src/API/skyblock/getBingoByPlayer.js b/src/API/skyblock/getBingoByPlayer.js deleted file mode 100644 index 634f8e4c3..000000000 --- a/src/API/skyblock/getBingoByPlayer.js +++ /dev/null @@ -1,14 +0,0 @@ -const toUuid = require('../../utils/toUuid'); -const getBingo = require('./getBingo'); -const Errors = require('../../Errors'); -module.exports = async function (query, { fetchBingoData = false }) { - if (!query) throw new Error(Errors.NO_NICKNAME_UUID); - const PlayerBingo = require('../../structures/SkyBlock/PlayerBingo'); - query = await toUuid(query, this.options.mojangCacheTime, this.options.useThirdPartyAPI); - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest(`/skyblock/uuid?player=${query}`); - if (res.raw) return res; - let bingoData = null; - if (fetchBingoData) bingoData = await getBingo.call(this); - return new PlayerBingo(res, bingoData); -}; diff --git a/src/API/skyblock/getEndedAuctions.js b/src/API/skyblock/getEndedAuctions.js deleted file mode 100644 index b6b993ed5..000000000 --- a/src/API/skyblock/getEndedAuctions.js +++ /dev/null @@ -1,11 +0,0 @@ -const PartialAuction = require('../../structures/SkyBlock/Auctions/PartialAuction'); -const AuctionInfo = require('../../structures/SkyBlock/Auctions/AuctionInfo'); -module.exports = async function (includeItemBytes = false) { - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest('/skyblock/auctions_ended', false); - if (res.raw) return res; - return { - info: new AuctionInfo({ ...res, totalAuctions: res.auctions.length, totalPages: 1 }), - auctions: res.auctions.length ? res.auctions.map((a) => new PartialAuction(a, includeItemBytes)) : [] - }; -}; diff --git a/src/API/skyblock/getFireSales.js b/src/API/skyblock/getFireSales.js deleted file mode 100644 index e96cdc7d8..000000000 --- a/src/API/skyblock/getFireSales.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = async function () { - const FireSale = require('../../structures/SkyBlock/Static/FireSale'); - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest('/skyblock/firesales'); - if (res.raw) return res; - return res.sales.length ? res.sales.map((sale) => new FireSale(sale)) : []; -}; diff --git a/src/API/skyblock/getGarden.js b/src/API/skyblock/getGarden.js deleted file mode 100644 index a3caa8fe5..000000000 --- a/src/API/skyblock/getGarden.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = async function (profileId) { - const SkyblockGarden = require('../../structures/SkyBlock/SkyblockGarden'); - let res; - try { - // eslint-disable-next-line no-underscore-dangle - res = await this._makeRequest(`/skyblock/garden?profile=${profileId}`).catch(); - // eslint-disable-next-line no-unused-vars, no-empty - } catch (e) {} - if (res?.raw) return res; - return new SkyblockGarden(res); -}; diff --git a/src/API/skyblock/getGovernment.js b/src/API/skyblock/getGovernment.js deleted file mode 100644 index 1e4657509..000000000 --- a/src/API/skyblock/getGovernment.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = async function () { - const GovernmentData = require('../../structures/SkyBlock/Static/Government.js'); - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest('/resources/skyblock/election'); - if (res.raw) return res; - return new GovernmentData(res); -}; diff --git a/src/API/skyblock/getMember.js b/src/API/skyblock/getMember.js deleted file mode 100644 index d4d71ec62..000000000 --- a/src/API/skyblock/getMember.js +++ /dev/null @@ -1,35 +0,0 @@ -const Errors = require('../../Errors'); -const toUuid = require('../../utils/toUuid'); -const getPlayer = require('../getPlayer'); -module.exports = async function (query, options = { fetchPlayer: false, getMuseum: false, getGarden: false }) { - const SkyblockMember = require('../../structures/SkyBlock/SkyblockMember'); - const getSkyblockMuseum = require('./getMuseum'); - const getSkyblockGarden = require('./getGarden'); - if (!query) throw new Error(Errors.NO_NICKNAME_UUID); - query = await toUuid(query, this.options.mojangCacheTime, this.options.useThirdPartyAPI); - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest(`/skyblock/profiles?uuid=${query}`); - if (res.raw) return res; - if (!res.profiles || !res.profiles.length) throw new Error(Errors.NO_SKYBLOCK_PROFILES); - const player = options.fetchPlayer ? await getPlayer.call(this, query, options) : null; - const memberByProfileName = new Map(); - for (const profile of res.profiles) { - profile.members[query].player = player; - memberByProfileName.set( - profile.cute_name, - new SkyblockMember({ - uuid: query, - profileId: profile.profile_id, - profileName: profile.cute_name, - gameMode: profile.game_mode || null, - m: profile.members[query], - banking: profile.banking, - communityUpgrades: profile.community_upgrades, - museum: options.getMuseum ? await getSkyblockMuseum.call(this, query, profile.profile_id) : null, - garden: options.getGarden ? await getSkyblockGarden.call(this, profile.profile_id) : null, - selected: profile.selected - }) - ); - } - return memberByProfileName; -}; diff --git a/src/API/skyblock/getMuseum.js b/src/API/skyblock/getMuseum.js deleted file mode 100644 index 370c88793..000000000 --- a/src/API/skyblock/getMuseum.js +++ /dev/null @@ -1,15 +0,0 @@ -const Errors = require('../../Errors'); -const toUuid = require('../../utils/toUuid'); -module.exports = async function (query, profileId) { - const SkyblockMuseum = require('../../structures/SkyBlock/SkyblockMuseum'); - if (!query) throw new Error(Errors.NO_NICKNAME_UUID); - query = await toUuid(query, this.options.mojangCacheTime, this.options.useThirdPartyAPI); - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest(`/skyblock/museum?uuid=${query}&profile=${profileId}`); - if (res.raw) return res; - return new SkyblockMuseum({ - uuid: query, - m: res, - profileId: profileId - }); -}; diff --git a/src/API/skyblock/getNews.js b/src/API/skyblock/getNews.js deleted file mode 100644 index a4cee6267..000000000 --- a/src/API/skyblock/getNews.js +++ /dev/null @@ -1,7 +0,0 @@ -const SkyblockNews = require('../../structures/SkyBlock/News/SkyblockNews'); -module.exports = async function () { - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest('/skyblock/news'); - if (res.raw) return res; - return res.items.map((i) => new SkyblockNews(i)); -}; diff --git a/src/API/skyblock/getProfiles.js b/src/API/skyblock/getProfiles.js deleted file mode 100644 index 6faa3c532..000000000 --- a/src/API/skyblock/getProfiles.js +++ /dev/null @@ -1,49 +0,0 @@ -const Errors = require('../../Errors'); -const toUuid = require('../../utils/toUuid'); -const getPlayer = require('../getPlayer'); -module.exports = async function (query, options = { fetchPlayer: false, getMuseum: false, getGarden: false }) { - const SkyblockProfile = require('../../structures/SkyBlock/SkyblockProfile'); - const getSkyblockMuseum = require('./getMuseum'); - const getSkyblockGarden = require('./getGarden'); - if (!query) throw new Error(Errors.NO_NICKNAME_UUID); - query = await toUuid(query, this.options.mojangCacheTime, this.options.useThirdPartyAPI); - // eslint-disable-next-line no-underscore-dangle - const res = await this._makeRequest(`/skyblock/profiles?uuid=${query}`); - if (res.raw) return res; - if (!res.profiles || !res.profiles.length) throw new Error(Errors.NO_SKYBLOCK_PROFILES); - const players = new Map(); - if (options.fetchPlayer) { - const uniqueUuids = [...new Set(res.profiles.map((profile) => Object.keys(profile.members)).flat())]; - await Promise.all( - uniqueUuids.map(async (uuid) => { - const player = await getPlayer.call(this, uuid, options); - players.set(uuid, player); - }) - ); - } - - const profiles = []; - for (let i = 0; i < res.profiles.length; i++) { - if (options.fetchPlayer) { - for (const memberUuid of Object.keys(res.profiles[i].members)) { - res.profiles[i].members[memberUuid].player = players.get(memberUuid); - } - } - - profiles.push({ - uuid: query, - profileId: res.profiles[i].profile_id, - profileName: res.profiles[i].cute_name, - gameMode: res.profiles[i].game_mode || null, - m: res.profiles[i].members[query], - banking: res.profiles[i].banking, - communityUpgrades: res.profiles[i].community_upgrades, - museum: options.getMuseum ? await getSkyblockMuseum.call(this, query, res.profiles[i].profile_id) : null, - garden: options.getGarden ? await getSkyblockGarden.call(this, res.profiles[i].profile_id) : null, - selected: res.profiles[i].selected, - members: res.profiles[i].members - }); - } - - return profiles.map((p) => new SkyblockProfile(p)); -}; diff --git a/src/Client.js b/src/Client.js deleted file mode 100644 index a35efaff0..000000000 --- a/src/Client.js +++ /dev/null @@ -1,547 +0,0 @@ -const rateLimit = new (require('./Private/rateLimit'))(); -const validate = new (require('./Private/validate'))(); -const updater = new (require('./Private/updater'))(); -const Requests = require('./Private/requests'); -const EventEmitter = require('events'); -const Errors = require('./Errors'); -const API = require('./API/index'); -const clients = []; - -/* eslint-disable */ -const Player = require('./structures/Player'); -const Guild = require('./structures/Guild/Guild'); -const WatchdogStats = require('./structures/Watchdog/Stats'); -const Booster = require('./structures/Boosters/Booster'); -const SkyblockProfile = require('./structures/SkyBlock/SkyblockProfile'); -const SkyblockMember = require('./structures/SkyBlock/SkyblockMember'); -const SkyblockMuseum = require('./structures/SkyBlock/SkyblockMuseum'); -const SkyblockGarden = require('./structures/SkyBlock/SkyblockGarden'); -const APIStatus = require('./structures/APIStatus'); -const Leaderboard = require('./structures/Leaderboard'); -const ServerInfo = require('./structures/ServerInfo'); -const RecentGame = require('./structures/RecentGame'); -const Status = require('./structures/Status'); -const Auction = require('./structures/SkyBlock/Auctions/Auction'); -const AuctionInfo = require('./structures/SkyBlock/Auctions/AuctionInfo'); -const PartialAuction = require('./structures/SkyBlock/Auctions/PartialAuction'); -const Product = require('./structures/SkyBlock/Bazzar/Product'); -const BingoData = require('./structures/SkyBlock/Static/BingoData'); -const PlayerBingo = require('./structures/SkyBlock/PlayerBingo'); -const GovernmentData = require('./structures/SkyBlock/Static/Government'); -const FireSale = require('./structures/SkyBlock/Static/FireSale'); -const SkyblockNews = require('./structures/SkyBlock/News/SkyblockNews'); -const GameCounts = require('./structures/GameCounts'); -const House = require('./structures/House.js'); -/* eslint-enable */ - -/** - * Client class - */ -class Client extends EventEmitter { - /** - * @param {string} key API key - * @param {ClientOptions} [options={}] Client options - */ - constructor(key, options = {}) { - super(); - this.requests = new Requests(this, options.cacheHandler); - // eslint-disable-next-line no-console - if (options && !options.silent) this.on('warn', console.warn); - // Test to check for multiple instances of client - if (clients.find((x) => x.key === key)) { - this.emit('warn', Errors.MULTIPLE_INSTANCES); - return clients.find((x) => x.key === key); - } - validate.validateNodeVersion(); - this.key = validate.validateKey(key); - this.options = validate.parseOptions(options); - validate.validateOptions(this.options); - - for (const func in API) { - Client.prototype[func] = (...args) => { - const lastArg = args[args.length - 1]; - return API[func].apply( - { - // eslint-disable-next-line no-underscore-dangle - _makeRequest: this._makeRequest.bind(this, validate.cacheSuboptions(lastArg) ? lastArg : {}), - ...this - }, - args - ); - }; - } - - if (this.options.checkForUpdates) { - updater.checkForUpdates().catch(() => { - // eslint-disable-next-line no-console - if (!this.options.silent) console.warn('[hypixel-api-reborn] Error whilst checking for updates!'); - }); - } - /** - * All cache entries - * @type {Map} - */ - this.cache = this.requests.cache; - clients.push(this); - rateLimit.init(this.getGameCounts(), this.options, this).then(() => this.emit('ready')); - } - /** - * Private function - make request - * @param {MethodOptions} options Options for request - * @param {string} url Endpoint URL to request - * @param {boolean} [useRateLimitManager=true] Use rate limit - * @returns {Promise} Response - * @private - */ - async _makeRequest(options, url, useRateLimitManager = true) { - if (!url) return; - if ('/key' !== url && !options.noCacheCheck && (await this.requests.cache.has(url))) { - return Object.assign(await this.requests.cache.get(url), { raw: Boolean(options.raw) }); - } - if (useRateLimitManager) await rateLimit.rateLimitManager(); - this.emit('outgoingRequest', url, { ...options, headers: { ...options.headers, ...this.options.headers } }); - const result = await this.requests.request.call(this.requests, url, { - ...options, - headers: { ...options.headers, ...this.options.headers } - }); - // eslint-disable-next-line no-underscore-dangle - if (this.options.syncWithHeaders) rateLimit.sync(result._headers); - return result; - } - /** - * Emitted when rate limiter is ready. ( You don't have to wait for this event to emit UNLESS you are planning to do data scraping which means spamming requests ) - * @event ready - * @name Client#ready - * @example - * // This example gets player's uuid. - * hypixel.once('ready',()=>{ - * hypixel.getPlayer('stavzdev') - * .then(player => player.uuid) - * .catch(console.log); - * }) - */ - /** - * Emitted when a request is going to be sent - * @event outgoingRequest - * @name Client#outgoingRequest - * @param {string} url URL - * @param {object} [options] Options, if any - */ - /** - * Emitted when there is a warning. - * @event warn - * @name Client#warn - * @param {string} error Warning Message - */ - /** - * Allows you to get statistics of player - * @method - * @name Client#getPlayer - * @param {string} query Player nickname or UUID - * @param {PlayerMethodOptions} [options={}] Method options - * @return {Promise} - * @example - * hypixel.getPlayer('StavZDev').then(player => { - * console.log(player.level); // 141 - * console.log(player.rank); // 'MVP+' - * }).catch(e => { - * console.log(e); - * }) - * @example - * // Get player's guild along with player stats - * hypixel.getPlayer('Minikloon', { guild: true }).then(player => { - * console.log(player.guild) // null if player isn't is guild - * console.log(player.guild.name) // Mini Squid - * console.log(player.guild.level) // 110 - * }).catch(e => { - * console.log(e); - * }); - * @example - * // async/await - * const player = await hypixel.getPlayer('Minikloon').catch(console.log); - * // If player doesn't exist, or if an error occurred ( check console ) - * console.log(player); // null - * // Check if player exists - * if(player) console.log(player.uuid); // 20934ef9488c465180a78f861586b4cf - */ - /** - * Allows you to get statistics of hypixel guild - * @method - * @name Client#getGuild - * @param {'id'|'name'|'player'} searchParameter Search for guild by id, name or player (if player is in guild) - * @param {string} query Guild ID, Guild name or player uuid/nickname - * @param {MethodOptions} [options={}] Method options - * @return {Promise} - * @example - * hypixel.getGuild('name', 'The Foundation').then(guild => { - * console.log(guild.level); // 111 - * console.log(guild.id); // '52e5719284ae51ed0c716c69' - * }).catch(e => { - * console.log(e); - * }) - * @example - * // async/await - * const guild = await hypixel.getGuild('name', 'The Foundation').catch(console.log); - * console.log(guild.level); // 111 - * console.log(guild.id); // '52e5719284ae51ed0c716c69' - */ - /** - * Allows you to get statistics of watchdog, the server anticheat - * @method - * @name Client#getWatchdogStats - * @param {MethodOptions} [options={}] Method options - * @return {Promise} - * @example - * hypixel.getWatchdogStats().then(watchdog => { - * console.log(watchdog.byWatchdogTotal); // 5931897 - * }).catch(e => { - * console.log(e); - * }) - * @example - * // async/await - * const watchdog = await hypixel.getWatchdogStats().catch(console.log); - * console.log(watchdog.byWatchdogTotal); // 5931897 - */ - /** - * Allows you to get all active boosters - * @method - * @name Client#getBoosters - * @param {MethodOptions} [options={}] Method options - * @return {Promise>} - * @example - * hypixel.getBoosters().then(boosters => { - * console.log(boosters[0].purchaser); // '978ddb705a8e43618e41749178c020b0' - * }).catch(e => { - * console.log(e); - * }) - * @example - * // async/await - * const boosters = await hypixel.getBoosters().catch(console.log); - * console.log(boosters[0].purchaser); // '978ddb705a8e43618e41749178c020b0' - */ - /** - * Allows you to get all skyblock profiles of player - * @method - * @name Client#getSkyblockProfiles - * @param {string} query Player nickname or UUID - * @param {SkyblockMethodOptions} [options={}] Method options - * @return {Promise>} - * @example - * hypixel.getSkyblockProfiles('StavZDev').then(profiles => { - * console.log(profiles[0].members[0].uuid); // '52d9a36f66ce4cdf9a56ad9724ae9fb4' - * }).catch(e => { - * console.log(e); - * }) - * @example - * const profiles = await hypixel.getSkyblockProfiles('StavZDev').catch(console.log); - * console.log(profiles[0].members[0].uuid); // '52d9a36f66ce4cdf9a56ad9724ae9fb4' - */ - /** - * Allows you to get a player's skyblock member data from all their profiles - * @method - * @name Client#getSkyblockMember - * @param {string} query Player nickname or UUID - * @param {SkyblockMethodOptions} [options={}] Method options - * @return {Promise>} - * @example - * hypixel.getSkyblockMember('StavZDev').then(member => { - * // 'Cucumber' - profile name - * console.log(member.get('Cucumber').uuid); // '52d9a36f66ce4cdf9a56ad9724ae9fb4' - * }).catch(e => { - * console.log(e); - * }) - * @example - * const member = await hypixel.getSkyblockMember('StavZDev').catch(console.log); - * console.log(member.get('Cucumber').uuid); // '52d9a36f66ce4cdf9a56ad9724ae9fb4' - */ - /** - * Allows you to get a player's skyblock member data from all their profiles - * @method - * @name Client#getSkyblockGarden - * @param {string} profileId Profile id of the garden you want - * @param {MethodOptions} [options={}] Method options - * @return {Promise} - * @example - * hypixel.getSkyblockMember('StavZDev').then(member => { - * // 'Cucumber' - profile name - * console.log(member.get('Cucumber').uuid); // '52d9a36f66ce4cdf9a56ad9724ae9fb4' - * }).catch(e => { - * console.log(e); - * }) - * @example - * const member = await hypixel.getSkyblockMember('StavZDev').catch(console.log); - * console.log(member.get('Cucumber').uuid); // '52d9a36f66ce4cdf9a56ad9724ae9fb4' - */ - /** - * Allows you to get a player's skyblock profile museum - * @method - * @name Client#getSkyblockMuseum - * @param {string} query Player nickname or UUID - * @param {string} profileId Profile ID - * @return {Promise} - */ - /** - * Allows you to get the Hypixel API's Status and past Incidents, no key needed. - * @method - * @name Client#getAPIStatus - * @return {Promise} - * @example - * hypixel.getAPIStatus().then(status => { - * console.log(status.incidents[0].link); // 'https://status.hypixel.net/incidents/zdd5gppdtcc3' - * }).catch(e => { - * console.log(e); - * }) - */ - /** - * Gets all leaderboards - * @method - * @name Client#getLeaderboards - * @param {MethodOptions} [options={}] Method options - * @return {Promise<{ ARENA: Leaderboard[], COPS_AND_CRIMS: Leaderboard[], WARLORDS: Leaderboard[], BLITZ_SURVIVAL_GAMES: Leaderboard[], UHC: Leaderboard[], WALLS: Leaderboard[], PROTOTYPE: Leaderboard[], PAINTBALL: Leaderboard[], SKYWARS: Leaderboard[], MURDER_MYSTERY: Leaderboard[], SMASH_HEROES: Leaderboard[], DUELS: Leaderboard[], SPEED_UHC: Leaderboard[], TNTGAMES: Leaderboard[], BEDWARS: Leaderboard[], TURBO_KART_RACERS: Leaderboard[], BUILD_BATTLE: Leaderboard[], ARCADE: Leaderboard[], SKYCLASH: Leaderboard[], QUAKECRAFT: Leaderboard[], CRAZY_WALLS: Leaderboard[], MEGA_WALLS: Leaderboard[], VAMPIREZ: Leaderboard[] }>} - * @example - * hypixel.getLeaderboards().then(leaderboards => { - * console.log(leaderboards.ARENA[0].name); // 'Wins' - * }).catch(e => { - * console.log(e); - * }) - */ - /** - * Sends a STATUS packet to hypixel and parses the return info (a 0x00 and 0x01 packet) - * @method - * @name Client#getServerInfo - * @param {number} [repeats=3] Sends x amount of ping requests and gets the average. Should be between 1 and 10 - * @return {Promise} - * @example - * hypixel.getServerInfo(3).then(serverInfo =>{ - * console.log(serverInfo.ping); // 69 - * }).catch(console.log) - */ - /** - * Allows you to get recent games of a player - * @method - * @name Client#getRecentGames - * @param {string} query Player nickname or UUID - * @param {MethodOptions} [options={}] Method options - * @return {Promise} - * @example - * hypixel.getRecentGames().then(recentGames =>{ - * console.log(recentGames[0].endedTimestamp); // 1609670588789 - * }) - * .catch(console.log); - */ - /** - * Allows you to get the status of a player - * @method - * @name Client#getStatus - * @param {string} query Player nickname or UUID - * @param {MethodOptions} [options={}] Method options - * @return {Promise} - * @example - * hypixel.getStatus('Stavzdev').then(status =>{ - * console.log(status.online); // true - * }) - * .catch(console.log); - */ - /** - * Allows you to get skyblock auctions - * @method - * @name Client#getSkyblockAuctions - * @param {string|number|number[]} page - "*", a page number, or an array with the start and the end page number ( automatically sorted ) - * @param {auctionsOptions} [options={}] Options - * @return {Promise<{info:AuctionInfo,Auctions:Auction[]}>} - */ - /** - * Allows you to get player's skyblock auctions - * @method - * @name Client#getSkyblockAuctionsByPlayer - * @param {string} query - player nickname or uuid - * @param {boolean} [includeItemBytes=false] - include item bytes (optional) - * @param {MethodOptions} [options={}] Options - * @return {Promise} - * @example - * hypixel.getSkyblockAuctionsByPlayer('hypixel').then(auctions =>{ - * console.log(auctions[0].auctionId); // b0491da3e81c43c88fd287ea3b3eacc0 - * }) - * .catch(console.log); - */ - /** - * Allows you to get all ended auctions in around the last 60 seconds - * @method - * @name Client#getEndedSkyblockAuctions - * @param {boolean} [includeItemBytes=false] - include item bytes (optional) - * @param {MethodOptions} [options={}] Options - * @return {Promise<{info:AuctionInfo,auctions:PartialAuction[]}>} - * @example - * hypixel.getEndedSkyblockAuctions().then(ended =>{ - * console.log(ended.auctions[0].auctionId); // 0fe7fd132367474e86ff3022b4a84a13 - * }) - * .catch(console.log); - */ - /** - * Allows you to get list of products - * @method - * @name Client#getSkyblockBazaar - * @param {MethodOptions} [options={}] Options - * @return {Promise} - * @example - * hypixel.getSkyblockBazaar().then(products =>{ - * console.log(products[0].productId); // INK_SACK:3 - * }) - * .catch(console.log); - */ - /** - * Allows you to get bingo data - * @method - * @name Client#getSkyblockBingo - * @param {MethodOptions} [options={}] Options - * @return {Promise} - */ - /** - * Allows you to get bingo data of a player - * @method - * @name Client#getSkyblockBingoByPlayer - * @param {string} query UUID / IGN of player - * @param {PlayerBingoOptions} [options={}] Options - * @return {Promise} - */ - /** - * Allows you to get SB government - * @method - * @name Client#getSkyblockGovernment - * @param {MethodOptions} [options={}] Options - * @return {Promise} - */ - /** - * Allows you to get SB government - * @method - * @name Client#getSkyblockFireSale - * @param {MethodOptions} [options={}] Options - * @return {Promise} - */ - /** - * Get a array of active houses - * @method - * @name Client#getActiveHouses - * @param {MethodOptions} [options={}] Options - * @return {Promise} - */ - /** - * Get a array of houses for a user - * @method - * @name Client#getPlayerHouses - * @param {string} query UUID / IGN of player - * @param {MethodOptions} [options={}] Options - * @return {Promise} - */ - /** - * Get a house - * @method - * @name Client#getHouse - * @param {string} query House UUID - * @param {MethodOptions} [options={}] Options - * @return {Promise} - */ - /** - * Allows you to get skyblock news - * @method - * @name Client#getSkyblockNews - * @param {MethodOptions} [options={}] Options - * @return {Promise} - * @example - * hypixel.getSkyblockNews().then((news) => { - * console.log(news[0].link); // https://hypixel.net/threads/3749492/ - * }) - * .catch(console.log) - */ - /** - * Allows you to get player count along with the player count of each public game - * @method - * @name Client#getGameCounts - * @param {MethodOptions} [options={}] Options - * @return {Promise} - * @example - * hypixel.getGameCounts().then((gameCounts) => { - * console.log(gameCounts.mainLobby.players); - * }) - * .catch(console.log) - */ - /** - * Delete x (by default all) cache entries - * @param {?number} amount Amount of cache to delete - * @return {Promise} - */ - sweepCache(amount) { - return this.requests.sweepCache(amount); - } -} -/** - * @typedef {object} ClientOptions - * @prop {boolean} [cache=true] Enable/Disable request caching. - * @prop {number} [hypixelCacheTime=60] Amount of time in seconds to cache the hypixel api requests. - * @prop {number} [mojangCacheTime=600] Amount of time in seconds to cache the mojang api requests. - * @prop {CacheHandler} [cacheHandler] Custom Cache Handler - * @prop {'AUTO'|'HARD'|'NONE'} [rateLimit='AUTO'] Rate limit mode. - * @prop {boolean} [syncWithHeaders=false] Sync with headers rate limit information. Usually not necessary nor recommended ( because of latency ) - * @prop {number} [keyLimit=60] Key limit of your key. - * @prop {number} [cacheSize=-1] The amount how many results will be cached. (`-1` for infinity) - * @prop {boolean} [silent=false] Don't automatically put warnings into console. - * @prop {object} [headers={}] Extra Headers ( like User-Agent ) to add to request. - * @prop {boolean} [checkForUpdates=true] Enable/Disable check for new version of hypixel-api-reborn. - * @prop {boolean|string} [useThirdPartyAPI=false] Enable/Disable Mojang Third Party API - */ -// eslint-disable-next-line no-unused-vars -const defaultCache = require('./Private/defaultCache.js'); -/** - * @typedef {defaultCache} Cache - */ -/** - * @typedef {Cache} CacheHandler - */ -/** - * @typedef {object} MethodOptions - * @property {boolean} [raw=false] Raw data - * @property {boolean} [noCacheCheck=false] Disable/Enable cache checking - * @property {boolean} [noCaching=false] Disable/Enable writing to cache - * @prop {object} [headers={}] Extra Headers ( like User-Agent ) to add to request. Overrides the headers globally provided. - */ -/** - * @typedef {object} PlayerMethodOptions - * @property {boolean} [raw=false] Raw data - * @property {boolean} [noCacheCheck=false] Disable/Enable cache checking - * @property {boolean} [noCaching=false] Disable/Enable writing to cache - * @property {boolean} [guild=false] Disable/Enable request for player's guild - * @property {boolean} [recentGames=false] Disable/Enable request for player's recent game - * @prop {object} [headers={}] Extra Headers ( like User-Agent ) to add to request. Overrides the headers globally provided. - */ -/** - * @typedef {object} SkyblockMethodOptions - * @property {boolean} [raw=false] Raw data - * @property {boolean} [noCacheCheck=false] Disable/Enable cache checking - * @property {boolean} [noCaching=false] Disable/Enable writing to cache - * @property {?boolean} [fetchPlayer=false] Disable/Enable player profile request for each member - * @property {?boolean} [getMuseum=false] Disable/Enable player museum request for each member - * @property {?boolean} [getGarden=false] Disable/Enable player garden request for each member - * @prop {object} [headers={}] Extra Headers ( like User-Agent ) to add to request. Overrides the headers globally provided. - */ -/** - * @typedef {object} auctionsOptions - * @property {boolean} [noCacheCheck=false] Disable/Enable cache checking - * @property {boolean} [noCaching=false] Disable/Enable writing to cache - * @property {boolean} [noInfo=false] If true, result doesn't show Auction Info - * @property {boolean} [noAuctions=false] If true, result doesn't show auctions - * @property {boolean} [raw=false] If true, result will not contain parsed auctions, but will present them as it is received. This can speed up performance in some cases. - * @property {number} [retries=3] Number of times to retry fetching a page before abandoning - * @property {number} [cooldown=100] Cooldown between each fetch, only works if race is unset or false; - * @property {boolean} [race=false] Issues simultaneous requests to the API, instead of requesting then parsing one by one. Can largely increase speed at the cost of hogging bandwidth and memory - * @property {boolean} [includeItemBytes=false] Whether to include item bytes in the result - * @prop {object} [headers={}] Extra Headers ( like User-Agent ) to add to request. Overrides the headers globally provided. - */ -/** - * @typedef {object} PlayerBingoOptions - * @property {boolean} [raw=false] Raw data - * @property {boolean} [noCacheCheck=false] Disable/Enable cache checking - * @property {boolean} [noCaching=false] Disable/Enable writing to cache - * @property {boolean} [fetchBingoData=false] Fetches bingo data to give more information - * @prop {object} [headers={}] Extra Headers ( like User-Agent ) to add to request. Overrides the headers globally provided. - */ -module.exports = Client; diff --git a/src/Client.test.ts b/src/Client.test.ts new file mode 100644 index 000000000..4f6f1004d --- /dev/null +++ b/src/Client.test.ts @@ -0,0 +1,149 @@ +import CacheHandler from './Private/CacheHandler.js'; +import Client from './Client.js'; +import Errors from './Errors.js'; +import RequestHandler from './Private/RequestHandler.js'; +import Updater from './Private/Updater.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { ClientOptions } from './Types/Client.js'; +const errors = new Errors(); + +test('Client (No Key)', () => { + expect(() => new Client('')).toThrowError(errors.NO_API_KEY); +}); + +test('Client (No Options)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? ''); + expect(client).toBeDefined(); + expect(client).toBeInstanceOf(Client); + expectTypeOf(client).toEqualTypeOf(); + + expect(client.key).toBe(process.env.HYPIXEL_KEY ?? ''); + expectTypeOf(client.key).toBeString(); + + expect(client.options).toBeDefined(); + expectTypeOf(client.options).toEqualTypeOf(); + + expect(client.options.cache).toBeDefined(); + expect(client.options.cache).toBe(true); + expect(client.options.cache).toBeTruthy(); + + expect(client.options.cacheTime).toBeDefined(); + expectTypeOf(client.options.cacheTime).toEqualTypeOf(); + expect(client.options.cacheTime).toBe(300); + + expect(client.options.cacheMaxKeys).toBeDefined(); + expectTypeOf(client.options.cacheMaxKeys).toEqualTypeOf(); + expect(client.options.cacheMaxKeys).toBe(-1); + + expect(client.options.cacheCheckPeriod).toBeDefined(); + expectTypeOf(client.options.cacheCheckPeriod).toEqualTypeOf(); + expect(client.options.cacheCheckPeriod).toBe(180); + + expect(client.options.rateLimit).toBeDefined(); + expectTypeOf(client.options.rateLimit).toEqualTypeOf<'AUTO' | 'NONE' | undefined>(); + expect(client.options.rateLimit).toBe('AUTO'); + + expect(client.options.silent).toBeDefined(); + expectTypeOf(client.options.silent).toEqualTypeOf(); + expect(client.options.silent).toBe(false); + expect(client.options.silent).toBeFalsy(); + + expect(client.options.checkForUpdates).toBeDefined(); + expect(client.options.checkForUpdates).toBeTruthy(); + expect(client.options.checkForUpdates).toBe(true); + + expect(client.options.checkForUpdatesInterval).toBeDefined(); + expectTypeOf(client.options.checkForUpdatesInterval).toEqualTypeOf(); + expect(client.options.checkForUpdatesInterval).toBe(60); + + expect(client.requestHandler).toBeDefined(); + expect(client.requestHandler).toBeInstanceOf(RequestHandler); + expectTypeOf(client.requestHandler).toEqualTypeOf(); + + expect(client.cacheHandler).toBeDefined(); + expect(client.cacheHandler).toBeInstanceOf(CacheHandler); + expectTypeOf(client.cacheHandler).toEqualTypeOf(); + + expect(client.updater).toBeDefined(); + expect(client.updater).toBeInstanceOf(Updater); + expectTypeOf(client.updater).toEqualTypeOf(); + + expect(client.errors).toBeDefined(); + expect(client.errors).toBeInstanceOf(Errors); + expectTypeOf(client.errors).toEqualTypeOf(); + + client.destroy(); +}); + +test('Client (Options)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { + cache: false, + cacheTime: 600, + cacheMaxKeys: 100, + cacheCheckPeriod: 300, + rateLimit: 'NONE', + silent: true, + checkForUpdates: false, + checkForUpdatesInterval: 120 + }); + expect(client).toBeDefined(); + expect(client).toBeInstanceOf(Client); + expectTypeOf(client).toEqualTypeOf(); + + expect(client.key).toBe(process.env.HYPIXEL_KEY ?? ''); + expectTypeOf(client.key).toBeString(); + + expect(client.options).toBeDefined(); + expectTypeOf(client.options).toEqualTypeOf(); + + expect(client.options.cache).toBeDefined(); + expect(client.options.cache).toBe(false); + expect(client.options.cache).toBeFalsy(); + + expect(client.options.cacheTime).toBeDefined(); + expectTypeOf(client.options.cacheTime).toEqualTypeOf(); + expect(client.options.cacheTime).toBe(600); + + expect(client.options.cacheMaxKeys).toBeDefined(); + expectTypeOf(client.options.cacheMaxKeys).toEqualTypeOf(); + expect(client.options.cacheMaxKeys).toBe(100); + + expect(client.options.cacheCheckPeriod).toBeDefined(); + expectTypeOf(client.options.cacheCheckPeriod).toEqualTypeOf(); + expect(client.options.cacheCheckPeriod).toBe(300); + + expect(client.options.rateLimit).toBeDefined(); + expectTypeOf(client.options.rateLimit).toEqualTypeOf<'AUTO' | 'NONE' | undefined>(); + expect(client.options.rateLimit).toBe('NONE'); + + expect(client.options.silent).toBeDefined(); + expectTypeOf(client.options.silent).toEqualTypeOf(); + expect(client.options.silent).toBe(true); + expect(client.options.silent).toBeTruthy(); + + expect(client.options.checkForUpdates).toBeDefined(); + expect(client.options.checkForUpdates).toBeFalsy(); + expect(client.options.checkForUpdates).toBe(false); + + expect(client.options.checkForUpdatesInterval).toBeDefined(); + expectTypeOf(client.options.checkForUpdatesInterval).toEqualTypeOf(); + expect(client.options.checkForUpdatesInterval).toBe(120); + + expect(client.requestHandler).toBeDefined(); + expect(client.requestHandler).toBeInstanceOf(RequestHandler); + expectTypeOf(client.requestHandler).toEqualTypeOf(); + + expect(client.cacheHandler).toBeDefined(); + expect(client.cacheHandler).toBeInstanceOf(CacheHandler); + expectTypeOf(client.cacheHandler).toEqualTypeOf(); + + expect(client.updater).toBeDefined(); + expect(client.updater).toBeInstanceOf(Updater); + expectTypeOf(client.updater).toEqualTypeOf(); + + expect(client.errors).toBeDefined(); + expect(client.errors).toBeInstanceOf(Errors); + expectTypeOf(client.errors).toEqualTypeOf(); + + client.destroy(); +}); diff --git a/src/Client.ts b/src/Client.ts new file mode 100644 index 000000000..3fe67970e --- /dev/null +++ b/src/Client.ts @@ -0,0 +1,243 @@ +import API from './API/index.js'; +import Achievements from './Structures/Static/Achievements/Achievements.js'; +import Auction from './Structures/SkyBlock/Auctions/Auction.js'; +import BingoData from './Structures/SkyBlock/Static/BingoData.js'; +import Booster from './Structures/Boosters/Booster.js'; +import CacheHandler from './Private/CacheHandler.js'; +import Challenges from './Structures/Static/Challenges.js'; +import Errors from './Errors.js'; +import FireSale from './Structures/SkyBlock/Static/FireSale.js'; +import Functions from './Private/Functions.js'; +import GameCounts from './Structures/GameCounts.js'; +import GovernmentData from './Structures/SkyBlock/Static/Government.js'; +import Guild from './Structures/Guild/Guild.js'; +import GuildAchievements from './Structures/Static/Achievements/GuildAchievements.js'; +import House from './Structures/House.js'; +import Leaderboard from './Structures/Leaderboard.js'; +import Player from './Structures/Player/Player.js'; +import Product from './Structures/SkyBlock/Bazaar/Product.js'; +import Quests from './Structures/Static/Quests.js'; +import RateLimit from './Private/RateLimit.js'; +import RecentGame from './Structures/RecentGame.js'; +import RequestData from './Private/RequestData.js'; +import RequestHandler from './Private/RequestHandler.js'; +import SkyblockGarden from './Structures/SkyBlock/SkyblockGarden.js'; +import SkyblockMember from './Structures/SkyBlock/SkyblockMember.js'; +import SkyblockMuseum from './Structures/SkyBlock/SkyblockMuseum.js'; +import SkyblockNews from './Structures/SkyBlock/News/SkyblockNews.js'; +import SkyblockProfile from './Structures/SkyBlock/SkyblockProfile.js'; +import Status from './Structures/Status.js'; +import Updater from './Private/Updater.js'; +import WatchdogStats from './Structures/WatchdogStats.js'; +import type { + AuctionFetchOptions, + AuctionRequestOptions, + GuildFetchOptions, + PlayerRequestOptions, + SkyblockAuctionsResult, + SkyblockRequestOptions +} from './Types/API.js'; +import type { ClientOptions } from './Types/Client.js'; +import type { RequestOptions } from './Types/Requests.js'; + +const clients: Client[] = []; + +class Client { + declare options: ClientOptions; + declare requestHandler: RequestHandler; + declare cacheHandler: CacheHandler; + declare functions: Functions; + declare updater: Updater; + declare errors: Errors; + declare rateLimit: RateLimit; + readonly key: string; + declare interval: NodeJS.Timeout; + constructor(key: string, options?: ClientOptions) { + this.key = key; + this.errors = new Errors(); + if (!this.key.length) throw new Error(this.errors.NO_API_KEY); + this.options = this.parasOptions(options); + this.requestHandler = new RequestHandler(this); + this.cacheHandler = new CacheHandler(this); + this.functions = new Functions(this); + this.updater = new Updater(this); + this.rateLimit = new RateLimit(this); + if ('NONE' !== this.options.rateLimit) this.rateLimit.initialize(); + for (const func in API) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + const endpoint = new API[func](this); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + this[func] = endpoint.execute.bind(endpoint); + } + if (clients.find((x) => x.key === key)) { + // eslint-disable-next-line no-console + console.warn(this.errors.MULTIPLE_INSTANCES); + const found = clients.find((x) => x.key === key); + if (found) { + this.destroy(); + Object.assign(this, found); + } + return; + } + if (this.options.checkForUpdates) { + this.interval = setInterval( + () => { + this.updater.checkForUpdates(); + }, + 1000 * 60 * (this.options.checkForUpdatesInterval ?? 60) + ); + } + clients.push(this); + } + + destroy() { + const clientIndex = clients.findIndex((client) => client.key === this.key); + if (-1 !== clientIndex) clients.splice(clientIndex, 1); + if (this.interval) clearInterval(this.interval); + if (this.rateLimit.interval) clearInterval(this.rateLimit.interval); + } + + private parasOptions(options?: ClientOptions): ClientOptions { + return { + cache: options?.cache ?? true, + cacheTime: options?.cacheTime ?? 300, + cacheMaxKeys: options?.cacheMaxKeys ?? -1, + cacheCheckPeriod: options?.cacheCheckPeriod ?? 180, + rateLimit: options?.rateLimit ?? 'AUTO', + silent: options?.silent ?? false, + checkForUpdates: options?.checkForUpdates ?? true, + checkForUpdatesInterval: options?.checkForUpdatesInterval ?? 60 + }; + } + + /* v8 ignore next 140 */ + public getAchievements(options?: RequestOptions): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getActiveHouses(options?: RequestOptions): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getBoosters(options?: RequestOptions): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getChallenges(options?: RequestOptions): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getGameCounts(options?: RequestOptions): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getGuild( + searchParameter: GuildFetchOptions, + query: string, + options?: RequestOptions + ): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getGuildAchievements(options?: RequestOptions): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getHouse(query: string, options?: RequestOptions): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getLeaderboards(options?: RequestOptions): Promise | RequestData> { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getPlayer(query: string, options?: PlayerRequestOptions): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getPlayerHouses(query: string, options?: RequestOptions): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getQuests(options?: RequestOptions): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getRecentGames(query: string, options?: RequestOptions): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getSkyblockAuction( + type: AuctionFetchOptions, + query: string, + options?: AuctionRequestOptions + ): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getSkyblockAuctions(query: number | '*', options?: AuctionRequestOptions): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getSkyblockAuctionsByPlayer(query: string, options?: AuctionRequestOptions): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getSkyblockBazaar(options?: RequestOptions): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getSkyblockBingo(options?: RequestOptions): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getSkyblockFireSales(options?: RequestOptions): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getSkyblockGarden(profileId: string, options?: RequestOptions): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getSkyblockGovernment(options?: RequestOptions): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getSkyblockMember( + query: string, + options?: SkyblockRequestOptions + ): Promise | RequestData> { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getSkyblockMuseum( + query: string, + profileId: string, + options?: RequestOptions + ): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getSkyblockNews(options?: RequestOptions): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getSkyblockProfiles( + query: string, + options?: SkyblockRequestOptions + ): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getStatus(query: string, options?: RequestOptions): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getWatchdogStats(options?: RequestOptions): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } +} + +export default Client; diff --git a/src/Errors.js b/src/Errors.js deleted file mode 100644 index b1d597cd4..000000000 --- a/src/Errors.js +++ /dev/null @@ -1,68 +0,0 @@ -/* eslint-disable max-len */ -module.exports = { - INVALID_API_KEY: '[hypixel-api-reborn] Invalid API Key! For help join our Discord Server https://discord.gg/NSEBNMM', - NO_API_KEY: '[hypixel-api-reborn] No API Key specified! For help join our Discord Server https://discord.gg/NSEBNMM', - ERROR_CODE_CAUSE: - '[hypixel-api-reborn] Code: {code} - {cause}! For help join our Discord Server https://discord.gg/NSEBNMM', - ERROR_STATUSTEXT: '[hypixel-api-reborn] {statustext}! For help join our Discord Server https://discord.gg/NSEBNMM', - KEY_MUST_BE_A_STRING: - '[hypixel-api-reborn] Specified API Key must be a string! For help join our Discord Server https://discord.gg/NSEBNMM', - OPTIONS_MUST_BE_AN_OBJECT: - '[hypixel-api-reborn] Options must be an object! For help join our Discord Server https://discord.gg/NSEBNMM', - CACHE_TIME_MUST_BE_A_NUMBER: - '[hypixel-api-reborn] Cache Time must be a number! For help join our Discord Server https://discord.gg/NSEBNMM', - CACHE_LIMIT_MUST_BE_A_NUMBER: - '[hypixel-api-reborn] Cache Limit must be a number! For help join our Discord Server https://discord.gg/NSEBNMM', - CACHE_FILTER_INVALID: - '[hypixel-api-reborn] Cache Filter must be a function returning a boolean, an object, an array, or a string!', - NO_NICKNAME_UUID: '[hypixel-api-reborn] No nickname or uuid specified.', - NO_UUID: '[hypixel-api-reborn] No uuid specified.', - UUID_NICKNAME_MUST_BE_A_STRING: '[hypixel-api-reborn] Nickname or uuid must be a string.', - MALFORMED_UUID: '[hypixel-api-reborn] Malformed UUID!', - PLAYER_DOES_NOT_EXIST: '[hypixel-api-reborn] Player does not exist.', - PLAYER_HAS_NEVER_LOGGED: '[hypixel-api-reborn] Player has never logged into Hypixel.', - PLAYER_IS_INACTIVE: - "[hypixel-api-reborn] No records of recent games because player hasn't been online for more than 3 days or is lacking data to determine the cause of an empty response", - PLAYER_DISABLED_ENDPOINT: '[hypixel-api-reborn] Player has disabled this endpoint.', - NO_GUILD_QUERY: '[hypixel-api-reborn] No guild search query specified.', - INVALID_GUILD_ID: '[hypixel-api-reborn] Specified Guild ID is invalid.', - INVALID_GUILD_SEARCH_PARAMETER: "[hypixel-api-reborn] getGuild() searchParameter must be 'id', 'guild' or 'player'.", - SOMETHING_WENT_WRONG: '[hypixel-api-reborn] Something went wrong. {cause}', - GUILD_DOES_NOT_EXIST: '[hypixel-api-reborn] Guild does not exist.', - PAGE_INDEX_ERROR: - '[hypixel-api-reborn] Invalid page index. Must be an integer, an array of 2 integers, or a keyword. For help join our Discord Server https://discord.gg/NSEBNMM', - INVALID_OPTION_VALUE: - '[hypixel-api-reborn] Invalid option value! For help join our Discord Server https://discord.gg/NSEBNMM', - INVALID_RESPONSE_BODY: - '[hypixel-api-reborn] An error occurred while converting to JSON. Perhaps this is due to an update or maintenance. For help join our Discord Server https://discord.gg/NSEBNMM', - INVALID_RATE_LIMIT_OPTION: - "[hypixel-api-reborn] Rate Limit provided in Client options must be 'HARD', 'AUTO', or 'NONE'. For help join our Discord Server https://discord.gg/NSEBNMM", - INVALID_KEY_LIMIT_OPTION: - '[hypixel-api-reborn] Key Limit provided in Client options must be an integer representing the amount of requests possible in one minute with your key.', - INVALID_HEADER_SYNC_OPTION: '[hypixel-api-reborn] Invalid Value for maxSyncHeaders : must be a boolean', - INVALID_BURST_OPTION: '[hypixel-api-reborn] maxBurstRequests provided in Client options must be a number', - NODE_VERSION_ERR: - "[hypixel-api-reborn] You are using a version of Nodejs that doesn't support certain features we use. Please upgrade to version 14 or above.", - UPDATER_REQUEST_NOT_OK: '[hypixel-api-reborn] An error occurred checking for updates.', - CONNECTION_ERROR: '[hypixel-api-reborn] Failed to connect.', - RATE_LIMIT_INIT_ERROR: - '[hypixel-api-reborn] An error happened whilst initializing rate limit. We strongly recommend restarting the code as this can lead to desynchronization.', - MULTIPLE_INSTANCES: - '[hypixel-api-reborn] Multiple instances of hypixel-api-reborn are found so we merged them for you. Please refrain from spawning multiple instances in the future. For more information, join our Discord Server https://discord.gg/NSEBNMM.', - INVALID_HEADERS: - '[hypixel-api-reborn] Invalid Headers are provided in ClientOptions. For help join our Discord Server https://discord.gg/NSEBNMM', - INVALID_CACHE_HANDLER: - '[hypixel-api-reborn] An invalid cache handler is provideed. For help join our Discord Server https://discord.gg/NSEBNMM', - UNEXPECTED_ERROR: - "[hypixel-api-reborn] The data provided to hypixel API is malformed and thus not recognized by hypixel, but this shouldn't be your fault. Please report this error in our Discord Server https://discord.gg/NSEBNMM or GitHub. ", - RATE_LIMIT_EXCEEDED: - "[hypixel-api-reborn] The rate limitations on your API Key has been exceeded. There might be an outage (Check Hypixel's status page), or you simply did too many requests in a short time. Hint: Enable rate limit options! They can help you avoid this error! For help join our Discord Server https://discord.gg/NSEBNMM", - NO_SKYBLOCK_PROFILES: '[hypixel-api-reborn] The player has no skyblock profiles.', - INVALID_SILENT_OPTION: '[hypixel-api-reborn] Invalid Value for silent : must be a boolean', - INVALID_UPDATE_OPTION: '[hypixel-api-reborn] Invalid Value for update : must be a boolean', - INVALID_THIRD_PARTY_API_OPTION: '[hypixel-api-reborn] Invalid Third Party API option : must be a boolean or string', - BAD_AUCTION_FILTER: - '[hypixel-api-reborn] Unexpected filter for Client#getSkyblockAuction. Expected one of "PLAYER", "AUCTION", "PROFILE", but got something else.', - RECENT_REQUEST: - '[Hypixel-API-Reborn] You have requested that player recently. Try turning on cache. For help join our Discord Server https://discord.gg/NSEBNMM' -}; diff --git a/src/Errors.ts b/src/Errors.ts new file mode 100644 index 000000000..f8d999277 --- /dev/null +++ b/src/Errors.ts @@ -0,0 +1,45 @@ +/* eslint-disable max-len */ +class Errors { + INVALID_API_KEY: string = + '[Hypixel-API-Reborn] Invalid API Key! For help join our Discord Server https://discord.gg/NSEBNMM'; + NO_API_KEY: string = + '[Hypixel-API-Reborn] No API Key specified! For help join our Discord Server https://discord.gg/NSEBNMM'; + ERROR_CODE_CAUSE: string = + '[Hypixel-API-Reborn] Code: {code} - {cause}! For help join our Discord Server https://discord.gg/NSEBNMM'; + ERROR_STATUSTEXT: string = + '[Hypixel-API-Reborn] {statustext}! For help join our Discord Server https://discord.gg/NSEBNMM'; + NO_NICKNAME_UUID: string = '[Hypixel-API-Reborn] No nickname or uuid specified.'; + NO_UUID: string = '[Hypixel-API-Reborn] No uuid specified.'; + UUID_NICKNAME_MUST_BE_A_STRING: string = '[Hypixel-API-Reborn] Nickname or uuid must be a string.'; + MALFORMED_UUID: string = '[Hypixel-API-Reborn] Malformed UUID!'; + PLAYER_HAS_NEVER_LOGGED: string = '[Hypixel-API-Reborn] Player has never logged into Hypixel.'; + NO_GUILD_QUERY: string = '[Hypixel-API-Reborn] No guild search query specified.'; + INVALID_GUILD_ID: string = '[Hypixel-API-Reborn] Specified Guild ID is invalid.'; + INVALID_GUILD_SEARCH_PARAMETER: string = + "[Hypixel-API-Reborn] getGuild() searchParameter must be 'id'; 'guild' or 'player'."; + SOMETHING_WENT_WRONG: string = '[Hypixel-API-Reborn] Something went wrong. {cause}'; + GUILD_DOES_NOT_EXIST: string = '[Hypixel-API-Reborn] Guild does not exist.'; + PAGE_INDEX_ERROR: string = + '[Hypixel-API-Reborn] Invalid page index. Must be an integer, an array of 2 integers, or a keyword. For help join our Discord Server https://discord.gg/NSEBNMM'; + INVALID_OPTION_VALUE: string = + '[Hypixel-API-Reborn] Invalid option value! For help join our Discord Server https://discord.gg/NSEBNMM'; + UPDATER_REQUEST_NOT_OK: string = '[Hypixel-API-Reborn] Something went wrong while checking for updates.'; + MULTIPLE_INSTANCES: string = + '[Hypixel-API-Reborn] Multiple instances of hypixel-api-reborn are found so we merged them for you. Please refrain from spawning multiple instances in the future. For more information, join our Discord Server https://discord.gg/NSEBNMM.'; + UNEXPECTED_ERROR: string = + "[Hypixel-API-Reborn] The data provided to hypixel API is malformed and thus not recognized by hypixel, but this shouldn't be your fault. Please report this error in our Discord Server https://discord.gg/NSEBNMM or GitHub. "; + RATE_LIMIT_EXCEEDED: string = + "[Hypixel-API-Reborn] The rate limitations on your API Key has been exceeded. There might be an outage (Check Hypixel's status page), or you simply did too many requests in a short time. Hint: Enable rate limit options! They can help you avoid this error! For help join our Discord Server https://discord.gg/NSEBNMM"; + RECENT_REQUEST: string = + '[Hypixel-API-Reborn] You have requested that player recently. Try turning on cache. For help join our Discord Server https://discord.gg/NSEBNMM'; + NO_SKYBLOCK_PROFILES: string = '[Hypixel-API-Reborn] The player has no skyblock profiles.'; + BAD_AUCTION_FILTER: string = + '[Hypixel-API-Reborn] Unexpected filter for Client#getSkyblockAuction. Expected one of "PLAYER", "AUCTION", "PROFILE", but got something else.'; + NOT_IMPLEMENTED: string = + '[Hypixel-API-Reborn] Endpoint execute method is not implemented yet! Please report this https://discord.gg/NSEBNMM'; + RATE_LIMIT_INIT_ERROR: string = + '[hypixel-api-reborn] An error happened whilst initializing rate limit. We strongly recommend restarting the code as this can lead to desynchronization.'; + ENDPOINT_NOT_LOADED: string = '[hypixel-api-reborn] This endpoint has not been loaded yet. Please restart your code'; +} + +export default Errors; diff --git a/src/Private/CacheHandler.test.ts b/src/Private/CacheHandler.test.ts new file mode 100644 index 000000000..fe110babf --- /dev/null +++ b/src/Private/CacheHandler.test.ts @@ -0,0 +1,49 @@ +import CacheHandler from './CacheHandler.js'; +import Client from '../Client.js'; +import NodeCache from 'node-cache'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('CacheHandler', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + expect(client).toBeDefined(); + expectTypeOf(client).toEqualTypeOf(); + + expect(client.cacheHandler).toBeDefined(); + expectTypeOf(client.cacheHandler).toEqualTypeOf(); + + expect(client.cacheHandler.cache).toBeDefined(); + expectTypeOf(client.cacheHandler.cache).toEqualTypeOf(); + + expect(client.cacheHandler.set).toBeDefined(); + expectTypeOf(client.cacheHandler.set).toBeFunction(); + expect(() => client.cacheHandler.set('test', 'value')).not.toThrow(); + + expect(client.cacheHandler.get).toBeDefined(); + expectTypeOf(client.cacheHandler.get).toBeFunction(); + expect(() => client.cacheHandler.has('test')).not.toThrow(); + expect(client.cacheHandler.has('test')).toBe(true); + + expect(client.cacheHandler.get).toBeDefined(); + expectTypeOf(client.cacheHandler.get).toBeFunction(); + expect(() => client.cacheHandler.get('test')).not.toThrow(); + expect(client.cacheHandler.get('test')).toBe('value'); + + expect(client.cacheHandler.keys).toBeDefined(); + expectTypeOf(client.cacheHandler.keys).toBeFunction(); + expect(() => client.cacheHandler.keys()).not.toThrow(); + expect(client.cacheHandler.keys()).toEqual(['test']); + expectTypeOf(client.cacheHandler.keys()).toEqualTypeOf(); + + expect(client.cacheHandler.size).toBeDefined(); + expectTypeOf(client.cacheHandler.size).toBeFunction(); + expect(() => client.cacheHandler.size()).not.toThrow(); + expect(client.cacheHandler.size()).toBe(1); + expectTypeOf(client.cacheHandler.size()).toEqualTypeOf(); + + expect(client.cacheHandler.clear).toBeDefined(); + expectTypeOf(client.cacheHandler.clear).toBeFunction(); + expect(() => client.cacheHandler.clear()).not.toThrow(); + expect(client.cacheHandler.size()).toBe(0); + + client.destroy(); +}); diff --git a/src/Private/CacheHandler.ts b/src/Private/CacheHandler.ts new file mode 100644 index 000000000..6d73bf76a --- /dev/null +++ b/src/Private/CacheHandler.ts @@ -0,0 +1,41 @@ +import Client from '../Client.js'; +import NodeCache from 'node-cache'; + +class CacheHandler { + readonly client: Client; + declare cache: NodeCache; + constructor(client: Client) { + this.client = client; + this.cache = new NodeCache({ + stdTTL: this.client.options.cacheTime, + maxKeys: this.client.options.cacheMaxKeys, + checkperiod: this.client.options.cacheCheckPeriod + }); + } + + set(key: string, value: any): any { + return this.cache.set(key, value); + } + + has(key: string): boolean { + return this.cache.has(key); + } + + get(key: string): any { + return this.cache.get(key); + } + + keys(): string[] { + return this.cache.keys(); + } + + size(): number { + return this.cache.keys().length; + } + + clear(): void { + this.cache.flushAll(); + } +} + +export default CacheHandler; diff --git a/src/Private/Endpoint.test.ts b/src/Private/Endpoint.test.ts new file mode 100644 index 000000000..9520145dd --- /dev/null +++ b/src/Private/Endpoint.test.ts @@ -0,0 +1,23 @@ +import Client from '../Client.js'; +import Endpoint from './Endpoint.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Endpoint', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + expect(client).toBeDefined(); + expectTypeOf(client).toEqualTypeOf(); + + const endpoint = new Endpoint(client); + + expect(endpoint).toBeDefined(); + expectTypeOf(endpoint).toEqualTypeOf(); + + expect(endpoint.client).toBeDefined(); + expectTypeOf(endpoint.client).toEqualTypeOf(); + + expect(endpoint.execute).toBeDefined(); + expectTypeOf(endpoint.execute).toBeFunction(); + expect(() => endpoint.execute()).toThrowError(client.errors.NOT_IMPLEMENTED); + + client.destroy(); +}); diff --git a/src/Private/Endpoint.ts b/src/Private/Endpoint.ts new file mode 100644 index 000000000..87b35258f --- /dev/null +++ b/src/Private/Endpoint.ts @@ -0,0 +1,14 @@ +import Client from '../Client.js'; + +class Endpoint { + readonly client: Client; + constructor(client: Client) { + this.client = client; + } + + execute(...args: any[]): Promise | any { + throw new Error(this.client.errors.NOT_IMPLEMENTED); + } +} + +export default Endpoint; diff --git a/src/Private/Functions.test.ts b/src/Private/Functions.test.ts new file mode 100644 index 000000000..2e73e5287 --- /dev/null +++ b/src/Private/Functions.test.ts @@ -0,0 +1,54 @@ +import Client from '../Client'; +import Functions from './Functions'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Functions', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + expect(client).toBeDefined(); + expectTypeOf(client).toEqualTypeOf(); + expect(client.functions).toBeDefined(); + expectTypeOf(client.functions).toEqualTypeOf(); + + expect(client.functions.isUUID).toBeDefined(); + const valid = [ + 'add71246c46e455c8345c129ea6f146c', + '17ec71b4e5fa467481344b319a2958c3', + '37501e7512b845ab8796e2baf9e9677a' + ]; + const dashs = [ + 'add71246-c46e-455c-8345-c129ea6f146c', + '1ac8f319-1ac8-4c44-93ac-fcae2848cd9f', + '337a48bf-57e9-44eb-8acb-83b885936e83' + ]; + const Invalid = ['invalid', 'hello why are you here?', '']; + + valid.forEach((uuid) => { + expect(client.functions.isUUID(uuid)).toBe(true); + expectTypeOf(client.functions.isUUID(uuid)).toBeBoolean(); + }); + + dashs.forEach((uuid) => { + expect(client.functions.isUUID(uuid)).toBe(true); + expectTypeOf(client.functions.isUUID(uuid)).toBeBoolean(); + }); + + Invalid.forEach((uuid) => { + expect(client.functions.isUUID(uuid)).toBe(false); + expectTypeOf(client.functions.isUUID(uuid)).toBeBoolean(); + }); + + expect(client.functions.isGuildID).toBeDefined(); + + const ids = ['5b8dd8cb0cf24573ab84c9ad', '656618008ea8c9dca6f3668d', '5ba94ed50cf2cc24cf043706']; + const idsInvalid = ['invalid', 'hello why are you here?', '']; + + ids.forEach((id) => { + expect(client.functions.isGuildID(id)).toBe(true); + expectTypeOf(client.functions.isGuildID(id)).toBeBoolean(); + }); + + idsInvalid.forEach((id) => { + expect(client.functions.isGuildID(id)).toBe(false); + expectTypeOf(client.functions.isGuildID(id)).toBeBoolean(); + }); +}); diff --git a/src/Private/Functions.ts b/src/Private/Functions.ts new file mode 100644 index 000000000..2322a632c --- /dev/null +++ b/src/Private/Functions.ts @@ -0,0 +1,20 @@ +import Client from '../Client.js'; + +class Functions { + client: Client; + constructor(client: Client) { + this.client = client; + } + + isUUID(uuid: string): boolean { + const regexp = /^[0-9a-f]{32}$/i; + uuid = uuid.replace(/-/g, ''); + return regexp.test(uuid); + } + + isGuildID(id: string): boolean { + return 24 === id.length; + } +} + +export default Functions; diff --git a/src/Private/RateLimit.test.ts b/src/Private/RateLimit.test.ts new file mode 100644 index 000000000..ee88d6b41 --- /dev/null +++ b/src/Private/RateLimit.test.ts @@ -0,0 +1,92 @@ +import Client from '../Client.js'; +import RateLimit from './RateLimit.js'; +import { defaultRequestData } from '../../vitest.setup.js'; +import { expect, expectTypeOf, test, vi } from 'vitest'; + +test('RateLimit (None)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { rateLimit: 'NONE' }); + expect(client).toBeDefined(); + expectTypeOf(client).toEqualTypeOf(); + + expect(client.rateLimit).toBeDefined(); + expectTypeOf(client.rateLimit).toEqualTypeOf(); + + expect(client.rateLimit.requests).toBe(0); + expectTypeOf(client.rateLimit.requests).toEqualTypeOf(); + expect(client.rateLimit.limit).toBe(0); + expectTypeOf(client.rateLimit.limit).toEqualTypeOf(); + expect(client.rateLimit.initialized).toBe(false); + expectTypeOf(client.rateLimit.initialized).toEqualTypeOf(); + + expect(client.rateLimit.sync).toBeDefined(); + expectTypeOf(client.rateLimit.sync).toBeFunction(); + expect(() => client.rateLimit.sync()).not.toThrow(); + + expect(client.rateLimit.reset).toBeDefined(); + expectTypeOf(client.rateLimit.reset).toBeFunction(); + expect(() => client.rateLimit.reset()).not.toThrow(); + + expect(client.rateLimit.initialize).toBeDefined(); + expectTypeOf(client.rateLimit.initialize).toBeFunction(); + expect(() => client.rateLimit.initialize()).not.toThrow(); + + client.destroy(); +}); + +test('RateLimit (Auto)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { rateLimit: 'NONE' }); + expect(client).toBeDefined(); + expectTypeOf(client).toEqualTypeOf(); + + expect(client.rateLimit).toBeDefined(); + expectTypeOf(client.rateLimit).toEqualTypeOf(); + await client.rateLimit.initialize(); + + expect(client.rateLimit.requests).greaterThan(0); + expectTypeOf(client.rateLimit.requests).toEqualTypeOf(); + expect(client.rateLimit.limit).toBe(300); + expectTypeOf(client.rateLimit.limit).toEqualTypeOf(); + expect(client.rateLimit.initialized).toBe(true); + expectTypeOf(client.rateLimit.initialized).toEqualTypeOf(); + + expect(client.rateLimit.sync).toBeDefined(); + expectTypeOf(client.rateLimit.sync).toBeFunction(); + expect(() => client.rateLimit.sync()).not.toThrow(); + + expect(client.rateLimit.reset).toBeDefined(); + expectTypeOf(client.rateLimit.reset).toBeFunction(); + expect(() => client.rateLimit.reset()).not.toThrow(); + + expect(client.rateLimit.initialize).toBeDefined(); + expectTypeOf(client.rateLimit.initialize).toBeFunction(); + expect(() => client.rateLimit.initialize()).not.toThrow(); + + client.destroy(); +}); + +test('Ratelimit (Sync)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? ''); + client.updater.currentVersion = '1.0.0'; + vi.spyOn(global, 'fetch').mockResolvedValue({ + ...defaultRequestData, + headers: new Headers({ 'ratelimit-limit': '30', 'ratelimit-remaining': '27' }) + } as any); + expect(() => client.rateLimit.sync()).not.toThrowError(); + await client.rateLimit.sync(); + expect(client.rateLimit.requests).toBe(3); + expect(client.rateLimit.limit).toBe(30); + vi.restoreAllMocks(); + client.destroy(); +}); + +test('Ratelimit (Bad Sync Data)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? ''); + client.updater.currentVersion = '1.0.0'; + vi.spyOn(global, 'fetch').mockResolvedValue({ + ...defaultRequestData, + headers: new Headers({ hello: '100' }) + } as any); + expect(() => client.rateLimit.sync()).rejects.toThrowError(client.errors.RATE_LIMIT_INIT_ERROR); + vi.restoreAllMocks(); + client.destroy(); +}); diff --git a/src/Private/RateLimit.ts b/src/Private/RateLimit.ts new file mode 100644 index 000000000..9d83934dd --- /dev/null +++ b/src/Private/RateLimit.ts @@ -0,0 +1,38 @@ +import Client from '../Client.js'; + +class RateLimit { + readonly client: Client; + declare requests: number; + declare limit: number; + declare initialized: boolean; + declare interval: NodeJS.Timeout; + constructor(client: Client) { + this.client = client; + this.requests = 0; + this.limit = 0; + this.initialized = false; + this.interval = setInterval(() => this.reset(), 300000); + } + + async sync() { + const { headers } = await this.client.requestHandler.request('/boosters', { raw: true }); + if (headers?.['ratelimit-limit'] === undefined || headers?.['ratelimit-remaining'] === undefined) { + throw new Error(this.client.errors.RATE_LIMIT_INIT_ERROR); + } + this.requests = headers['ratelimit-limit'] - headers['ratelimit-remaining']; + this.limit = Number(headers['ratelimit-limit']); + } + + reset() { + if (false === this.initialized) return; + this.requests = 0; + } + + async initialize() { + if (this.initialized) return; + await this.sync(); + this.initialized = true; + } +} + +export default RateLimit; diff --git a/src/Private/RequestData.ts b/src/Private/RequestData.ts new file mode 100644 index 000000000..0a2592866 --- /dev/null +++ b/src/Private/RequestData.ts @@ -0,0 +1,28 @@ +import type { RequestOptions } from '../Types/Requests.js'; + +class RequestData { + readonly data: any; + readonly headers: Record; + readonly statusCode: number; + readonly options: RequestOptions; + readonly requestTimestamp: number; + readonly requestAt: Date; + readonly requestUrl: string; + readonly cached: boolean; + constructor( + data: Record, + headers: Record, + info: { status: number; url: string; options: RequestOptions; cached: boolean; timestamp?: number } + ) { + this.data = data; + this.headers = headers; + this.statusCode = info.status; + this.options = info.options; + this.requestTimestamp = info.timestamp || Date.now(); + this.requestAt = new Date(this.requestTimestamp); + this.requestUrl = info.url; + this.cached = info.cached; + } +} + +export default RequestData; diff --git a/src/Private/RequestHandler.test.ts b/src/Private/RequestHandler.test.ts new file mode 100644 index 000000000..fdc5ddd85 --- /dev/null +++ b/src/Private/RequestHandler.test.ts @@ -0,0 +1,100 @@ +import Client from '../Client.js'; +import RequestHandler from './RequestHandler.js'; +import { defaultRequestData } from '../../vitest.setup.js'; +import { expect, expectTypeOf, test, vi } from 'vitest'; + +test('RequestHandler', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + expect(client).toBeDefined(); + expectTypeOf(client).toEqualTypeOf(); + + expect(client.requestHandler).toBeDefined(); + expectTypeOf(client.requestHandler).toEqualTypeOf(); + + expect(client.requestHandler.toUUID).toBeDefined(); + expectTypeOf(client.requestHandler.toUUID).toBeFunction(); + const data = await client.requestHandler.toUUID('pixelic'); + expect(data).toBe('14727faefbdc4aff848cd2713eb9939e'); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + expect(() => client.requestHandler.toUUID()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + expect(() => client.requestHandler.toUUID(-1)).rejects.toThrowError(client.errors.UUID_NICKNAME_MUST_BE_A_STRING); + + client.destroy(); +}); + +test('RequestHandler (Invalid API Key)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + expect(client.requestHandler.request).toBeDefined(); + expectTypeOf(client.requestHandler.request).toBeFunction(); + vi.spyOn(global, 'fetch').mockResolvedValue({ + ...defaultRequestData, + status: 403, + json: () => Promise.resolve({ success: false }) + } as any); + expect(() => client.requestHandler.request('/boosters')).rejects.toThrowError(client.errors.INVALID_API_KEY); + vi.restoreAllMocks(); + client.destroy(); +}); + +test('RequestHandler (400 Bad Request)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + expect(client.requestHandler.request).toBeDefined(); + expectTypeOf(client.requestHandler.request).toBeFunction(); + vi.spyOn(global, 'fetch').mockResolvedValue({ + ...defaultRequestData, + status: 400, + json: () => Promise.resolve({ success: false, cause: 'meow' }) + } as any); + expect(() => client.requestHandler.request('/boosters')).rejects.toThrowError( + client.errors.ERROR_CODE_CAUSE.replace(/{code}/, '400 Bad Request').replace(/{cause}/, 'meow') + ); + vi.restoreAllMocks(); + client.destroy(); +}); + +test('RequestHandler (400 Bad Request No Cause)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + expect(client.requestHandler.request).toBeDefined(); + expectTypeOf(client.requestHandler.request).toBeFunction(); + vi.spyOn(global, 'fetch').mockResolvedValue({ + ...defaultRequestData, + status: 400, + json: () => Promise.resolve({ success: false }) + } as any); + expect(() => client.requestHandler.request('/boosters')).rejects.toThrowError( + client.errors.ERROR_CODE_CAUSE.replace(/{code}/, '400 Bad Request').replace(/{cause}/, 'Unknown') + ); + vi.restoreAllMocks(); + client.destroy(); +}); + +test('RequestHandler (Unprocessable Entity)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + expect(client.requestHandler.request).toBeDefined(); + expectTypeOf(client.requestHandler.request).toBeFunction(); + vi.spyOn(global, 'fetch').mockResolvedValue({ + ...defaultRequestData, + status: 422, + json: () => Promise.resolve({ success: false }) + } as any); + expect(() => client.requestHandler.request('/boosters')).rejects.toThrowError(client.errors.UNEXPECTED_ERROR); + vi.restoreAllMocks(); + client.destroy(); +}); + +test('RequestHandler (Rate Limited)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + expect(client.requestHandler.request).toBeDefined(); + expectTypeOf(client.requestHandler.request).toBeFunction(); + vi.spyOn(global, 'fetch').mockResolvedValue({ + ...defaultRequestData, + status: 429, + json: () => Promise.resolve({ success: false }) + } as any); + expect(() => client.requestHandler.request('/boosters')).rejects.toThrowError(client.errors.RATE_LIMIT_EXCEEDED); + vi.restoreAllMocks(); + client.destroy(); +}); diff --git a/src/Private/RequestHandler.ts b/src/Private/RequestHandler.ts new file mode 100644 index 000000000..320704e53 --- /dev/null +++ b/src/Private/RequestHandler.ts @@ -0,0 +1,133 @@ +const BASE_URL = 'https://api.hypixel.net/v2'; +import Client from '../Client.js'; +import RequestData from './RequestData.js'; +import type { RequestOptions } from '../Types/Requests.js'; + +class RequestHandler { + readonly client: Client; + constructor(client: Client) { + this.client = client; + } + + async request(endpoint: string, options?: RequestOptions): Promise { + options = { raw: options?.raw ?? false, noCache: options?.noCache ?? false }; + if (this.client.cacheHandler.has(endpoint)) { + const data = this.client.cacheHandler.get(endpoint); + return new RequestData(data.data, data.headers, { + status: 200, + options, + url: endpoint, + cached: true, + timestamp: data.timestamp + }); + } + const res = await fetch(BASE_URL + endpoint, { headers: { 'API-Key': this.client.key } }); + if (500 <= res.status && 528 > res.status) { + throw new Error( + this.client.errors.ERROR_STATUSTEXT.replace(/{statustext}/, `Server Error : ${res.status} ${res.statusText}`) + ); + } + const parsedRes = (await res.json()) as Record; + if (400 === res.status) { + throw new Error( + this.client.errors.ERROR_CODE_CAUSE.replace(/{code}/, '400 Bad Request').replace( + /{cause}/, + parsedRes.cause || 'Unknown' + ) + ); + } + if (403 === res.status) throw new Error(this.client.errors.INVALID_API_KEY); + if (422 === res.status) throw new Error(this.client.errors.UNEXPECTED_ERROR); + if ( + 429 === res.status && + 'You have already looked up this player too recently, please try again shortly' === parsedRes.cause + ) { + throw new Error(this.client.errors.RECENT_REQUEST); + } + if (429 === res.status) throw new Error(this.client.errors.RATE_LIMIT_EXCEEDED); + if (200 !== res.status) { + throw new Error(this.client.errors.ERROR_STATUSTEXT.replace(/{statustext}/, res.statusText)); + } + if (!parsedRes.success && !endpoint.startsWith('/housing')) { + throw new Error(this.client.errors.SOMETHING_WENT_WRONG.replace(/{cause}/, res.statusText)); + } + this.client.rateLimit.requests++; + const headers: Record = {}; + res.headers.forEach((value, key) => (headers[key] = value)); + const requestData = new RequestData(parsedRes, headers, { + status: res.status, + options, + url: endpoint, + cached: false + }); + if (options.noCache) return requestData; + if (this.client.options.cache && !options.raw) { + this.client.cacheHandler.set(endpoint, requestData); + } + return requestData; + } + + async toUUID(input: string): Promise { + if (!input) throw new Error(this.client.errors.NO_NICKNAME_UUID); + if ('string' !== typeof input) throw new Error(this.client.errors.UUID_NICKNAME_MUST_BE_A_STRING); + if (this.client.functions.isUUID(input)) return input.replace(/-/g, ''); + const url = `https://mowojang.matdoes.dev/${input}`; + if (this.client.cacheHandler.has(url)) { + return this.client.cacheHandler.get(url); + } + const res = await fetch(url); + if (500 <= res.status && 528 > res.status) { + throw new Error( + this.client.errors.ERROR_STATUSTEXT.replace(/{statustext}/, `Server Error : ${res.status} ${res.statusText}`) + ); + } + const parsedRes = (await res.json()) as Record; + if (400 === res.status) { + throw new Error( + this.client.errors.ERROR_CODE_CAUSE.replace(/{code}/, '400 Bad Request').replace( + /{cause}/, + parsedRes.cause || '' + ) + ); + } + if (200 !== res.status) { + throw new Error(this.client.errors.ERROR_STATUSTEXT.replace(/{statustext}/, res.statusText)); + } + if ('string' !== typeof parsedRes.id || 'string' !== typeof parsedRes.name) { + throw new Error(this.client.errors.MALFORMED_UUID); + } + if (this.client.options.cache) { + this.client.cacheHandler.set(url, parsedRes.id); + } + return parsedRes.id; + } + + async fetchExternalData(url: string): Promise { + if (this.client.cacheHandler.has(url)) { + const data = this.client.cacheHandler.get(url); + return new RequestData(data.data, data.headers, { + status: 200, + options: { raw: false, noCache: false }, + url, + cached: true, + timestamp: data.timestamp + }); + } + const res = await fetch(url); + const parsedRes = (await res.json()) as Record; + const headers: Record = {}; + res.headers.forEach((value, key) => (headers[key] = value)); + const requestData = new RequestData(parsedRes, headers, { + status: res.status, + options: { raw: false, noCache: false }, + url, + cached: false + }); + if (this.client.options.cache) { + this.client.cacheHandler.set(url, requestData); + } + return requestData; + } +} + +export default RequestHandler; diff --git a/src/Private/Updater.test.ts b/src/Private/Updater.test.ts new file mode 100644 index 000000000..3e68e9f57 --- /dev/null +++ b/src/Private/Updater.test.ts @@ -0,0 +1,76 @@ +import Client from '../Client.js'; +import Updater from './Updater.js'; +import { defaultRequestData } from '../../vitest.setup.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import { version } from '../../package.json'; +import { vi } from 'vitest'; + +test('Updater', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + expect(client).toBeDefined(); + expectTypeOf(client).toEqualTypeOf(); + + expect(client.updater).toBeDefined(); + expectTypeOf(client.updater).toEqualTypeOf(); + + expect(client.updater.currentVersion).toBe(version); + expect(client.updater.latestVersion).toBe('0.0.0'); + + expect(client.updater.checkForUpdates).toBeDefined(); + expectTypeOf(client.updater.checkForUpdates).toBeFunction(); + expect(() => client.updater.checkForUpdates()).not.toThrow(); + + expect(client.updater.getLatestVersion).toBeDefined(); + expectTypeOf(client.updater.getLatestVersion).toBeFunction(); + expect(() => client.updater.getLatestVersion()).not.toThrow(); + + expect(client.updater.compareVersions).toBeDefined(); + expectTypeOf(client.updater.compareVersions).toBeFunction(); + expect(() => client.updater.compareVersions('1.0.0', '1.0.0')).not.toThrow(); + expect(client.updater.compareVersions('1.0.0', '1.0.0')).toBe(false); + expect(client.updater.compareVersions('1.0.0', '1.0.1')).toBe(true); + expect(client.updater.compareVersions('1.0.1', '1.0.0')).toBe(false); + expect(client.updater.compareVersions('meow', '1.0.0')).toBe(false); + + client.destroy(); +}); + +test('Updater (getLatestVersion)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + vi.spyOn(global, 'fetch').mockResolvedValue({ + ...defaultRequestData, + json: () => Promise.resolve({ 'dist-tags': { latest: '1.0.0' } }) + } as any); + const data = await client.updater.getLatestVersion(); + expect(data).toBe('1.0.0'); + vi.restoreAllMocks(); + client.destroy(); +}); + +test('Updater (getLatestVersion error)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + vi.spyOn(global, 'fetch').mockResolvedValue({ + ...defaultRequestData, + status: 404, + json: () => Promise.resolve({ 'dist-tags': { latest: '1.0.0' } }) + } as any); + expect(() => client.updater.getLatestVersion()).rejects.toThrowError(client.errors.UPDATER_REQUEST_NOT_OK); + vi.restoreAllMocks(); + client.destroy(); +}); + +test('Updater (check version)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const consoleLogSpy = vi.spyOn(console, 'log'); + client.updater.currentVersion = '1.0.0'; + vi.spyOn(global, 'fetch').mockResolvedValue({ + ...defaultRequestData, + json: () => Promise.resolve({ 'dist-tags': { latest: version } }) + } as any); + await client.updater.checkForUpdates(); + expect(consoleLogSpy).toHaveBeenCalledWith( + `New version of hypixel-api-reborn is available! Current version: 1.0.0, Latest version: ${version}` + ); + vi.restoreAllMocks(); + client.destroy(); +}); diff --git a/src/Private/Updater.ts b/src/Private/Updater.ts new file mode 100644 index 000000000..de820e9f9 --- /dev/null +++ b/src/Private/Updater.ts @@ -0,0 +1,47 @@ +/* eslint-disable no-console */ +import Client from '../Client.js'; +import packageJson from '../../package.json' with { type: 'json' }; + +class Updater { + readonly client: Client; + currentVersion: string; + latestVersion: string; + constructor(client: Client) { + this.client = client; + this.currentVersion = packageJson.version; + this.latestVersion = '0.0.0'; + } + + async checkForUpdates(): Promise { + this.latestVersion = await this.getLatestVersion(); + const compare = this.compareVersions(this.currentVersion, this.latestVersion); + if (compare) { + console.log( + `New version of hypixel-api-reborn is available! Current version: ${ + this.currentVersion + }, Latest version: ${this.latestVersion}` + ); + } + } + + async getLatestVersion(): Promise { + const request = await this.client.requestHandler.fetchExternalData('https://registry.npmjs.org/hypixel-api-reborn'); + if (200 !== request.statusCode) throw new Error(this.client.errors.UPDATER_REQUEST_NOT_OK); + return request.data['dist-tags'].latest; + } + + compareVersions(a: string, b: string): boolean { + const pa = a.split('.'); + const pb = b.split('.'); + for (let i = 0; 3 > i; i++) { + const na = Number(pa[i]); + const nb = Number(pb[i]); + if (isNaN(na) || isNaN(nb)) return false; + if (na > nb) return false; + if (nb > na) return true; + } + return false; + } +} + +export default Updater; diff --git a/src/Private/defaultCache.js b/src/Private/defaultCache.js deleted file mode 100644 index 6fc8606ba..000000000 --- a/src/Private/defaultCache.js +++ /dev/null @@ -1,77 +0,0 @@ -/** - * This is the default cache implementation, using a Map. - * All cache implementations must have these methods below, they can be async : - * set(key, value) : Sets key to value - * has(key) : Whether there is an entry to this key. (can be an alias to get) - * get(key) : Gets by key (nullish value if not found) - * delete(key) : Deletes by key - * keys() : Array of keys, ordered by time of creation. To help you, the key will be deleted and set in case of an update - * size(): Size of cache (number of keys) - * clear(): Deletes all cache entries - * See JSDoc for more info - */ -class Cache { - /** - * Constructor - */ - constructor() { - this.storage = new Map(); - } - /** - * Sets an entry - * @param {string} key String key - * @param {*} value Any value - * @return {boolean} - */ - set(key, value) { - return this.storage.set(key, value); - } - /** - * Check if there's an entry in the cache that has this key - * This doesn't have to return boolean, just a truthy/falsy value - * @param {string} key String key - * @return {boolean} Whether this key exists - */ - has(key) { - return this.storage.has(key); - } - /** - * Gets an entry, return a nullish value if not found - * @param {string} key String key - * @return {*} - */ - get(key) { - return this.storage.get(key); - } - /** - * Deletes an entry - * @param {string} key String key - * @return {boolean} Preferably, returns a boolean to check if the deletion is actually successful - */ - delete(key) { - return this.storage.delete(key); - } - /** - * Returns Array of string (not an iterator preferably, it can break) - * @return {string[]} - */ - keys() { - return Array.from(this.storage.keys()); - } - /** - * Returns size of cache - * @return {number} - */ - size() { - return this.storage.size; - } - /** - * Clears cache - * @return {void} - */ - clear() { - this.storage.clear(); - } -} - -module.exports = Cache; diff --git a/src/Private/rateLimit.js b/src/Private/rateLimit.js deleted file mode 100644 index 3f32fb87c..000000000 --- a/src/Private/rateLimit.js +++ /dev/null @@ -1,83 +0,0 @@ -const Errors = require('../Errors'); - -class RateLimit { - constructor() { - this.initialized = 0; - } - - async rateLimitManager() { - if (!this.initialized) return; - this.requests++; - this.requestQueue.unshift(Date.now()); - if ('NONE' === this.options.rateLimit || !this.requestQueue.length) return; - if ('AUTO' === this.options.rateLimit && this.requests <= this.options.keyLimit / 2) return; - const cooldown = this.computeCooldownTime(); - this.requestQueue[0] = Date.now() + cooldown; - return await new Promise((r) => setTimeout(r, cooldown), true); - } - - sync(data) { - this.options.keyLimit = parseInt(data.get('ratelimit-limit'), 10) || this.options.keyLimit; - this.requests = parseInt(data.get('ratelimit-remaining'), 10) || this.requests; - if ( - data.get('ratelimit-reset') && - Math.round(Date.now() / 1000) - (300 - parseInt(data.get('ratelimit-reset'), 10)) !== - Math.round(this.lastResetHappenedAt / 1000) - ) { - clearTimeout(this.resetTimer); - this.resetTimer = setTimeout(this.reset.bind(this), parseInt(data.get('ratelimit-reset'), 10) * 1000); - } - } - - computeCooldownTime() { - const overhead = this.requestQueue[1] <= Date.now() ? 0 : this.requestQueue[1] - Date.now(); - const multiplier = Math.floor(this.requests / this.options.keyLimit) + 1; - return ( - overhead + - (-overhead - Date.now() + 300000 * multiplier + this.lastResetHappenedAt) / - (this.options.keyLimit * multiplier - this.requests) - ); - } - - reset() { - this.requests = this.requests - this.options.keyLimit; - if (0 > this.requests) this.requests = 0; - this.lastResetHappenedAt = Date.now(); - this.resetTimer = setTimeout(this.reset.bind(this), 300000); - this.requestQueue = this.requestQueue.filter((x) => x >= Date.now()); - } - - rateLimitMonitor() { - this.resetTimer = setTimeout(this.reset.bind(this), 1000 * 300); - } - - init(keyInfo, options, client) { - this.options = options; - this.requests = 0; - this.cooldownTime = 300000 / this.options.keyLimit; - this.requestQueue = []; - this.client = client; - return keyInfo - .then((info) => { - this.requests = info.requestsInPastMin; - this.lastResetHappenedAt = Date.now() - (300 - info.resetsAfter) * 1000; - this.resetTimer = setTimeout(this.rateLimitMonitor.bind(this), 1000 * info.resetsAfter); - this.initialized = 1; - }) - .catch(() => { - client.emit('warn', Errors.RATE_LIMIT_INIT_ERROR); - this.requests = 0; - this.lastResetHappenedAt = Date.now(); - this.rateLimitMonitor(); - this.initialized = 1; - }); - // Still make the requests per min possible - } -} -module.exports = RateLimit; -/** - * @typedef {Object} RLOptions - * @property {number} keyLimit Max request of key per min - * @property {'NONE'|'AUTO'|'HARD'} rateLimit rate limit mode - * @property {boolean} syncWithHeaders Sync rate limits with headers - */ diff --git a/src/Private/requests.js b/src/Private/requests.js deleted file mode 100644 index 147fa1580..000000000 --- a/src/Private/requests.js +++ /dev/null @@ -1,82 +0,0 @@ -const requireFetch = !globalThis.fetch; -const externalFetch = (...args) => import('node-fetch').then(({ default: fetch }) => fetch(...args)); -const fetch = requireFetch ? externalFetch : globalThis.fetch; -const BASE_URL = 'https://api.hypixel.net/v2'; -const Cache = require('./defaultCache'); -const Errors = require('../Errors'); - -class Requests { - constructor(client, cache) { - if (cache && !this.validateCustomCache()) throw new Error(Errors.INVALID_CACHE_HANDLER); - this.cached = cache || new Cache(); - this.client = client; - } - async request(endpoint, options = {}) { - options.headers = { 'API-Key': this.client.key, ...options.headers }; - /** - * @type {externalFetch.Response|Response} - */ - const res = await fetch(BASE_URL + endpoint, options); - if (500 <= res.status && 528 > res.status) { - throw new Error( - Errors.ERROR_STATUSTEXT.replace(/{statustext}/, `Server Error : ${res.status} ${res.statusText}`) - ); - } - const parsedRes = await res.json().catch(() => { - throw new Error(Errors.INVALID_RESPONSE_BODY); - }); - if (400 === res.status) { - throw new Error( - Errors.ERROR_CODE_CAUSE.replace(/{code}/, '400 Bad Request').replace(/{cause}/, parsedRes.cause || '') - ); - } - if (403 === res.status) throw new Error(Errors.INVALID_API_KEY); - if (422 === res.status) throw new Error(Errors.UNEXPECTED_ERROR); - if ( - 429 === res.status && - 'You have already looked up this player too recently, please try again shortly' === parsedRes.cause - ) { - throw new Error(Errors.RECENT_REQUEST); - } - if (429 === res.status) throw new Error(Errors.RATE_LIMIT_EXCEEDED); - if (200 !== res.status) throw new Error(Errors.ERROR_STATUSTEXT.replace(/{statustext}/, res.statusText)); - if (!parsedRes.success && !endpoint.startsWith('/housing')) { - throw new Error(Errors.SOMETHING_WENT_WRONG.replace(/{cause}/, res.cause)); - } - // eslint-disable-next-line no-underscore-dangle - parsedRes._headers = res.headers; - parsedRes.raw = Boolean(options.raw); - if (options.noCaching) return parsedRes; - // split by question mark : first part is /path, remove / - if (this.client.options.cache && this.client.options.cacheFilter(endpoint.split('?')[0].slice(1))) { - if (this.client.options.cacheSize < (await this.cached.size())) { - await this.cached.delete(Array.from(await this.cached.keys())[0]); - } - await this.cached.delete(endpoint); - await this.cached.set(endpoint, parsedRes); - if (0 <= this.client.options.hypixelCacheTime) { - setTimeout(() => this.cached.delete(endpoint), 1000 * this.client.options.hypixelCacheTime); - } - } - return parsedRes; - } - - get cache() { - return this.cached; - } - - async sweepCache(amount) { - if (!amount || amount >= (await this.cached.size())) return await this.cached.clear(); - return await Promise.all( - Array.from(await this.cached.keys()) - .slice((await this.cached.size()) - amount) - .map((x) => this.cached.delete(x)) - ); - } - - validateCustomCache(cache) { - return Boolean(cache.set && cache.get && cache.delete && cache.keys); - } -} - -module.exports = Requests; diff --git a/src/Private/updater.js b/src/Private/updater.js deleted file mode 100644 index ff5768bd7..000000000 --- a/src/Private/updater.js +++ /dev/null @@ -1,34 +0,0 @@ -/* eslint-disable no-console */ -const requireFetch = !globalThis.fetch; -const externalFetch = (...args) => import('node-fetch').then(({ default: fetch }) => fetch(...args)); -const fetch = requireFetch ? externalFetch : globalThis.fetch; -const Errors = require('../Errors'); -class Updater { - async checkForUpdates() { - const version = require('../../package.json').version; - const request = await fetch('https://registry.npmjs.org/hypixel-api-reborn'); - if (!request.ok) return console.log(Errors.UPDATER_REQUEST_NOT_OK); - const metadata = await request.json(); - const latest = metadata['dist-tags'].latest; - const compare = this.compare(version, latest); - if (-1 === compare) { - console.log( - `New version of hypixel-api-reborn is available! Current version: ${version}, Latest version: ${latest}` - ); - } - } - compare(a, b) { - const pa = a.split('.'); - const pb = b.split('.'); - for (let i = 0; 3 > i; i++) { - const na = Number(pa[i]); - const nb = Number(pb[i]); - if (na > nb) return 1; - if (nb > na) return -1; - if (!isNaN(na) && isNaN(nb)) return 1; - if (isNaN(na) && !isNaN(nb)) return -1; - } - return 0; - } -} -module.exports = Updater; diff --git a/src/Private/uuidCache.js b/src/Private/uuidCache.js deleted file mode 100644 index 2a59bae9b..000000000 --- a/src/Private/uuidCache.js +++ /dev/null @@ -1,30 +0,0 @@ -const requireFetch = !globalThis.fetch; -const externalFetch = (...args) => import('node-fetch').then(({ default: fetch }) => fetch(...args)); -const fetch = requireFetch ? externalFetch : globalThis.fetch; -const NodeCache = require('node-cache'); -const cache = new NodeCache(); - -// TODO - use this for all cache models - -module.exports = async (url, query, cacheTime) => { - if (cache.has(query.toLowerCase())) return cache.get(query.toLowerCase()); - const res = await fetch(url); - const data = await res.json(); - // Don't cache 4xx - if (400 <= res.status) { - return { - status: res.status, - id: null, - name: null - }; - } - - cache.set(query.toLowerCase(), { status: res.status, id: data.id, name: data.name }, cacheTime); - cache.set(data.id.toLowerCase(), { status: res.status, id: data.id, name: data.name }, cacheTime); - - return { - status: res.status, - id: data.id, - name: data.name - }; -}; diff --git a/src/Private/validate.js b/src/Private/validate.js deleted file mode 100644 index 72b61b42a..000000000 --- a/src/Private/validate.js +++ /dev/null @@ -1,108 +0,0 @@ -const Errors = require('../Errors'); -const { isStrArray, strToArray } = require('../utils/arrayTools'); -/** - * Validation Class, used internally to validate provided arguments - */ -class Validation { - /** - * Check if cache options are valid - * @param {Object} options Global Cache Options to be validated - * @returns {void} Void - * @private - */ - validateOptions(options) { - if ('number' !== typeof options.hypixelCacheTime) throw new Error(Errors.CACHE_TIME_MUST_BE_A_NUMBER); - if ('number' !== typeof options.mojangCacheTime) throw new Error(Errors.CACHE_TIME_MUST_BE_A_NUMBER); - if ('number' !== typeof options.cacheSize) throw new Error(Errors.CACHE_LIMIT_MUST_BE_A_NUMBER); - if ('string' !== typeof options.rateLimit || !['AUTO', 'HARD', 'NONE'].includes(options.rateLimit)) { - throw new Error(Errors.INVALID_RATE_LIMIT_OPTION); - } - if ('number' !== typeof options.keyLimit) throw new Error(Errors.INVALID_KEY_LIMIT_OPTION); - if ('boolean' !== typeof options.syncWithHeaders) throw new Error(Errors.INVALID_HEADER_SYNC_OPTION); - if ('object' !== typeof options.headers) throw new Error(Errors.INVALID_HEADERS); - if ('boolean' !== typeof options.silent) throw new Error(Errors.INVALID_SILENT_OPTION); - if ('boolean' !== typeof options.checkForUpdates) throw new Error(Errors.INVALID_UPDATE_OPTION); - if (!['boolean', 'string'].includes(typeof options.useThirdPartyAPI)) { - throw new Error(Errors.INVALID_THIRD_PARTY_API_OPTION); - } - } - - /** - * Parses cache options - * @param {Object} options Options to be parsed - * @returns {Object} Parsed cache options - * @private - */ - parseOptions(options) { - if ('object' !== typeof options || null === options) throw new Error(Errors.OPTIONS_MUST_BE_AN_OBJECT); - return { - cache: options.cache ?? true, - hypixelCacheTime: options.hypixelCacheTime ?? 60, - mojangCacheTime: options.mojangCacheTime ?? 600, - cacheSize: (-1 === options.cacheSize ? Infinity : options.cacheSize) || Infinity, - cacheFilter: - // eslint-disable-next-line no-underscore-dangle - 'function' === typeof options.cacheFilter ? options.cacheFilter : this._handleFilter(options.cacheFilter), - rateLimit: options.rateLimit ?? 'AUTO', - keyLimit: options.keyLimit ?? 60, - syncWithHeaders: Boolean(options.syncWithHeaders), - headers: options.headers ?? {}, - silent: Boolean(options.silent), - checkForUpdates: options.checkForUpdates ?? true, - useThirdPartyAPI: options.useThirdPartyAPI ?? false - }; - } - - /** - * Checks if Key is provided in a correct format - * @param {string} key API Key - * @returns {string} Key - * @private - */ - validateKey(key) { - if (!key) throw new Error(Errors.NO_API_KEY); - if ('string' !== typeof key) throw new Error(Errors.KEY_MUST_BE_A_STRING); - return key; - } - - /** - * Check if suboptions are valid - * @param {Object} input Cache options - * @returns {boolean} Whether options are valid - * @private - */ - cacheSuboptions(input) { - if ('object' !== typeof input || null === input) return false; - if (!input.noCacheCheck && !input.noCaching && !input.raw) return false; - return true; - } - - /** - * Handles & parses the filter - * @param {*} filter FilterResolvable to be parsed - * @returns {Function} Filter function - * @private - */ - _handleFilter(filter) { - if (!filter) return () => true; - if ('object' === typeof filter && !Array.isArray(filter)) { - if (filter.whitelist && isStrArray(filter.whitelist)) return (x) => strToArray(filter.whitelist).includes(x); - if (filter.blacklist && isStrArray(filter.blacklist)) return (x) => !strToArray(filter.blacklist).includes(x); - throw new Error(Errors.CACHE_FILTER_INVALID); - } - if (!isStrArray(filter)) throw new Error(Errors.CACHE_FILTER_INVALID); - // blacklist by default - return (x) => !strToArray(filter).includes(x); - } - /** - * Checks user's node version - * -12 will return an error; -14 will result in a warning - * @returns {void} - * @private - */ - validateNodeVersion() { - const nodeVersion = parseInt(process.version.match(/v(\d{2})\.\d{1,}\.\d+/)[1], 10); - if (12 > nodeVersion) throw new Error(Errors.NODE_VERSION_ERR); - } -} -module.exports = Validation; diff --git a/src/Structures/Boosters/Booster.test.ts b/src/Structures/Boosters/Booster.test.ts new file mode 100644 index 000000000..ee2c766dd --- /dev/null +++ b/src/Structures/Boosters/Booster.test.ts @@ -0,0 +1,8 @@ +import { expect, test } from 'vitest'; +import { parseType } from './Booster.js'; + +test('Booster (parseType)', () => { + expect(parseType({ stacked: true })).toBe('STACKED'); + expect(parseType({ stacked: false })).toBe('QUEUED'); + expect(parseType({ stacked: 'meow' })).toBe('ACTIVE'); +}); diff --git a/src/Structures/Boosters/Booster.ts b/src/Structures/Boosters/Booster.ts new file mode 100644 index 000000000..8e694ca8a --- /dev/null +++ b/src/Structures/Boosters/Booster.ts @@ -0,0 +1,41 @@ +import Game from '../Game.js'; +import type { BoosterType } from '../../Types/Booster.js'; + +export function parseType(data: Record): BoosterType { + if (true === data.stacked) return 'STACKED'; + if (!data.stacked) return 'QUEUED'; + return 'ACTIVE'; +} + +class Booster { + purchaser: string; + amount: number; + originalLength: number; + remaining: number; + activatedTimestamp: number; + activated: Date; + game: Game; + isActive: boolean; + type: BoosterType; + stackers: string[]; + expired: boolean; + constructor(data: Record) { + this.purchaser = data.purchaserUuid; + this.amount = data.amount; + this.originalLength = data.originalLength; + this.remaining = data.length; + this.activatedTimestamp = data.dateActivated; + this.activated = new Date(data.dateActivated); + this.game = new Game(data.gameType); + this.isActive = Array.isArray(data.stacked); + this.type = parseType(data); + this.stackers = Array.isArray(data.stacked) ? Array.from(data.stacked) : []; + this.expired = 0 > data.length; + } + + toString(): string { + return `${this.purchaser}'s booster in ${this.game}`; + } +} + +export default Booster; diff --git a/src/Structures/Color.test.ts b/src/Structures/Color.test.ts new file mode 100644 index 000000000..c06a48730 --- /dev/null +++ b/src/Structures/Color.test.ts @@ -0,0 +1,25 @@ +import Color from './Color.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { ColorCode, ColorHex, ColorString, InGameCode } from '../Types/Color.js'; + +test('Color', () => { + const data = new Color('BLACK'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Color); + expectTypeOf(data).toEqualTypeOf(); + expect(data.color).toBeDefined(); + expectTypeOf(data.color).toEqualTypeOf(); + expect(data.color).toBe('BLACK'); + expect(data.toString()).toBeDefined(); + expectTypeOf(data.toString()).toEqualTypeOf(); + expect(data.toString()).toBe('Black'); + expect(data.toHex()).toBeDefined(); + expectTypeOf(data.toHex()).toEqualTypeOf(); + expect(data.toHex()).toBe('#000000'); + expect(data.toCode()).toBeDefined(); + expectTypeOf(data.toCode()).toEqualTypeOf(); + expect(data.toCode()).toBe('BLACK'); + expect(data.toInGameCode()).toBeDefined(); + expectTypeOf(data.toInGameCode()).toEqualTypeOf(); + expect(data.toInGameCode()).toBe('§0'); +}); diff --git a/src/Structures/Color.ts b/src/Structures/Color.ts new file mode 100644 index 000000000..b54b79cfc --- /dev/null +++ b/src/Structures/Color.ts @@ -0,0 +1,83 @@ +import type { ColorCode, ColorHex, ColorString, InGameCode } from '../Types/Color.js'; + +const ColorStrings: { [key: string]: ColorString } = { + BLACK: 'Black', + DARK_BLUE: 'Dark Blue', + DARK_GREEN: 'Dark Green', + DARK_AQUA: 'Dark Aqua', + DARK_RED: 'Dark Red', + DARK_PURPLE: 'Dark Purple', + GOLD: 'Gold', + GRAY: 'Gray', + DARK_GRAY: 'Dark Gray', + BLUE: 'Blue', + GREEN: 'Green', + AQUA: 'Aqua', + RED: 'Red', + LIGHT_PURPLE: 'Light Purple', + YELLOW: 'Yellow', + WHITE: 'White' +}; + +const ColorHexs: { [key: string]: ColorHex } = { + BLACK: '#000000', + DARK_BLUE: '#0000AA', + DARK_GREEN: '#008000', + DARK_AQUA: '#00AAAA', + DARK_RED: '#AA0000', + DARK_PURPLE: '#AA00AA', + GOLD: '#FFAA00', + GRAY: '#AAAAAA', + DARK_GRAY: '#555555', + BLUE: '#5555FF', + GREEN: '#3CE63C', + AQUA: '#3CE6E6', + RED: '#FF5555', + LIGHT_PURPLE: '#FF55FF', + YELLOW: '#FFFF55', + WHITE: '#FFFFFF' +}; + +const InGameCodes: { [key: string]: InGameCode } = { + BLACK: '§0', + DARK_BLUE: '§1', + DARK_GREEN: '§2', + DARK_AQUA: '§3', + DARK_RED: '§4', + DARK_PURPLE: '§5', + GOLD: '§6', + GRAY: '§7', + DARK_GRAY: '§8', + BLUE: '§9', + GREEN: '§a', + AQUA: '§b', + RED: '§c', + LIGHT_PURPLE: '§d', + YELLOW: '§e', + WHITE: '§f' +}; + +class Color { + color: ColorCode; + constructor(color: ColorCode) { + this.color = color; + } + + toString(): ColorString { + return ColorStrings[this.color] as ColorString; + } + + toHex(): ColorHex { + return ColorHexs[this.color] as ColorHex; + } + + toCode(): ColorCode { + return this.color; + } + + toInGameCode(): InGameCode { + return InGameCodes[this.color] as InGameCode; + } +} + +export default Color; diff --git a/src/Structures/Game.ts b/src/Structures/Game.ts new file mode 100644 index 000000000..ca4442717 --- /dev/null +++ b/src/Structures/Game.ts @@ -0,0 +1,42 @@ +import { GameCode, GameID, GameString } from '../Types/Game.js'; +import { games } from '../Utils/Constants.js'; + +class Game { + game: GameID | GameCode; + id: GameID | null; + code: GameCode | null; + name: GameString | null; + found: boolean; + constructor(game: GameID | GameCode) { + this.game = game; + const result = + games.find( + (Game) => + Game.code.toLowerCase() === this.game || + Game.id.toString() === this.game || + Game.name.toLowerCase() === this.game + ) || null; + this.id = result?.id || null; + this.code = result?.code || null; + this.name = result?.name || null; + this.found = null !== result; + } + + toString(): GameString | null { + return this.name; + } + + static get IDS(): GameID[] { + return games.map((x) => x.id as GameID); + } + + static get CODES(): GameCode[] { + return games.map((x) => x.code) as GameCode[]; + } + + static get NAMES(): GameString[] { + return games.map((x) => x.name) as GameString[]; + } +} + +export default Game; diff --git a/src/Structures/GameCounts.ts b/src/Structures/GameCounts.ts new file mode 100644 index 000000000..2e319fad8 --- /dev/null +++ b/src/Structures/GameCounts.ts @@ -0,0 +1,24 @@ +import { MiniGamesString } from '../Utils/Constants.js'; +import { RemoveSnakeCaseString, recursive } from '../Utils/RemoveSnakeCase.js'; + +class GameCounts { + playerCount: number; + [x: string]: object | number; + constructor(data: Record) { + this.playerCount = data.playerCount; + for (const game in data.games) { + if (Object.prototype.hasOwnProperty.call(MiniGamesString, game)) { + const objectName = (MiniGamesString[game] || 'Unknown').toUpperCase().replace(/ +/g, '_'); + this[RemoveSnakeCaseString(objectName)] = recursive(data.games[game], true); + } else { + this[RemoveSnakeCaseString(game)] = recursive(data.games[game], true); + } + } + } + + toString(): number { + return this.playerCount; + } +} + +export default GameCounts; diff --git a/src/Structures/Guild/Guild.test.ts b/src/Structures/Guild/Guild.test.ts new file mode 100644 index 000000000..774e8e9d7 --- /dev/null +++ b/src/Structures/Guild/Guild.test.ts @@ -0,0 +1,61 @@ +import Color from '../Color.js'; +import Game from '../Game.js'; +import Guild from './Guild.js'; +import GuildMember from './GuildMember.js'; +import GuildRank from './GuildRank.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { ExpHistory } from '../../Types/Guild.js'; + +test('Guild', () => { + const data = new Guild({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Guild); + expectTypeOf(data).toEqualTypeOf(); + expect(data.id).toBeDefined(); + expectTypeOf(data.id).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.description).toBeDefined(); + expectTypeOf(data.description).toEqualTypeOf(); + expect(data.experience).toBeDefined(); + expectTypeOf(data.experience).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.members).toBeDefined(); + expectTypeOf(data.members).toEqualTypeOf(); + expect(data.me).toBeDefined(); + expectTypeOf(data.me).toEqualTypeOf(); + expect(data.ranks).toBeDefined(); + expectTypeOf(data.ranks).toEqualTypeOf(); + expect(data.totalWeeklyGexp).toBeDefined(); + expectTypeOf(data.totalWeeklyGexp).toEqualTypeOf(); + expect(data.createdAtTimestamp).toBeDefined(); + expectTypeOf(data.createdAtTimestamp).toEqualTypeOf(); + expect(data.createdAt).toBeDefined(); + expectTypeOf(data.createdAt).toEqualTypeOf(); + expect(data.joinable).toBeDefined(); + expectTypeOf(data.joinable).toEqualTypeOf(); + expect(data.publiclyListed).toBeDefined(); + expectTypeOf(data.publiclyListed).toEqualTypeOf(); + expect(data.chatMuteUntilTimestamp).toBeDefined(); + expectTypeOf(data.chatMuteUntilTimestamp).toEqualTypeOf(); + expect(data.chatMuteUntil).toBeDefined(); + expectTypeOf(data.chatMuteUntil).toEqualTypeOf(); + expect(data.banner).toBeDefined(); + expectTypeOf(data.banner).toEqualTypeOf<{ Pattern: string; Color: string }[]>(); + expect(data.tag).toBeDefined(); + expectTypeOf(data.tag).toEqualTypeOf(); + expect(data.tagColor).toBeDefined(); + expectTypeOf(data.tagColor).toEqualTypeOf(); + expect(data.expHistory).toBeDefined(); + expectTypeOf(data.expHistory).toEqualTypeOf(); + expect(data.achievements).toBeDefined(); + expectTypeOf(data.achievements).toEqualTypeOf<{ winners: number; experienceKings: number; onlinePlayers: number }>(); + expect(data.preferredGames).toBeDefined(); + expectTypeOf(data.preferredGames).toEqualTypeOf(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.name); + expectTypeOf(data.toString()).toEqualTypeOf(); + expect(data.guildMaster).toBeDefined(); + expectTypeOf(data.guildMaster()).toEqualTypeOf(); +}); diff --git a/src/Structures/Guild/Guild.ts b/src/Structures/Guild/Guild.ts new file mode 100644 index 000000000..3362954ff --- /dev/null +++ b/src/Structures/Guild/Guild.ts @@ -0,0 +1,68 @@ +import Color from '../Color.js'; +import Game from '../Game.js'; +import GuildMember from './GuildMember.js'; +import GuildRank from './GuildRank.js'; +import { calculateExpHistory, getGuildLevel, members, ranks, totalWeeklyGexp } from '../../Utils/Guild.js'; +import type { ExpHistory } from '../../Types/Guild.js'; + +class Guild { + id: string; + name: string; + description: string; + experience: number; + level: number; + members: GuildMember[]; + me: GuildMember | null; + ranks: GuildRank[]; + totalWeeklyGexp: number; + createdAtTimestamp: number | null; + createdAt: Date | null; + joinable: boolean; + publiclyListed: boolean; + chatMuteUntilTimestamp: number | null; + chatMuteUntil: Date | null; + banner: { Pattern: string; Color: string }[]; + tag: string; + tagColor: Color | null; + expHistory: ExpHistory[]; + achievements: { winners: number; experienceKings: number; onlinePlayers: number }; + preferredGames: Game[]; + constructor(data: Record, uuid?: string) { + // eslint-disable-next-line no-underscore-dangle + this.id = data._id || 'Unknown'; + this.name = data.name || 'Unknown'; + this.description = data.description ?? ''; + this.experience = data.exp || 0; + this.level = getGuildLevel(this.experience); + this.members = members(data?.members || []); + this.me = uuid ? (this.members.find((member) => member.uuid === uuid) as GuildMember) : null; + this.ranks = ranks(data); + this.totalWeeklyGexp = totalWeeklyGexp(this.members); + this.createdAtTimestamp = data.created || null; + this.createdAt = this.createdAtTimestamp ? new Date(this.createdAtTimestamp) : null; + this.joinable = data.joinable ?? false; + this.publiclyListed = Boolean(data.publiclyListed); + this.chatMuteUntilTimestamp = data.chatMute ?? null; + this.chatMuteUntil = this.chatMuteUntilTimestamp ? new Date(this.chatMuteUntilTimestamp) : null; + this.banner = data.banner ?? null; + this.tag = data.tag ?? null; + this.tagColor = data.tagColor ? new Color(data.tagColor) : null; + this.expHistory = calculateExpHistory(this.members); + this.achievements = { + winners: data?.achievements?.WINNERS || 0, + experienceKings: data?.achievements?.EXPERIENCE_KINGS || 0, + onlinePlayers: data?.achievements?.ONLINE_PLAYERS || 0 + }; + this.preferredGames = data.preferredGames ? data.preferredGames.map((g: any) => new Game(g)) : []; + } + + toString(): string { + return this.name; + } + + guildMaster(): GuildMember | undefined { + return this.members.find((member) => 'Guild Master' === member.rank); + } +} + +export default Guild; diff --git a/src/Structures/Guild/GuildMember.test.ts b/src/Structures/Guild/GuildMember.test.ts new file mode 100644 index 000000000..01fb1c22e --- /dev/null +++ b/src/Structures/Guild/GuildMember.test.ts @@ -0,0 +1,31 @@ +import GuildMember from './GuildMember.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { ExpHistory } from '../../Types/Guild.js'; + +test('Guild Member', () => { + const data = new GuildMember({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GuildMember); + expectTypeOf(data).toEqualTypeOf(); + expect(data.uuid).toBeDefined(); + expectTypeOf(data.uuid).toEqualTypeOf(); + expect(data.joinedAtTimestamp).toBeDefined(); + expectTypeOf(data.joinedAtTimestamp).toEqualTypeOf(); + expect(data.joinedAt).toBeDefined(); + expectTypeOf(data.joinedAt).toEqualTypeOf(); + expect(data.questParticipation).toBeDefined(); + expectTypeOf(data.questParticipation).toEqualTypeOf(); + expect(data.rank).toBeDefined(); + expectTypeOf(data.rank).toEqualTypeOf(); + expect(data.mutedUntilTimestamp).toBeDefined(); + expectTypeOf(data.mutedUntilTimestamp).toEqualTypeOf(); + expect(data.mutedUntil).toBeDefined(); + expectTypeOf(data.mutedUntil).toEqualTypeOf(); + expect(data.expHistory).toBeDefined(); + expectTypeOf(data.expHistory).toEqualTypeOf(); + expect(data.weeklyExperience).toBeDefined(); + expectTypeOf(data.weeklyExperience).toEqualTypeOf(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.uuid); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/Guild/GuildMember.ts b/src/Structures/Guild/GuildMember.ts new file mode 100644 index 000000000..565b69cff --- /dev/null +++ b/src/Structures/Guild/GuildMember.ts @@ -0,0 +1,34 @@ +import { parseHistory } from '../../Utils/Guild.js'; +import type { ExpHistory } from '../../Types/Guild.js'; + +class GuildMember { + uuid: string; + joinedAtTimestamp: number | null; + joinedAt: Date | null; + questParticipation: number; + rank: string; + mutedUntilTimestamp: number | null; + mutedUntil: Date | null; + expHistory: ExpHistory[]; + weeklyExperience: number; + constructor(data: Record) { + this.uuid = data.uuid || ''; + this.joinedAtTimestamp = data?.joined || null; + this.joinedAt = this.joinedAtTimestamp ? new Date(this.joinedAtTimestamp) : null; + this.questParticipation = data?.questParticipation || 0; + this.rank = data?.rank || 'Member'; + this.mutedUntilTimestamp = data?.mutedTill || null; + this.mutedUntil = this.mutedUntilTimestamp ? new Date(this.mutedUntilTimestamp) : null; + const xpCheck = data.expHistory && 'number' === typeof Object.values(data.expHistory)[0]; + this.expHistory = parseHistory(data?.expHistory || {}); + this.weeklyExperience = xpCheck + ? Number(Object.values(data.expHistory).reduce((pV: any, cV: any) => pV + cV, 0)) + : 0; + } + + toString(): string { + return this.uuid; + } +} + +export default GuildMember; diff --git a/src/Structures/Guild/GuildRank.test.ts b/src/Structures/Guild/GuildRank.test.ts new file mode 100644 index 000000000..20519c492 --- /dev/null +++ b/src/Structures/Guild/GuildRank.test.ts @@ -0,0 +1,24 @@ +import GuildRank from './GuildRank.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Guild Rank', () => { + const data = new GuildRank({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GuildRank); + expectTypeOf(data).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.default).toBeDefined(); + expectTypeOf(data.default).toEqualTypeOf(); + expect(data.tag).toBeDefined(); + expectTypeOf(data.tag).toEqualTypeOf(); + expect(data.createdAtTimestamp).toBeDefined(); + expectTypeOf(data.createdAtTimestamp).toEqualTypeOf(); + expect(data.createdAt).toBeDefined(); + expectTypeOf(data.createdAt).toEqualTypeOf(); + expect(data.priority).toBeDefined(); + expectTypeOf(data.priority).toEqualTypeOf(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.name); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/Guild/GuildRank.ts b/src/Structures/Guild/GuildRank.ts new file mode 100644 index 000000000..b6ddd5bd1 --- /dev/null +++ b/src/Structures/Guild/GuildRank.ts @@ -0,0 +1,22 @@ +class GuildRank { + name: string; + default: boolean; + tag: string | null; + createdAtTimestamp: number | null; + createdAt: Date | null; + priority: number; + constructor(data: Record) { + this.name = data.name || ''; + this.default = data.default || false; + this.tag = data.tag || null; + this.createdAtTimestamp = data.created || data.createdAtTimestamp || null; + this.createdAt = this.createdAtTimestamp ? new Date(this.createdAtTimestamp) : null; + this.priority = data?.priority || 0; + } + + toString() { + return this.name; + } +} + +export default GuildRank; diff --git a/src/Structures/House.test.ts b/src/Structures/House.test.ts new file mode 100644 index 000000000..9c767a4b3 --- /dev/null +++ b/src/Structures/House.test.ts @@ -0,0 +1,25 @@ +import House from './House.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('House', () => { + const data = new House({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(House); + expectTypeOf(data).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.uuid).toBeDefined(); + expectTypeOf(data.uuid).toEqualTypeOf(); + expect(data.owner).toBeDefined(); + expectTypeOf(data.owner).toEqualTypeOf(); + expect(data.createdAtTimestamp).toBeDefined(); + expectTypeOf(data.createdAtTimestamp).toEqualTypeOf(); + expect(data.createdAt).toBeDefined(); + expectTypeOf(data.createdAt).toEqualTypeOf(); + expect(data.players).toBeDefined(); + expect(data.players).toBeGreaterThanOrEqual(0); + expectTypeOf(data.players).toEqualTypeOf(); + expect(data.cookies).toBeDefined(); + expect(data.cookies).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cookies).toEqualTypeOf(); +}); diff --git a/src/Structures/House.ts b/src/Structures/House.ts new file mode 100644 index 000000000..e3b6652c4 --- /dev/null +++ b/src/Structures/House.ts @@ -0,0 +1,24 @@ +class House { + name: string; + uuid: string; + owner: string; + createdAtTimestamp: number | null; + createdAt: Date | null; + players: number; + cookies: number; + constructor(data: Record) { + this.name = data.name || ''; + this.uuid = data.uuid || ''; + this.owner = data.owner || ''; + this.createdAtTimestamp = data.createdAt || null; + this.createdAt = this.createdAtTimestamp ? new Date(this.createdAtTimestamp) : null; + this.players = data.players || 0; + this.cookies = data.cookies?.current || 0; + } + + toString(): string { + return this.name; + } +} + +export default House; diff --git a/src/Structures/Housing.ts b/src/Structures/Housing.ts new file mode 100644 index 000000000..758dd8e8d --- /dev/null +++ b/src/Structures/Housing.ts @@ -0,0 +1,42 @@ +class HousingGivenCookies { + date: string; + houses: string[]; + constructor(date: string, houses: string[]) { + this.date = date; + this.houses = houses; + } +} + +class Housing { + allowedBlocks: string[]; + playerVisibility: number; + showBorder: boolean; + showTips: boolean; + tutorialStage: string; + packages: string[]; + firstHouseJoinTimestamp: number; + firstHouseJoinAt: Date; + plotSize: number; + givenCookies: HousingGivenCookies[]; + constructor(data: Record) { + this.allowedBlocks = data.allowedBlocks; + this.playerVisibility = data?.playerSettings?.VISIBILITY + ? Number(data?.playerSettings?.VISIBILITY.split('-')[1]) + : 4; + this.showBorder = data?.playerSettings?.BORDER ? Boolean(data?.playerSettings?.BORDER.split('-')[1]) : true; + this.showTips = data?.playerSettings?.TIPS ? Boolean(data?.playerSettings?.TIPS.split('-')[1]) : false; + this.tutorialStage = data.tutorialStep; + this.packages = data.packages; + this.firstHouseJoinTimestamp = data.firstHouseJoinMs; + this.firstHouseJoinAt = new Date(this.firstHouseJoinTimestamp); + this.plotSize = data.plotSize; + this.givenCookies = []; + Object.keys(data) + .filter((key) => key.startsWith('given_cookies_')) + .map((key) => { + this.givenCookies.push(new HousingGivenCookies(key, data[key])); + }); + } +} + +export default Housing; diff --git a/src/Structures/ItemBytes.ts b/src/Structures/ItemBytes.ts new file mode 100644 index 000000000..8076a3bad --- /dev/null +++ b/src/Structures/ItemBytes.ts @@ -0,0 +1,12 @@ +class ItemBytes { + bytesBuffer: Buffer; + constructor(data: Record) { + this.bytesBuffer = Buffer.from(JSON.stringify(data), 'base64'); + } + + base64(): string { + return this.bytesBuffer.toString('base64'); + } +} + +export default ItemBytes; diff --git a/src/Structures/Leaderboard.test.ts b/src/Structures/Leaderboard.test.ts new file mode 100644 index 000000000..30ba4312c --- /dev/null +++ b/src/Structures/Leaderboard.test.ts @@ -0,0 +1,27 @@ +import Leaderboard from './Leaderboard.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Leaderboard', () => { + const data = new Leaderboard({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Leaderboard); + expectTypeOf(data).toEqualTypeOf(); + expect(data.path).toBeDefined(); + expectTypeOf(data.path).toEqualTypeOf(); + expect(data.prefix).toBeDefined(); + expectTypeOf(data.prefix).toEqualTypeOf(); + expect(data.title).toBeDefined(); + expectTypeOf(data.title).toEqualTypeOf(); + expect(data.location).toBeDefined(); + expectTypeOf(data.location).toEqualTypeOf(); + expect(data.count).toBeDefined(); + expect(data.count).toBeGreaterThanOrEqual(0); + expectTypeOf(data.count).toEqualTypeOf(); + expect(data.leaders).toBeDefined(); + expectTypeOf(data.leaders).toEqualTypeOf(); + + data.leaders.forEach((leader: string) => { + expect(leader).toBeDefined(); + expectTypeOf(leader).toEqualTypeOf(); + }); +}); diff --git a/src/Structures/Leaderboard.ts b/src/Structures/Leaderboard.ts new file mode 100644 index 000000000..5780035b6 --- /dev/null +++ b/src/Structures/Leaderboard.ts @@ -0,0 +1,18 @@ +class Leaderboard { + path: string; + prefix: string; + title: string; + location: string; + count: number; + leaders: string[]; + constructor(data: Record) { + this.path = data?.path || ''; + this.prefix = data?.prefix || ''; + this.title = data?.title || ''; + this.location = data?.location || '0,0,0'; + this.count = data?.count || 0; + this.leaders = data?.leaders || []; + } +} + +export default Leaderboard; diff --git a/src/Structures/MiniGames/Arcade/Arcade.test.ts b/src/Structures/MiniGames/Arcade/Arcade.test.ts new file mode 100644 index 000000000..a3c0036b1 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/Arcade.test.ts @@ -0,0 +1,70 @@ +import Arcade from './Arcade.js'; +import BlockingDead from './BlockingDead.js'; +import BountyHunters from './BountyHunters.js'; +import DragonWars from './DragonWars.js'; +import Dropper from './Dropper.js'; +import EnderSpleef from './EnderSpleef.js'; +import FarmHunt from './FarmHunt.js'; +import Football from './Football.js'; +import GalaxyWars from './GalaxyWars.js'; +import HideAndSeek from './HideAndSeek.js'; +import HoleInTheWall from './HoleInTheWall.js'; +import HypixelSays from './HypixelSays.js'; +import MiniWalls from './MiniWalls.js'; +import PartyGames from './PartyGames.js'; +import PixelParty from './PixelParty.js'; +import ThrowOut from './ThrowOut.js'; +import Zombies from './Zombies.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Arcade', () => { + const data = new Arcade({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Arcade); + expectTypeOf(data).toEqualTypeOf(); + expect(data.coins).toBeDefined(); + expect(data.coins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.coins).toEqualTypeOf(); + expect(data.weeklyCoins).toBeDefined(); + expect(data.weeklyCoins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.weeklyCoins).toEqualTypeOf(); + expect(data.monthlyCoins).toBeDefined(); + expect(data.monthlyCoins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.monthlyCoins).toEqualTypeOf(); + expect(data.hintsDisabled).toBeDefined(); + expectTypeOf(data.hintsDisabled).toEqualTypeOf(); + expect(data.flashDisabled).toBeDefined(); + expectTypeOf(data.flashDisabled).toEqualTypeOf(); + expect(data.blockingDead).toBeDefined(); + expectTypeOf(data.blockingDead).toEqualTypeOf(); + expect(data.bountyHunters).toBeDefined(); + expectTypeOf(data.bountyHunters).toEqualTypeOf(); + expect(data.dragonWars).toBeDefined(); + expectTypeOf(data.dragonWars).toEqualTypeOf(); + expect(data.dropper).toBeDefined(); + expectTypeOf(data.dropper).toEqualTypeOf(); + expect(data.enderSpleef).toBeDefined(); + expectTypeOf(data.enderSpleef).toEqualTypeOf(); + expect(data.farmHunt).toBeDefined(); + expectTypeOf(data.farmHunt).toEqualTypeOf(); + expect(data.football).toBeDefined(); + expectTypeOf(data.football).toEqualTypeOf(); + expect(data.galaxyWars).toBeDefined(); + expectTypeOf(data.galaxyWars).toEqualTypeOf(); + expect(data.hideAndSeek).toBeDefined(); + expectTypeOf(data.hideAndSeek).toEqualTypeOf(); + expect(data.holeInTheWall).toBeDefined(); + expectTypeOf(data.holeInTheWall).toEqualTypeOf(); + expect(data.hypixelSays).toBeDefined(); + expectTypeOf(data.hypixelSays).toEqualTypeOf(); + expect(data.miniWalls).toBeDefined(); + expectTypeOf(data.miniWalls).toEqualTypeOf(); + expect(data.partyGames).toBeDefined(); + expectTypeOf(data.partyGames).toEqualTypeOf(); + expect(data.pixelParty).toBeDefined(); + expectTypeOf(data.pixelParty).toEqualTypeOf(); + expect(data.throwOut).toBeDefined(); + expectTypeOf(data.throwOut).toEqualTypeOf(); + expect(data.zombies).toBeDefined(); + expectTypeOf(data.zombies).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/Arcade.ts b/src/Structures/MiniGames/Arcade/Arcade.ts new file mode 100644 index 000000000..d71d7021f --- /dev/null +++ b/src/Structures/MiniGames/Arcade/Arcade.ts @@ -0,0 +1,66 @@ +import BlockingDead from './BlockingDead.js'; +import BountyHunters from './BountyHunters.js'; +import DragonWars from './DragonWars.js'; +import Dropper from './Dropper.js'; +import EnderSpleef from './EnderSpleef.js'; +import FarmHunt from './FarmHunt.js'; +import Football from './Football.js'; +import GalaxyWars from './GalaxyWars.js'; +import HideAndSeek from './HideAndSeek.js'; +import HoleInTheWall from './HoleInTheWall.js'; +import HypixelSays from './HypixelSays.js'; +import MiniWalls from './MiniWalls.js'; +import PartyGames from './PartyGames.js'; +import PixelParty from './PixelParty.js'; +import ThrowOut from './ThrowOut.js'; +import Zombies from './Zombies.js'; +import { monthAB, weekAB } from '../../../Utils/Oscillation.js'; + +class Arcade { + coins: number; + weeklyCoins: number; + monthlyCoins: number; + hintsDisabled: boolean; + flashDisabled: boolean; + blockingDead: BlockingDead; + bountyHunters: BountyHunters; + dragonWars: DragonWars; + dropper: Dropper; + enderSpleef: EnderSpleef; + farmHunt: FarmHunt; + football: Football; + galaxyWars: GalaxyWars; + hideAndSeek: HideAndSeek; + holeInTheWall: HoleInTheWall; + hypixelSays: HypixelSays; + miniWalls: MiniWalls; + partyGames: PartyGames; + pixelParty: PixelParty; + throwOut: ThrowOut; + zombies: Zombies; + constructor(data: Record = {}) { + this.coins = data?.coins || data?.tokens || 0; + this.weeklyCoins = parseInt(data?.[`weekly_coins_${weekAB()}`] || 0, 10); + this.monthlyCoins = parseInt(data?.[`monthly_coins_${monthAB()}`] || 0, 10); + this.hintsDisabled = !data?.hints; + this.flashDisabled = !data?.flash; + this.blockingDead = new BlockingDead(data); + this.bountyHunters = new BountyHunters(data); + this.dragonWars = new DragonWars(data); + this.dropper = new Dropper(data?.dropper); + this.enderSpleef = new EnderSpleef(data); + this.farmHunt = new FarmHunt(data); + this.football = new Football(data); + this.galaxyWars = new GalaxyWars(data); + this.hideAndSeek = new HideAndSeek(data); + this.holeInTheWall = new HoleInTheWall(data); + this.hypixelSays = new HypixelSays(data); + this.miniWalls = new MiniWalls(data); + this.partyGames = new PartyGames(data); + this.pixelParty = new PixelParty(data); + this.throwOut = new ThrowOut(data); + this.zombies = new Zombies(data); + } +} + +export default Arcade; diff --git a/src/Structures/MiniGames/Arcade/BlockingDead.test.ts b/src/Structures/MiniGames/Arcade/BlockingDead.test.ts new file mode 100644 index 000000000..59ae2d1b0 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/BlockingDead.test.ts @@ -0,0 +1,18 @@ +import BlockingDead from './BlockingDead.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BlockingDead', () => { + const data = new BlockingDead({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BlockingDead); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.headshots).toBeDefined(); + expect(data.headshots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.headshots).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/BlockingDead.ts b/src/Structures/MiniGames/Arcade/BlockingDead.ts new file mode 100644 index 000000000..7419cae1e --- /dev/null +++ b/src/Structures/MiniGames/Arcade/BlockingDead.ts @@ -0,0 +1,12 @@ +class BlockingDead { + wins: number; + kills: number; + headshots: number; + constructor(data: Record) { + this.wins = data?.wins_dayone || 0; + this.kills = data?.kills_dayone || 0; + this.headshots = data?.headshots_dayone || 0; + } +} + +export default BlockingDead; diff --git a/src/Structures/MiniGames/Arcade/BountyHunters.test.ts b/src/Structures/MiniGames/Arcade/BountyHunters.test.ts new file mode 100644 index 000000000..aeac33ca2 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/BountyHunters.test.ts @@ -0,0 +1,30 @@ +import BountyHunters from './BountyHunters.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BountyHunters', () => { + const data = new BountyHunters({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BountyHunters); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.bountyKills).toBeDefined(); + expect(data.bountyKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bountyKills).toEqualTypeOf(); + expect(data.bowKills).toBeDefined(); + expect(data.bowKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowKills).toEqualTypeOf(); + expect(data.swordKills).toBeDefined(); + expect(data.swordKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.swordKills).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/BountyHunters.ts b/src/Structures/MiniGames/Arcade/BountyHunters.ts new file mode 100644 index 000000000..288642420 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/BountyHunters.ts @@ -0,0 +1,22 @@ +import Divide from '../../../Utils/Divide.js'; + +class BountyHunters { + wins: number; + kills: number; + deaths: number; + KDR: number; + bountyKills: number; + bowKills: number; + swordKills: number; + constructor(data: Record) { + this.wins = data?.wins_oneinthequiver || 0; + this.kills = data?.kills_oneinthequiver || 0; + this.deaths = data?.deaths_oneinthequiver || 0; + this.KDR = Divide(this.kills, this.deaths); + this.bountyKills = data?.bounty_kills_oneinthequiver || 0; + this.bowKills = data?.bow_kills_oneinthequiver || 0; + this.swordKills = data?.sword_kills_oneinthequiver || 0; + } +} + +export default BountyHunters; diff --git a/src/Structures/MiniGames/Arcade/DragonWars.test.ts b/src/Structures/MiniGames/Arcade/DragonWars.test.ts new file mode 100644 index 000000000..d648b9ed6 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/DragonWars.test.ts @@ -0,0 +1,15 @@ +import DragonWars from './DragonWars.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('DragonWars', () => { + const data = new DragonWars({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(DragonWars); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/DragonWars.ts b/src/Structures/MiniGames/Arcade/DragonWars.ts new file mode 100644 index 000000000..c150bfb1b --- /dev/null +++ b/src/Structures/MiniGames/Arcade/DragonWars.ts @@ -0,0 +1,10 @@ +class DragonWars { + wins: number; + kills: number; + constructor(data: Record) { + this.wins = data?.wins_dragonwars2 || 0; + this.kills = data?.kills_dragonwars2 || 0; + } +} + +export default DragonWars; diff --git a/src/Structures/MiniGames/Arcade/Dropper.test.ts b/src/Structures/MiniGames/Arcade/Dropper.test.ts new file mode 100644 index 000000000..0363b84de --- /dev/null +++ b/src/Structures/MiniGames/Arcade/Dropper.test.ts @@ -0,0 +1,33 @@ +import Dropper from './Dropper.js'; +import DropperMap from './DropperMap.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Dropper', () => { + const data = new Dropper({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Dropper); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.fails).toBeDefined(); + expect(data.fails).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fails).toEqualTypeOf(); + expect(data.fastestGame).toBeDefined(); + expect(data.fastestGame).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fastestGame).toEqualTypeOf(); + expect(data.flawlessGames).toBeDefined(); + expect(data.flawlessGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.flawlessGames).toEqualTypeOf(); + expect(data.gamesPlayed).toBeDefined(); + expect(data.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gamesPlayed).toEqualTypeOf(); + expect(data.mapsCompleted).toBeDefined(); + expect(data.mapsCompleted).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mapsCompleted).toEqualTypeOf(); + expect(data.gamesFinished).toBeDefined(); + expect(data.gamesFinished).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gamesFinished).toEqualTypeOf(); + expect(data.maps).toBeDefined(); + expectTypeOf(data.maps).toEqualTypeOf>(); +}); diff --git a/src/Structures/MiniGames/Arcade/Dropper.ts b/src/Structures/MiniGames/Arcade/Dropper.ts new file mode 100644 index 000000000..5ac8511ec --- /dev/null +++ b/src/Structures/MiniGames/Arcade/Dropper.ts @@ -0,0 +1,27 @@ +import DropperMap from './DropperMap.js'; + +class Dropper { + wins: number; + fails: number; + fastestGame: number; + flawlessGames: number; + gamesPlayed: number; + mapsCompleted: number; + gamesFinished: number; + maps: Record; + constructor(data: Record) { + this.wins = data?.wins ?? 0; + this.fails = data?.fails ?? 0; + this.fastestGame = data?.fastest_game ?? 0; + this.flawlessGames = data?.flawless_games ?? 0; + this.gamesPlayed = data?.games_played ?? 0; + this.mapsCompleted = data?.maps_completed ?? 0; + this.gamesFinished = data?.games_finished ?? 0; + this.maps = {}; + Object?.keys(data?.map_stats ?? {})?.forEach((map) => { + this.maps[map] = new DropperMap(data?.map_stats, map); + }); + } +} + +export default Dropper; diff --git a/src/Structures/MiniGames/Arcade/DropperMap.test.ts b/src/Structures/MiniGames/Arcade/DropperMap.test.ts new file mode 100644 index 000000000..3045b60f5 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/DropperMap.test.ts @@ -0,0 +1,15 @@ +import DropperMap from './DropperMap.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('DropperMap', () => { + const data = new DropperMap({ stats: 'meow' }, 'meow'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(DropperMap); + expectTypeOf(data).toEqualTypeOf(); + expect(data.bestTime).toBeDefined(); + expect(data.bestTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bestTime).toEqualTypeOf(); + expect(data.completions).toBeDefined(); + expect(data.completions).toBeGreaterThanOrEqual(0); + expectTypeOf(data.completions).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/DropperMap.ts b/src/Structures/MiniGames/Arcade/DropperMap.ts new file mode 100644 index 000000000..f503661dd --- /dev/null +++ b/src/Structures/MiniGames/Arcade/DropperMap.ts @@ -0,0 +1,10 @@ +class DropperMap { + bestTime: number; + completions: number; + constructor(data: Record, mapName: string) { + this.bestTime = data?.[mapName]?.best_time || 0; + this.completions = data?.[mapName]?.completions || 0; + } +} + +export default DropperMap; diff --git a/src/Structures/MiniGames/Arcade/EnderSpleef.test.ts b/src/Structures/MiniGames/Arcade/EnderSpleef.test.ts new file mode 100644 index 000000000..97f9002cf --- /dev/null +++ b/src/Structures/MiniGames/Arcade/EnderSpleef.test.ts @@ -0,0 +1,30 @@ +import EnderSpleef from './EnderSpleef.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { EnderSpleefTrails } from '../../../Types/Player.js'; + +test('EnderSpleef', () => { + const data = new EnderSpleef({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(EnderSpleef); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.trail).toBeDefined(); + expectTypeOf(data.trail).toEqualTypeOf(); + expect(data.blocksDestroyed).toBeDefined(); + expect(data.blocksDestroyed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksDestroyed).toEqualTypeOf(); + expect(data.bigShotActivations).toBeDefined(); + expect(data.bigShotActivations).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bigShotActivations).toEqualTypeOf(); + expect(data.tripleShotActivations).toBeDefined(); + expect(data.tripleShotActivations).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tripleShotActivations).toEqualTypeOf(); + expect(data.totalPowerUpActivations).toBeDefined(); + expect(data.totalPowerUpActivations).toBeGreaterThanOrEqual(0); + expectTypeOf(data.totalPowerUpActivations).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/EnderSpleef.ts b/src/Structures/MiniGames/Arcade/EnderSpleef.ts new file mode 100644 index 000000000..0289e3514 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/EnderSpleef.ts @@ -0,0 +1,22 @@ +import type { EnderSpleefTrails } from '../../../Types/Player.js'; + +class EnderSpleef { + wins: number; + kills: number; + trail: EnderSpleefTrails | 'None'; + blocksDestroyed: number; + bigShotActivations: number; + tripleShotActivations: number; + totalPowerUpActivations: number; + constructor(data: Record) { + this.wins = data?.wins_ender || 0; + this.kills = data?.kills_dragonwars2 || 0; + this.trail = data?.enderspleef_trail || 'None'; + this.blocksDestroyed = data?.blocks_destroyed_ender || 0; + this.bigShotActivations = data?.bigshot_powerup_activations_ender || 0; + this.tripleShotActivations = data?.tripleshot_powerup_activations_ender || 0; + this.totalPowerUpActivations = this.bigShotActivations + this.tripleShotActivations; + } +} + +export default EnderSpleef; diff --git a/src/Structures/MiniGames/Arcade/FarmHunt.test.ts b/src/Structures/MiniGames/Arcade/FarmHunt.test.ts new file mode 100644 index 000000000..95cdebba5 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/FarmHunt.test.ts @@ -0,0 +1,45 @@ +import FarmHunt from './FarmHunt.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('FarmHunt', () => { + const data = new FarmHunt({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(FarmHunt); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.winsAsAnimal).toBeDefined(); + expect(data.winsAsAnimal).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsAsAnimal).toEqualTypeOf(); + expect(data.winsAsHunter).toBeDefined(); + expect(data.winsAsHunter).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsAsHunter).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.killsAsAnimal).toBeDefined(); + expect(data.killsAsAnimal).toBeGreaterThanOrEqual(0); + expectTypeOf(data.killsAsAnimal).toEqualTypeOf(); + expect(data.killsAsHunter).toBeDefined(); + expect(data.killsAsHunter).toBeGreaterThanOrEqual(0); + expectTypeOf(data.killsAsHunter).toEqualTypeOf(); + expect(data.tauntsUsed).toBeDefined(); + expect(data.tauntsUsed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tauntsUsed).toEqualTypeOf(); + expect(data.riskyTauntsUsed).toBeDefined(); + expect(data.riskyTauntsUsed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.riskyTauntsUsed).toEqualTypeOf(); + expect(data.safeTauntsUsed).toBeDefined(); + expect(data.safeTauntsUsed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.safeTauntsUsed).toEqualTypeOf(); + expect(data.dangerousTauntsUsed).toBeDefined(); + expect(data.dangerousTauntsUsed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.dangerousTauntsUsed).toEqualTypeOf(); + expect(data.fireworkTauntsUsed).toBeDefined(); + expect(data.fireworkTauntsUsed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fireworkTauntsUsed).toEqualTypeOf(); + expect(data.poop).toBeDefined(); + expect(data.poop).toBeGreaterThanOrEqual(0); + expectTypeOf(data.poop).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/FarmHunt.ts b/src/Structures/MiniGames/Arcade/FarmHunt.ts new file mode 100644 index 000000000..e9add7162 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/FarmHunt.ts @@ -0,0 +1,30 @@ +class FarmHunt { + wins: number; + winsAsAnimal: number; + winsAsHunter: number; + kills: number; + killsAsAnimal: number; + killsAsHunter: number; + tauntsUsed: number; + riskyTauntsUsed: number; + safeTauntsUsed: number; + dangerousTauntsUsed: number; + fireworkTauntsUsed: number; + poop: number; + constructor(data: Record) { + this.wins = data?.wins_farm_hunt || 0; + this.winsAsAnimal = data?.animal_wins_farm_hunt || 0; + this.winsAsHunter = data?.hunter_wins_farm_hunt || 0; + this.kills = data?.kills_farm_hunt || 0; + this.killsAsAnimal = data?.animal_kills_farm_hunt || 0; + this.killsAsHunter = data?.hunter_kills_farm_hunt || 0; + this.tauntsUsed = data?.taunts_used_farm_hunt || 0; + this.riskyTauntsUsed = data?.risky_taunts_used_farm_hunt || 0; + this.safeTauntsUsed = data?.safe_taunts_used_farm_hunt || 0; + this.dangerousTauntsUsed = data?.dangerous_taunts_used_farm_hunt || 0; + this.fireworkTauntsUsed = data?.firework_taunts_used_farm_hunt || 0; + this.poop = (data?.poop_collected_farm_hunt || 0) + (data?.poop_collected || 0); + } +} + +export default FarmHunt; diff --git a/src/Structures/MiniGames/Arcade/Football.test.ts b/src/Structures/MiniGames/Arcade/Football.test.ts new file mode 100644 index 000000000..40bf88964 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/Football.test.ts @@ -0,0 +1,21 @@ +import Football from './Football.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Football', () => { + const data = new Football({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Football); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.goals).toBeDefined(); + expect(data.goals).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goals).toEqualTypeOf(); + expect(data.kicks).toBeDefined(); + expect(data.kicks).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kicks).toEqualTypeOf(); + expect(data.powerKicks).toBeDefined(); + expect(data.powerKicks).toBeGreaterThanOrEqual(0); + expectTypeOf(data.powerKicks).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/Football.ts b/src/Structures/MiniGames/Arcade/Football.ts new file mode 100644 index 000000000..17016019b --- /dev/null +++ b/src/Structures/MiniGames/Arcade/Football.ts @@ -0,0 +1,14 @@ +class Football { + wins: number; + goals: number; + kicks: number; + powerKicks: number; + constructor(data: Record) { + this.wins = data?.wins_soccer || 0; + this.goals = data?.goals_soccer || 0; + this.kicks = data?.kicks_soccer || 0; + this.powerKicks = data?.powerkicks_soccer || 0; + } +} + +export default Football; diff --git a/src/Structures/MiniGames/Arcade/GalaxyWars.test.ts b/src/Structures/MiniGames/Arcade/GalaxyWars.test.ts new file mode 100644 index 000000000..02e95ff43 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/GalaxyWars.test.ts @@ -0,0 +1,36 @@ +import GalaxyWars from './GalaxyWars.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GalaxyWars', () => { + const data = new GalaxyWars({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GalaxyWars); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.shotsFired).toBeDefined(); + expect(data.shotsFired).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shotsFired).toEqualTypeOf(); + expect(data.weeklyKills).toBeDefined(); + expect(data.weeklyKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.weeklyKills).toEqualTypeOf(); + expect(data.monthlyKills).toBeDefined(); + expect(data.monthlyKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.monthlyKills).toEqualTypeOf(); + expect(data.attackerKills).toBeDefined(); + expect(data.attackerKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.attackerKills).toEqualTypeOf(); + expect(data.defenderKills).toBeDefined(); + expect(data.defenderKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.defenderKills).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/GalaxyWars.ts b/src/Structures/MiniGames/Arcade/GalaxyWars.ts new file mode 100644 index 000000000..c8a5258ba --- /dev/null +++ b/src/Structures/MiniGames/Arcade/GalaxyWars.ts @@ -0,0 +1,27 @@ +import Divide from '../../../Utils/Divide.js'; +import { monthAB, weekAB } from '../../../Utils/Oscillation.js'; + +class GalaxyWars { + wins: number; + kills: number; + deaths: number; + KDR: number; + shotsFired: number; + weeklyKills: number; + monthlyKills: number; + attackerKills: number; + defenderKills: number; + constructor(data: Record) { + this.wins = data?.sw_game_wins || 0; + this.kills = data?.sw_kills || 0; + this.deaths = data?.sw_deaths || 0; + this.KDR = Divide(this.kills, this.deaths); + this.shotsFired = data?.sw_shots_fired || 0; + this.weeklyKills = parseInt(data?.[`weekly_kills_${weekAB()}`] || 0, 10); + this.monthlyKills = parseInt(data?.[`monthly_kills_${monthAB()}`] || 0, 10); + this.attackerKills = data?.sw_rebel_kills || 0; + this.defenderKills = data?.sw_empire_kills || 0; + } +} + +export default GalaxyWars; diff --git a/src/Structures/MiniGames/Arcade/HideAndSeek.test.ts b/src/Structures/MiniGames/Arcade/HideAndSeek.test.ts new file mode 100644 index 000000000..4685121c1 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/HideAndSeek.test.ts @@ -0,0 +1,21 @@ +import HideAndSeek from './HideAndSeek.js'; +import PartyPooper from './PartyPooper.js'; +import PropHunt from './PropHunt.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('HideAndSeek', () => { + const data = new HideAndSeek({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(HideAndSeek); + expectTypeOf(data).toEqualTypeOf(); + expect(data.partyPooper).toBeDefined(); + expectTypeOf(data.partyPooper).toEqualTypeOf(); + expect(data.propHunt).toBeDefined(); + expectTypeOf(data.propHunt).toEqualTypeOf(); + expect(data.winsAsSeeker).toBeDefined(); + expect(data.winsAsSeeker).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsAsSeeker).toEqualTypeOf(); + expect(data.winsAsHider).toBeDefined(); + expect(data.winsAsHider).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsAsHider).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/HideAndSeek.ts b/src/Structures/MiniGames/Arcade/HideAndSeek.ts new file mode 100644 index 000000000..7d496def3 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/HideAndSeek.ts @@ -0,0 +1,17 @@ +import PartyPooper from './PartyPooper.js'; +import PropHunt from './PropHunt.js'; + +class HideAndSeek { + partyPooper: PartyPooper; + propHunt: PropHunt; + winsAsSeeker: number; + winsAsHider: number; + constructor(data: Record) { + this.partyPooper = new PartyPooper(data); + this.propHunt = new PropHunt(data); + this.winsAsSeeker = data?.seeker_wins_hide_and_seek || 0; + this.winsAsHider = data?.hider_wins_hide_and_seek || 0; + } +} + +export default HideAndSeek; diff --git a/src/Structures/MiniGames/Arcade/HoleInTheWall.test.ts b/src/Structures/MiniGames/Arcade/HoleInTheWall.test.ts new file mode 100644 index 000000000..ca3875a3a --- /dev/null +++ b/src/Structures/MiniGames/Arcade/HoleInTheWall.test.ts @@ -0,0 +1,16 @@ +import HoleInTheWall from './HoleInTheWall.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('HoleInTheWall', () => { + const data = new HoleInTheWall({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(HoleInTheWall); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.rounds).toBeDefined(); + expect(data.scoreRecordFinals).toBeDefined(); + expect(data.scoreRecordNormal).toBeDefined(); + expect(data.scoreRecordOverall).toBeDefined(); +}); diff --git a/src/Structures/MiniGames/Arcade/HoleInTheWall.ts b/src/Structures/MiniGames/Arcade/HoleInTheWall.ts new file mode 100644 index 000000000..99ec60e85 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/HoleInTheWall.ts @@ -0,0 +1,16 @@ +class HoleInTheWall { + wins: number; + rounds: number; + scoreRecordFinals: number; + scoreRecordNormal: number; + scoreRecordOverall: number; + constructor(data: Record) { + this.wins = data?.wins_hole_in_the_wall || 0; + this.rounds = data?.rounds_hole_in_the_wall || 0; + this.scoreRecordFinals = data?.hitw_record_f || 0; + this.scoreRecordNormal = data?.hitw_record_q || 0; + this.scoreRecordOverall = this.scoreRecordFinals + this.scoreRecordNormal; + } +} + +export default HoleInTheWall; diff --git a/src/Structures/MiniGames/Arcade/HypixelSays.test.ts b/src/Structures/MiniGames/Arcade/HypixelSays.test.ts new file mode 100644 index 000000000..74e05c667 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/HypixelSays.test.ts @@ -0,0 +1,21 @@ +import HypixelSays from './HypixelSays.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('HypixelSays', () => { + const data = new HypixelSays({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(HypixelSays); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.rounds).toBeDefined(); + expect(data.rounds).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rounds).toEqualTypeOf(); + expect(data.roundWins).toBeDefined(); + expect(data.roundWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.roundWins).toEqualTypeOf(); + expect(data.topScore).toBeDefined(); + expect(data.topScore).toBeGreaterThanOrEqual(0); + expectTypeOf(data.topScore).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/HypixelSays.ts b/src/Structures/MiniGames/Arcade/HypixelSays.ts new file mode 100644 index 000000000..10ce896c8 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/HypixelSays.ts @@ -0,0 +1,14 @@ +class HypixelSays { + wins: number; + rounds: number; + roundWins: number; + topScore: number; + constructor(data: Record) { + this.wins = data?.wins_simon_says || 0; + this.rounds = data?.rounds_simon_says || 0; + this.roundWins = data?.round_wins_simon_says || 0; + this.topScore = data?.top_score_simon_says || 0; + } +} + +export default HypixelSays; diff --git a/src/Structures/MiniGames/Arcade/MiniWalls.test.ts b/src/Structures/MiniGames/Arcade/MiniWalls.test.ts new file mode 100644 index 000000000..a2fb3b6c6 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/MiniWalls.test.ts @@ -0,0 +1,42 @@ +import MiniWalls from './MiniWalls.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { MiniWallsKits } from '../../../Types/Player.js'; + +test('MiniWalls', () => { + const data = new MiniWalls({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(MiniWalls); + expectTypeOf(data).toEqualTypeOf(); + expect(data.kit).toBeDefined(); + expectTypeOf(data.kit).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.finalKills).toBeDefined(); + expect(data.finalKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.finalKills).toEqualTypeOf(); + expect(data.witherKills).toBeDefined(); + expect(data.witherKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.witherKills).toEqualTypeOf(); + expect(data.witherDamage).toBeDefined(); + expect(data.witherDamage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.witherDamage).toEqualTypeOf(); + expect(data.arrowsShot).toBeDefined(); + expect(data.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arrowsShot).toEqualTypeOf(); + expect(data.arrowsHit).toBeDefined(); + expect(data.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arrowsHit).toEqualTypeOf(); + expect(data.bowAccuracy).toBeDefined(); + expect(data.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowAccuracy).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/MiniWalls.ts b/src/Structures/MiniGames/Arcade/MiniWalls.ts new file mode 100644 index 000000000..3ff6b559b --- /dev/null +++ b/src/Structures/MiniGames/Arcade/MiniWalls.ts @@ -0,0 +1,31 @@ +import Divide from '../../../Utils/Divide.js'; +import type { MiniWallsKits } from '../../../Types/Player.js'; + +class MiniWalls { + kit: MiniWallsKits | 'None'; + wins: number; + kills: number; + deaths: number; + KDR: number; + finalKills: number; + witherKills: number; + witherDamage: number; + arrowsShot: number; + arrowsHit: number; + bowAccuracy: number; + constructor(data: Record) { + this.kit = data?.miniwalls_activeKit || 'None'; + this.wins = data?.wins_mini_walls || 0; + this.kills = data?.kills_mini_walls || 0; + this.deaths = data?.deaths_mini_walls || 0; + this.KDR = Divide(this.kills, this.deaths); + this.finalKills = data?.final_kills_mini_walls || 0; + this.witherKills = data?.wither_kills_mini_walls || 0; + this.witherDamage = data?.wither_damage_mini_walls || 0; + this.arrowsShot = data?.arrows_shot_mini_walls || 0; + this.arrowsHit = data?.arrows_hit_mini_walls || 0; + this.bowAccuracy = Divide(this.arrowsHit, this.arrowsShot); + } +} + +export default MiniWalls; diff --git a/src/Structures/MiniGames/Arcade/PartyGames.test.ts b/src/Structures/MiniGames/Arcade/PartyGames.test.ts new file mode 100644 index 000000000..58be5af56 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/PartyGames.test.ts @@ -0,0 +1,18 @@ +import PartyGames from './PartyGames.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PartyGames', () => { + const data = new PartyGames({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PartyGames); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.roundWins).toBeDefined(); + expect(data.roundWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.roundWins).toEqualTypeOf(); + expect(data.stars).toBeDefined(); + expect(data.stars).toBeGreaterThanOrEqual(0); + expectTypeOf(data.stars).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/PartyGames.ts b/src/Structures/MiniGames/Arcade/PartyGames.ts new file mode 100644 index 000000000..e7eb419a9 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/PartyGames.ts @@ -0,0 +1,12 @@ +class PartyGames { + wins: number; + roundWins: number; + stars: number; + constructor(data: Record) { + this.wins = data?.wins_party || 0; + this.roundWins = data?.round_wins_party || 0; + this.stars = data?.total_stars_party || 0; + } +} + +export default PartyGames; diff --git a/src/Structures/MiniGames/Arcade/PartyPooper.test.ts b/src/Structures/MiniGames/Arcade/PartyPooper.test.ts new file mode 100644 index 000000000..77c0c285d --- /dev/null +++ b/src/Structures/MiniGames/Arcade/PartyPooper.test.ts @@ -0,0 +1,18 @@ +import PartyPooper from './PartyPooper.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PartyPooper', () => { + const data = new PartyPooper({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PartyPooper); + expectTypeOf(data).toEqualTypeOf(); + expect(data.winsAsSeeker).toBeDefined(); + expect(data.winsAsSeeker).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsAsSeeker).toEqualTypeOf(); + expect(data.winsAsHider).toBeDefined(); + expect(data.winsAsHider).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsAsHider).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/PartyPooper.ts b/src/Structures/MiniGames/Arcade/PartyPooper.ts new file mode 100644 index 000000000..6717dcc15 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/PartyPooper.ts @@ -0,0 +1,12 @@ +class PartyPooper { + winsAsSeeker: number; + winsAsHider: number; + wins: number; + constructor(data: Record) { + this.winsAsSeeker = data?.party_pooper_seeker_wins_hide_and_seek || 0; + this.winsAsHider = data?.party_pooper_hider_wins_hide_and_seek || 0; + this.wins = this.winsAsSeeker + this.winsAsHider; + } +} + +export default PartyPooper; diff --git a/src/Structures/MiniGames/Arcade/PixelParty.test.ts b/src/Structures/MiniGames/Arcade/PixelParty.test.ts new file mode 100644 index 000000000..240a5b05a --- /dev/null +++ b/src/Structures/MiniGames/Arcade/PixelParty.test.ts @@ -0,0 +1,40 @@ +import PixelParty from './PixelParty.js'; +import PixelPartyGameMode from './PixelPartyGameMode.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PixelParty', () => { + const data = new PixelParty({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PixelParty); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.gamesPlayed).toBeDefined(); + expect(data.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gamesPlayed).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.roundsPlayed).toBeDefined(); + expect(data.roundsPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.roundsPlayed).toEqualTypeOf(); + expect(data.powerUpsCollected).toBeDefined(); + expect(data.powerUpsCollected).toBeGreaterThanOrEqual(0); + expectTypeOf(data.powerUpsCollected).toEqualTypeOf(); + expect(data.normal).toBeDefined(); + expectTypeOf(data.normal).toEqualTypeOf(); + expect(data.hyper).toBeDefined(); + expectTypeOf(data.hyper).toEqualTypeOf(); + expect(data.highestRound).toBeDefined(); + expect(data.highestRound).toBeGreaterThanOrEqual(0); + expectTypeOf(data.highestRound).toEqualTypeOf(); + expect(data.musicVolume).toBeDefined(); + expect(data.musicVolume).toBeGreaterThanOrEqual(0); + expectTypeOf(data.musicVolume).toEqualTypeOf(); + expect(data.colorBlind).toBeDefined(); + expectTypeOf(data.colorBlind).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/PixelParty.ts b/src/Structures/MiniGames/Arcade/PixelParty.ts new file mode 100644 index 000000000..4424176c2 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/PixelParty.ts @@ -0,0 +1,31 @@ +import Divide from '../../../Utils/Divide.js'; +import PixelPartyGameMode from './PixelPartyGameMode.js'; + +class PixelParty { + wins: number; + gamesPlayed: number; + losses: number; + WLR: number; + roundsPlayed: number; + powerUpsCollected: number; + normal: PixelPartyGameMode; + hyper: PixelPartyGameMode; + highestRound: number; + musicVolume: number; + colorBlind: object; + constructor(data: Record) { + this.wins = data?.pixel_party?.wins || 0; + this.gamesPlayed = data?.pixel_party?.games_played || 0; + this.losses = this.gamesPlayed - this.wins; + this.WLR = Divide(this.wins, this.losses); + this.roundsPlayed = data?.pixel_party?.rounds_completed || 0; + this.powerUpsCollected = data?.pixel_party?.power_ups_collected || 0; + this.normal = new PixelPartyGameMode(data?.pixel_party, 'normal'); + this.hyper = new PixelPartyGameMode(data?.pixel_party, 'hyper'); + this.highestRound = data?.pixel_party?.highest_round || 0; + this.musicVolume = data?.pixel_party_music_volume || 0; + this.colorBlind = data?.pixelparty || {}; + } +} + +export default PixelParty; diff --git a/src/Structures/MiniGames/Arcade/PixelPartyGameMode.test.ts b/src/Structures/MiniGames/Arcade/PixelPartyGameMode.test.ts new file mode 100644 index 000000000..d6e6f5ca6 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/PixelPartyGameMode.test.ts @@ -0,0 +1,27 @@ +import PixelPartyGameMode from './PixelPartyGameMode.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PixelPartyGameMode', () => { + const data = new PixelPartyGameMode({ stats: 'meow' }, 'hyper'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PixelPartyGameMode); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.gamesPlayed).toBeDefined(); + expect(data.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gamesPlayed).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.roundsPlayed).toBeDefined(); + expect(data.roundsPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.roundsPlayed).toEqualTypeOf(); + expect(data.powerUpsCollected).toBeDefined(); + expect(data.powerUpsCollected).toBeGreaterThanOrEqual(0); + expectTypeOf(data.powerUpsCollected).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/PixelPartyGameMode.ts b/src/Structures/MiniGames/Arcade/PixelPartyGameMode.ts new file mode 100644 index 000000000..b94c6282b --- /dev/null +++ b/src/Structures/MiniGames/Arcade/PixelPartyGameMode.ts @@ -0,0 +1,21 @@ +import Divide from '../../../Utils/Divide.js'; +import type { PixelPartyGameModes } from '../../../Types/Player.js'; + +class PixelPartyGameMode { + wins: number; + gamesPlayed: number; + losses: number; + WLR: number; + roundsPlayed: number; + powerUpsCollected: number; + constructor(data: Record, modeName: PixelPartyGameModes) { + this.wins = data?.[`wins_${modeName}`] || 0; + this.gamesPlayed = data?.[`games_played_${modeName}`] || 0; + this.losses = this.gamesPlayed - this.wins; + this.WLR = Divide(this.wins, this.losses); + this.roundsPlayed = data?.[`rounds_completed_${modeName}`] || 0; + this.powerUpsCollected = data?.[`power_ups_collected_${modeName}`] || 0; + } +} + +export default PixelPartyGameMode; diff --git a/src/Structures/MiniGames/Arcade/PropHunt.test.ts b/src/Structures/MiniGames/Arcade/PropHunt.test.ts new file mode 100644 index 000000000..ede0cee74 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/PropHunt.test.ts @@ -0,0 +1,18 @@ +import PropHunt from './PropHunt.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PropHunt', () => { + const data = new PropHunt({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PropHunt); + expectTypeOf(data).toEqualTypeOf(); + expect(data.winsAsSeeker).toBeDefined(); + expect(data.winsAsSeeker).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsAsSeeker).toEqualTypeOf(); + expect(data.winsAsHider).toBeDefined(); + expect(data.winsAsHider).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsAsHider).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/PropHunt.ts b/src/Structures/MiniGames/Arcade/PropHunt.ts new file mode 100644 index 000000000..7181e7935 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/PropHunt.ts @@ -0,0 +1,12 @@ +class PropHunt { + winsAsSeeker: number; + winsAsHider: number; + wins: number; + constructor(data: Record) { + this.winsAsSeeker = data?.prop_hunt_seeker_wins_hide_and_seek || 0; + this.winsAsHider = data?.prop_hunt_hider_wins_hide_and_seek || 0; + this.wins = this.winsAsSeeker + this.winsAsHider; + } +} + +export default PropHunt; diff --git a/src/Structures/MiniGames/Arcade/ThrowOut.test.ts b/src/Structures/MiniGames/Arcade/ThrowOut.test.ts new file mode 100644 index 000000000..8660e3d56 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/ThrowOut.test.ts @@ -0,0 +1,21 @@ +import ThrowOut from './ThrowOut.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('ThrowOut', () => { + const data = new ThrowOut({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(ThrowOut); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/ThrowOut.ts b/src/Structures/MiniGames/Arcade/ThrowOut.ts new file mode 100644 index 000000000..fa893fc44 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/ThrowOut.ts @@ -0,0 +1,16 @@ +import Divide from '../../../Utils/Divide.js'; + +class ThrowOut { + wins: number; + kills: number; + deaths: number; + KDR: number; + constructor(data: Record) { + this.wins = data?.wins_throw_out || 0; + this.kills = data?.kills_throw_out || 0; + this.deaths = data?.deaths_throw_out || 0; + this.KDR = Divide(this.kills, this.deaths); + } +} + +export default ThrowOut; diff --git a/src/Structures/MiniGames/Arcade/Zombies.test.ts b/src/Structures/MiniGames/Arcade/Zombies.test.ts new file mode 100644 index 000000000..847240451 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/Zombies.test.ts @@ -0,0 +1,37 @@ +import Zombies from './Zombies.js'; +import ZombiesStats from './ZombiesStats.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Zombies', () => { + const data = new Zombies({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Zombies); + expectTypeOf(data).toEqualTypeOf(); + expect(data.overall).toBeDefined(); + expectTypeOf(data.overall).toEqualTypeOf(); + expect(data.deadEnd).toBeDefined(); + expectTypeOf(data.deadEnd).toEqualTypeOf(); + expect(data.badBlood).toBeDefined(); + expectTypeOf(data.badBlood).toEqualTypeOf(); + expect(data.alienArcadium).toBeDefined(); + expectTypeOf(data.alienArcadium).toEqualTypeOf(); + expect(data.prison).toBeDefined(); + expectTypeOf(data.prison).toEqualTypeOf(); + expect(data.killsByZombie).toBeDefined(); + expectTypeOf(data.killsByZombie).toEqualTypeOf>(); + expect(data.bulletsHit).toBeDefined(); + expect(data.bulletsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bulletsHit).toEqualTypeOf(); + expect(data.bulletsShot).toBeDefined(); + expect(data.bulletsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bulletsShot).toEqualTypeOf(); + expect(data.gunAccuracy).toBeDefined(); + expect(data.gunAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gunAccuracy).toEqualTypeOf(); + expect(data.headshots).toBeDefined(); + expect(data.headshots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.headshots).toEqualTypeOf(); + expect(data.headshotAccuracy).toBeDefined(); + expect(data.headshotAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.headshotAccuracy).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/Zombies.ts b/src/Structures/MiniGames/Arcade/Zombies.ts new file mode 100644 index 000000000..812fec820 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/Zombies.ts @@ -0,0 +1,39 @@ +import Divide from '../../../Utils/Divide.js'; +import ZombiesStats from './ZombiesStats.js'; +import { RemoveSnakeCaseString } from '../../../Utils/RemoveSnakeCase.js'; + +class Zombies { + overall: ZombiesStats; + deadEnd: ZombiesStats; + badBlood: ZombiesStats; + alienArcadium: ZombiesStats; + prison: ZombiesStats; + killsByZombie: Record; + bulletsHit: number; + bulletsShot: number; + gunAccuracy: number; + headshots: number; + headshotAccuracy: number; + constructor(data: Record) { + this.overall = new ZombiesStats(data); + this.deadEnd = new ZombiesStats(data, 'deadend'); + this.badBlood = new ZombiesStats(data, 'badblood'); + this.alienArcadium = new ZombiesStats(data, 'alienarcadium'); + this.prison = new ZombiesStats(data, 'prison'); + this.killsByZombie = this.parseZombiesKills(data); + this.bulletsHit = data?.bullets_hit_zombies || 0; + this.bulletsShot = data?.bullets_shot_zombies || 0; + this.gunAccuracy = Divide(this.bulletsHit, this.bulletsShot); + this.headshots = data?.headshots_zombies || 0; + this.headshotAccuracy = Divide(this.headshots, this.bulletsShot); + } + private parseZombiesKills(data: Record): Record { + const matches = Array.from(Object.keys(data)) + .map((x) => x.match(/^([A-Za-z]+)_zombie_kills_zombies$/)) + .filter((x) => x); + // From entries might be broken + return Object.fromEntries(matches.map((x: any) => [RemoveSnakeCaseString(x[1]), data[x[0]]])); + } +} + +export default Zombies; diff --git a/src/Structures/MiniGames/Arcade/ZombiesStats.test.ts b/src/Structures/MiniGames/Arcade/ZombiesStats.test.ts new file mode 100644 index 000000000..798a1ba48 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/ZombiesStats.test.ts @@ -0,0 +1,45 @@ +import ZombieStats from './ZombiesStats.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('ZombieStats', () => { + const data = new ZombieStats({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(ZombieStats); + expectTypeOf(data).toEqualTypeOf(); + expect(data.bestRound).toBeDefined(); + expect(data.bestRound).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bestRound).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.doorsOpened).toBeDefined(); + expect(data.doorsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.doorsOpened).toEqualTypeOf(); + expect(data.fastestRound10).toBeDefined(); + expect(data.fastestRound10).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fastestRound10).toEqualTypeOf(); + expect(data.fastestRound20).toBeDefined(); + expect(data.fastestRound20).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fastestRound20).toEqualTypeOf(); + expect(data.fastestRound30).toBeDefined(); + expect(data.fastestRound30).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fastestRound30).toEqualTypeOf(); + expect(data.playersRevived).toBeDefined(); + expect(data.playersRevived).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playersRevived).toEqualTypeOf(); + expect(data.timesKnockedDown).toBeDefined(); + expect(data.timesKnockedDown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.timesKnockedDown).toEqualTypeOf(); + expect(data.roundsSurvived).toBeDefined(); + expect(data.roundsSurvived).toBeGreaterThanOrEqual(0); + expectTypeOf(data.roundsSurvived).toEqualTypeOf(); + expect(data.windowsRepaired).toBeDefined(); + expect(data.windowsRepaired).toBeGreaterThanOrEqual(0); + expectTypeOf(data.windowsRepaired).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.zombieKills).toBeDefined(); + expect(data.zombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.zombieKills).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/ZombiesStats.ts b/src/Structures/MiniGames/Arcade/ZombiesStats.ts new file mode 100644 index 000000000..24f3b09e3 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/ZombiesStats.ts @@ -0,0 +1,33 @@ +import type { ZombiesMaps } from '../../../Types/Player.js'; + +class ZombiesStats { + bestRound: number; + deaths: number; + doorsOpened: number; + fastestRound10: number; + fastestRound20: number; + fastestRound30: number; + playersRevived: number; + timesKnockedDown: number; + roundsSurvived: number; + windowsRepaired: number; + wins: number; + zombieKills: number; + constructor(data: Record, map?: ZombiesMaps) { + const mapName = map ? `_${map}` : ''; + this.bestRound = data?.[`best_round_zombies${mapName}`] || 0; + this.deaths = data?.[`deaths_zombies${mapName}`] || 0; + this.doorsOpened = data?.[`doors_opened_zombies${mapName}`] || 0; + this.fastestRound10 = data?.[`fastest_time_10_zombies${mapName}_normal`] || 0; + this.fastestRound20 = data?.[`fastest_time_20_zombies${mapName}_normal`] || 0; + this.fastestRound30 = data?.[`fastest_time_30_zombies${mapName}_normal`] || 0; + this.playersRevived = data?.[`players_revived_zombies${mapName}`] || 0; + this.timesKnockedDown = data?.[`times_knocked_down_zombies${mapName}`] || 0; + this.roundsSurvived = data?.[`total_rounds_survived_zombies${mapName}`] || 0; + this.windowsRepaired = data?.[`windows_repaired_zombies${mapName}`] || 0; + this.wins = data?.[`wins_zombies${mapName}`] || 0; + this.zombieKills = data?.[`zombie_kills_zombies${mapName}`] || 0; + } +} + +export default ZombiesStats; diff --git a/src/Structures/MiniGames/ArenaBrawl/ArenaBrawl.test.ts b/src/Structures/MiniGames/ArenaBrawl/ArenaBrawl.test.ts new file mode 100644 index 000000000..ae753df14 --- /dev/null +++ b/src/Structures/MiniGames/ArenaBrawl/ArenaBrawl.test.ts @@ -0,0 +1,33 @@ +import ArenaBrawl from './ArenaBrawl.js'; +import ArenaBrawlMode from './ArenaBrawlMode.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { ArenaBrawlRunes } from '../../../Types/Player.js'; + +test('ArenaBrawl', () => { + const data = new ArenaBrawl({ stats: 'meow' }); + expect(data).toBeInstanceOf(ArenaBrawl); + expectTypeOf(data).toEqualTypeOf(); + expect(data.coins).toBeDefined(); + expect(data.coins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.coins).toEqualTypeOf(); + expect(data.coinsSpent).toBeDefined(); + expect(data.coinsSpent).toBeGreaterThanOrEqual(0); + expectTypeOf(data.coinsSpent).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.keys).toBeDefined(); + expect(data.keys).toBeGreaterThanOrEqual(0); + expectTypeOf(data.keys).toEqualTypeOf(); + expect(data.chests).toBeDefined(); + expect(data.chests).toBeGreaterThanOrEqual(0); + expectTypeOf(data.chests).toEqualTypeOf(); + expect(data.rune).toBeDefined(); + expectTypeOf(data.rune).toEqualTypeOf(); + expect(data['1v1']).toBeDefined(); + expectTypeOf(data['1v1']).toEqualTypeOf(); + expect(data['2v2']).toBeDefined(); + expectTypeOf(data['2v2']).toEqualTypeOf(); + expect(data['4v4']).toBeDefined(); + expectTypeOf(data['4v4']).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/ArenaBrawl/ArenaBrawl.ts b/src/Structures/MiniGames/ArenaBrawl/ArenaBrawl.ts new file mode 100644 index 000000000..92ea31b97 --- /dev/null +++ b/src/Structures/MiniGames/ArenaBrawl/ArenaBrawl.ts @@ -0,0 +1,27 @@ +import ArenaBrawlMode from './ArenaBrawlMode.js'; +import type { ArenaBrawlRunes } from '../../../Types/Player.js'; + +class ArenaBrawl { + coins: number; + coinsSpent: number; + wins: number; + keys: number; + chests: number; + rune: ArenaBrawlRunes | 'None'; + '1v1': ArenaBrawlMode; + '2v2': ArenaBrawlMode; + '4v4': ArenaBrawlMode; + constructor(data: Record) { + this.coins = data?.coins || data?.tokens || 0; + this.coinsSpent = data?.coins_spent || 0; + this.wins = data?.wins || 0; + this.keys = data?.keys || 0; + this.chests = data?.magical_chest || 0; + this.rune = data?.active_rune || 'None'; + this['1v1'] = new ArenaBrawlMode(data, '1v1'); + this['2v2'] = new ArenaBrawlMode(data, '2v2'); + this['4v4'] = new ArenaBrawlMode(data, '4v4'); + } +} + +export default ArenaBrawl; diff --git a/src/Structures/MiniGames/ArenaBrawl/ArenaBrawlMode.test.ts b/src/Structures/MiniGames/ArenaBrawl/ArenaBrawlMode.test.ts new file mode 100644 index 000000000..09ddb013f --- /dev/null +++ b/src/Structures/MiniGames/ArenaBrawl/ArenaBrawlMode.test.ts @@ -0,0 +1,39 @@ +import ArenaBrawlMode from './ArenaBrawlMode.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('ArenaBrawlMode', () => { + const data = new ArenaBrawlMode({ stats: 'meow' }, '1v1'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(ArenaBrawlMode); + expectTypeOf(data).toEqualTypeOf(); + expect(data.damage).toBeDefined(); + expect(data.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.damage).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.healed).toBeDefined(); + expect(data.healed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.healed).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.games).toBeDefined(); + expect(data.games).toBeGreaterThanOrEqual(0); + expectTypeOf(data.games).toEqualTypeOf(); + expect(data.winstreak).toBeDefined(); + expect(data.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winstreak).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/ArenaBrawl/ArenaBrawlMode.ts b/src/Structures/MiniGames/ArenaBrawl/ArenaBrawlMode.ts new file mode 100644 index 000000000..b0be2f277 --- /dev/null +++ b/src/Structures/MiniGames/ArenaBrawl/ArenaBrawlMode.ts @@ -0,0 +1,29 @@ +import Divide from '../../../Utils/Divide.js'; +import type { ArenaBrawlModes } from '../../../Types/Player.js'; + +class ArenaBrawlMode { + damage: number; + kills: number; + deaths: number; + KDR: number; + healed: number; + wins: number; + losses: number; + WLR: number; + games: number; + winstreak: number; + constructor(data: Record, mode: ArenaBrawlModes) { + this.damage = data?.[`damage_${mode}`] || 0; + this.kills = data?.[`kills_${mode}`] || 0; + this.deaths = data?.[`deaths_${mode}`] || 0; + this.KDR = Divide(this.kills, this.deaths); + this.healed = data?.[`healed_${mode}`] || 0; + this.wins = data?.[`wins_${mode}`] || 0; + this.losses = data?.[`losses_${mode}`] || 0; + this.WLR = Divide(this.wins, this.losses); + this.games = data?.[`games_${mode}`] || 0; + this.winstreak = data?.[`win_streaks_${mode}`] || 0; + } +} + +export default ArenaBrawlMode; diff --git a/src/Structures/MiniGames/BedWars/BedWars.test.ts b/src/Structures/MiniGames/BedWars/BedWars.test.ts new file mode 100644 index 000000000..ba50b1836 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWars.test.ts @@ -0,0 +1,91 @@ +import BedWars from './BedWars.js'; +import BedWarsBeds from './BedWarsBeds.js'; +import BedWarsCollectedItems from './BedWarsCollectedItems.js'; +import BedWarsDreamStats from './BedWarsDreamStats.js'; +import BedWarsMode from './BedWarsMode.js'; +import BedWarsPracticeStats from './Practice/BedWarsPracticeStats.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { BedWarsPrestige } from '../../../Types/Player.js'; + +test('BedWars', () => { + const data = new BedWars({ stats: 'meow' }); + expect(data).toBeInstanceOf(BedWars); + expectTypeOf(data).toEqualTypeOf(); + expect(data.tokens).toBeDefined(); + expect(data.tokens).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tokens).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expect(data.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.experience).toBeDefined(); + expect(data.experience).toBeGreaterThanOrEqual(0); + expectTypeOf(data.experience).toEqualTypeOf(); + expect(data.prestige).toBeDefined(); + expectTypeOf(data.prestige).toEqualTypeOf(); + expect(data.playedGames).toBeDefined(); + expect(data.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playedGames).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.winstreak).toBeDefined(); + expect(data.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winstreak).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.finalKills).toBeDefined(); + expect(data.finalKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.finalKills).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.finalDeaths).toBeDefined(); + expect(data.finalDeaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.finalDeaths).toEqualTypeOf(); + expect(data.collectedItemsTotal).toBeDefined(); + expect(data.collectedItemsTotal).toBeInstanceOf(BedWarsCollectedItems); + expectTypeOf(data.collectedItemsTotal).toEqualTypeOf(); + expect(data.beds).toBeDefined(); + expect(data.beds).toBeInstanceOf(BedWarsBeds); + expectTypeOf(data.beds).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.FKDR).toBeDefined(); + expect(data.FKDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.FKDR).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.solo).toBeDefined(); + expect(data.solo).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.solo).toEqualTypeOf(); + expect(data.doubles).toBeDefined(); + expect(data.doubles).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.doubles).toEqualTypeOf(); + expect(data.threes).toBeDefined(); + expect(data.threes).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.threes).toEqualTypeOf(); + expect(data.fours).toBeDefined(); + expect(data.fours).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.fours).toEqualTypeOf(); + expect(data.dream).toBeDefined(); + expect(data.dream).toBeInstanceOf(BedWarsDreamStats); + expectTypeOf(data.dream).toEqualTypeOf(); + expect(data.castle).toBeDefined(); + expect(data.castle).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.castle).toEqualTypeOf(); + expect(data.practice).toBeDefined(); + expect(data.practice).toBeInstanceOf(BedWarsPracticeStats); + expectTypeOf(data.practice).toEqualTypeOf(); + expect(data.slumberTickets).toBeDefined(); + expect(data.slumberTickets).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slumberTickets).toEqualTypeOf(); + expect(data.totalSlumberTicket).toBeDefined(); + expect(data.totalSlumberTicket).toBeGreaterThanOrEqual(0); + expectTypeOf(data.totalSlumberTicket).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWars.ts b/src/Structures/MiniGames/BedWars/BedWars.ts new file mode 100644 index 000000000..d8e19e334 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWars.ts @@ -0,0 +1,143 @@ +import BedWarsBeds from './BedWarsBeds.js'; +import BedWarsCollectedItems from './BedWarsCollectedItems.js'; +import BedWarsDreamStats from './BedWarsDreamStats.js'; +import BedWarsMode from './BedWarsMode.js'; +import BedWarsPracticeStats from './Practice/BedWarsPracticeStats.js'; +import Divide from '../../../Utils/Divide.js'; +import type { BedWarsPrestige } from '../../../Types/Player.js'; + +function getBedwarsLevel(xp: number): number { + let level = Math.floor(xp / 487000) * 100; + xp = xp % 487000; + if (500 > xp) return level + xp / 500; + level++; + if (1500 > xp) return level + (xp - 500) / 1000; + level++; + if (3500 > xp) return level + (xp - 1500) / 2000; + level++; + if (7000 > xp) return level + (xp - 3500) / 3500; + level++; + xp -= 7000; + return level + xp / 5000; +} + +const prestiges: BedWarsPrestige[] = [ + 'Stone', + 'Iron', + 'Gold', + 'Diamond', + 'Emerald', + 'Sapphire', + 'Ruby', + 'Crystal', + 'Opal', + 'Amethyst', + 'Rainbow', + 'Iron Prime', + 'Gold Prime', + 'Diamond Prime', + 'Emerald Prime', + 'Sapphire Prime', + 'Ruby Prime', + 'Crystal Prime', + 'Opal Prime', + 'Amethyst Prime', + 'Mirror', + 'Light', + 'Dawn', + 'Dusk', + 'Air', + 'Wind', + 'Nebula', + 'Thunder', + 'Earth', + 'Water', + 'Fire', + 'Sunrise', + 'Eclipse', + 'Gamma', + 'Majestic', + 'Andesine', + 'Marine', + 'Element', + 'Galaxy', + 'Atomic', + 'Sunset', + 'Time', + 'Winter', + 'Obsidian', + 'Spring', + 'Ice', + 'Summer', + 'Spinel', + 'Autumn', + 'Mystic', + 'Eternal' +]; + +function getPrestige(level: number): BedWarsPrestige { + const index = Math.floor(level / 100); + if (index > prestiges.length - 1) return prestiges[prestiges.length - 1] || 'Eternal'; + return prestiges[index] || 'Stone'; +} + +class BedWars { + tokens: number; + level: number; + experience: number; + prestige: BedWarsPrestige; + playedGames: number; + wins: number; + winstreak: number; + kills: number; + finalKills: number; + losses: number; + deaths: number; + finalDeaths: number; + collectedItemsTotal: BedWarsCollectedItems; + beds: BedWarsBeds; + KDR: number; + FKDR: number; + WLR: number; + solo: BedWarsMode; + doubles: BedWarsMode; + threes: BedWarsMode; + fours: BedWarsMode; + '4v4': BedWarsMode; + dream: BedWarsDreamStats; + castle: BedWarsMode; + practice: BedWarsPracticeStats; + slumberTickets: number; + totalSlumberTicket: number; + constructor(data: Record) { + this.tokens = data?.coins || data?.tokens || 0; + this.level = data?.Experience ? getBedwarsLevel(data?.Experience) : 0; + this.experience = data?.Experience || 0; + this.prestige = getPrestige(this.level); + this.playedGames = data?.games_played_bedwars || 0; + this.wins = data?.wins_bedwars || 0; + this.winstreak = data?.winstreak || 0; + this.kills = data?.kills_bedwars || 0; + this.finalKills = data?.final_kills_bedwars || 0; + this.losses = data?.losses_bedwars || 0; + this.deaths = data?.deaths_bedwars || 0; + this.finalDeaths = data?.final_deaths_bedwars || 0; + this.collectedItemsTotal = new BedWarsCollectedItems(data); + this.beds = new BedWarsBeds(data); + this.KDR = Divide(this.kills, this.deaths); + this.FKDR = Divide(this.finalKills, this.finalDeaths); + this.WLR = Divide(this.wins, this.losses); + this.solo = new BedWarsMode(data, 'eight_one'); + this.doubles = new BedWarsMode(data, 'eight_two'); + this.threes = new BedWarsMode(data, 'four_three'); + this.fours = new BedWarsMode(data, 'four_four'); + this['4v4'] = new BedWarsMode(data, 'two_four'); + this.dream = new BedWarsDreamStats(data); + this.castle = new BedWarsMode(data, 'castle'); + this.practice = new BedWarsPracticeStats(data); + this.slumberTickets = data?.slumber?.tickets || 0; + this.totalSlumberTicket = data?.slumber?.total_tickets || 0; + } +} + +export default BedWars; diff --git a/src/Structures/MiniGames/BedWars/BedWarsBeds.ts b/src/Structures/MiniGames/BedWars/BedWarsBeds.ts new file mode 100644 index 000000000..09e4eff48 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsBeds.ts @@ -0,0 +1,16 @@ +import Divide from '../../../Utils/Divide.js'; +import type { BedwarsGamemodeName } from '../../../Types/Player.js'; + +class BedWarsBeds { + broken: number; + lost: number; + BLRatio: number; + constructor(data: Record, mode?: BedwarsGamemodeName | string) { + mode = mode ? `${mode}_` : ''; + this.broken = data?.[`${mode}beds_broken_bedwars`] || 0; + this.lost = data?.[`${mode}beds_lost_bedwars`] || 0; + this.BLRatio = Divide(data?.[`${mode}beds_broken_bedwars`], data?.[`${mode}_beds_lost_bedwars`]); + } +} + +export default BedWarsBeds; diff --git a/src/Structures/MiniGames/BedWars/BedWarsCollectedItems.ts b/src/Structures/MiniGames/BedWars/BedWarsCollectedItems.ts new file mode 100644 index 000000000..18d310a37 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsCollectedItems.ts @@ -0,0 +1,14 @@ +class BedWarsCollectedItems { + iron: number; + gold: number; + diamond: number; + emerald: number; + constructor(data: Record) { + this.iron = data?.iron_resources_collected_bedwars || 0; + this.gold = data?.gold_resources_collected_bedwars || 0; + this.diamond = data?.diamond_resources_collected_bedwars || 0; + this.emerald = data?.emerald_resources_collected_bedwars || 0; + } +} + +export default BedWarsCollectedItems; diff --git a/src/Structures/MiniGames/BedWars/BedWarsDreamMode.ts b/src/Structures/MiniGames/BedWars/BedWarsDreamMode.ts new file mode 100644 index 000000000..fb105fe3a --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsDreamMode.ts @@ -0,0 +1,13 @@ +import BedWarsMode from './BedWarsMode.js'; +import type { BedwarsDreamGamemodeName } from '../../../Types/Player.js'; + +class BedwarsDreamMode { + doubles: BedWarsMode; + fours: BedWarsMode; + constructor(data: Record, mode: BedwarsDreamGamemodeName) { + this.doubles = new BedWarsMode(data, `eight_two_${mode}`); + this.fours = new BedWarsMode(data, `four_four_${mode}`); + } +} + +export default BedwarsDreamMode; diff --git a/src/Structures/MiniGames/BedWars/BedWarsDreamStats.ts b/src/Structures/MiniGames/BedWars/BedWarsDreamStats.ts new file mode 100644 index 000000000..4bce03e36 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsDreamStats.ts @@ -0,0 +1,18 @@ +import BedwarsDreamMode from './BedWarsDreamMode.js'; + +class BedWarsDreamStats { + ultimate: BedwarsDreamMode; + rush: BedwarsDreamMode; + armed: BedwarsDreamMode; + lucky: BedwarsDreamMode; + voidless: BedwarsDreamMode; + constructor(data: Record) { + this.ultimate = new BedwarsDreamMode(data, 'ultimate'); + this.rush = new BedwarsDreamMode(data, 'rush'); + this.armed = new BedwarsDreamMode(data, 'armed'); + this.lucky = new BedwarsDreamMode(data, 'lucky'); + this.voidless = new BedwarsDreamMode(data, 'voidless'); + } +} + +export default BedWarsDreamStats; diff --git a/src/Structures/MiniGames/BedWars/BedWarsMode.ts b/src/Structures/MiniGames/BedWars/BedWarsMode.ts new file mode 100644 index 000000000..12a99a092 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsMode.ts @@ -0,0 +1,36 @@ +import BedWarsBeds from './BedWarsBeds.js'; +import Divide from '../../../Utils/Divide.js'; +import type { BedwarsGamemodeName } from '../../../Types/Player.js'; + +class BedWarsMode { + mode: BedwarsGamemodeName; + winstreak: number; + playedGames: number; + kills: number; + deaths: number; + wins: number; + losses: number; + finalKills: number; + finalDeaths: number; + beds: BedWarsBeds; + KDR: number; + WLR: number; + FKDR: number; + constructor(data: Record, mode: BedwarsGamemodeName) { + this.mode = mode; + this.winstreak = data?.[`${mode}_winstreak`] || 0; + this.playedGames = data?.[`${mode}_games_played_bedwars`] || 0; + this.kills = data?.[`${mode}_kills_bedwars`] || 0; + this.deaths = data?.[`${mode}_deaths_bedwars`] || 0; + this.wins = data?.[`${mode}_wins_bedwars`] || 0; + this.losses = data?.[`${mode}_losses_bedwars`] || 0; + this.finalKills = data?.[`${mode}_final_kills_bedwars`] || 0; + this.finalDeaths = data?.[`${mode}_final_deaths_bedwars`] || 0; + this.beds = new BedWarsBeds(data, mode); + this.KDR = Divide(data?.[`${mode}_kills_bedwars`], data?.[`${mode}_deaths_bedwars`]); + this.WLR = Divide(data?.[`${mode}_wins_bedwars`], data?.[`${mode}_losses_bedwars`]); + this.FKDR = Divide(data?.[`${mode}_final_kills_bedwars`], data?.[`${mode}_final_deaths_bedwars`]); + } +} + +export default BedWarsMode; diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBase.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBase.ts new file mode 100644 index 000000000..515a35ee9 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBase.ts @@ -0,0 +1,10 @@ +import BedWarsPracticeModeAttempts from './BedWarsPracticeModeAttempts.js'; + +class BedWarsPracticeBase { + attempts: BedWarsPracticeModeAttempts; + constructor(data: Record) { + this.attempts = new BedWarsPracticeModeAttempts(data); + } +} + +export default BedWarsPracticeBase; diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBaseBlocksPlaced.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBaseBlocksPlaced.ts new file mode 100644 index 000000000..672677aa4 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBaseBlocksPlaced.ts @@ -0,0 +1,11 @@ +import BedWarsPracticeBase from './BedWarsPracticeBase.js'; + +class BedWarsPracticeBaseBlocksPlaced extends BedWarsPracticeBase { + blocksPlaced: number; + constructor(data: Record) { + super(data); + this.blocksPlaced = data?.blocks_placed ?? 0; + } +} + +export default BedWarsPracticeBaseBlocksPlaced; diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridging.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridging.ts new file mode 100644 index 000000000..337ef4967 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridging.ts @@ -0,0 +1,12 @@ +import BedWarsPracticeBaseBlocksPlaced from './BedWarsPracticeBaseBlocksPlaced.js'; +import BedWarsPracticeBridgingRecords from './BedWarsPracticeBridgingRecords.js'; + +class BedWarsPracticeBridging extends BedWarsPracticeBaseBlocksPlaced { + records: BedWarsPracticeBridgingRecords; + constructor(data: Record, records: Record) { + super(data); + this.records = new BedWarsPracticeBridgingRecords(records); + } +} + +export default BedWarsPracticeBridging; diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridgingRecords.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridgingRecords.ts new file mode 100644 index 000000000..3e37ad75a --- /dev/null +++ b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridgingRecords.ts @@ -0,0 +1,14 @@ +import BedWarsPracticeRecord from './BedWarsPracticeRecord.js'; + +class BedWarsPracticeBridgingRecords { + blocks30: BedWarsPracticeRecord; + blocks50: BedWarsPracticeRecord; + blocks100: BedWarsPracticeRecord; + constructor(data: Record) { + this.blocks30 = new BedWarsPracticeRecord(data, 30); + this.blocks50 = new BedWarsPracticeRecord(data, 50); + this.blocks100 = new BedWarsPracticeRecord(data, 100); + } +} + +export default BedWarsPracticeBridgingRecords; diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeModeAttempts.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeModeAttempts.ts new file mode 100644 index 000000000..acb45aff9 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeModeAttempts.ts @@ -0,0 +1,12 @@ +class BedWarsPracticeModeAttempts { + failed: number; + successful: number; + total: number; + constructor(data: Record) { + this.failed = data?.failed_attempts ?? 0; + this.successful = data?.successful_attempts ?? 0; + this.total = this.failed + this.successful; + } +} + +export default BedWarsPracticeModeAttempts; diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecord.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecord.ts new file mode 100644 index 000000000..bb7f6ca8b --- /dev/null +++ b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecord.ts @@ -0,0 +1,14 @@ +import BedWarsPracticeRecordElevation from './BedWarsPracticeRecordElevation.js'; + +class BedWarsPracticeRecord { + elevationNone: BedWarsPracticeRecordElevation; + elevationSlight: BedWarsPracticeRecordElevation; + elevationStaircase: BedWarsPracticeRecordElevation; + constructor(data: Record, distance: 30 | 50 | 100) { + this.elevationNone = new BedWarsPracticeRecordElevation(data, distance, 'NONE'); + this.elevationSlight = new BedWarsPracticeRecordElevation(data, distance, 'SLIGHT'); + this.elevationStaircase = new BedWarsPracticeRecordElevation(data, distance, 'STAIRCASE'); + } +} + +export default BedWarsPracticeRecord; diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecordElevation.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecordElevation.ts new file mode 100644 index 000000000..5c33b1f34 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecordElevation.ts @@ -0,0 +1,16 @@ +import { BedWarsPracticeRecordDistances, BedWarsPracticeRecordElevations } from '../../../../Types/Player.js'; + +class BedWarsPracticeRecordElevation { + straight: number; + diagonal: number; + constructor( + data: Record, + distance: BedWarsPracticeRecordDistances, + elevation: BedWarsPracticeRecordElevations + ) { + this.straight = data?.[`bridging_distance_${distance}:elevation_${elevation}:angle_STRAIGHT:`] ?? 0; + this.diagonal = data?.[`bridging_distance_${distance}:elevation_${elevation}:angle_DIAGONAL:`] ?? 0; + } +} + +export default BedWarsPracticeRecordElevation; diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeStats.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeStats.ts new file mode 100644 index 000000000..81786c80b --- /dev/null +++ b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeStats.ts @@ -0,0 +1,21 @@ +import BedWarsPracticeBase from './BedWarsPracticeBase.js'; +import BedWarsPracticeBaseBlocksPlaced from './BedWarsPracticeBaseBlocksPlaced.js'; +import BedWarsPracticeBridging from './BedWarsPracticeBridging.js'; +import type { BedWarsPracticeModes } from '../../../../Types/Player.js'; + +class BedWarsPracticeStats { + selected: BedWarsPracticeModes | 'NONE'; + bridging: BedWarsPracticeBridging; + fireballJumping: BedWarsPracticeBaseBlocksPlaced; + pearlClutching: BedWarsPracticeBase; + MLG: BedWarsPracticeBaseBlocksPlaced; + constructor(data: Record) { + this.selected = data?.practice?.selected || 'NONE'; + this.bridging = new BedWarsPracticeBridging(data?.practice?.bridging, data?.practice?.records); + this.fireballJumping = new BedWarsPracticeBaseBlocksPlaced(data?.practice?.fireball_jumping || {}); + this.pearlClutching = new BedWarsPracticeBase(data?.practice?.pearl_clutching || {}); + this.MLG = new BedWarsPracticeBaseBlocksPlaced(data?.practice?.mlg || {}); + } +} + +export default BedWarsPracticeStats; diff --git a/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.test.ts b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.test.ts new file mode 100644 index 000000000..5ab3a774e --- /dev/null +++ b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.test.ts @@ -0,0 +1,2241 @@ +import BlitzSurvivalGames from './BlitzSurvivalGames.js'; +import BlitzSurvivalGamesKit from './BlitzSurvivalGamesKit.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { BlitzSurvivalGamesKits } from '../../../Types/Player.js'; + +test('BlitzSurvivalGames', () => { + const data = new BlitzSurvivalGames({ stats: 'meow' }); + expect(data).toBeInstanceOf(BlitzSurvivalGames); + expectTypeOf(data).toEqualTypeOf(); + expect(data.coins).toBeDefined(); + expectTypeOf(data.coins).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.kit).toBeDefined(); + expectTypeOf(data.kit).toEqualTypeOf(); + expect(data.killsSolo).toBeDefined(); + expectTypeOf(data.killsSolo).toEqualTypeOf(); + expect(data.killsTeams).toBeDefined(); + expectTypeOf(data.killsTeams).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.winsSolo).toBeDefined(); + expectTypeOf(data.winsSolo).toEqualTypeOf(); + expect(data.winsTeam).toBeDefined(); + expectTypeOf(data.winsTeam).toEqualTypeOf(); + expect(data.gamesPlayed).toBeDefined(); + expectTypeOf(data.gamesPlayed).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.arrowsShot).toBeDefined(); + expectTypeOf(data.arrowsShot).toEqualTypeOf(); + expect(data.arrowsHit).toBeDefined(); + expectTypeOf(data.arrowsHit).toEqualTypeOf(); + expect(data.bowAccuracy).toBeDefined(); + expectTypeOf(data.bowAccuracy).toEqualTypeOf(); + expect(data.damage).toBeDefined(); + expectTypeOf(data.damage).toEqualTypeOf(); + expect(data.damageTaken).toBeDefined(); + expectTypeOf(data.damageTaken).toEqualTypeOf(); + expect(data.potionsDrunk).toBeDefined(); + expectTypeOf(data.potionsDrunk).toEqualTypeOf(); + expect(data.potionsThrown).toBeDefined(); + expectTypeOf(data.potionsThrown).toEqualTypeOf(); + expect(data.mobsSpawned).toBeDefined(); + expectTypeOf(data.mobsSpawned).toEqualTypeOf(); + expect(data.playTime).toBeDefined(); + expectTypeOf(data.playTime).toEqualTypeOf(); + expect(data.blitzUses).toBeDefined(); + expectTypeOf(data.blitzUses).toEqualTypeOf(); + expect(data.chestsOpened).toBeDefined(); + expectTypeOf(data.chestsOpened).toEqualTypeOf(); + expect(data.archer).toBeDefined(); + expectTypeOf(data.archer).toEqualTypeOf(); + expect(data.archer.level).toBeDefined(); + expect(data.archer.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.archer.level).toEqualTypeOf(); + expect(data.archer.exp).toBeDefined(); + expect(data.archer.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.archer.exp).toEqualTypeOf(); + expect(data.archer.kills).toBeDefined(); + expect(data.archer.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.archer.kills).toEqualTypeOf(); + expect(data.archer.deaths).toBeDefined(); + expect(data.archer.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.archer.deaths).toEqualTypeOf(); + expect(data.archer.KDR).toBeDefined(); + expect(data.archer.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.archer.KDR).toEqualTypeOf(); + expect(data.archer.wins).toBeDefined(); + expect(data.archer.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.archer.wins).toEqualTypeOf(); + expect(data.archer.gamesPlayed).toBeDefined(); + expect(data.archer.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.archer.gamesPlayed).toEqualTypeOf(); + expect(data.archer.losses).toBeDefined(); + expect(data.archer.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.archer.losses).toEqualTypeOf(); + expect(data.archer.WLR).toBeDefined(); + expect(data.archer.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.archer.WLR).toEqualTypeOf(); + expect(data.archer.arrowsShot).toBeDefined(); + expect(data.archer.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.archer.arrowsShot).toEqualTypeOf(); + expect(data.archer.arrowsHit).toBeDefined(); + expect(data.archer.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.archer.arrowsHit).toEqualTypeOf(); + expect(data.archer.bowAccuracy).toBeDefined(); + expect(data.archer.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.archer.bowAccuracy).toEqualTypeOf(); + expect(data.archer.damage).toBeDefined(); + expect(data.archer.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.archer.damage).toEqualTypeOf(); + expect(data.archer.damageTaken).toBeDefined(); + expect(data.archer.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.archer.damageTaken).toEqualTypeOf(); + expect(data.archer.potionsDrunk).toBeDefined(); + expect(data.archer.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.archer.potionsDrunk).toEqualTypeOf(); + expect(data.archer.potionsThrown).toBeDefined(); + expect(data.archer.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.archer.potionsThrown).toEqualTypeOf(); + expect(data.archer.playTime).toBeDefined(); + expect(data.archer.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.archer.playTime).toEqualTypeOf(); + expect(data.archer.mobsSpawned).toBeDefined(); + expect(data.archer.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.archer.mobsSpawned).toEqualTypeOf(); + expect(data.archer.chestsOpened).toBeDefined(); + expect(data.archer.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.archer.chestsOpened).toEqualTypeOf(); + expect(data.meatmaster).toBeDefined(); + expectTypeOf(data.meatmaster).toEqualTypeOf(); + expect(data.meatmaster.level).toBeDefined(); + expect(data.meatmaster.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meatmaster.level).toEqualTypeOf(); + expect(data.meatmaster.exp).toBeDefined(); + expect(data.meatmaster.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meatmaster.exp).toEqualTypeOf(); + expect(data.meatmaster.kills).toBeDefined(); + expect(data.meatmaster.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meatmaster.kills).toEqualTypeOf(); + expect(data.meatmaster.deaths).toBeDefined(); + expect(data.meatmaster.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meatmaster.deaths).toEqualTypeOf(); + expect(data.meatmaster.KDR).toBeDefined(); + expect(data.meatmaster.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meatmaster.KDR).toEqualTypeOf(); + expect(data.meatmaster.wins).toBeDefined(); + expect(data.meatmaster.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meatmaster.wins).toEqualTypeOf(); + expect(data.meatmaster.gamesPlayed).toBeDefined(); + expect(data.meatmaster.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meatmaster.gamesPlayed).toEqualTypeOf(); + expect(data.meatmaster.losses).toBeDefined(); + expect(data.meatmaster.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meatmaster.losses).toEqualTypeOf(); + expect(data.meatmaster.WLR).toBeDefined(); + expect(data.meatmaster.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meatmaster.WLR).toEqualTypeOf(); + expect(data.meatmaster.arrowsShot).toBeDefined(); + expect(data.meatmaster.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meatmaster.arrowsShot).toEqualTypeOf(); + expect(data.meatmaster.arrowsHit).toBeDefined(); + expect(data.meatmaster.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meatmaster.arrowsHit).toEqualTypeOf(); + expect(data.meatmaster.bowAccuracy).toBeDefined(); + expect(data.meatmaster.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meatmaster.bowAccuracy).toEqualTypeOf(); + expect(data.meatmaster.damage).toBeDefined(); + expect(data.meatmaster.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meatmaster.damage).toEqualTypeOf(); + expect(data.meatmaster.damageTaken).toBeDefined(); + expect(data.meatmaster.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meatmaster.damageTaken).toEqualTypeOf(); + expect(data.meatmaster.potionsDrunk).toBeDefined(); + expect(data.meatmaster.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meatmaster.potionsDrunk).toEqualTypeOf(); + expect(data.meatmaster.potionsThrown).toBeDefined(); + expect(data.meatmaster.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meatmaster.potionsThrown).toEqualTypeOf(); + expect(data.meatmaster.playTime).toBeDefined(); + expect(data.meatmaster.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meatmaster.playTime).toEqualTypeOf(); + expect(data.meatmaster.mobsSpawned).toBeDefined(); + expect(data.meatmaster.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meatmaster.mobsSpawned).toEqualTypeOf(); + expect(data.meatmaster.chestsOpened).toBeDefined(); + expect(data.meatmaster.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meatmaster.chestsOpened).toEqualTypeOf(); + expect(data.speleologist).toBeDefined(); + expectTypeOf(data.speleologist).toEqualTypeOf(); + expect(data.speleologist.level).toBeDefined(); + expect(data.speleologist.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.speleologist.level).toEqualTypeOf(); + expect(data.speleologist.exp).toBeDefined(); + expect(data.speleologist.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.speleologist.exp).toEqualTypeOf(); + expect(data.speleologist.kills).toBeDefined(); + expect(data.speleologist.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.speleologist.kills).toEqualTypeOf(); + expect(data.speleologist.deaths).toBeDefined(); + expect(data.speleologist.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.speleologist.deaths).toEqualTypeOf(); + expect(data.speleologist.KDR).toBeDefined(); + expect(data.speleologist.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.speleologist.KDR).toEqualTypeOf(); + expect(data.speleologist.wins).toBeDefined(); + expect(data.speleologist.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.speleologist.wins).toEqualTypeOf(); + expect(data.speleologist.gamesPlayed).toBeDefined(); + expect(data.speleologist.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.speleologist.gamesPlayed).toEqualTypeOf(); + expect(data.speleologist.losses).toBeDefined(); + expect(data.speleologist.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.speleologist.losses).toEqualTypeOf(); + expect(data.speleologist.WLR).toBeDefined(); + expect(data.speleologist.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.speleologist.WLR).toEqualTypeOf(); + expect(data.speleologist.arrowsShot).toBeDefined(); + expect(data.speleologist.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.speleologist.arrowsShot).toEqualTypeOf(); + expect(data.speleologist.arrowsHit).toBeDefined(); + expect(data.speleologist.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.speleologist.arrowsHit).toEqualTypeOf(); + expect(data.speleologist.bowAccuracy).toBeDefined(); + expect(data.speleologist.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.speleologist.bowAccuracy).toEqualTypeOf(); + expect(data.speleologist.damage).toBeDefined(); + expect(data.speleologist.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.speleologist.damage).toEqualTypeOf(); + expect(data.speleologist.damageTaken).toBeDefined(); + expect(data.speleologist.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.speleologist.damageTaken).toEqualTypeOf(); + expect(data.speleologist.potionsDrunk).toBeDefined(); + expect(data.speleologist.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.speleologist.potionsDrunk).toEqualTypeOf(); + expect(data.speleologist.potionsThrown).toBeDefined(); + expect(data.speleologist.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.speleologist.potionsThrown).toEqualTypeOf(); + expect(data.speleologist.playTime).toBeDefined(); + expect(data.speleologist.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.speleologist.playTime).toEqualTypeOf(); + expect(data.speleologist.mobsSpawned).toBeDefined(); + expect(data.speleologist.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.speleologist.mobsSpawned).toEqualTypeOf(); + expect(data.speleologist.chestsOpened).toBeDefined(); + expect(data.speleologist.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.speleologist.chestsOpened).toEqualTypeOf(); + expect(data.baker).toBeDefined(); + expectTypeOf(data.baker).toEqualTypeOf(); + expect(data.baker.level).toBeDefined(); + expect(data.baker.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.baker.level).toEqualTypeOf(); + expect(data.baker.exp).toBeDefined(); + expect(data.baker.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.baker.exp).toEqualTypeOf(); + expect(data.baker.kills).toBeDefined(); + expect(data.baker.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.baker.kills).toEqualTypeOf(); + expect(data.baker.deaths).toBeDefined(); + expect(data.baker.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.baker.deaths).toEqualTypeOf(); + expect(data.baker.KDR).toBeDefined(); + expect(data.baker.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.baker.KDR).toEqualTypeOf(); + expect(data.baker.wins).toBeDefined(); + expect(data.baker.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.baker.wins).toEqualTypeOf(); + expect(data.baker.gamesPlayed).toBeDefined(); + expect(data.baker.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.baker.gamesPlayed).toEqualTypeOf(); + expect(data.baker.losses).toBeDefined(); + expect(data.baker.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.baker.losses).toEqualTypeOf(); + expect(data.baker.WLR).toBeDefined(); + expect(data.baker.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.baker.WLR).toEqualTypeOf(); + expect(data.baker.arrowsShot).toBeDefined(); + expect(data.baker.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.baker.arrowsShot).toEqualTypeOf(); + expect(data.baker.arrowsHit).toBeDefined(); + expect(data.baker.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.baker.arrowsHit).toEqualTypeOf(); + expect(data.baker.bowAccuracy).toBeDefined(); + expect(data.baker.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.baker.bowAccuracy).toEqualTypeOf(); + expect(data.baker.damage).toBeDefined(); + expect(data.baker.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.baker.damage).toEqualTypeOf(); + expect(data.baker.damageTaken).toBeDefined(); + expect(data.baker.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.baker.damageTaken).toEqualTypeOf(); + expect(data.baker.potionsDrunk).toBeDefined(); + expect(data.baker.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.baker.potionsDrunk).toEqualTypeOf(); + expect(data.baker.potionsThrown).toBeDefined(); + expect(data.baker.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.baker.potionsThrown).toEqualTypeOf(); + expect(data.baker.playTime).toBeDefined(); + expect(data.baker.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.baker.playTime).toEqualTypeOf(); + expect(data.baker.mobsSpawned).toBeDefined(); + expect(data.baker.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.baker.mobsSpawned).toEqualTypeOf(); + expect(data.baker.chestsOpened).toBeDefined(); + expect(data.baker.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.baker.chestsOpened).toEqualTypeOf(); + expect(data.knight).toBeDefined(); + expectTypeOf(data.knight).toEqualTypeOf(); + expect(data.knight.level).toBeDefined(); + expect(data.knight.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.knight.level).toEqualTypeOf(); + expect(data.knight.exp).toBeDefined(); + expect(data.knight.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.knight.exp).toEqualTypeOf(); + expect(data.knight.kills).toBeDefined(); + expect(data.knight.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.knight.kills).toEqualTypeOf(); + expect(data.knight.deaths).toBeDefined(); + expect(data.knight.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.knight.deaths).toEqualTypeOf(); + expect(data.knight.KDR).toBeDefined(); + expect(data.knight.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.knight.KDR).toEqualTypeOf(); + expect(data.knight.wins).toBeDefined(); + expect(data.knight.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.knight.wins).toEqualTypeOf(); + expect(data.knight.gamesPlayed).toBeDefined(); + expect(data.knight.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.knight.gamesPlayed).toEqualTypeOf(); + expect(data.knight.losses).toBeDefined(); + expect(data.knight.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.knight.losses).toEqualTypeOf(); + expect(data.knight.WLR).toBeDefined(); + expect(data.knight.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.knight.WLR).toEqualTypeOf(); + expect(data.knight.arrowsShot).toBeDefined(); + expect(data.knight.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.knight.arrowsShot).toEqualTypeOf(); + expect(data.knight.arrowsHit).toBeDefined(); + expect(data.knight.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.knight.arrowsHit).toEqualTypeOf(); + expect(data.knight.bowAccuracy).toBeDefined(); + expect(data.knight.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.knight.bowAccuracy).toEqualTypeOf(); + expect(data.knight.damage).toBeDefined(); + expect(data.knight.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.knight.damage).toEqualTypeOf(); + expect(data.knight.damageTaken).toBeDefined(); + expect(data.knight.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.knight.damageTaken).toEqualTypeOf(); + expect(data.knight.potionsDrunk).toBeDefined(); + expect(data.knight.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.knight.potionsDrunk).toEqualTypeOf(); + expect(data.knight.potionsThrown).toBeDefined(); + expect(data.knight.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.knight.potionsThrown).toEqualTypeOf(); + expect(data.knight.playTime).toBeDefined(); + expect(data.knight.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.knight.playTime).toEqualTypeOf(); + expect(data.knight.mobsSpawned).toBeDefined(); + expect(data.knight.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.knight.mobsSpawned).toEqualTypeOf(); + expect(data.knight.chestsOpened).toBeDefined(); + expect(data.knight.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.knight.chestsOpened).toEqualTypeOf(); + expect(data.guardian).toBeDefined(); + expectTypeOf(data.guardian).toEqualTypeOf(); + expect(data.guardian.level).toBeDefined(); + expect(data.guardian.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.guardian.level).toEqualTypeOf(); + expect(data.guardian.exp).toBeDefined(); + expect(data.guardian.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.guardian.exp).toEqualTypeOf(); + expect(data.guardian.kills).toBeDefined(); + expect(data.guardian.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.guardian.kills).toEqualTypeOf(); + expect(data.guardian.deaths).toBeDefined(); + expect(data.guardian.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.guardian.deaths).toEqualTypeOf(); + expect(data.guardian.KDR).toBeDefined(); + expect(data.guardian.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.guardian.KDR).toEqualTypeOf(); + expect(data.guardian.wins).toBeDefined(); + expect(data.guardian.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.guardian.wins).toEqualTypeOf(); + expect(data.guardian.gamesPlayed).toBeDefined(); + expect(data.guardian.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.guardian.gamesPlayed).toEqualTypeOf(); + expect(data.guardian.losses).toBeDefined(); + expect(data.guardian.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.guardian.losses).toEqualTypeOf(); + expect(data.guardian.WLR).toBeDefined(); + expect(data.guardian.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.guardian.WLR).toEqualTypeOf(); + expect(data.guardian.arrowsShot).toBeDefined(); + expect(data.guardian.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.guardian.arrowsShot).toEqualTypeOf(); + expect(data.guardian.arrowsHit).toBeDefined(); + expect(data.guardian.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.guardian.arrowsHit).toEqualTypeOf(); + expect(data.guardian.bowAccuracy).toBeDefined(); + expect(data.guardian.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.guardian.bowAccuracy).toEqualTypeOf(); + expect(data.guardian.damage).toBeDefined(); + expect(data.guardian.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.guardian.damage).toEqualTypeOf(); + expect(data.guardian.damageTaken).toBeDefined(); + expect(data.guardian.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.guardian.damageTaken).toEqualTypeOf(); + expect(data.guardian.potionsDrunk).toBeDefined(); + expect(data.guardian.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.guardian.potionsDrunk).toEqualTypeOf(); + expect(data.guardian.potionsThrown).toBeDefined(); + expect(data.guardian.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.guardian.potionsThrown).toEqualTypeOf(); + expect(data.guardian.playTime).toBeDefined(); + expect(data.guardian.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.guardian.playTime).toEqualTypeOf(); + expect(data.guardian.mobsSpawned).toBeDefined(); + expect(data.guardian.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.guardian.mobsSpawned).toEqualTypeOf(); + expect(data.guardian.chestsOpened).toBeDefined(); + expect(data.guardian.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.guardian.chestsOpened).toEqualTypeOf(); + expect(data.scout).toBeDefined(); + expectTypeOf(data.scout).toEqualTypeOf(); + expect(data.scout.level).toBeDefined(); + expect(data.scout.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scout.level).toEqualTypeOf(); + expect(data.scout.exp).toBeDefined(); + expect(data.scout.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scout.exp).toEqualTypeOf(); + expect(data.scout.kills).toBeDefined(); + expect(data.scout.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scout.kills).toEqualTypeOf(); + expect(data.scout.deaths).toBeDefined(); + expect(data.scout.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scout.deaths).toEqualTypeOf(); + expect(data.scout.KDR).toBeDefined(); + expect(data.scout.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scout.KDR).toEqualTypeOf(); + expect(data.scout.wins).toBeDefined(); + expect(data.scout.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scout.wins).toEqualTypeOf(); + expect(data.scout.gamesPlayed).toBeDefined(); + expect(data.scout.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scout.gamesPlayed).toEqualTypeOf(); + expect(data.scout.losses).toBeDefined(); + expect(data.scout.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scout.losses).toEqualTypeOf(); + expect(data.scout.WLR).toBeDefined(); + expect(data.scout.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scout.WLR).toEqualTypeOf(); + expect(data.scout.arrowsShot).toBeDefined(); + expect(data.scout.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scout.arrowsShot).toEqualTypeOf(); + expect(data.scout.arrowsHit).toBeDefined(); + expect(data.scout.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scout.arrowsHit).toEqualTypeOf(); + expect(data.scout.bowAccuracy).toBeDefined(); + expect(data.scout.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scout.bowAccuracy).toEqualTypeOf(); + expect(data.scout.damage).toBeDefined(); + expect(data.scout.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scout.damage).toEqualTypeOf(); + expect(data.scout.damageTaken).toBeDefined(); + expect(data.scout.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scout.damageTaken).toEqualTypeOf(); + expect(data.scout.potionsDrunk).toBeDefined(); + expect(data.scout.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scout.potionsDrunk).toEqualTypeOf(); + expect(data.scout.potionsThrown).toBeDefined(); + expect(data.scout.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scout.potionsThrown).toEqualTypeOf(); + expect(data.scout.playTime).toBeDefined(); + expect(data.scout.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scout.playTime).toEqualTypeOf(); + expect(data.scout.mobsSpawned).toBeDefined(); + expect(data.scout.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scout.mobsSpawned).toEqualTypeOf(); + expect(data.scout.chestsOpened).toBeDefined(); + expect(data.scout.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scout.chestsOpened).toEqualTypeOf(); + expect(data.hunter).toBeDefined(); + expectTypeOf(data.hunter).toEqualTypeOf(); + expect(data.hunter.level).toBeDefined(); + expect(data.hunter.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hunter.level).toEqualTypeOf(); + expect(data.hunter.exp).toBeDefined(); + expect(data.hunter.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hunter.exp).toEqualTypeOf(); + expect(data.hunter.kills).toBeDefined(); + expect(data.hunter.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hunter.kills).toEqualTypeOf(); + expect(data.hunter.deaths).toBeDefined(); + expect(data.hunter.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hunter.deaths).toEqualTypeOf(); + expect(data.hunter.KDR).toBeDefined(); + expect(data.hunter.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hunter.KDR).toEqualTypeOf(); + expect(data.hunter.wins).toBeDefined(); + expect(data.hunter.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hunter.wins).toEqualTypeOf(); + expect(data.hunter.gamesPlayed).toBeDefined(); + expect(data.hunter.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hunter.gamesPlayed).toEqualTypeOf(); + expect(data.hunter.losses).toBeDefined(); + expect(data.hunter.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hunter.losses).toEqualTypeOf(); + expect(data.hunter.WLR).toBeDefined(); + expect(data.hunter.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hunter.WLR).toEqualTypeOf(); + expect(data.hunter.arrowsShot).toBeDefined(); + expect(data.hunter.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hunter.arrowsShot).toEqualTypeOf(); + expect(data.hunter.arrowsHit).toBeDefined(); + expect(data.hunter.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hunter.arrowsHit).toEqualTypeOf(); + expect(data.hunter.bowAccuracy).toBeDefined(); + expect(data.hunter.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hunter.bowAccuracy).toEqualTypeOf(); + expect(data.hunter.damage).toBeDefined(); + expect(data.hunter.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hunter.damage).toEqualTypeOf(); + expect(data.hunter.damageTaken).toBeDefined(); + expect(data.hunter.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hunter.damageTaken).toEqualTypeOf(); + expect(data.hunter.potionsDrunk).toBeDefined(); + expect(data.hunter.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hunter.potionsDrunk).toEqualTypeOf(); + expect(data.hunter.potionsThrown).toBeDefined(); + expect(data.hunter.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hunter.potionsThrown).toEqualTypeOf(); + expect(data.hunter.playTime).toBeDefined(); + expect(data.hunter.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hunter.playTime).toEqualTypeOf(); + expect(data.hunter.mobsSpawned).toBeDefined(); + expect(data.hunter.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hunter.mobsSpawned).toEqualTypeOf(); + expect(data.hunter.chestsOpened).toBeDefined(); + expect(data.hunter.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hunter.chestsOpened).toEqualTypeOf(); + expect(data.hypeTrain).toBeDefined(); + expectTypeOf(data.hypeTrain).toEqualTypeOf(); + expect(data.hypeTrain.level).toBeDefined(); + expect(data.hypeTrain.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hypeTrain.level).toEqualTypeOf(); + expect(data.hypeTrain.exp).toBeDefined(); + expect(data.hypeTrain.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hypeTrain.exp).toEqualTypeOf(); + expect(data.hypeTrain.kills).toBeDefined(); + expect(data.hypeTrain.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hypeTrain.kills).toEqualTypeOf(); + expect(data.hypeTrain.deaths).toBeDefined(); + expect(data.hypeTrain.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hypeTrain.deaths).toEqualTypeOf(); + expect(data.hypeTrain.KDR).toBeDefined(); + expect(data.hypeTrain.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hypeTrain.KDR).toEqualTypeOf(); + expect(data.hypeTrain.wins).toBeDefined(); + expect(data.hypeTrain.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hypeTrain.wins).toEqualTypeOf(); + expect(data.hypeTrain.gamesPlayed).toBeDefined(); + expect(data.hypeTrain.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hypeTrain.gamesPlayed).toEqualTypeOf(); + expect(data.hypeTrain.losses).toBeDefined(); + expect(data.hypeTrain.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hypeTrain.losses).toEqualTypeOf(); + expect(data.hypeTrain.WLR).toBeDefined(); + expect(data.hypeTrain.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hypeTrain.WLR).toEqualTypeOf(); + expect(data.hypeTrain.arrowsShot).toBeDefined(); + expect(data.hypeTrain.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hypeTrain.arrowsShot).toEqualTypeOf(); + expect(data.hypeTrain.arrowsHit).toBeDefined(); + expect(data.hypeTrain.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hypeTrain.arrowsHit).toEqualTypeOf(); + expect(data.hypeTrain.bowAccuracy).toBeDefined(); + expect(data.hypeTrain.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hypeTrain.bowAccuracy).toEqualTypeOf(); + expect(data.hypeTrain.damage).toBeDefined(); + expect(data.hypeTrain.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hypeTrain.damage).toEqualTypeOf(); + expect(data.hypeTrain.damageTaken).toBeDefined(); + expect(data.hypeTrain.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hypeTrain.damageTaken).toEqualTypeOf(); + expect(data.hypeTrain.potionsDrunk).toBeDefined(); + expect(data.hypeTrain.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hypeTrain.potionsDrunk).toEqualTypeOf(); + expect(data.hypeTrain.potionsThrown).toBeDefined(); + expect(data.hypeTrain.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hypeTrain.potionsThrown).toEqualTypeOf(); + expect(data.hypeTrain.playTime).toBeDefined(); + expect(data.hypeTrain.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hypeTrain.playTime).toEqualTypeOf(); + expect(data.hypeTrain.mobsSpawned).toBeDefined(); + expect(data.hypeTrain.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hypeTrain.mobsSpawned).toEqualTypeOf(); + expect(data.hypeTrain.chestsOpened).toBeDefined(); + expect(data.hypeTrain.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hypeTrain.chestsOpened).toEqualTypeOf(); + expect(data.fisherman).toBeDefined(); + expectTypeOf(data.fisherman).toEqualTypeOf(); + expect(data.fisherman.level).toBeDefined(); + expect(data.fisherman.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fisherman.level).toEqualTypeOf(); + expect(data.fisherman.exp).toBeDefined(); + expect(data.fisherman.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fisherman.exp).toEqualTypeOf(); + expect(data.fisherman.kills).toBeDefined(); + expect(data.fisherman.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fisherman.kills).toEqualTypeOf(); + expect(data.fisherman.deaths).toBeDefined(); + expect(data.fisherman.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fisherman.deaths).toEqualTypeOf(); + expect(data.fisherman.KDR).toBeDefined(); + expect(data.fisherman.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fisherman.KDR).toEqualTypeOf(); + expect(data.fisherman.wins).toBeDefined(); + expect(data.fisherman.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fisherman.wins).toEqualTypeOf(); + expect(data.fisherman.gamesPlayed).toBeDefined(); + expect(data.fisherman.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fisherman.gamesPlayed).toEqualTypeOf(); + expect(data.fisherman.losses).toBeDefined(); + expect(data.fisherman.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fisherman.losses).toEqualTypeOf(); + expect(data.fisherman.WLR).toBeDefined(); + expect(data.fisherman.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fisherman.WLR).toEqualTypeOf(); + expect(data.fisherman.arrowsShot).toBeDefined(); + expect(data.fisherman.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fisherman.arrowsShot).toEqualTypeOf(); + expect(data.fisherman.arrowsHit).toBeDefined(); + expect(data.fisherman.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fisherman.arrowsHit).toEqualTypeOf(); + expect(data.fisherman.bowAccuracy).toBeDefined(); + expect(data.fisherman.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fisherman.bowAccuracy).toEqualTypeOf(); + expect(data.fisherman.damage).toBeDefined(); + expect(data.fisherman.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fisherman.damage).toEqualTypeOf(); + expect(data.fisherman.damageTaken).toBeDefined(); + expect(data.fisherman.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fisherman.damageTaken).toEqualTypeOf(); + expect(data.fisherman.potionsDrunk).toBeDefined(); + expect(data.fisherman.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fisherman.potionsDrunk).toEqualTypeOf(); + expect(data.fisherman.potionsThrown).toBeDefined(); + expect(data.fisherman.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fisherman.potionsThrown).toEqualTypeOf(); + expect(data.fisherman.playTime).toBeDefined(); + expect(data.fisherman.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fisherman.playTime).toEqualTypeOf(); + expect(data.fisherman.mobsSpawned).toBeDefined(); + expect(data.fisherman.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fisherman.mobsSpawned).toEqualTypeOf(); + expect(data.fisherman.chestsOpened).toBeDefined(); + expect(data.fisherman.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fisherman.chestsOpened).toEqualTypeOf(); + expect(data.armorer).toBeDefined(); + expectTypeOf(data.armorer).toEqualTypeOf(); + expect(data.armorer.level).toBeDefined(); + expect(data.armorer.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.armorer.level).toEqualTypeOf(); + expect(data.armorer.exp).toBeDefined(); + expect(data.armorer.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.armorer.exp).toEqualTypeOf(); + expect(data.armorer.kills).toBeDefined(); + expect(data.armorer.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.armorer.kills).toEqualTypeOf(); + expect(data.armorer.deaths).toBeDefined(); + expect(data.armorer.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.armorer.deaths).toEqualTypeOf(); + expect(data.armorer.KDR).toBeDefined(); + expect(data.armorer.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.armorer.KDR).toEqualTypeOf(); + expect(data.armorer.wins).toBeDefined(); + expect(data.armorer.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.armorer.wins).toEqualTypeOf(); + expect(data.armorer.gamesPlayed).toBeDefined(); + expect(data.armorer.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.armorer.gamesPlayed).toEqualTypeOf(); + expect(data.armorer.losses).toBeDefined(); + expect(data.armorer.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.armorer.losses).toEqualTypeOf(); + expect(data.armorer.WLR).toBeDefined(); + expect(data.armorer.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.armorer.WLR).toEqualTypeOf(); + expect(data.armorer.arrowsShot).toBeDefined(); + expect(data.armorer.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.armorer.arrowsShot).toEqualTypeOf(); + expect(data.armorer.arrowsHit).toBeDefined(); + expect(data.armorer.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.armorer.arrowsHit).toEqualTypeOf(); + expect(data.armorer.bowAccuracy).toBeDefined(); + expect(data.armorer.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.armorer.bowAccuracy).toEqualTypeOf(); + expect(data.armorer.damage).toBeDefined(); + expect(data.armorer.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.armorer.damage).toEqualTypeOf(); + expect(data.armorer.damageTaken).toBeDefined(); + expect(data.armorer.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.armorer.damageTaken).toEqualTypeOf(); + expect(data.armorer.potionsDrunk).toBeDefined(); + expect(data.armorer.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.armorer.potionsDrunk).toEqualTypeOf(); + expect(data.armorer.potionsThrown).toBeDefined(); + expect(data.armorer.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.armorer.potionsThrown).toEqualTypeOf(); + expect(data.armorer.playTime).toBeDefined(); + expect(data.armorer.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.armorer.playTime).toEqualTypeOf(); + expect(data.armorer.mobsSpawned).toBeDefined(); + expect(data.armorer.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.armorer.mobsSpawned).toEqualTypeOf(); + expect(data.armorer.chestsOpened).toBeDefined(); + expect(data.armorer.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.armorer.chestsOpened).toEqualTypeOf(); + expect(data.horsetamer).toBeDefined(); + expectTypeOf(data.horsetamer).toEqualTypeOf(); + expect(data.horsetamer.level).toBeDefined(); + expect(data.horsetamer.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.horsetamer.level).toEqualTypeOf(); + expect(data.horsetamer.exp).toBeDefined(); + expect(data.horsetamer.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.horsetamer.exp).toEqualTypeOf(); + expect(data.horsetamer.kills).toBeDefined(); + expect(data.horsetamer.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.horsetamer.kills).toEqualTypeOf(); + expect(data.horsetamer.deaths).toBeDefined(); + expect(data.horsetamer.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.horsetamer.deaths).toEqualTypeOf(); + expect(data.horsetamer.KDR).toBeDefined(); + expect(data.horsetamer.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.horsetamer.KDR).toEqualTypeOf(); + expect(data.horsetamer.wins).toBeDefined(); + expect(data.horsetamer.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.horsetamer.wins).toEqualTypeOf(); + expect(data.horsetamer.gamesPlayed).toBeDefined(); + expect(data.horsetamer.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.horsetamer.gamesPlayed).toEqualTypeOf(); + expect(data.horsetamer.losses).toBeDefined(); + expect(data.horsetamer.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.horsetamer.losses).toEqualTypeOf(); + expect(data.horsetamer.WLR).toBeDefined(); + expect(data.horsetamer.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.horsetamer.WLR).toEqualTypeOf(); + expect(data.horsetamer.arrowsShot).toBeDefined(); + expect(data.horsetamer.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.horsetamer.arrowsShot).toEqualTypeOf(); + expect(data.horsetamer.arrowsHit).toBeDefined(); + expect(data.horsetamer.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.horsetamer.arrowsHit).toEqualTypeOf(); + expect(data.horsetamer.bowAccuracy).toBeDefined(); + expect(data.horsetamer.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.horsetamer.bowAccuracy).toEqualTypeOf(); + expect(data.horsetamer.damage).toBeDefined(); + expect(data.horsetamer.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.horsetamer.damage).toEqualTypeOf(); + expect(data.horsetamer.damageTaken).toBeDefined(); + expect(data.horsetamer.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.horsetamer.damageTaken).toEqualTypeOf(); + expect(data.horsetamer.potionsDrunk).toBeDefined(); + expect(data.horsetamer.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.horsetamer.potionsDrunk).toEqualTypeOf(); + expect(data.horsetamer.potionsThrown).toBeDefined(); + expect(data.horsetamer.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.horsetamer.potionsThrown).toEqualTypeOf(); + expect(data.horsetamer.playTime).toBeDefined(); + expect(data.horsetamer.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.horsetamer.playTime).toEqualTypeOf(); + expect(data.horsetamer.mobsSpawned).toBeDefined(); + expect(data.horsetamer.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.horsetamer.mobsSpawned).toEqualTypeOf(); + expect(data.horsetamer.chestsOpened).toBeDefined(); + expect(data.horsetamer.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.horsetamer.chestsOpened).toEqualTypeOf(); + expect(data.astronaut).toBeDefined(); + expectTypeOf(data.astronaut).toEqualTypeOf(); + expect(data.astronaut.level).toBeDefined(); + expect(data.astronaut.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.astronaut.level).toEqualTypeOf(); + expect(data.astronaut.exp).toBeDefined(); + expect(data.astronaut.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.astronaut.exp).toEqualTypeOf(); + expect(data.astronaut.kills).toBeDefined(); + expect(data.astronaut.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.astronaut.kills).toEqualTypeOf(); + expect(data.astronaut.deaths).toBeDefined(); + expect(data.astronaut.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.astronaut.deaths).toEqualTypeOf(); + expect(data.astronaut.KDR).toBeDefined(); + expect(data.astronaut.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.astronaut.KDR).toEqualTypeOf(); + expect(data.astronaut.wins).toBeDefined(); + expect(data.astronaut.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.astronaut.wins).toEqualTypeOf(); + expect(data.astronaut.gamesPlayed).toBeDefined(); + expect(data.astronaut.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.astronaut.gamesPlayed).toEqualTypeOf(); + expect(data.astronaut.losses).toBeDefined(); + expect(data.astronaut.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.astronaut.losses).toEqualTypeOf(); + expect(data.astronaut.WLR).toBeDefined(); + expect(data.astronaut.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.astronaut.WLR).toEqualTypeOf(); + expect(data.astronaut.arrowsShot).toBeDefined(); + expect(data.astronaut.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.astronaut.arrowsShot).toEqualTypeOf(); + expect(data.astronaut.arrowsHit).toBeDefined(); + expect(data.astronaut.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.astronaut.arrowsHit).toEqualTypeOf(); + expect(data.astronaut.bowAccuracy).toBeDefined(); + expect(data.astronaut.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.astronaut.bowAccuracy).toEqualTypeOf(); + expect(data.astronaut.damage).toBeDefined(); + expect(data.astronaut.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.astronaut.damage).toEqualTypeOf(); + expect(data.astronaut.damageTaken).toBeDefined(); + expect(data.astronaut.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.astronaut.damageTaken).toEqualTypeOf(); + expect(data.astronaut.potionsDrunk).toBeDefined(); + expect(data.astronaut.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.astronaut.potionsDrunk).toEqualTypeOf(); + expect(data.astronaut.potionsThrown).toBeDefined(); + expect(data.astronaut.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.astronaut.potionsThrown).toEqualTypeOf(); + expect(data.astronaut.playTime).toBeDefined(); + expect(data.astronaut.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.astronaut.playTime).toEqualTypeOf(); + expect(data.astronaut.mobsSpawned).toBeDefined(); + expect(data.astronaut.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.astronaut.mobsSpawned).toEqualTypeOf(); + expect(data.astronaut.chestsOpened).toBeDefined(); + expect(data.astronaut.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.astronaut.chestsOpened).toEqualTypeOf(); + expect(data.troll).toBeDefined(); + expectTypeOf(data.troll).toEqualTypeOf(); + expect(data.troll.level).toBeDefined(); + expect(data.troll.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.troll.level).toEqualTypeOf(); + expect(data.troll.exp).toBeDefined(); + expect(data.troll.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.troll.exp).toEqualTypeOf(); + expect(data.troll.kills).toBeDefined(); + expect(data.troll.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.troll.kills).toEqualTypeOf(); + expect(data.troll.deaths).toBeDefined(); + expect(data.troll.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.troll.deaths).toEqualTypeOf(); + expect(data.troll.KDR).toBeDefined(); + expect(data.troll.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.troll.KDR).toEqualTypeOf(); + expect(data.troll.wins).toBeDefined(); + expect(data.troll.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.troll.wins).toEqualTypeOf(); + expect(data.troll.gamesPlayed).toBeDefined(); + expect(data.troll.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.troll.gamesPlayed).toEqualTypeOf(); + expect(data.troll.losses).toBeDefined(); + expect(data.troll.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.troll.losses).toEqualTypeOf(); + expect(data.troll.WLR).toBeDefined(); + expect(data.troll.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.troll.WLR).toEqualTypeOf(); + expect(data.troll.arrowsShot).toBeDefined(); + expect(data.troll.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.troll.arrowsShot).toEqualTypeOf(); + expect(data.troll.arrowsHit).toBeDefined(); + expect(data.troll.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.troll.arrowsHit).toEqualTypeOf(); + expect(data.troll.bowAccuracy).toBeDefined(); + expect(data.troll.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.troll.bowAccuracy).toEqualTypeOf(); + expect(data.troll.damage).toBeDefined(); + expect(data.troll.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.troll.damage).toEqualTypeOf(); + expect(data.troll.damageTaken).toBeDefined(); + expect(data.troll.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.troll.damageTaken).toEqualTypeOf(); + expect(data.troll.potionsDrunk).toBeDefined(); + expect(data.troll.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.troll.potionsDrunk).toEqualTypeOf(); + expect(data.troll.potionsThrown).toBeDefined(); + expect(data.troll.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.troll.potionsThrown).toEqualTypeOf(); + expect(data.troll.playTime).toBeDefined(); + expect(data.troll.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.troll.playTime).toEqualTypeOf(); + expect(data.troll.mobsSpawned).toBeDefined(); + expect(data.troll.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.troll.mobsSpawned).toEqualTypeOf(); + expect(data.troll.chestsOpened).toBeDefined(); + expect(data.troll.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.troll.chestsOpened).toEqualTypeOf(); + expect(data.reaper).toBeDefined(); + expectTypeOf(data.reaper).toEqualTypeOf(); + expect(data.reaper.level).toBeDefined(); + expect(data.reaper.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reaper.level).toEqualTypeOf(); + expect(data.reaper.exp).toBeDefined(); + expect(data.reaper.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reaper.exp).toEqualTypeOf(); + expect(data.reaper.kills).toBeDefined(); + expect(data.reaper.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reaper.kills).toEqualTypeOf(); + expect(data.reaper.deaths).toBeDefined(); + expect(data.reaper.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reaper.deaths).toEqualTypeOf(); + expect(data.reaper.KDR).toBeDefined(); + expect(data.reaper.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reaper.KDR).toEqualTypeOf(); + expect(data.reaper.wins).toBeDefined(); + expect(data.reaper.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reaper.wins).toEqualTypeOf(); + expect(data.reaper.gamesPlayed).toBeDefined(); + expect(data.reaper.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reaper.gamesPlayed).toEqualTypeOf(); + expect(data.reaper.losses).toBeDefined(); + expect(data.reaper.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reaper.losses).toEqualTypeOf(); + expect(data.reaper.WLR).toBeDefined(); + expect(data.reaper.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reaper.WLR).toEqualTypeOf(); + expect(data.reaper.arrowsShot).toBeDefined(); + expect(data.reaper.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reaper.arrowsShot).toEqualTypeOf(); + expect(data.reaper.arrowsHit).toBeDefined(); + expect(data.reaper.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reaper.arrowsHit).toEqualTypeOf(); + expect(data.reaper.bowAccuracy).toBeDefined(); + expect(data.reaper.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reaper.bowAccuracy).toEqualTypeOf(); + expect(data.reaper.damage).toBeDefined(); + expect(data.reaper.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reaper.damage).toEqualTypeOf(); + expect(data.reaper.damageTaken).toBeDefined(); + expect(data.reaper.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reaper.damageTaken).toEqualTypeOf(); + expect(data.reaper.potionsDrunk).toBeDefined(); + expect(data.reaper.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reaper.potionsDrunk).toEqualTypeOf(); + expect(data.reaper.potionsThrown).toBeDefined(); + expect(data.reaper.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reaper.potionsThrown).toEqualTypeOf(); + expect(data.reaper.playTime).toBeDefined(); + expect(data.reaper.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reaper.playTime).toEqualTypeOf(); + expect(data.reaper.mobsSpawned).toBeDefined(); + expect(data.reaper.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reaper.mobsSpawned).toEqualTypeOf(); + expect(data.reaper.chestsOpened).toBeDefined(); + expect(data.reaper.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reaper.chestsOpened).toEqualTypeOf(); + expect(data.shark).toBeDefined(); + expectTypeOf(data.shark).toEqualTypeOf(); + expect(data.shark.level).toBeDefined(); + expect(data.shark.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shark.level).toEqualTypeOf(); + expect(data.shark.exp).toBeDefined(); + expect(data.shark.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shark.exp).toEqualTypeOf(); + expect(data.shark.kills).toBeDefined(); + expect(data.shark.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shark.kills).toEqualTypeOf(); + expect(data.shark.deaths).toBeDefined(); + expect(data.shark.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shark.deaths).toEqualTypeOf(); + expect(data.shark.KDR).toBeDefined(); + expect(data.shark.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shark.KDR).toEqualTypeOf(); + expect(data.shark.wins).toBeDefined(); + expect(data.shark.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shark.wins).toEqualTypeOf(); + expect(data.shark.gamesPlayed).toBeDefined(); + expect(data.shark.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shark.gamesPlayed).toEqualTypeOf(); + expect(data.shark.losses).toBeDefined(); + expect(data.shark.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shark.losses).toEqualTypeOf(); + expect(data.shark.WLR).toBeDefined(); + expect(data.shark.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shark.WLR).toEqualTypeOf(); + expect(data.shark.arrowsShot).toBeDefined(); + expect(data.shark.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shark.arrowsShot).toEqualTypeOf(); + expect(data.shark.arrowsHit).toBeDefined(); + expect(data.shark.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shark.arrowsHit).toEqualTypeOf(); + expect(data.shark.bowAccuracy).toBeDefined(); + expect(data.shark.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shark.bowAccuracy).toEqualTypeOf(); + expect(data.shark.damage).toBeDefined(); + expect(data.shark.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shark.damage).toEqualTypeOf(); + expect(data.shark.damageTaken).toBeDefined(); + expect(data.shark.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shark.damageTaken).toEqualTypeOf(); + expect(data.shark.potionsDrunk).toBeDefined(); + expect(data.shark.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shark.potionsDrunk).toEqualTypeOf(); + expect(data.shark.potionsThrown).toBeDefined(); + expect(data.shark.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shark.potionsThrown).toEqualTypeOf(); + expect(data.shark.playTime).toBeDefined(); + expect(data.shark.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shark.playTime).toEqualTypeOf(); + expect(data.shark.mobsSpawned).toBeDefined(); + expect(data.shark.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shark.mobsSpawned).toEqualTypeOf(); + expect(data.shark.chestsOpened).toBeDefined(); + expect(data.shark.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shark.chestsOpened).toEqualTypeOf(); + expect(data.reddragon).toBeDefined(); + expectTypeOf(data.reddragon).toEqualTypeOf(); + expect(data.reddragon.level).toBeDefined(); + expect(data.reddragon.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reddragon.level).toEqualTypeOf(); + expect(data.reddragon.exp).toBeDefined(); + expect(data.reddragon.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reddragon.exp).toEqualTypeOf(); + expect(data.reddragon.kills).toBeDefined(); + expect(data.reddragon.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reddragon.kills).toEqualTypeOf(); + expect(data.reddragon.deaths).toBeDefined(); + expect(data.reddragon.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reddragon.deaths).toEqualTypeOf(); + expect(data.reddragon.KDR).toBeDefined(); + expect(data.reddragon.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reddragon.KDR).toEqualTypeOf(); + expect(data.reddragon.wins).toBeDefined(); + expect(data.reddragon.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reddragon.wins).toEqualTypeOf(); + expect(data.reddragon.gamesPlayed).toBeDefined(); + expect(data.reddragon.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reddragon.gamesPlayed).toEqualTypeOf(); + expect(data.reddragon.losses).toBeDefined(); + expect(data.reddragon.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reddragon.losses).toEqualTypeOf(); + expect(data.reddragon.WLR).toBeDefined(); + expect(data.reddragon.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reddragon.WLR).toEqualTypeOf(); + expect(data.reddragon.arrowsShot).toBeDefined(); + expect(data.reddragon.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reddragon.arrowsShot).toEqualTypeOf(); + expect(data.reddragon.arrowsHit).toBeDefined(); + expect(data.reddragon.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reddragon.arrowsHit).toEqualTypeOf(); + expect(data.reddragon.bowAccuracy).toBeDefined(); + expect(data.reddragon.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reddragon.bowAccuracy).toEqualTypeOf(); + expect(data.reddragon.damage).toBeDefined(); + expect(data.reddragon.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reddragon.damage).toEqualTypeOf(); + expect(data.reddragon.damageTaken).toBeDefined(); + expect(data.reddragon.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reddragon.damageTaken).toEqualTypeOf(); + expect(data.reddragon.potionsDrunk).toBeDefined(); + expect(data.reddragon.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reddragon.potionsDrunk).toEqualTypeOf(); + expect(data.reddragon.potionsThrown).toBeDefined(); + expect(data.reddragon.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reddragon.potionsThrown).toEqualTypeOf(); + expect(data.reddragon.playTime).toBeDefined(); + expect(data.reddragon.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reddragon.playTime).toEqualTypeOf(); + expect(data.reddragon.mobsSpawned).toBeDefined(); + expect(data.reddragon.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reddragon.mobsSpawned).toEqualTypeOf(); + expect(data.reddragon.chestsOpened).toBeDefined(); + expect(data.reddragon.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reddragon.chestsOpened).toEqualTypeOf(); + expect(data.toxicologist).toBeDefined(); + expectTypeOf(data.toxicologist).toEqualTypeOf(); + expect(data.toxicologist.level).toBeDefined(); + expect(data.toxicologist.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.toxicologist.level).toEqualTypeOf(); + expect(data.toxicologist.exp).toBeDefined(); + expect(data.toxicologist.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.toxicologist.exp).toEqualTypeOf(); + expect(data.toxicologist.kills).toBeDefined(); + expect(data.toxicologist.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.toxicologist.kills).toEqualTypeOf(); + expect(data.toxicologist.deaths).toBeDefined(); + expect(data.toxicologist.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.toxicologist.deaths).toEqualTypeOf(); + expect(data.toxicologist.KDR).toBeDefined(); + expect(data.toxicologist.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.toxicologist.KDR).toEqualTypeOf(); + expect(data.toxicologist.wins).toBeDefined(); + expect(data.toxicologist.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.toxicologist.wins).toEqualTypeOf(); + expect(data.toxicologist.gamesPlayed).toBeDefined(); + expect(data.toxicologist.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.toxicologist.gamesPlayed).toEqualTypeOf(); + expect(data.toxicologist.losses).toBeDefined(); + expect(data.toxicologist.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.toxicologist.losses).toEqualTypeOf(); + expect(data.toxicologist.WLR).toBeDefined(); + expect(data.toxicologist.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.toxicologist.WLR).toEqualTypeOf(); + expect(data.toxicologist.arrowsShot).toBeDefined(); + expect(data.toxicologist.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.toxicologist.arrowsShot).toEqualTypeOf(); + expect(data.toxicologist.arrowsHit).toBeDefined(); + expect(data.toxicologist.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.toxicologist.arrowsHit).toEqualTypeOf(); + expect(data.toxicologist.bowAccuracy).toBeDefined(); + expect(data.toxicologist.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.toxicologist.bowAccuracy).toEqualTypeOf(); + expect(data.toxicologist.damage).toBeDefined(); + expect(data.toxicologist.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.toxicologist.damage).toEqualTypeOf(); + expect(data.toxicologist.damageTaken).toBeDefined(); + expect(data.toxicologist.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.toxicologist.damageTaken).toEqualTypeOf(); + expect(data.toxicologist.potionsDrunk).toBeDefined(); + expect(data.toxicologist.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.toxicologist.potionsDrunk).toEqualTypeOf(); + expect(data.toxicologist.potionsThrown).toBeDefined(); + expect(data.toxicologist.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.toxicologist.potionsThrown).toEqualTypeOf(); + expect(data.toxicologist.playTime).toBeDefined(); + expect(data.toxicologist.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.toxicologist.playTime).toEqualTypeOf(); + expect(data.toxicologist.mobsSpawned).toBeDefined(); + expect(data.toxicologist.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.toxicologist.mobsSpawned).toEqualTypeOf(); + expect(data.toxicologist.chestsOpened).toBeDefined(); + expect(data.toxicologist.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.toxicologist.chestsOpened).toEqualTypeOf(); + expect(data.rogue).toBeDefined(); + expectTypeOf(data.rogue).toEqualTypeOf(); + expect(data.rogue.level).toBeDefined(); + expect(data.rogue.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rogue.level).toEqualTypeOf(); + expect(data.rogue.exp).toBeDefined(); + expect(data.rogue.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rogue.exp).toEqualTypeOf(); + expect(data.rogue.kills).toBeDefined(); + expect(data.rogue.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rogue.kills).toEqualTypeOf(); + expect(data.rogue.deaths).toBeDefined(); + expect(data.rogue.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rogue.deaths).toEqualTypeOf(); + expect(data.rogue.KDR).toBeDefined(); + expect(data.rogue.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rogue.KDR).toEqualTypeOf(); + expect(data.rogue.wins).toBeDefined(); + expect(data.rogue.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rogue.wins).toEqualTypeOf(); + expect(data.rogue.gamesPlayed).toBeDefined(); + expect(data.rogue.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rogue.gamesPlayed).toEqualTypeOf(); + expect(data.rogue.losses).toBeDefined(); + expect(data.rogue.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rogue.losses).toEqualTypeOf(); + expect(data.rogue.WLR).toBeDefined(); + expect(data.rogue.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rogue.WLR).toEqualTypeOf(); + expect(data.rogue.arrowsShot).toBeDefined(); + expect(data.rogue.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rogue.arrowsShot).toEqualTypeOf(); + expect(data.rogue.arrowsHit).toBeDefined(); + expect(data.rogue.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rogue.arrowsHit).toEqualTypeOf(); + expect(data.rogue.bowAccuracy).toBeDefined(); + expect(data.rogue.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rogue.bowAccuracy).toEqualTypeOf(); + expect(data.rogue.damage).toBeDefined(); + expect(data.rogue.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rogue.damage).toEqualTypeOf(); + expect(data.rogue.damageTaken).toBeDefined(); + expect(data.rogue.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rogue.damageTaken).toEqualTypeOf(); + expect(data.rogue.potionsDrunk).toBeDefined(); + expect(data.rogue.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rogue.potionsDrunk).toEqualTypeOf(); + expect(data.rogue.potionsThrown).toBeDefined(); + expect(data.rogue.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rogue.potionsThrown).toEqualTypeOf(); + expect(data.rogue.playTime).toBeDefined(); + expect(data.rogue.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rogue.playTime).toEqualTypeOf(); + expect(data.rogue.mobsSpawned).toBeDefined(); + expect(data.rogue.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rogue.mobsSpawned).toEqualTypeOf(); + expect(data.rogue.chestsOpened).toBeDefined(); + expect(data.rogue.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rogue.chestsOpened).toEqualTypeOf(); + expect(data.warlock).toBeDefined(); + expectTypeOf(data.warlock).toEqualTypeOf(); + expect(data.warlock.level).toBeDefined(); + expect(data.warlock.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.warlock.level).toEqualTypeOf(); + expect(data.warlock.exp).toBeDefined(); + expect(data.warlock.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.warlock.exp).toEqualTypeOf(); + expect(data.warlock.kills).toBeDefined(); + expect(data.warlock.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.warlock.kills).toEqualTypeOf(); + expect(data.warlock.deaths).toBeDefined(); + expect(data.warlock.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.warlock.deaths).toEqualTypeOf(); + expect(data.warlock.KDR).toBeDefined(); + expect(data.warlock.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.warlock.KDR).toEqualTypeOf(); + expect(data.warlock.wins).toBeDefined(); + expect(data.warlock.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.warlock.wins).toEqualTypeOf(); + expect(data.warlock.gamesPlayed).toBeDefined(); + expect(data.warlock.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.warlock.gamesPlayed).toEqualTypeOf(); + expect(data.warlock.losses).toBeDefined(); + expect(data.warlock.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.warlock.losses).toEqualTypeOf(); + expect(data.warlock.WLR).toBeDefined(); + expect(data.warlock.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.warlock.WLR).toEqualTypeOf(); + expect(data.warlock.arrowsShot).toBeDefined(); + expect(data.warlock.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.warlock.arrowsShot).toEqualTypeOf(); + expect(data.warlock.arrowsHit).toBeDefined(); + expect(data.warlock.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.warlock.arrowsHit).toEqualTypeOf(); + expect(data.warlock.bowAccuracy).toBeDefined(); + expect(data.warlock.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.warlock.bowAccuracy).toEqualTypeOf(); + expect(data.warlock.damage).toBeDefined(); + expect(data.warlock.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.warlock.damage).toEqualTypeOf(); + expect(data.warlock.damageTaken).toBeDefined(); + expect(data.warlock.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.warlock.damageTaken).toEqualTypeOf(); + expect(data.warlock.potionsDrunk).toBeDefined(); + expect(data.warlock.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.warlock.potionsDrunk).toEqualTypeOf(); + expect(data.warlock.potionsThrown).toBeDefined(); + expect(data.warlock.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.warlock.potionsThrown).toEqualTypeOf(); + expect(data.warlock.playTime).toBeDefined(); + expect(data.warlock.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.warlock.playTime).toEqualTypeOf(); + expect(data.warlock.mobsSpawned).toBeDefined(); + expect(data.warlock.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.warlock.mobsSpawned).toEqualTypeOf(); + expect(data.warlock.chestsOpened).toBeDefined(); + expect(data.warlock.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.warlock.chestsOpened).toEqualTypeOf(); + expect(data.slimeyslime).toBeDefined(); + expectTypeOf(data.slimeyslime).toEqualTypeOf(); + expect(data.slimeyslime.level).toBeDefined(); + expect(data.slimeyslime.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slimeyslime.level).toEqualTypeOf(); + expect(data.slimeyslime.exp).toBeDefined(); + expect(data.slimeyslime.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slimeyslime.exp).toEqualTypeOf(); + expect(data.slimeyslime.kills).toBeDefined(); + expect(data.slimeyslime.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slimeyslime.kills).toEqualTypeOf(); + expect(data.slimeyslime.deaths).toBeDefined(); + expect(data.slimeyslime.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slimeyslime.deaths).toEqualTypeOf(); + expect(data.slimeyslime.KDR).toBeDefined(); + expect(data.slimeyslime.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slimeyslime.KDR).toEqualTypeOf(); + expect(data.slimeyslime.wins).toBeDefined(); + expect(data.slimeyslime.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slimeyslime.wins).toEqualTypeOf(); + expect(data.slimeyslime.gamesPlayed).toBeDefined(); + expect(data.slimeyslime.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slimeyslime.gamesPlayed).toEqualTypeOf(); + expect(data.slimeyslime.losses).toBeDefined(); + expect(data.slimeyslime.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slimeyslime.losses).toEqualTypeOf(); + expect(data.slimeyslime.WLR).toBeDefined(); + expect(data.slimeyslime.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slimeyslime.WLR).toEqualTypeOf(); + expect(data.slimeyslime.arrowsShot).toBeDefined(); + expect(data.slimeyslime.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slimeyslime.arrowsShot).toEqualTypeOf(); + expect(data.slimeyslime.arrowsHit).toBeDefined(); + expect(data.slimeyslime.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slimeyslime.arrowsHit).toEqualTypeOf(); + expect(data.slimeyslime.bowAccuracy).toBeDefined(); + expect(data.slimeyslime.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slimeyslime.bowAccuracy).toEqualTypeOf(); + expect(data.slimeyslime.damage).toBeDefined(); + expect(data.slimeyslime.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slimeyslime.damage).toEqualTypeOf(); + expect(data.slimeyslime.damageTaken).toBeDefined(); + expect(data.slimeyslime.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slimeyslime.damageTaken).toEqualTypeOf(); + expect(data.slimeyslime.potionsDrunk).toBeDefined(); + expect(data.slimeyslime.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slimeyslime.potionsDrunk).toEqualTypeOf(); + expect(data.slimeyslime.potionsThrown).toBeDefined(); + expect(data.slimeyslime.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slimeyslime.potionsThrown).toEqualTypeOf(); + expect(data.slimeyslime.playTime).toBeDefined(); + expect(data.slimeyslime.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slimeyslime.playTime).toEqualTypeOf(); + expect(data.slimeyslime.mobsSpawned).toBeDefined(); + expect(data.slimeyslime.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slimeyslime.mobsSpawned).toEqualTypeOf(); + expect(data.slimeyslime.chestsOpened).toBeDefined(); + expect(data.slimeyslime.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slimeyslime.chestsOpened).toEqualTypeOf(); + expect(data.jockey).toBeDefined(); + expectTypeOf(data.jockey).toEqualTypeOf(); + expect(data.jockey.level).toBeDefined(); + expect(data.jockey.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jockey.level).toEqualTypeOf(); + expect(data.jockey.exp).toBeDefined(); + expect(data.jockey.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jockey.exp).toEqualTypeOf(); + expect(data.jockey.kills).toBeDefined(); + expect(data.jockey.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jockey.kills).toEqualTypeOf(); + expect(data.jockey.deaths).toBeDefined(); + expect(data.jockey.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jockey.deaths).toEqualTypeOf(); + expect(data.jockey.KDR).toBeDefined(); + expect(data.jockey.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jockey.KDR).toEqualTypeOf(); + expect(data.jockey.wins).toBeDefined(); + expect(data.jockey.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jockey.wins).toEqualTypeOf(); + expect(data.jockey.gamesPlayed).toBeDefined(); + expect(data.jockey.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jockey.gamesPlayed).toEqualTypeOf(); + expect(data.jockey.losses).toBeDefined(); + expect(data.jockey.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jockey.losses).toEqualTypeOf(); + expect(data.jockey.WLR).toBeDefined(); + expect(data.jockey.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jockey.WLR).toEqualTypeOf(); + expect(data.jockey.arrowsShot).toBeDefined(); + expect(data.jockey.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jockey.arrowsShot).toEqualTypeOf(); + expect(data.jockey.arrowsHit).toBeDefined(); + expect(data.jockey.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jockey.arrowsHit).toEqualTypeOf(); + expect(data.jockey.bowAccuracy).toBeDefined(); + expect(data.jockey.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jockey.bowAccuracy).toEqualTypeOf(); + expect(data.jockey.damage).toBeDefined(); + expect(data.jockey.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jockey.damage).toEqualTypeOf(); + expect(data.jockey.damageTaken).toBeDefined(); + expect(data.jockey.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jockey.damageTaken).toEqualTypeOf(); + expect(data.jockey.potionsDrunk).toBeDefined(); + expect(data.jockey.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jockey.potionsDrunk).toEqualTypeOf(); + expect(data.jockey.potionsThrown).toBeDefined(); + expect(data.jockey.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jockey.potionsThrown).toEqualTypeOf(); + expect(data.jockey.playTime).toBeDefined(); + expect(data.jockey.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jockey.playTime).toEqualTypeOf(); + expect(data.jockey.mobsSpawned).toBeDefined(); + expect(data.jockey.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jockey.mobsSpawned).toEqualTypeOf(); + expect(data.jockey.chestsOpened).toBeDefined(); + expect(data.jockey.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jockey.chestsOpened).toEqualTypeOf(); + expect(data.golem).toBeDefined(); + expectTypeOf(data.golem).toEqualTypeOf(); + expect(data.golem.level).toBeDefined(); + expect(data.golem.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.golem.level).toEqualTypeOf(); + expect(data.golem.exp).toBeDefined(); + expect(data.golem.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.golem.exp).toEqualTypeOf(); + expect(data.golem.kills).toBeDefined(); + expect(data.golem.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.golem.kills).toEqualTypeOf(); + expect(data.golem.deaths).toBeDefined(); + expect(data.golem.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.golem.deaths).toEqualTypeOf(); + expect(data.golem.KDR).toBeDefined(); + expect(data.golem.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.golem.KDR).toEqualTypeOf(); + expect(data.golem.wins).toBeDefined(); + expect(data.golem.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.golem.wins).toEqualTypeOf(); + expect(data.golem.gamesPlayed).toBeDefined(); + expect(data.golem.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.golem.gamesPlayed).toEqualTypeOf(); + expect(data.golem.losses).toBeDefined(); + expect(data.golem.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.golem.losses).toEqualTypeOf(); + expect(data.golem.WLR).toBeDefined(); + expect(data.golem.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.golem.WLR).toEqualTypeOf(); + expect(data.golem.arrowsShot).toBeDefined(); + expect(data.golem.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.golem.arrowsShot).toEqualTypeOf(); + expect(data.golem.arrowsHit).toBeDefined(); + expect(data.golem.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.golem.arrowsHit).toEqualTypeOf(); + expect(data.golem.bowAccuracy).toBeDefined(); + expect(data.golem.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.golem.bowAccuracy).toEqualTypeOf(); + expect(data.golem.damage).toBeDefined(); + expect(data.golem.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.golem.damage).toEqualTypeOf(); + expect(data.golem.damageTaken).toBeDefined(); + expect(data.golem.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.golem.damageTaken).toEqualTypeOf(); + expect(data.golem.potionsDrunk).toBeDefined(); + expect(data.golem.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.golem.potionsDrunk).toEqualTypeOf(); + expect(data.golem.potionsThrown).toBeDefined(); + expect(data.golem.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.golem.potionsThrown).toEqualTypeOf(); + expect(data.golem.playTime).toBeDefined(); + expect(data.golem.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.golem.playTime).toEqualTypeOf(); + expect(data.golem.mobsSpawned).toBeDefined(); + expect(data.golem.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.golem.mobsSpawned).toEqualTypeOf(); + expect(data.golem.chestsOpened).toBeDefined(); + expect(data.golem.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.golem.chestsOpened).toEqualTypeOf(); + expect(data.viking).toBeDefined(); + expectTypeOf(data.viking).toEqualTypeOf(); + expect(data.viking.level).toBeDefined(); + expect(data.viking.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.viking.level).toEqualTypeOf(); + expect(data.viking.exp).toBeDefined(); + expect(data.viking.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.viking.exp).toEqualTypeOf(); + expect(data.viking.kills).toBeDefined(); + expect(data.viking.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.viking.kills).toEqualTypeOf(); + expect(data.viking.deaths).toBeDefined(); + expect(data.viking.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.viking.deaths).toEqualTypeOf(); + expect(data.viking.KDR).toBeDefined(); + expect(data.viking.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.viking.KDR).toEqualTypeOf(); + expect(data.viking.wins).toBeDefined(); + expect(data.viking.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.viking.wins).toEqualTypeOf(); + expect(data.viking.gamesPlayed).toBeDefined(); + expect(data.viking.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.viking.gamesPlayed).toEqualTypeOf(); + expect(data.viking.losses).toBeDefined(); + expect(data.viking.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.viking.losses).toEqualTypeOf(); + expect(data.viking.WLR).toBeDefined(); + expect(data.viking.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.viking.WLR).toEqualTypeOf(); + expect(data.viking.arrowsShot).toBeDefined(); + expect(data.viking.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.viking.arrowsShot).toEqualTypeOf(); + expect(data.viking.arrowsHit).toBeDefined(); + expect(data.viking.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.viking.arrowsHit).toEqualTypeOf(); + expect(data.viking.bowAccuracy).toBeDefined(); + expect(data.viking.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.viking.bowAccuracy).toEqualTypeOf(); + expect(data.viking.damage).toBeDefined(); + expect(data.viking.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.viking.damage).toEqualTypeOf(); + expect(data.viking.damageTaken).toBeDefined(); + expect(data.viking.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.viking.damageTaken).toEqualTypeOf(); + expect(data.viking.potionsDrunk).toBeDefined(); + expect(data.viking.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.viking.potionsDrunk).toEqualTypeOf(); + expect(data.viking.potionsThrown).toBeDefined(); + expect(data.viking.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.viking.potionsThrown).toEqualTypeOf(); + expect(data.viking.playTime).toBeDefined(); + expect(data.viking.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.viking.playTime).toEqualTypeOf(); + expect(data.viking.mobsSpawned).toBeDefined(); + expect(data.viking.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.viking.mobsSpawned).toEqualTypeOf(); + expect(data.viking.chestsOpened).toBeDefined(); + expect(data.viking.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.viking.chestsOpened).toEqualTypeOf(); + expect(data.shadowKnight).toBeDefined(); + expectTypeOf(data.shadowKnight).toEqualTypeOf(); + expect(data.shadowKnight.level).toBeDefined(); + expect(data.shadowKnight.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shadowKnight.level).toEqualTypeOf(); + expect(data.shadowKnight.exp).toBeDefined(); + expect(data.shadowKnight.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shadowKnight.exp).toEqualTypeOf(); + expect(data.shadowKnight.kills).toBeDefined(); + expect(data.shadowKnight.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shadowKnight.kills).toEqualTypeOf(); + expect(data.shadowKnight.deaths).toBeDefined(); + expect(data.shadowKnight.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shadowKnight.deaths).toEqualTypeOf(); + expect(data.shadowKnight.KDR).toBeDefined(); + expect(data.shadowKnight.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shadowKnight.KDR).toEqualTypeOf(); + expect(data.shadowKnight.wins).toBeDefined(); + expect(data.shadowKnight.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shadowKnight.wins).toEqualTypeOf(); + expect(data.shadowKnight.gamesPlayed).toBeDefined(); + expect(data.shadowKnight.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shadowKnight.gamesPlayed).toEqualTypeOf(); + expect(data.shadowKnight.losses).toBeDefined(); + expect(data.shadowKnight.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shadowKnight.losses).toEqualTypeOf(); + expect(data.shadowKnight.WLR).toBeDefined(); + expect(data.shadowKnight.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shadowKnight.WLR).toEqualTypeOf(); + expect(data.shadowKnight.arrowsShot).toBeDefined(); + expect(data.shadowKnight.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shadowKnight.arrowsShot).toEqualTypeOf(); + expect(data.shadowKnight.arrowsHit).toBeDefined(); + expect(data.shadowKnight.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shadowKnight.arrowsHit).toEqualTypeOf(); + expect(data.shadowKnight.bowAccuracy).toBeDefined(); + expect(data.shadowKnight.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shadowKnight.bowAccuracy).toEqualTypeOf(); + expect(data.shadowKnight.damage).toBeDefined(); + expect(data.shadowKnight.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shadowKnight.damage).toEqualTypeOf(); + expect(data.shadowKnight.damageTaken).toBeDefined(); + expect(data.shadowKnight.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shadowKnight.damageTaken).toEqualTypeOf(); + expect(data.shadowKnight.potionsDrunk).toBeDefined(); + expect(data.shadowKnight.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shadowKnight.potionsDrunk).toEqualTypeOf(); + expect(data.shadowKnight.potionsThrown).toBeDefined(); + expect(data.shadowKnight.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shadowKnight.potionsThrown).toEqualTypeOf(); + expect(data.shadowKnight.playTime).toBeDefined(); + expect(data.shadowKnight.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shadowKnight.playTime).toEqualTypeOf(); + expect(data.shadowKnight.mobsSpawned).toBeDefined(); + expect(data.shadowKnight.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shadowKnight.mobsSpawned).toEqualTypeOf(); + expect(data.shadowKnight.chestsOpened).toBeDefined(); + expect(data.shadowKnight.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shadowKnight.chestsOpened).toEqualTypeOf(); + expect(data.pigman).toBeDefined(); + expectTypeOf(data.pigman).toEqualTypeOf(); + expect(data.pigman.level).toBeDefined(); + expect(data.pigman.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pigman.level).toEqualTypeOf(); + expect(data.pigman.exp).toBeDefined(); + expect(data.pigman.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pigman.exp).toEqualTypeOf(); + expect(data.pigman.kills).toBeDefined(); + expect(data.pigman.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pigman.kills).toEqualTypeOf(); + expect(data.pigman.deaths).toBeDefined(); + expect(data.pigman.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pigman.deaths).toEqualTypeOf(); + expect(data.pigman.KDR).toBeDefined(); + expect(data.pigman.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pigman.KDR).toEqualTypeOf(); + expect(data.pigman.wins).toBeDefined(); + expect(data.pigman.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pigman.wins).toEqualTypeOf(); + expect(data.pigman.gamesPlayed).toBeDefined(); + expect(data.pigman.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pigman.gamesPlayed).toEqualTypeOf(); + expect(data.pigman.losses).toBeDefined(); + expect(data.pigman.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pigman.losses).toEqualTypeOf(); + expect(data.pigman.WLR).toBeDefined(); + expect(data.pigman.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pigman.WLR).toEqualTypeOf(); + expect(data.pigman.arrowsShot).toBeDefined(); + expect(data.pigman.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pigman.arrowsShot).toEqualTypeOf(); + expect(data.pigman.arrowsHit).toBeDefined(); + expect(data.pigman.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pigman.arrowsHit).toEqualTypeOf(); + expect(data.pigman.bowAccuracy).toBeDefined(); + expect(data.pigman.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pigman.bowAccuracy).toEqualTypeOf(); + expect(data.pigman.damage).toBeDefined(); + expect(data.pigman.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pigman.damage).toEqualTypeOf(); + expect(data.pigman.damageTaken).toBeDefined(); + expect(data.pigman.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pigman.damageTaken).toEqualTypeOf(); + expect(data.pigman.potionsDrunk).toBeDefined(); + expect(data.pigman.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pigman.potionsDrunk).toEqualTypeOf(); + expect(data.pigman.potionsThrown).toBeDefined(); + expect(data.pigman.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pigman.potionsThrown).toEqualTypeOf(); + expect(data.pigman.playTime).toBeDefined(); + expect(data.pigman.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pigman.playTime).toEqualTypeOf(); + expect(data.pigman.mobsSpawned).toBeDefined(); + expect(data.pigman.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pigman.mobsSpawned).toEqualTypeOf(); + expect(data.pigman.chestsOpened).toBeDefined(); + expect(data.pigman.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pigman.chestsOpened).toEqualTypeOf(); + expect(data.paladin).toBeDefined(); + expectTypeOf(data.paladin).toEqualTypeOf(); + expect(data.paladin.level).toBeDefined(); + expect(data.paladin.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.paladin.level).toEqualTypeOf(); + expect(data.paladin.exp).toBeDefined(); + expect(data.paladin.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.paladin.exp).toEqualTypeOf(); + expect(data.paladin.kills).toBeDefined(); + expect(data.paladin.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.paladin.kills).toEqualTypeOf(); + expect(data.paladin.deaths).toBeDefined(); + expect(data.paladin.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.paladin.deaths).toEqualTypeOf(); + expect(data.paladin.KDR).toBeDefined(); + expect(data.paladin.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.paladin.KDR).toEqualTypeOf(); + expect(data.paladin.wins).toBeDefined(); + expect(data.paladin.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.paladin.wins).toEqualTypeOf(); + expect(data.paladin.gamesPlayed).toBeDefined(); + expect(data.paladin.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.paladin.gamesPlayed).toEqualTypeOf(); + expect(data.paladin.losses).toBeDefined(); + expect(data.paladin.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.paladin.losses).toEqualTypeOf(); + expect(data.paladin.WLR).toBeDefined(); + expect(data.paladin.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.paladin.WLR).toEqualTypeOf(); + expect(data.paladin.arrowsShot).toBeDefined(); + expect(data.paladin.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.paladin.arrowsShot).toEqualTypeOf(); + expect(data.paladin.arrowsHit).toBeDefined(); + expect(data.paladin.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.paladin.arrowsHit).toEqualTypeOf(); + expect(data.paladin.bowAccuracy).toBeDefined(); + expect(data.paladin.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.paladin.bowAccuracy).toEqualTypeOf(); + expect(data.paladin.damage).toBeDefined(); + expect(data.paladin.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.paladin.damage).toEqualTypeOf(); + expect(data.paladin.damageTaken).toBeDefined(); + expect(data.paladin.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.paladin.damageTaken).toEqualTypeOf(); + expect(data.paladin.potionsDrunk).toBeDefined(); + expect(data.paladin.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.paladin.potionsDrunk).toEqualTypeOf(); + expect(data.paladin.potionsThrown).toBeDefined(); + expect(data.paladin.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.paladin.potionsThrown).toEqualTypeOf(); + expect(data.paladin.playTime).toBeDefined(); + expect(data.paladin.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.paladin.playTime).toEqualTypeOf(); + expect(data.paladin.mobsSpawned).toBeDefined(); + expect(data.paladin.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.paladin.mobsSpawned).toEqualTypeOf(); + expect(data.paladin.chestsOpened).toBeDefined(); + expect(data.paladin.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.paladin.chestsOpened).toEqualTypeOf(); + expect(data.necromancer).toBeDefined(); + expectTypeOf(data.necromancer).toEqualTypeOf(); + expect(data.necromancer.level).toBeDefined(); + expect(data.necromancer.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.necromancer.level).toEqualTypeOf(); + expect(data.necromancer.exp).toBeDefined(); + expect(data.necromancer.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.necromancer.exp).toEqualTypeOf(); + expect(data.necromancer.kills).toBeDefined(); + expect(data.necromancer.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.necromancer.kills).toEqualTypeOf(); + expect(data.necromancer.deaths).toBeDefined(); + expect(data.necromancer.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.necromancer.deaths).toEqualTypeOf(); + expect(data.necromancer.KDR).toBeDefined(); + expect(data.necromancer.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.necromancer.KDR).toEqualTypeOf(); + expect(data.necromancer.wins).toBeDefined(); + expect(data.necromancer.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.necromancer.wins).toEqualTypeOf(); + expect(data.necromancer.gamesPlayed).toBeDefined(); + expect(data.necromancer.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.necromancer.gamesPlayed).toEqualTypeOf(); + expect(data.necromancer.losses).toBeDefined(); + expect(data.necromancer.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.necromancer.losses).toEqualTypeOf(); + expect(data.necromancer.WLR).toBeDefined(); + expect(data.necromancer.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.necromancer.WLR).toEqualTypeOf(); + expect(data.necromancer.arrowsShot).toBeDefined(); + expect(data.necromancer.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.necromancer.arrowsShot).toEqualTypeOf(); + expect(data.necromancer.arrowsHit).toBeDefined(); + expect(data.necromancer.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.necromancer.arrowsHit).toEqualTypeOf(); + expect(data.necromancer.bowAccuracy).toBeDefined(); + expect(data.necromancer.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.necromancer.bowAccuracy).toEqualTypeOf(); + expect(data.necromancer.damage).toBeDefined(); + expect(data.necromancer.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.necromancer.damage).toEqualTypeOf(); + expect(data.necromancer.damageTaken).toBeDefined(); + expect(data.necromancer.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.necromancer.damageTaken).toEqualTypeOf(); + expect(data.necromancer.potionsDrunk).toBeDefined(); + expect(data.necromancer.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.necromancer.potionsDrunk).toEqualTypeOf(); + expect(data.necromancer.potionsThrown).toBeDefined(); + expect(data.necromancer.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.necromancer.potionsThrown).toEqualTypeOf(); + expect(data.necromancer.playTime).toBeDefined(); + expect(data.necromancer.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.necromancer.playTime).toEqualTypeOf(); + expect(data.necromancer.mobsSpawned).toBeDefined(); + expect(data.necromancer.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.necromancer.mobsSpawned).toEqualTypeOf(); + expect(data.necromancer.chestsOpened).toBeDefined(); + expect(data.necromancer.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.necromancer.chestsOpened).toEqualTypeOf(); + expect(data.florist).toBeDefined(); + expectTypeOf(data.florist).toEqualTypeOf(); + expect(data.florist.level).toBeDefined(); + expect(data.florist.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.florist.level).toEqualTypeOf(); + expect(data.florist.exp).toBeDefined(); + expect(data.florist.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.florist.exp).toEqualTypeOf(); + expect(data.florist.kills).toBeDefined(); + expect(data.florist.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.florist.kills).toEqualTypeOf(); + expect(data.florist.deaths).toBeDefined(); + expect(data.florist.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.florist.deaths).toEqualTypeOf(); + expect(data.florist.KDR).toBeDefined(); + expect(data.florist.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.florist.KDR).toEqualTypeOf(); + expect(data.florist.wins).toBeDefined(); + expect(data.florist.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.florist.wins).toEqualTypeOf(); + expect(data.florist.gamesPlayed).toBeDefined(); + expect(data.florist.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.florist.gamesPlayed).toEqualTypeOf(); + expect(data.florist.losses).toBeDefined(); + expect(data.florist.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.florist.losses).toEqualTypeOf(); + expect(data.florist.WLR).toBeDefined(); + expect(data.florist.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.florist.WLR).toEqualTypeOf(); + expect(data.florist.arrowsShot).toBeDefined(); + expect(data.florist.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.florist.arrowsShot).toEqualTypeOf(); + expect(data.florist.arrowsHit).toBeDefined(); + expect(data.florist.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.florist.arrowsHit).toEqualTypeOf(); + expect(data.florist.bowAccuracy).toBeDefined(); + expect(data.florist.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.florist.bowAccuracy).toEqualTypeOf(); + expect(data.florist.damage).toBeDefined(); + expect(data.florist.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.florist.damage).toEqualTypeOf(); + expect(data.florist.damageTaken).toBeDefined(); + expect(data.florist.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.florist.damageTaken).toEqualTypeOf(); + expect(data.florist.potionsDrunk).toBeDefined(); + expect(data.florist.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.florist.potionsDrunk).toEqualTypeOf(); + expect(data.florist.potionsThrown).toBeDefined(); + expect(data.florist.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.florist.potionsThrown).toEqualTypeOf(); + expect(data.florist.playTime).toBeDefined(); + expect(data.florist.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.florist.playTime).toEqualTypeOf(); + expect(data.florist.mobsSpawned).toBeDefined(); + expect(data.florist.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.florist.mobsSpawned).toEqualTypeOf(); + expect(data.florist.chestsOpened).toBeDefined(); + expect(data.florist.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.florist.chestsOpened).toEqualTypeOf(); + expect(data.diver).toBeDefined(); + expectTypeOf(data.diver).toEqualTypeOf(); + expect(data.diver.level).toBeDefined(); + expect(data.diver.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.diver.level).toEqualTypeOf(); + expect(data.diver.exp).toBeDefined(); + expect(data.diver.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.diver.exp).toEqualTypeOf(); + expect(data.diver.kills).toBeDefined(); + expect(data.diver.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.diver.kills).toEqualTypeOf(); + expect(data.diver.deaths).toBeDefined(); + expect(data.diver.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.diver.deaths).toEqualTypeOf(); + expect(data.diver.KDR).toBeDefined(); + expect(data.diver.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.diver.KDR).toEqualTypeOf(); + expect(data.diver.wins).toBeDefined(); + expect(data.diver.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.diver.wins).toEqualTypeOf(); + expect(data.diver.gamesPlayed).toBeDefined(); + expect(data.diver.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.diver.gamesPlayed).toEqualTypeOf(); + expect(data.diver.losses).toBeDefined(); + expect(data.diver.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.diver.losses).toEqualTypeOf(); + expect(data.diver.WLR).toBeDefined(); + expect(data.diver.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.diver.WLR).toEqualTypeOf(); + expect(data.diver.arrowsShot).toBeDefined(); + expect(data.diver.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.diver.arrowsShot).toEqualTypeOf(); + expect(data.diver.arrowsHit).toBeDefined(); + expect(data.diver.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.diver.arrowsHit).toEqualTypeOf(); + expect(data.diver.bowAccuracy).toBeDefined(); + expect(data.diver.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.diver.bowAccuracy).toEqualTypeOf(); + expect(data.diver.damage).toBeDefined(); + expect(data.diver.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.diver.damage).toEqualTypeOf(); + expect(data.diver.damageTaken).toBeDefined(); + expect(data.diver.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.diver.damageTaken).toEqualTypeOf(); + expect(data.diver.potionsDrunk).toBeDefined(); + expect(data.diver.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.diver.potionsDrunk).toEqualTypeOf(); + expect(data.diver.potionsThrown).toBeDefined(); + expect(data.diver.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.diver.potionsThrown).toEqualTypeOf(); + expect(data.diver.playTime).toBeDefined(); + expect(data.diver.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.diver.playTime).toEqualTypeOf(); + expect(data.diver.mobsSpawned).toBeDefined(); + expect(data.diver.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.diver.mobsSpawned).toEqualTypeOf(); + expect(data.diver.chestsOpened).toBeDefined(); + expect(data.diver.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.diver.chestsOpened).toEqualTypeOf(); + expect(data.arachnologist).toBeDefined(); + expectTypeOf(data.arachnologist).toEqualTypeOf(); + expect(data.arachnologist.level).toBeDefined(); + expect(data.arachnologist.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arachnologist.level).toEqualTypeOf(); + expect(data.arachnologist.exp).toBeDefined(); + expect(data.arachnologist.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arachnologist.exp).toEqualTypeOf(); + expect(data.arachnologist.kills).toBeDefined(); + expect(data.arachnologist.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arachnologist.kills).toEqualTypeOf(); + expect(data.arachnologist.deaths).toBeDefined(); + expect(data.arachnologist.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arachnologist.deaths).toEqualTypeOf(); + expect(data.arachnologist.KDR).toBeDefined(); + expect(data.arachnologist.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arachnologist.KDR).toEqualTypeOf(); + expect(data.arachnologist.wins).toBeDefined(); + expect(data.arachnologist.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arachnologist.wins).toEqualTypeOf(); + expect(data.arachnologist.gamesPlayed).toBeDefined(); + expect(data.arachnologist.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arachnologist.gamesPlayed).toEqualTypeOf(); + expect(data.arachnologist.losses).toBeDefined(); + expect(data.arachnologist.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arachnologist.losses).toEqualTypeOf(); + expect(data.arachnologist.WLR).toBeDefined(); + expect(data.arachnologist.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arachnologist.WLR).toEqualTypeOf(); + expect(data.arachnologist.arrowsShot).toBeDefined(); + expect(data.arachnologist.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arachnologist.arrowsShot).toEqualTypeOf(); + expect(data.arachnologist.arrowsHit).toBeDefined(); + expect(data.arachnologist.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arachnologist.arrowsHit).toEqualTypeOf(); + expect(data.arachnologist.bowAccuracy).toBeDefined(); + expect(data.arachnologist.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arachnologist.bowAccuracy).toEqualTypeOf(); + expect(data.arachnologist.damage).toBeDefined(); + expect(data.arachnologist.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arachnologist.damage).toEqualTypeOf(); + expect(data.arachnologist.damageTaken).toBeDefined(); + expect(data.arachnologist.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arachnologist.damageTaken).toEqualTypeOf(); + expect(data.arachnologist.potionsDrunk).toBeDefined(); + expect(data.arachnologist.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arachnologist.potionsDrunk).toEqualTypeOf(); + expect(data.arachnologist.potionsThrown).toBeDefined(); + expect(data.arachnologist.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arachnologist.potionsThrown).toEqualTypeOf(); + expect(data.arachnologist.playTime).toBeDefined(); + expect(data.arachnologist.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arachnologist.playTime).toEqualTypeOf(); + expect(data.arachnologist.mobsSpawned).toBeDefined(); + expect(data.arachnologist.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arachnologist.mobsSpawned).toEqualTypeOf(); + expect(data.arachnologist.chestsOpened).toBeDefined(); + expect(data.arachnologist.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arachnologist.chestsOpened).toEqualTypeOf(); + expect(data.blaze).toBeDefined(); + expectTypeOf(data.blaze).toEqualTypeOf(); + expect(data.blaze.level).toBeDefined(); + expect(data.blaze.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blaze.level).toEqualTypeOf(); + expect(data.blaze.exp).toBeDefined(); + expect(data.blaze.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blaze.exp).toEqualTypeOf(); + expect(data.blaze.kills).toBeDefined(); + expect(data.blaze.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blaze.kills).toEqualTypeOf(); + expect(data.blaze.deaths).toBeDefined(); + expect(data.blaze.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blaze.deaths).toEqualTypeOf(); + expect(data.blaze.KDR).toBeDefined(); + expect(data.blaze.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blaze.KDR).toEqualTypeOf(); + expect(data.blaze.wins).toBeDefined(); + expect(data.blaze.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blaze.wins).toEqualTypeOf(); + expect(data.blaze.gamesPlayed).toBeDefined(); + expect(data.blaze.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blaze.gamesPlayed).toEqualTypeOf(); + expect(data.blaze.losses).toBeDefined(); + expect(data.blaze.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blaze.losses).toEqualTypeOf(); + expect(data.blaze.WLR).toBeDefined(); + expect(data.blaze.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blaze.WLR).toEqualTypeOf(); + expect(data.blaze.arrowsShot).toBeDefined(); + expect(data.blaze.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blaze.arrowsShot).toEqualTypeOf(); + expect(data.blaze.arrowsHit).toBeDefined(); + expect(data.blaze.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blaze.arrowsHit).toEqualTypeOf(); + expect(data.blaze.bowAccuracy).toBeDefined(); + expect(data.blaze.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blaze.bowAccuracy).toEqualTypeOf(); + expect(data.blaze.damage).toBeDefined(); + expect(data.blaze.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blaze.damage).toEqualTypeOf(); + expect(data.blaze.damageTaken).toBeDefined(); + expect(data.blaze.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blaze.damageTaken).toEqualTypeOf(); + expect(data.blaze.potionsDrunk).toBeDefined(); + expect(data.blaze.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blaze.potionsDrunk).toEqualTypeOf(); + expect(data.blaze.potionsThrown).toBeDefined(); + expect(data.blaze.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blaze.potionsThrown).toEqualTypeOf(); + expect(data.blaze.playTime).toBeDefined(); + expect(data.blaze.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blaze.playTime).toEqualTypeOf(); + expect(data.blaze.mobsSpawned).toBeDefined(); + expect(data.blaze.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blaze.mobsSpawned).toEqualTypeOf(); + expect(data.blaze.chestsOpened).toBeDefined(); + expect(data.blaze.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blaze.chestsOpened).toEqualTypeOf(); + expect(data.wolftamer).toBeDefined(); + expectTypeOf(data.wolftamer).toEqualTypeOf(); + expect(data.wolftamer.level).toBeDefined(); + expect(data.wolftamer.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wolftamer.level).toEqualTypeOf(); + expect(data.wolftamer.exp).toBeDefined(); + expect(data.wolftamer.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wolftamer.exp).toEqualTypeOf(); + expect(data.wolftamer.kills).toBeDefined(); + expect(data.wolftamer.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wolftamer.kills).toEqualTypeOf(); + expect(data.wolftamer.deaths).toBeDefined(); + expect(data.wolftamer.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wolftamer.deaths).toEqualTypeOf(); + expect(data.wolftamer.KDR).toBeDefined(); + expect(data.wolftamer.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wolftamer.KDR).toEqualTypeOf(); + expect(data.wolftamer.wins).toBeDefined(); + expect(data.wolftamer.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wolftamer.wins).toEqualTypeOf(); + expect(data.wolftamer.gamesPlayed).toBeDefined(); + expect(data.wolftamer.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wolftamer.gamesPlayed).toEqualTypeOf(); + expect(data.wolftamer.losses).toBeDefined(); + expect(data.wolftamer.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wolftamer.losses).toEqualTypeOf(); + expect(data.wolftamer.WLR).toBeDefined(); + expect(data.wolftamer.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wolftamer.WLR).toEqualTypeOf(); + expect(data.wolftamer.arrowsShot).toBeDefined(); + expect(data.wolftamer.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wolftamer.arrowsShot).toEqualTypeOf(); + expect(data.wolftamer.arrowsHit).toBeDefined(); + expect(data.wolftamer.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wolftamer.arrowsHit).toEqualTypeOf(); + expect(data.wolftamer.bowAccuracy).toBeDefined(); + expect(data.wolftamer.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wolftamer.bowAccuracy).toEqualTypeOf(); + expect(data.wolftamer.damage).toBeDefined(); + expect(data.wolftamer.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wolftamer.damage).toEqualTypeOf(); + expect(data.wolftamer.damageTaken).toBeDefined(); + expect(data.wolftamer.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wolftamer.damageTaken).toEqualTypeOf(); + expect(data.wolftamer.potionsDrunk).toBeDefined(); + expect(data.wolftamer.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wolftamer.potionsDrunk).toEqualTypeOf(); + expect(data.wolftamer.potionsThrown).toBeDefined(); + expect(data.wolftamer.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wolftamer.potionsThrown).toEqualTypeOf(); + expect(data.wolftamer.playTime).toBeDefined(); + expect(data.wolftamer.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wolftamer.playTime).toEqualTypeOf(); + expect(data.wolftamer.mobsSpawned).toBeDefined(); + expect(data.wolftamer.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wolftamer.mobsSpawned).toEqualTypeOf(); + expect(data.wolftamer.chestsOpened).toBeDefined(); + expect(data.wolftamer.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wolftamer.chestsOpened).toEqualTypeOf(); + expect(data.tim).toBeDefined(); + expectTypeOf(data.tim).toEqualTypeOf(); + expect(data.tim.level).toBeDefined(); + expect(data.tim.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tim.level).toEqualTypeOf(); + expect(data.tim.exp).toBeDefined(); + expect(data.tim.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tim.exp).toEqualTypeOf(); + expect(data.tim.kills).toBeDefined(); + expect(data.tim.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tim.kills).toEqualTypeOf(); + expect(data.tim.deaths).toBeDefined(); + expect(data.tim.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tim.deaths).toEqualTypeOf(); + expect(data.tim.KDR).toBeDefined(); + expect(data.tim.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tim.KDR).toEqualTypeOf(); + expect(data.tim.wins).toBeDefined(); + expect(data.tim.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tim.wins).toEqualTypeOf(); + expect(data.tim.gamesPlayed).toBeDefined(); + expect(data.tim.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tim.gamesPlayed).toEqualTypeOf(); + expect(data.tim.losses).toBeDefined(); + expect(data.tim.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tim.losses).toEqualTypeOf(); + expect(data.tim.WLR).toBeDefined(); + expect(data.tim.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tim.WLR).toEqualTypeOf(); + expect(data.tim.arrowsShot).toBeDefined(); + expect(data.tim.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tim.arrowsShot).toEqualTypeOf(); + expect(data.tim.arrowsHit).toBeDefined(); + expect(data.tim.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tim.arrowsHit).toEqualTypeOf(); + expect(data.tim.bowAccuracy).toBeDefined(); + expect(data.tim.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tim.bowAccuracy).toEqualTypeOf(); + expect(data.tim.damage).toBeDefined(); + expect(data.tim.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tim.damage).toEqualTypeOf(); + expect(data.tim.damageTaken).toBeDefined(); + expect(data.tim.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tim.damageTaken).toEqualTypeOf(); + expect(data.tim.potionsDrunk).toBeDefined(); + expect(data.tim.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tim.potionsDrunk).toEqualTypeOf(); + expect(data.tim.potionsThrown).toBeDefined(); + expect(data.tim.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tim.potionsThrown).toEqualTypeOf(); + expect(data.tim.playTime).toBeDefined(); + expect(data.tim.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tim.playTime).toEqualTypeOf(); + expect(data.tim.mobsSpawned).toBeDefined(); + expect(data.tim.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tim.mobsSpawned).toEqualTypeOf(); + expect(data.tim.chestsOpened).toBeDefined(); + expect(data.tim.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tim.chestsOpened).toEqualTypeOf(); + expect(data.farmer).toBeDefined(); + expectTypeOf(data.farmer).toEqualTypeOf(); + expect(data.farmer.level).toBeDefined(); + expect(data.farmer.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.farmer.level).toEqualTypeOf(); + expect(data.farmer.exp).toBeDefined(); + expect(data.farmer.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.farmer.exp).toEqualTypeOf(); + expect(data.farmer.kills).toBeDefined(); + expect(data.farmer.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.farmer.kills).toEqualTypeOf(); + expect(data.farmer.deaths).toBeDefined(); + expect(data.farmer.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.farmer.deaths).toEqualTypeOf(); + expect(data.farmer.KDR).toBeDefined(); + expect(data.farmer.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.farmer.KDR).toEqualTypeOf(); + expect(data.farmer.wins).toBeDefined(); + expect(data.farmer.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.farmer.wins).toEqualTypeOf(); + expect(data.farmer.gamesPlayed).toBeDefined(); + expect(data.farmer.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.farmer.gamesPlayed).toEqualTypeOf(); + expect(data.farmer.losses).toBeDefined(); + expect(data.farmer.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.farmer.losses).toEqualTypeOf(); + expect(data.farmer.WLR).toBeDefined(); + expect(data.farmer.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.farmer.WLR).toEqualTypeOf(); + expect(data.farmer.arrowsShot).toBeDefined(); + expect(data.farmer.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.farmer.arrowsShot).toEqualTypeOf(); + expect(data.farmer.arrowsHit).toBeDefined(); + expect(data.farmer.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.farmer.arrowsHit).toEqualTypeOf(); + expect(data.farmer.bowAccuracy).toBeDefined(); + expect(data.farmer.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.farmer.bowAccuracy).toEqualTypeOf(); + expect(data.farmer.damage).toBeDefined(); + expect(data.farmer.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.farmer.damage).toEqualTypeOf(); + expect(data.farmer.damageTaken).toBeDefined(); + expect(data.farmer.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.farmer.damageTaken).toEqualTypeOf(); + expect(data.farmer.potionsDrunk).toBeDefined(); + expect(data.farmer.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.farmer.potionsDrunk).toEqualTypeOf(); + expect(data.farmer.potionsThrown).toBeDefined(); + expect(data.farmer.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.farmer.potionsThrown).toEqualTypeOf(); + expect(data.farmer.playTime).toBeDefined(); + expect(data.farmer.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.farmer.playTime).toEqualTypeOf(); + expect(data.farmer.mobsSpawned).toBeDefined(); + expect(data.farmer.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.farmer.mobsSpawned).toEqualTypeOf(); + expect(data.farmer.chestsOpened).toBeDefined(); + expect(data.farmer.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.farmer.chestsOpened).toEqualTypeOf(); + expect(data.creepertamer).toBeDefined(); + expectTypeOf(data.creepertamer).toEqualTypeOf(); + expect(data.creepertamer.level).toBeDefined(); + expect(data.creepertamer.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.creepertamer.level).toEqualTypeOf(); + expect(data.creepertamer.exp).toBeDefined(); + expect(data.creepertamer.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.creepertamer.exp).toEqualTypeOf(); + expect(data.creepertamer.kills).toBeDefined(); + expect(data.creepertamer.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.creepertamer.kills).toEqualTypeOf(); + expect(data.creepertamer.deaths).toBeDefined(); + expect(data.creepertamer.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.creepertamer.deaths).toEqualTypeOf(); + expect(data.creepertamer.KDR).toBeDefined(); + expect(data.creepertamer.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.creepertamer.KDR).toEqualTypeOf(); + expect(data.creepertamer.wins).toBeDefined(); + expect(data.creepertamer.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.creepertamer.wins).toEqualTypeOf(); + expect(data.creepertamer.gamesPlayed).toBeDefined(); + expect(data.creepertamer.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.creepertamer.gamesPlayed).toEqualTypeOf(); + expect(data.creepertamer.losses).toBeDefined(); + expect(data.creepertamer.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.creepertamer.losses).toEqualTypeOf(); + expect(data.creepertamer.WLR).toBeDefined(); + expect(data.creepertamer.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.creepertamer.WLR).toEqualTypeOf(); + expect(data.creepertamer.arrowsShot).toBeDefined(); + expect(data.creepertamer.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.creepertamer.arrowsShot).toEqualTypeOf(); + expect(data.creepertamer.arrowsHit).toBeDefined(); + expect(data.creepertamer.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.creepertamer.arrowsHit).toEqualTypeOf(); + expect(data.creepertamer.bowAccuracy).toBeDefined(); + expect(data.creepertamer.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.creepertamer.bowAccuracy).toEqualTypeOf(); + expect(data.creepertamer.damage).toBeDefined(); + expect(data.creepertamer.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.creepertamer.damage).toEqualTypeOf(); + expect(data.creepertamer.damageTaken).toBeDefined(); + expect(data.creepertamer.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.creepertamer.damageTaken).toEqualTypeOf(); + expect(data.creepertamer.potionsDrunk).toBeDefined(); + expect(data.creepertamer.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.creepertamer.potionsDrunk).toEqualTypeOf(); + expect(data.creepertamer.potionsThrown).toBeDefined(); + expect(data.creepertamer.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.creepertamer.potionsThrown).toEqualTypeOf(); + expect(data.creepertamer.playTime).toBeDefined(); + expect(data.creepertamer.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.creepertamer.playTime).toEqualTypeOf(); + expect(data.creepertamer.mobsSpawned).toBeDefined(); + expect(data.creepertamer.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.creepertamer.mobsSpawned).toEqualTypeOf(); + expect(data.creepertamer.chestsOpened).toBeDefined(); + expect(data.creepertamer.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.creepertamer.chestsOpened).toEqualTypeOf(); + expect(data.snowman).toBeDefined(); + expectTypeOf(data.snowman).toEqualTypeOf(); + expect(data.snowman.level).toBeDefined(); + expect(data.snowman.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowman.level).toEqualTypeOf(); + expect(data.snowman.exp).toBeDefined(); + expect(data.snowman.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowman.exp).toEqualTypeOf(); + expect(data.snowman.kills).toBeDefined(); + expect(data.snowman.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowman.kills).toEqualTypeOf(); + expect(data.snowman.deaths).toBeDefined(); + expect(data.snowman.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowman.deaths).toEqualTypeOf(); + expect(data.snowman.KDR).toBeDefined(); + expect(data.snowman.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowman.KDR).toEqualTypeOf(); + expect(data.snowman.wins).toBeDefined(); + expect(data.snowman.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowman.wins).toEqualTypeOf(); + expect(data.snowman.gamesPlayed).toBeDefined(); + expect(data.snowman.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowman.gamesPlayed).toEqualTypeOf(); + expect(data.snowman.losses).toBeDefined(); + expect(data.snowman.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowman.losses).toEqualTypeOf(); + expect(data.snowman.WLR).toBeDefined(); + expect(data.snowman.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowman.WLR).toEqualTypeOf(); + expect(data.snowman.arrowsShot).toBeDefined(); + expect(data.snowman.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowman.arrowsShot).toEqualTypeOf(); + expect(data.snowman.arrowsHit).toBeDefined(); + expect(data.snowman.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowman.arrowsHit).toEqualTypeOf(); + expect(data.snowman.bowAccuracy).toBeDefined(); + expect(data.snowman.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowman.bowAccuracy).toEqualTypeOf(); + expect(data.snowman.damage).toBeDefined(); + expect(data.snowman.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowman.damage).toEqualTypeOf(); + expect(data.snowman.damageTaken).toBeDefined(); + expect(data.snowman.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowman.damageTaken).toEqualTypeOf(); + expect(data.snowman.potionsDrunk).toBeDefined(); + expect(data.snowman.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowman.potionsDrunk).toEqualTypeOf(); + expect(data.snowman.potionsThrown).toBeDefined(); + expect(data.snowman.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowman.potionsThrown).toEqualTypeOf(); + expect(data.snowman.playTime).toBeDefined(); + expect(data.snowman.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowman.playTime).toEqualTypeOf(); + expect(data.snowman.mobsSpawned).toBeDefined(); + expect(data.snowman.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowman.mobsSpawned).toEqualTypeOf(); + expect(data.snowman.chestsOpened).toBeDefined(); + expect(data.snowman.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowman.chestsOpened).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.ts b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.ts new file mode 100644 index 000000000..660056293 --- /dev/null +++ b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.ts @@ -0,0 +1,132 @@ +import BlitzSurvivalGamesKit from './BlitzSurvivalGamesKit.js'; +import Divide from '../../../Utils/Divide.js'; +import type { BlitzSurvivalGamesKits } from '../../../Types/Player.js'; + +class BlitzSurvivalGames { + coins: number; + kills: number; + kit: BlitzSurvivalGamesKits | 'None'; + killsSolo: number; + killsTeams: number; + deaths: number; + KDR: number; + wins: number; + winsSolo: number; + winsTeam: number; + gamesPlayed: number; + losses: number; + WLR: number; + arrowsShot: number; + arrowsHit: number; + bowAccuracy: number; + damage: number; + damageTaken: number; + potionsDrunk: number; + potionsThrown: number; + mobsSpawned: number; + playTime: number; + blitzUses: number; + chestsOpened: number; + archer: BlitzSurvivalGamesKit; + meatmaster: BlitzSurvivalGamesKit; + speleologist: BlitzSurvivalGamesKit; + baker: BlitzSurvivalGamesKit; + knight: BlitzSurvivalGamesKit; + guardian: BlitzSurvivalGamesKit; + scout: BlitzSurvivalGamesKit; + hunter: BlitzSurvivalGamesKit; + hypeTrain: BlitzSurvivalGamesKit; + fisherman: BlitzSurvivalGamesKit; + armorer: BlitzSurvivalGamesKit; + horsetamer: BlitzSurvivalGamesKit; + astronaut: BlitzSurvivalGamesKit; + troll: BlitzSurvivalGamesKit; + reaper: BlitzSurvivalGamesKit; + shark: BlitzSurvivalGamesKit; + reddragon: BlitzSurvivalGamesKit; + toxicologist: BlitzSurvivalGamesKit; + rogue: BlitzSurvivalGamesKit; + warlock: BlitzSurvivalGamesKit; + slimeyslime: BlitzSurvivalGamesKit; + jockey: BlitzSurvivalGamesKit; + golem: BlitzSurvivalGamesKit; + viking: BlitzSurvivalGamesKit; + shadowKnight: BlitzSurvivalGamesKit; + pigman: BlitzSurvivalGamesKit; + paladin: BlitzSurvivalGamesKit; + necromancer: BlitzSurvivalGamesKit; + florist: BlitzSurvivalGamesKit; + diver: BlitzSurvivalGamesKit; + arachnologist: BlitzSurvivalGamesKit; + blaze: BlitzSurvivalGamesKit; + wolftamer: BlitzSurvivalGamesKit; + tim: BlitzSurvivalGamesKit; + farmer: BlitzSurvivalGamesKit; + creepertamer: BlitzSurvivalGamesKit; + snowman: BlitzSurvivalGamesKit; + constructor(data: Record) { + this.coins = data?.coins || data?.tokens || 0; + this.kills = data?.kills || 0; + this.kit = data?.defaultkit || 'None'; + this.killsSolo = data?.kills_solo_normal || 0; + this.killsTeams = data?.kills_teams_normal || 0; + this.deaths = data?.deaths || 0; + this.KDR = Divide(this.kills, this.deaths); + this.wins = data?.wins || 0; + this.winsSolo = data?.wins_solo_normal || 0; + this.winsTeam = data?.wins_teams || 0; + this.gamesPlayed = data?.games_played || 0; + this.losses = this.gamesPlayed - this.wins; + this.WLR = Divide(this.wins, this.losses); + this.arrowsShot = data?.arrows_fired || 0; + this.arrowsHit = data?.arrows_hit || 0; + this.bowAccuracy = Divide(this.arrowsHit, this.arrowsShot); + this.damage = data?.damage || 0; + this.damageTaken = data?.damage_taken || 0; + this.potionsDrunk = data?.potions_drunk || 0; + this.potionsThrown = data?.potions_thrown || 0; + this.mobsSpawned = data?.mobs_spawned || 0; + this.playTime = data?.time_played || 0; + this.blitzUses = data?.blitz_uses || 0; + this.chestsOpened = data?.chests_opened || 0; + this.archer = new BlitzSurvivalGamesKit(data, 'archer'); + this.meatmaster = new BlitzSurvivalGamesKit(data, 'meatmaster'); + this.speleologist = new BlitzSurvivalGamesKit(data, 'speleologist'); + this.baker = new BlitzSurvivalGamesKit(data, 'baker'); + this.knight = new BlitzSurvivalGamesKit(data, 'knight'); + this.guardian = new BlitzSurvivalGamesKit(data, 'guardian'); + this.scout = new BlitzSurvivalGamesKit(data, 'scout'); + this.hunter = new BlitzSurvivalGamesKit(data, 'hunter'); + this.hypeTrain = new BlitzSurvivalGamesKit(data, 'hype train'); + this.fisherman = new BlitzSurvivalGamesKit(data, 'fisherman'); + this.armorer = new BlitzSurvivalGamesKit(data, 'armorer'); + this.horsetamer = new BlitzSurvivalGamesKit(data, 'horsetamer'); + this.astronaut = new BlitzSurvivalGamesKit(data, 'astronaut'); + this.troll = new BlitzSurvivalGamesKit(data, 'troll'); + this.reaper = new BlitzSurvivalGamesKit(data, 'reaper'); + this.shark = new BlitzSurvivalGamesKit(data, 'shark'); + this.reddragon = new BlitzSurvivalGamesKit(data, 'reddragon'); + this.toxicologist = new BlitzSurvivalGamesKit(data, 'toxicologist'); + this.rogue = new BlitzSurvivalGamesKit(data, 'rogue'); + this.warlock = new BlitzSurvivalGamesKit(data, 'warlock'); + this.slimeyslime = new BlitzSurvivalGamesKit(data, 'slimeyslime'); + this.jockey = new BlitzSurvivalGamesKit(data, 'jockey'); + this.golem = new BlitzSurvivalGamesKit(data, 'golem'); + this.viking = new BlitzSurvivalGamesKit(data, 'viking'); + this.shadowKnight = new BlitzSurvivalGamesKit(data, 'shadow knight'); + this.pigman = new BlitzSurvivalGamesKit(data, 'pigman'); + this.paladin = new BlitzSurvivalGamesKit(data, 'paladin'); + this.necromancer = new BlitzSurvivalGamesKit(data, 'necromancer'); + this.florist = new BlitzSurvivalGamesKit(data, 'florist'); + this.diver = new BlitzSurvivalGamesKit(data, 'diver'); + this.arachnologist = new BlitzSurvivalGamesKit(data, 'arachnologist'); + this.blaze = new BlitzSurvivalGamesKit(data, 'blaze'); + this.wolftamer = new BlitzSurvivalGamesKit(data, 'wolftamer'); + this.tim = new BlitzSurvivalGamesKit(data, 'tim'); + this.farmer = new BlitzSurvivalGamesKit(data, 'farmer'); + this.creepertamer = new BlitzSurvivalGamesKit(data, 'creepertamer'); + this.snowman = new BlitzSurvivalGamesKit(data, 'snowman'); + } +} + +export default BlitzSurvivalGames; diff --git a/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesKit.ts b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesKit.ts new file mode 100644 index 000000000..185688ac3 --- /dev/null +++ b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesKit.ts @@ -0,0 +1,47 @@ +import Divide from '../../../Utils/Divide.js'; +import type { BlitzSurvivalGamesKits } from '../../../Types/Player.js'; + +class BlitzSurvivalGamesKit { + level: number; + exp: number; + kills: number; + deaths: number; + KDR: number; + wins: number; + gamesPlayed: number; + losses: number; + WLR: number; + arrowsShot: number; + arrowsHit: number; + bowAccuracy: number; + damage: number; + damageTaken: number; + potionsDrunk: number; + potionsThrown: number; + playTime: number; + mobsSpawned: number; + chestsOpened: number; + constructor(data: Record, kitName: BlitzSurvivalGamesKits) { + this.level = data?.[kitName] || 0; + this.exp = data?.[`exp_${kitName}`] || 0; + this.kills = data?.[`kills_${kitName}`] || 0; + this.deaths = data?.[`deaths_${kitName}`] || 0; + this.KDR = Divide(this.kills, this.deaths); + this.wins = data?.[`wins_${kitName}`] || 0; + this.gamesPlayed = data?.[`games_played_${kitName}`] || 0; + this.losses = this.gamesPlayed - this.wins; + this.WLR = Divide(this.wins, this.losses); + this.arrowsShot = data?.[`arrows_fired_${kitName}`] || 0; + this.arrowsHit = data?.[`arrows_hit_${kitName}`] || 0; + this.bowAccuracy = Divide(this.arrowsHit, this.arrowsShot); + this.damage = data?.[`damage_${kitName}`] || 0; + this.damageTaken = data?.[`damage_taken_${kitName}`] || 0; + this.potionsDrunk = data?.[`potions_drunk_${kitName}`] || 0; + this.potionsThrown = data?.[`potions_thrown_${kitName}`] || 0; + this.playTime = data?.[`time_played_${kitName}`] || 0; + this.mobsSpawned = data?.[`mobs_spawned_${kitName}`] || 0; + this.chestsOpened = data?.[`chests_opened_${kitName}`] || 0; + } +} + +export default BlitzSurvivalGamesKit; diff --git a/src/Structures/MiniGames/BuildBattle.test.ts b/src/Structures/MiniGames/BuildBattle.test.ts new file mode 100644 index 000000000..2989068c6 --- /dev/null +++ b/src/Structures/MiniGames/BuildBattle.test.ts @@ -0,0 +1,44 @@ +import BuildBattle from './BuildBattle.js'; +import { BuildBattleWins } from '../../Types/Player.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BuildBattle', () => { + const data = new BuildBattle({ stats: 'meow' }); + expect(data).toBeInstanceOf(BuildBattle); + expectTypeOf(data).toEqualTypeOf(); + expect(data.score).toBeDefined(); + expect(data.score).toBeGreaterThanOrEqual(0); + expectTypeOf(data.score).toEqualTypeOf(); + expect(data.totalWins).toBeDefined(); + expect(data.totalWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.totalWins).toEqualTypeOf(); + expect(data.games).toBeDefined(); + expect(data.games).toBeGreaterThanOrEqual(0); + expectTypeOf(data.games).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.superVotes).toBeDefined(); + expect(data.superVotes).toBeGreaterThanOrEqual(0); + expectTypeOf(data.superVotes).toEqualTypeOf(); + expect(data.coins).toBeDefined(); + expect(data.coins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.coins).toEqualTypeOf(); + expect(data.totalVotes).toBeDefined(); + expect(data.totalVotes).toBeGreaterThanOrEqual(0); + expectTypeOf(data.totalVotes).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.wins.solo).toBeDefined(); + expect(data.wins.solo).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins.solo).toEqualTypeOf(); + expect(data.wins.teams).toBeDefined(); + expect(data.wins.teams).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins.teams).toEqualTypeOf(); + expect(data.wins.pro).toBeDefined(); + expect(data.wins.pro).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins.pro).toEqualTypeOf(); + expect(data.wins.gtb).toBeDefined(); + expect(data.wins.gtb).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins.gtb).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BuildBattle.ts b/src/Structures/MiniGames/BuildBattle.ts new file mode 100644 index 000000000..453379631 --- /dev/null +++ b/src/Structures/MiniGames/BuildBattle.ts @@ -0,0 +1,30 @@ +import Divide from '../../Utils/Divide.js'; +import type { BuildBattleWins } from '../../Types/Player.js'; + +class BuildBattle { + score: number; + totalWins: number; + games: number; + WLR: number; + superVotes: number; + coins: number; + totalVotes: number; + wins: BuildBattleWins; + constructor(data: Record) { + this.score = data?.score || 0; + this.totalWins = data?.wins || 0; + this.games = data?.games_played || 0; + this.WLR = Divide(this.totalWins, this.games); + this.superVotes = data?.super_votes || 0; + this.coins = data?.coins || data?.tokens || 0; + this.totalVotes = data?.total_votes || 0; + this.wins = { + solo: data?.wins_solo_normal || 0, + teams: data?.wins_teams_normal || 0, + pro: data?.wins_solo_pro || 0, + gtb: data?.wins_guess_the_build || 0 + }; + } +} + +export default BuildBattle; diff --git a/src/Structures/MiniGames/CopsAndCrims/CopsAndCrims.test.ts b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrims.test.ts new file mode 100644 index 000000000..35cbf1cf0 --- /dev/null +++ b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrims.test.ts @@ -0,0 +1,165 @@ +import CopsAndCrims from './CopsAndCrims.js'; +import CopsAndCrimsGamemode from './CopsAndCrimsGamemode.js'; +import CopsAndCrimsGun from './CopsAndCrimsGun.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('CopsAndCrims', () => { + const data = new CopsAndCrims({ stats: 'meow' }); + expect(data).toBeInstanceOf(CopsAndCrims); + expectTypeOf(data).toEqualTypeOf(); + expect(data.coins).toBeDefined(); + expect(data.coins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.coins).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.criminalKills).toBeDefined(); + expect(data.criminalKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.criminalKills).toEqualTypeOf(); + expect(data.copKills).toBeDefined(); + expect(data.copKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.copKills).toEqualTypeOf(); + expect(data.headshotKills).toBeDefined(); + expect(data.headshotKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.headshotKills).toEqualTypeOf(); + expect(data.grenadeKills).toBeDefined(); + expect(data.grenadeKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.grenadeKills).toEqualTypeOf(); + expect(data.assists).toBeDefined(); + expect(data.assists).toBeGreaterThanOrEqual(0); + expectTypeOf(data.assists).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.winsOnTemple).toBeDefined(); + expect(data.winsOnTemple).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsOnTemple).toEqualTypeOf(); + expect(data.winsOnCarrier).toBeDefined(); + expect(data.winsOnCarrier).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsOnCarrier).toEqualTypeOf(); + expect(data.winsOnAtomic).toBeDefined(); + expect(data.winsOnAtomic).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsOnAtomic).toEqualTypeOf(); + expect(data.winsOnAlleyway).toBeDefined(); + expect(data.winsOnAlleyway).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsOnAlleyway).toEqualTypeOf(); + expect(data.winsOnSandstorm).toBeDefined(); + expect(data.winsOnSandstorm).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsOnSandstorm).toEqualTypeOf(); + expect(data.winsOnReserve).toBeDefined(); + expect(data.winsOnReserve).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsOnReserve).toEqualTypeOf(); + expect(data.winsOnOvergrown).toBeDefined(); + expect(data.winsOnOvergrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsOnOvergrown).toEqualTypeOf(); + expect(data.winsOnBazaar).toBeDefined(); + expect(data.winsOnBazaar).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsOnBazaar).toEqualTypeOf(); + expect(data.winsOnJunction).toBeDefined(); + expect(data.winsOnJunction).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsOnJunction).toEqualTypeOf(); + expect(data.winsOnDerailed).toBeDefined(); + expect(data.winsOnDerailed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsOnDerailed).toEqualTypeOf(); + expect(data.winsOnCastle).toBeDefined(); + expect(data.winsOnCastle).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsOnCastle).toEqualTypeOf(); + expect(data.winsOnRuins).toBeDefined(); + expect(data.winsOnRuins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsOnRuins).toEqualTypeOf(); + expect(data.winsOnRiviera).toBeDefined(); + expect(data.winsOnRiviera).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsOnRiviera).toEqualTypeOf(); + expect(data.winsOnHarbor).toBeDefined(); + expect(data.winsOnHarbor).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsOnHarbor).toEqualTypeOf(); + expect(data.winsOnAtomicV1).toBeDefined(); + expect(data.winsOnAtomicV1).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsOnAtomicV1).toEqualTypeOf(); + expect(data.winsOnAtomicV2).toBeDefined(); + expect(data.winsOnAtomicV2).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsOnAtomicV2).toEqualTypeOf(); + expect(data.winsOnMelonFactory).toBeDefined(); + expect(data.winsOnMelonFactory).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsOnMelonFactory).toEqualTypeOf(); + expect(data.winsOnMelonFactoryV2).toBeDefined(); + expect(data.winsOnMelonFactoryV2).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsOnMelonFactoryV2).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.gamesPlayed).toBeDefined(); + expect(data.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gamesPlayed).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.roundWins).toBeDefined(); + expect(data.roundWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.roundWins).toEqualTypeOf(); + expect(data.bombsPlanted).toBeDefined(); + expect(data.bombsPlanted).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bombsPlanted).toEqualTypeOf(); + expect(data.bombsDefused).toBeDefined(); + expect(data.bombsDefused).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bombsDefused).toEqualTypeOf(); + expect(data.shotsFired).toBeDefined(); + expect(data.shotsFired).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shotsFired).toEqualTypeOf(); + expect(data.showPrefixInLobby).toBeDefined(); + expectTypeOf(data.showPrefixInLobby).toEqualTypeOf(); + expect(data.selectedLobbyPrefix).toBeDefined(); + expectTypeOf(data.selectedLobbyPrefix).toEqualTypeOf(); + expect(data.lobbyPrefixColor).toBeDefined(); + expectTypeOf(data.lobbyPrefixColor).toEqualTypeOf(); + expect(data.showHints).toBeDefined(); + expectTypeOf(data.showHints).toEqualTypeOf(); + expect(data.showKillsInPrefix).toBeDefined(); + expectTypeOf(data.showKillsInPrefix).toEqualTypeOf(); + expect(data.score).toBeDefined(); + expect(data.score).toBeGreaterThanOrEqual(0); + expectTypeOf(data.score).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expect(data.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.activeGlyph).toBeDefined(); + expectTypeOf(data.activeGlyph).toEqualTypeOf(); + expect(data.activeScheme).toBeDefined(); + expectTypeOf(data.activeScheme).toEqualTypeOf(); + expect(data.activeEmblem).toBeDefined(); + expectTypeOf(data.activeEmblem).toEqualTypeOf(); + expect(data.packages).toBeDefined(); + expectTypeOf(data.packages).toEqualTypeOf(); + expect(data.smg).toBeDefined(); + expectTypeOf(data.smg).toEqualTypeOf(); + expect(data.rifle).toBeDefined(); + expectTypeOf(data.rifle).toEqualTypeOf(); + expect(data.carbine).toBeDefined(); + expectTypeOf(data.carbine).toEqualTypeOf(); + expect(data.magnum).toBeDefined(); + expectTypeOf(data.magnum).toEqualTypeOf(); + expect(data.shotgun).toBeDefined(); + expectTypeOf(data.shotgun).toEqualTypeOf(); + expect(data.sniper).toBeDefined(); + expectTypeOf(data.sniper).toEqualTypeOf(); + expect(data.scopedRifle).toBeDefined(); + expectTypeOf(data.scopedRifle).toEqualTypeOf(); + expect(data.handgun).toBeDefined(); + expectTypeOf(data.handgun).toEqualTypeOf(); + expect(data.autoShotgun).toBeDefined(); + expectTypeOf(data.autoShotgun).toEqualTypeOf(); + expect(data.bullpup).toBeDefined(); + expectTypeOf(data.bullpup).toEqualTypeOf(); + expect(data.knife).toBeDefined(); + expectTypeOf(data.knife).toEqualTypeOf(); + expect(data.deathmatch).toBeDefined(); + expectTypeOf(data.deathmatch).toEqualTypeOf(); + expect(data.gungame).toBeDefined(); + expectTypeOf(data.gungame).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/CopsAndCrims/CopsAndCrims.ts b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrims.ts new file mode 100644 index 000000000..ccf2da8b3 --- /dev/null +++ b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrims.ts @@ -0,0 +1,128 @@ +import CopsAndCrimsGamemode from './CopsAndCrimsGamemode.js'; +import CopsAndCrimsGun from './CopsAndCrimsGun.js'; +import Divide from '../../../Utils/Divide.js'; + +class CopsAndCrims { + coins: number; + kills: number; + criminalKills: number; + copKills: number; + headshotKills: number; + grenadeKills: number; + assists: number; + deaths: number; + KDR: number; + winsOnTemple: number; + winsOnCarrier: number; + winsOnAtomic: number; + winsOnAlleyway: number; + winsOnSandstorm: number; + winsOnReserve: number; + winsOnOvergrown: number; + winsOnBazaar: number; + winsOnJunction: number; + winsOnDerailed: number; + winsOnCastle: number; + winsOnRuins: number; + winsOnRiviera: number; + winsOnHarbor: number; + winsOnAtomicV1: number; + winsOnAtomicV2: number; + winsOnMelonFactory: number; + winsOnMelonFactoryV2: number; + wins: number; + gamesPlayed: number; + losses: number; + WLR: number; + roundWins: number; + bombsPlanted: number; + bombsDefused: number; + shotsFired: number; + showPrefixInLobby: boolean; + selectedLobbyPrefix: string; + lobbyPrefixColor: string; + showHints: boolean; + showKillsInPrefix: boolean; + score: number; + level: number; + activeGlyph: string; + activeScheme: string; + activeEmblem: string; + packages: string[]; + smg: CopsAndCrimsGun; + rifle: CopsAndCrimsGun; + carbine: CopsAndCrimsGun; + magnum: CopsAndCrimsGun; + shotgun: CopsAndCrimsGun; + sniper: CopsAndCrimsGun; + scopedRifle: CopsAndCrimsGun; + handgun: CopsAndCrimsGun; + autoShotgun: CopsAndCrimsGun; + bullpup: CopsAndCrimsGun; + knife: CopsAndCrimsGun; + deathmatch: CopsAndCrimsGamemode; + gungame: CopsAndCrimsGamemode; + constructor(data: Record) { + this.coins = data?.coins || 0; + this.kills = data?.kills || 0; + this.criminalKills = data?.criminal_kills || 0; + this.copKills = data?.cop_kills || 0; + this.headshotKills = data?.headshot_kills || 0; + this.grenadeKills = data?.grenade_kills || 0; + this.assists = data?.assists || 0; + this.deaths = data?.deaths || 0; + this.KDR = Divide(this.kills, this.deaths); + this.winsOnTemple = data?.game_wins_temple || 0; + this.winsOnCarrier = data?.game_wins_carrier || 0; + this.winsOnAtomic = data?.game_wins_atomic || 0; + this.winsOnAlleyway = data?.game_wins_alleyway || 0; + this.winsOnSandstorm = data?.game_wins_sandstorm || 0; + this.winsOnReserve = data?.game_wins_reserve || 0; + this.winsOnOvergrown = data?.game_wins_overgrown || 0; + this.winsOnBazaar = data?.game_wins_bazaar || 0; + this.winsOnJunction = data?.game_wins_junction || 0; + this.winsOnDerailed = data?.game_wins_derailed || 0; + this.winsOnCastle = data?.game_wins_castle || 0; + this.winsOnRuins = data?.game_wins_ruins || 0; + this.winsOnRiviera = data?.game_wins_riviera || 0; + this.winsOnHarbor = data?.game_wins_harbor || 0; + this.winsOnAtomicV1 = data?.[`game_wins_atomic v1`] || 0; + this.winsOnAtomicV2 = data?.[`game_wins_atomic v2`] || 0; + this.winsOnMelonFactory = data?.[`game_wins_melon factory`] || 0; + this.winsOnMelonFactoryV2 = data?.[`game_wins_melon factory v2`] || 0; + this.wins = data?.game_wins || 0; + this.gamesPlayed = data?.game_plays || 0; + this.losses = this.gamesPlayed - this.wins; + this.WLR = Divide(this.wins, this.losses); + this.roundWins = data?.round_wins || 0; + this.bombsPlanted = data?.bombs_planted || 0; + this.bombsDefused = data?.bombs_defused || 0; + this.shotsFired = data?.shots_fired || 0; + this.showPrefixInLobby = data?.show_lobby_prefix || true; + this.selectedLobbyPrefix = data?.selected_lobby_prefix || ''; + this.lobbyPrefixColor = data?.lobbyPrefixColor || ''; + this.showHints = data?.setting_hints || true; + this.showKillsInPrefix = data?.show_kills_in_prefix || true; + this.score = data?.score || 0; + this.level = data?.level || 0; + this.activeGlyph = data?.active_glyph || 'None'; + this.activeScheme = data?.active_scheme || 'None'; + this.activeEmblem = data?.active_emblem || 'None'; + this.packages = data?.packages || []; + this.smg = new CopsAndCrimsGun(data, 'smg'); + this.rifle = new CopsAndCrimsGun(data, 'rifle'); + this.carbine = new CopsAndCrimsGun(data, 'carbine'); + this.magnum = new CopsAndCrimsGun(data, 'magnum'); + this.shotgun = new CopsAndCrimsGun(data, 'shotgun'); + this.sniper = new CopsAndCrimsGun(data, 'sniper'); + this.scopedRifle = new CopsAndCrimsGun(data, 'scoped_rifle'); + this.handgun = new CopsAndCrimsGun(data, 'handgun'); + this.autoShotgun = new CopsAndCrimsGun(data, 'auto_shotgun'); + this.bullpup = new CopsAndCrimsGun(data, 'bullpup'); + this.knife = new CopsAndCrimsGun(data, 'knife'); + this.deathmatch = new CopsAndCrimsGamemode(data, 'deathmatch'); + this.gungame = new CopsAndCrimsGamemode(data, 'gungame'); + } +} + +export default CopsAndCrims; diff --git a/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGamemode.test.ts b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGamemode.test.ts new file mode 100644 index 000000000..e3662ff7b --- /dev/null +++ b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGamemode.test.ts @@ -0,0 +1,38 @@ +import CopsAndCrimsGamemode from './CopsAndCrimsGamemode.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('CopsAndCrimsGamemode', () => { + const data = new CopsAndCrimsGamemode({ stats: 'meow' }, 'deathmatch'); + expect(data).toBeInstanceOf(CopsAndCrimsGamemode); + expectTypeOf(data).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.criminalKills).toBeDefined(); + expect(data.criminalKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.criminalKills).toEqualTypeOf(); + expect(data.copKills).toBeDefined(); + expect(data.copKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.copKills).toEqualTypeOf(); + expect(data.assists).toBeDefined(); + expect(data.assists).toBeGreaterThanOrEqual(0); + expectTypeOf(data.assists).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.gamesPlayed).toBeDefined(); + expect(data.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gamesPlayed).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGamemode.ts b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGamemode.ts new file mode 100644 index 000000000..c92a3a395 --- /dev/null +++ b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGamemode.ts @@ -0,0 +1,29 @@ +import Divide from '../../../Utils/Divide.js'; +import type { CopsAndCrimsGamemodes } from '../../../Types/Player.js'; + +class CopsAndCrimsGamemode { + kills: number; + criminalKills: number; + copKills: number; + assists: number; + deaths: number; + KDR: number; + wins: number; + gamesPlayed: number; + losses: number; + WLR: number; + constructor(data: Record, mode: CopsAndCrimsGamemodes) { + this.kills = data?.[`kills_${mode}`] || 0; + this.criminalKills = data?.[`criminal_kills_${mode}`] || 0; + this.copKills = data?.[`cop_kills_${mode}`] || 0; + this.assists = data?.[`assists_${mode}`] || 0; + this.deaths = data?.[`deaths_${mode}`] || 0; + this.KDR = Divide(this.kills, this.deaths); + this.wins = data?.[`game_wins_${mode}`] || 0; + this.gamesPlayed = data?.[`game_plays_${mode}`] || 0; + this.losses = this.gamesPlayed - this.wins; + this.WLR = Divide(this.wins, this.losses); + } +} + +export default CopsAndCrimsGamemode; diff --git a/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.test.ts b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.test.ts new file mode 100644 index 000000000..974a9880a --- /dev/null +++ b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.test.ts @@ -0,0 +1,29 @@ +import CopsAndCrimsGun from './CopsAndCrimsGun.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { CopsAndCrimsGuns } from '../../../Types/Player.js'; + +test('CopsAndCrimsGun', () => { + const data = new CopsAndCrimsGun({ stats: 'meow' }, 'smg'); + expect(data).toBeInstanceOf(CopsAndCrimsGun); + expectTypeOf(data).toEqualTypeOf(); + expect(data.gunName).toBeDefined(); + expectTypeOf(data.gunName).toEqualTypeOf(); + expect(data.damageIncrease).toBeDefined(); + expect(data.damageIncrease).toBeGreaterThanOrEqual(0); + expectTypeOf(data.damageIncrease).toEqualTypeOf(); + expect(data.recoilReduction).toBeDefined(); + expect(data.recoilReduction).toBeGreaterThanOrEqual(0); + expectTypeOf(data.recoilReduction).toEqualTypeOf(); + expect(data.reloadSpeedReduction).toBeDefined(); + expect(data.reloadSpeedReduction).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reloadSpeedReduction).toEqualTypeOf(); + expect(data.costReduction).toBeDefined(); + expect(data.costReduction).toBeGreaterThanOrEqual(0); + expectTypeOf(data.costReduction).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.headshots).toBeDefined(); + expect(data.headshots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.headshots).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.ts b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.ts new file mode 100644 index 000000000..b041e14a8 --- /dev/null +++ b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.ts @@ -0,0 +1,22 @@ +import { CopsAndCrimsGuns } from '../../../Types/Player.js'; + +class CopsAndCrimsGun { + gunName: CopsAndCrimsGuns; + damageIncrease: number; + recoilReduction: number; + reloadSpeedReduction: number; + costReduction: number; + kills: number; + headshots: number; + constructor(data: Record, gunName: CopsAndCrimsGuns) { + this.gunName = gunName; + this.damageIncrease = data?.[`${gunName}_damage_increase`] || 0; + this.recoilReduction = data?.[`${gunName}_recoil_reduction`] || 0; + this.reloadSpeedReduction = data?.[`${gunName}_reload_speed_reduction`] || 0; + this.costReduction = data?.[`${gunName}_cost_reduction`] || 0; + this.kills = data?.[`${gunName}Kills`] || data?.[`${gunName}_kills`] || 0; + this.headshots = data?.[`${gunName}Headshots`] || 0; + } +} + +export default CopsAndCrimsGun; diff --git a/src/Structures/MiniGames/Duels/Duels.test.ts b/src/Structures/MiniGames/Duels/Duels.test.ts new file mode 100644 index 000000000..7c7ad6158 --- /dev/null +++ b/src/Structures/MiniGames/Duels/Duels.test.ts @@ -0,0 +1,1860 @@ +import Duels from './Duels.js'; +import DuelsBridge from './DuelsBridge.js'; +import DuelsGamemode from './DuelsGamemode.js'; +import DuelsMegaWalls from './DuelsMegaWalls.js'; +import DuelsOP from './DuelsOP.js'; +import DuelsSkyWars from './DuelsSkyWars.js'; +import DuelsUHC from './DuelsUHC.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Duels', () => { + const data = new Duels({ stats: 'meow' }); + expect(data).toBeInstanceOf(Duels); + expectTypeOf(data).toEqualTypeOf(); + expect(data.tokens).toBeDefined(); + expect(data.tokens).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tokens).toEqualTypeOf(); + expect(data.title).toBeDefined(); + expectTypeOf(data.title).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.playedGames).toBeDefined(); + expect(data.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playedGames).toEqualTypeOf(); + expect(data.winstreak).toBeDefined(); + expect(data.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winstreak).toEqualTypeOf(); + expect(data.bestWinstreak).toBeDefined(); + expect(data.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bestWinstreak).toEqualTypeOf(); + expect(data.ping).toBeDefined(); + expect(data.ping).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ping).toEqualTypeOf(); + expect(data.blocksPlaced).toBeDefined(); + expect(data.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksPlaced).toEqualTypeOf(); + expect(data.swings).toBeDefined(); + expect(data.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.swings).toEqualTypeOf(); + expect(data.hits).toBeDefined(); + expect(data.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hits).toEqualTypeOf(); + expect(data.meleeAccuracy).toBeDefined(); + expect(data.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meleeAccuracy).toEqualTypeOf(); + expect(data.bowShots).toBeDefined(); + expect(data.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowShots).toEqualTypeOf(); + expect(data.bowHits).toBeDefined(); + expect(data.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowHits).toEqualTypeOf(); + expect(data.bowAccuracy).toBeDefined(); + expect(data.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowAccuracy).toEqualTypeOf(); + expect(data.healthRegenerated).toBeDefined(); + expect(data.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.healthRegenerated).toEqualTypeOf(); + expect(data.goldenApplesEatan).toBeDefined(); + expect(data.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goldenApplesEatan).toEqualTypeOf(); + expect(data.uhc).toBeDefined(); + expectTypeOf(data.uhc).toEqualTypeOf(); + expectTypeOf(data.uhc.title).toEqualTypeOf(); + expect(data.uhc.winstreak).toBeDefined(); + expect(data.uhc.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.winstreak).toEqualTypeOf(); + expect(data.uhc.bestWinstreak).toBeDefined(); + expect(data.uhc.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.bestWinstreak).toEqualTypeOf(); + expect(data.uhc.solo).toBeDefined(); + expectTypeOf(data.uhc.solo).toEqualTypeOf(); + expectTypeOf(data.uhc.solo.title).toEqualTypeOf(); + expect(data.uhc.solo.winstreak).toBeDefined(); + expect(data.uhc.solo.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.solo.winstreak).toEqualTypeOf(); + expect(data.uhc.solo.bestWinstreak).toBeDefined(); + expect(data.uhc.solo.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.solo.bestWinstreak).toEqualTypeOf(); + expect(data.uhc.solo.kills).toBeDefined(); + expect(data.uhc.solo.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.solo.kills).toEqualTypeOf(); + expect(data.uhc.solo.deaths).toBeDefined(); + expect(data.uhc.solo.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.solo.deaths).toEqualTypeOf(); + expect(data.uhc.solo.KDR).toBeDefined(); + expect(data.uhc.solo.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.solo.KDR).toEqualTypeOf(); + expect(data.uhc.solo.wins).toBeDefined(); + expect(data.uhc.solo.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.solo.wins).toEqualTypeOf(); + expect(data.uhc.solo.losses).toBeDefined(); + expect(data.uhc.solo.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.solo.losses).toEqualTypeOf(); + expect(data.uhc.solo.WLR).toBeDefined(); + expect(data.uhc.solo.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.solo.WLR).toEqualTypeOf(); + expect(data.uhc.solo.playedGames).toBeDefined(); + expect(data.uhc.solo.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.solo.playedGames).toEqualTypeOf(); + expect(data.uhc.solo.swings).toBeDefined(); + expect(data.uhc.solo.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.solo.swings).toEqualTypeOf(); + expect(data.uhc.solo.hits).toBeDefined(); + expect(data.uhc.solo.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.solo.hits).toEqualTypeOf(); + expect(data.uhc.solo.meleeAccuracy).toBeDefined(); + expect(data.uhc.solo.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.solo.meleeAccuracy).toEqualTypeOf(); + expect(data.uhc.solo.bowShots).toBeDefined(); + expect(data.uhc.solo.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.solo.bowShots).toEqualTypeOf(); + expect(data.uhc.solo.bowHits).toBeDefined(); + expect(data.uhc.solo.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.solo.bowHits).toEqualTypeOf(); + expect(data.uhc.solo.bowAccuracy).toBeDefined(); + expect(data.uhc.solo.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.solo.bowAccuracy).toEqualTypeOf(); + expect(data.uhc.solo.blocksPlaced).toBeDefined(); + expect(data.uhc.solo.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.solo.blocksPlaced).toEqualTypeOf(); + expect(data.uhc.solo.healthRegenerated).toBeDefined(); + expect(data.uhc.solo.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.solo.healthRegenerated).toEqualTypeOf(); + expect(data.uhc.solo.goldenApplesEatan).toBeDefined(); + expect(data.uhc.solo.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.solo.goldenApplesEatan).toEqualTypeOf(); + expect(data.uhc.doubles).toBeDefined(); + expectTypeOf(data.uhc.doubles).toEqualTypeOf(); + expectTypeOf(data.uhc.doubles.title).toEqualTypeOf(); + expect(data.uhc.doubles.winstreak).toBeDefined(); + expect(data.uhc.doubles.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.doubles.winstreak).toEqualTypeOf(); + expect(data.uhc.doubles.bestWinstreak).toBeDefined(); + expect(data.uhc.doubles.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.doubles.bestWinstreak).toEqualTypeOf(); + expect(data.uhc.doubles.kills).toBeDefined(); + expect(data.uhc.doubles.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.doubles.kills).toEqualTypeOf(); + expect(data.uhc.doubles.deaths).toBeDefined(); + expect(data.uhc.doubles.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.doubles.deaths).toEqualTypeOf(); + expect(data.uhc.doubles.KDR).toBeDefined(); + expect(data.uhc.doubles.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.doubles.KDR).toEqualTypeOf(); + expect(data.uhc.doubles.wins).toBeDefined(); + expect(data.uhc.doubles.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.doubles.wins).toEqualTypeOf(); + expect(data.uhc.doubles.losses).toBeDefined(); + expect(data.uhc.doubles.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.doubles.losses).toEqualTypeOf(); + expect(data.uhc.doubles.WLR).toBeDefined(); + expect(data.uhc.doubles.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.doubles.WLR).toEqualTypeOf(); + expect(data.uhc.doubles.playedGames).toBeDefined(); + expect(data.uhc.doubles.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.doubles.playedGames).toEqualTypeOf(); + expect(data.uhc.doubles.swings).toBeDefined(); + expect(data.uhc.doubles.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.doubles.swings).toEqualTypeOf(); + expect(data.uhc.doubles.hits).toBeDefined(); + expect(data.uhc.doubles.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.doubles.hits).toEqualTypeOf(); + expect(data.uhc.doubles.meleeAccuracy).toBeDefined(); + expect(data.uhc.doubles.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.doubles.meleeAccuracy).toEqualTypeOf(); + expect(data.uhc.doubles.bowShots).toBeDefined(); + expect(data.uhc.doubles.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.doubles.bowShots).toEqualTypeOf(); + expect(data.uhc.doubles.bowHits).toBeDefined(); + expect(data.uhc.doubles.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.doubles.bowHits).toEqualTypeOf(); + expect(data.uhc.doubles.bowAccuracy).toBeDefined(); + expect(data.uhc.doubles.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.doubles.bowAccuracy).toEqualTypeOf(); + expect(data.uhc.doubles.blocksPlaced).toBeDefined(); + expect(data.uhc.doubles.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.doubles.blocksPlaced).toEqualTypeOf(); + expect(data.uhc.doubles.healthRegenerated).toBeDefined(); + expect(data.uhc.doubles.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.doubles.healthRegenerated).toEqualTypeOf(); + expect(data.uhc.doubles.goldenApplesEatan).toBeDefined(); + expect(data.uhc.doubles.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.doubles.goldenApplesEatan).toEqualTypeOf(); + expect(data.uhc.fours).toBeDefined(); + expectTypeOf(data.uhc.fours).toEqualTypeOf(); + expectTypeOf(data.uhc.fours.title).toEqualTypeOf(); + expect(data.uhc.fours.winstreak).toBeDefined(); + expect(data.uhc.fours.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.fours.winstreak).toEqualTypeOf(); + expect(data.uhc.fours.bestWinstreak).toBeDefined(); + expect(data.uhc.fours.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.fours.bestWinstreak).toEqualTypeOf(); + expect(data.uhc.fours.kills).toBeDefined(); + expect(data.uhc.fours.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.fours.kills).toEqualTypeOf(); + expect(data.uhc.fours.deaths).toBeDefined(); + expect(data.uhc.fours.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.fours.deaths).toEqualTypeOf(); + expect(data.uhc.fours.KDR).toBeDefined(); + expect(data.uhc.fours.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.fours.KDR).toEqualTypeOf(); + expect(data.uhc.fours.wins).toBeDefined(); + expect(data.uhc.fours.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.fours.wins).toEqualTypeOf(); + expect(data.uhc.fours.losses).toBeDefined(); + expect(data.uhc.fours.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.fours.losses).toEqualTypeOf(); + expect(data.uhc.fours.WLR).toBeDefined(); + expect(data.uhc.fours.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.fours.WLR).toEqualTypeOf(); + expect(data.uhc.fours.playedGames).toBeDefined(); + expect(data.uhc.fours.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.fours.playedGames).toEqualTypeOf(); + expect(data.uhc.fours.swings).toBeDefined(); + expect(data.uhc.fours.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.fours.swings).toEqualTypeOf(); + expect(data.uhc.fours.hits).toBeDefined(); + expect(data.uhc.fours.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.fours.hits).toEqualTypeOf(); + expect(data.uhc.fours.meleeAccuracy).toBeDefined(); + expect(data.uhc.fours.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.fours.meleeAccuracy).toEqualTypeOf(); + expect(data.uhc.fours.bowShots).toBeDefined(); + expect(data.uhc.fours.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.fours.bowShots).toEqualTypeOf(); + expect(data.uhc.fours.bowHits).toBeDefined(); + expect(data.uhc.fours.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.fours.bowHits).toEqualTypeOf(); + expect(data.uhc.fours.bowAccuracy).toBeDefined(); + expect(data.uhc.fours.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.fours.bowAccuracy).toEqualTypeOf(); + expect(data.uhc.fours.blocksPlaced).toBeDefined(); + expect(data.uhc.fours.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.fours.blocksPlaced).toEqualTypeOf(); + expect(data.uhc.fours.healthRegenerated).toBeDefined(); + expect(data.uhc.fours.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.fours.healthRegenerated).toEqualTypeOf(); + expect(data.uhc.fours.goldenApplesEatan).toBeDefined(); + expect(data.uhc.fours.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.fours.goldenApplesEatan).toEqualTypeOf(); + expect(data.uhc.deathmatch).toBeDefined(); + expectTypeOf(data.uhc.deathmatch).toEqualTypeOf(); + expectTypeOf(data.uhc.deathmatch.title).toEqualTypeOf(); + expect(data.uhc.deathmatch.winstreak).toBeDefined(); + expect(data.uhc.deathmatch.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.deathmatch.winstreak).toEqualTypeOf(); + expect(data.uhc.deathmatch.bestWinstreak).toBeDefined(); + expect(data.uhc.deathmatch.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.deathmatch.bestWinstreak).toEqualTypeOf(); + expect(data.uhc.deathmatch.kills).toBeDefined(); + expect(data.uhc.deathmatch.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.deathmatch.kills).toEqualTypeOf(); + expect(data.uhc.deathmatch.deaths).toBeDefined(); + expect(data.uhc.deathmatch.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.deathmatch.deaths).toEqualTypeOf(); + expect(data.uhc.deathmatch.KDR).toBeDefined(); + expect(data.uhc.deathmatch.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.deathmatch.KDR).toEqualTypeOf(); + expect(data.uhc.deathmatch.wins).toBeDefined(); + expect(data.uhc.deathmatch.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.deathmatch.wins).toEqualTypeOf(); + expect(data.uhc.deathmatch.losses).toBeDefined(); + expect(data.uhc.deathmatch.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.deathmatch.losses).toEqualTypeOf(); + expect(data.uhc.deathmatch.WLR).toBeDefined(); + expect(data.uhc.deathmatch.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.deathmatch.WLR).toEqualTypeOf(); + expect(data.uhc.deathmatch.playedGames).toBeDefined(); + expect(data.uhc.deathmatch.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.deathmatch.playedGames).toEqualTypeOf(); + expect(data.uhc.deathmatch.swings).toBeDefined(); + expect(data.uhc.deathmatch.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.deathmatch.swings).toEqualTypeOf(); + expect(data.uhc.deathmatch.hits).toBeDefined(); + expect(data.uhc.deathmatch.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.deathmatch.hits).toEqualTypeOf(); + expect(data.uhc.deathmatch.meleeAccuracy).toBeDefined(); + expect(data.uhc.deathmatch.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.deathmatch.meleeAccuracy).toEqualTypeOf(); + expect(data.uhc.deathmatch.bowShots).toBeDefined(); + expect(data.uhc.deathmatch.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.deathmatch.bowShots).toEqualTypeOf(); + expect(data.uhc.deathmatch.bowHits).toBeDefined(); + expect(data.uhc.deathmatch.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.deathmatch.bowHits).toEqualTypeOf(); + expect(data.uhc.deathmatch.bowAccuracy).toBeDefined(); + expect(data.uhc.deathmatch.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.deathmatch.bowAccuracy).toEqualTypeOf(); + expect(data.uhc.deathmatch.blocksPlaced).toBeDefined(); + expect(data.uhc.deathmatch.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.deathmatch.blocksPlaced).toEqualTypeOf(); + expect(data.uhc.deathmatch.healthRegenerated).toBeDefined(); + expect(data.uhc.deathmatch.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.deathmatch.healthRegenerated).toEqualTypeOf(); + expect(data.uhc.deathmatch.goldenApplesEatan).toBeDefined(); + expect(data.uhc.deathmatch.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.deathmatch.goldenApplesEatan).toEqualTypeOf(); + expect(data.uhc.kills).toBeDefined(); + expect(data.uhc.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.kills).toEqualTypeOf(); + expect(data.uhc.deaths).toBeDefined(); + expect(data.uhc.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.deaths).toEqualTypeOf(); + expect(data.uhc.KDR).toBeDefined(); + expect(data.uhc.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.KDR).toEqualTypeOf(); + expect(data.uhc.wins).toBeDefined(); + expect(data.uhc.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.wins).toEqualTypeOf(); + expect(data.uhc.losses).toBeDefined(); + expect(data.uhc.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.losses).toEqualTypeOf(); + expect(data.uhc.WLR).toBeDefined(); + expect(data.uhc.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.WLR).toEqualTypeOf(); + expect(data.uhc.playedGames).toBeDefined(); + expect(data.uhc.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.playedGames).toEqualTypeOf(); + expect(data.uhc.swings).toBeDefined(); + expect(data.uhc.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.swings).toEqualTypeOf(); + expect(data.uhc.hits).toBeDefined(); + expect(data.uhc.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.hits).toEqualTypeOf(); + expect(data.uhc.meleeAccuracy).toBeDefined(); + expect(data.uhc.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.meleeAccuracy).toEqualTypeOf(); + expect(data.uhc.bowShots).toBeDefined(); + expect(data.uhc.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.bowShots).toEqualTypeOf(); + expect(data.uhc.bowHits).toBeDefined(); + expect(data.uhc.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.bowHits).toEqualTypeOf(); + expect(data.uhc.bowAccuracy).toBeDefined(); + expect(data.uhc.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.bowAccuracy).toEqualTypeOf(); + expect(data.uhc.blocksPlaced).toBeDefined(); + expect(data.uhc.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.blocksPlaced).toEqualTypeOf(); + expect(data.uhc.healthRegenerated).toBeDefined(); + expect(data.uhc.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.healthRegenerated).toEqualTypeOf(); + expect(data.uhc.goldenApplesEatan).toBeDefined(); + expect(data.uhc.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.goldenApplesEatan).toEqualTypeOf(); + expect(data.skywars).toBeDefined(); + expectTypeOf(data.skywars).toEqualTypeOf(); + expect(data.skywars.title).toBeDefined(); + expectTypeOf(data.skywars.title).toEqualTypeOf(); + expect(data.skywars.winstreak).toBeDefined(); + expect(data.skywars.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.winstreak).toEqualTypeOf(); + expect(data.skywars.bestWinstreak).toBeDefined(); + expect(data.skywars.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.bestWinstreak).toEqualTypeOf(); + expect(data.skywars.solo).toBeDefined(); + expectTypeOf(data.skywars.solo).toEqualTypeOf(); + expect(data.skywars.solo.title).toBeDefined(); + expectTypeOf(data.skywars.solo.title).toEqualTypeOf(); + expect(data.skywars.solo.winstreak).toBeDefined(); + expect(data.skywars.solo.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.solo.winstreak).toEqualTypeOf(); + expect(data.skywars.solo.bestWinstreak).toBeDefined(); + expect(data.skywars.solo.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.solo.bestWinstreak).toEqualTypeOf(); + expect(data.skywars.solo.kills).toBeDefined(); + expect(data.skywars.solo.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.solo.kills).toEqualTypeOf(); + expect(data.skywars.solo.deaths).toBeDefined(); + expect(data.skywars.solo.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.solo.deaths).toEqualTypeOf(); + expect(data.skywars.solo.KDR).toBeDefined(); + expect(data.skywars.solo.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.solo.KDR).toEqualTypeOf(); + expect(data.skywars.solo.wins).toBeDefined(); + expect(data.skywars.solo.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.solo.wins).toEqualTypeOf(); + expect(data.skywars.solo.losses).toBeDefined(); + expect(data.skywars.solo.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.solo.losses).toEqualTypeOf(); + expect(data.skywars.solo.WLR).toBeDefined(); + expect(data.skywars.solo.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.solo.WLR).toEqualTypeOf(); + expect(data.skywars.solo.playedGames).toBeDefined(); + expect(data.skywars.solo.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.solo.playedGames).toEqualTypeOf(); + expect(data.skywars.solo.swings).toBeDefined(); + expect(data.skywars.solo.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.solo.swings).toEqualTypeOf(); + expect(data.skywars.solo.hits).toBeDefined(); + expect(data.skywars.solo.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.solo.hits).toEqualTypeOf(); + expect(data.skywars.solo.meleeAccuracy).toBeDefined(); + expect(data.skywars.solo.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.solo.meleeAccuracy).toEqualTypeOf(); + expect(data.skywars.solo.bowShots).toBeDefined(); + expect(data.skywars.solo.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.solo.bowShots).toEqualTypeOf(); + expect(data.skywars.solo.bowHits).toBeDefined(); + expect(data.skywars.solo.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.solo.bowHits).toEqualTypeOf(); + expect(data.skywars.solo.bowAccuracy).toBeDefined(); + expect(data.skywars.solo.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.solo.bowAccuracy).toEqualTypeOf(); + expect(data.skywars.solo.blocksPlaced).toBeDefined(); + expect(data.skywars.solo.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.solo.blocksPlaced).toEqualTypeOf(); + expect(data.skywars.solo.healthRegenerated).toBeDefined(); + expect(data.skywars.solo.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.solo.healthRegenerated).toEqualTypeOf(); + expect(data.skywars.solo.goldenApplesEatan).toBeDefined(); + expect(data.skywars.solo.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.solo.goldenApplesEatan).toEqualTypeOf(); + expect(data.skywars.doubles).toBeDefined(); + expectTypeOf(data.skywars.doubles).toEqualTypeOf(); + expect(data.skywars.doubles.title).toBeDefined(); + expectTypeOf(data.skywars.doubles.title).toEqualTypeOf(); + expect(data.skywars.doubles.winstreak).toBeDefined(); + expect(data.skywars.doubles.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.doubles.winstreak).toEqualTypeOf(); + expect(data.skywars.doubles.bestWinstreak).toBeDefined(); + expect(data.skywars.doubles.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.doubles.bestWinstreak).toEqualTypeOf(); + expect(data.skywars.doubles.kills).toBeDefined(); + expect(data.skywars.doubles.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.doubles.kills).toEqualTypeOf(); + expect(data.skywars.doubles.deaths).toBeDefined(); + expect(data.skywars.doubles.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.doubles.deaths).toEqualTypeOf(); + expect(data.skywars.doubles.KDR).toBeDefined(); + expect(data.skywars.doubles.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.doubles.KDR).toEqualTypeOf(); + expect(data.skywars.doubles.wins).toBeDefined(); + expect(data.skywars.doubles.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.doubles.wins).toEqualTypeOf(); + expect(data.skywars.doubles.losses).toBeDefined(); + expect(data.skywars.doubles.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.doubles.losses).toEqualTypeOf(); + expect(data.skywars.doubles.WLR).toBeDefined(); + expect(data.skywars.doubles.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.doubles.WLR).toEqualTypeOf(); + expect(data.skywars.doubles.playedGames).toBeDefined(); + expect(data.skywars.doubles.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.doubles.playedGames).toEqualTypeOf(); + expect(data.skywars.doubles.swings).toBeDefined(); + expect(data.skywars.doubles.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.doubles.swings).toEqualTypeOf(); + expect(data.skywars.doubles.hits).toBeDefined(); + expect(data.skywars.doubles.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.doubles.hits).toEqualTypeOf(); + expect(data.skywars.doubles.meleeAccuracy).toBeDefined(); + expect(data.skywars.doubles.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.doubles.meleeAccuracy).toEqualTypeOf(); + expect(data.skywars.doubles.bowShots).toBeDefined(); + expect(data.skywars.doubles.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.doubles.bowShots).toEqualTypeOf(); + expect(data.skywars.doubles.bowHits).toBeDefined(); + expect(data.skywars.doubles.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.doubles.bowHits).toEqualTypeOf(); + expect(data.skywars.doubles.bowAccuracy).toBeDefined(); + expect(data.skywars.doubles.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.doubles.bowAccuracy).toEqualTypeOf(); + expect(data.skywars.doubles.blocksPlaced).toBeDefined(); + expect(data.skywars.doubles.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.doubles.blocksPlaced).toEqualTypeOf(); + expect(data.skywars.doubles.healthRegenerated).toBeDefined(); + expect(data.skywars.doubles.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.doubles.healthRegenerated).toEqualTypeOf(); + expect(data.skywars.doubles.goldenApplesEatan).toBeDefined(); + expect(data.skywars.doubles.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.doubles.goldenApplesEatan).toEqualTypeOf(); + expect(data.skywars.kills).toBeDefined(); + expect(data.skywars.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.kills).toEqualTypeOf(); + expect(data.skywars.deaths).toBeDefined(); + expect(data.skywars.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.deaths).toEqualTypeOf(); + expect(data.skywars.KDR).toBeDefined(); + expect(data.skywars.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.KDR).toEqualTypeOf(); + expect(data.skywars.wins).toBeDefined(); + expect(data.skywars.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.wins).toEqualTypeOf(); + expect(data.skywars.losses).toBeDefined(); + expect(data.skywars.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.losses).toEqualTypeOf(); + expect(data.skywars.WLR).toBeDefined(); + expect(data.skywars.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.WLR).toEqualTypeOf(); + expect(data.skywars.playedGames).toBeDefined(); + expect(data.skywars.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.playedGames).toEqualTypeOf(); + expect(data.skywars.swings).toBeDefined(); + expect(data.skywars.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.swings).toEqualTypeOf(); + expect(data.skywars.hits).toBeDefined(); + expect(data.skywars.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.hits).toEqualTypeOf(); + expect(data.skywars.meleeAccuracy).toBeDefined(); + expect(data.skywars.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.meleeAccuracy).toEqualTypeOf(); + expect(data.skywars.bowShots).toBeDefined(); + expect(data.skywars.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.bowShots).toEqualTypeOf(); + expect(data.skywars.bowHits).toBeDefined(); + expect(data.skywars.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.bowHits).toEqualTypeOf(); + expect(data.skywars.bowAccuracy).toBeDefined(); + expect(data.skywars.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.bowAccuracy).toEqualTypeOf(); + expect(data.skywars.blocksPlaced).toBeDefined(); + expect(data.skywars.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.blocksPlaced).toEqualTypeOf(); + expect(data.skywars.healthRegenerated).toBeDefined(); + expect(data.skywars.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.healthRegenerated).toEqualTypeOf(); + expect(data.skywars.goldenApplesEatan).toBeDefined(); + expect(data.skywars.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.goldenApplesEatan).toEqualTypeOf(); + expect(data.megawalls).toBeDefined(); + expectTypeOf(data.megawalls).toEqualTypeOf(); + expect(data.megawalls.title).toBeDefined(); + expectTypeOf(data.megawalls.title).toEqualTypeOf(); + expect(data.megawalls.winstreak).toBeDefined(); + expect(data.megawalls.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.winstreak).toEqualTypeOf(); + expect(data.megawalls.bestWinstreak).toBeDefined(); + expect(data.megawalls.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.bestWinstreak).toEqualTypeOf(); + expect(data.megawalls.solo).toBeDefined(); + expectTypeOf(data.megawalls.solo).toEqualTypeOf(); + expect(data.megawalls.solo.title).toBeDefined(); + expectTypeOf(data.megawalls.solo.title).toEqualTypeOf(); + expect(data.megawalls.solo.winstreak).toBeDefined(); + expect(data.megawalls.solo.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.solo.winstreak).toEqualTypeOf(); + expect(data.megawalls.solo.bestWinstreak).toBeDefined(); + expect(data.megawalls.solo.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.solo.bestWinstreak).toEqualTypeOf(); + expect(data.megawalls.solo.kills).toBeDefined(); + expect(data.megawalls.solo.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.solo.kills).toEqualTypeOf(); + expect(data.megawalls.solo.deaths).toBeDefined(); + expect(data.megawalls.solo.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.solo.deaths).toEqualTypeOf(); + expect(data.megawalls.solo.KDR).toBeDefined(); + expect(data.megawalls.solo.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.solo.KDR).toEqualTypeOf(); + expect(data.megawalls.solo.wins).toBeDefined(); + expect(data.megawalls.solo.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.solo.wins).toEqualTypeOf(); + expect(data.megawalls.solo.losses).toBeDefined(); + expect(data.megawalls.solo.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.solo.losses).toEqualTypeOf(); + expect(data.megawalls.solo.WLR).toBeDefined(); + expect(data.megawalls.solo.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.solo.WLR).toEqualTypeOf(); + expect(data.megawalls.solo.playedGames).toBeDefined(); + expect(data.megawalls.solo.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.solo.playedGames).toEqualTypeOf(); + expect(data.megawalls.solo.swings).toBeDefined(); + expect(data.megawalls.solo.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.solo.swings).toEqualTypeOf(); + expect(data.megawalls.solo.hits).toBeDefined(); + expect(data.megawalls.solo.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.solo.hits).toEqualTypeOf(); + expect(data.megawalls.solo.meleeAccuracy).toBeDefined(); + expect(data.megawalls.solo.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.solo.meleeAccuracy).toEqualTypeOf(); + expect(data.megawalls.solo.bowShots).toBeDefined(); + expect(data.megawalls.solo.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.solo.bowShots).toEqualTypeOf(); + expect(data.megawalls.solo.bowHits).toBeDefined(); + expect(data.megawalls.solo.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.solo.bowHits).toEqualTypeOf(); + expect(data.megawalls.solo.bowAccuracy).toBeDefined(); + expect(data.megawalls.solo.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.solo.bowAccuracy).toEqualTypeOf(); + expect(data.megawalls.solo.blocksPlaced).toBeDefined(); + expect(data.megawalls.solo.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.solo.blocksPlaced).toEqualTypeOf(); + expect(data.megawalls.solo.healthRegenerated).toBeDefined(); + expect(data.megawalls.solo.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.solo.healthRegenerated).toEqualTypeOf(); + expect(data.megawalls.solo.goldenApplesEatan).toBeDefined(); + expect(data.megawalls.solo.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.solo.goldenApplesEatan).toEqualTypeOf(); + expect(data.megawalls.doubles).toBeDefined(); + expectTypeOf(data.megawalls.doubles).toEqualTypeOf(); + expect(data.megawalls.doubles.title).toBeDefined(); + expectTypeOf(data.megawalls.doubles.title).toEqualTypeOf(); + expect(data.megawalls.doubles.winstreak).toBeDefined(); + expect(data.megawalls.doubles.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.doubles.winstreak).toEqualTypeOf(); + expect(data.megawalls.doubles.bestWinstreak).toBeDefined(); + expect(data.megawalls.doubles.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.doubles.bestWinstreak).toEqualTypeOf(); + expect(data.megawalls.doubles.kills).toBeDefined(); + expect(data.megawalls.doubles.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.doubles.kills).toEqualTypeOf(); + expect(data.megawalls.doubles.deaths).toBeDefined(); + expect(data.megawalls.doubles.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.doubles.deaths).toEqualTypeOf(); + expect(data.megawalls.doubles.KDR).toBeDefined(); + expect(data.megawalls.doubles.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.doubles.KDR).toEqualTypeOf(); + expect(data.megawalls.doubles.wins).toBeDefined(); + expect(data.megawalls.doubles.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.doubles.wins).toEqualTypeOf(); + expect(data.megawalls.doubles.losses).toBeDefined(); + expect(data.megawalls.doubles.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.doubles.losses).toEqualTypeOf(); + expect(data.megawalls.doubles.WLR).toBeDefined(); + expect(data.megawalls.doubles.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.doubles.WLR).toEqualTypeOf(); + expect(data.megawalls.doubles.playedGames).toBeDefined(); + expect(data.megawalls.doubles.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.doubles.playedGames).toEqualTypeOf(); + expect(data.megawalls.doubles.swings).toBeDefined(); + expect(data.megawalls.doubles.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.doubles.swings).toEqualTypeOf(); + expect(data.megawalls.doubles.hits).toBeDefined(); + expect(data.megawalls.doubles.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.doubles.hits).toEqualTypeOf(); + expect(data.megawalls.doubles.meleeAccuracy).toBeDefined(); + expect(data.megawalls.doubles.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.doubles.meleeAccuracy).toEqualTypeOf(); + expect(data.megawalls.doubles.bowShots).toBeDefined(); + expect(data.megawalls.doubles.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.doubles.bowShots).toEqualTypeOf(); + expect(data.megawalls.doubles.bowHits).toBeDefined(); + expect(data.megawalls.doubles.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.doubles.bowHits).toEqualTypeOf(); + expect(data.megawalls.doubles.bowAccuracy).toBeDefined(); + expect(data.megawalls.doubles.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.doubles.bowAccuracy).toEqualTypeOf(); + expect(data.megawalls.doubles.blocksPlaced).toBeDefined(); + expect(data.megawalls.doubles.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.doubles.blocksPlaced).toEqualTypeOf(); + expect(data.megawalls.doubles.healthRegenerated).toBeDefined(); + expect(data.megawalls.doubles.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.doubles.healthRegenerated).toEqualTypeOf(); + expect(data.megawalls.doubles.goldenApplesEatan).toBeDefined(); + expect(data.megawalls.doubles.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.doubles.goldenApplesEatan).toEqualTypeOf(); + expect(data.megawalls.kills).toBeDefined(); + expect(data.megawalls.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.kills).toEqualTypeOf(); + expect(data.megawalls.deaths).toBeDefined(); + expect(data.megawalls.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.deaths).toEqualTypeOf(); + expect(data.megawalls.KDR).toBeDefined(); + expect(data.megawalls.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.KDR).toEqualTypeOf(); + expect(data.megawalls.wins).toBeDefined(); + expect(data.megawalls.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.wins).toEqualTypeOf(); + expect(data.megawalls.losses).toBeDefined(); + expect(data.megawalls.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.losses).toEqualTypeOf(); + expect(data.megawalls.WLR).toBeDefined(); + expect(data.megawalls.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.WLR).toEqualTypeOf(); + expect(data.megawalls.playedGames).toBeDefined(); + expect(data.megawalls.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.playedGames).toEqualTypeOf(); + expect(data.megawalls.swings).toBeDefined(); + expect(data.megawalls.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.swings).toEqualTypeOf(); + expect(data.megawalls.hits).toBeDefined(); + expect(data.megawalls.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.hits).toEqualTypeOf(); + expect(data.megawalls.meleeAccuracy).toBeDefined(); + expect(data.megawalls.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.meleeAccuracy).toEqualTypeOf(); + expect(data.megawalls.bowShots).toBeDefined(); + expect(data.megawalls.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.bowShots).toEqualTypeOf(); + expect(data.megawalls.bowHits).toBeDefined(); + expect(data.megawalls.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.bowHits).toEqualTypeOf(); + expect(data.megawalls.bowAccuracy).toBeDefined(); + expect(data.megawalls.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.bowAccuracy).toEqualTypeOf(); + expect(data.megawalls.blocksPlaced).toBeDefined(); + expect(data.megawalls.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.blocksPlaced).toEqualTypeOf(); + expect(data.megawalls.healthRegenerated).toBeDefined(); + expect(data.megawalls.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.healthRegenerated).toEqualTypeOf(); + expect(data.megawalls.goldenApplesEatan).toBeDefined(); + expect(data.megawalls.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.goldenApplesEatan).toEqualTypeOf(); + expect(data.blitz).toBeDefined(); + expectTypeOf(data.blitz).toEqualTypeOf(); + expectTypeOf(data.blitz.title).toEqualTypeOf(); + expect(data.blitz.winstreak).toBeDefined(); + expect(data.blitz.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blitz.winstreak).toEqualTypeOf(); + expect(data.blitz.bestWinstreak).toBeDefined(); + expect(data.blitz.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blitz.bestWinstreak).toEqualTypeOf(); + expect(data.blitz.kills).toBeDefined(); + expect(data.blitz.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blitz.kills).toEqualTypeOf(); + expect(data.blitz.deaths).toBeDefined(); + expect(data.blitz.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blitz.deaths).toEqualTypeOf(); + expect(data.blitz.KDR).toBeDefined(); + expect(data.blitz.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blitz.KDR).toEqualTypeOf(); + expect(data.blitz.wins).toBeDefined(); + expect(data.blitz.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blitz.wins).toEqualTypeOf(); + expect(data.blitz.losses).toBeDefined(); + expect(data.blitz.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blitz.losses).toEqualTypeOf(); + expect(data.blitz.WLR).toBeDefined(); + expect(data.blitz.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blitz.WLR).toEqualTypeOf(); + expect(data.blitz.playedGames).toBeDefined(); + expect(data.blitz.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blitz.playedGames).toEqualTypeOf(); + expect(data.blitz.swings).toBeDefined(); + expect(data.blitz.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blitz.swings).toEqualTypeOf(); + expect(data.blitz.hits).toBeDefined(); + expect(data.blitz.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blitz.hits).toEqualTypeOf(); + expect(data.blitz.meleeAccuracy).toBeDefined(); + expect(data.blitz.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blitz.meleeAccuracy).toEqualTypeOf(); + expect(data.blitz.bowShots).toBeDefined(); + expect(data.blitz.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blitz.bowShots).toEqualTypeOf(); + expect(data.blitz.bowHits).toBeDefined(); + expect(data.blitz.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blitz.bowHits).toEqualTypeOf(); + expect(data.blitz.bowAccuracy).toBeDefined(); + expect(data.blitz.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blitz.bowAccuracy).toEqualTypeOf(); + expect(data.blitz.blocksPlaced).toBeDefined(); + expect(data.blitz.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blitz.blocksPlaced).toEqualTypeOf(); + expect(data.blitz.healthRegenerated).toBeDefined(); + expect(data.blitz.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blitz.healthRegenerated).toEqualTypeOf(); + expect(data.blitz.goldenApplesEatan).toBeDefined(); + expect(data.blitz.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blitz.goldenApplesEatan).toEqualTypeOf(); + expect(data.op).toBeDefined(); + expectTypeOf(data.op).toEqualTypeOf(); + expect(data.op.title).toBeDefined(); + expectTypeOf(data.op.title).toEqualTypeOf(); + expect(data.op.winstreak).toBeDefined(); + expect(data.op.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.winstreak).toEqualTypeOf(); + expect(data.op.bestWinstreak).toBeDefined(); + expect(data.op.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.bestWinstreak).toEqualTypeOf(); + expect(data.op.solo).toBeDefined(); + expectTypeOf(data.op.solo).toEqualTypeOf(); + expect(data.op.solo.title).toBeDefined(); + expectTypeOf(data.op.solo.title).toEqualTypeOf(); + expect(data.op.solo.winstreak).toBeDefined(); + expect(data.op.solo.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.solo.winstreak).toEqualTypeOf(); + expect(data.op.solo.bestWinstreak).toBeDefined(); + expect(data.op.solo.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.solo.bestWinstreak).toEqualTypeOf(); + expect(data.op.solo.kills).toBeDefined(); + expect(data.op.solo.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.solo.kills).toEqualTypeOf(); + expect(data.op.solo.deaths).toBeDefined(); + expect(data.op.solo.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.solo.deaths).toEqualTypeOf(); + expect(data.op.solo.KDR).toBeDefined(); + expect(data.op.solo.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.solo.KDR).toEqualTypeOf(); + expect(data.op.solo.wins).toBeDefined(); + expect(data.op.solo.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.solo.wins).toEqualTypeOf(); + expect(data.op.solo.losses).toBeDefined(); + expect(data.op.solo.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.solo.losses).toEqualTypeOf(); + expect(data.op.solo.WLR).toBeDefined(); + expect(data.op.solo.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.solo.WLR).toEqualTypeOf(); + expect(data.op.solo.playedGames).toBeDefined(); + expect(data.op.solo.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.solo.playedGames).toEqualTypeOf(); + expect(data.op.solo.swings).toBeDefined(); + expect(data.op.solo.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.solo.swings).toEqualTypeOf(); + expect(data.op.solo.hits).toBeDefined(); + expect(data.op.solo.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.solo.hits).toEqualTypeOf(); + expect(data.op.solo.meleeAccuracy).toBeDefined(); + expect(data.op.solo.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.solo.meleeAccuracy).toEqualTypeOf(); + expect(data.op.solo.bowShots).toBeDefined(); + expect(data.op.solo.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.solo.bowShots).toEqualTypeOf(); + expect(data.op.solo.bowHits).toBeDefined(); + expect(data.op.solo.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.solo.bowHits).toEqualTypeOf(); + expect(data.op.solo.bowAccuracy).toBeDefined(); + expect(data.op.solo.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.solo.bowAccuracy).toEqualTypeOf(); + expect(data.op.solo.blocksPlaced).toBeDefined(); + expect(data.op.solo.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.solo.blocksPlaced).toEqualTypeOf(); + expect(data.op.solo.healthRegenerated).toBeDefined(); + expect(data.op.solo.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.solo.healthRegenerated).toEqualTypeOf(); + expect(data.op.solo.goldenApplesEatan).toBeDefined(); + expect(data.op.solo.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.solo.goldenApplesEatan).toEqualTypeOf(); + expect(data.op.doubles).toBeDefined(); + expectTypeOf(data.op.doubles).toEqualTypeOf(); + expect(data.op.doubles.title).toBeDefined(); + expectTypeOf(data.op.doubles.title).toEqualTypeOf(); + expect(data.op.doubles.winstreak).toBeDefined(); + expect(data.op.doubles.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.doubles.winstreak).toEqualTypeOf(); + expect(data.op.doubles.bestWinstreak).toBeDefined(); + expect(data.op.doubles.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.doubles.bestWinstreak).toEqualTypeOf(); + expect(data.op.doubles.kills).toBeDefined(); + expect(data.op.doubles.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.doubles.kills).toEqualTypeOf(); + expect(data.op.doubles.deaths).toBeDefined(); + expect(data.op.doubles.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.doubles.deaths).toEqualTypeOf(); + expect(data.op.doubles.KDR).toBeDefined(); + expect(data.op.doubles.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.doubles.KDR).toEqualTypeOf(); + expect(data.op.doubles.wins).toBeDefined(); + expect(data.op.doubles.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.doubles.wins).toEqualTypeOf(); + expect(data.op.doubles.losses).toBeDefined(); + expect(data.op.doubles.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.doubles.losses).toEqualTypeOf(); + expect(data.op.doubles.WLR).toBeDefined(); + expect(data.op.doubles.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.doubles.WLR).toEqualTypeOf(); + expect(data.op.doubles.playedGames).toBeDefined(); + expect(data.op.doubles.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.doubles.playedGames).toEqualTypeOf(); + expect(data.op.doubles.swings).toBeDefined(); + expect(data.op.doubles.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.doubles.swings).toEqualTypeOf(); + expect(data.op.doubles.hits).toBeDefined(); + expect(data.op.doubles.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.doubles.hits).toEqualTypeOf(); + expect(data.op.doubles.meleeAccuracy).toBeDefined(); + expect(data.op.doubles.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.doubles.meleeAccuracy).toEqualTypeOf(); + expect(data.op.doubles.bowShots).toBeDefined(); + expect(data.op.doubles.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.doubles.bowShots).toEqualTypeOf(); + expect(data.op.doubles.bowHits).toBeDefined(); + expect(data.op.doubles.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.doubles.bowHits).toEqualTypeOf(); + expect(data.op.doubles.bowAccuracy).toBeDefined(); + expect(data.op.doubles.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.doubles.bowAccuracy).toEqualTypeOf(); + expect(data.op.doubles.blocksPlaced).toBeDefined(); + expect(data.op.doubles.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.doubles.blocksPlaced).toEqualTypeOf(); + expect(data.op.doubles.healthRegenerated).toBeDefined(); + expect(data.op.doubles.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.doubles.healthRegenerated).toEqualTypeOf(); + expect(data.op.doubles.goldenApplesEatan).toBeDefined(); + expect(data.op.doubles.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.doubles.goldenApplesEatan).toEqualTypeOf(); + expect(data.op.kills).toBeDefined(); + expect(data.op.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.kills).toEqualTypeOf(); + expect(data.op.deaths).toBeDefined(); + expect(data.op.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.deaths).toEqualTypeOf(); + expect(data.op.KDR).toBeDefined(); + expect(data.op.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.KDR).toEqualTypeOf(); + expect(data.op.wins).toBeDefined(); + expect(data.op.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.wins).toEqualTypeOf(); + expect(data.op.losses).toBeDefined(); + expect(data.op.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.losses).toEqualTypeOf(); + expect(data.op.WLR).toBeDefined(); + expect(data.op.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.WLR).toEqualTypeOf(); + expect(data.op.playedGames).toBeDefined(); + expect(data.op.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.playedGames).toEqualTypeOf(); + expect(data.op.swings).toBeDefined(); + expect(data.op.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.swings).toEqualTypeOf(); + expect(data.op.hits).toBeDefined(); + expect(data.op.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.hits).toEqualTypeOf(); + expect(data.op.meleeAccuracy).toBeDefined(); + expect(data.op.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.meleeAccuracy).toEqualTypeOf(); + expect(data.op.bowShots).toBeDefined(); + expect(data.op.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.bowShots).toEqualTypeOf(); + expect(data.op.bowHits).toBeDefined(); + expect(data.op.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.bowHits).toEqualTypeOf(); + expect(data.op.bowAccuracy).toBeDefined(); + expect(data.op.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.bowAccuracy).toEqualTypeOf(); + expect(data.op.blocksPlaced).toBeDefined(); + expect(data.op.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.blocksPlaced).toEqualTypeOf(); + expect(data.op.healthRegenerated).toBeDefined(); + expect(data.op.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.healthRegenerated).toEqualTypeOf(); + expect(data.op.goldenApplesEatan).toBeDefined(); + expect(data.op.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.goldenApplesEatan).toEqualTypeOf(); + expect(data.classic).toBeDefined(); + expectTypeOf(data.classic).toEqualTypeOf(); + expectTypeOf(data.classic.title).toEqualTypeOf(); + expect(data.classic.winstreak).toBeDefined(); + expect(data.classic.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.classic.winstreak).toEqualTypeOf(); + expect(data.classic.bestWinstreak).toBeDefined(); + expect(data.classic.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.classic.bestWinstreak).toEqualTypeOf(); + expect(data.classic.kills).toBeDefined(); + expect(data.classic.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.classic.kills).toEqualTypeOf(); + expect(data.classic.deaths).toBeDefined(); + expect(data.classic.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.classic.deaths).toEqualTypeOf(); + expect(data.classic.KDR).toBeDefined(); + expect(data.classic.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.classic.KDR).toEqualTypeOf(); + expect(data.classic.wins).toBeDefined(); + expect(data.classic.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.classic.wins).toEqualTypeOf(); + expect(data.classic.losses).toBeDefined(); + expect(data.classic.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.classic.losses).toEqualTypeOf(); + expect(data.classic.WLR).toBeDefined(); + expect(data.classic.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.classic.WLR).toEqualTypeOf(); + expect(data.classic.playedGames).toBeDefined(); + expect(data.classic.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.classic.playedGames).toEqualTypeOf(); + expect(data.classic.swings).toBeDefined(); + expect(data.classic.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.classic.swings).toEqualTypeOf(); + expect(data.classic.hits).toBeDefined(); + expect(data.classic.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.classic.hits).toEqualTypeOf(); + expect(data.classic.meleeAccuracy).toBeDefined(); + expect(data.classic.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.classic.meleeAccuracy).toEqualTypeOf(); + expect(data.classic.bowShots).toBeDefined(); + expect(data.classic.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.classic.bowShots).toEqualTypeOf(); + expect(data.classic.bowHits).toBeDefined(); + expect(data.classic.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.classic.bowHits).toEqualTypeOf(); + expect(data.classic.bowAccuracy).toBeDefined(); + expect(data.classic.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.classic.bowAccuracy).toEqualTypeOf(); + expect(data.classic.blocksPlaced).toBeDefined(); + expect(data.classic.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.classic.blocksPlaced).toEqualTypeOf(); + expect(data.classic.healthRegenerated).toBeDefined(); + expect(data.classic.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.classic.healthRegenerated).toEqualTypeOf(); + expect(data.classic.goldenApplesEatan).toBeDefined(); + expect(data.classic.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.classic.goldenApplesEatan).toEqualTypeOf(); + expect(data.bow).toBeDefined(); + expectTypeOf(data.bow).toEqualTypeOf(); + expectTypeOf(data.bow.title).toEqualTypeOf(); + expect(data.bow.winstreak).toBeDefined(); + expect(data.bow.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bow.winstreak).toEqualTypeOf(); + expect(data.bow.bestWinstreak).toBeDefined(); + expect(data.bow.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bow.bestWinstreak).toEqualTypeOf(); + expect(data.bow.kills).toBeDefined(); + expect(data.bow.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bow.kills).toEqualTypeOf(); + expect(data.bow.deaths).toBeDefined(); + expect(data.bow.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bow.deaths).toEqualTypeOf(); + expect(data.bow.KDR).toBeDefined(); + expect(data.bow.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bow.KDR).toEqualTypeOf(); + expect(data.bow.wins).toBeDefined(); + expect(data.bow.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bow.wins).toEqualTypeOf(); + expect(data.bow.losses).toBeDefined(); + expect(data.bow.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bow.losses).toEqualTypeOf(); + expect(data.bow.WLR).toBeDefined(); + expect(data.bow.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bow.WLR).toEqualTypeOf(); + expect(data.bow.playedGames).toBeDefined(); + expect(data.bow.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bow.playedGames).toEqualTypeOf(); + expect(data.bow.swings).toBeDefined(); + expect(data.bow.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bow.swings).toEqualTypeOf(); + expect(data.bow.hits).toBeDefined(); + expect(data.bow.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bow.hits).toEqualTypeOf(); + expect(data.bow.meleeAccuracy).toBeDefined(); + expect(data.bow.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bow.meleeAccuracy).toEqualTypeOf(); + expect(data.bow.bowShots).toBeDefined(); + expect(data.bow.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bow.bowShots).toEqualTypeOf(); + expect(data.bow.bowHits).toBeDefined(); + expect(data.bow.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bow.bowHits).toEqualTypeOf(); + expect(data.bow.bowAccuracy).toBeDefined(); + expect(data.bow.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bow.bowAccuracy).toEqualTypeOf(); + expect(data.bow.blocksPlaced).toBeDefined(); + expect(data.bow.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bow.blocksPlaced).toEqualTypeOf(); + expect(data.bow.healthRegenerated).toBeDefined(); + expect(data.bow.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bow.healthRegenerated).toEqualTypeOf(); + expect(data.bow.goldenApplesEatan).toBeDefined(); + expect(data.bow.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bow.goldenApplesEatan).toEqualTypeOf(); + expect(data.noDebuff).toBeDefined(); + expectTypeOf(data.noDebuff).toEqualTypeOf(); + expectTypeOf(data.noDebuff.title).toEqualTypeOf(); + expect(data.noDebuff.winstreak).toBeDefined(); + expect(data.noDebuff.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.noDebuff.winstreak).toEqualTypeOf(); + expect(data.noDebuff.bestWinstreak).toBeDefined(); + expect(data.noDebuff.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.noDebuff.bestWinstreak).toEqualTypeOf(); + expect(data.noDebuff.kills).toBeDefined(); + expect(data.noDebuff.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.noDebuff.kills).toEqualTypeOf(); + expect(data.noDebuff.deaths).toBeDefined(); + expect(data.noDebuff.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.noDebuff.deaths).toEqualTypeOf(); + expect(data.noDebuff.KDR).toBeDefined(); + expect(data.noDebuff.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.noDebuff.KDR).toEqualTypeOf(); + expect(data.noDebuff.wins).toBeDefined(); + expect(data.noDebuff.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.noDebuff.wins).toEqualTypeOf(); + expect(data.noDebuff.losses).toBeDefined(); + expect(data.noDebuff.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.noDebuff.losses).toEqualTypeOf(); + expect(data.noDebuff.WLR).toBeDefined(); + expect(data.noDebuff.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.noDebuff.WLR).toEqualTypeOf(); + expect(data.noDebuff.playedGames).toBeDefined(); + expect(data.noDebuff.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.noDebuff.playedGames).toEqualTypeOf(); + expect(data.noDebuff.swings).toBeDefined(); + expect(data.noDebuff.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.noDebuff.swings).toEqualTypeOf(); + expect(data.noDebuff.hits).toBeDefined(); + expect(data.noDebuff.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.noDebuff.hits).toEqualTypeOf(); + expect(data.noDebuff.meleeAccuracy).toBeDefined(); + expect(data.noDebuff.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.noDebuff.meleeAccuracy).toEqualTypeOf(); + expect(data.noDebuff.bowShots).toBeDefined(); + expect(data.noDebuff.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.noDebuff.bowShots).toEqualTypeOf(); + expect(data.noDebuff.bowHits).toBeDefined(); + expect(data.noDebuff.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.noDebuff.bowHits).toEqualTypeOf(); + expect(data.noDebuff.bowAccuracy).toBeDefined(); + expect(data.noDebuff.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.noDebuff.bowAccuracy).toEqualTypeOf(); + expect(data.noDebuff.blocksPlaced).toBeDefined(); + expect(data.noDebuff.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.noDebuff.blocksPlaced).toEqualTypeOf(); + expect(data.noDebuff.healthRegenerated).toBeDefined(); + expect(data.noDebuff.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.noDebuff.healthRegenerated).toEqualTypeOf(); + expect(data.noDebuff.goldenApplesEatan).toBeDefined(); + expect(data.noDebuff.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.noDebuff.goldenApplesEatan).toEqualTypeOf(); + expect(data.combo).toBeDefined(); + expectTypeOf(data.combo).toEqualTypeOf(); + expectTypeOf(data.combo.title).toEqualTypeOf(); + expect(data.combo.winstreak).toBeDefined(); + expect(data.combo.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.combo.winstreak).toEqualTypeOf(); + expect(data.combo.bestWinstreak).toBeDefined(); + expect(data.combo.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.combo.bestWinstreak).toEqualTypeOf(); + expect(data.combo.kills).toBeDefined(); + expect(data.combo.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.combo.kills).toEqualTypeOf(); + expect(data.combo.deaths).toBeDefined(); + expect(data.combo.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.combo.deaths).toEqualTypeOf(); + expect(data.combo.KDR).toBeDefined(); + expect(data.combo.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.combo.KDR).toEqualTypeOf(); + expect(data.combo.wins).toBeDefined(); + expect(data.combo.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.combo.wins).toEqualTypeOf(); + expect(data.combo.losses).toBeDefined(); + expect(data.combo.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.combo.losses).toEqualTypeOf(); + expect(data.combo.WLR).toBeDefined(); + expect(data.combo.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.combo.WLR).toEqualTypeOf(); + expect(data.combo.playedGames).toBeDefined(); + expect(data.combo.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.combo.playedGames).toEqualTypeOf(); + expect(data.combo.swings).toBeDefined(); + expect(data.combo.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.combo.swings).toEqualTypeOf(); + expect(data.combo.hits).toBeDefined(); + expect(data.combo.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.combo.hits).toEqualTypeOf(); + expect(data.combo.meleeAccuracy).toBeDefined(); + expect(data.combo.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.combo.meleeAccuracy).toEqualTypeOf(); + expect(data.combo.bowShots).toBeDefined(); + expect(data.combo.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.combo.bowShots).toEqualTypeOf(); + expect(data.combo.bowHits).toBeDefined(); + expect(data.combo.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.combo.bowHits).toEqualTypeOf(); + expect(data.combo.bowAccuracy).toBeDefined(); + expect(data.combo.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.combo.bowAccuracy).toEqualTypeOf(); + expect(data.combo.blocksPlaced).toBeDefined(); + expect(data.combo.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.combo.blocksPlaced).toEqualTypeOf(); + expect(data.combo.healthRegenerated).toBeDefined(); + expect(data.combo.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.combo.healthRegenerated).toEqualTypeOf(); + expect(data.combo.goldenApplesEatan).toBeDefined(); + expect(data.combo.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.combo.goldenApplesEatan).toEqualTypeOf(); + expect(data.bowSpleef).toBeDefined(); + expectTypeOf(data.bowSpleef).toEqualTypeOf(); + expectTypeOf(data.bowSpleef.title).toEqualTypeOf(); + expect(data.bowSpleef.winstreak).toBeDefined(); + expect(data.bowSpleef.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowSpleef.winstreak).toEqualTypeOf(); + expect(data.bowSpleef.bestWinstreak).toBeDefined(); + expect(data.bowSpleef.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowSpleef.bestWinstreak).toEqualTypeOf(); + expect(data.bowSpleef.kills).toBeDefined(); + expect(data.bowSpleef.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowSpleef.kills).toEqualTypeOf(); + expect(data.bowSpleef.deaths).toBeDefined(); + expect(data.bowSpleef.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowSpleef.deaths).toEqualTypeOf(); + expect(data.bowSpleef.KDR).toBeDefined(); + expect(data.bowSpleef.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowSpleef.KDR).toEqualTypeOf(); + expect(data.bowSpleef.wins).toBeDefined(); + expect(data.bowSpleef.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowSpleef.wins).toEqualTypeOf(); + expect(data.bowSpleef.losses).toBeDefined(); + expect(data.bowSpleef.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowSpleef.losses).toEqualTypeOf(); + expect(data.bowSpleef.WLR).toBeDefined(); + expect(data.bowSpleef.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowSpleef.WLR).toEqualTypeOf(); + expect(data.bowSpleef.playedGames).toBeDefined(); + expect(data.bowSpleef.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowSpleef.playedGames).toEqualTypeOf(); + expect(data.bowSpleef.swings).toBeDefined(); + expect(data.bowSpleef.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowSpleef.swings).toEqualTypeOf(); + expect(data.bowSpleef.hits).toBeDefined(); + expect(data.bowSpleef.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowSpleef.hits).toEqualTypeOf(); + expect(data.bowSpleef.meleeAccuracy).toBeDefined(); + expect(data.bowSpleef.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowSpleef.meleeAccuracy).toEqualTypeOf(); + expect(data.bowSpleef.bowShots).toBeDefined(); + expect(data.bowSpleef.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowSpleef.bowShots).toEqualTypeOf(); + expect(data.bowSpleef.bowHits).toBeDefined(); + expect(data.bowSpleef.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowSpleef.bowHits).toEqualTypeOf(); + expect(data.bowSpleef.bowAccuracy).toBeDefined(); + expect(data.bowSpleef.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowSpleef.bowAccuracy).toEqualTypeOf(); + expect(data.bowSpleef.blocksPlaced).toBeDefined(); + expect(data.bowSpleef.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowSpleef.blocksPlaced).toEqualTypeOf(); + expect(data.bowSpleef.healthRegenerated).toBeDefined(); + expect(data.bowSpleef.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowSpleef.healthRegenerated).toEqualTypeOf(); + expect(data.bowSpleef.goldenApplesEatan).toBeDefined(); + expect(data.bowSpleef.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowSpleef.goldenApplesEatan).toEqualTypeOf(); + expect(data.sumo).toBeDefined(); + expectTypeOf(data.sumo).toEqualTypeOf(); + expectTypeOf(data.sumo.title).toEqualTypeOf(); + expect(data.sumo.winstreak).toBeDefined(); + expect(data.sumo.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sumo.winstreak).toEqualTypeOf(); + expect(data.sumo.bestWinstreak).toBeDefined(); + expect(data.sumo.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sumo.bestWinstreak).toEqualTypeOf(); + expect(data.sumo.kills).toBeDefined(); + expect(data.sumo.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sumo.kills).toEqualTypeOf(); + expect(data.sumo.deaths).toBeDefined(); + expect(data.sumo.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sumo.deaths).toEqualTypeOf(); + expect(data.sumo.KDR).toBeDefined(); + expect(data.sumo.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sumo.KDR).toEqualTypeOf(); + expect(data.sumo.wins).toBeDefined(); + expect(data.sumo.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sumo.wins).toEqualTypeOf(); + expect(data.sumo.losses).toBeDefined(); + expect(data.sumo.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sumo.losses).toEqualTypeOf(); + expect(data.sumo.WLR).toBeDefined(); + expect(data.sumo.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sumo.WLR).toEqualTypeOf(); + expect(data.sumo.playedGames).toBeDefined(); + expect(data.sumo.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sumo.playedGames).toEqualTypeOf(); + expect(data.sumo.swings).toBeDefined(); + expect(data.sumo.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sumo.swings).toEqualTypeOf(); + expect(data.sumo.hits).toBeDefined(); + expect(data.sumo.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sumo.hits).toEqualTypeOf(); + expect(data.sumo.meleeAccuracy).toBeDefined(); + expect(data.sumo.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sumo.meleeAccuracy).toEqualTypeOf(); + expect(data.sumo.bowShots).toBeDefined(); + expect(data.sumo.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sumo.bowShots).toEqualTypeOf(); + expect(data.sumo.bowHits).toBeDefined(); + expect(data.sumo.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sumo.bowHits).toEqualTypeOf(); + expect(data.sumo.bowAccuracy).toBeDefined(); + expect(data.sumo.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sumo.bowAccuracy).toEqualTypeOf(); + expect(data.sumo.blocksPlaced).toBeDefined(); + expect(data.sumo.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sumo.blocksPlaced).toEqualTypeOf(); + expect(data.sumo.healthRegenerated).toBeDefined(); + expect(data.sumo.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sumo.healthRegenerated).toEqualTypeOf(); + expect(data.sumo.goldenApplesEatan).toBeDefined(); + expect(data.sumo.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sumo.goldenApplesEatan).toEqualTypeOf(); + expect(data.bridge).toBeDefined(); + expectTypeOf(data.bridge).toEqualTypeOf(); + expect(data.bridge.title).toBeDefined(); + expectTypeOf(data.bridge.title).toEqualTypeOf(); + expect(data.bridge.winstreak).toBeDefined(); + expect(data.bridge.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.winstreak).toEqualTypeOf(); + expect(data.bridge.bestWinstreak).toBeDefined(); + expect(data.bridge.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.bestWinstreak).toEqualTypeOf(); + expect(data.bridge.solo).toBeDefined(); + expectTypeOf(data.bridge.solo).toEqualTypeOf(); + expect(data.bridge.solo.title).toBeDefined(); + expectTypeOf(data.bridge.solo.title).toEqualTypeOf(); + expect(data.bridge.solo.winstreak).toBeDefined(); + expect(data.bridge.solo.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.solo.winstreak).toEqualTypeOf(); + expect(data.bridge.solo.bestWinstreak).toBeDefined(); + expect(data.bridge.solo.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.solo.bestWinstreak).toEqualTypeOf(); + expect(data.bridge.solo.kills).toBeDefined(); + expect(data.bridge.solo.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.solo.kills).toEqualTypeOf(); + expect(data.bridge.solo.deaths).toBeDefined(); + expect(data.bridge.solo.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.solo.deaths).toEqualTypeOf(); + expect(data.bridge.solo.KDR).toBeDefined(); + expect(data.bridge.solo.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.solo.KDR).toEqualTypeOf(); + expect(data.bridge.solo.wins).toBeDefined(); + expect(data.bridge.solo.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.solo.wins).toEqualTypeOf(); + expect(data.bridge.solo.losses).toBeDefined(); + expect(data.bridge.solo.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.solo.losses).toEqualTypeOf(); + expect(data.bridge.solo.WLR).toBeDefined(); + expect(data.bridge.solo.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.solo.WLR).toEqualTypeOf(); + expect(data.bridge.solo.playedGames).toBeDefined(); + expect(data.bridge.solo.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.solo.playedGames).toEqualTypeOf(); + expect(data.bridge.solo.swings).toBeDefined(); + expect(data.bridge.solo.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.solo.swings).toEqualTypeOf(); + expect(data.bridge.solo.hits).toBeDefined(); + expect(data.bridge.solo.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.solo.hits).toEqualTypeOf(); + expect(data.bridge.solo.meleeAccuracy).toBeDefined(); + expect(data.bridge.solo.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.solo.meleeAccuracy).toEqualTypeOf(); + expect(data.bridge.solo.bowShots).toBeDefined(); + expect(data.bridge.solo.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.solo.bowShots).toEqualTypeOf(); + expect(data.bridge.solo.bowHits).toBeDefined(); + expect(data.bridge.solo.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.solo.bowHits).toEqualTypeOf(); + expect(data.bridge.solo.bowAccuracy).toBeDefined(); + expect(data.bridge.solo.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.solo.bowAccuracy).toEqualTypeOf(); + expect(data.bridge.solo.blocksPlaced).toBeDefined(); + expect(data.bridge.solo.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.solo.blocksPlaced).toEqualTypeOf(); + expect(data.bridge.solo.healthRegenerated).toBeDefined(); + expect(data.bridge.solo.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.solo.healthRegenerated).toEqualTypeOf(); + expect(data.bridge.solo.goldenApplesEatan).toBeDefined(); + expect(data.bridge.solo.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.solo.goldenApplesEatan).toEqualTypeOf(); + expect(data.bridge.doubles).toBeDefined(); + expectTypeOf(data.bridge.doubles).toEqualTypeOf(); + expect(data.bridge.doubles.title).toBeDefined(); + expectTypeOf(data.bridge.doubles.title).toEqualTypeOf(); + expect(data.bridge.doubles.winstreak).toBeDefined(); + expect(data.bridge.doubles.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.doubles.winstreak).toEqualTypeOf(); + expect(data.bridge.doubles.bestWinstreak).toBeDefined(); + expect(data.bridge.doubles.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.doubles.bestWinstreak).toEqualTypeOf(); + expect(data.bridge.doubles.kills).toBeDefined(); + expect(data.bridge.doubles.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.doubles.kills).toEqualTypeOf(); + expect(data.bridge.doubles.deaths).toBeDefined(); + expect(data.bridge.doubles.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.doubles.deaths).toEqualTypeOf(); + expect(data.bridge.doubles.KDR).toBeDefined(); + expect(data.bridge.doubles.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.doubles.KDR).toEqualTypeOf(); + expect(data.bridge.doubles.wins).toBeDefined(); + expect(data.bridge.doubles.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.doubles.wins).toEqualTypeOf(); + expect(data.bridge.doubles.losses).toBeDefined(); + expect(data.bridge.doubles.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.doubles.losses).toEqualTypeOf(); + expect(data.bridge.doubles.WLR).toBeDefined(); + expect(data.bridge.doubles.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.doubles.WLR).toEqualTypeOf(); + expect(data.bridge.doubles.playedGames).toBeDefined(); + expect(data.bridge.doubles.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.doubles.playedGames).toEqualTypeOf(); + expect(data.bridge.doubles.swings).toBeDefined(); + expect(data.bridge.doubles.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.doubles.swings).toEqualTypeOf(); + expect(data.bridge.doubles.hits).toBeDefined(); + expect(data.bridge.doubles.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.doubles.hits).toEqualTypeOf(); + expect(data.bridge.doubles.meleeAccuracy).toBeDefined(); + expect(data.bridge.doubles.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.doubles.meleeAccuracy).toEqualTypeOf(); + expect(data.bridge.doubles.bowShots).toBeDefined(); + expect(data.bridge.doubles.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.doubles.bowShots).toEqualTypeOf(); + expect(data.bridge.doubles.bowHits).toBeDefined(); + expect(data.bridge.doubles.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.doubles.bowHits).toEqualTypeOf(); + expect(data.bridge.doubles.bowAccuracy).toBeDefined(); + expect(data.bridge.doubles.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.doubles.bowAccuracy).toEqualTypeOf(); + expect(data.bridge.doubles.blocksPlaced).toBeDefined(); + expect(data.bridge.doubles.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.doubles.blocksPlaced).toEqualTypeOf(); + expect(data.bridge.doubles.healthRegenerated).toBeDefined(); + expect(data.bridge.doubles.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.doubles.healthRegenerated).toEqualTypeOf(); + expect(data.bridge.doubles.goldenApplesEatan).toBeDefined(); + expect(data.bridge.doubles.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.doubles.goldenApplesEatan).toEqualTypeOf(); + expect(data.bridge.threes).toBeDefined(); + expectTypeOf(data.bridge.threes).toEqualTypeOf(); + expect(data.bridge.threes.title).toBeDefined(); + expectTypeOf(data.bridge.threes.title).toEqualTypeOf(); + expect(data.bridge.threes.winstreak).toBeDefined(); + expect(data.bridge.threes.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.threes.winstreak).toEqualTypeOf(); + expect(data.bridge.threes.bestWinstreak).toBeDefined(); + expect(data.bridge.threes.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.threes.bestWinstreak).toEqualTypeOf(); + expect(data.bridge.threes.kills).toBeDefined(); + expect(data.bridge.threes.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.threes.kills).toEqualTypeOf(); + expect(data.bridge.threes.deaths).toBeDefined(); + expect(data.bridge.threes.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.threes.deaths).toEqualTypeOf(); + expect(data.bridge.threes.KDR).toBeDefined(); + expect(data.bridge.threes.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.threes.KDR).toEqualTypeOf(); + expect(data.bridge.threes.wins).toBeDefined(); + expect(data.bridge.threes.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.threes.wins).toEqualTypeOf(); + expect(data.bridge.threes.losses).toBeDefined(); + expect(data.bridge.threes.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.threes.losses).toEqualTypeOf(); + expect(data.bridge.threes.WLR).toBeDefined(); + expect(data.bridge.threes.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.threes.WLR).toEqualTypeOf(); + expect(data.bridge.threes.playedGames).toBeDefined(); + expect(data.bridge.threes.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.threes.playedGames).toEqualTypeOf(); + expect(data.bridge.threes.swings).toBeDefined(); + expect(data.bridge.threes.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.threes.swings).toEqualTypeOf(); + expect(data.bridge.threes.hits).toBeDefined(); + expect(data.bridge.threes.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.threes.hits).toEqualTypeOf(); + expect(data.bridge.threes.meleeAccuracy).toBeDefined(); + expect(data.bridge.threes.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.threes.meleeAccuracy).toEqualTypeOf(); + expect(data.bridge.threes.bowShots).toBeDefined(); + expect(data.bridge.threes.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.threes.bowShots).toEqualTypeOf(); + expect(data.bridge.threes.bowHits).toBeDefined(); + expect(data.bridge.threes.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.threes.bowHits).toEqualTypeOf(); + expect(data.bridge.threes.bowAccuracy).toBeDefined(); + expect(data.bridge.threes.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.threes.bowAccuracy).toEqualTypeOf(); + expect(data.bridge.threes.blocksPlaced).toBeDefined(); + expect(data.bridge.threes.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.threes.blocksPlaced).toEqualTypeOf(); + expect(data.bridge.threes.healthRegenerated).toBeDefined(); + expect(data.bridge.threes.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.threes.healthRegenerated).toEqualTypeOf(); + expect(data.bridge.threes.goldenApplesEatan).toBeDefined(); + expect(data.bridge.threes.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.threes.goldenApplesEatan).toEqualTypeOf(); + expect(data.bridge.fours).toBeDefined(); + expectTypeOf(data.bridge.fours).toEqualTypeOf(); + expect(data.bridge.fours.title).toBeDefined(); + expectTypeOf(data.bridge.fours.title).toEqualTypeOf(); + expect(data.bridge.fours.winstreak).toBeDefined(); + expect(data.bridge.fours.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.fours.winstreak).toEqualTypeOf(); + expect(data.bridge.fours.bestWinstreak).toBeDefined(); + expect(data.bridge.fours.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.fours.bestWinstreak).toEqualTypeOf(); + expect(data.bridge.fours.kills).toBeDefined(); + expect(data.bridge.fours.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.fours.kills).toEqualTypeOf(); + expect(data.bridge.fours.deaths).toBeDefined(); + expect(data.bridge.fours.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.fours.deaths).toEqualTypeOf(); + expect(data.bridge.fours.KDR).toBeDefined(); + expect(data.bridge.fours.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.fours.KDR).toEqualTypeOf(); + expect(data.bridge.fours.wins).toBeDefined(); + expect(data.bridge.fours.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.fours.wins).toEqualTypeOf(); + expect(data.bridge.fours.losses).toBeDefined(); + expect(data.bridge.fours.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.fours.losses).toEqualTypeOf(); + expect(data.bridge.fours.WLR).toBeDefined(); + expect(data.bridge.fours.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.fours.WLR).toEqualTypeOf(); + expect(data.bridge.fours.playedGames).toBeDefined(); + expect(data.bridge.fours.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.fours.playedGames).toEqualTypeOf(); + expect(data.bridge.fours.swings).toBeDefined(); + expect(data.bridge.fours.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.fours.swings).toEqualTypeOf(); + expect(data.bridge.fours.hits).toBeDefined(); + expect(data.bridge.fours.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.fours.hits).toEqualTypeOf(); + expect(data.bridge.fours.meleeAccuracy).toBeDefined(); + expect(data.bridge.fours.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.fours.meleeAccuracy).toEqualTypeOf(); + expect(data.bridge.fours.bowShots).toBeDefined(); + expect(data.bridge.fours.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.fours.bowShots).toEqualTypeOf(); + expect(data.bridge.fours.bowHits).toBeDefined(); + expect(data.bridge.fours.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.fours.bowHits).toEqualTypeOf(); + expect(data.bridge.fours.bowAccuracy).toBeDefined(); + expect(data.bridge.fours.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.fours.bowAccuracy).toEqualTypeOf(); + expect(data.bridge.fours.blocksPlaced).toBeDefined(); + expect(data.bridge.fours.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.fours.blocksPlaced).toEqualTypeOf(); + expect(data.bridge.fours.healthRegenerated).toBeDefined(); + expect(data.bridge.fours.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.fours.healthRegenerated).toEqualTypeOf(); + expect(data.bridge.fours.goldenApplesEatan).toBeDefined(); + expect(data.bridge.fours.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.fours.goldenApplesEatan).toEqualTypeOf(); + expect(data.bridge['2v2v2v2']).toBeDefined(); + expectTypeOf(data.bridge['2v2v2v2']).toEqualTypeOf(); + expect(data.bridge['2v2v2v2'].title).toBeDefined(); + expectTypeOf(data.bridge['2v2v2v2'].title).toEqualTypeOf(); + expect(data.bridge['2v2v2v2'].winstreak).toBeDefined(); + expect(data.bridge['2v2v2v2'].winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['2v2v2v2'].winstreak).toEqualTypeOf(); + expect(data.bridge['2v2v2v2'].bestWinstreak).toBeDefined(); + expect(data.bridge['2v2v2v2'].bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['2v2v2v2'].bestWinstreak).toEqualTypeOf(); + expect(data.bridge['2v2v2v2'].kills).toBeDefined(); + expect(data.bridge['2v2v2v2'].kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['2v2v2v2'].kills).toEqualTypeOf(); + expect(data.bridge['2v2v2v2'].deaths).toBeDefined(); + expect(data.bridge['2v2v2v2'].deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['2v2v2v2'].deaths).toEqualTypeOf(); + expect(data.bridge['2v2v2v2'].KDR).toBeDefined(); + expect(data.bridge['2v2v2v2'].KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['2v2v2v2'].KDR).toEqualTypeOf(); + expect(data.bridge['2v2v2v2'].wins).toBeDefined(); + expect(data.bridge['2v2v2v2'].wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['2v2v2v2'].wins).toEqualTypeOf(); + expect(data.bridge['2v2v2v2'].losses).toBeDefined(); + expect(data.bridge['2v2v2v2'].losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['2v2v2v2'].losses).toEqualTypeOf(); + expect(data.bridge['2v2v2v2'].WLR).toBeDefined(); + expect(data.bridge['2v2v2v2'].WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['2v2v2v2'].WLR).toEqualTypeOf(); + expect(data.bridge['2v2v2v2'].playedGames).toBeDefined(); + expect(data.bridge['2v2v2v2'].playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['2v2v2v2'].playedGames).toEqualTypeOf(); + expect(data.bridge['2v2v2v2'].swings).toBeDefined(); + expect(data.bridge['2v2v2v2'].swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['2v2v2v2'].swings).toEqualTypeOf(); + expect(data.bridge['2v2v2v2'].hits).toBeDefined(); + expect(data.bridge['2v2v2v2'].hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['2v2v2v2'].hits).toEqualTypeOf(); + expect(data.bridge['2v2v2v2'].meleeAccuracy).toBeDefined(); + expect(data.bridge['2v2v2v2'].meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['2v2v2v2'].meleeAccuracy).toEqualTypeOf(); + expect(data.bridge['2v2v2v2'].bowShots).toBeDefined(); + expect(data.bridge['2v2v2v2'].bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['2v2v2v2'].bowShots).toEqualTypeOf(); + expect(data.bridge['2v2v2v2'].bowHits).toBeDefined(); + expect(data.bridge['2v2v2v2'].bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['2v2v2v2'].bowHits).toEqualTypeOf(); + expect(data.bridge['2v2v2v2'].bowAccuracy).toBeDefined(); + expect(data.bridge['2v2v2v2'].bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['2v2v2v2'].bowAccuracy).toEqualTypeOf(); + expect(data.bridge['2v2v2v2'].blocksPlaced).toBeDefined(); + expect(data.bridge['2v2v2v2'].blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['2v2v2v2'].blocksPlaced).toEqualTypeOf(); + expect(data.bridge['2v2v2v2'].healthRegenerated).toBeDefined(); + expect(data.bridge['2v2v2v2'].healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['2v2v2v2'].healthRegenerated).toEqualTypeOf(); + expect(data.bridge['2v2v2v2'].goldenApplesEatan).toBeDefined(); + expect(data.bridge['2v2v2v2'].goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['2v2v2v2'].goldenApplesEatan).toEqualTypeOf(); + expect(data.bridge['3v3v3v3']).toBeDefined(); + expectTypeOf(data.bridge['3v3v3v3']).toEqualTypeOf(); + expect(data.bridge['3v3v3v3'].title).toBeDefined(); + expectTypeOf(data.bridge['3v3v3v3'].title).toEqualTypeOf(); + expect(data.bridge['3v3v3v3'].winstreak).toBeDefined(); + expect(data.bridge['3v3v3v3'].winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['3v3v3v3'].winstreak).toEqualTypeOf(); + expect(data.bridge['3v3v3v3'].bestWinstreak).toBeDefined(); + expect(data.bridge['3v3v3v3'].bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['3v3v3v3'].bestWinstreak).toEqualTypeOf(); + expect(data.bridge['3v3v3v3'].kills).toBeDefined(); + expect(data.bridge['3v3v3v3'].kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['3v3v3v3'].kills).toEqualTypeOf(); + expect(data.bridge['3v3v3v3'].deaths).toBeDefined(); + expect(data.bridge['3v3v3v3'].deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['3v3v3v3'].deaths).toEqualTypeOf(); + expect(data.bridge['3v3v3v3'].KDR).toBeDefined(); + expect(data.bridge['3v3v3v3'].KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['3v3v3v3'].KDR).toEqualTypeOf(); + expect(data.bridge['3v3v3v3'].wins).toBeDefined(); + expect(data.bridge['3v3v3v3'].wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['3v3v3v3'].wins).toEqualTypeOf(); + expect(data.bridge['3v3v3v3'].losses).toBeDefined(); + expect(data.bridge['3v3v3v3'].losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['3v3v3v3'].losses).toEqualTypeOf(); + expect(data.bridge['3v3v3v3'].WLR).toBeDefined(); + expect(data.bridge['3v3v3v3'].WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['3v3v3v3'].WLR).toEqualTypeOf(); + expect(data.bridge['3v3v3v3'].playedGames).toBeDefined(); + expect(data.bridge['3v3v3v3'].playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['3v3v3v3'].playedGames).toEqualTypeOf(); + expect(data.bridge['3v3v3v3'].swings).toBeDefined(); + expect(data.bridge['3v3v3v3'].swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['3v3v3v3'].swings).toEqualTypeOf(); + expect(data.bridge['3v3v3v3'].hits).toBeDefined(); + expect(data.bridge['3v3v3v3'].hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['3v3v3v3'].hits).toEqualTypeOf(); + expect(data.bridge['3v3v3v3'].meleeAccuracy).toBeDefined(); + expect(data.bridge['3v3v3v3'].meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['3v3v3v3'].meleeAccuracy).toEqualTypeOf(); + expect(data.bridge['3v3v3v3'].bowShots).toBeDefined(); + expect(data.bridge['3v3v3v3'].bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['3v3v3v3'].bowShots).toEqualTypeOf(); + expect(data.bridge['3v3v3v3'].bowHits).toBeDefined(); + expect(data.bridge['3v3v3v3'].bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['3v3v3v3'].bowHits).toEqualTypeOf(); + expect(data.bridge['3v3v3v3'].bowAccuracy).toBeDefined(); + expect(data.bridge['3v3v3v3'].bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['3v3v3v3'].bowAccuracy).toEqualTypeOf(); + expect(data.bridge['3v3v3v3'].blocksPlaced).toBeDefined(); + expect(data.bridge['3v3v3v3'].blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['3v3v3v3'].blocksPlaced).toEqualTypeOf(); + expect(data.bridge['3v3v3v3'].healthRegenerated).toBeDefined(); + expect(data.bridge['3v3v3v3'].healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['3v3v3v3'].healthRegenerated).toEqualTypeOf(); + expect(data.bridge['3v3v3v3'].goldenApplesEatan).toBeDefined(); + expect(data.bridge['3v3v3v3'].goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['3v3v3v3'].goldenApplesEatan).toEqualTypeOf(); + expect(data.bridge.ctf).toBeDefined(); + expectTypeOf(data.bridge.ctf).toEqualTypeOf(); + expect(data.bridge.ctf.title).toBeDefined(); + expectTypeOf(data.bridge.ctf.title).toEqualTypeOf(); + expect(data.bridge.ctf.winstreak).toBeDefined(); + expect(data.bridge.ctf.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.ctf.winstreak).toEqualTypeOf(); + expect(data.bridge.ctf.bestWinstreak).toBeDefined(); + expect(data.bridge.ctf.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.ctf.bestWinstreak).toEqualTypeOf(); + expect(data.bridge.ctf.kills).toBeDefined(); + expect(data.bridge.ctf.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.ctf.kills).toEqualTypeOf(); + expect(data.bridge.ctf.deaths).toBeDefined(); + expect(data.bridge.ctf.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.ctf.deaths).toEqualTypeOf(); + expect(data.bridge.ctf.KDR).toBeDefined(); + expect(data.bridge.ctf.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.ctf.KDR).toEqualTypeOf(); + expect(data.bridge.ctf.wins).toBeDefined(); + expect(data.bridge.ctf.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.ctf.wins).toEqualTypeOf(); + expect(data.bridge.ctf.losses).toBeDefined(); + expect(data.bridge.ctf.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.ctf.losses).toEqualTypeOf(); + expect(data.bridge.ctf.WLR).toBeDefined(); + expect(data.bridge.ctf.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.ctf.WLR).toEqualTypeOf(); + expect(data.bridge.ctf.playedGames).toBeDefined(); + expect(data.bridge.ctf.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.ctf.playedGames).toEqualTypeOf(); + expect(data.bridge.ctf.swings).toBeDefined(); + expect(data.bridge.ctf.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.ctf.swings).toEqualTypeOf(); + expect(data.bridge.ctf.hits).toBeDefined(); + expect(data.bridge.ctf.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.ctf.hits).toEqualTypeOf(); + expect(data.bridge.ctf.meleeAccuracy).toBeDefined(); + expect(data.bridge.ctf.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.ctf.meleeAccuracy).toEqualTypeOf(); + expect(data.bridge.ctf.bowShots).toBeDefined(); + expect(data.bridge.ctf.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.ctf.bowShots).toEqualTypeOf(); + expect(data.bridge.ctf.bowHits).toBeDefined(); + expect(data.bridge.ctf.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.ctf.bowHits).toEqualTypeOf(); + expect(data.bridge.ctf.bowAccuracy).toBeDefined(); + expect(data.bridge.ctf.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.ctf.bowAccuracy).toEqualTypeOf(); + expect(data.bridge.ctf.blocksPlaced).toBeDefined(); + expect(data.bridge.ctf.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.ctf.blocksPlaced).toEqualTypeOf(); + expect(data.bridge.ctf.healthRegenerated).toBeDefined(); + expect(data.bridge.ctf.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.ctf.healthRegenerated).toEqualTypeOf(); + expect(data.bridge.ctf.goldenApplesEatan).toBeDefined(); + expect(data.bridge.ctf.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.ctf.goldenApplesEatan).toEqualTypeOf(); + expect(data.bridge.kills).toBeDefined(); + expect(data.bridge.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.kills).toEqualTypeOf(); + expect(data.bridge.deaths).toBeDefined(); + expect(data.bridge.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.deaths).toEqualTypeOf(); + expect(data.bridge.KDR).toBeDefined(); + expect(data.bridge.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.KDR).toEqualTypeOf(); + expect(data.bridge.wins).toBeDefined(); + expect(data.bridge.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.wins).toEqualTypeOf(); + expect(data.bridge.losses).toBeDefined(); + expect(data.bridge.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.losses).toEqualTypeOf(); + expect(data.bridge.WLR).toBeDefined(); + expect(data.bridge.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.WLR).toEqualTypeOf(); + expect(data.bridge.playedGames).toBeDefined(); + expect(data.bridge.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.playedGames).toEqualTypeOf(); + expect(data.bridge.swings).toBeDefined(); + expect(data.bridge.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.swings).toEqualTypeOf(); + expect(data.bridge.hits).toBeDefined(); + expect(data.bridge.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.hits).toEqualTypeOf(); + expect(data.bridge.meleeAccuracy).toBeDefined(); + expect(data.bridge.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.meleeAccuracy).toEqualTypeOf(); + expect(data.bridge.bowShots).toBeDefined(); + expect(data.bridge.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.bowShots).toEqualTypeOf(); + expect(data.bridge.bowHits).toBeDefined(); + expect(data.bridge.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.bowHits).toEqualTypeOf(); + expect(data.bridge.bowAccuracy).toBeDefined(); + expect(data.bridge.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.bowAccuracy).toEqualTypeOf(); + expect(data.bridge.blocksPlaced).toBeDefined(); + expect(data.bridge.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.blocksPlaced).toEqualTypeOf(); + expect(data.bridge.healthRegenerated).toBeDefined(); + expect(data.bridge.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.healthRegenerated).toEqualTypeOf(); + expect(data.bridge.goldenApplesEatan).toBeDefined(); + expect(data.bridge.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.goldenApplesEatan).toEqualTypeOf(); + expect(data.parkour).toBeDefined(); + expectTypeOf(data.parkour).toEqualTypeOf(); + expectTypeOf(data.parkour.title).toEqualTypeOf(); + expect(data.parkour.winstreak).toBeDefined(); + expect(data.parkour.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.parkour.winstreak).toEqualTypeOf(); + expect(data.parkour.bestWinstreak).toBeDefined(); + expect(data.parkour.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.parkour.bestWinstreak).toEqualTypeOf(); + expect(data.parkour.kills).toBeDefined(); + expect(data.parkour.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.parkour.kills).toEqualTypeOf(); + expect(data.parkour.deaths).toBeDefined(); + expect(data.parkour.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.parkour.deaths).toEqualTypeOf(); + expect(data.parkour.KDR).toBeDefined(); + expect(data.parkour.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.parkour.KDR).toEqualTypeOf(); + expect(data.parkour.wins).toBeDefined(); + expect(data.parkour.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.parkour.wins).toEqualTypeOf(); + expect(data.parkour.losses).toBeDefined(); + expect(data.parkour.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.parkour.losses).toEqualTypeOf(); + expect(data.parkour.WLR).toBeDefined(); + expect(data.parkour.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.parkour.WLR).toEqualTypeOf(); + expect(data.parkour.playedGames).toBeDefined(); + expect(data.parkour.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.parkour.playedGames).toEqualTypeOf(); + expect(data.parkour.swings).toBeDefined(); + expect(data.parkour.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.parkour.swings).toEqualTypeOf(); + expect(data.parkour.hits).toBeDefined(); + expect(data.parkour.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.parkour.hits).toEqualTypeOf(); + expect(data.parkour.meleeAccuracy).toBeDefined(); + expect(data.parkour.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.parkour.meleeAccuracy).toEqualTypeOf(); + expect(data.parkour.bowShots).toBeDefined(); + expect(data.parkour.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.parkour.bowShots).toEqualTypeOf(); + expect(data.parkour.bowHits).toBeDefined(); + expect(data.parkour.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.parkour.bowHits).toEqualTypeOf(); + expect(data.parkour.bowAccuracy).toBeDefined(); + expect(data.parkour.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.parkour.bowAccuracy).toEqualTypeOf(); + expect(data.parkour.blocksPlaced).toBeDefined(); + expect(data.parkour.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.parkour.blocksPlaced).toEqualTypeOf(); + expect(data.parkour.healthRegenerated).toBeDefined(); + expect(data.parkour.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.parkour.healthRegenerated).toEqualTypeOf(); + expect(data.parkour.goldenApplesEatan).toBeDefined(); + expect(data.parkour.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.parkour.goldenApplesEatan).toEqualTypeOf(); + expect(data.arena).toBeDefined(); + expectTypeOf(data.arena).toEqualTypeOf(); + expectTypeOf(data.arena.title).toEqualTypeOf(); + expect(data.arena.winstreak).toBeDefined(); + expect(data.arena.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arena.winstreak).toEqualTypeOf(); + expect(data.arena.bestWinstreak).toBeDefined(); + expect(data.arena.bestWinstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arena.bestWinstreak).toEqualTypeOf(); + expect(data.arena.kills).toBeDefined(); + expect(data.arena.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arena.kills).toEqualTypeOf(); + expect(data.arena.deaths).toBeDefined(); + expect(data.arena.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arena.deaths).toEqualTypeOf(); + expect(data.arena.KDR).toBeDefined(); + expect(data.arena.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arena.KDR).toEqualTypeOf(); + expect(data.arena.wins).toBeDefined(); + expect(data.arena.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arena.wins).toEqualTypeOf(); + expect(data.arena.losses).toBeDefined(); + expect(data.arena.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arena.losses).toEqualTypeOf(); + expect(data.arena.WLR).toBeDefined(); + expect(data.arena.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arena.WLR).toEqualTypeOf(); + expect(data.arena.playedGames).toBeDefined(); + expect(data.arena.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arena.playedGames).toEqualTypeOf(); + expect(data.arena.swings).toBeDefined(); + expect(data.arena.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arena.swings).toEqualTypeOf(); + expect(data.arena.hits).toBeDefined(); + expect(data.arena.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arena.hits).toEqualTypeOf(); + expect(data.arena.meleeAccuracy).toBeDefined(); + expect(data.arena.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arena.meleeAccuracy).toEqualTypeOf(); + expect(data.arena.bowShots).toBeDefined(); + expect(data.arena.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arena.bowShots).toEqualTypeOf(); + expect(data.arena.bowHits).toBeDefined(); + expect(data.arena.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arena.bowHits).toEqualTypeOf(); + expect(data.arena.bowAccuracy).toBeDefined(); + expect(data.arena.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arena.bowAccuracy).toEqualTypeOf(); + expect(data.arena.blocksPlaced).toBeDefined(); + expect(data.arena.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arena.blocksPlaced).toEqualTypeOf(); + expect(data.arena.healthRegenerated).toBeDefined(); + expect(data.arena.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arena.healthRegenerated).toEqualTypeOf(); + expect(data.arena.goldenApplesEatan).toBeDefined(); + expect(data.arena.goldenApplesEatan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arena.goldenApplesEatan).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Duels/Duels.ts b/src/Structures/MiniGames/Duels/Duels.ts new file mode 100644 index 000000000..d53bf1478 --- /dev/null +++ b/src/Structures/MiniGames/Duels/Duels.ts @@ -0,0 +1,95 @@ +import Divide from '../../../Utils/Divide.js'; +import DuelsBridge from './DuelsBridge.js'; +import DuelsGamemode from './DuelsGamemode.js'; +import DuelsMegaWalls from './DuelsMegaWalls.js'; +import DuelsOP from './DuelsOP.js'; +import DuelsSkyWars from './DuelsSkyWars.js'; +import DuelsUHC from './DuelsUHC.js'; +import Romanize from '../../../Utils/Romanize.js'; +import { duelsDivisions } from '../../../Utils/Constants.js'; +import type { DuelsModes } from '../../../Types/Player.js'; + +export function getTitle(data: Record, mode: 'all_modes' | DuelsModes): string { + for (const div of duelsDivisions.slice().reverse()) { + const prestige = data?.[`${mode}_${div.key}_title_prestige`]; + if (prestige) return `${div.name} ${Romanize(prestige)}`; + } + return ''; +} + +class Duels { + tokens: number; + title: string | null; + kills: number; + deaths: number; + KDR: number; + wins: number; + losses: number; + WLR: number; + playedGames: number; + winstreak: number; + bestWinstreak: number; + ping: number; + blocksPlaced: number; + swings: number; + hits: number; + meleeAccuracy: number; + bowShots: number; + bowHits: number; + bowAccuracy: number; + healthRegenerated: number; + goldenApplesEatan: number; + uhc: DuelsUHC; + skywars: DuelsSkyWars; + megawalls: DuelsMegaWalls; + blitz: DuelsGamemode; + op: DuelsOP; + classic: DuelsGamemode; + bow: DuelsGamemode; + noDebuff: DuelsGamemode; + combo: DuelsGamemode; + bowSpleef: DuelsGamemode; + sumo: DuelsGamemode; + bridge: DuelsBridge; + parkour: DuelsGamemode; + arena: DuelsGamemode; + constructor(data: Record) { + this.tokens = data?.coins || data?.tokens || 0; + this.title = getTitle(data, 'all_modes'); + this.kills = data?.kills || 0; + this.deaths = data?.deaths || 0; + this.KDR = Divide(this.kills, this.deaths); + this.wins = data?.wins || 0; + this.losses = data?.losses || 0; + this.WLR = Divide(this.wins, this.losses); + this.playedGames = data?.games_played_duels || 0; + this.winstreak = data?.current_winstreak || 0; + this.bestWinstreak = data?.best_overall_winstreak || 0; + this.ping = data?.pingPreference || 0; + this.blocksPlaced = data?.blocks_placed || 0; + this.swings = data?.melee_swings || 0; + this.hits = data?.melee_hits || 0; + this.meleeAccuracy = Divide(this.hits, this.swings); + this.bowShots = data?.bow_shots || 0; + this.bowHits = data?.bow_hits || 0; + this.bowAccuracy = Divide(this.bowHits, this.bowShots); + this.healthRegenerated = data?.health_regenerated || 0; + this.goldenApplesEatan = data?.golden_apples_eaten || 0; + this.uhc = new DuelsUHC(data); + this.skywars = new DuelsSkyWars(data); + this.megawalls = new DuelsMegaWalls(data); + this.blitz = new DuelsGamemode(data, 'blitz_duel', getTitle(data, 'blitz')); + this.op = new DuelsOP(data); + this.classic = new DuelsGamemode(data, 'classic_duel', getTitle(data, 'classic')); + this.bow = new DuelsGamemode(data, 'bow_duel', getTitle(data, 'bow')); + this.noDebuff = new DuelsGamemode(data, 'potion_duel', getTitle(data, 'no_debuff')); + this.combo = new DuelsGamemode(data, 'combo_duel', getTitle(data, 'combo')); + this.bowSpleef = new DuelsGamemode(data, 'bowspleef_duel', getTitle(data, 'tnt_games')); + this.sumo = new DuelsGamemode(data, 'sumo_duel', getTitle(data, 'sumo')); + this.bridge = new DuelsBridge(data); + this.parkour = new DuelsGamemode(data, 'parkour_eight', getTitle(data, 'parkour')); + this.arena = new DuelsGamemode(data, 'duel_arena'); + } +} + +export default Duels; diff --git a/src/Structures/MiniGames/Duels/DuelsBridge.ts b/src/Structures/MiniGames/Duels/DuelsBridge.ts new file mode 100644 index 000000000..1883e7c74 --- /dev/null +++ b/src/Structures/MiniGames/Duels/DuelsBridge.ts @@ -0,0 +1,146 @@ +import Divide from '../../../Utils/Divide.js'; +import DuelsGamemode from './DuelsGamemode.js'; +import { getTitle } from './Duels.js'; + +class DuelsBridge { + title: string; + winstreak: number; + bestWinstreak: number; + solo: DuelsGamemode; + doubles: DuelsGamemode; + threes: DuelsGamemode; + fours: DuelsGamemode; + '2v2v2v2': DuelsGamemode; + '3v3v3v3': DuelsGamemode; + ctf: DuelsGamemode; + kills: number; + deaths: number; + KDR: number; + wins: number; + losses: number; + WLR: number; + playedGames: number; + swings: number; + hits: number; + meleeAccuracy: number; + bowShots: number; + bowHits: number; + bowAccuracy: number; + blocksPlaced: number; + healthRegenerated: number; + goldenApplesEatan: number; + constructor(data: Record) { + this.title = getTitle(data, 'bridge'); + this.winstreak = data?.current_bridge_winstreak || 0; + this.bestWinstreak = data?.best_bridge_winstreak || 0; + this.solo = new DuelsGamemode(data, 'bridge_duel', this.title); + this.doubles = new DuelsGamemode(data, 'bridge_doubles', this.title); + this.threes = new DuelsGamemode(data, 'bridge_threes', this.title); + this.fours = new DuelsGamemode(data, 'bridge_fours', this.title); + this['2v2v2v2'] = new DuelsGamemode(data, '2v2v2v2', this.title); + this['3v3v3v3'] = new DuelsGamemode(data, '3v3v3v3', this.title); + this.ctf = new DuelsGamemode(data, 'capture_threes', this.title); + this.kills = + this.solo.kills + + this.doubles.kills + + this.threes.kills + + this.fours.kills + + this['2v2v2v2'].kills + + this['3v3v3v3'].kills + + this.ctf.kills; + this.deaths = + this.solo.deaths + + this.doubles.deaths + + this.threes.deaths + + this.fours.deaths + + this['2v2v2v2'].deaths + + this['3v3v3v3'].deaths + + this.ctf.deaths; + this.KDR = Divide(this.kills, this.deaths); + this.wins = + this.solo.wins + + this.doubles.wins + + this.threes.wins + + this.fours.wins + + this['2v2v2v2'].wins + + this['3v3v3v3'].wins + + this.ctf.wins; + this.losses = + this.solo.losses + + this.doubles.losses + + this.threes.losses + + this.fours.losses + + this['2v2v2v2'].losses + + this['3v3v3v3'].losses + + this.ctf.losses; + this.WLR = Divide(this.wins, this.losses); + this.playedGames = + this.solo.playedGames + + this.doubles.playedGames + + this.threes.playedGames + + this.fours.playedGames + + this['2v2v2v2'].playedGames + + this['3v3v3v3'].playedGames + + this.ctf.playedGames; + this.swings = + this.solo.swings + + this.doubles.swings + + this.threes.swings + + this.fours.swings + + this['2v2v2v2'].swings + + this['3v3v3v3'].swings + + this.ctf.swings; + this.hits = + this.solo.hits + + this.doubles.hits + + this.threes.hits + + this.fours.hits + + this['2v2v2v2'].hits + + this['3v3v3v3'].hits + + this.ctf.hits; + this.meleeAccuracy = Divide(this.hits, this.swings); + this.bowShots = + this.solo.bowShots + + this.doubles.bowShots + + this.threes?.bowShots + + this.fours?.bowShots + + this['2v2v2v2'].bowShots + + this['3v3v3v3'].bowShots + + this.ctf.bowShots; + this.bowHits = + this.solo.bowHits + + this.doubles.bowHits + + this.threes.bowHits + + this.fours.bowHits + + this['2v2v2v2'].bowHits + + this['3v3v3v3'].bowHits + + this.ctf.bowHits; + this.bowAccuracy = Divide(this.bowHits, this.bowShots); + this.blocksPlaced = + this.solo.blocksPlaced + + this.doubles.blocksPlaced + + this.threes.blocksPlaced + + this.fours.blocksPlaced + + this['2v2v2v2'].blocksPlaced + + this['3v3v3v3'].blocksPlaced + + this.ctf.blocksPlaced; + this.healthRegenerated = + this.solo.healthRegenerated + + this.doubles.healthRegenerated + + this.threes.healthRegenerated + + this.fours.healthRegenerated + + this['2v2v2v2'].healthRegenerated + + this['3v3v3v3'].healthRegenerated + + this.ctf.healthRegenerated; + this.goldenApplesEatan = + this.solo.goldenApplesEatan + + this.doubles.goldenApplesEatan + + this.threes.goldenApplesEatan + + this.fours.goldenApplesEatan + + this['2v2v2v2'].goldenApplesEatan + + this['3v3v3v3'].goldenApplesEatan + + this.ctf.goldenApplesEatan; + } +} + +export default DuelsBridge; diff --git a/src/Structures/MiniGames/Duels/DuelsGamemode.ts b/src/Structures/MiniGames/Duels/DuelsGamemode.ts new file mode 100644 index 000000000..10decafda --- /dev/null +++ b/src/Structures/MiniGames/Duels/DuelsGamemode.ts @@ -0,0 +1,47 @@ +import Divide from '../../../Utils/Divide.js'; +import type { DuelsModes } from '../../../Types/Player.js'; + +class DuelsGamemode { + title: string; + winstreak: number; + bestWinstreak: number; + kills: number; + deaths: number; + KDR: number; + wins: number; + losses: number; + WLR: number; + playedGames: number; + swings: number; + hits: number; + meleeAccuracy: number; + bowShots: number; + bowHits: number; + bowAccuracy: number; + blocksPlaced: number; + healthRegenerated: number; + goldenApplesEatan: number; + constructor(data: Record, mode: DuelsModes, title: string = '') { + this.title = title; + this.winstreak = data?.[`current_winstreak_mode_${mode}`] || 0; + this.bestWinstreak = data?.[`best_winstreak_mode_${mode}`] || 0; + this.kills = data?.[`${mode}_kills`] || 0; + this.deaths = data?.[`${mode}_deaths`] || 0; + this.KDR = Divide(this.kills, this.deaths); + this.wins = data?.[`${mode}_wins`] || 0; + this.losses = data?.[`${mode}_losses`] || 0; + this.WLR = Divide(this.wins, this.losses); + this.playedGames = data?.[`${mode}_rounds_played`] || 0; + this.swings = data?.[`${mode}_melee_swings`] || 0; + this.hits = data?.[`${mode}_melee_hits`] || 0; + this.meleeAccuracy = Divide(this.swings, this.hits); + this.bowShots = data?.[`${mode}_bow_shots`] || 0; + this.bowHits = data?.[`${mode}_bow_hits`] || 0; + this.bowAccuracy = Divide(this.bowShots, this.bowHits); + this.blocksPlaced = data?.[`${mode}_blocks_placed`] || 0; + this.healthRegenerated = data?.[`${mode}_health_regenerated`] || 0; + this.goldenApplesEatan = data?.[`${mode}_golden_apples_eaten`] || 0; + } +} + +export default DuelsGamemode; diff --git a/src/Structures/MiniGames/Duels/DuelsMegaWalls.ts b/src/Structures/MiniGames/Duels/DuelsMegaWalls.ts new file mode 100644 index 000000000..395cfcb88 --- /dev/null +++ b/src/Structures/MiniGames/Duels/DuelsMegaWalls.ts @@ -0,0 +1,52 @@ +import Divide from '../../../Utils/Divide.js'; +import DuelsGamemode from './DuelsGamemode.js'; +import { getTitle } from './Duels.js'; + +class DuelsMegaWalls { + title: string; + winstreak: number; + bestWinstreak: number; + solo: DuelsGamemode; + doubles: DuelsGamemode; + kills: number; + deaths: number; + KDR: number; + wins: number; + losses: number; + WLR: number; + playedGames: number; + swings: number; + hits: number; + meleeAccuracy: number; + bowShots: number; + bowHits: number; + bowAccuracy: number; + blocksPlaced: number; + healthRegenerated: number; + goldenApplesEatan: number; + constructor(data: Record) { + this.title = getTitle(data, 'mega_walls'); + this.winstreak = data?.current_mega_walls_winstreak || 0; + this.bestWinstreak = data?.best_mega_walls_winstreak || 0; + this.solo = new DuelsGamemode(data, 'mw_duel', this.title); + this.doubles = new DuelsGamemode(data, 'mw_doubles', this.title); + this.kills = this.solo.kills + this.doubles.kills; + this.deaths = this.solo.deaths + this.doubles.deaths; + this.KDR = Divide(this.kills, this.deaths); + this.wins = this.solo.wins + this.doubles.wins; + this.losses = this.solo.losses + this.doubles.losses; + this.WLR = Divide(this.wins, this.losses); + this.playedGames = this.solo.playedGames + this.doubles.playedGames; + this.swings = this.solo.swings + this.doubles.swings; + this.hits = this.solo.hits + this.doubles.hits; + this.meleeAccuracy = Divide(this.hits, this.swings); + this.bowShots = this.solo.bowShots + this.doubles.bowShots; + this.bowHits = this.solo.bowHits + this.doubles.bowHits; + this.bowAccuracy = Divide(this.bowHits, this.bowShots); + this.blocksPlaced = this.solo.blocksPlaced + this.doubles.blocksPlaced; + this.healthRegenerated = this.solo.healthRegenerated + this.doubles.healthRegenerated; + this.goldenApplesEatan = this.solo.goldenApplesEatan + this.doubles.goldenApplesEatan; + } +} + +export default DuelsMegaWalls; diff --git a/src/Structures/MiniGames/Duels/DuelsOP.ts b/src/Structures/MiniGames/Duels/DuelsOP.ts new file mode 100644 index 000000000..dcaa8e031 --- /dev/null +++ b/src/Structures/MiniGames/Duels/DuelsOP.ts @@ -0,0 +1,52 @@ +import Divide from '../../../Utils/Divide.js'; +import DuelsGamemode from './DuelsGamemode.js'; +import { getTitle } from './Duels.js'; + +class DuelsOP { + title: string; + winstreak: number; + bestWinstreak: number; + solo: DuelsGamemode; + doubles: DuelsGamemode; + kills: number; + deaths: number; + KDR: number; + wins: number; + losses: number; + WLR: number; + playedGames: number; + swings: number; + hits: number; + meleeAccuracy: number; + bowShots: number; + bowHits: number; + bowAccuracy: number; + blocksPlaced: number; + healthRegenerated: number; + goldenApplesEatan: number; + constructor(data: Record) { + this.title = getTitle(data, 'op'); + this.winstreak = data?.current_op_winstreak || 0; + this.bestWinstreak = data?.best_op_winstreak || 0; + this.solo = new DuelsGamemode(data, 'op_duel', this.title); + this.doubles = new DuelsGamemode(data, 'op_doubles', this.title); + this.kills = this.solo.kills + this.doubles.kills; + this.deaths = this.solo.deaths + this.doubles.deaths; + this.KDR = Divide(this.kills, this.deaths); + this.wins = this.solo.wins + this.doubles.wins; + this.losses = this.solo.losses + this.doubles.losses; + this.WLR = Divide(this.wins, this.losses); + this.playedGames = this.solo.playedGames + this.doubles.playedGames; + this.swings = this.solo.swings + this.doubles.swings; + this.hits = this.solo.hits + this.doubles.hits; + this.meleeAccuracy = Divide(this.hits, this.swings); + this.bowShots = this.solo.bowShots + this.doubles.bowShots; + this.bowHits = this.solo.bowHits + this.doubles.bowHits; + this.bowAccuracy = Divide(this.bowHits, this.bowShots); + this.blocksPlaced = this.solo.blocksPlaced + this.doubles.blocksPlaced; + this.healthRegenerated = this.solo.healthRegenerated + this.doubles.healthRegenerated; + this.goldenApplesEatan = this.solo.goldenApplesEatan + this.doubles.goldenApplesEatan; + } +} + +export default DuelsOP; diff --git a/src/Structures/MiniGames/Duels/DuelsSkyWars.ts b/src/Structures/MiniGames/Duels/DuelsSkyWars.ts new file mode 100644 index 000000000..138cb93f9 --- /dev/null +++ b/src/Structures/MiniGames/Duels/DuelsSkyWars.ts @@ -0,0 +1,52 @@ +import Divide from '../../../Utils/Divide.js'; +import DuelsGamemode from './DuelsGamemode.js'; +import { getTitle } from './Duels.js'; + +class DuelsSkyWars { + title: string; + winstreak: number; + bestWinstreak: number; + solo: DuelsGamemode; + doubles: DuelsGamemode; + kills: number; + deaths: number; + KDR: number; + wins: number; + losses: number; + WLR: number; + playedGames: number; + swings: number; + hits: number; + meleeAccuracy: number; + bowShots: number; + bowHits: number; + bowAccuracy: number; + blocksPlaced: number; + healthRegenerated: number; + goldenApplesEatan: number; + constructor(data: Record) { + this.title = getTitle(data, 'sw'); + this.winstreak = data?.current_sw_winstreak || 0; + this.bestWinstreak = data?.best_sw_winstreak || 0; + this.solo = new DuelsGamemode(data, 'sw_duel', this.title); + this.doubles = new DuelsGamemode(data, 'sw_doubles', this.title); + this.kills = this.solo.kills + this.doubles.kills; + this.deaths = this.solo.deaths + this.doubles.deaths; + this.KDR = Divide(this.kills, this.deaths); + this.wins = this.solo.wins + this.doubles.wins; + this.losses = this.solo.losses + this.doubles.losses; + this.WLR = Divide(this.wins, this.losses); + this.playedGames = this.solo.playedGames + this.doubles.playedGames; + this.swings = this.solo.swings + this.doubles.swings; + this.hits = this.solo.hits + this.doubles.hits; + this.meleeAccuracy = Divide(this.hits, this.swings); + this.bowShots = this.solo.bowShots + this.doubles.bowShots; + this.bowHits = this.solo.bowHits + this.doubles.bowHits; + this.bowAccuracy = Divide(this.bowHits, this.bowShots); + this.blocksPlaced = this.solo.blocksPlaced + this.doubles.blocksPlaced; + this.healthRegenerated = this.solo.healthRegenerated + this.doubles.healthRegenerated; + this.goldenApplesEatan = this.solo.goldenApplesEatan + this.doubles.goldenApplesEatan; + } +} + +export default DuelsSkyWars; diff --git a/src/Structures/MiniGames/Duels/DuelsUHC.ts b/src/Structures/MiniGames/Duels/DuelsUHC.ts new file mode 100644 index 000000000..6dcd8d32d --- /dev/null +++ b/src/Structures/MiniGames/Duels/DuelsUHC.ts @@ -0,0 +1,66 @@ +import Divide from '../../../Utils/Divide.js'; +import DuelsGamemode from './DuelsGamemode.js'; +import { getTitle } from './Duels.js'; + +class DuelsUHC { + title: string; + winstreak: number; + bestWinstreak: number; + solo: DuelsGamemode; + doubles: DuelsGamemode; + fours: DuelsGamemode; + deathmatch: DuelsGamemode; + kills: number; + deaths: number; + KDR: number; + wins: number; + losses: number; + WLR: number; + playedGames: number; + swings: number; + hits: number; + meleeAccuracy: number; + bowShots: number; + bowHits: number; + bowAccuracy: number; + blocksPlaced: number; + healthRegenerated: number; + goldenApplesEatan: number; + constructor(data: Record) { + this.title = getTitle(data, 'uhc'); + this.winstreak = data?.current_uhc_winstreak || 0; + this.bestWinstreak = data?.best_uhc_winstreak || 0; + this.solo = new DuelsGamemode(data, 'uhc_duel', this.title); + this.doubles = new DuelsGamemode(data, 'uhc_doubles', this.title); + this.fours = new DuelsGamemode(data, 'uhc_four', this.title); + this.deathmatch = new DuelsGamemode(data, 'uhc_meetup', this.title); + this.kills = this.solo.kills + this.doubles.kills + this.fours.kills + this.deathmatch.kills; + this.deaths = this.solo.deaths + this.doubles.deaths + this.fours.deaths + this.deathmatch.deaths; + this.KDR = Divide(this.kills, this.deaths); + this.wins = this.solo.wins + this.doubles.wins + this.fours.wins + this.deathmatch.wins; + this.losses = this.solo.losses + this.doubles.losses + this.fours.losses + this.deathmatch.losses; + this.WLR = Divide(this.wins, this.losses); + this.playedGames = + this.solo.playedGames + this.doubles.playedGames + this.fours.playedGames + this.deathmatch.playedGames; + this.swings = this.solo.swings + this.doubles.swings + this.fours.swings + this.deathmatch.swings; + this.hits = this.solo.hits + this.doubles.hits + this.fours.hits + this.deathmatch.hits; + this.meleeAccuracy = Divide(this.hits, this.swings); + this.bowShots = this.solo.bowShots + this.doubles.bowShots + this.fours.bowShots + this.deathmatch.bowShots; + this.bowHits = this.solo.bowHits + this.doubles.bowHits + this.fours.bowHits + this.deathmatch.bowHits; + this.bowAccuracy = Divide(this.bowHits, this.bowShots); + this.blocksPlaced = + this.solo.blocksPlaced + this.doubles.blocksPlaced + this.fours.blocksPlaced + this.deathmatch.blocksPlaced; + this.healthRegenerated = + this.solo.healthRegenerated + + this.doubles.healthRegenerated + + this.fours.healthRegenerated + + this.deathmatch.healthRegenerated; + this.goldenApplesEatan = + this.solo.goldenApplesEatan + + this.doubles.goldenApplesEatan + + this.fours.goldenApplesEatan + + this.deathmatch.goldenApplesEatan; + } +} + +export default DuelsUHC; diff --git a/src/Structures/MiniGames/MegaWalls/MegaWalls.test.ts b/src/Structures/MiniGames/MegaWalls/MegaWalls.test.ts new file mode 100644 index 000000000..f098f131d --- /dev/null +++ b/src/Structures/MiniGames/MegaWalls/MegaWalls.test.ts @@ -0,0 +1,129 @@ +import MegaWalls from './MegaWalls.js'; +import MegaWallsKitStats from './MegaWallsKitStats.js'; +import MegaWallsModeStats from './MegaWallsModeStats.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { MegaWallsKits } from '../../../Types/Player.js'; + +test('MegaWalls', () => { + const data = new MegaWalls({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(MegaWalls); + expectTypeOf(data).toMatchTypeOf(); + expect(data.selectedClass).toBeDefined(); + expectTypeOf(data.selectedClass).toEqualTypeOf(); + expect(data.coins).toBeDefined(); + expect(data.coins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.coins).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.assists).toBeDefined(); + expect(data.assists).toBeGreaterThanOrEqual(0); + expectTypeOf(data.assists).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.finalKills).toBeDefined(); + expect(data.finalKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.finalKills).toEqualTypeOf(); + expect(data.finalAssists).toBeDefined(); + expect(data.finalAssists).toBeGreaterThanOrEqual(0); + expectTypeOf(data.finalAssists).toEqualTypeOf(); + expect(data.finalDeaths).toBeDefined(); + expect(data.finalDeaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.finalDeaths).toEqualTypeOf(); + expect(data.FKDR).toBeDefined(); + expect(data.FKDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.FKDR).toEqualTypeOf(); + expect(data.playedGames).toBeDefined(); + expect(data.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playedGames).toEqualTypeOf(); + expect(data.witherDamage).toBeDefined(); + expect(data.witherDamage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.witherDamage).toEqualTypeOf(); + expect(data.defenderKills).toBeDefined(); + expect(data.defenderKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.defenderKills).toEqualTypeOf(); + expect(data.walked).toBeDefined(); + expect(data.walked).toBeGreaterThanOrEqual(0); + expectTypeOf(data.walked).toEqualTypeOf(); + expect(data.blocksPlaced).toBeDefined(); + expect(data.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksPlaced).toEqualTypeOf(); + expect(data.blocksBroken).toBeDefined(); + expect(data.blocksBroken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksBroken).toEqualTypeOf(); + expect(data.meleeKills).toBeDefined(); + expect(data.meleeKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meleeKills).toEqualTypeOf(); + expect(data.damageDealt).toBeDefined(); + expect(data.damageDealt).toBeGreaterThanOrEqual(0); + expectTypeOf(data.damageDealt).toEqualTypeOf(); + expect(data.faceOff).toBeDefined(); + expectTypeOf(data.faceOff).toEqualTypeOf(); + expect(data.casualBrawl).toBeDefined(); + expectTypeOf(data.casualBrawl).toEqualTypeOf(); + expect(data.cow).toBeDefined(); + expectTypeOf(data.cow).toEqualTypeOf(); + expect(data.hunter).toBeDefined(); + expectTypeOf(data.hunter).toEqualTypeOf(); + expect(data.shark).toBeDefined(); + expectTypeOf(data.shark).toEqualTypeOf(); + expect(data.arcanist).toBeDefined(); + expectTypeOf(data.arcanist).toEqualTypeOf(); + expect(data.deadlord).toBeDefined(); + expectTypeOf(data.deadlord).toEqualTypeOf(); + expect(data.golem).toBeDefined(); + expectTypeOf(data.golem).toEqualTypeOf(); + expect(data.herobrine).toBeDefined(); + expectTypeOf(data.herobrine).toEqualTypeOf(); + expect(data.pigman).toBeDefined(); + expectTypeOf(data.pigman).toEqualTypeOf(); + expect(data.zombie).toBeDefined(); + expectTypeOf(data.zombie).toEqualTypeOf(); + expect(data.blaze).toBeDefined(); + expectTypeOf(data.blaze).toEqualTypeOf(); + expect(data.enderman).toBeDefined(); + expectTypeOf(data.enderman).toEqualTypeOf(); + expect(data.shaman).toBeDefined(); + expectTypeOf(data.shaman).toEqualTypeOf(); + expectTypeOf(data.squid).toEqualTypeOf(); + expect(data.creeper).toBeDefined(); + expectTypeOf(data.creeper).toEqualTypeOf(); + expect(data.pirate).toBeDefined(); + expectTypeOf(data.pirate).toEqualTypeOf(); + expect(data.sheep).toBeDefined(); + expectTypeOf(data.sheep).toEqualTypeOf(); + expect(data.skeleton).toBeDefined(); + expectTypeOf(data.skeleton).toEqualTypeOf(); + expect(data.spider).toBeDefined(); + expectTypeOf(data.spider).toEqualTypeOf(); + expect(data.werewolf).toBeDefined(); + expectTypeOf(data.werewolf).toEqualTypeOf(); + expect(data.angel).toBeDefined(); + expectTypeOf(data.angel).toEqualTypeOf(); + expect(data.assassin).toBeDefined(); + expectTypeOf(data.assassin).toEqualTypeOf(); + expect(data.automaton).toBeDefined(); + expectTypeOf(data.automaton).toEqualTypeOf(); + expect(data.moleman).toBeDefined(); + expectTypeOf(data.moleman).toEqualTypeOf(); + expect(data.phoenix).toBeDefined(); + expectTypeOf(data.phoenix).toEqualTypeOf(); + expect(data.renegade).toBeDefined(); + expectTypeOf(data.renegade).toEqualTypeOf(); + expect(data.snowman).toBeDefined(); + expectTypeOf(data.snowman).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/MegaWalls/MegaWalls.ts b/src/Structures/MiniGames/MegaWalls/MegaWalls.ts new file mode 100644 index 000000000..cd206ec64 --- /dev/null +++ b/src/Structures/MiniGames/MegaWalls/MegaWalls.ts @@ -0,0 +1,109 @@ +import Divide from '../../../Utils/Divide.js'; +import MegaWallsKitStats from './MegaWallsKitStats.js'; +import MegaWallsModeStats from './MegaWallsModeStats.js'; +import type { MegaWallsKits } from '../../../Types/Player.js'; + +class MegaWalls { + selectedClass: MegaWallsKits | 'None'; + coins: number; + kills: number; + assists: number; + deaths: number; + KDR: number; + wins: number; + losses: number; + WLR: number; + finalKills: number; + finalAssists: number; + finalDeaths: number; + FKDR: number; + playedGames: number; + witherDamage: number; + defenderKills: number; + walked: number; + blocksPlaced: number; + blocksBroken: number; + meleeKills: number; + damageDealt: number; + faceOff: MegaWallsModeStats; + casualBrawl: MegaWallsModeStats; + cow: MegaWallsKitStats; + hunter: MegaWallsKitStats; + shark: MegaWallsKitStats; + arcanist: MegaWallsKitStats; + deadlord: MegaWallsKitStats; + golem: MegaWallsKitStats; + herobrine: MegaWallsKitStats; + pigman: MegaWallsKitStats; + zombie: MegaWallsKitStats; + blaze: MegaWallsKitStats; + enderman: MegaWallsKitStats; + shaman: MegaWallsKitStats; + squid: MegaWallsKitStats; + creeper: MegaWallsKitStats; + pirate: MegaWallsKitStats; + sheep: MegaWallsKitStats; + skeleton: MegaWallsKitStats; + spider: MegaWallsKitStats; + werewolf: MegaWallsKitStats; + angel: MegaWallsKitStats; + assassin: MegaWallsKitStats; + automaton: MegaWallsKitStats; + moleman: MegaWallsKitStats; + phoenix: MegaWallsKitStats; + renegade: MegaWallsKitStats; + snowman: MegaWallsKitStats; + constructor(data: Record) { + this.selectedClass = data?.chosen_class || 'None'; + this.coins = data?.coins || data?.tokens || 0; + this.kills = data?.kills || 0; + this.assists = data?.assists || 0; + this.deaths = data?.deaths || 0; + this.KDR = Divide(this.kills, this.deaths); + this.wins = data?.wins || 0; + this.losses = data?.losses || 0; + this.WLR = Divide(this.wins, this.losses); + this.finalKills = (data?.final_kills || 0) + (data?.finalkills || 0); + this.finalAssists = (data?.final_assists || 0) + (data?.finalassists || 0); + this.finalDeaths = (data?.final_deaths || 0) + (data?.finalDeaths || 0); + this.FKDR = Divide(this.finalKills, this.finalDeaths); + this.playedGames = data?.games_played || 0; + this.witherDamage = (data?.wither_damage || 0) + (data?.witherDamager || 0); + this.defenderKills = data?.defender_kills || 0; + this.walked = data?.meters_walked || 0; + this.blocksPlaced = data?.blocks_placed || 0; + this.blocksBroken = data?.blocks_broken || 0; + this.meleeKills = data?.kills_melee || 0; + this.damageDealt = data?.damage_dealt || 0; + this.faceOff = new MegaWallsModeStats(data, 'face_off'); + this.casualBrawl = new MegaWallsModeStats(data, 'gvg'); + this.cow = new MegaWallsKitStats(data, 'cow'); + this.hunter = new MegaWallsKitStats(data, 'hunter'); + this.shark = new MegaWallsKitStats(data, 'shark'); + this.arcanist = new MegaWallsKitStats(data, 'arcanist'); + this.deadlord = new MegaWallsKitStats(data, 'deadlord'); + this.golem = new MegaWallsKitStats(data, 'golem'); + this.herobrine = new MegaWallsKitStats(data, 'herobrine'); + this.pigman = new MegaWallsKitStats(data, 'pigman'); + this.zombie = new MegaWallsKitStats(data, 'zombie'); + this.blaze = new MegaWallsKitStats(data, 'blaze'); + this.enderman = new MegaWallsKitStats(data, 'enderman'); + this.shaman = new MegaWallsKitStats(data, 'shaman'); + this.squid = new MegaWallsKitStats(data, 'squid'); + this.creeper = new MegaWallsKitStats(data, 'creeper'); + this.pirate = new MegaWallsKitStats(data, 'pirate'); + this.sheep = new MegaWallsKitStats(data, 'sheep'); + this.skeleton = new MegaWallsKitStats(data, 'skeleton'); + this.spider = new MegaWallsKitStats(data, 'spider'); + this.werewolf = new MegaWallsKitStats(data, 'werewolf'); + this.angel = new MegaWallsKitStats(data, 'angel'); + this.assassin = new MegaWallsKitStats(data, 'assassin'); + this.automaton = new MegaWallsKitStats(data, 'automaton'); + this.moleman = new MegaWallsKitStats(data, 'moleman'); + this.phoenix = new MegaWallsKitStats(data, 'phoenix'); + this.renegade = new MegaWallsKitStats(data, 'renegade'); + this.snowman = new MegaWallsKitStats(data, 'snowman'); + } +} + +export default MegaWalls; diff --git a/src/Structures/MiniGames/MegaWalls/MegaWallsKitStats.test.ts b/src/Structures/MiniGames/MegaWalls/MegaWallsKitStats.test.ts new file mode 100644 index 000000000..c69867ce1 --- /dev/null +++ b/src/Structures/MiniGames/MegaWalls/MegaWallsKitStats.test.ts @@ -0,0 +1,71 @@ +import MegaWallsKitStats from './MegaWallsKitStats.js'; +import MegaWallsModeStats from './MegaWallsModeStats.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('MegaWallsKitStats', () => { + const data = new MegaWallsKitStats({ stats: 'meow' }, 'angel'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(MegaWallsKitStats); + expectTypeOf(data).toMatchTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.assists).toBeDefined(); + expect(data.assists).toBeGreaterThanOrEqual(0); + expectTypeOf(data.assists).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.finalKills).toBeDefined(); + expect(data.finalKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.finalKills).toEqualTypeOf(); + expect(data.finalAssists).toBeDefined(); + expect(data.finalAssists).toBeGreaterThanOrEqual(0); + expectTypeOf(data.finalAssists).toEqualTypeOf(); + expect(data.finalDeaths).toBeDefined(); + expect(data.finalDeaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.finalDeaths).toEqualTypeOf(); + expect(data.FKDR).toBeDefined(); + expect(data.FKDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.FKDR).toEqualTypeOf(); + expect(data.playedGames).toBeDefined(); + expect(data.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playedGames).toEqualTypeOf(); + expect(data.witherDamage).toBeDefined(); + expect(data.witherDamage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.witherDamage).toEqualTypeOf(); + expect(data.defenderKills).toBeDefined(); + expect(data.defenderKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.defenderKills).toEqualTypeOf(); + expect(data.walked).toBeDefined(); + expect(data.walked).toBeGreaterThanOrEqual(0); + expectTypeOf(data.walked).toEqualTypeOf(); + expect(data.blocksPlaced).toBeDefined(); + expect(data.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksPlaced).toEqualTypeOf(); + expect(data.blocksBroken).toBeDefined(); + expect(data.blocksBroken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksBroken).toEqualTypeOf(); + expect(data.meleeKills).toBeDefined(); + expect(data.meleeKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meleeKills).toEqualTypeOf(); + expect(data.damageDealt).toBeDefined(); + expect(data.damageDealt).toBeGreaterThanOrEqual(0); + expectTypeOf(data.damageDealt).toEqualTypeOf(); + expect(data.faceOff).toBeDefined(); + expectTypeOf(data.faceOff).toEqualTypeOf(); + expect(data.casualBrawl).toBeDefined(); + expectTypeOf(data.casualBrawl).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/MegaWalls/MegaWallsKitStats.ts b/src/Structures/MiniGames/MegaWalls/MegaWallsKitStats.ts new file mode 100644 index 000000000..d611ea8f1 --- /dev/null +++ b/src/Structures/MiniGames/MegaWalls/MegaWallsKitStats.ts @@ -0,0 +1,52 @@ +import Divide from '../../../Utils/Divide.js'; +import MegaWallsModeStats from './MegaWallsModeStats.js'; +import type { MegaWallsKits } from '../../../Types/Player.js'; + +class MegaWallsKitStats { + kills: number; + assists: number; + deaths: number; + KDR: number; + wins: number; + losses: number; + WLR: number; + finalKills: number; + finalAssists: number; + finalDeaths: number; + FKDR: number; + playedGames: number; + witherDamage: number; + defenderKills: number; + walked: number; + blocksPlaced: number; + blocksBroken: number; + meleeKills: number; + damageDealt: number; + faceOff: MegaWallsModeStats; + casualBrawl: MegaWallsModeStats; + constructor(data: Record, kit: MegaWallsKits) { + this.kills = data?.[`${kit}_kills`] || 0; + this.assists = data?.[`${kit}_assists`] || 0; + this.deaths = data?.[`${kit}_deaths`] || 0; + this.KDR = Divide(this.kills, this.deaths); + this.wins = data?.[`${kit}_wins`] || 0; + this.losses = data?.[`${kit}_losses`] || 0; + this.WLR = Divide(this.wins, this.losses); + this.finalKills = data?.[`${kit}_final_kills`] || 0; + this.finalAssists = data?.[`${kit}_final_assists`] || 0; + this.finalDeaths = data?.[`${kit}_final_deaths`] || 0; + this.FKDR = Divide(this.finalKills, this.finalDeaths); + this.playedGames = data?.[`${kit}_games_played`] || 0; + this.witherDamage = data?.[`${kit}_wither_damage`] || 0; + this.defenderKills = data?.[`${kit}_defender_kills`] || 0; + this.walked = data?.[`${kit}_meters_walked`] || 0; + this.blocksPlaced = data?.[`${kit}_blocks_placed`] || 0; + this.blocksBroken = data?.[`${kit}_blocks_broken`] || 0; + this.meleeKills = data?.[`${kit}_kills_melee`] || 0; + this.damageDealt = data?.[`${kit}_damage_dealt`] || 0; + this.faceOff = new MegaWallsModeStats(data, 'face_off', kit); + this.casualBrawl = new MegaWallsModeStats(data, 'gvg', kit); + } +} + +export default MegaWallsKitStats; diff --git a/src/Structures/MiniGames/MegaWalls/MegaWallsModeStats.test.ts b/src/Structures/MiniGames/MegaWalls/MegaWallsModeStats.test.ts new file mode 100644 index 000000000..5126b06b8 --- /dev/null +++ b/src/Structures/MiniGames/MegaWalls/MegaWallsModeStats.test.ts @@ -0,0 +1,66 @@ +import MegaWallsModeStats from './MegaWallsModeStats.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('MegaWallsModeStats', () => { + const data = new MegaWallsModeStats({ stats: 'meow' }, 'face_off'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(MegaWallsModeStats); + expectTypeOf(data).toMatchTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.assists).toBeDefined(); + expect(data.assists).toBeGreaterThanOrEqual(0); + expectTypeOf(data.assists).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.finalKills).toBeDefined(); + expect(data.finalKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.finalKills).toEqualTypeOf(); + expect(data.finalAssists).toBeDefined(); + expect(data.finalAssists).toBeGreaterThanOrEqual(0); + expectTypeOf(data.finalAssists).toEqualTypeOf(); + expect(data.finalDeaths).toBeDefined(); + expect(data.finalDeaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.finalDeaths).toEqualTypeOf(); + expect(data.FKDR).toBeDefined(); + expect(data.FKDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.FKDR).toEqualTypeOf(); + expect(data.playedGames).toBeDefined(); + expect(data.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playedGames).toEqualTypeOf(); + expect(data.witherDamage).toBeDefined(); + expect(data.witherDamage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.witherDamage).toEqualTypeOf(); + expect(data.defenderKills).toBeDefined(); + expect(data.defenderKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.defenderKills).toEqualTypeOf(); + expect(data.walked).toBeDefined(); + expect(data.walked).toBeGreaterThanOrEqual(0); + expectTypeOf(data.walked).toEqualTypeOf(); + expect(data.blocksPlaced).toBeDefined(); + expect(data.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksPlaced).toEqualTypeOf(); + expect(data.blocksBroken).toBeDefined(); + expect(data.blocksBroken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksBroken).toEqualTypeOf(); + expect(data.meleeKills).toBeDefined(); + expect(data.meleeKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meleeKills).toEqualTypeOf(); + expect(data.damageDealt).toBeDefined(); + expect(data.damageDealt).toBeGreaterThanOrEqual(0); + expectTypeOf(data.damageDealt).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/MegaWalls/MegaWallsModeStats.ts b/src/Structures/MiniGames/MegaWalls/MegaWallsModeStats.ts new file mode 100644 index 000000000..de25d22e2 --- /dev/null +++ b/src/Structures/MiniGames/MegaWalls/MegaWallsModeStats.ts @@ -0,0 +1,48 @@ +import Divide from '../../../Utils/Divide.js'; +import type { MegaWallsKits, MegaWallsModes } from '../../../Types/Player.js'; + +class MegaWallsModeStats { + kills: number; + assists: number; + deaths: number; + KDR: number; + wins: number; + losses: number; + WLR: number; + finalKills: number; + finalAssists: number; + finalDeaths: number; + FKDR: number; + playedGames: number; + witherDamage: number; + defenderKills: number; + walked: number; + blocksPlaced: number; + blocksBroken: number; + meleeKills: number; + damageDealt: number; + constructor(data: Record, mode: MegaWallsModes, kit?: MegaWallsKits) { + const kitName = kit ? `${kit}_` : ''; + this.kills = data?.[`${kitName}kills_${mode}`] || 0; + this.assists = data?.[`${kitName}assists_${mode}`] || 0; + this.deaths = data?.[`${kitName}deaths_${mode}`] || 0; + this.KDR = Divide(this.kills, this.deaths); + this.wins = data?.[`${kitName}wins_${mode}`] || 0; + this.losses = data?.[`${kitName}losses_${mode}`] || 0; + this.WLR = Divide(this.wins, this.losses); + this.finalKills = data?.[`${kitName}final_kills_${mode}`] || 0; + this.finalAssists = data?.[`${kitName}final_assists_${mode}`] || 0; + this.finalDeaths = data?.[`${kitName}final_deaths_${mode}`] || 0; + this.FKDR = Divide(this.finalKills, this.finalDeaths); + this.playedGames = data?.[`${kitName}games_played_${mode}`] || 0; + this.witherDamage = data?.[`${kitName}wither_damage_${mode}`] || 0; + this.defenderKills = data?.[`${kitName}defender_kills_${mode}`] || 0; + this.walked = data?.[`${kitName}meters_walked_${mode}`] || 0; + this.blocksPlaced = data?.[`${kitName}blocks_placed_${mode}`] || 0; + this.blocksBroken = data?.[`${kitName}blocks_broken_${mode}`] || 0; + this.meleeKills = data?.[`${kitName}kills_melee_${mode}`] || 0; + this.damageDealt = data?.[`${kitName}damage_dealt_${mode}`] || 0; + } +} + +export default MegaWallsModeStats; diff --git a/src/Structures/MiniGames/MurderMystery/MurderMystery.test.ts b/src/Structures/MiniGames/MurderMystery/MurderMystery.test.ts new file mode 100644 index 000000000..58ca5b180 --- /dev/null +++ b/src/Structures/MiniGames/MurderMystery/MurderMystery.test.ts @@ -0,0 +1,75 @@ +import MurderMystery from './MurderMystery.js'; +import MurderMysteryModeStats from './MurderMysteryModeStats.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('MurderMystery', () => { + const data = new MurderMystery({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(MurderMystery); + expectTypeOf(data).toEqualTypeOf(); + expect(data.tokens).toBeDefined(); + expect(data.tokens).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tokens).toEqualTypeOf(); + expect(data.goldPickedUp).toBeDefined(); + expect(data.goldPickedUp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goldPickedUp).toEqualTypeOf(); + expect(data.playedGames).toBeDefined(); + expect(data.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playedGames).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.thrownKnifeKills).toBeDefined(); + expect(data.thrownKnifeKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.thrownKnifeKills).toEqualTypeOf(); + expect(data.knifeKills).toBeDefined(); + expect(data.knifeKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.knifeKills).toEqualTypeOf(); + expect(data.trapKills).toBeDefined(); + expect(data.trapKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.trapKills).toEqualTypeOf(); + expect(data.bowKills).toBeDefined(); + expect(data.bowKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowKills).toEqualTypeOf(); + expect(data.killsAsMurderer).toBeDefined(); + expect(data.killsAsMurderer).toBeGreaterThanOrEqual(0); + expectTypeOf(data.killsAsMurderer).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.winsAsMurderer).toBeDefined(); + expect(data.winsAsMurderer).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsAsMurderer).toEqualTypeOf(); + expect(data.winsAsDetective).toBeDefined(); + expect(data.winsAsDetective).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsAsDetective).toEqualTypeOf(); + expect(data.winsAsHero).toBeDefined(); + expect(data.winsAsHero).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsAsHero).toEqualTypeOf(); + expect(data.fastestWinAsMurderer).toBeDefined(); + expect(data.fastestWinAsMurderer).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fastestWinAsMurderer).toEqualTypeOf(); + expect(data.fastestWinAsDetective).toBeDefined(); + expect(data.fastestWinAsDetective).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fastestWinAsDetective).toEqualTypeOf(); + expect(data.totalTimeSurvived).toBeDefined(); + expect(data.totalTimeSurvived).toBeGreaterThanOrEqual(0); + expectTypeOf(data.totalTimeSurvived).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.suicides).toBeDefined(); + expect(data.suicides).toBeGreaterThanOrEqual(0); + expectTypeOf(data.suicides).toEqualTypeOf(); + expect(data.classic).toBeDefined(); + expectTypeOf(data.classic).toEqualTypeOf(); + expect(data.assassins).toBeDefined(); + expectTypeOf(data.assassins).toEqualTypeOf(); + expect(data.doubleUp).toBeDefined(); + expectTypeOf(data.doubleUp).toEqualTypeOf(); + expect(data.infection).toBeDefined(); + expectTypeOf(data.infection).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/MurderMystery/MurderMystery.ts b/src/Structures/MiniGames/MurderMystery/MurderMystery.ts new file mode 100644 index 000000000..fd4efeaae --- /dev/null +++ b/src/Structures/MiniGames/MurderMystery/MurderMystery.ts @@ -0,0 +1,55 @@ +import Divide from '../../../Utils/Divide.js'; +import MurderMysteryModeStats from './MurderMysteryModeStats.js'; + +class MurderMystery { + tokens: number; + goldPickedUp: number; + playedGames: number; + kills: number; + thrownKnifeKills: number; + knifeKills: number; + trapKills: number; + bowKills: number; + killsAsMurderer: number; + deaths: number; + KDR: number; + winsAsMurderer: number; + winsAsDetective: number; + winsAsHero: number; + fastestWinAsMurderer: number; + fastestWinAsDetective: number; + totalTimeSurvived: number; + wins: number; + suicides: number; + classic: MurderMysteryModeStats; + assassins: MurderMysteryModeStats; + doubleUp: MurderMysteryModeStats; + infection: MurderMysteryModeStats; + constructor(data: Record) { + this.tokens = data?.coins || data?.tokens || 0; + this.goldPickedUp = data?.coins_pickedup || 0; + this.playedGames = data?.games || 0; + this.kills = data?.kills || 0; + this.thrownKnifeKills = data?.thrown_knife_kills || 0; + this.knifeKills = data?.knife_kills || 0; + this.trapKills = data?.trap_kills || 0; + this.bowKills = data?.bow_kills || 0; + this.killsAsMurderer = data?.kills_as_murderer || 0; + this.deaths = data?.deaths || 0; + this.KDR = Divide(this.kills, this.deaths); + this.winsAsMurderer = data?.murderer_wins || 0; + this.winsAsDetective = data?.detective_wins || 0; + this.winsAsHero = data?.was_hero || 0; + this.fastestWinAsMurderer = data?.quickest_murderer_win_time_seconds || 0; + this.fastestWinAsDetective = data?.quickest_detective_win_time_seconds || 0; + this.totalTimeSurvived = data?.total_time_survived_seconds || 0; + this.wins = data?.wins || 0; + this.suicides = data?.suicides || 0; + this.classic = new MurderMysteryModeStats(data, 'MURDER_CLASSIC'); + this.assassins = new MurderMysteryModeStats(data, 'MURDER_ASSASSINS'); + this.doubleUp = new MurderMysteryModeStats(data, 'MURDER_DOUBLE_UP'); + this.infection = new MurderMysteryModeStats(data, 'MURDER_INFECTION'); + } +} + +export default MurderMystery; diff --git a/src/Structures/MiniGames/MurderMystery/MurderMysteryModeStats.test.ts b/src/Structures/MiniGames/MurderMystery/MurderMysteryModeStats.test.ts new file mode 100644 index 000000000..d98f0ea5b --- /dev/null +++ b/src/Structures/MiniGames/MurderMystery/MurderMysteryModeStats.test.ts @@ -0,0 +1,51 @@ +import MurderMysteryModeStats from './MurderMysteryModeStats.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('MurderMystery', () => { + const data = new MurderMysteryModeStats({ stats: 'meow' }, 'MURDER_ASSASSINS'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(MurderMysteryModeStats); + expectTypeOf(data).toEqualTypeOf(); + expect(data.goldPickedUp).toBeDefined(); + expect(data.goldPickedUp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goldPickedUp).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.thrownKnifeKills).toBeDefined(); + expect(data.thrownKnifeKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.thrownKnifeKills).toEqualTypeOf(); + expect(data.knifeKills).toBeDefined(); + expect(data.knifeKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.knifeKills).toEqualTypeOf(); + expect(data.bowKills).toBeDefined(); + expect(data.bowKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowKills).toEqualTypeOf(); + expect(data.trapKills).toBeDefined(); + expect(data.trapKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.trapKills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.suicides).toBeDefined(); + expect(data.suicides).toBeGreaterThanOrEqual(0); + expectTypeOf(data.suicides).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.winsAsDetective).toBeDefined(); + expect(data.winsAsDetective).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsAsDetective).toEqualTypeOf(); + expect(data.winsAsMurderer).toBeDefined(); + expect(data.winsAsMurderer).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsAsMurderer).toEqualTypeOf(); + expect(data.winsAsHero).toBeDefined(); + expect(data.winsAsHero).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsAsHero).toEqualTypeOf(); + expect(data.playedGames).toBeDefined(); + expect(data.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playedGames).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/MurderMystery/MurderMysteryModeStats.ts b/src/Structures/MiniGames/MurderMystery/MurderMysteryModeStats.ts new file mode 100644 index 000000000..35d651466 --- /dev/null +++ b/src/Structures/MiniGames/MurderMystery/MurderMysteryModeStats.ts @@ -0,0 +1,37 @@ +import Divide from '../../../Utils/Divide.js'; +import type { MurderMysteryModes } from '../../../Types/Player.js'; + +class MurderMysteryModeStats { + goldPickedUp: number; + kills: number; + thrownKnifeKills: number; + knifeKills: number; + bowKills: number; + trapKills: number; + deaths: number; + suicides: number; + KDR: number; + wins: number; + winsAsDetective: number; + winsAsMurderer: number; + winsAsHero: number; + playedGames: number; + constructor(data: Record, gamemode: MurderMysteryModes) { + this.goldPickedUp = data?.[`coins_pickedup_${gamemode}`] || 0; + this.kills = data?.[`kills_${gamemode}`] || 0; + this.thrownKnifeKills = data?.[`thrown_knife_kills_${gamemode}`] || 0; + this.knifeKills = data?.[`knife_kills_${gamemode}`] || 0; + this.bowKills = data?.[`bow_kills_${gamemode}`] || 0; + this.trapKills = data?.[`trap_kills_${gamemode}`] || 0; + this.deaths = data?.[`deaths_${gamemode}`] || 0; + this.suicides = data?.[`suicides_${gamemode}`] || 0; + this.KDR = Divide(this.kills, this.deaths); + this.wins = data?.[`wins_${gamemode}`] || 0; + this.winsAsDetective = data?.[`detective_wins_${gamemode}`] || 0; + this.winsAsMurderer = data?.[`murderer_wins_${gamemode}`] || 0; + this.winsAsHero = data?.[`was_hero_${gamemode}`] || 0; + this.playedGames = data?.[`games_${gamemode}`] || 0; + } +} + +export default MurderMysteryModeStats; diff --git a/src/Structures/MiniGames/Paintball.test.ts b/src/Structures/MiniGames/Paintball.test.ts new file mode 100644 index 000000000..45310f5ea --- /dev/null +++ b/src/Structures/MiniGames/Paintball.test.ts @@ -0,0 +1,52 @@ +import Paintball from './Paintball.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Paintball', () => { + const data = new Paintball({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Paintball); + expectTypeOf(data).toEqualTypeOf(); + expect(data.coins).toBeDefined(); + expect(data.coins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.coins).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.shotsFired).toBeDefined(); + expect(data.shotsFired).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shotsFired).toEqualTypeOf(); + expect(data.killstreaks).toBeDefined(); + expect(data.killstreaks).toBeGreaterThanOrEqual(0); + expectTypeOf(data.killstreaks).toEqualTypeOf(); + expect(data.forceFieldTime).toBeDefined(); + expect(data.forceFieldTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.forceFieldTime).toEqualTypeOf(); + expect(data.hat).toBeDefined(); + expect(data.adrenaline).toBeDefined(); + expect(data.adrenaline).toBeGreaterThanOrEqual(0); + expectTypeOf(data.adrenaline).toEqualTypeOf(); + expect(data.endurance).toBeDefined(); + expect(data.endurance).toBeGreaterThanOrEqual(0); + expectTypeOf(data.endurance).toEqualTypeOf(); + expect(data.fortune).toBeDefined(); + expect(data.fortune).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fortune).toEqualTypeOf(); + expect(data.godfather).toBeDefined(); + expect(data.godfather).toBeGreaterThanOrEqual(0); + expectTypeOf(data.godfather).toEqualTypeOf(); + expect(data.superluck).toBeDefined(); + expect(data.superluck).toBeGreaterThanOrEqual(0); + expectTypeOf(data.superluck).toEqualTypeOf(); + expect(data.transfusion).toBeDefined(); + expect(data.transfusion).toBeGreaterThanOrEqual(0); + expectTypeOf(data.transfusion).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Paintball.ts b/src/Structures/MiniGames/Paintball.ts new file mode 100644 index 000000000..3dd651522 --- /dev/null +++ b/src/Structures/MiniGames/Paintball.ts @@ -0,0 +1,39 @@ +import Divide from '../../Utils/Divide.js'; +import type { PaintballHats } from '../../Types/Player.js'; + +class Paintball { + coins: number; + kills: number; + deaths: number; + KDR: number; + wins: number; + shotsFired: number; + killstreaks: number; + forceFieldTime: number; + hat: PaintballHats | 'None'; + adrenaline: number; + endurance: number; + fortune: number; + godfather: number; + superluck: number; + transfusion: number; + constructor(data: Record) { + this.coins = data?.coins || data?.tokens || 0; + this.kills = data?.kills || 0; + this.deaths = data?.deaths || 0; + this.KDR = Divide(this.kills, this.deaths); + this.wins = data?.wins || 0; + this.shotsFired = data?.shots_fired || 0; + this.killstreaks = data?.killstreaks || 0; + this.forceFieldTime = data?.forcefieldTime || 0; + this.hat = data?.hat || 'None'; + this.adrenaline = data?.adrenaline || 0; + this.endurance = data?.endurance || 0; + this.fortune = data?.fortune || 0; + this.godfather = data?.godfather || 0; + this.superluck = data?.superluck || 0; + this.transfusion = data?.transfusion || 0; + } +} + +export default Paintball; diff --git a/src/Structures/MiniGames/Pit/Pit.test.ts b/src/Structures/MiniGames/Pit/Pit.test.ts new file mode 100644 index 000000000..997c0488e --- /dev/null +++ b/src/Structures/MiniGames/Pit/Pit.test.ts @@ -0,0 +1,221 @@ +import Client from '../../../Client.js'; +import Pit from './Pit.js'; +import PitInventoryItem from './PitInventoryItem.js'; +import Player from '../../Player/Player.js'; +import { PitArmor } from '../../../Types/Player.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Pit', () => { + const data = new Pit({ stats: 'meow' }); + expect(data).toBeInstanceOf(Pit); + expect(data.prestige).toBeDefined(); + expectTypeOf(data.prestige).toEqualTypeOf(); + expect(data.prestige).toBeGreaterThanOrEqual(0); + expect(data.xp).toBeDefined(); + expectTypeOf(data.xp).toEqualTypeOf(); + expect(data.xp).toBeGreaterThanOrEqual(0); + expect(data.level).toBeDefined(); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.level).toBeGreaterThanOrEqual(0); + expect(data.kills).toBeDefined(); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expect(data.deaths).toBeDefined(); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expect(data.KDR).toBeDefined(); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expect(data.assists).toBeDefined(); + expectTypeOf(data.assists).toEqualTypeOf(); + expect(data.assists).toBeGreaterThanOrEqual(0); + expect(data.maxKillStreak).toBeDefined(); + expectTypeOf(data.maxKillStreak).toEqualTypeOf(); + expect(data.maxKillStreak).toBeGreaterThanOrEqual(0); + expect(data.playtime).toBeDefined(); + expectTypeOf(data.playtime).toEqualTypeOf(); + expect(data.playtime).toBeGreaterThanOrEqual(0); + expect(data.joins).toBeDefined(); + expectTypeOf(data.joins).toEqualTypeOf(); + expect(data.joins).toBeGreaterThanOrEqual(0); + expect(data.damageReceived).toBeDefined(); + expectTypeOf(data.damageReceived).toEqualTypeOf(); + expect(data.damageReceived).toBeGreaterThanOrEqual(0); + expect(data.damageDealt).toBeDefined(); + expectTypeOf(data.damageDealt).toEqualTypeOf(); + expect(data.damageDealt).toBeGreaterThanOrEqual(0); + expect(data.damageRatio).toBeDefined(); + expectTypeOf(data.damageRatio).toEqualTypeOf(); + expect(data.damageRatio).toBeGreaterThanOrEqual(0); + expect(data.meleeDamageReceived).toBeDefined(); + expectTypeOf(data.meleeDamageReceived).toEqualTypeOf(); + expect(data.meleeDamageReceived).toBeGreaterThanOrEqual(0); + expect(data.meleeDamageDealt).toBeDefined(); + expectTypeOf(data.meleeDamageDealt).toEqualTypeOf(); + expect(data.meleeDamageDealt).toBeGreaterThanOrEqual(0); + expect(data.swordHits).toBeDefined(); + expectTypeOf(data.swordHits).toEqualTypeOf(); + expect(data.swordHits).toBeGreaterThanOrEqual(0); + expect(data.leftClicks).toBeDefined(); + expectTypeOf(data.leftClicks).toEqualTypeOf(); + expect(data.leftClicks).toBeGreaterThanOrEqual(0); + expect(data.meleeAccuracy).toBeDefined(); + expectTypeOf(data.meleeAccuracy).toEqualTypeOf(); + expect(data.meleeAccuracy).toBeGreaterThanOrEqual(0); + expect(data.meleeDamageRatio).toBeDefined(); + expectTypeOf(data.meleeDamageRatio).toEqualTypeOf(); + expect(data.meleeDamageRatio).toBeGreaterThanOrEqual(0); + expect(data.bowDamageReceived).toBeDefined(); + expectTypeOf(data.bowDamageReceived).toEqualTypeOf(); + expect(data.bowDamageReceived).toBeGreaterThanOrEqual(0); + expect(data.bowDamageDealt).toBeDefined(); + expectTypeOf(data.bowDamageDealt).toEqualTypeOf(); + expect(data.bowDamageDealt).toBeGreaterThanOrEqual(0); + expect(data.arrowsHit).toBeDefined(); + expectTypeOf(data.arrowsHit).toEqualTypeOf(); + expect(data.arrowsHit).toBeGreaterThanOrEqual(0); + expect(data.arrowsFired).toBeDefined(); + expectTypeOf(data.arrowsFired).toEqualTypeOf(); + expect(data.arrowsFired).toBeGreaterThanOrEqual(0); + expect(data.bowAccuracy).toBeDefined(); + expectTypeOf(data.bowAccuracy).toEqualTypeOf(); + expect(data.bowAccuracy).toBeGreaterThanOrEqual(0); + expect(data.bowDamageRatio).toBeDefined(); + expectTypeOf(data.bowDamageRatio).toEqualTypeOf(); + expect(data.bowDamageRatio).toBeGreaterThanOrEqual(0); + expect(data.goldenHeadsEaten).toBeDefined(); + expectTypeOf(data.goldenHeadsEaten).toEqualTypeOf(); + expect(data.goldenHeadsEaten).toBeGreaterThanOrEqual(0); +}); + +test('Pit Inventory', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getPlayer('3457688aa57c4d71ab9d22b04f9160db'); + data = data as Player; + expect(data.stats.pit.getInventory).toBeDefined(); + expectTypeOf(data.stats.pit.getInventory).toEqualTypeOf<() => Promise>(); + expect(data.stats.pit.getInventory).toBeInstanceOf(Function); + const pitInventory = await data.stats.pit.getInventory(); + expect(pitInventory).toBeDefined(); + pitInventory.forEach((item: PitInventoryItem) => { + expect(item).toBeDefined(); + expect(item).toBeInstanceOf(PitInventoryItem); + expectTypeOf(item).toEqualTypeOf(); + expect(item.itemId).toBeDefined(); + expectTypeOf(item.itemId).toEqualTypeOf(); + expect(item.count).toBeDefined(); + expectTypeOf(item.count).toEqualTypeOf(); + expect(item.name).toBeDefined(); + expectTypeOf(item.name).toEqualTypeOf(); + expect(item.lore).toBeDefined(); + expectTypeOf(item.lore).toEqualTypeOf(); + expect(item.loreArray).toBeDefined(); + expectTypeOf(item.loreArray).toEqualTypeOf(); + expect(item.extraAttributes).toBeDefined(); + expectTypeOf(item.extraAttributes).toEqualTypeOf(); + }); + expect(data.stats.pit.getEnterChest).toBeDefined(); + expectTypeOf(data.stats.pit.getEnterChest).toEqualTypeOf<() => Promise>(); + expect(data.stats.pit.getEnterChest).toBeInstanceOf(Function); + const pitEnterChest = await data.stats.pit.getEnterChest(); + expect(pitEnterChest).toBeDefined(); + pitEnterChest.forEach((item: PitInventoryItem) => { + expect(item).toBeDefined(); + expect(item).toBeInstanceOf(PitInventoryItem); + expectTypeOf(item).toEqualTypeOf(); + expect(item.itemId).toBeDefined(); + expectTypeOf(item.itemId).toEqualTypeOf(); + expect(item.count).toBeDefined(); + expectTypeOf(item.count).toEqualTypeOf(); + expect(item.name).toBeDefined(); + expectTypeOf(item.name).toEqualTypeOf(); + expect(item.lore).toBeDefined(); + expectTypeOf(item.lore).toEqualTypeOf(); + expect(item.loreArray).toBeDefined(); + expectTypeOf(item.loreArray).toEqualTypeOf(); + expect(item.extraAttributes).toBeDefined(); + expectTypeOf(item.extraAttributes).toEqualTypeOf(); + }); + expect(data.stats.pit.getArmor).toBeDefined(); + expectTypeOf(data.stats.pit.getArmor).toEqualTypeOf<() => Promise>(); + expect(data.stats.pit.getArmor).toBeInstanceOf(Function); + const pitArmor = await data.stats.pit.getArmor(); + expect(pitArmor).toBeDefined(); + expectTypeOf(pitArmor).toEqualTypeOf(); + expect(pitArmor.helmet).toBeDefined(); + expectTypeOf(pitArmor.helmet).toEqualTypeOf(); + if (null !== pitArmor.helmet) { + expect(pitArmor.helmet).toBeDefined(); + expect(pitArmor.helmet).toBeInstanceOf(PitInventoryItem); + expectTypeOf(pitArmor.helmet).toEqualTypeOf(); + expect(pitArmor.helmet.itemId).toBeDefined(); + expectTypeOf(pitArmor.helmet.itemId).toEqualTypeOf(); + expect(pitArmor.helmet.count).toBeDefined(); + expectTypeOf(pitArmor.helmet.count).toEqualTypeOf(); + expect(pitArmor.helmet.name).toBeDefined(); + expectTypeOf(pitArmor.helmet.name).toEqualTypeOf(); + expect(pitArmor.helmet.lore).toBeDefined(); + expectTypeOf(pitArmor.helmet.lore).toEqualTypeOf(); + expect(pitArmor.helmet.loreArray).toBeDefined(); + expectTypeOf(pitArmor.helmet.loreArray).toEqualTypeOf(); + expect(pitArmor.helmet.extraAttributes).toBeDefined(); + expectTypeOf(pitArmor.helmet.extraAttributes).toEqualTypeOf(); + } + expect(pitArmor.chestplate).toBeDefined(); + expectTypeOf(pitArmor.chestplate).toEqualTypeOf(); + if (null !== pitArmor.chestplate) { + expect(pitArmor.chestplate).toBeDefined(); + expect(pitArmor.chestplate).toBeInstanceOf(PitInventoryItem); + expectTypeOf(pitArmor.chestplate).toEqualTypeOf(); + expect(pitArmor.chestplate.itemId).toBeDefined(); + expectTypeOf(pitArmor.chestplate.itemId).toEqualTypeOf(); + expect(pitArmor.chestplate.count).toBeDefined(); + expectTypeOf(pitArmor.chestplate.count).toEqualTypeOf(); + expect(pitArmor.chestplate.name).toBeDefined(); + expectTypeOf(pitArmor.chestplate.name).toEqualTypeOf(); + expect(pitArmor.chestplate.lore).toBeDefined(); + expectTypeOf(pitArmor.chestplate.lore).toEqualTypeOf(); + expect(pitArmor.chestplate.loreArray).toBeDefined(); + expectTypeOf(pitArmor.chestplate.loreArray).toEqualTypeOf(); + expect(pitArmor.chestplate.extraAttributes).toBeDefined(); + expectTypeOf(pitArmor.chestplate.extraAttributes).toEqualTypeOf(); + } + expect(pitArmor.leggings).toBeDefined(); + expectTypeOf(pitArmor.leggings).toEqualTypeOf(); + if (null !== pitArmor.leggings) { + expect(pitArmor.leggings).toBeDefined(); + expect(pitArmor.leggings).toBeInstanceOf(PitInventoryItem); + expectTypeOf(pitArmor.leggings).toEqualTypeOf(); + expect(pitArmor.leggings.itemId).toBeDefined(); + expectTypeOf(pitArmor.leggings.itemId).toEqualTypeOf(); + expect(pitArmor.leggings.count).toBeDefined(); + expectTypeOf(pitArmor.leggings.count).toEqualTypeOf(); + expect(pitArmor.leggings.name).toBeDefined(); + expectTypeOf(pitArmor.leggings.name).toEqualTypeOf(); + expect(pitArmor.leggings.lore).toBeDefined(); + expectTypeOf(pitArmor.leggings.lore).toEqualTypeOf(); + expect(pitArmor.leggings.loreArray).toBeDefined(); + expectTypeOf(pitArmor.leggings.loreArray).toEqualTypeOf(); + expect(pitArmor.leggings.extraAttributes).toBeDefined(); + expectTypeOf(pitArmor.leggings.extraAttributes).toEqualTypeOf(); + } + expect(pitArmor.boots).toBeDefined(); + expectTypeOf(pitArmor.boots).toEqualTypeOf(); + if (null !== pitArmor.boots) { + expect(pitArmor.boots).toBeDefined(); + expect(pitArmor.boots).toBeInstanceOf(PitInventoryItem); + expectTypeOf(pitArmor.boots).toEqualTypeOf(); + expect(pitArmor.boots.itemId).toBeDefined(); + expectTypeOf(pitArmor.boots.itemId).toEqualTypeOf(); + expect(pitArmor.boots.count).toBeDefined(); + expectTypeOf(pitArmor.boots.count).toEqualTypeOf(); + expect(pitArmor.boots.name).toBeDefined(); + expectTypeOf(pitArmor.boots.name).toEqualTypeOf(); + expect(pitArmor.boots.lore).toBeDefined(); + expectTypeOf(pitArmor.boots.lore).toEqualTypeOf(); + expect(pitArmor.boots.loreArray).toBeDefined(); + expectTypeOf(pitArmor.boots.loreArray).toEqualTypeOf(); + expect(pitArmor.boots.extraAttributes).toBeDefined(); + expectTypeOf(pitArmor.boots.extraAttributes).toEqualTypeOf(); + } +}); diff --git a/src/Structures/MiniGames/Pit/Pit.ts b/src/Structures/MiniGames/Pit/Pit.ts new file mode 100644 index 000000000..9a6783272 --- /dev/null +++ b/src/Structures/MiniGames/Pit/Pit.ts @@ -0,0 +1,128 @@ +import Divide from '../../../Utils/Divide.js'; +import PitInventoryItem from './PitInventoryItem.js'; +import { decode } from '../../../Utils/SkyblockUtils.js'; +import { pit } from '../../../Utils/Constants.js'; +import type { PitArmor } from '../../../Types/Player.js'; + +class Pit { + prestige: number; + xp: number; + level: number; + kills: number; + deaths: number; + KDR: number; + assists: number; + maxKillStreak: number; + playtime: number; + joins: number; + damageReceived: number; + damageDealt: number; + damageRatio: number; + meleeDamageReceived: number; + meleeDamageDealt: number; + swordHits: number; + leftClicks: number; + meleeAccuracy: number; + meleeDamageRatio: number; + bowDamageReceived: number; + bowDamageDealt: number; + arrowsHit: number; + arrowsFired: number; + bowAccuracy: number; + bowDamageRatio: number; + goldenHeadsEaten: number; + getInventory: () => Promise; + getEnterChest: () => Promise; + getArmor: () => Promise; + constructor(data: Record) { + this.prestige = data?.profile?.prestiges?.[data?.profile?.prestiges?.length - 1]?.index || 0; + this.xp = data?.profile?.xp || 0; + this.level = + this.calcLevel( + this.prestige, + 0 < this.prestige + ? this.xp - (pit?.Prestiges?.[this.prestige - 1] ? pit?.Prestiges?.[this.prestige - 1]?.SumXp || 0 : 0) + : this.xp + ) ?? 0; + this.kills = data?.pit_stats_ptl?.kills || 0; + this.deaths = data?.pit_stats_ptl?.deaths || 0; + this.KDR = Divide(this.kills, this.deaths); + this.assists = data?.pit_stats_ptl?.assists || 0; + this.maxKillStreak = data?.pit_stats_ptl?.max_streak || 0; + this.playtime = (data?.pit_stats_ptl?.playtime_minutes || 0) * 60; + this.joins = data?.pit_stats_ptl?.joins || 0; + this.damageReceived = data?.pit_stats_ptl?.damage_received || 0; + this.damageDealt = data?.pit_stats_ptl?.damage_dealt || 0; + this.damageRatio = Divide(this.damageDealt, this.damageReceived); + this.meleeDamageReceived = data?.pit_stats_ptl?.melee_damage_received || 0; + this.meleeDamageDealt = data?.pit_stats_ptl?.melee_damage_dealt || 0; + this.swordHits = data?.pit_stats_ptl?.sword_hits || 0; + this.leftClicks = data?.pit_stats_ptl?.left_clicks || 0; + this.meleeAccuracy = Divide(this.swordHits, this.leftClicks); + this.meleeDamageRatio = Divide(this.meleeDamageDealt, this.meleeDamageReceived); + this.bowDamageReceived = data?.pit_stats_ptl?.bow_damage_received || 0; + this.bowDamageDealt = data?.pit_stats_ptl?.bow_damage_dealt || 0; + this.arrowsHit = data?.pit_stats_ptl?.arrow_hits || 0; + this.arrowsFired = data?.pit_stats_ptl?.arrows_fired || 0; + this.bowAccuracy = Divide(this.arrowsHit, this.arrowsFired); + this.bowDamageRatio = Divide(this.bowDamageDealt, this.bowDamageReceived); + this.goldenHeadsEaten = data?.pit_stats_ptl?.ghead_eaten || 0; + this.getInventory = async (): Promise => { + let inventory = data?.profile?.inv_contents || undefined; + if (!inventory) return []; + inventory = await decode(inventory?.data); + const edited = []; + for (let i = 1; i < inventory?.length; i++) { + if (!inventory[i]?.id) { + continue; + } + edited?.push(new PitInventoryItem(inventory[i])); + } + return edited; + }; + this.getEnterChest = async () => { + let chest = data?.profile?.inv_enderchest || undefined; + if (!chest) return []; + chest = await decode(chest?.data); + const edited = []; + for (let i = 1; i < chest?.length; i++) { + if (!chest[i]?.id) { + continue; + } + edited?.push(new PitInventoryItem(chest[i])); + } + return edited; + }; + this.getArmor = async () => { + const base64 = data?.profile?.inv_armor || undefined; + if (!base64) return { helmet: null, chestplate: null, leggings: null, boots: null }; + const decoded = await decode(base64?.data); + const armor = { + helmet: decoded[3]?.id ? new PitInventoryItem(decoded[3]) : null, + chestplate: decoded[2]?.id ? new PitInventoryItem(decoded[2]) : null, + leggings: decoded[1]?.id ? new PitInventoryItem(decoded[1]) : null, + boots: decoded[0]?.id ? new PitInventoryItem(decoded[0]) : null + }; + return armor; + }; + } + // Credit https://github.com/PitPanda/PitPandaProduction/blob/b1971f56ea1aa8c829b722cbb33247c96591c0cb/Structures/Pit.js + private calcLevel(prestige: number, xp: number): number { + const multiplier = pit?.Prestiges[prestige]?.Multiplier || 0; + let level = 0; + while (0 < xp && 120 > level) { + const levelXp = pit?.Levels?.[Math.floor(level / 10)]?.Xp || 0 * multiplier; + if (xp >= levelXp * 10) { + xp -= levelXp * 10; + level += 10; + } else { + const gain = Math.floor(xp / levelXp); + level += gain; + xp = 0; + } + } + return level; + } +} + +export default Pit; diff --git a/src/Structures/MiniGames/Pit/PitInventoryItem.ts b/src/Structures/MiniGames/Pit/PitInventoryItem.ts new file mode 100644 index 000000000..7b5d3f98f --- /dev/null +++ b/src/Structures/MiniGames/Pit/PitInventoryItem.ts @@ -0,0 +1,20 @@ +class PitInventoryItem { + itemId: number; + count: number; + name: string | null; + lore: string | null; + loreArray: string[]; + extraAttributes: object | null; + constructor(data: Record) { + this.itemId = data?.id || 0; + this.count = data?.Count || 0; + this.name = data?.tag?.display?.Name + ? data?.tag?.display?.Name?.toString().replace(/§([1-9]|[a-f])|§/gm, '') + : null; + this.lore = data?.tag?.display?.Lore ? data?.tag?.display?.Lore?.join('\n') : null; + this.loreArray = data?.tag?.display?.Lore ?? []; + this.extraAttributes = data?.tag?.ExtraAttributes ?? null; + } +} + +export default PitInventoryItem; diff --git a/src/Structures/MiniGames/Quakecraft/Quakecraft.test.ts b/src/Structures/MiniGames/Quakecraft/Quakecraft.test.ts new file mode 100644 index 000000000..3d29bf312 --- /dev/null +++ b/src/Structures/MiniGames/Quakecraft/Quakecraft.test.ts @@ -0,0 +1,68 @@ +import Quakecraft from './Quakecraft.js'; +import QuakecraftMode from './QuakecraftMode.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { ColorCode } from '../../../Types/Color.js'; +import type { + QuakecraftBarrels, + QuakecraftCase, + QuakecraftKillSounds, + QuakecraftMuzzle, + QuakecraftSights, + QuakecraftTriggers +} from '../../../Types/Player.js'; + +test('Quakecraft', () => { + const data = new Quakecraft({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Quakecraft); + expectTypeOf(data).toEqualTypeOf(); + expect(data.coins).toBeDefined(); + expect(data.coins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.coins).toEqualTypeOf(); + expect(data.solo).toBeDefined(); + expectTypeOf(data.solo).toEqualTypeOf(); + expect(data.teams).toBeDefined(); + expectTypeOf(data.teams).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.killstreaks).toBeDefined(); + expect(data.killstreaks).toBeGreaterThanOrEqual(0); + expectTypeOf(data.killstreaks).toEqualTypeOf(); + expect(data.distanceTravelled).toBeDefined(); + expect(data.distanceTravelled).toBeGreaterThanOrEqual(0); + expectTypeOf(data.distanceTravelled).toEqualTypeOf(); + expect(data.shotsFired).toBeDefined(); + expect(data.shotsFired).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shotsFired).toEqualTypeOf(); + expect(data.headshots).toBeDefined(); + expect(data.headshots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.headshots).toEqualTypeOf(); + expect(data.instantRespawn).toBeDefined(); + expectTypeOf(data.instantRespawn).toEqualTypeOf(); + expect(data.killPrefixColor).toBeDefined(); + expectTypeOf(data.killPrefixColor).toEqualTypeOf(); + expect(data.showPrefix).toBeDefined(); + expectTypeOf(data.showPrefix).toEqualTypeOf(); + expect(data.killSound).toBeDefined(); + expectTypeOf(data.killSound).toEqualTypeOf(); + expect(data.barrel).toBeDefined(); + expectTypeOf(data.barrel).toEqualTypeOf(); + expect(data.case).toBeDefined(); + expectTypeOf(data.case).toEqualTypeOf(); + expect(data.muzzle).toBeDefined(); + expectTypeOf(data.muzzle).toEqualTypeOf(); + expect(data.sight).toBeDefined(); + expectTypeOf(data.sight).toEqualTypeOf(); + expect(data.trigger).toBeDefined(); + expectTypeOf(data.trigger).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Quakecraft/Quakecraft.ts b/src/Structures/MiniGames/Quakecraft/Quakecraft.ts new file mode 100644 index 000000000..138a1c3af --- /dev/null +++ b/src/Structures/MiniGames/Quakecraft/Quakecraft.ts @@ -0,0 +1,58 @@ +import Divide from '../../../Utils/Divide.js'; +import QuakecraftMode from './QuakecraftMode.js'; +import type { ColorCode } from '../../../Types/Color.js'; +import type { + QuakecraftBarrels, + QuakecraftCase, + QuakecraftKillSounds, + QuakecraftMuzzle, + QuakecraftSights, + QuakecraftTriggers +} from '../../../Types/Player.js'; + +class Quakecraft { + coins: number; + solo: QuakecraftMode; + teams: QuakecraftMode; + wins: number; + kills: number; + deaths: number; + KDR: number; + killstreaks: number; + distanceTravelled: number; + shotsFired: number; + headshots: number; + instantRespawn: boolean; + killPrefixColor: ColorCode; + showPrefix: boolean; + killSound: QuakecraftKillSounds | 'None'; + barrel: QuakecraftBarrels | 'None'; + case: QuakecraftCase | 'None'; + muzzle: QuakecraftMuzzle | 'None'; + sight: QuakecraftSights | 'None'; + trigger: QuakecraftTriggers | 'None'; + constructor(data: Record) { + this.coins = data?.coins || data?.tokens || 0; + this.solo = new QuakecraftMode(data); + this.teams = new QuakecraftMode(data, 'teams'); + this.wins = this.solo?.wins + this.teams?.wins; + this.kills = this.solo?.kills + this.teams?.kills; + this.deaths = this.solo?.deaths + this.teams?.deaths; + this.KDR = Divide(this.kills, this.deaths); + this.killstreaks = this.solo?.killstreaks + this.teams?.killstreaks; + this.distanceTravelled = this.solo?.distanceTravelled + this.teams?.distanceTravelled; + this.shotsFired = this.solo?.shotsFired + this.teams?.shotsFired; + this.headshots = this.solo?.headshots + this.teams?.headshots; + this.instantRespawn = data?.instantRespawn || false; + this.killPrefixColor = data?.selectedKillPrefix || ''; + this.showPrefix = data?.showKillPrefix || false; + this.killSound = data?.killsound || 'None'; + this.barrel = data?.barrel || 'None'; + this.case = data?.case || 'None'; + this.muzzle = data?.muzzle || 'None'; + this.sight = data?.sight || 'None'; + this.trigger = data?.trigger || 'None'; + } +} + +export default Quakecraft; diff --git a/src/Structures/MiniGames/Quakecraft/QuakecraftMode.test.ts b/src/Structures/MiniGames/Quakecraft/QuakecraftMode.test.ts new file mode 100644 index 000000000..c9a0f1eef --- /dev/null +++ b/src/Structures/MiniGames/Quakecraft/QuakecraftMode.test.ts @@ -0,0 +1,33 @@ +import QuakecraftMode from './QuakecraftMode.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('QuakecraftMode', () => { + const data = new QuakecraftMode({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(QuakecraftMode); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.killstreaks).toBeDefined(); + expect(data.killstreaks).toBeGreaterThanOrEqual(0); + expectTypeOf(data.killstreaks).toEqualTypeOf(); + expect(data.distanceTravelled).toBeDefined(); + expect(data.distanceTravelled).toBeGreaterThanOrEqual(0); + expectTypeOf(data.distanceTravelled).toEqualTypeOf(); + expect(data.shotsFired).toBeDefined(); + expect(data.shotsFired).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shotsFired).toEqualTypeOf(); + expect(data.headshots).toBeDefined(); + expect(data.headshots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.headshots).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Quakecraft/QuakecraftMode.ts b/src/Structures/MiniGames/Quakecraft/QuakecraftMode.ts new file mode 100644 index 000000000..d38cb42e3 --- /dev/null +++ b/src/Structures/MiniGames/Quakecraft/QuakecraftMode.ts @@ -0,0 +1,25 @@ +import Divide from '../../../Utils/Divide.js'; + +class QuakecraftMode { + wins: number; + kills: number; + deaths: number; + KDR: number; + killstreaks: number; + distanceTravelled: number; + shotsFired: number; + headshots: number; + constructor(data: Record, gamemode?: 'teams') { + const mode = gamemode ? `_${gamemode}` : ''; + this.wins = data?.[`wins${mode}`] || 0; + this.kills = data?.[`kills${mode}`] || 0; + this.deaths = data?.[`deaths${mode}`] || 0; + this.KDR = Divide(this.kills, this.deaths); + this.killstreaks = data?.[`killstreaks${mode}`] || 0; + this.distanceTravelled = data?.[`distance_travelled${mode}`] || 0; + this.shotsFired = data?.[`shots_fired${mode}`] || 0; + this.headshots = data?.[`headshots${mode}`] || 0; + } +} + +export default QuakecraftMode; diff --git a/src/Structures/MiniGames/SkyWars/SkyWars.ts b/src/Structures/MiniGames/SkyWars/SkyWars.ts new file mode 100644 index 000000000..de41bc06d --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWars.ts @@ -0,0 +1,153 @@ +import Divide from '../../../Utils/Divide.js'; +import SkyWarsMode from './SkyWarsMode.js'; +import SkyWarsModeStats from './SkyWarsModeStats.js'; +import SkyWarsPackages from './SkyWarsPackages.js'; +import type { SkyWarsPrestige } from '../../../Types/Player.js'; + +function getSkyWarsPrestige(level: number): SkyWarsPrestige { + if (60 <= level) return 'Mythic'; + return (['Iron', 'Iron', 'Gold', 'Diamond', 'Emerald', 'Sapphire', 'Ruby', 'Crystal', 'Opal', 'Amethyst', 'Rainbow'][ + Math.floor(level / 5) + ] || 'Iron') as SkyWarsPrestige; +} + +function getSkyWarsLevel(xp: number): number { + const totalXp = [0, 2, 7, 15, 25, 50, 100, 200, 350, 600, 1000, 1500]; + if (0 === xp) return 0; + if (15000 <= xp) return Math.floor((xp - 15000) / 10000 + 12); + const level = totalXp.findIndex((x) => 0 < x * 10 - xp); + return -1 === level ? 0 : level; +} + +function getSkyWarsLevelProgress(xp: number) { + const totalXp: number[] = [0, 2, 7, 15, 25, 50, 100, 200, 350, 600, 1000, 1500]; + const xpToNextLvl: number[] = [0, 2, 5, 8, 10, 25, 50, 100, 150, 250, 400, 500]; + let percent; + let xpToNextLevel; + let currentLevelXp = xp; + if (15000 <= xp) { + currentLevelXp -= 15000; + if (0 === currentLevelXp) return { currentLevelXp: 0, xpToNextLevel: 10000, percent: 0, xpNextLevel: 10000 }; + if (10000 < currentLevelXp) { + do { + currentLevelXp -= 10000; + } while (10000 <= currentLevelXp); + } + xpToNextLevel = 10000 - currentLevelXp; + percent = Math.round(currentLevelXp) / 100; + const percentRemaining = Math.round((100 - percent) * 100) / 100; + return { currentLevelXp, xpToNextLevel, percent, xpNextLevel: 10000, percentRemaining }; + } + const totalXptoNextLevel = (xpToNextLvl?.[totalXp.findIndex((x) => 0 < x * 10 - xp)] || 0) * 10; + for (let i = 0; i < xpToNextLvl.length; i++) { + if (0 > currentLevelXp - (xpToNextLvl?.[i] || 0) * 10) break; + currentLevelXp -= (xpToNextLvl?.[i] || 0) * 10; + } + xpToNextLevel = totalXptoNextLevel - currentLevelXp; + percent = Math.round((currentLevelXp / totalXptoNextLevel) * 10000) / 100; + return { currentLevelXp, xpToNextLevel, percent, xpNextLevel: totalXptoNextLevel }; +} + +class SkyWars { + coins: number; + souls: number; + tokens: number; + experience: number; + level: number; + levelProgress: any; + levelFormatted: string | null; + prestige: SkyWarsPrestige; + opals: number; + avarice: number; + tenacity: number; + shards: number; + angelOfDeathLevel: number; + killstreak: number; + kills: number; + voidKills: number; + meleeKills: number; + bowKills: number; + mobKills: number; + assists: number; + deaths: number; + KDR: number; + wins: number; + losses: number; + WLR: number; + gamesPlayed: number; + survivedPlayers: number; + chestsOpened: number; + timePlayed: number; + shard: number; + longestBowShot: number; + arrowsShot: number; + arrowsHit: number; + bowAccuracy: number; + fastestWin: number; + heads: number; + blocksPlaced: number; + blocksBroken: number; + eggThrown: number; + enderpearlsThrown: number; + solo: SkyWarsModeStats; + team: SkyWarsModeStats; + mega: SkyWarsMode; + megaDoubles: SkyWarsMode; + lab: SkyWarsMode; + packages: SkyWarsPackages; + constructor(data: Record) { + this.coins = data?.coins || 0; + this.souls = data?.souls || 0; + this.tokens = data?.cosmetic_tokens || 0; + this.experience = data?.skywars_experience || 0; + this.level = getSkyWarsLevel(data?.skywars_experience); + this.levelProgress = getSkyWarsLevelProgress(data?.skywars_experience); + this.levelFormatted = data?.levelFormatted + ? data?.levelFormatted + ?.replace(/§l/gm, '**') + ?.replace(/§([a-f]|[1-9])/gm, '') + ?.replace(/§r/gm, '') + : null; + this.prestige = getSkyWarsPrestige(this.level); + this.opals = data?.opals || 0; + this.avarice = data?.avarice || 0; + this.tenacity = data?.tenacity || 0; + this.shards = data?.shard || 0; + this.angelOfDeathLevel = data?.angel_of_death_level || 0; + this.killstreak = data?.killstreak || 0; + this.kills = data?.kills || 0; + this.voidKills = data?.void_kills || 0; + this.meleeKills = data?.melee_kills || 0; + this.bowKills = data?.bow_kills || 0; + this.mobKills = data?.mob_kills || 0; + this.assists = data?.assists || 0; + this.deaths = data?.deaths || 0; + this.KDR = Divide(data?.kills, data?.deaths); + this.wins = data?.wins || 0; + this.losses = data?.losses || 0; + this.WLR = Divide(data?.wins, data?.losses); + this.gamesPlayed = data?.games || 0; + this.survivedPlayers = data?.survived_players || 0; + this.chestsOpened = data?.chests_opened || 0; + this.timePlayed = data?.time_played || 0; + this.shard = data?.shard || 0; + this.longestBowShot = data?.longest_bow_shot || 0; + this.arrowsShot = data?.arrows_shot || 0; + this.arrowsHit = data?.arrows_hit || 0; + this.bowAccuracy = Divide(this.arrowsHit, this.arrowsShot); + this.fastestWin = data?.fastest_win || 0; + this.heads = data?.heads || 0; + this.blocksPlaced = data?.blocks_placed || 0; + this.blocksBroken = data?.blocks_broken || 0; + this.eggThrown = data?.egg_thrown || 0; + this.enderpearlsThrown = data?.enderpearls_thrown || 0; + this.solo = new SkyWarsModeStats(data, 'solo'); + this.team = new SkyWarsModeStats(data, 'team'); + this.mega = new SkyWarsMode(data, 'mega'); + this.megaDoubles = new SkyWarsMode(data, 'mega_doubles'); + this.lab = new SkyWarsMode(data, 'lab'); + this.packages = new SkyWarsPackages(data?.packages || []); + } +} + +export default SkyWars; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsKit.ts b/src/Structures/MiniGames/SkyWars/SkyWarsKit.ts new file mode 100644 index 000000000..b488d1656 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsKit.ts @@ -0,0 +1,19 @@ +import { RemoveSnakeCaseString } from '../../../Utils/RemoveSnakeCase.js'; +import type { SkyWarsKitNames } from '../../../Types/Player.js'; + +class SkyWarsKit { + kitData: string[]; + isKit: boolean; + gameMode: string; + kitType: string; + kitName: SkyWarsKitNames; + constructor(kit: Record) { + this.kitData = kit?.match(/^kit_([a-z]+)_([a-z]+)_([a-z]+)$/); + this.isKit = Boolean(this.kitData); + this.gameMode = this.kitData ? this.kitData?.[2] || '' : ''; + this.kitType = this.kitData ? this.kitData?.[1] || '' : ''; + this.kitName = RemoveSnakeCaseString(this.kitData ? this.kitData?.[3] || '' : '') as SkyWarsKitNames; + } +} + +export default SkyWarsKit; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsKits.ts b/src/Structures/MiniGames/SkyWars/SkyWarsKits.ts new file mode 100644 index 000000000..0c55a2ae2 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsKits.ts @@ -0,0 +1,13 @@ +import SkyWarsKit from './SkyWarsKit.js'; + +class SkyWarsKits { + kits: SkyWarsKit[]; + constructor(kits: Record) { + this.kits = kits.map((kit: any) => new SkyWarsKit(kit)).filter((kit: SkyWarsKit) => kit?.isKit); + } + get(gameMode: string = '', type: string = ''): SkyWarsKit[] { + return this.kits.filter((kit) => kit?.gameMode?.startsWith(gameMode) && kit?.kitType.startsWith(type)); + } +} + +export default SkyWarsKits; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsMode.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsMode.test.ts new file mode 100644 index 000000000..a3fadb4cd --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsMode.test.ts @@ -0,0 +1,27 @@ +import SkyWarsMode from './SkyWarsMode.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWars (Mode)', () => { + const data = new SkyWarsMode({ stats: 'meow' }, 'lab'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsMode.ts b/src/Structures/MiniGames/SkyWars/SkyWarsMode.ts new file mode 100644 index 000000000..258c2cc6f --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsMode.ts @@ -0,0 +1,21 @@ +import Divide from '../../../Utils/Divide.js'; +import type { SkyWarsModes } from '../../../Types/Player.js'; + +class SkyWarsMode { + kills: number; + deaths: number; + KDR: number; + wins: number; + losses: number; + WLR: number; + constructor(data: Record, gamemode: SkyWarsModes) { + this.kills = data?.[`kills_${gamemode}`] || 0; + this.deaths = data?.[`deaths_${gamemode}`] || 0; + this.KDR = Divide(data?.kills, data?.deaths); + this.wins = data?.[`wins_${gamemode}`] || 0; + this.losses = data?.[`losses_${gamemode}`] || 0; + this.WLR = Divide(data?.wins, data?.losses); + } +} + +export default SkyWarsMode; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsModeStats.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsModeStats.test.ts new file mode 100644 index 000000000..31833bc11 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsModeStats.test.ts @@ -0,0 +1,86 @@ +import SkyWarsMode from './SkyWarsMode.js'; +import SkyWarsModeStats from './SkyWarsModeStats.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { SkyWarsKitNames } from '../../../Types/Player.js'; + +test('SkyWars (Mode Stats)', () => { + const data = new SkyWarsModeStats({ stats: 'meow' }, 'solo'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsModeStats); + expectTypeOf(data).toEqualTypeOf(); + expect(data.activeKit).toBeDefined(); + expectTypeOf(data.activeKit).toEqualTypeOf(); + expect(data.killstreak).toBeDefined(); + expect(data.killstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.killstreak).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.voidKills).toBeDefined(); + expect(data.voidKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.voidKills).toEqualTypeOf(); + expect(data.meleeKills).toBeDefined(); + expect(data.meleeKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meleeKills).toEqualTypeOf(); + expect(data.bowKills).toBeDefined(); + expect(data.bowKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowKills).toEqualTypeOf(); + expect(data.mobKills).toBeDefined(); + expect(data.mobKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mobKills).toEqualTypeOf(); + expect(data.assists).toBeDefined(); + expect(data.assists).toBeGreaterThanOrEqual(0); + expectTypeOf(data.assists).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.gamesPlayed).toBeDefined(); + expect(data.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gamesPlayed).toEqualTypeOf(); + expect(data.survivedPlayers).toBeDefined(); + expect(data.survivedPlayers).toBeGreaterThanOrEqual(0); + expectTypeOf(data.survivedPlayers).toEqualTypeOf(); + expect(data.chestsOpened).toBeDefined(); + expect(data.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.chestsOpened).toEqualTypeOf(); + expect(data.timePlayed).toBeDefined(); + expect(data.timePlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.timePlayed).toEqualTypeOf(); + expect(data.shard).toBeDefined(); + expect(data.shard).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shard).toEqualTypeOf(); + expect(data.longestBowShot).toBeDefined(); + expect(data.longestBowShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.longestBowShot).toEqualTypeOf(); + expect(data.arrowsShot).toBeDefined(); + expect(data.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arrowsShot).toEqualTypeOf(); + expect(data.arrowsHit).toBeDefined(); + expect(data.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arrowsHit).toEqualTypeOf(); + expect(data.bowAccuracy).toBeDefined(); + expect(data.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowAccuracy).toEqualTypeOf(); + expect(data.fastestWin).toBeDefined(); + expect(data.fastestWin).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fastestWin).toEqualTypeOf(); + expect(data.heads).toBeDefined(); + expect(data.heads).toBeGreaterThanOrEqual(0); + expectTypeOf(data.heads).toEqualTypeOf(); + expect(data.normal).toBeDefined(); + expectTypeOf(data.normal).toEqualTypeOf(); + expect(data.insane).toBeDefined(); + expectTypeOf(data.insane).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsModeStats.ts b/src/Structures/MiniGames/SkyWars/SkyWarsModeStats.ts new file mode 100644 index 000000000..beb42bc6b --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsModeStats.ts @@ -0,0 +1,62 @@ +import Divide from '../../../Utils/Divide.js'; +import SkyWarsMode from './SkyWarsMode.js'; +import type { SkyWarsBaseModes, SkyWarsKitNames } from '../../../Types/Player.js'; + +class SkyWarsModeStats { + activeKit: SkyWarsKitNames; + killstreak: number; + kills: number; + voidKills: number; + meleeKills: number; + bowKills: number; + mobKills: number; + assists: number; + deaths: number; + KDR: number; + wins: number; + losses: number; + WLR: number; + gamesPlayed: number; + survivedPlayers: number; + chestsOpened: number; + timePlayed: number; + shard: number; + longestBowShot: number; + arrowsShot: number; + arrowsHit: number; + bowAccuracy: number; + fastestWin: number; + heads: number; + normal: SkyWarsMode; + insane: SkyWarsMode; + constructor(data: Record, gamemode: SkyWarsBaseModes) { + this.activeKit = data?.[`activeKit_${gamemode?.toUpperCase()}`] || ''; + this.killstreak = data?.[`killstreak_${gamemode}`] || 0; + this.kills = data?.[`kills_${gamemode}`] || 0; + this.voidKills = data?.[`void_kills_${gamemode}`] || 0; + this.meleeKills = data?.[`melee_kills_${gamemode}`] || 0; + this.bowKills = data?.[`bow_kills_${gamemode}`] || 0; + this.mobKills = data?.[`mob_kills_${gamemode}`] || 0; + this.assists = data?.[`assists_${gamemode}`] || 0; + this.deaths = data?.[`deaths_${gamemode}`] || 0; + this.KDR = Divide(data?.kills, data?.deaths); + this.wins = data?.[`wins_${gamemode}`] || 0; + this.losses = data?.[`losses_${gamemode}`] || 0; + this.WLR = Divide(data?.wins, data?.losses); + this.gamesPlayed = data?.[`games_${gamemode}`] || 0; + this.survivedPlayers = data?.[`survived_players_${gamemode}`] || 0; + this.chestsOpened = data?.[`chests_opened_${gamemode}`] || 0; + this.timePlayed = data?.[`time_played_${gamemode}`] || 0; + this.shard = data?.[`shard_${gamemode}`] || 0; + this.longestBowShot = data?.[`longest_bow_shot_${gamemode}`] || 0; + this.arrowsShot = data?.[`arrows_shot_${gamemode}`] || 0; + this.arrowsHit = data?.[`arrows_hit_${gamemode}`] || 0; + this.bowAccuracy = Divide(this.arrowsHit, this.arrowsShot); + this.fastestWin = data?.[`fastest_win_${gamemode}`] || 0; + this.heads = data?.[`heads_${gamemode}`] || 0; + this.insane = new SkyWarsMode(data, `${gamemode}_insane`); + this.normal = new SkyWarsMode(data, `${gamemode}_normal`); + } +} + +export default SkyWarsModeStats; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsPackages.ts b/src/Structures/MiniGames/SkyWars/SkyWarsPackages.ts new file mode 100644 index 000000000..7f1f934fa --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsPackages.ts @@ -0,0 +1,26 @@ +import SkyWarsKits from './SkyWarsKits.js'; + +class SkyWarsPackages { + rawPackages: Record; + cages: any; + kits: SkyWarsKits; + achievements: any; + constructor(data: Record) { + this.rawPackages = data; + this.cages = this.parseCages(); + this.kits = new SkyWarsKits(data); + this.achievements = this.rawPackages + ?.map((pkg: string) => pkg?.match(/^([A-Za-z]+)_?achievement([0-9]?)$/)) + ?.filter((x: any) => x) + ?.map((x: any[]) => x?.slice(1)?.join('')); + } + + parseCages(): string[] { + return this.rawPackages + .map((pkg: string) => pkg?.match(/^cage_([A-Za-z]+)-cage$/)) + .filter((x: any) => x) + .map((x: string[]) => x[1]?.replace(/-[a-z]/g, (x) => (x?.[1] || '').toUpperCase())); + } +} + +export default SkyWarsPackages; diff --git a/src/Structures/MiniGames/SkyWars/Skywars.test.ts b/src/Structures/MiniGames/SkyWars/Skywars.test.ts new file mode 100644 index 000000000..2d9bdf0d5 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/Skywars.test.ts @@ -0,0 +1,142 @@ +import SkyWars from './SkyWars.js'; +import SkyWarsMode from './SkyWarsMode.js'; +import SkyWarsModeStats from './SkyWarsModeStats.js'; +import SkyWarsPackages from './SkyWarsPackages.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { SkyWarsPrestige } from '../../../Types/Player.js'; + +test('SkyWars', () => { + const data = new SkyWars({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWars); + expectTypeOf(data).toEqualTypeOf(); + expect(data.coins).toBeDefined(); + expect(data.coins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.coins).toEqualTypeOf(); + expect(data.souls).toBeDefined(); + expect(data.souls).toBeGreaterThanOrEqual(0); + expectTypeOf(data.souls).toEqualTypeOf(); + expect(data.tokens).toBeDefined(); + expect(data.tokens).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tokens).toEqualTypeOf(); + expect(data.experience).toBeDefined(); + expect(data.experience).toBeGreaterThanOrEqual(0); + expectTypeOf(data.experience).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expect(data.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.levelProgress).toBeDefined(); + expectTypeOf(data.levelProgress).toEqualTypeOf(); + expect(data.levelFormatted).toBeDefined(); + expectTypeOf(data.levelFormatted).toEqualTypeOf(); + expect(data.prestige).toBeDefined(); + expectTypeOf(data.prestige).toEqualTypeOf(); + expect(data.opals).toBeDefined(); + expect(data.opals).toBeGreaterThanOrEqual(0); + expectTypeOf(data.opals).toEqualTypeOf(); + expect(data.avarice).toBeDefined(); + expect(data.avarice).toBeGreaterThanOrEqual(0); + expectTypeOf(data.avarice).toEqualTypeOf(); + expect(data.tenacity).toBeDefined(); + expect(data.tenacity).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tenacity).toEqualTypeOf(); + expect(data.shards).toBeDefined(); + expect(data.shards).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shards).toEqualTypeOf(); + expect(data.angelOfDeathLevel).toBeDefined(); + expect(data.angelOfDeathLevel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.angelOfDeathLevel).toEqualTypeOf(); + expect(data.killstreak).toBeDefined(); + expect(data.killstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.killstreak).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.voidKills).toBeDefined(); + expect(data.voidKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.voidKills).toEqualTypeOf(); + expect(data.meleeKills).toBeDefined(); + expect(data.meleeKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meleeKills).toEqualTypeOf(); + expect(data.bowKills).toBeDefined(); + expect(data.bowKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowKills).toEqualTypeOf(); + expect(data.mobKills).toBeDefined(); + expect(data.mobKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mobKills).toEqualTypeOf(); + expect(data.assists).toBeDefined(); + expect(data.assists).toBeGreaterThanOrEqual(0); + expectTypeOf(data.assists).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.gamesPlayed).toBeDefined(); + expect(data.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gamesPlayed).toEqualTypeOf(); + expect(data.survivedPlayers).toBeDefined(); + expect(data.survivedPlayers).toBeGreaterThanOrEqual(0); + expectTypeOf(data.survivedPlayers).toEqualTypeOf(); + expect(data.chestsOpened).toBeDefined(); + expect(data.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.chestsOpened).toEqualTypeOf(); + expect(data.timePlayed).toBeDefined(); + expect(data.timePlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.timePlayed).toEqualTypeOf(); + expect(data.shard).toBeDefined(); + expect(data.shard).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shard).toEqualTypeOf(); + expect(data.longestBowShot).toBeDefined(); + expect(data.longestBowShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.longestBowShot).toEqualTypeOf(); + expect(data.arrowsShot).toBeDefined(); + expect(data.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arrowsShot).toEqualTypeOf(); + expect(data.arrowsHit).toBeDefined(); + expect(data.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arrowsHit).toEqualTypeOf(); + expect(data.bowAccuracy).toBeDefined(); + expect(data.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowAccuracy).toEqualTypeOf(); + expect(data.fastestWin).toBeDefined(); + expect(data.fastestWin).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fastestWin).toEqualTypeOf(); + expect(data.heads).toBeDefined(); + expect(data.heads).toBeGreaterThanOrEqual(0); + expectTypeOf(data.heads).toEqualTypeOf(); + expect(data.blocksPlaced).toBeDefined(); + expect(data.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksPlaced).toEqualTypeOf(); + expect(data.blocksBroken).toBeDefined(); + expect(data.blocksBroken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksBroken).toEqualTypeOf(); + expect(data.eggThrown).toBeDefined(); + expect(data.eggThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.eggThrown).toEqualTypeOf(); + expect(data.enderpearlsThrown).toBeDefined(); + expect(data.enderpearlsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.enderpearlsThrown).toEqualTypeOf(); + expect(data.solo).toBeDefined(); + expectTypeOf(data.solo).toEqualTypeOf(); + expect(data.team).toBeDefined(); + expectTypeOf(data.team).toEqualTypeOf(); + expect(data.mega).toBeDefined(); + expectTypeOf(data.mega).toEqualTypeOf(); + expect(data.megaDoubles).toBeDefined(); + expectTypeOf(data.megaDoubles).toEqualTypeOf(); + expect(data.lab).toBeDefined(); + expectTypeOf(data.lab).toEqualTypeOf(); + expect(data.packages).toBeDefined(); + expectTypeOf(data.packages).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SmashHeroes/SmashHeoresHero.ts b/src/Structures/MiniGames/SmashHeroes/SmashHeoresHero.ts new file mode 100644 index 000000000..0b50718e5 --- /dev/null +++ b/src/Structures/MiniGames/SmashHeroes/SmashHeoresHero.ts @@ -0,0 +1,31 @@ +import Divide from '../../../Utils/Divide.js'; +import type { SmashHeoresHeros } from '../../../Types/Player.js'; + +class SmashHeoresHero { + name: SmashHeoresHeros; + level: number; + xp: number; + prestige: number; + playedGames: number; + kills: number; + deaths: number; + KDR: number; + wins: number; + losses: number; + WLR: number; + constructor(data: Record, hero: SmashHeoresHeros) { + this.name = hero; + this.level = data?.[`lastLevel_${hero}`] || 0; + this.xp = data?.[`xp_${hero}`] || 0; + this.prestige = data?.[`pg_${hero}`] || 0; + this.playedGames = data?.class_stats?.[hero]?.games || 0; + this.kills = data?.class_stats?.[hero]?.kills || 0; + this.deaths = data?.class_stats?.[hero]?.deaths || 0; + this.KDR = Divide(this.kills, this.deaths); + this.wins = data?.class_stats?.[hero]?.wins || 0; + this.losses = data?.class_stats?.[hero]?.losses || 0; + this.WLR = Divide(this.wins, this.losses); + } +} + +export default SmashHeoresHero; diff --git a/src/Structures/MiniGames/SmashHeroes/SmashHeroes.test.ts b/src/Structures/MiniGames/SmashHeroes/SmashHeroes.test.ts new file mode 100644 index 000000000..64cd57718 --- /dev/null +++ b/src/Structures/MiniGames/SmashHeroes/SmashHeroes.test.ts @@ -0,0 +1,85 @@ +import SmashHeoresHero from './SmashHeoresHero.js'; +import SmashHeroes from './SmashHeroes.js'; +import SmashHeroesMode from './SmashHeroesMode.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { SmashHeoresHeros } from '../../../Types/Player.js'; + +test('SmashHeroes', () => { + const data = new SmashHeroes({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SmashHeroes); + expectTypeOf(data).toEqualTypeOf(); + expect(data.coins).toBeDefined(); + expect(data.coins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.coins).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expect(data.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.winstreak).toBeDefined(); + expect(data.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winstreak).toEqualTypeOf(); + expect(data.playedGames).toBeDefined(); + expect(data.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playedGames).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.smashed).toBeDefined(); + expect(data.smashed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.smashed).toEqualTypeOf(); + expect(data['1v1v1v1']).toBeDefined(); + expectTypeOf(data['1v1v1v1']).toEqualTypeOf(); + expect(data['2v2']).toBeDefined(); + expectTypeOf(data['2v2']).toEqualTypeOf(); + expect(data['2v2v2']).toBeDefined(); + expectTypeOf(data['2v2v2']).toEqualTypeOf(); + expect(data.activeHero).toBeDefined(); + expectTypeOf(data.activeHero).toEqualTypeOf(); + expect(data.theBulk).toBeDefined(); + expectTypeOf(data.theBulk).toEqualTypeOf(); + expect(data.cakeMonster).toBeDefined(); + expectTypeOf(data.cakeMonster).toEqualTypeOf(); + expect(data.generalCluck).toBeDefined(); + expectTypeOf(data.generalCluck).toEqualTypeOf(); + expect(data.botmun).toBeDefined(); + expectTypeOf(data.botmun).toEqualTypeOf(); + expect(data.marauder).toBeDefined(); + expectTypeOf(data.marauder).toEqualTypeOf(); + expect(data.pug).toBeDefined(); + expectTypeOf(data.pug).toEqualTypeOf(); + expect(data.tinman).toBeDefined(); + expectTypeOf(data.tinman).toEqualTypeOf(); + expect(data.spoderman).toBeDefined(); + expectTypeOf(data.spoderman).toEqualTypeOf(); + expect(data.frosty).toBeDefined(); + expectTypeOf(data.frosty).toEqualTypeOf(); + expect(data.sergeantShield).toBeDefined(); + expectTypeOf(data.sergeantShield).toEqualTypeOf(); + expect(data.skullfire).toBeDefined(); + expectTypeOf(data.skullfire).toEqualTypeOf(); + expect(data.goku).toBeDefined(); + expectTypeOf(data.goku).toEqualTypeOf(); + expect(data.sanic).toBeDefined(); + expectTypeOf(data.sanic).toEqualTypeOf(); + expect(data.duskCrawler).toBeDefined(); + expectTypeOf(data.duskCrawler).toEqualTypeOf(); + expect(data.shoopDaWhoop).toBeDefined(); + expectTypeOf(data.shoopDaWhoop).toEqualTypeOf(); + expect(data.greenHood).toBeDefined(); + expectTypeOf(data.greenHood).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SmashHeroes/SmashHeroes.ts b/src/Structures/MiniGames/SmashHeroes/SmashHeroes.ts new file mode 100644 index 000000000..9e5852896 --- /dev/null +++ b/src/Structures/MiniGames/SmashHeroes/SmashHeroes.ts @@ -0,0 +1,73 @@ +import Divide from '../../../Utils/Divide.js'; +import SmashHeoresHero from './SmashHeoresHero.js'; +import SmashHeroesMode from './SmashHeroesMode.js'; +import type { SmashHeoresHeros } from '../../../Types/Player.js'; + +class SmashHeroes { + coins: number; + level: number; + winstreak: number; + playedGames: number; + kills: number; + deaths: number; + KDR: number; + wins: number; + losses: number; + WLR: number; + smashed: number; + '1v1v1v1': SmashHeroesMode; + '2v2': SmashHeroesMode; + '2v2v2': SmashHeroesMode; + activeHero: SmashHeoresHeros | 'None'; + theBulk: SmashHeoresHero; + cakeMonster: SmashHeoresHero; + generalCluck: SmashHeoresHero; + botmun: SmashHeoresHero; + marauder: SmashHeoresHero; + pug: SmashHeoresHero; + tinman: SmashHeoresHero; + spoderman: SmashHeoresHero; + frosty: SmashHeoresHero; + sergeantShield: SmashHeoresHero; + skullfire: SmashHeoresHero; + goku: SmashHeoresHero; + sanic: SmashHeoresHero; + duskCrawler: SmashHeoresHero; + shoopDaWhoop: SmashHeoresHero; + greenHood: SmashHeoresHero; + constructor(data: Record) { + this.coins = data?.coins || data?.tokens || 0; + this.level = data?.smash_level_total || 0; + this.winstreak = data?.win_streak || 0; + this.playedGames = data?.games || 0; + this.kills = data?.kills || 0; + this.deaths = data?.deaths || 0; + this.KDR = Divide(this.kills, this.deaths); + this.wins = data?.wins || 0; + this.losses = data?.losses || 0; + this.WLR = Divide(this.wins, this.losses); + this.smashed = data?.smashed || 0; + this['1v1v1v1'] = new SmashHeroesMode(data, 'normal'); + this['2v2'] = new SmashHeroesMode(data, '2v2'); + this['2v2v2'] = new SmashHeroesMode(data, 'teams'); + this.activeHero = data?.active_class || 'None'; + this.theBulk = new SmashHeoresHero(data, 'THE_BULK'); + this.cakeMonster = new SmashHeoresHero(data, 'CAKE_MONSTER'); + this.generalCluck = new SmashHeoresHero(data, 'GENERAL_CLUCK'); + this.botmun = new SmashHeoresHero(data, 'BOTMUN'); + this.marauder = new SmashHeoresHero(data, 'MARAUDER'); + this.pug = new SmashHeoresHero(data, 'PUG'); + this.tinman = new SmashHeoresHero(data, 'TINMAN'); + this.spoderman = new SmashHeoresHero(data, 'SPODERMAN'); + this.frosty = new SmashHeoresHero(data, 'FROSTY'); + this.sergeantShield = new SmashHeoresHero(data, 'SERGEANT_SHIELD'); + this.skullfire = new SmashHeoresHero(data, 'SKULLFIRE'); + this.goku = new SmashHeoresHero(data, 'GOKU'); + this.sanic = new SmashHeoresHero(data, 'SANIC'); + this.duskCrawler = new SmashHeoresHero(data, 'DUSK_CRAWLER'); + this.shoopDaWhoop = new SmashHeoresHero(data, 'SHOOP_DA_WHOOP'); + this.greenHood = new SmashHeoresHero(data, 'GREEN_HOOD'); + } +} + +export default SmashHeroes; diff --git a/src/Structures/MiniGames/SmashHeroes/SmashHeroesMode.ts b/src/Structures/MiniGames/SmashHeroes/SmashHeroesMode.ts new file mode 100644 index 000000000..1943cdaea --- /dev/null +++ b/src/Structures/MiniGames/SmashHeroes/SmashHeroesMode.ts @@ -0,0 +1,21 @@ +import Divide from '../../../Utils/Divide.js'; +import type { SmashHeoresModes } from '../../../Types/Player.js'; + +class SmashHeroesMode { + kills: number; + deaths: number; + KDR: number; + wins: number; + losses: number; + WLR: number; + constructor(data: Record, mode: SmashHeoresModes) { + this.kills = data?.[`kills_${mode}`] || 0; + this.deaths = data?.[`deaths_${mode}`] || 0; + this.KDR = Divide(this.kills, this.deaths); + this.wins = data?.[`wins_${mode}`] || 0; + this.losses = data?.[`losses_${mode}`] || 0; + this.WLR = Divide(this.wins, this.losses); + } +} + +export default SmashHeroesMode; diff --git a/src/Structures/MiniGames/SpeedUHC/SpeedUHC.test.ts b/src/Structures/MiniGames/SpeedUHC/SpeedUHC.test.ts new file mode 100644 index 000000000..fac408516 --- /dev/null +++ b/src/Structures/MiniGames/SpeedUHC/SpeedUHC.test.ts @@ -0,0 +1,67 @@ +import SpeedUHC from './SpeedUHC.js'; +import SpeedUHCMode from './SpeedUHCMode.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SpeedUHC', () => { + const data = new SpeedUHC({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SpeedUHC); + expectTypeOf(data).toEqualTypeOf(); + expect(data.coins).toBeDefined(); + expect(data.coins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.coins).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.playedGames).toBeDefined(); + expect(data.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playedGames).toEqualTypeOf(); + expect(data.winstreak).toBeDefined(); + expect(data.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winstreak).toEqualTypeOf(); + expect(data.killstreak).toBeDefined(); + expect(data.killstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.killstreak).toEqualTypeOf(); + expect(data.blocksBroken).toBeDefined(); + expect(data.blocksBroken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksBroken).toEqualTypeOf(); + expect(data.blocksPlaced).toBeDefined(); + expect(data.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksPlaced).toEqualTypeOf(); + expect(data.quits).toBeDefined(); + expect(data.quits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.quits).toEqualTypeOf(); + expect(data.itemsEnchanted).toBeDefined(); + expect(data.itemsEnchanted).toBeGreaterThanOrEqual(0); + expectTypeOf(data.itemsEnchanted).toEqualTypeOf(); + expect(data.assists).toBeDefined(); + expect(data.assists).toBeGreaterThanOrEqual(0); + expectTypeOf(data.assists).toEqualTypeOf(); + expect(data.solo).toBeDefined(); + expectTypeOf(data.solo).toEqualTypeOf(); + expect(data.soloNormal).toBeDefined(); + expectTypeOf(data.soloNormal).toEqualTypeOf(); + expect(data.soloInsane).toBeDefined(); + expectTypeOf(data.soloInsane).toEqualTypeOf(); + expect(data.team).toBeDefined(); + expectTypeOf(data.team).toEqualTypeOf(); + expect(data.teamNormal).toBeDefined(); + expectTypeOf(data.teamNormal).toEqualTypeOf(); + expect(data.teamInsane).toBeDefined(); + expectTypeOf(data.teamInsane).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SpeedUHC/SpeedUHC.ts b/src/Structures/MiniGames/SpeedUHC/SpeedUHC.ts new file mode 100644 index 000000000..dcc5ede1e --- /dev/null +++ b/src/Structures/MiniGames/SpeedUHC/SpeedUHC.ts @@ -0,0 +1,51 @@ +import Divide from '../../../Utils/Divide.js'; +import SpeedUHCMode from './SpeedUHCMode.js'; + +class SpeedUHC { + coins: number; + kills: number; + deaths: number; + KDR: number; + wins: number; + losses: number; + WLR: number; + playedGames: number; + winstreak: number; + killstreak: number; + blocksBroken: number; + blocksPlaced: number; + quits: number; + itemsEnchanted: number; + assists: number; + solo: SpeedUHCMode; + soloNormal: SpeedUHCMode; + soloInsane: SpeedUHCMode; + team: SpeedUHCMode; + teamNormal: SpeedUHCMode; + teamInsane: SpeedUHCMode; + constructor(data: Record) { + this.coins = data?.coins || data?.tokens || 0; + this.kills = data?.kills || 0; + this.deaths = data?.deaths || 0; + this.KDR = Divide(this.kills, this.deaths); + this.wins = data?.wins || 0; + this.losses = data?.losses || 0; + this.WLR = Divide(this.wins, this.losses); + this.playedGames = data?.games || 0; + this.winstreak = data?.win_streak || 0; + this.killstreak = data?.killstreak || 0; + this.blocksBroken = data?.blocks_broken || 0; + this.blocksPlaced = data?.blocks_placed || 0; + this.quits = data?.quits || 0; + this.itemsEnchanted = data?.items_enchanted || 0; + this.assists = data?.assists || 0; + this.solo = new SpeedUHCMode(data, 'solo'); + this.soloNormal = new SpeedUHCMode(data, 'solo_normal'); + this.soloInsane = new SpeedUHCMode(data, 'solo_insane'); + this.team = new SpeedUHCMode(data, 'team'); + this.teamNormal = new SpeedUHCMode(data, 'team_normal'); + this.teamInsane = new SpeedUHCMode(data, 'team_insane'); + } +} + +export default SpeedUHC; diff --git a/src/Structures/MiniGames/SpeedUHC/SpeedUHCMode.test.ts b/src/Structures/MiniGames/SpeedUHC/SpeedUHCMode.test.ts new file mode 100644 index 000000000..a3da313f5 --- /dev/null +++ b/src/Structures/MiniGames/SpeedUHC/SpeedUHCMode.test.ts @@ -0,0 +1,39 @@ +import SpeedUHCMode from './SpeedUHCMode.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SpeedUHC', () => { + const data = new SpeedUHCMode({ stats: 'meow' }, 'solo'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SpeedUHCMode); + expectTypeOf(data).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.playedGames).toBeDefined(); + expect(data.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playedGames).toEqualTypeOf(); + expect(data.winstreak).toBeDefined(); + expect(data.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winstreak).toEqualTypeOf(); + expect(data.killStreak).toBeDefined(); + expect(data.killStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.killStreak).toEqualTypeOf(); + expect(data.assists).toBeDefined(); + expect(data.assists).toBeGreaterThanOrEqual(0); + expectTypeOf(data.assists).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SpeedUHC/SpeedUHCMode.ts b/src/Structures/MiniGames/SpeedUHC/SpeedUHCMode.ts new file mode 100644 index 000000000..e9cefab56 --- /dev/null +++ b/src/Structures/MiniGames/SpeedUHC/SpeedUHCMode.ts @@ -0,0 +1,29 @@ +import Divide from '../../../Utils/Divide.js'; +import type { SpeedUHCModes } from '../../../Types/Player.js'; + +class SpeedUHCMode { + kills: number; + deaths: number; + KDR: number; + wins: number; + losses: number; + WLR: number; + playedGames: number; + winstreak: number; + killStreak: number; + assists: number; + constructor(data: Record, mode: SpeedUHCModes) { + this.kills = data?.[`kills_${mode}`] || 0; + this.deaths = data?.[`deaths_${mode}`] || 0; + this.KDR = Divide(this.kills, this.deaths); + this.wins = data?.[`wins_${mode}`] || 0; + this.losses = data?.[`losses_${mode}`] || 0; + this.WLR = Divide(this.wins, this.losses); + this.playedGames = data?.[`games_${mode}`] || 0; + this.winstreak = data?.[`win_streak_${mode}`] || 0; + this.killStreak = data?.[`killstreak_${mode}`] || 0; + this.assists = data?.[`assists_${mode}`] || 0; + } +} + +export default SpeedUHCMode; diff --git a/src/Structures/MiniGames/TNTGames/BowSpleef.test.ts b/src/Structures/MiniGames/TNTGames/BowSpleef.test.ts new file mode 100644 index 000000000..cac1dfb9d --- /dev/null +++ b/src/Structures/MiniGames/TNTGames/BowSpleef.test.ts @@ -0,0 +1,21 @@ +import BowSpleef from './BowSpleef.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { ColorString } from '../../../Types/Color.js'; + +test('BowSpleef', () => { + const data = new BowSpleef({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BowSpleef); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.tags).toBeDefined(); + expect(data.tags).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tags).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.prefixColor).toBeDefined(); + expectTypeOf(data.prefixColor).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/TNTGames/BowSpleef.ts b/src/Structures/MiniGames/TNTGames/BowSpleef.ts new file mode 100644 index 000000000..d09b35423 --- /dev/null +++ b/src/Structures/MiniGames/TNTGames/BowSpleef.ts @@ -0,0 +1,16 @@ +import type { ColorString } from '../../../Types/Color.js'; + +class BowSpleef { + wins: number; + tags: number; + deaths: number; + prefixColor: ColorString | 'Rainbow'; + constructor(data: Record) { + this.wins = data?.wins_bowspleef || 0; + this.tags = data?.tags_bowspleef || 0; + this.deaths = data?.deaths_bowspleef || 0; + this.prefixColor = data?.prefix_bowspleef || ''; + } +} + +export default BowSpleef; diff --git a/src/Structures/MiniGames/TNTGames/PVPRun.test.ts b/src/Structures/MiniGames/TNTGames/PVPRun.test.ts new file mode 100644 index 000000000..d0e6e7b9e --- /dev/null +++ b/src/Structures/MiniGames/TNTGames/PVPRun.test.ts @@ -0,0 +1,39 @@ +import PVPRun from './PVPRun.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { ColorString } from '../../../Types/Color.js'; + +test('PVPRun', () => { + const data = new PVPRun({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PVPRun); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.bestTime).toBeDefined(); + expect(data.bestTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bestTime).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.regeneration).toBeDefined(); + expect(data.regeneration).toBeGreaterThanOrEqual(0); + expectTypeOf(data.regeneration).toEqualTypeOf(); + expect(data.notoriety).toBeDefined(); + expect(data.notoriety).toBeGreaterThanOrEqual(0); + expectTypeOf(data.notoriety).toEqualTypeOf(); + expect(data.fortitude).toBeDefined(); + expect(data.fortitude).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fortitude).toEqualTypeOf(); + expect(data.doubleJumps).toBeDefined(); + expect(data.doubleJumps).toBeGreaterThanOrEqual(0); + expectTypeOf(data.doubleJumps).toEqualTypeOf(); + expect(data.prefixColor).toBeDefined(); + expectTypeOf(data.prefixColor).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/TNTGames/PVPRun.ts b/src/Structures/MiniGames/TNTGames/PVPRun.ts new file mode 100644 index 000000000..2933c7ba1 --- /dev/null +++ b/src/Structures/MiniGames/TNTGames/PVPRun.ts @@ -0,0 +1,29 @@ +import Divide from '../../../Utils/Divide.js'; +import type { ColorString } from '../../../Types/Color.js'; + +class PVPRun { + wins: number; + bestTime: number; + kills: number; + deaths: number; + KDR: number; + regeneration: number; + notoriety: number; + fortitude: number; + doubleJumps: number; + prefixColor: ColorString | 'Rainbow'; + constructor(data: Record) { + this.wins = data?.wins_pvprun || 0; + this.bestTime = data?.record_pvprun || 0; + this.kills = data?.kills_pvprun || 0; + this.deaths = data?.deaths_pvprun || 0; + this.KDR = Divide(this.kills, this.deaths); + this.regeneration = data?.new_pvprun_regeneration || 0; + this.notoriety = data?.new_pvprun_notoriety || 0; + this.fortitude = data?.new_pvprun_fortitude || 0; + this.doubleJumps = data?.new_pvprun_double_jumps || 0; + this.prefixColor = data?.prefix_pvprun || ''; + } +} + +export default PVPRun; diff --git a/src/Structures/MiniGames/TNTGames/TNTGames.test.ts b/src/Structures/MiniGames/TNTGames/TNTGames.test.ts new file mode 100644 index 000000000..5c9e2e229 --- /dev/null +++ b/src/Structures/MiniGames/TNTGames/TNTGames.test.ts @@ -0,0 +1,33 @@ +import BowSpleef from './BowSpleef.js'; +import PVPRun from './PVPRun.js'; +import TNTGames from './TNTGames.js'; +import TNTRun from './TNTRun.js'; +import TNTTag from './TNTTag.js'; +import TNTWizards from './TNTWizards.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('TNTGames', () => { + const data = new TNTGames({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(TNTGames); + expectTypeOf(data).toEqualTypeOf(); + expect(data.coins).toBeDefined(); + expect(data.coins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.coins).toEqualTypeOf(); + expect(data.winstreak).toBeDefined(); + expect(data.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winstreak).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.tntrun).toBeDefined(); + expectTypeOf(data.tntrun).toEqualTypeOf(); + expect(data.pvpRun).toBeDefined(); + expectTypeOf(data.pvpRun).toEqualTypeOf(); + expect(data.bowSpleef).toBeDefined(); + expectTypeOf(data.bowSpleef).toEqualTypeOf(); + expect(data.tnttag).toBeDefined(); + expectTypeOf(data.tnttag).toEqualTypeOf(); + expect(data.wizards).toBeDefined(); + expectTypeOf(data.wizards).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/TNTGames/TNTGames.ts b/src/Structures/MiniGames/TNTGames/TNTGames.ts new file mode 100644 index 000000000..babfdb699 --- /dev/null +++ b/src/Structures/MiniGames/TNTGames/TNTGames.ts @@ -0,0 +1,28 @@ +import BowSpleef from './BowSpleef.js'; +import PVPRun from './PVPRun.js'; +import TNTRun from './TNTRun.js'; +import TNTTag from './TNTTag.js'; +import TNTWizards from './TNTWizards.js'; + +class TNTGames { + coins: number; + winstreak: number; + wins: number; + tntrun: TNTRun; + pvpRun: PVPRun; + bowSpleef: BowSpleef; + tnttag: TNTTag; + wizards: TNTWizards; + constructor(data: Record) { + this.coins = data?.coins || data?.tokens || 0; + this.winstreak = data?.winstreak || 0; + this.wins = data?.wins || 0; + this.tntrun = new TNTRun(data); + this.pvpRun = new PVPRun(data); + this.bowSpleef = new BowSpleef(data); + this.tnttag = new TNTTag(data); + this.wizards = new TNTWizards(data); + } +} + +export default TNTGames; diff --git a/src/Structures/MiniGames/TNTGames/TNTRun.test.ts b/src/Structures/MiniGames/TNTGames/TNTRun.test.ts new file mode 100644 index 000000000..1e6cbfb29 --- /dev/null +++ b/src/Structures/MiniGames/TNTGames/TNTRun.test.ts @@ -0,0 +1,30 @@ +import TNTRun from './TNTRun.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { ColorString } from '../../../Types/Color.js'; + +test('TNTRun', () => { + const data = new TNTRun({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(TNTRun); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.bestTime).toBeDefined(); + expect(data.bestTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bestTime).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.slownessPotions).toBeDefined(); + expect(data.slownessPotions).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slownessPotions).toEqualTypeOf(); + expect(data.speedPotions).toBeDefined(); + expect(data.speedPotions).toBeGreaterThanOrEqual(0); + expectTypeOf(data.speedPotions).toEqualTypeOf(); + expect(data.doubleJumps).toBeDefined(); + expect(data.doubleJumps).toBeGreaterThanOrEqual(0); + expectTypeOf(data.doubleJumps).toEqualTypeOf(); + expect(data.prefix).toBeDefined(); + expectTypeOf(data.prefix).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/TNTGames/TNTRun.ts b/src/Structures/MiniGames/TNTGames/TNTRun.ts new file mode 100644 index 000000000..e48ea3332 --- /dev/null +++ b/src/Structures/MiniGames/TNTGames/TNTRun.ts @@ -0,0 +1,22 @@ +import type { ColorString } from '../../../Types/Color.js'; + +class TNTRun { + wins: number; + bestTime: number; + deaths: number; + slownessPotions: number; + speedPotions: number; + doubleJumps: number; + prefix: ColorString | 'Rainbow'; + constructor(data: Record) { + this.wins = data?.wins_tntrun || 0; + this.bestTime = data?.record_tntrun || 0; + this.deaths = data?.deaths_tntrun || 0; + this.slownessPotions = data?.new_tntrun_slowness_potions || 0; + this.speedPotions = data?.new_tntrun_speed_potions || 0; + this.doubleJumps = data?.new_tntrun_double_jumps || 0; + this.prefix = data?.prefix_tntrun || ''; + } +} + +export default TNTRun; diff --git a/src/Structures/MiniGames/TNTGames/TNTTag.test.ts b/src/Structures/MiniGames/TNTGames/TNTTag.test.ts new file mode 100644 index 000000000..1f8080e79 --- /dev/null +++ b/src/Structures/MiniGames/TNTGames/TNTTag.test.ts @@ -0,0 +1,36 @@ +import TNTTag from './TNTTag.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { ColorString } from '../../../Types/Color.js'; + +test('TNTTag', () => { + const data = new TNTTag({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(TNTTag); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.speed).toBeDefined(); + expect(data.speed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.speed).toEqualTypeOf(); + expect(data.blastProtection).toBeDefined(); + expect(data.blastProtection).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blastProtection).toEqualTypeOf(); + expect(data.speedItUp).toBeDefined(); + expect(data.speedItUp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.speedItUp).toEqualTypeOf(); + expect(data.slowItDown).toBeDefined(); + expect(data.slowItDown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slowItDown).toEqualTypeOf(); + expect(data.prefix).toBeDefined(); + expectTypeOf(data.prefix).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/TNTGames/TNTTag.ts b/src/Structures/MiniGames/TNTGames/TNTTag.ts new file mode 100644 index 000000000..531d80858 --- /dev/null +++ b/src/Structures/MiniGames/TNTGames/TNTTag.ts @@ -0,0 +1,27 @@ +import Divide from '../../../Utils/Divide.js'; +import type { ColorString } from '../../../Types/Color.js'; + +class TNTTag { + wins: number; + kills: number; + deaths: number; + KDR: number; + speed: number; + blastProtection: number; + speedItUp: number; + slowItDown: number; + prefix: ColorString | 'Rainbow'; + constructor(data: Record) { + this.wins = data?.wins_tntag || 0; + this.kills = data?.kills_tntag || 0; + this.deaths = data?.deaths_tntag || 0; + this.KDR = Divide(this.kills, this.deaths); + this.speed = data?.new_tntag_speedy || 0; + this.blastProtection = data?.tag_blastprotection || 0; + this.speedItUp = data?.tag_speeditup || 0; + this.slowItDown = data?.tag_slowitdown || 0; + this.prefix = data?.prefix_tntag || ''; + } +} + +export default TNTTag; diff --git a/src/Structures/MiniGames/TNTGames/TNTWizards.test.ts b/src/Structures/MiniGames/TNTGames/TNTWizards.test.ts new file mode 100644 index 000000000..a15f70e50 --- /dev/null +++ b/src/Structures/MiniGames/TNTGames/TNTWizards.test.ts @@ -0,0 +1,36 @@ +import TNTWizards from './TNTWizards.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { ColorString } from '../../../Types/Color.js'; + +test('TNTWizards', () => { + const data = new TNTWizards({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(TNTWizards); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.assists).toBeDefined(); + expect(data.assists).toBeGreaterThanOrEqual(0); + expectTypeOf(data.assists).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.points).toBeDefined(); + expect(data.points).toBeGreaterThanOrEqual(0); + expectTypeOf(data.points).toEqualTypeOf(); + expect(data.kineticHealing).toBeDefined(); + expect(data.kineticHealing).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kineticHealing).toEqualTypeOf(); + expect(data.airTime).toBeDefined(); + expect(data.airTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.airTime).toEqualTypeOf(); + expect(data.prefix).toBeDefined(); + expectTypeOf(data.prefix).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/TNTGames/TNTWizards.ts b/src/Structures/MiniGames/TNTGames/TNTWizards.ts new file mode 100644 index 000000000..ef23348de --- /dev/null +++ b/src/Structures/MiniGames/TNTGames/TNTWizards.ts @@ -0,0 +1,27 @@ +import Divide from '../../../Utils/Divide.js'; +import type { ColorString } from '../../../Types/Color.js'; + +class TNTWizards { + wins: number; + kills: number; + assists: number; + deaths: number; + KDR: number; + points: number; + kineticHealing: number; + airTime: number; + prefix: ColorString | 'Rainbow'; + constructor(data: Record) { + this.wins = data?.wins_capture || 0; + this.kills = data?.kills_capture || 0; + this.assists = data?.assists_capture || 0; + this.deaths = data?.deaths_capture || 0; + this.KDR = Divide(this.kills, this.deaths); + this.points = data?.points_capture || 0; + this.kineticHealing = data?.kinetic_healing_capture || 0; + this.airTime = data?.air_time_capture || 0; + this.prefix = data?.prefix_capture || ''; + } +} + +export default TNTWizards; diff --git a/src/Structures/MiniGames/TurboKartRacers/TurboKartRacers.test.ts b/src/Structures/MiniGames/TurboKartRacers/TurboKartRacers.test.ts new file mode 100644 index 000000000..9cc630285 --- /dev/null +++ b/src/Structures/MiniGames/TurboKartRacers/TurboKartRacers.test.ts @@ -0,0 +1,58 @@ +import TurboKartRacers from './TurboKartRacers.js'; +import TurboKartRacersMap from './TurboKartRacersMap.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { TurboKartRacersHorn } from '../../../Types/Player.js'; + +test('TurboKartRacers', () => { + const data = new TurboKartRacers({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(TurboKartRacers); + expectTypeOf(data).toEqualTypeOf(); + expect(data.coins).toBeDefined(); + expect(data.coins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.coins).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.completedLaps).toBeDefined(); + expect(data.completedLaps).toBeGreaterThanOrEqual(0); + expectTypeOf(data.completedLaps).toEqualTypeOf(); + expect(data.bronzeTrophies).toBeDefined(); + expect(data.bronzeTrophies).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bronzeTrophies).toEqualTypeOf(); + expect(data.silverTrophies).toBeDefined(); + expect(data.silverTrophies).toBeGreaterThanOrEqual(0); + expectTypeOf(data.silverTrophies).toEqualTypeOf(); + expect(data.goldTrophies).toBeDefined(); + expect(data.goldTrophies).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goldTrophies).toEqualTypeOf(); + expect(data.boxPickups).toBeDefined(); + expect(data.boxPickups).toBeGreaterThanOrEqual(0); + expectTypeOf(data.boxPickups).toEqualTypeOf(); + expect(data.horn).toBeDefined(); + expectTypeOf(data.horn).toEqualTypeOf(); + expect(data.retro).toBeDefined(); + expectTypeOf(data.retro).toEqualTypeOf(); + expect(data.hypixelgp).toBeDefined(); + expectTypeOf(data.hypixelgp).toEqualTypeOf(); + expect(data.olympus).toBeDefined(); + expectTypeOf(data.olympus).toEqualTypeOf(); + expect(data.junglerush).toBeDefined(); + expectTypeOf(data.junglerush).toEqualTypeOf(); + expect(data.canyon).toBeDefined(); + expectTypeOf(data.canyon).toEqualTypeOf(); + expect(data.bananaHitsReceived).toBeDefined(); + expect(data.bananaHitsReceived).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bananaHitsReceived).toEqualTypeOf(); + expect(data.bananaHitsSent).toBeDefined(); + expect(data.bananaHitsSent).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bananaHitsSent).toEqualTypeOf(); + expect(data.blueTorpedoHit).toBeDefined(); + expect(data.blueTorpedoHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blueTorpedoHit).toEqualTypeOf(); + expect(data.grandPrix).toBeDefined(); + expectTypeOf(data.grandPrix).toEqualTypeOf(); + expect(data.grandPrixTokens).toBeDefined(); + expect(data.grandPrixTokens).toBeGreaterThanOrEqual(0); + expectTypeOf(data.grandPrixTokens).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/TurboKartRacers/TurboKartRacers.ts b/src/Structures/MiniGames/TurboKartRacers/TurboKartRacers.ts new file mode 100644 index 000000000..f64de6d92 --- /dev/null +++ b/src/Structures/MiniGames/TurboKartRacers/TurboKartRacers.ts @@ -0,0 +1,45 @@ +import TurboKartRacersMap from './TurboKartRacersMap.js'; +import type { TurboKartRacersHorn } from '../../../Types/Player.js'; + +class TurboKartRacers { + coins: number; + wins: number; + completedLaps: number; + bronzeTrophies: number; + silverTrophies: number; + goldTrophies: number; + boxPickups: number; + horn: TurboKartRacersHorn; + retro: TurboKartRacersMap; + hypixelgp: TurboKartRacersMap; + olympus: TurboKartRacersMap; + junglerush: TurboKartRacersMap; + canyon: TurboKartRacersMap; + bananaHitsReceived: number; + bananaHitsSent: number; + blueTorpedoHit: number; + grandPrix: boolean; + grandPrixTokens: number; + constructor(data: Record) { + this.coins = data?.coins || data?.tokens || 0; + this.wins = data?.wins || 0; + this.completedLaps = data?.laps_completed || 0; + this.bronzeTrophies = data?.bronze_trophy || 0; + this.silverTrophies = data?.silver_trophy || 0; + this.goldTrophies = data?.gold_trophy || 0; + this.boxPickups = data?.box_pickups || 0; + this.horn = data?.horn || 'DEFAULT'; + this.retro = new TurboKartRacersMap(data, 'retro'); + this.hypixelgp = new TurboKartRacersMap(data, 'hypixelgp'); + this.olympus = new TurboKartRacersMap(data, 'olympus'); + this.junglerush = new TurboKartRacersMap(data, 'junglerush'); + this.canyon = new TurboKartRacersMap(data, 'canyon'); + this.bananaHitsReceived = data?.banana_hits_received || 0; + this.bananaHitsSent = data?.banana_hits_sent || 0; + this.blueTorpedoHit = data?.blue_torpedo_hit || 0; + this.grandPrix = data?.grand_prix || 'false'; + this.grandPrixTokens = data?.grand_prix_tokens || 0; + } +} + +export default TurboKartRacers; diff --git a/src/Structures/MiniGames/TurboKartRacers/TurboKartRacersMap.test.ts b/src/Structures/MiniGames/TurboKartRacers/TurboKartRacersMap.test.ts new file mode 100644 index 000000000..534c4dc26 --- /dev/null +++ b/src/Structures/MiniGames/TurboKartRacers/TurboKartRacersMap.test.ts @@ -0,0 +1,27 @@ +import TurboKartRacersMap from './TurboKartRacersMap.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { TurboKartRacersMaps } from '../../../Types/Player.js'; + +test('TurboKartRacers', () => { + const data = new TurboKartRacersMap({ stats: 'meow' }, 'retro'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(TurboKartRacersMap); + expectTypeOf(data).toEqualTypeOf(); + expect(data.map).toBeDefined(); + expectTypeOf(data.map).toEqualTypeOf(); + expect(data.plays).toBeDefined(); + expect(data.plays).toBeGreaterThanOrEqual(0); + expectTypeOf(data.plays).toEqualTypeOf(); + expect(data.boxPickups).toBeDefined(); + expect(data.boxPickups).toBeGreaterThanOrEqual(0); + expectTypeOf(data.boxPickups).toEqualTypeOf(); + expect(data.bronzeTrophies).toBeDefined(); + expect(data.bronzeTrophies).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bronzeTrophies).toEqualTypeOf(); + expect(data.silverTrophies).toBeDefined(); + expect(data.silverTrophies).toBeGreaterThanOrEqual(0); + expectTypeOf(data.silverTrophies).toEqualTypeOf(); + expect(data.goldTrophies).toBeDefined(); + expect(data.goldTrophies).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goldTrophies).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/TurboKartRacers/TurboKartRacersMap.ts b/src/Structures/MiniGames/TurboKartRacers/TurboKartRacersMap.ts new file mode 100644 index 000000000..b33f6cb4f --- /dev/null +++ b/src/Structures/MiniGames/TurboKartRacers/TurboKartRacersMap.ts @@ -0,0 +1,20 @@ +import type { TurboKartRacersMaps } from '../../../Types/Player.js'; + +class TurboKartRacersMap { + map: TurboKartRacersMaps; + plays: number; + boxPickups: number; + bronzeTrophies: number; + silverTrophies: number; + goldTrophies: number; + constructor(data: Record, mapName: TurboKartRacersMaps) { + this.map = mapName; + this.plays = data?.[`${mapName}_plays`] || 0; + this.boxPickups = data?.[`box_pickups_${mapName}`] || 0; + this.bronzeTrophies = data?.[`bronze_trophy_${mapName}`] || 0; + this.silverTrophies = data?.[`silver_trophy_${mapName}`] || 0; + this.goldTrophies = data?.[`gold_trophy_${mapName}`] || 0; + } +} + +export default TurboKartRacersMap; diff --git a/src/Structures/MiniGames/UHC/UHC.test.ts b/src/Structures/MiniGames/UHC/UHC.test.ts new file mode 100644 index 000000000..7c1dcf671 --- /dev/null +++ b/src/Structures/MiniGames/UHC/UHC.test.ts @@ -0,0 +1,57 @@ +import UHC from './UHC.js'; +import UHCGamemode from './UHCGamemode.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { UHCKits } from '../../../Types/Player.js'; + +test('UHC', () => { + const data = new UHC({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(UHC); + expectTypeOf(data).toEqualTypeOf(); + expect(data.coins).toBeDefined(); + expect(data.coins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.coins).toEqualTypeOf(); + expect(data.score).toBeDefined(); + expect(data.score).toBeGreaterThanOrEqual(0); + expectTypeOf(data.score).toEqualTypeOf(); + expect(data.kit).toBeDefined(); + expectTypeOf(data.kit).toEqualTypeOf(); + expect(data.solo).toBeDefined(); + expectTypeOf(data.solo).toEqualTypeOf(); + expect(data.team).toBeDefined(); + expectTypeOf(data.team).toEqualTypeOf(); + expect(data.redVsBlue).toBeDefined(); + expectTypeOf(data.redVsBlue).toEqualTypeOf(); + expect(data.noDiamond).toBeDefined(); + expectTypeOf(data.noDiamond).toEqualTypeOf(); + expect(data.brawl).toBeDefined(); + expectTypeOf(data.brawl).toEqualTypeOf(); + expect(data.soloBrawl).toBeDefined(); + expectTypeOf(data.soloBrawl).toEqualTypeOf(); + expect(data.duoBrawl).toBeDefined(); + expectTypeOf(data.duoBrawl).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.headsEaten).toBeDefined(); + expect(data.headsEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.headsEaten).toEqualTypeOf(); + expect(data.ultimatesCrafted).toBeDefined(); + expect(data.ultimatesCrafted).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ultimatesCrafted).toEqualTypeOf(); + expect(data.extraUltimatesCrafted).toBeDefined(); + expect(data.extraUltimatesCrafted).toBeGreaterThanOrEqual(0); + expectTypeOf(data.extraUltimatesCrafted).toEqualTypeOf(); + expect(data.starLevel).toBeDefined(); + expect(data.starLevel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.starLevel).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/UHC/UHC.ts b/src/Structures/MiniGames/UHC/UHC.ts new file mode 100644 index 000000000..2da7f95eb --- /dev/null +++ b/src/Structures/MiniGames/UHC/UHC.ts @@ -0,0 +1,96 @@ +import Divide from '../../../Utils/Divide.js'; +import UHCGamemode from './UHCGamemode.js'; +import type { UHCKits } from '../../../Types/Player.js'; + +function getStarLevel(kills: number, wins: number): number { + const sum = kills + wins * 10; + let starLevel = 1; + const sums = [0, 1, 6, 21, 46, 96, 171, 271, 521, 1021, 1321, 1621, 1921, 2221, 2521, Infinity]; + starLevel += sums.map((x) => x * 10 - sum).findIndex((x) => 0 < x) - 1; + return starLevel; +} + +class UHC { + coins: number; + score: number; + kit: UHCKits | 'None'; + solo: UHCGamemode; + team: UHCGamemode; + redVsBlue: UHCGamemode; + noDiamond: UHCGamemode; + brawl: UHCGamemode; + soloBrawl: UHCGamemode; + duoBrawl: UHCGamemode; + wins: number; + kills: number; + deaths: number; + KDR: number; + headsEaten: number; + ultimatesCrafted: number; + extraUltimatesCrafted: number; + starLevel: number; + constructor(data: Record) { + this.coins = data?.coins || data?.tokens || 0; + this.score = data?.score || 0; + this.kit = data?.equippedKit || 'None'; + this.solo = new UHCGamemode(data, 'solo'); + this.team = new UHCGamemode(data); + this.redVsBlue = new UHCGamemode(data, 'red_vs_blue'); + this.noDiamond = new UHCGamemode(data, 'no_diamonds'); + this.brawl = new UHCGamemode(data, 'brawl'); + this.soloBrawl = new UHCGamemode(data, 'solo_brawl'); + this.duoBrawl = new UHCGamemode(data, 'duo_brawl'); + this.wins = + this.solo.wins + + this.team.wins + + this.redVsBlue.wins + + this.noDiamond.wins + + this.brawl.wins + + this.soloBrawl.wins + + this.duoBrawl.wins; + this.kills = + this.solo.kills + + this.team.kills + + this.redVsBlue.kills + + this.noDiamond.kills + + this.brawl.kills + + this.soloBrawl.kills + + this.duoBrawl.kills; + this.deaths = + this.solo.deaths + + this.team.deaths + + this.redVsBlue.deaths + + this.noDiamond.deaths + + this.brawl.deaths + + this.soloBrawl.deaths + + this.duoBrawl.deaths; + this.KDR = Divide(this.kills, this.deaths); + this.headsEaten = + this.solo.headsEaten + + this.team.headsEaten + + this.redVsBlue.headsEaten + + this.noDiamond.headsEaten + + this.brawl.headsEaten + + this.soloBrawl.headsEaten + + this.duoBrawl.headsEaten; + this.ultimatesCrafted = + this.solo.ultimatesCrafted + + this.team.ultimatesCrafted + + this.redVsBlue.ultimatesCrafted + + this.noDiamond.ultimatesCrafted + + this.brawl.ultimatesCrafted + + this.soloBrawl.ultimatesCrafted + + this.duoBrawl.ultimatesCrafted; + this.extraUltimatesCrafted = + this.solo.extraUltimatesCrafted + + this.team.extraUltimatesCrafted + + this.redVsBlue.extraUltimatesCrafted + + this.noDiamond.extraUltimatesCrafted + + this.brawl.extraUltimatesCrafted + + this.soloBrawl.extraUltimatesCrafted + + this.duoBrawl.extraUltimatesCrafted; + this.starLevel = getStarLevel(this.kills, this.wins); + } +} + +export default UHC; diff --git a/src/Structures/MiniGames/UHC/UHCGamemode.test.ts b/src/Structures/MiniGames/UHC/UHCGamemode.test.ts new file mode 100644 index 000000000..bd98fd274 --- /dev/null +++ b/src/Structures/MiniGames/UHC/UHCGamemode.test.ts @@ -0,0 +1,27 @@ +import UHCGamemode from './UHCGamemode.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('UHCGamemode', () => { + const data = new UHCGamemode({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(UHCGamemode); + expectTypeOf(data).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.headsEaten).toBeDefined(); + expect(data.headsEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.headsEaten).toEqualTypeOf(); + expect(data.ultimatesCrafted).toBeDefined(); + expect(data.ultimatesCrafted).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ultimatesCrafted).toEqualTypeOf(); + expect(data.extraUltimatesCrafted).toBeDefined(); + expect(data.extraUltimatesCrafted).toBeGreaterThanOrEqual(0); + expectTypeOf(data.extraUltimatesCrafted).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/UHC/UHCGamemode.ts b/src/Structures/MiniGames/UHC/UHCGamemode.ts new file mode 100644 index 000000000..6c099655d --- /dev/null +++ b/src/Structures/MiniGames/UHC/UHCGamemode.ts @@ -0,0 +1,24 @@ +import Divide from '../../../Utils/Divide.js'; +import type { UHCModes } from '../../../Types/Player.js'; + +class UHCGamemode { + kills: number; + deaths: number; + KDR: number; + wins: number; + headsEaten: number; + ultimatesCrafted: number; + extraUltimatesCrafted: number; + constructor(data: Record, mode?: UHCModes) { + const modeName = mode ? `_${mode}` : ''; + this.kills = data?.[`kills${modeName}`] || 0; + this.deaths = data?.[`deaths${modeName}`] || 0; + this.KDR = Divide(this.kills, this.deaths); + this.wins = data?.[`wins${modeName}`] || 0; + this.headsEaten = data?.[`heads_eaten${modeName}`] || 0; + this.ultimatesCrafted = data?.[`ultimates_crafted${modeName}`] || 0; + this.extraUltimatesCrafted = data?.[`extra_ultimates_crafted${modeName}`] || 0; + } +} + +export default UHCGamemode; diff --git a/src/Structures/MiniGames/VampireZ/VampireZ.test.ts b/src/Structures/MiniGames/VampireZ/VampireZ.test.ts new file mode 100644 index 000000000..3e6b303db --- /dev/null +++ b/src/Structures/MiniGames/VampireZ/VampireZ.test.ts @@ -0,0 +1,37 @@ +import VampireZ from './VampireZ.js'; +import VampireZRole from './VampireZRole.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('VampireZ', () => { + const data = new VampireZ({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(VampireZ); + expectTypeOf(data).toEqualTypeOf(); + expect(data.coins).toBeDefined(); + expect(data.coins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.coins).toEqualTypeOf(); + expect(data.goldBought).toBeDefined(); + expect(data.goldBought).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goldBought).toEqualTypeOf(); + expect(data.blood).toBeDefined(); + expectTypeOf(data.blood).toEqualTypeOf(); + expect(data.zombieKills).toBeDefined(); + expect(data.zombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.zombieKills).toEqualTypeOf(); + expect(data.human).toBeDefined(); + expectTypeOf(data.human).toEqualTypeOf(); + expect(data.vampire).toBeDefined(); + expectTypeOf(data.vampire).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/VampireZ/VampireZ.ts b/src/Structures/MiniGames/VampireZ/VampireZ.ts new file mode 100644 index 000000000..8c250f655 --- /dev/null +++ b/src/Structures/MiniGames/VampireZ/VampireZ.ts @@ -0,0 +1,29 @@ +import Divide from '../../../Utils/Divide.js'; +import VampireZRole from './VampireZRole.js'; + +class VampireZ { + coins: number; + goldBought: number; + blood: boolean; + zombieKills: number; + human: VampireZRole; + vampire: VampireZRole; + kills: number; + deaths: number; + KDR: number; + wins: number; + constructor(data: Record) { + this.coins = data?.coins || data?.tokens || 0; + this.goldBought = data?.gold_bought || 0; + this.blood = data?.blood || false; + this.zombieKills = data?.zombie_kills || 0; + this.human = new VampireZRole(data, 'human'); + this.vampire = new VampireZRole(data, 'vampire'); + this.kills = this.human?.kills + this.vampire?.kills; + this.deaths = this.human?.deaths + this.vampire?.deaths; + this.KDR = Divide(this.kills, this.deaths); + this.wins = this.human?.wins + this.vampire?.wins; + } +} + +export default VampireZ; diff --git a/src/Structures/MiniGames/VampireZ/VampireZRole.test.ts b/src/Structures/MiniGames/VampireZ/VampireZRole.test.ts new file mode 100644 index 000000000..f4dfa60c8 --- /dev/null +++ b/src/Structures/MiniGames/VampireZ/VampireZRole.test.ts @@ -0,0 +1,24 @@ +import VampireZRole from './VampireZRole.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { VampireZRoles } from '../../../Types/Player.js'; + +test('VampireZRole', () => { + const data = new VampireZRole({ stats: 'meow' }, 'human'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(VampireZRole); + expectTypeOf(data).toEqualTypeOf(); + expect(data.role).toBeDefined(); + expectTypeOf(data.role).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/VampireZ/VampireZRole.ts b/src/Structures/MiniGames/VampireZ/VampireZRole.ts new file mode 100644 index 000000000..b468b3738 --- /dev/null +++ b/src/Structures/MiniGames/VampireZ/VampireZRole.ts @@ -0,0 +1,19 @@ +import Divide from '../../../Utils/Divide.js'; +import type { VampireZRoles } from '../../../Types/Player.js'; + +class VampireZRole { + role: VampireZRoles; + kills: number; + deaths: number; + KDR: number; + wins: number; + constructor(data: Record, role: VampireZRoles) { + this.role = role; + this.kills = data?.[`${role}_kills`] || 0; + this.deaths = data?.[`${role}_deaths`] || 0; + this.KDR = Divide(this.kills, this.deaths); + this.wins = data?.[`${role}_wins`] || 0; + } +} + +export default VampireZRole; diff --git a/src/Structures/MiniGames/Walls.test.ts b/src/Structures/MiniGames/Walls.test.ts new file mode 100644 index 000000000..75aea1d7c --- /dev/null +++ b/src/Structures/MiniGames/Walls.test.ts @@ -0,0 +1,33 @@ +import Walls from './Walls.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Walls', () => { + const data = new Walls({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Walls); + expectTypeOf(data).toEqualTypeOf(); + expect(data.coins).toBeDefined(); + expect(data.coins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.coins).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.assists).toBeDefined(); + expect(data.assists).toBeGreaterThanOrEqual(0); + expectTypeOf(data.assists).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Walls.ts b/src/Structures/MiniGames/Walls.ts new file mode 100644 index 000000000..425f7000e --- /dev/null +++ b/src/Structures/MiniGames/Walls.ts @@ -0,0 +1,24 @@ +import Divide from '../../Utils/Divide.js'; + +class Walls { + coins: number; + kills: number; + deaths: number; + KDR: number; + wins: number; + losses: number; + WLR: number; + assists: number; + constructor(data: Record) { + this.coins = data?.coins || data?.tokens || 0; + this.kills = data?.kills || 0; + this.deaths = data?.deaths || 0; + this.KDR = Divide(this.kills, this.deaths); + this.wins = data?.wins || 0; + this.losses = data?.losses || 0; + this.WLR = Divide(this.wins, this.losses); + this.assists = data?.assists || 0; + } +} + +export default Walls; diff --git a/src/Structures/MiniGames/Warlords/Warlords.test.ts b/src/Structures/MiniGames/Warlords/Warlords.test.ts new file mode 100644 index 000000000..07bcfd7b4 --- /dev/null +++ b/src/Structures/MiniGames/Warlords/Warlords.test.ts @@ -0,0 +1,72 @@ +import Warlords from './Warlords.js'; +import WarlordsClass from './WarlordsClass.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { WarlordsClasses } from '../../../Types/Player.js'; + +test('Warlords', () => { + const data = new Warlords({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Warlords); + expectTypeOf(data).toEqualTypeOf(); + expect(data.coins).toBeDefined(); + expect(data.coins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.coins).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.winstreak).toBeDefined(); + expect(data.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winstreak).toEqualTypeOf(); + expect(data.assists).toBeDefined(); + expect(data.assists).toBeGreaterThanOrEqual(0); + expectTypeOf(data.assists).toEqualTypeOf(); + expect(data.class).toBeDefined(); + expectTypeOf(data.class).toEqualTypeOf(); + expect(data.pyromancer).toBeDefined(); + expectTypeOf(data.pyromancer).toEqualTypeOf(); + expect(data.mage).toBeDefined(); + expectTypeOf(data.mage).toEqualTypeOf(); + expect(data.thunderlord).toBeDefined(); + expectTypeOf(data.thunderlord).toEqualTypeOf(); + expect(data.shaman).toBeDefined(); + expectTypeOf(data.shaman).toEqualTypeOf(); + expect(data.earthwarden).toBeDefined(); + expectTypeOf(data.earthwarden).toEqualTypeOf(); + expect(data.aquamancer).toBeDefined(); + expectTypeOf(data.aquamancer).toEqualTypeOf(); + expect(data.paladin).toBeDefined(); + expectTypeOf(data.paladin).toEqualTypeOf(); + expect(data.avenger).toBeDefined(); + expectTypeOf(data.avenger).toEqualTypeOf(); + expect(data.warrior).toBeDefined(); + expectTypeOf(data.warrior).toEqualTypeOf(); + expect(data.defender).toBeDefined(); + expectTypeOf(data.defender).toEqualTypeOf(); + expect(data.cryomancer).toBeDefined(); + expectTypeOf(data.cryomancer).toEqualTypeOf(); + expect(data.crusader).toBeDefined(); + expectTypeOf(data.crusader).toEqualTypeOf(); + expect(data.berserker).toBeDefined(); + expectTypeOf(data.berserker).toEqualTypeOf(); + expect(data.protector).toBeDefined(); + expectTypeOf(data.protector).toEqualTypeOf(); + expect(data.revenant).toBeDefined(); + expectTypeOf(data.revenant).toEqualTypeOf(); + expect(data.spiritguard).toBeDefined(); + expectTypeOf(data.spiritguard).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Warlords/Warlords.ts b/src/Structures/MiniGames/Warlords/Warlords.ts new file mode 100644 index 000000000..49bb4b4f0 --- /dev/null +++ b/src/Structures/MiniGames/Warlords/Warlords.ts @@ -0,0 +1,62 @@ +import Divide from '../../../Utils/Divide.js'; +import WarlordsClass from './WarlordsClass.js'; +import type { WarlordsClasses } from '../../../Types/Player.js'; + +class Warlords { + coins: number; + kills: number; + deaths: number; + KDR: number; + wins: number; + losses: number; + WLR: number; + winstreak: number; + assists: number; + class: WarlordsClasses | 'None'; + pyromancer: WarlordsClass; + mage: WarlordsClass; + thunderlord: WarlordsClass; + shaman: WarlordsClass; + earthwarden: WarlordsClass; + aquamancer: WarlordsClass; + paladin: WarlordsClass; + avenger: WarlordsClass; + warrior: WarlordsClass; + defender: WarlordsClass; + cryomancer: WarlordsClass; + crusader: WarlordsClass; + berserker: WarlordsClass; + protector: WarlordsClass; + revenant: WarlordsClass; + spiritguard: WarlordsClass; + constructor(data: Record) { + this.coins = data?.coins || data?.tokens || 0; + this.kills = data?.kills || 0; + this.deaths = data?.deaths || 0; + this.KDR = Divide(this.kills, this.deaths); + this.wins = data?.wins || 0; + this.losses = data?.losses || 0; + this.WLR = Divide(this.wins, this.losses); + this.winstreak = data?.win_streak || 0; + this.assists = data?.assists || 0; + this.class = data?.chosen_class || 'None'; + this.pyromancer = new WarlordsClass(data, 'pyromancer'); + this.mage = new WarlordsClass(data, 'mage'); + this.thunderlord = new WarlordsClass(data, 'thunderlord'); + this.shaman = new WarlordsClass(data, 'shaman'); + this.earthwarden = new WarlordsClass(data, 'earthwarden'); + this.aquamancer = new WarlordsClass(data, 'aquamancer'); + this.paladin = new WarlordsClass(data, 'paladin'); + this.avenger = new WarlordsClass(data, 'avenger'); + this.warrior = new WarlordsClass(data, 'warrior'); + this.defender = new WarlordsClass(data, 'defender'); + this.cryomancer = new WarlordsClass(data, 'cryomancer'); + this.crusader = new WarlordsClass(data, 'crusader'); + this.berserker = new WarlordsClass(data, 'berserker'); + this.protector = new WarlordsClass(data, 'protector'); + this.revenant = new WarlordsClass(data, 'revenant'); + this.spiritguard = new WarlordsClass(data, 'spiritguard'); + } +} + +export default Warlords; diff --git a/src/Structures/MiniGames/Warlords/WarlordsClass.test.ts b/src/Structures/MiniGames/Warlords/WarlordsClass.test.ts new file mode 100644 index 000000000..9cb117edc --- /dev/null +++ b/src/Structures/MiniGames/Warlords/WarlordsClass.test.ts @@ -0,0 +1,30 @@ +import WarlordsClass from './WarlordsClass.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('WarlordsClass', () => { + const data = new WarlordsClass({ stats: 'meow' }, 'aquamancer'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(WarlordsClass); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.gamesPlayed).toBeDefined(); + expect(data.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gamesPlayed).toEqualTypeOf(); + expect(data.damage).toBeDefined(); + expect(data.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.damage).toEqualTypeOf(); + expect(data.heal).toBeDefined(); + expect(data.heal).toBeGreaterThanOrEqual(0); + expectTypeOf(data.heal).toEqualTypeOf(); + expect(data.damagePrevented).toBeDefined(); + expect(data.damagePrevented).toBeGreaterThanOrEqual(0); + expectTypeOf(data.damagePrevented).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Warlords/WarlordsClass.ts b/src/Structures/MiniGames/Warlords/WarlordsClass.ts new file mode 100644 index 000000000..dc2a052a2 --- /dev/null +++ b/src/Structures/MiniGames/Warlords/WarlordsClass.ts @@ -0,0 +1,23 @@ +import Divide from '../../../Utils/Divide.js'; +import type { WarlordsClasses } from '../../../Types/Player.js'; + +class WarlordsClass { + wins: number; + losses: number; + WLR: number; + gamesPlayed: number; + damage: number; + heal: number; + damagePrevented: number; + constructor(data: Record, className: WarlordsClasses) { + this.wins = data?.[`wins_${className}`] || 0; + this.losses = data?.[`losses_${className}`] || 0; + this.WLR = Divide(this.wins, this.losses); + this.gamesPlayed = data?.[`${className}_plays`] || 0; + this.damage = data?.[`damage_${className}`] || 0; + this.heal = data?.[`heal_${className}`] || 0; + this.damagePrevented = data?.[`damage_prevented_${className}`] || 0; + } +} + +export default WarlordsClass; diff --git a/src/Structures/MiniGames/WoolGames/CaptureTheWool.test.ts b/src/Structures/MiniGames/WoolGames/CaptureTheWool.test.ts new file mode 100644 index 000000000..d6f780921 --- /dev/null +++ b/src/Structures/MiniGames/WoolGames/CaptureTheWool.test.ts @@ -0,0 +1,39 @@ +import CaptureTheWool from './CaptureTheWool.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('CaptureTheWool', () => { + const data = new CaptureTheWool({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(CaptureTheWool); + expectTypeOf(data).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.assists).toBeDefined(); + expect(data.assists).toBeGreaterThanOrEqual(0); + expectTypeOf(data.assists).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDRatio).toBeDefined(); + expect(data.KDRatio).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDRatio).toEqualTypeOf(); + expect(data.killsWithWool).toBeDefined(); + expect(data.killsWithWool).toBeGreaterThanOrEqual(0); + expectTypeOf(data.killsWithWool).toEqualTypeOf(); + expect(data.deathsWithWool).toBeDefined(); + expect(data.deathsWithWool).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deathsWithWool).toEqualTypeOf(); + expect(data.KDRatioWithWool).toBeDefined(); + expect(data.KDRatioWithWool).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDRatioWithWool).toEqualTypeOf(); + expect(data.woolCaptured).toBeDefined(); + expect(data.woolCaptured).toBeGreaterThanOrEqual(0); + expectTypeOf(data.woolCaptured).toEqualTypeOf(); + expect(data.woolStolen).toBeDefined(); + expect(data.woolStolen).toBeGreaterThanOrEqual(0); + expectTypeOf(data.woolStolen).toEqualTypeOf(); + expect(data.woolCaptureStolenRatio).toBeDefined(); + expect(data.woolCaptureStolenRatio).toBeGreaterThanOrEqual(0); + expectTypeOf(data.woolCaptureStolenRatio).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/WoolGames/CaptureTheWool.ts b/src/Structures/MiniGames/WoolGames/CaptureTheWool.ts new file mode 100644 index 000000000..f640cccc0 --- /dev/null +++ b/src/Structures/MiniGames/WoolGames/CaptureTheWool.ts @@ -0,0 +1,28 @@ +import Divide from '../../../Utils/Divide.js'; + +class CaptureTheWool { + kills: number; + assists: number; + deaths: number; + KDRatio: number; + killsWithWool: number; + deathsWithWool: number; + KDRatioWithWool: number; + woolCaptured: number; + woolStolen: number; + woolCaptureStolenRatio: number; + constructor(data: Record) { + this.kills = data?.stats?.kills || 0; + this.assists = data?.stats?.assists || 0; + this.deaths = data?.stats?.deaths || 0; + this.KDRatio = Divide(this.kills, this.deaths); + this.killsWithWool = data?.stats?.kills_with_wool || 0; + this.deathsWithWool = data?.stats?.deaths_with_wool || 0; + this.KDRatioWithWool = Divide(this.killsWithWool, this.deathsWithWool); + this.woolCaptured = data?.stats?.wools_captured || 0; + this.woolStolen = data?.stats?.wools_stolen || 0; + this.woolCaptureStolenRatio = Divide(this.woolCaptured, this.woolStolen); + } +} + +export default CaptureTheWool; diff --git a/src/Structures/MiniGames/WoolGames/SheepWars.test.ts b/src/Structures/MiniGames/WoolGames/SheepWars.test.ts new file mode 100644 index 000000000..42f9b1253 --- /dev/null +++ b/src/Structures/MiniGames/WoolGames/SheepWars.test.ts @@ -0,0 +1,57 @@ +import SheepWars from './SheepWars.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SheepWars', () => { + const data = new SheepWars({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SheepWars); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.killsVoid).toBeDefined(); + expect(data.killsVoid).toBeGreaterThanOrEqual(0); + expectTypeOf(data.killsVoid).toEqualTypeOf(); + expect(data.killsBow).toBeDefined(); + expect(data.killsBow).toBeGreaterThanOrEqual(0); + expectTypeOf(data.killsBow).toEqualTypeOf(); + expect(data.killsExplosive).toBeDefined(); + expect(data.killsExplosive).toBeGreaterThanOrEqual(0); + expectTypeOf(data.killsExplosive).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.deathsVoid).toBeDefined(); + expect(data.deathsVoid).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deathsVoid).toEqualTypeOf(); + expect(data.deathsMelee).toBeDefined(); + expect(data.deathsMelee).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deathsMelee).toEqualTypeOf(); + expect(data.deathsExplosive).toBeDefined(); + expect(data.deathsExplosive).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deathsExplosive).toEqualTypeOf(); + expect(data.KDRatio).toBeDefined(); + expect(data.KDRatio).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDRatio).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLRatio).toBeDefined(); + expect(data.WLRatio).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLRatio).toEqualTypeOf(); + expect(data.gamesPlayed).toBeDefined(); + expect(data.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gamesPlayed).toEqualTypeOf(); + expect(data.damageDealt).toBeDefined(); + expect(data.damageDealt).toBeGreaterThanOrEqual(0); + expectTypeOf(data.damageDealt).toEqualTypeOf(); + expect(data.sheepThrown).toBeDefined(); + expect(data.sheepThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sheepThrown).toEqualTypeOf(); + expect(data.magicWoolHit).toBeDefined(); + expect(data.magicWoolHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.magicWoolHit).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/WoolGames/SheepWars.ts b/src/Structures/MiniGames/WoolGames/SheepWars.ts new file mode 100644 index 000000000..1784d246d --- /dev/null +++ b/src/Structures/MiniGames/WoolGames/SheepWars.ts @@ -0,0 +1,40 @@ +import Divide from '../../../Utils/Divide.js'; + +class SheepWars { + wins: number; + kills: number; + killsVoid: number; + killsBow: number; + killsExplosive: number; + deaths: number; + deathsVoid: number; + deathsMelee: number; + deathsExplosive: number; + KDRatio: number; + losses: number; + WLRatio: number; + gamesPlayed: number; + damageDealt: number; + sheepThrown: number; + magicWoolHit: number; + constructor(data: Record) { + this.wins = data?.stats?.wins || 0; + this.kills = data?.stats?.kills || 0; + this.killsVoid = data?.stats?.kills_void || 0; + this.killsBow = data?.stats?.kills_bow || 0; + this.killsExplosive = data?.stats?.kills_explosive || 0; + this.deaths = data?.stats?.deaths || 0; + this.deathsVoid = data?.stats?.deaths_void || 0; + this.deathsMelee = data?.stats?.deaths_melee || 0; + this.deathsExplosive = data?.stats?.deaths_explosive || 0; + this.KDRatio = Divide(this.wins, this.deaths); + this.losses = data?.stats?.losses || 0; + this.WLRatio = Divide(this.wins, this.losses); + this.gamesPlayed = data?.stats?.games_played || 0; + this.damageDealt = data?.stats?.damage_dealt || 0; + this.sheepThrown = data?.stats?.sheep_thrown || 0; + this.magicWoolHit = data?.stats?.magic_wool_hit || 0; + } +} + +export default SheepWars; diff --git a/src/Structures/MiniGames/WoolGames/WoolGames.test.ts b/src/Structures/MiniGames/WoolGames/WoolGames.test.ts new file mode 100644 index 000000000..799f61f82 --- /dev/null +++ b/src/Structures/MiniGames/WoolGames/WoolGames.test.ts @@ -0,0 +1,41 @@ +import CaptureTheWool from './CaptureTheWool.js'; +import SheepWars from './SheepWars.js'; +import WoolGames from './WoolGames.js'; +import WoolWars from './WoolWars.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { WoolGamesPrivateGameConfig } from '../../../Types/Player.js'; + +test('WoolGames', () => { + const data = new WoolGames({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(WoolGames); + expectTypeOf(data).toEqualTypeOf(); + expect(data.layers).toBeDefined(); + expect(data.layers).toBeGreaterThanOrEqual(0); + expectTypeOf(data.layers).toEqualTypeOf(); + expect(data.xp).toBeDefined(); + expect(data.xp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.xp).toEqualTypeOf(); + expect(data.exactLevel).toBeDefined(); + expect(data.exactLevel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.exactLevel).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expect(data.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.coins).toBeDefined(); + expect(data.coins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.coins).toEqualTypeOf(); + expect(data.ownedCosmetics).toBeDefined(); + expectTypeOf(data.ownedCosmetics).toEqualTypeOf(); + expect(data.privateGamesConfig).toBeDefined(); + expectTypeOf(data.privateGamesConfig).toEqualTypeOf(); + expect(data.playtime).toBeDefined(); + expect(data.playtime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playtime).toEqualTypeOf(); + expect(data.woolWars).toBeDefined(); + expectTypeOf(data.woolWars).toEqualTypeOf(); + expect(data.captureTheWool).toBeDefined(); + expectTypeOf(data.captureTheWool).toEqualTypeOf(); + expect(data.sheepWars).toBeDefined(); + expectTypeOf(data.sheepWars).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/WoolGames/WoolGames.ts b/src/Structures/MiniGames/WoolGames/WoolGames.ts new file mode 100644 index 000000000..1dee05e64 --- /dev/null +++ b/src/Structures/MiniGames/WoolGames/WoolGames.ts @@ -0,0 +1,44 @@ +import CaptureTheWool from './CaptureTheWool.js'; +import SheepWars from './SheepWars.js'; +import WoolWars from './WoolWars.js'; +import type { WoolGamesPrivateGameConfig } from '../../../Types/Player.js'; + +class WoolGames { + layers: number; + xp: number; + exactLevel: number; + level: number; + coins: number; + ownedCosmetics: string[]; + privateGamesConfig: WoolGamesPrivateGameConfig; + playtime: number; + woolWars: WoolWars; + captureTheWool: CaptureTheWool; + sheepWars: SheepWars; + constructor(data: Record) { + this.layers = data?.progression?.available_layers || 0; + this.xp = data?.progression?.experience || 0; + this.exactLevel = this.convertXPToLevel(this.xp); + this.level = Math?.floor(this.exactLevel); + this.coins = data?.coins || data?.tokens || 0; + this.ownedCosmetics = data?.packages || []; + this.privateGamesConfig = data?.privategames || {}; + this.playtime = data?.playtime || 0; + this.woolWars = new WoolWars(data?.wool_wars); + this.captureTheWool = new CaptureTheWool(data?.capture_the_wool); + this.sheepWars = new SheepWars(data?.sheep_wars); + } + + convertXPToLevel(exp: number): number { + const minimalExp = [0, 1e3, 3e3, 6e3, 1e4, 15e3]; + const baseLevel = minimalExp?.length; + const baseExp: number = minimalExp[minimalExp?.length - 1] || 0; + const expToLevel100 = 49e4; + if (exp < baseExp) return minimalExp?.findIndex((x) => exp < x); + const theoreticalLevel = (exp - baseExp) / 5e3 + baseLevel; + if (100 < theoreticalLevel) return 100 + this.convertXPToLevel(exp - expToLevel100); + return theoreticalLevel; + } +} + +export default WoolGames; diff --git a/src/Structures/MiniGames/WoolGames/WoolWars.test.ts b/src/Structures/MiniGames/WoolGames/WoolWars.test.ts new file mode 100644 index 000000000..5bea6f5d0 --- /dev/null +++ b/src/Structures/MiniGames/WoolGames/WoolWars.test.ts @@ -0,0 +1,55 @@ +import WoolWars from './WoolWars.js'; +import WoolWarsClass from './WoolWarsClass.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { WoolWarsClassNames } from '../../../Types/Player.js'; + +test('WoolWars', () => { + const data = new WoolWars({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(WoolWars); + expectTypeOf(data).toEqualTypeOf(); + expect(data.selectedClass).toBeDefined(); + expectTypeOf(data.selectedClass).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.assists).toBeDefined(); + expect(data.assists).toBeGreaterThanOrEqual(0); + expectTypeOf(data.assists).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDRatio).toBeDefined(); + expect(data.KDRatio).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDRatio).toEqualTypeOf(); + expect(data.gamesPlayed).toBeDefined(); + expect(data.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gamesPlayed).toEqualTypeOf(); + expect(data.woolsPlaced).toBeDefined(); + expect(data.woolsPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.woolsPlaced).toEqualTypeOf(); + expect(data.blocksBroken).toBeDefined(); + expect(data.blocksBroken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksBroken).toEqualTypeOf(); + expect(data.placeBreakRatio).toBeDefined(); + expect(data.placeBreakRatio).toBeGreaterThanOrEqual(0); + expectTypeOf(data.placeBreakRatio).toEqualTypeOf(); + expect(data.powerups).toBeDefined(); + expect(data.powerups).toBeGreaterThanOrEqual(0); + expectTypeOf(data.powerups).toEqualTypeOf(); + expect(data.assault).toBeDefined(); + expectTypeOf(data.assault).toEqualTypeOf(); + expect(data.tank).toBeDefined(); + expectTypeOf(data.tank).toEqualTypeOf(); + expect(data.golem).toBeDefined(); + expectTypeOf(data.golem).toEqualTypeOf(); + expect(data.swordsman).toBeDefined(); + expectTypeOf(data.swordsman).toEqualTypeOf(); + expect(data.engineer).toBeDefined(); + expectTypeOf(data.engineer).toEqualTypeOf(); + expect(data.archer).toBeDefined(); + expectTypeOf(data.archer).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/WoolGames/WoolWars.ts b/src/Structures/MiniGames/WoolGames/WoolWars.ts new file mode 100644 index 000000000..f28f051fa --- /dev/null +++ b/src/Structures/MiniGames/WoolGames/WoolWars.ts @@ -0,0 +1,44 @@ +import Divide from '../../../Utils/Divide.js'; +import WoolWarsClass from './WoolWarsClass.js'; +import type { WoolWarsClassNames } from '../../../Types/Player.js'; + +class WoolWars { + selectedClass: WoolWarsClassNames | 'None'; + wins: number; + kills: number; + assists: number; + deaths: number; + KDRatio: number; + gamesPlayed: number; + woolsPlaced: number; + blocksBroken: number; + placeBreakRatio: number; + powerups: number; + assault: WoolWarsClass; + tank: WoolWarsClass; + golem: WoolWarsClass; + swordsman: WoolWarsClass; + engineer: WoolWarsClass; + archer: WoolWarsClass; + constructor(data: Record) { + this.selectedClass = data?.selected_class || 'None'; + this.wins = data?.stats?.wins || 0; + this.kills = data?.stats?.kills || 0; + this.assists = data?.stats?.assists || 0; + this.deaths = data?.stats?.deaths || 0; + this.KDRatio = Divide(this.kills, this.deaths); + this.gamesPlayed = data?.stats?.games_played || 0; + this.woolsPlaced = data?.stats?.wool_placed || 0; + this.blocksBroken = data?.stats?.blocks_broken || 0; + this.placeBreakRatio = Divide(this.woolsPlaced, this.blocksBroken); + this.powerups = data?.powerups_gotten || 0; + this.assault = new WoolWarsClass(data?.stats?.classes, 'ASSAULT'); + this.tank = new WoolWarsClass(data?.stats?.classes, 'TANK'); + this.golem = new WoolWarsClass(data?.stats?.classes, 'GOLEM'); + this.swordsman = new WoolWarsClass(data?.stats?.classes, 'SWORDSMAN'); + this.engineer = new WoolWarsClass(data?.stats?.classes, 'ENGINEER'); + this.archer = new WoolWarsClass(data?.stats?.classes, 'ARCHER'); + } +} + +export default WoolWars; diff --git a/src/Structures/MiniGames/WoolGames/WoolWarsClass.test.ts b/src/Structures/MiniGames/WoolGames/WoolWarsClass.test.ts new file mode 100644 index 000000000..adac71094 --- /dev/null +++ b/src/Structures/MiniGames/WoolGames/WoolWarsClass.test.ts @@ -0,0 +1,39 @@ +import WoolWarsClass from './WoolWarsClass.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('WoolWarsClass', () => { + const data = new WoolWarsClass({ stats: 'meow' }, 'ARCHER'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(WoolWarsClass); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.assists).toBeDefined(); + expect(data.assists).toBeGreaterThanOrEqual(0); + expectTypeOf(data.assists).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDRatio).toBeDefined(); + expect(data.KDRatio).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDRatio).toEqualTypeOf(); + expect(data.gamesPlayed).toBeDefined(); + expect(data.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gamesPlayed).toEqualTypeOf(); + expect(data.woolsPlaced).toBeDefined(); + expect(data.woolsPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.woolsPlaced).toEqualTypeOf(); + expect(data.blocksBroken).toBeDefined(); + expect(data.blocksBroken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksBroken).toEqualTypeOf(); + expect(data.placeBreakRatio).toBeDefined(); + expect(data.placeBreakRatio).toBeGreaterThanOrEqual(0); + expectTypeOf(data.placeBreakRatio).toEqualTypeOf(); + expect(data.powerups).toBeDefined(); + expect(data.powerups).toBeGreaterThanOrEqual(0); + expectTypeOf(data.powerups).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/WoolGames/WoolWarsClass.ts b/src/Structures/MiniGames/WoolGames/WoolWarsClass.ts new file mode 100644 index 000000000..d9b67f172 --- /dev/null +++ b/src/Structures/MiniGames/WoolGames/WoolWarsClass.ts @@ -0,0 +1,30 @@ +import Divide from '../../../Utils/Divide.js'; +import type { WoolWarsClassNames } from '../../../Types/Player.js'; + +class WoolWarsClass { + wins: number; + kills: number; + assists: number; + deaths: number; + KDRatio: number; + gamesPlayed: number; + woolsPlaced: number; + blocksBroken: number; + placeBreakRatio: number; + powerups: number; + constructor(data: Record, classInput: WoolWarsClassNames) { + const className = classInput.toLowerCase(); + this.wins = data?.[className]?.wins || 0; + this.kills = data?.[className]?.kills || 0; + this.assists = data?.[className]?.assists || 0; + this.deaths = data?.[className]?.deaths || 0; + this.KDRatio = Divide(this.kills, this.deaths); + this.gamesPlayed = data?.[className]?.games_played || 0; + this.woolsPlaced = data?.[className]?.wool_placed || 0; + this.blocksBroken = data?.[className]?.blocks_broken || 0; + this.placeBreakRatio = Divide(this.woolsPlaced, this.blocksBroken); + this.powerups = data?.[className]?.powerups_gotten || 0; + } +} + +export default WoolWarsClass; diff --git a/src/Structures/Player/Cosmetics.test.ts b/src/Structures/Player/Cosmetics.test.ts new file mode 100644 index 000000000..0353fc8b8 --- /dev/null +++ b/src/Structures/Player/Cosmetics.test.ts @@ -0,0 +1,35 @@ +import Cosmetics from './Cosmetics.js'; +import Pets from './Pets.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Cosmetics', () => { + const data = new Cosmetics({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Cosmetics); + expectTypeOf(data).toEqualTypeOf(); + expect(data.cosmetics).toBeDefined(); + expectTypeOf(data.cosmetics).toEqualTypeOf(); + expect(data.currentGadget).toBeDefined(); + expectTypeOf(data.currentGadget).toEqualTypeOf(); + expect(data.pets).toBeDefined(); + expect(data.pets).toBeInstanceOf(Pets); + expectTypeOf(data.pets).toEqualTypeOf(); + expect(data.suits).toBeDefined(); + expectTypeOf(data.suits).toEqualTypeOf(); + expect(data.hats).toBeDefined(); + expectTypeOf(data.hats).toEqualTypeOf(); + expect(data.gadgets).toBeDefined(); + expectTypeOf(data.gadgets).toEqualTypeOf(); + expect(data.morphs).toBeDefined(); + expectTypeOf(data.morphs).toEqualTypeOf(); + expect(data.cloaks).toBeDefined(); + expectTypeOf(data.cloaks).toEqualTypeOf(); + expect(data.taunts).toBeDefined(); + expectTypeOf(data.taunts).toEqualTypeOf(); + expect(data.rankColors).toBeDefined(); + expectTypeOf(data.rankColors).toEqualTypeOf(); + expect(data.particlePacks).toBeDefined(); + expectTypeOf(data.particlePacks).toEqualTypeOf(); + expect(data.clickfx).toBeDefined(); + expectTypeOf(data.clickfx).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/Cosmetics.ts b/src/Structures/Player/Cosmetics.ts new file mode 100644 index 000000000..894e6ac15 --- /dev/null +++ b/src/Structures/Player/Cosmetics.ts @@ -0,0 +1,56 @@ +import Pets from './Pets.js'; +import { RemoveSnakeCaseString } from '../../Utils/RemoveSnakeCase.js'; + +class Cosmetics { + cosmetics: string[]; + currentGadget: string | null; + pets: Pets; + suits: string[]; + hats: string[]; + gadgets: string[]; + morphs: string[]; + cloaks: string[]; + taunts: string[]; + rankColors: string[]; + particlePacks: string[]; + clickfx: string[]; + constructor(data: Record) { + this.cosmetics = data?.vanityMeta?.packages || []; + this.currentGadget = data?.currentGadget || null; + this.pets = new Pets( + data, + this.cosmetics.filter((x) => x.startsWith('pet_')) + ); + this.suits = + this.cosmetics.filter((x) => x.startsWith('suit_')).map((x) => RemoveSnakeCaseString(x.replace('suit_', ''))) || + []; + this.hats = + this.cosmetics.filter((x) => x.startsWith('hat_')).map((x) => RemoveSnakeCaseString(x.replace('hat_', ''))) || []; + this.gadgets = + this.cosmetics + .filter((x) => x.startsWith('gadget_')) + .map((x) => RemoveSnakeCaseString(x.replace('gadget_', ''))) || []; + this.morphs = + this.cosmetics.filter((x) => x.startsWith('morph_')).map((x) => RemoveSnakeCaseString(x.replace('morph_', ''))) || + []; + this.cloaks = + this.cosmetics.filter((x) => x.startsWith('cloak_')).map((x) => RemoveSnakeCaseString(x.replace('cloak_', ''))) || + []; + this.taunts = + this.cosmetics.filter((x) => x.startsWith('taunt_')).map((x) => RemoveSnakeCaseString(x.replace('taunt_', ''))) || + []; + this.rankColors = + this.cosmetics + .filter((x) => x.startsWith('rankcolor_')) + .map((x) => RemoveSnakeCaseString(x.replace('rankcolor_', ''))) || []; + this.particlePacks = + this.cosmetics + .filter((x) => x.startsWith('particlepack_')) + .map((x) => RemoveSnakeCaseString(x.replace('particlepack_', ''))) || []; + this.clickfx = + this.cosmetics + .filter((x) => x.startsWith('clickeffects_')) + .map((x) => RemoveSnakeCaseString(x.replace('clickeffects_', ''))) || []; + } +} +export default Cosmetics; diff --git a/src/Structures/Player/Gifting.test.ts b/src/Structures/Player/Gifting.test.ts new file mode 100644 index 000000000..a5a9d79df --- /dev/null +++ b/src/Structures/Player/Gifting.test.ts @@ -0,0 +1,25 @@ +import Gifting from './Gifting.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Gifting', () => { + const data = new Gifting({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Gifting); + expectTypeOf(data).toEqualTypeOf(); + expect(data.bundlesReceived).toBeDefined(); + expect(data.bundlesReceived).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bundlesReceived).toEqualTypeOf(); + expect(data.bundlesGiven).toBeDefined(); + expect(data.bundlesGiven).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bundlesGiven).toEqualTypeOf(); + expect(data.milestones).toBeDefined(); + expectTypeOf(data.milestones).toEqualTypeOf(); + expect(data.giftsGiven).toBeDefined(); + expect(data.giftsGiven).toBeGreaterThanOrEqual(0); + expectTypeOf(data.giftsGiven).toEqualTypeOf(); + expect(data.ranksGiven).toBeDefined(); + expect(data.ranksGiven).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ranksGiven).toEqualTypeOf(); + expect(data.ranksGivenMilestones).toBeDefined(); + expectTypeOf(data.ranksGivenMilestones).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/Gifting.ts b/src/Structures/Player/Gifting.ts new file mode 100644 index 000000000..5392b5efe --- /dev/null +++ b/src/Structures/Player/Gifting.ts @@ -0,0 +1,18 @@ +class Gifting { + bundlesReceived: number; + bundlesGiven: number; + milestones: string[]; + giftsGiven: number; + ranksGiven: number; + ranksGivenMilestones: string[]; + constructor(data: Record) { + this.bundlesReceived = data.realBundlesReceived || 0; + this.bundlesGiven = data.realBundlesGiven || 0; + this.milestones = (data.milestones || []).reverse(); + this.giftsGiven = data.giftsGiven || 0; + this.ranksGiven = data.ranksGiven || 0; + this.ranksGivenMilestones = (data.rankgiftingmilestones || []).reverse(); + } +} + +export default Gifting; diff --git a/src/Structures/Player/MonthlyCrate.test.ts b/src/Structures/Player/MonthlyCrate.test.ts new file mode 100644 index 000000000..85595ee3f --- /dev/null +++ b/src/Structures/Player/MonthlyCrate.test.ts @@ -0,0 +1,21 @@ +import MonthlyCrate from './MonthlyCrate.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('MonthlyCrate', () => { + const data = new MonthlyCrate({ stats: 'meow' }, 'meow'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(MonthlyCrate); + expectTypeOf(data).toEqualTypeOf(); + expect(data.date).toBeDefined(); + expectTypeOf(data.date).toEqualTypeOf(); + expect(data.REGULAR).toBeDefined(); + expectTypeOf(data.REGULAR).toEqualTypeOf(); + expect(data.VIP).toBeDefined(); + expectTypeOf(data.VIP).toEqualTypeOf(); + expect(data.VIP_PLUS).toBeDefined(); + expectTypeOf(data.VIP_PLUS).toEqualTypeOf(); + expect(data.MVP).toBeDefined(); + expectTypeOf(data.MVP).toEqualTypeOf(); + expect(data.MVP_PLUS).toBeDefined(); + expectTypeOf(data.MVP_PLUS).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/MonthlyCrate.ts b/src/Structures/Player/MonthlyCrate.ts new file mode 100644 index 000000000..55e06e7c0 --- /dev/null +++ b/src/Structures/Player/MonthlyCrate.ts @@ -0,0 +1,18 @@ +class MonthlyCrate { + date: string; + REGULAR: boolean; + VIP: boolean; + VIP_PLUS: boolean; + MVP: boolean; + MVP_PLUS: boolean; + constructor(data: Record, date: string) { + this.date = date; + this.REGULAR = data.REGULAR || false; + this.VIP = data.VIP || false; + this.VIP_PLUS = data.VIP_PLUS || false; + this.MVP = data.MVP || false; + this.MVP_PLUS = data.MVP_PLUS || false; + } +} + +export default MonthlyCrate; diff --git a/src/Structures/Player/Parkour.test.ts b/src/Structures/Player/Parkour.test.ts new file mode 100644 index 000000000..2a166c318 --- /dev/null +++ b/src/Structures/Player/Parkour.test.ts @@ -0,0 +1,17 @@ +import Parkour from './Parkour.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Parkour', () => { + const data = new Parkour({ stats: 'meow' }, { stats: 'meow' }, 'meow'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Parkour); + expectTypeOf(data).toEqualTypeOf(); + expect(data.location).toBeDefined(); + expectTypeOf(data.location).toEqualTypeOf(); + expect(data.timeStart).toBeDefined(); + expectTypeOf(data.timeStart).toEqualTypeOf(); + expect(data.timeTook).toBeDefined(); + expectTypeOf(data.timeTook).toEqualTypeOf(); + expect(data.checkPoints).toBeDefined(); + expectTypeOf(data.checkPoints).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/Parkour.ts b/src/Structures/Player/Parkour.ts new file mode 100644 index 000000000..ddd4c2d47 --- /dev/null +++ b/src/Structures/Player/Parkour.ts @@ -0,0 +1,17 @@ +class Parkour { + location: string; + timeStart: number; + timeTook: number; + checkPoints: number[]; + constructor(data: Record, checkPoints: Record, location: string) { + this.location = location; + this.timeStart = data?.[location]?.[0].timeStart || 0; + this.timeTook = data?.[location]?.[0].timeTook || 0; + this.checkPoints = []; + Object.keys(checkPoints?.[location] || {}).map((checkPoint: string) => { + this.checkPoints.push(checkPoints?.[location]?.[checkPoint]); + }); + } +} + +export default Parkour; diff --git a/src/Structures/Player/Pet.test.ts b/src/Structures/Player/Pet.test.ts new file mode 100644 index 000000000..f9ddc9dc6 --- /dev/null +++ b/src/Structures/Player/Pet.test.ts @@ -0,0 +1,43 @@ +import Pet from './Pet.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Pet', () => { + const data = new Pet('meow', { stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Pet); + expectTypeOf(data).toEqualTypeOf(); + expect(data.isFavorite).toBeDefined(); + expectTypeOf(data.isFavorite).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.active).toBeDefined(); + expectTypeOf(data.active).toEqualTypeOf(); + expect(data.hunger).toBeDefined(); + expect(data.hunger).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hunger).toEqualTypeOf(); + expect(data.lastFed).toBeDefined(); + expectTypeOf(data.lastFed).toEqualTypeOf(); + expect(data.lastFedAt).toBeDefined(); + expectTypeOf(data.lastFedAt).toEqualTypeOf(); + expect(data.thirst).toBeDefined(); + expect(data.thirst).toBeGreaterThanOrEqual(0); + expectTypeOf(data.thirst).toEqualTypeOf(); + expect(data.lastDrank).toBeDefined(); + expectTypeOf(data.lastDrank).toEqualTypeOf(); + expect(data.lastDrankAt).toBeDefined(); + expectTypeOf(data.lastDrankAt).toEqualTypeOf(); + expect(data.exercise).toBeDefined(); + expect(data.exercise).toBeGreaterThanOrEqual(0); + expectTypeOf(data.exercise).toEqualTypeOf(); + expect(data.lastExercised).toBeDefined(); + expectTypeOf(data.lastExercised).toEqualTypeOf(); + expect(data.lastExercisedAt).toBeDefined(); + expectTypeOf(data.lastExercisedAt).toEqualTypeOf(); + expect(data.rawNickname).toBeDefined(); + expectTypeOf(data.rawNickname).toEqualTypeOf(); + expect(data.nickname).toBeDefined(); + expectTypeOf(data.nickname).toEqualTypeOf(); + expect(data.experience).toBeDefined(); + expect(data.experience).toBeGreaterThanOrEqual(0); + expectTypeOf(data.experience).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/Pet.ts b/src/Structures/Player/Pet.ts new file mode 100644 index 000000000..6a9fb6fff --- /dev/null +++ b/src/Structures/Player/Pet.ts @@ -0,0 +1,41 @@ +import { recursive } from '../../Utils/RemoveSnakeCase.js'; + +class Pet { + isFavorite: boolean; + name: string | null; + active: boolean; + hunger: number; + lastFed: number | null; + lastFedAt: Date | null; + thirst: number; + lastDrank: number | null; + lastDrankAt: Date | null; + exercise: number; + lastExercised: number | null; + lastExercisedAt: Date | null; + rawNickname: string; + nickname: string; + experience: number; + + constructor(name: string, data: Record) { + this.isFavorite = data?.vanityFavorites ? Boolean(data?.vanityFavorites.includes(name.toUpperCase())) : false; + name = name.replace('pet_', ''); + this.name = recursive(name) || null; + this.active = data?.currentPet === name.toUpperCase(); + const stats = data?.petStats?.[name.toUpperCase()] || {}; + this.hunger = stats?.HUNGER?.value || 0; + this.lastFed = stats?.HUNGER?.timestamp || null; + this.lastFedAt = this.lastFed ? new Date(this.lastFed) : null; + this.thirst = stats?.THIRST?.value || 0; + this.lastDrank = stats?.THIRST?.timestamp || null; + this.lastDrankAt = this.lastDrank ? new Date(this.lastDrank) : null; + this.exercise = stats?.EXERCISE?.value || 0; + this.lastExercised = stats?.EXERCISE ? stats?.EXERCISE?.timestamp : null; + this.lastExercisedAt = this.lastExercised ? new Date(this.lastExercised) : null; + this.rawNickname = stats?.name || ''; + this.nickname = this.rawNickname.replace(/§([0-9]|[a-f])|§/gm, ''); + this.experience = stats?.experience || 0; + } +} + +export default Pet; diff --git a/src/Structures/Player/PetConsumables.test.ts b/src/Structures/Player/PetConsumables.test.ts new file mode 100644 index 000000000..ceeebce18 --- /dev/null +++ b/src/Structures/Player/PetConsumables.test.ts @@ -0,0 +1,90 @@ +import PetConsumables from './PetConsumables.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Pet Consumables', () => { + const data = new PetConsumables({ stats: 0 }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PetConsumables); + expectTypeOf(data).toEqualTypeOf(); + expect(data.bakedPotato).toBeDefined(); + expect(data.bakedPotato).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bakedPotato).toEqualTypeOf(); + expect(data.cookie).toBeDefined(); + expect(data.cookie).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cookie).toEqualTypeOf(); + expect(data.feather).toBeDefined(); + expect(data.feather).toBeGreaterThanOrEqual(0); + expectTypeOf(data.feather).toEqualTypeOf(); + expect(data.hayBlock).toBeDefined(); + expect(data.hayBlock).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hayBlock).toEqualTypeOf(); + expect(data.slimeBall).toBeDefined(); + expect(data.slimeBall).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slimeBall).toEqualTypeOf(); + expect(data.cookedBeef).toBeDefined(); + expect(data.cookedBeef).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cookedBeef).toEqualTypeOf(); + expect(data.redRose).toBeDefined(); + expect(data.redRose).toBeGreaterThanOrEqual(0); + expectTypeOf(data.redRose).toEqualTypeOf(); + expect(data.waterBucket).toBeDefined(); + expect(data.waterBucket).toBeGreaterThanOrEqual(0); + expectTypeOf(data.waterBucket).toEqualTypeOf(); + expect(data.melon).toBeDefined(); + expect(data.melon).toBeGreaterThanOrEqual(0); + expectTypeOf(data.melon).toEqualTypeOf(); + expect(data.stick).toBeDefined(); + expect(data.stick).toBeGreaterThanOrEqual(0); + expectTypeOf(data.stick).toEqualTypeOf(); + expect(data.woodSword).toBeDefined(); + expect(data.woodSword).toBeGreaterThanOrEqual(0); + expectTypeOf(data.woodSword).toEqualTypeOf(); + expect(data.milkBucket).toBeDefined(); + expect(data.milkBucket).toBeGreaterThanOrEqual(0); + expectTypeOf(data.milkBucket).toEqualTypeOf(); + expect(data.goldRecord).toBeDefined(); + expect(data.goldRecord).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goldRecord).toEqualTypeOf(); + expect(data.leash).toBeDefined(); + expect(data.leash).toBeGreaterThanOrEqual(0); + expectTypeOf(data.leash).toEqualTypeOf(); + expect(data.lavaBucket).toBeDefined(); + expect(data.lavaBucket).toBeGreaterThanOrEqual(0); + expectTypeOf(data.lavaBucket).toEqualTypeOf(); + expect(data.bone).toBeDefined(); + expect(data.bone).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bone).toEqualTypeOf(); + expect(data.magmaCream).toBeDefined(); + expect(data.magmaCream).toBeGreaterThanOrEqual(0); + expectTypeOf(data.magmaCream).toEqualTypeOf(); + expect(data.wheat).toBeDefined(); + expect(data.wheat).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wheat).toEqualTypeOf(); + expect(data.mushroomSoup).toBeDefined(); + expect(data.mushroomSoup).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mushroomSoup).toEqualTypeOf(); + expect(data.bread).toBeDefined(); + expect(data.bread).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bread).toEqualTypeOf(); + expect(data.pumpkinPie).toBeDefined(); + expect(data.pumpkinPie).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pumpkinPie).toEqualTypeOf(); + expect(data.apple).toBeDefined(); + expect(data.apple).toBeGreaterThanOrEqual(0); + expectTypeOf(data.apple).toEqualTypeOf(); + expect(data.carrot).toBeDefined(); + expect(data.carrot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.carrot).toEqualTypeOf(); + expect(data.rawFish).toBeDefined(); + expect(data.rawFish).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rawFish).toEqualTypeOf(); + expect(data.pork).toBeDefined(); + expect(data.pork).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pork).toEqualTypeOf(); + expect(data.cake).toBeDefined(); + expect(data.cake).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cake).toEqualTypeOf(); + expect(data.rottenFlesh).toBeDefined(); + expect(data.rottenFlesh).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rottenFlesh).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PetConsumables.ts b/src/Structures/Player/PetConsumables.ts new file mode 100644 index 000000000..90b194542 --- /dev/null +++ b/src/Structures/Player/PetConsumables.ts @@ -0,0 +1,60 @@ +class PetConsumables { + bakedPotato: number; + cookie: number; + feather: number; + hayBlock: number; + slimeBall: number; + cookedBeef: number; + redRose: number; + waterBucket: number; + melon: number; + stick: number; + woodSword: number; + milkBucket: number; + goldRecord: number; + leash: number; + lavaBucket: number; + bone: number; + magmaCream: number; + wheat: number; + mushroomSoup: number; + bread: number; + pumpkinPie: number; + apple: number; + carrot: number; + rawFish: number; + pork: number; + cake: number; + rottenFlesh: number; + constructor(data: Record) { + this.bakedPotato = data?.BAKED_POTATO || 0; + this.cookie = data?.COOKIE || 0; + this.feather = data?.FEATHER || 0; + this.hayBlock = data?.HAY_BLOCK || 0; + this.slimeBall = data?.SLIME_BALL || 0; + this.cookedBeef = data?.COOKED_BEEF || 0; + this.redRose = data?.RED_ROSE || 0; + this.waterBucket = data?.WATER_BUCKET || 0; + this.melon = data?.MELON || 0; + this.stick = data?.STICK || 0; + this.woodSword = data?.WOOD_SWORD || 0; + this.milkBucket = data?.MILK_BUCKET || 0; + this.goldRecord = data?.GOLD_RECORD || 0; + this.leash = data?.LEASH || 0; + this.lavaBucket = data?.LAVA_BUCKET || 0; + this.bone = data?.BONE || 0; + this.magmaCream = data?.MAGMA_CREAM || 0; + this.wheat = data?.WHEAT || 0; + this.mushroomSoup = data?.MUSHROOM_SOUP || 0; + this.bread = data?.BREAD || 0; + this.pumpkinPie = data?.PUMPKIN_PIE || 0; + this.apple = data?.APPLE || 0; + this.carrot = data?.CARROT_ITEM || 0; + this.rawFish = data?.RAW_FISH || 0; + this.pork = data?.PORK || 0; + this.cake = data?.CAKE || 0; + this.rottenFlesh = data?.ROTTEN_FLESH || 0; + } +} + +export default PetConsumables; diff --git a/src/Structures/Player/Pets.test.ts b/src/Structures/Player/Pets.test.ts new file mode 100644 index 000000000..d781fb7a2 --- /dev/null +++ b/src/Structures/Player/Pets.test.ts @@ -0,0 +1,19 @@ +import Pet from './Pet.js'; +import PetConsumables from './PetConsumables.js'; +import Pets from './Pets.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Pets', () => { + const data = new Pets({ stats: 'meow' }, ['meow']); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Pets); + expectTypeOf(data).toEqualTypeOf(); + expect(data.pets).toBeDefined(); + expectTypeOf(data.pets).toEqualTypeOf(); + expect(data.lastJourneyTimestamp).toBeDefined(); + expectTypeOf(data.lastJourneyTimestamp).toEqualTypeOf(); + expect(data.lastJourneyAt).toBeDefined(); + expectTypeOf(data.lastJourneyAt).toEqualTypeOf(); + expect(data.petConsumables).toBeDefined(); + expectTypeOf(data.petConsumables).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/Pets.ts b/src/Structures/Player/Pets.ts new file mode 100644 index 000000000..4f4031055 --- /dev/null +++ b/src/Structures/Player/Pets.ts @@ -0,0 +1,17 @@ +import Pet from './Pet.js'; +import PetConsumables from './PetConsumables.js'; + +class Pets { + pets: Pet[]; + lastJourneyTimestamp: number | null; + lastJourneyAt: Date | null; + petConsumables: PetConsumables; + constructor(data: Record, pets: string[]) { + this.pets = pets.map((x) => new Pet(x, data)); + this.lastJourneyTimestamp = data.petJourneyTimestamp || null; + this.lastJourneyAt = this.lastJourneyTimestamp ? new Date(this.lastJourneyTimestamp) : null; + this.petConsumables = new PetConsumables(data?.petConsumables || {}); + } +} + +export default Pets; diff --git a/src/Structures/Player/Player.test.ts b/src/Structures/Player/Player.test.ts new file mode 100644 index 000000000..409984254 --- /dev/null +++ b/src/Structures/Player/Player.test.ts @@ -0,0 +1,184 @@ +import Arcade from '../MiniGames/Arcade/Arcade.js'; +import ArenaBrawl from '../MiniGames/ArenaBrawl/ArenaBrawl.js'; +import BedWars from '../MiniGames/BedWars/BedWars.js'; +import BlitzSurvivalGames from '../MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.js'; +import BuildBattle from '../MiniGames/BuildBattle.js'; +import Color from '../Color.js'; +import CopsAndCrims from '../MiniGames/CopsAndCrims/CopsAndCrims.js'; +import Cosmetics from './Cosmetics.js'; +import Duels from '../MiniGames/Duels/Duels.js'; +import Gifting from './Gifting.js'; +import Guild from '../Guild/Guild.js'; +import House from '../House.js'; +import Housing from '../Housing.js'; +import MegaWalls from '../MiniGames/MegaWalls/MegaWalls.js'; +import MurderMystery from '../MiniGames/MurderMystery/MurderMystery.js'; +import Paintball from '../MiniGames/Paintball.js'; +import Parkour from './Parkour.js'; +import Pit from '../MiniGames/Pit/Pit.js'; +import Player from './Player.js'; +import PlayerAchievements from './PlayerAchievements.js'; +import PlayerQuests from './Quests/PlayerQuests.js'; +import Quakecraft from '../MiniGames/Quakecraft/Quakecraft.js'; +import RecentGame from '../RecentGame.js'; +import Rewards from './Rewards.js'; +import Seasonal from './Seasonal/Seasonal.js'; +import SkyWars from '../MiniGames/SkyWars/SkyWars.js'; +import SmashHeroes from '../MiniGames/SmashHeroes/SmashHeroes.js'; +import SocialMedia from './SocialMedia.js'; +import SpeedUHC from '../MiniGames/SpeedUHC/SpeedUHC.js'; +import TNTGames from '../MiniGames/TNTGames/TNTGames.js'; +import Tourney from './Tourney/Tourney.js'; +import TurboKartRacers from '../MiniGames/TurboKartRacers/TurboKartRacers.js'; +import UHC from '../MiniGames/UHC/UHC.js'; +import VampireZ from '../MiniGames/VampireZ/VampireZ.js'; +import Walls from '../MiniGames/Walls.js'; +import Warlords from '../MiniGames/Warlords/Warlords.js'; +import WoolGames from '../MiniGames/WoolGames/WoolGames.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { + ChatChannel, + Language, + LevelProgress, + PlayerRank, + PlayerStats, + ScorpiusBribe +} from '../../Types/Player.js'; + +test('Player', () => { + const data = new Player({ stats: 'meow' }, { guild: null, houses: null, recentGames: null }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Player); + expectTypeOf(data).toEqualTypeOf(); + expect(data.uuid).toBeDefined(); + expectTypeOf(data.uuid).toEqualTypeOf(); + expect(data.nickname).toBeDefined(); + expectTypeOf(data.nickname).toEqualTypeOf(); + expect(data.rank).toBeDefined(); + expectTypeOf(data.rank).toEqualTypeOf(); + expect(data.mvpPlusColor).toBeDefined(); + expectTypeOf(data.mvpPlusColor).toEqualTypeOf(); + expect(data.mvpPlusPlusColor).toBeDefined(); + expectTypeOf(data.mvpPlusPlusColor).toEqualTypeOf(); + expect(data.gifting).toBeDefined(); + expectTypeOf(data.gifting).toEqualTypeOf(); + expect(data.socialMedia).toBeDefined(); + expectTypeOf(data.socialMedia).toEqualTypeOf(); + expect(data.firstLoginTimestamp).toBeDefined(); + expect(data.firstLoginTimestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.firstLoginTimestamp).toEqualTypeOf(); + expect(data.firstLoginAt).toBeDefined(); + expectTypeOf(data.firstLoginAt).toEqualTypeOf(); + expect(data.lastLoginTimestamp).toBeDefined(); + expectTypeOf(data.lastLoginTimestamp).toEqualTypeOf(); + expect(data.lastLoginAt).toBeDefined(); + expectTypeOf(data.lastLoginAt).toEqualTypeOf(); + expect(data.achievements).toBeDefined(); + expectTypeOf(data.achievements).toEqualTypeOf(); + expect(data.language).toBeDefined(); + expectTypeOf(data.language).toEqualTypeOf(); + expect(data.channel).toBeDefined(); + expectTypeOf(data.channel).toEqualTypeOf(); + expect(data.exp).toBeDefined(); + expect(data.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.exp).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.seasonal).toBeDefined(); + expectTypeOf(data.seasonal).toEqualTypeOf(); + expect(data.karma).toBeDefined(); + expect(data.karma).toBeGreaterThanOrEqual(0); + expectTypeOf(data.karma).toEqualTypeOf(); + expect(data.freeSkyblockCookie).toBeDefined(); + expectTypeOf(data.freeSkyblockCookie).toEqualTypeOf(); + expect(data.tourney).toBeDefined(); + expectTypeOf(data.tourney).toEqualTypeOf(); + expect(data.rewards).toBeDefined(); + expectTypeOf(data.rewards).toEqualTypeOf(); + expect(data.challenges).toBeDefined(); + expectTypeOf(data.challenges).toEqualTypeOf(); + expect(data.parkour).toBeDefined(); + expectTypeOf(data.parkour).toEqualTypeOf(); + expect(data.housing).toBeDefined(); + expectTypeOf(data.housing).toEqualTypeOf(); + expect(data.cosmetics).toBeDefined(); + expectTypeOf(data.cosmetics).toEqualTypeOf(); + expect(data.scorpiusBribes).toBeDefined(); + expectTypeOf(data.scorpiusBribes).toEqualTypeOf(); + expect(data.quests).toBeDefined(); + expectTypeOf(data.quests).toEqualTypeOf(); + expect(data.guild).toBeDefined(); + expectTypeOf(data.guild).toEqualTypeOf(); + expect(data.houses).toBeDefined(); + expectTypeOf(data.houses).toEqualTypeOf(); + expect(data.recentGames).toBeDefined(); + expectTypeOf(data.recentGames).toEqualTypeOf(); + expect(data.stats).toBeDefined(); + expectTypeOf(data.stats).toEqualTypeOf(); + expect(data.stats.arcade).toBeDefined(); + expect(data.stats.arcade).toBeInstanceOf(Arcade); + expectTypeOf(data.stats.arcade).toEqualTypeOf(); + expect(data.stats.arenaBrawl).toBeDefined(); + expect(data.stats.arenaBrawl).toBeInstanceOf(ArenaBrawl); + expectTypeOf(data.stats.arenaBrawl).toEqualTypeOf(); + expect(data.stats.bedwars).toBeDefined(); + expect(data.stats.bedwars).toBeInstanceOf(BedWars); + expectTypeOf(data.stats.bedwars).toEqualTypeOf(); + expect(data.stats.blitzsg).toBeDefined(); + expect(data.stats.blitzsg).toBeInstanceOf(BlitzSurvivalGames); + expectTypeOf(data.stats.blitzsg).toEqualTypeOf(); + expect(data.stats.buildbattle).toBeDefined(); + expect(data.stats.buildbattle).toBeInstanceOf(BuildBattle); + expectTypeOf(data.stats.buildbattle).toEqualTypeOf(); + expect(data.stats.copsandcrims).toBeDefined(); + expect(data.stats.copsandcrims).toBeInstanceOf(CopsAndCrims); + expectTypeOf(data.stats.copsandcrims).toEqualTypeOf(); + expect(data.stats.duels).toBeDefined(); + expect(data.stats.duels).toBeInstanceOf(Duels); + expectTypeOf(data.stats.duels).toEqualTypeOf(); + expect(data.stats.megawalls).toBeDefined(); + expect(data.stats.megawalls).toBeInstanceOf(MegaWalls); + expectTypeOf(data.stats.megawalls).toEqualTypeOf(); + expect(data.stats.murdermystery).toBeDefined(); + expect(data.stats.murdermystery).toBeInstanceOf(MurderMystery); + expectTypeOf(data.stats.murdermystery).toEqualTypeOf(); + expect(data.stats.paintball).toBeDefined(); + expect(data.stats.paintball).toBeInstanceOf(Paintball); + expectTypeOf(data.stats.paintball).toEqualTypeOf(); + expect(data.stats.pit).toBeDefined(); + expect(data.stats.pit).toBeInstanceOf(Pit); + expectTypeOf(data.stats.pit).toEqualTypeOf(); + expect(data.stats.quakecraft).toBeDefined(); + expect(data.stats.quakecraft).toBeInstanceOf(Quakecraft); + expectTypeOf(data.stats.quakecraft).toEqualTypeOf(); + expect(data.stats.skywars).toBeDefined(); + expect(data.stats.skywars).toBeInstanceOf(SkyWars); + expectTypeOf(data.stats.skywars).toEqualTypeOf(); + expect(data.stats.smashheroes).toBeDefined(); + expect(data.stats.smashheroes).toBeInstanceOf(SmashHeroes); + expectTypeOf(data.stats.smashheroes).toEqualTypeOf(); + expect(data.stats.speeduhc).toBeDefined(); + expect(data.stats.speeduhc).toBeInstanceOf(SpeedUHC); + expectTypeOf(data.stats.speeduhc).toEqualTypeOf(); + expect(data.stats.tntgames).toBeDefined(); + expect(data.stats.tntgames).toBeInstanceOf(TNTGames); + expectTypeOf(data.stats.tntgames).toEqualTypeOf(); + expect(data.stats.turbokartracers).toBeDefined(); + expect(data.stats.turbokartracers).toBeInstanceOf(TurboKartRacers); + expectTypeOf(data.stats.turbokartracers).toEqualTypeOf(); + expect(data.stats.uhc).toBeDefined(); + expect(data.stats.uhc).toBeInstanceOf(UHC); + expectTypeOf(data.stats.uhc).toEqualTypeOf(); + expect(data.stats.vampirez).toBeDefined(); + expect(data.stats.vampirez).toBeInstanceOf(VampireZ); + expectTypeOf(data.stats.vampirez).toEqualTypeOf(); + expect(data.stats.walls).toBeDefined(); + expect(data.stats.walls).toBeInstanceOf(Walls); + expectTypeOf(data.stats.walls).toEqualTypeOf(); + expect(data.stats.warlords).toBeDefined(); + expect(data.stats.warlords).toBeInstanceOf(Warlords); + expectTypeOf(data.stats.warlords).toEqualTypeOf(); + expect(data.stats.woolgames).toBeDefined(); + expect(data.stats.woolgames).toBeInstanceOf(WoolGames); + expectTypeOf(data.stats.woolgames).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/Player.ts b/src/Structures/Player/Player.ts new file mode 100644 index 000000000..aa56ce442 --- /dev/null +++ b/src/Structures/Player/Player.ts @@ -0,0 +1,145 @@ +import Arcade from '../MiniGames/Arcade/Arcade.js'; +import ArenaBrawl from '../MiniGames/ArenaBrawl/ArenaBrawl.js'; +import BedWars from '../MiniGames/BedWars/BedWars.js'; +import BlitzSurvivalGames from '../MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.js'; +import BuildBattle from '../MiniGames/BuildBattle.js'; +import Color from '../Color.js'; +import CopsAndCrims from '../MiniGames/CopsAndCrims/CopsAndCrims.js'; +import Cosmetics from './Cosmetics.js'; +import Duels from '../MiniGames/Duels/Duels.js'; +import Gifting from './Gifting.js'; +import Guild from '../Guild/Guild.js'; +import House from '../House.js'; +import Housing from '../Housing.js'; +import MegaWalls from '../MiniGames/MegaWalls/MegaWalls.js'; +import MurderMystery from '../MiniGames/MurderMystery/MurderMystery.js'; +import Paintball from '../MiniGames/Paintball.js'; +import Parkour from './Parkour.js'; +import Pit from '../MiniGames/Pit/Pit.js'; +import PlayerAchievements from './PlayerAchievements.js'; +import PlayerQuests from './Quests/PlayerQuests.js'; +import Quakecraft from '../MiniGames/Quakecraft/Quakecraft.js'; +import RecentGame from '../RecentGame.js'; +import Rewards from './Rewards.js'; +import Seasonal from './Seasonal/Seasonal.js'; +import SkyWars from '../MiniGames/SkyWars/SkyWars.js'; +import SmashHeroes from '../MiniGames/SmashHeroes/SmashHeroes.js'; +import SocialMedia, { parseSocialMedia } from './SocialMedia.js'; +import SpeedUHC from '../MiniGames/SpeedUHC/SpeedUHC.js'; +import TNTGames from '../MiniGames/TNTGames/TNTGames.js'; +import Tourney from './Tourney/Tourney.js'; +import TurboKartRacers from '../MiniGames/TurboKartRacers/TurboKartRacers.js'; +import UHC from '../MiniGames/UHC/UHC.js'; +import VampireZ from '../MiniGames/VampireZ/VampireZ.js'; +import Walls from '../MiniGames/Walls.js'; +import Warlords from '../MiniGames/Warlords/Warlords.js'; +import WoolGames from '../MiniGames/WoolGames/WoolGames.js'; +import { ChatChannel, Language, LevelProgress, PlayerRank, PlayerStats, ScorpiusBribe } from '../../Types/Player.js'; +import { getRank, playerLevelProgress } from '../../Utils/PlayerUtils.js'; + +class Player { + uuid: string; + nickname: string; + rank: PlayerRank; + mvpPlusColor: Color | null; + mvpPlusPlusColor: Color | null; + gifting: Gifting; + socialMedia: SocialMedia[]; + firstLoginTimestamp: number; + firstLoginAt: Date; + lastLoginTimestamp: number | null; + lastLoginAt: Date | null; + achievements: PlayerAchievements; + language: Language; + channel: ChatChannel; + exp: number; + level: LevelProgress; + seasonal: Seasonal; + karma: number; + freeSkyblockCookie: number | null; + tourney: Tourney; + rewards: Rewards; + challenges: object; + parkour: Parkour[]; + housing: Housing; + cosmetics: Cosmetics; + scorpiusBribes: ScorpiusBribe[]; + quests: PlayerQuests; + guild: Guild | null; + houses: House[] | null; + recentGames: RecentGame[] | null; + stats: PlayerStats; + constructor( + data: Record, + extra: { guild: Guild | null; houses: House[] | null; recentGames: RecentGame[] | null } + ) { + this.uuid = data.uuid || ''; + this.nickname = data.displayname || ''; + this.rank = getRank(data); + this.mvpPlusColor = data.rankPlusColor ? new Color(data.rankPlusColor) : null; + this.mvpPlusPlusColor = data.monthlyRankColor ? new Color(data.monthlyRankColor) : null; + this.gifting = new Gifting(data?.giftingMeta || {}); + this.socialMedia = parseSocialMedia(data?.socialMedia?.links || {}); + this.firstLoginTimestamp = data?.firstLogin || 0; + this.firstLoginAt = new Date(this.firstLoginTimestamp); + this.lastLoginTimestamp = data?.lastLogin || null; + this.lastLoginAt = this.lastLoginTimestamp ? new Date(this.lastLoginTimestamp) : null; + this.achievements = new PlayerAchievements(data); + this.language = data?.userLanguage || 'ENGLISH'; + this.channel = data.channel || 'ALL'; + this.exp = data?.networkExp || 0; + this.level = playerLevelProgress(this.exp); + this.seasonal = new Seasonal(data?.seasonal || {}); + this.karma = data?.karma || 0; + this.freeSkyblockCookie = data?.skyblock_free_cookie || null; + this.tourney = new Tourney(data?.tourney || {}); + this.rewards = new Rewards(data); + this.challenges = data?.challenges || {}; + this.parkour = []; + Object.keys(data?.parkourCompletions || {}).map((location) => { + this.parkour.push(new Parkour(data?.parkourCompletions || {}, data?.parkourCheckpointBests || {}, location)); + }); + this.housing = new Housing(data?.housingMeta || {}); + this.cosmetics = new Cosmetics(data); + this.scorpiusBribes = []; + Object.keys(data) + .filter((key) => key.startsWith('scorpius_bribe_')) + .forEach((key) => { + this.scorpiusBribes.push({ year: Number(key), timestamp: data[key] }); + }); + this.quests = new PlayerQuests(data?.quests || {}, data?.questSettings?.autoActivate || false); + this.guild = extra.guild || null; + this.houses = extra.houses || null; + this.recentGames = extra.recentGames || null; + this.stats = { + arcade: new Arcade(data?.stats?.Arcade), + arenaBrawl: new ArenaBrawl(data?.stats?.Arena), + bedwars: new BedWars(data?.stats?.Bedwars), + blitzsg: new BlitzSurvivalGames(data?.stats?.HungerGames), + buildbattle: new BuildBattle(data?.stats?.BuildBattle), + copsandcrims: new CopsAndCrims(data?.stats?.MCGO), + duels: new Duels(data?.stats?.Duels), + megawalls: new MegaWalls(data?.stats?.Walls3), + murdermystery: new MurderMystery(data?.stats?.MurderMystery), + paintball: new Paintball(data?.stats?.Paintball), + pit: new Pit(data?.stats?.Pit), + quakecraft: new Quakecraft(data?.stats?.Quake), + skywars: new SkyWars(data?.stats?.SkyWars), + smashheroes: new SmashHeroes(data?.stats?.SuperSmash), + speeduhc: new SpeedUHC(data?.stats?.SpeedUHC), + tntgames: new TNTGames(data?.stats?.TNTGames), + turbokartracers: new TurboKartRacers(data?.stats?.GingerBread), + uhc: new UHC(data?.stats?.UHC), + vampirez: new VampireZ(data?.stats?.VampireZ), + walls: new Walls(data?.stats?.Walls), + warlords: new Warlords(data?.stats?.Battleground), + woolgames: new WoolGames(data?.stats?.WoolGames) + }; + } + + toString(): string { + return this.nickname; + } +} + +export default Player; diff --git a/src/Structures/Player/PlayerAchievements.test.ts b/src/Structures/Player/PlayerAchievements.test.ts new file mode 100644 index 000000000..d4ac1cdaa --- /dev/null +++ b/src/Structures/Player/PlayerAchievements.test.ts @@ -0,0 +1,23 @@ +import PlayerAchievements from './PlayerAchievements.js'; +import PlayerAchievementsRewards from './PlayerAchievementsRewards.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerAchievements', () => { + const data = new PlayerAchievements({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerAchievements); + expectTypeOf(data).toEqualTypeOf(); + expect(data.points).toBeDefined(); + expect(data.points).toBeGreaterThanOrEqual(0); + expectTypeOf(data.points).toEqualTypeOf(); + expect(data.rewards).toBeDefined(); + expectTypeOf(data.rewards).toEqualTypeOf(); + expect(data.tracking).toBeDefined(); + expectTypeOf(data.tracking).toEqualTypeOf(); + expect(data.achivements).toBeDefined(); + expectTypeOf(data.achivements).toEqualTypeOf>(); + expect(data.oneTime).toBeDefined(); + expectTypeOf(data.oneTime).toEqualTypeOf(); + expect(data.totem).toBeDefined(); + expectTypeOf(data.totem).toEqualTypeOf>(); +}); diff --git a/src/Structures/Player/PlayerAchievements.ts b/src/Structures/Player/PlayerAchievements.ts new file mode 100644 index 000000000..d441246a6 --- /dev/null +++ b/src/Structures/Player/PlayerAchievements.ts @@ -0,0 +1,20 @@ +import PlayerAchievementsRewards from './PlayerAchievementsRewards.js'; + +class PlayerAchievements { + points: number; + rewards: PlayerAchievementsRewards; + tracking: string[]; + achivements: Record; + oneTime: string[]; + totem: Record; + constructor(data: Record) { + this.points = data?.achievementPoints || 0; + this.rewards = new PlayerAchievementsRewards(data?.achievementRewardsNew || {}); + this.tracking = data?.achievementTracking || []; + this.achivements = data?.achievements || {}; + this.oneTime = data.achievementsOneTime || []; + this.totem = data?.achievementTotem || {}; + } +} + +export default PlayerAchievements; diff --git a/src/Structures/Player/PlayerAchievementsRewards.test.ts b/src/Structures/Player/PlayerAchievementsRewards.test.ts new file mode 100644 index 000000000..902e500a0 --- /dev/null +++ b/src/Structures/Player/PlayerAchievementsRewards.test.ts @@ -0,0 +1,9 @@ +import PlayerAchievementsRewards from './PlayerAchievementsRewards.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerAchievementsRewards', () => { + const data = new PlayerAchievementsRewards({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerAchievementsRewards); + expectTypeOf(data).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerAchievementsRewards.ts b/src/Structures/Player/PlayerAchievementsRewards.ts new file mode 100644 index 000000000..42c293bff --- /dev/null +++ b/src/Structures/Player/PlayerAchievementsRewards.ts @@ -0,0 +1,19 @@ +class PlayerAchievementsRewards { + [key: string]: number; + constructor(data: Record) { + Object.keys(data) + .filter((key) => key.startsWith('for_points_')) + .map((key) => ({ [key.replace('for_points_', '')]: data[key] })) + .sort((a, b) => { + const keyA = Object.keys(a)?.[0] || ''; + const keyB = Object.keys(b)?.[0] || ''; + return parseInt(keyA) - parseInt(keyB); + }) + .forEach((item) => { + const key: string = Object.keys(item)?.[0] || 'Unknown'; + this[key] = item[key]; + }); + } +} + +export default PlayerAchievementsRewards; diff --git a/src/Structures/Player/Quests/PlayerQuest.test.ts b/src/Structures/Player/Quests/PlayerQuest.test.ts new file mode 100644 index 000000000..10f84f7c0 --- /dev/null +++ b/src/Structures/Player/Quests/PlayerQuest.test.ts @@ -0,0 +1,14 @@ +import PlayerQuest from './PlayerQuest.js'; +import PlayerQuestCompletions from './PlayerQuestCompletions.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerQuest', () => { + const data = new PlayerQuest({ stats: 'meow' }, 'meow'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerQuest); + expectTypeOf(data).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.completions).toBeDefined(); + expectTypeOf(data.completions).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/Quests/PlayerQuest.ts b/src/Structures/Player/Quests/PlayerQuest.ts new file mode 100644 index 000000000..1c94b0888 --- /dev/null +++ b/src/Structures/Player/Quests/PlayerQuest.ts @@ -0,0 +1,12 @@ +import PlayerQuestCompletions from './PlayerQuestCompletions.js'; + +class PlayerQuest { + name: string; + completions: PlayerQuestCompletions; + constructor(data: Record, name: string) { + this.name = name; + this.completions = new PlayerQuestCompletions(data?.completions || []); + } +} + +export default PlayerQuest; diff --git a/src/Structures/Player/Quests/PlayerQuestCompletion.test.ts b/src/Structures/Player/Quests/PlayerQuestCompletion.test.ts new file mode 100644 index 000000000..ec9359c02 --- /dev/null +++ b/src/Structures/Player/Quests/PlayerQuestCompletion.test.ts @@ -0,0 +1,15 @@ +import PlayerQuestCompletion from './PlayerQuestCompletion.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerQuestCompletion', () => { + const data = new PlayerQuestCompletion({ time: 1688570159583 }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerQuestCompletion); + expectTypeOf(data).toEqualTypeOf(); + expect(data.amount).toBeDefined(); + expectTypeOf(data.amount).toEqualTypeOf(); + expect(data.timestamp).toBeDefined(); + expectTypeOf(data.timestamp).toEqualTypeOf(); + expect(data.timestampAt).toBeDefined(); + expectTypeOf(data.timestampAt).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/Quests/PlayerQuestCompletion.ts b/src/Structures/Player/Quests/PlayerQuestCompletion.ts new file mode 100644 index 000000000..94508be72 --- /dev/null +++ b/src/Structures/Player/Quests/PlayerQuestCompletion.ts @@ -0,0 +1,12 @@ +class PlayerQuestCompletion { + amount: number; + timestamp: number; + timestampAt: Date; + constructor(data: Record) { + this.amount = data.length || 0; + this.timestamp = data?.time || 0; + this.timestampAt = new Date(this.timestamp); + } +} + +export default PlayerQuestCompletion; diff --git a/src/Structures/Player/Quests/PlayerQuestCompletions.test.ts b/src/Structures/Player/Quests/PlayerQuestCompletions.test.ts new file mode 100644 index 000000000..265d77dea --- /dev/null +++ b/src/Structures/Player/Quests/PlayerQuestCompletions.test.ts @@ -0,0 +1,15 @@ +import PlayerQuestCompletion from './PlayerQuestCompletion.js'; +import PlayerQuestCompletions from './PlayerQuestCompletions.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerQuestCompletions', () => { + const data = new PlayerQuestCompletions([{ time: 1688570159583 }]); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerQuestCompletions); + expectTypeOf(data).toEqualTypeOf(); + expect(data.amount).toBeDefined(); + expect(data.amount).toBeGreaterThanOrEqual(0); + expectTypeOf(data.amount).toEqualTypeOf(); + expect(data.completions).toBeDefined(); + expectTypeOf(data.completions).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/Quests/PlayerQuestCompletions.ts b/src/Structures/Player/Quests/PlayerQuestCompletions.ts new file mode 100644 index 000000000..565517b0f --- /dev/null +++ b/src/Structures/Player/Quests/PlayerQuestCompletions.ts @@ -0,0 +1,15 @@ +import PlayerQuestCompletion from './PlayerQuestCompletion.js'; + +class PlayerQuestCompletions { + amount: number; + completions: PlayerQuestCompletion[]; + constructor(data: Record[]) { + this.amount = data.length || 0; + this.completions = []; + data.forEach((completion: Record) => { + this.completions.push(new PlayerQuestCompletion(completion)); + }); + } +} + +export default PlayerQuestCompletions; diff --git a/src/Structures/Player/Quests/PlayerQuests.test.ts b/src/Structures/Player/Quests/PlayerQuests.test.ts new file mode 100644 index 000000000..c350fce2c --- /dev/null +++ b/src/Structures/Player/Quests/PlayerQuests.test.ts @@ -0,0 +1,14 @@ +import PlayerQuest from './PlayerQuest.js'; +import PlayerQuests from './PlayerQuests.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerQuests', () => { + const data = new PlayerQuests({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerQuests); + expectTypeOf(data).toEqualTypeOf(); + expect(data.quests).toBeDefined(); + expectTypeOf(data.quests).toEqualTypeOf(); + expect(data.autoActivate).toBeDefined(); + expectTypeOf(data.autoActivate).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/Quests/PlayerQuests.ts b/src/Structures/Player/Quests/PlayerQuests.ts new file mode 100644 index 000000000..46e606568 --- /dev/null +++ b/src/Structures/Player/Quests/PlayerQuests.ts @@ -0,0 +1,15 @@ +import PlayerQuest from './PlayerQuest.js'; + +class PlayerQuests { + quests: PlayerQuest[]; + autoActivate: boolean; + constructor(data: Record, autoActivate: boolean = false) { + this.quests = []; + Object.keys(data).forEach((quest) => { + this.quests.push(new PlayerQuest(data[quest], quest)); + }); + this.autoActivate = autoActivate; + } +} + +export default PlayerQuests; diff --git a/src/Structures/Player/Rewards.test.ts b/src/Structures/Player/Rewards.test.ts new file mode 100644 index 000000000..bc0d5095a --- /dev/null +++ b/src/Structures/Player/Rewards.test.ts @@ -0,0 +1,28 @@ +import MonthlyCrate from './MonthlyCrate.js'; +import Rewards from './Rewards.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Rewards', () => { + const data = new Rewards({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Rewards); + expectTypeOf(data).toEqualTypeOf(); + expect(data.lastAdsenseGenerateTime).toBeDefined(); + expectTypeOf(data.lastAdsenseGenerateTime).toEqualTypeOf(); + expect(data.lastClaimedReward).toBeDefined(); + expectTypeOf(data.lastClaimedReward).toEqualTypeOf(); + expect(data.rewardHighScore).toBeDefined(); + expectTypeOf(data.rewardHighScore).toEqualTypeOf(); + expect(data.rewardScore).toBeDefined(); + expectTypeOf(data.rewardScore).toEqualTypeOf(); + expect(data.rewardStreak).toBeDefined(); + expectTypeOf(data.rewardStreak).toEqualTypeOf(); + expect(data.rewardTokens).toBeDefined(); + expectTypeOf(data.rewardTokens).toEqualTypeOf(); + expect(data.totalDailyRewards).toBeDefined(); + expectTypeOf(data.totalDailyRewards).toEqualTypeOf(); + expect(data.totalRewards).toBeDefined(); + expectTypeOf(data.totalRewards).toEqualTypeOf(); + expect(data.monthlyCrates).toBeDefined(); + expectTypeOf(data.monthlyCrates).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/Rewards.ts b/src/Structures/Player/Rewards.ts new file mode 100644 index 000000000..d20902efb --- /dev/null +++ b/src/Structures/Player/Rewards.ts @@ -0,0 +1,29 @@ +import MonthlyCrate from './MonthlyCrate.js'; + +class Rewards { + lastAdsenseGenerateTime: number; + lastClaimedReward: number; + rewardHighScore: number; + rewardScore: number; + rewardStreak: number; + rewardTokens: number; + totalDailyRewards: number; + totalRewards: number; + monthlyCrates: MonthlyCrate[]; + constructor(data: Record) { + this.lastAdsenseGenerateTime = data.lastAdsenseGenerateTime || 0; + this.lastClaimedReward = data.lastClaimedReward || 0; + this.rewardHighScore = data.rewardHighScore || 0; + this.rewardScore = data.rewardScore || 0; + this.rewardStreak = data.rewardStreak || 0; + this.rewardTokens = data.adsence_tokens || 0; + this.totalDailyRewards = data.totalDailyRewards || 0; + this.totalRewards = data.totalRewards || 0; + this.monthlyCrates = []; + Object.keys(data?.monthlycrates || {}).forEach((key) => + this.monthlyCrates.push(new MonthlyCrate(data?.monthlycrates?.[key], key)) + ); + } +} + +export default Rewards; diff --git a/src/Structures/Player/Seasonal/Season.test.ts b/src/Structures/Player/Seasonal/Season.test.ts new file mode 100644 index 000000000..e48173c19 --- /dev/null +++ b/src/Structures/Player/Seasonal/Season.test.ts @@ -0,0 +1,15 @@ +import Season from './Season.js'; +import SeasonYear from './SeasonYear.js'; +import { SeasonName } from '../../../Types/Player.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Season', () => { + const data = new Season({ stats: 'meow' }, 'anniversary'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Season); + expectTypeOf(data).toEqualTypeOf(); + expect(data.season).toBeDefined(); + expectTypeOf(data.season).toEqualTypeOf(); + expect(data.years).toBeDefined(); + expectTypeOf(data.years).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/Seasonal/Season.ts b/src/Structures/Player/Seasonal/Season.ts new file mode 100644 index 000000000..49d21cf2d --- /dev/null +++ b/src/Structures/Player/Seasonal/Season.ts @@ -0,0 +1,14 @@ +import SeasonYear from './SeasonYear.js'; +import { SeasonName } from '../../../Types/Player.js'; + +class Season { + season: SeasonName; + years: SeasonYear[]; + constructor(data: Record, season: SeasonName) { + this.season = season; + this.years = []; + Object.keys(data).forEach((key) => this.years.push(new SeasonYear(data?.[key], key))); + } +} + +export default Season; diff --git a/src/Structures/Player/Seasonal/SeasonBingo.test.ts b/src/Structures/Player/Seasonal/SeasonBingo.test.ts new file mode 100644 index 000000000..5be9e7411 --- /dev/null +++ b/src/Structures/Player/Seasonal/SeasonBingo.test.ts @@ -0,0 +1,16 @@ +import SeasonBingo from './SeasonBingo.js'; +import SeasonBingoTier from './SeasonBingoTier.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SeasonBingo', () => { + const data = new SeasonBingo({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SeasonBingo); + expectTypeOf(data).toEqualTypeOf(); + expect(data.easy).toBeDefined(); + expectTypeOf(data.easy).toEqualTypeOf(); + expect(data.medium).toBeDefined(); + expectTypeOf(data.medium).toEqualTypeOf(); + expect(data.hard).toBeDefined(); + expectTypeOf(data.hard).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/Seasonal/SeasonBingo.ts b/src/Structures/Player/Seasonal/SeasonBingo.ts new file mode 100644 index 000000000..a935a3208 --- /dev/null +++ b/src/Structures/Player/Seasonal/SeasonBingo.ts @@ -0,0 +1,14 @@ +import SeasonBingoTier from './SeasonBingoTier.js'; + +class SeasonBingo { + easy: SeasonBingoTier | null; + medium: SeasonBingoTier | null; + hard: SeasonBingoTier | null; + constructor(data: Record) { + this.easy = data.easy ? new SeasonBingoTier(data.easy) : null; + this.medium = data.medium ? new SeasonBingoTier(data.medium) : null; + this.hard = data.hard ? new SeasonBingoTier(data.hard) : null; + } +} + +export default SeasonBingo; diff --git a/src/Structures/Player/Seasonal/SeasonBingoTier.test.ts b/src/Structures/Player/Seasonal/SeasonBingoTier.test.ts new file mode 100644 index 000000000..917cafd95 --- /dev/null +++ b/src/Structures/Player/Seasonal/SeasonBingoTier.test.ts @@ -0,0 +1,13 @@ +import SeasonBingoTier from './SeasonBingoTier.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SeasonBingoTier', () => { + const data = new SeasonBingoTier({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SeasonBingoTier); + expectTypeOf(data).toEqualTypeOf(); + expect(data.objectives).toBeDefined(); + expectTypeOf(data.objectives).toEqualTypeOf>(); + expect(data.rewards).toBeDefined(); + expectTypeOf(data.rewards).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/Seasonal/SeasonBingoTier.ts b/src/Structures/Player/Seasonal/SeasonBingoTier.ts new file mode 100644 index 000000000..7e9786b9e --- /dev/null +++ b/src/Structures/Player/Seasonal/SeasonBingoTier.ts @@ -0,0 +1,10 @@ +class SeasonBingoTier { + objectives: Record; + rewards: string[]; + constructor(data: Record) { + this.objectives = data.objectives || {}; + this.rewards = data.rewards || []; + } +} + +export default SeasonBingoTier; diff --git a/src/Structures/Player/Seasonal/SeasonYear.test.ts b/src/Structures/Player/Seasonal/SeasonYear.test.ts new file mode 100644 index 000000000..0cf1c7b5a --- /dev/null +++ b/src/Structures/Player/Seasonal/SeasonYear.test.ts @@ -0,0 +1,22 @@ +import SeasonBingo from './SeasonBingo.js'; +import SeasonYear from './SeasonYear.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SeasonYear', () => { + const data = new SeasonYear({ stats: 'meow' }, '100'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SeasonYear); + expectTypeOf(data).toEqualTypeOf(); + expect(data.year).toBeDefined(); + expectTypeOf(data.year).toEqualTypeOf(); + expect(data.experience).toBeDefined(); + expectTypeOf(data.experience).toEqualTypeOf(); + expect(data.season).toBeDefined(); + expectTypeOf(data.season).toEqualTypeOf>(); + expect(data.bingo).toBeDefined(); + expectTypeOf(data.bingo).toEqualTypeOf(); + expect(data.adventRewards).toBeDefined(); + expectTypeOf(data.adventRewards).toEqualTypeOf | null>(); + expect(data.presents).toBeDefined(); + expectTypeOf(data.presents).toEqualTypeOf | null>(); +}); diff --git a/src/Structures/Player/Seasonal/SeasonYear.ts b/src/Structures/Player/Seasonal/SeasonYear.ts new file mode 100644 index 000000000..18be4b36c --- /dev/null +++ b/src/Structures/Player/Seasonal/SeasonYear.ts @@ -0,0 +1,20 @@ +import SeasonBingo from './SeasonBingo.js'; + +class SeasonYear { + year: number; + experience: number; + season: Record; + bingo: SeasonBingo | null; + adventRewards: Record | null; + presents: Record | null; + constructor(data: Record, year: string) { + this.year = Number(year); + this.experience = data?.leveling?.experience || 0; + this.season = data.season || {}; + this.bingo = data.bingo ? new SeasonBingo(data.bingo) : null; + this.adventRewards = data.adventRewards ? data.adventRewards : null; + this.presents = data.presents ? data.presents : null; + } +} + +export default SeasonYear; diff --git a/src/Structures/Player/Seasonal/Seasonal.test.ts b/src/Structures/Player/Seasonal/Seasonal.test.ts new file mode 100644 index 000000000..3c7399d34 --- /dev/null +++ b/src/Structures/Player/Seasonal/Seasonal.test.ts @@ -0,0 +1,23 @@ +import Season from './Season.js'; +import Seasonal from './Seasonal.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Seasonal', () => { + const data = new Seasonal({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Seasonal); + expectTypeOf(data).toEqualTypeOf(); + expect(data.silver).toBeDefined(); + expect(data.silver).toBeGreaterThanOrEqual(0); + expectTypeOf(data.silver).toEqualTypeOf(); + expect(data.anniversary).toBeDefined(); + expectTypeOf(data.anniversary).toEqualTypeOf(); + expect(data.christmas).toBeDefined(); + expectTypeOf(data.christmas).toEqualTypeOf(); + expect(data.easter).toBeDefined(); + expectTypeOf(data.easter).toEqualTypeOf(); + expect(data.halloween).toBeDefined(); + expectTypeOf(data.halloween).toEqualTypeOf(); + expect(data.summer).toBeDefined(); + expectTypeOf(data.summer).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/Seasonal/Seasonal.ts b/src/Structures/Player/Seasonal/Seasonal.ts new file mode 100644 index 000000000..c11dbb8fb --- /dev/null +++ b/src/Structures/Player/Seasonal/Seasonal.ts @@ -0,0 +1,20 @@ +import Season from './Season.js'; + +class Seasonal { + silver: number; + anniversary: Season; + christmas: Season; + easter: Season; + halloween: Season; + summer: Season; + constructor(data: Record) { + this.silver = data.silver || 0; + this.anniversary = new Season(data?.anniversary || {}, 'anniversary'); + this.christmas = new Season(data?.christmas || {}, 'christmas'); + this.easter = new Season(data?.easter || {}, 'easter'); + this.halloween = new Season(data?.halloween || {}, 'halloween'); + this.summer = new Season(data?.summer || {}, 'summer'); + } +} + +export default Seasonal; diff --git a/src/Structures/Player/SocialMedia.test.ts b/src/Structures/Player/SocialMedia.test.ts new file mode 100644 index 000000000..61b61bdd7 --- /dev/null +++ b/src/Structures/Player/SocialMedia.test.ts @@ -0,0 +1,14 @@ +import SocialMedia from './SocialMedia.js'; +import { SocialMediaId } from '../../Types/Player.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SocialMedia', () => { + const data = new SocialMedia({ id: 'DISCORD', link: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SocialMedia); + expectTypeOf(data).toEqualTypeOf(); + expect(data.id).toBeDefined(); + expectTypeOf(data.id).toEqualTypeOf(); + expect(data.link).toBeDefined(); + expectTypeOf(data.link).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/SocialMedia.ts b/src/Structures/Player/SocialMedia.ts new file mode 100644 index 000000000..3035a91e2 --- /dev/null +++ b/src/Structures/Player/SocialMedia.ts @@ -0,0 +1,18 @@ +import { SocialMediaId } from '../../Types/Player.js'; + +class SocialMedia { + id: SocialMediaId; + link: string; + constructor(data: { id: SocialMediaId; link: string }) { + this.id = data.id; + this.link = data.link; + } +} + +export function parseSocialMedia(data: Record): SocialMedia[] { + return Object.keys(data).map( + (media) => new SocialMedia({ id: media as SocialMediaId, link: data[media as SocialMediaId] }) + ); +} + +export default SocialMedia; diff --git a/src/Structures/Player/Tourney/Tourney.test.ts b/src/Structures/Player/Tourney/Tourney.test.ts new file mode 100644 index 000000000..95fb26dba --- /dev/null +++ b/src/Structures/Player/Tourney/Tourney.test.ts @@ -0,0 +1,20 @@ +import Tourney from './Tourney.js'; +import TourneyData from './TourneyData.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Tourney', () => { + const data = new Tourney({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Tourney); + expectTypeOf(data).toEqualTypeOf(); + expect(data.firstJoinLobby).toBeDefined(); + expectTypeOf(data.firstJoinLobby).toEqualTypeOf(); + expect(data.totalTributes).toBeDefined(); + expectTypeOf(data.totalTributes).toEqualTypeOf(); + expect(data.shopSort).toBeDefined(); + expectTypeOf(data.shopSort).toEqualTypeOf(); + expect(data.hidePurchased).toBeDefined(); + expectTypeOf(data.hidePurchased).toEqualTypeOf(); + expect(data.turneyData).toBeDefined(); + expectTypeOf(data.turneyData).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/Tourney/Tourney.ts b/src/Structures/Player/Tourney/Tourney.ts new file mode 100644 index 000000000..8654e110f --- /dev/null +++ b/src/Structures/Player/Tourney/Tourney.ts @@ -0,0 +1,21 @@ +import TourneyData from './TourneyData.js'; + +class Tourney { + firstJoinLobby: string | null; + totalTributes: number; + shopSort: string; + hidePurchased: boolean; + turneyData: TourneyData[]; + constructor(data: Record) { + this.firstJoinLobby = data.first_join_lobby || null; + this.totalTributes = data.total_tributes || 0; + this.shopSort = data.shop_sort || ''; + this.hidePurchased = data.hide_purchased || false; + this.turneyData = []; + Object.keys(data) + .filter((key) => ['first_join_lobby', 'total_tributes', 'shop_sort', 'hide_purchased'].includes(key)) + .forEach((key) => this.turneyData.push(new TourneyData(data[key]))); + } +} + +export default Tourney; diff --git a/src/Structures/Player/Tourney/TourneyData.test.ts b/src/Structures/Player/Tourney/TourneyData.test.ts new file mode 100644 index 000000000..1cacbc73e --- /dev/null +++ b/src/Structures/Player/Tourney/TourneyData.test.ts @@ -0,0 +1,21 @@ +import TourneyData from './TourneyData.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('TourneyData', () => { + const data = new TourneyData({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(TourneyData); + expectTypeOf(data).toEqualTypeOf(); + expect(data.playtime).toBeDefined(); + expect(data.playtime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playtime).toEqualTypeOf(); + expect(data.tributes).toBeDefined(); + expect(data.tributes).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tributes).toEqualTypeOf(); + expect(data.firstWin).toBeDefined(); + expect(data.firstWin).toBeGreaterThanOrEqual(0); + expectTypeOf(data.firstWin).toEqualTypeOf(); + expect(data.claimedReward).toBeDefined(); + expect(data.claimedReward).toBeGreaterThanOrEqual(0); + expectTypeOf(data.claimedReward).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/Tourney/TourneyData.ts b/src/Structures/Player/Tourney/TourneyData.ts new file mode 100644 index 000000000..047f032ed --- /dev/null +++ b/src/Structures/Player/Tourney/TourneyData.ts @@ -0,0 +1,14 @@ +class TourneyData { + playtime: number; + tributes: number; + firstWin: number; + claimedReward: number; + constructor(data: Record) { + this.playtime = data.playtime || 0; + this.tributes = data.tributes_earned || 0; + this.firstWin = data.first_win || 0; + this.claimedReward = data.claimed_ranking_reward || 0; + } +} + +export default TourneyData; diff --git a/src/Structures/RecentGame.ts b/src/Structures/RecentGame.ts new file mode 100644 index 000000000..335ba990f --- /dev/null +++ b/src/Structures/RecentGame.ts @@ -0,0 +1,28 @@ +import Game from './Game.js'; + +class RecentGame { + game: Game | null; + dateTimestamp: number | null; + dateAt: Date | null; + mode: string | null; + map: string | null; + ongoing: boolean; + endedTimestamp: number | null; + endedAt: Date | null; + constructor(data: Record) { + this.game = data?.gameType ? new Game(data.gameType) : null; + this.dateTimestamp = data?.date || null; + this.dateAt = this.dateTimestamp ? new Date(this.dateTimestamp) : null; + this.mode = data?.mode || null; + this.map = data?.map || null; + this.ongoing = Boolean(!data?.ended || 0) || false; + this.endedTimestamp = data?.ended ? data?.ended : null; + this.endedAt = this.endedTimestamp ? new Date(this.endedTimestamp) : null; + } + + toString(): string | null { + return this.mode; + } +} + +export default RecentGame; diff --git a/src/Structures/RecentGames.test.ts b/src/Structures/RecentGames.test.ts new file mode 100644 index 000000000..37e68e849 --- /dev/null +++ b/src/Structures/RecentGames.test.ts @@ -0,0 +1,29 @@ +import Game from './Game.js'; +import RecentGame from './RecentGame.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('RecentGame', () => { + const data = new RecentGame({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RecentGame); + expectTypeOf(data).toEqualTypeOf(); + expect(data.game).toBeDefined(); + expectTypeOf(data.game).toEqualTypeOf(); + expect(data.dateTimestamp).toBeDefined(); + expectTypeOf(data.dateTimestamp).toEqualTypeOf(); + expect(data.dateAt).toBeDefined(); + expectTypeOf(data.dateAt).toEqualTypeOf(); + expect(data.mode).toBeDefined(); + expectTypeOf(data.mode).toEqualTypeOf(); + expect(data.map).toBeDefined(); + expectTypeOf(data.map).toEqualTypeOf(); + expect(data.ongoing).toBeDefined(); + expectTypeOf(data.ongoing).toEqualTypeOf(); + expect(data.endedTimestamp).toBeDefined(); + expectTypeOf(data.endedTimestamp).toEqualTypeOf(); + expect(data.endedAt).toBeDefined(); + expectTypeOf(data.endedAt).toEqualTypeOf(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.mode); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Auctions/Auction.ts b/src/Structures/SkyBlock/Auctions/Auction.ts new file mode 100644 index 000000000..7b7d81f8b --- /dev/null +++ b/src/Structures/SkyBlock/Auctions/Auction.ts @@ -0,0 +1,43 @@ +import BaseAuction from './BaseAuction.js'; +import Bid from './Bid.js'; +import { Rarity } from '../../../Types/Skyblock.js'; + +class Auction extends BaseAuction { + coop: string[]; + auctionStartTimestamp: number; + auctionStart: Date; + auctionEndTimestamp: number | null; + auctionEnd: Date | null; + item: string; + itemLore: string; + itemLoreRaw: string; + rarity: Rarity; + startingBid: number; + highestBid: number; + bids: Bid[]; + claimed: boolean; + claimedBidders: string[]; + constructor(data: Record, includeItemBytes: boolean = false) { + super(data, includeItemBytes); + this.coop = data.coop || []; + this.auctionStartTimestamp = data.start; + this.auctionStart = new Date(this.auctionStartTimestamp); + this.auctionEndTimestamp = data.end || null; + this.auctionEnd = this.auctionEndTimestamp ? new Date(this.auctionEndTimestamp) : null; + this.item = data.item_name || null; + this.itemLore = data.item_lore ? data.item_lore.replace(/§([1-9]|[a-l])|§/gm, '') : null; + this.itemLoreRaw = data.item_lore || null; + this.rarity = data.tier || null; + this.startingBid = data.starting_bid || 0; + this.highestBid = this.bin ? data.starting_bid : data.highest_bid_amount || 0; + this.bids = data.bids.length ? data.bids.map((b: any) => new Bid(b)) : []; + this.claimed = data.claimed || false; + this.claimedBidders = this.claimed ? data.claimed_bidders : []; + } + + toString(): string { + return this.item; + } +} + +export default Auction; diff --git a/src/Structures/SkyBlock/Auctions/AuctionInfo.ts b/src/Structures/SkyBlock/Auctions/AuctionInfo.ts new file mode 100644 index 000000000..a133f1785 --- /dev/null +++ b/src/Structures/SkyBlock/Auctions/AuctionInfo.ts @@ -0,0 +1,16 @@ +class AuctionInfo { + page: number; + totalPages: number; + totalAuctions: number; + lastUpdatedTimestamp: number; + lastUpdatedAt: Date; + constructor(data: Record) { + this.page = parseInt(data.page, 10); + this.totalPages = parseInt(data.totalPages, 10); + this.totalAuctions = parseInt(data.totalAuctions, 10); + this.lastUpdatedTimestamp = data.lastUpdated; + this.lastUpdatedAt = new Date(this.lastUpdatedTimestamp); + } +} + +export default AuctionInfo; diff --git a/src/Structures/SkyBlock/Auctions/BaseAuction.test.ts b/src/Structures/SkyBlock/Auctions/BaseAuction.test.ts new file mode 100644 index 000000000..0a5d88457 --- /dev/null +++ b/src/Structures/SkyBlock/Auctions/BaseAuction.test.ts @@ -0,0 +1,22 @@ +import BaseAuction from './BaseAuction.js'; +import ItemBytes from '../../ItemBytes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BaseAuction', () => { + const data = new BaseAuction({ stats: 'meow' }, false); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BaseAuction); + expectTypeOf(data).toEqualTypeOf(); + expect(data.auctionId).toBeDefined(); + expectTypeOf(data.auctionId).toEqualTypeOf(); + expect(data.auctioneerUuid).toBeDefined(); + expectTypeOf(data.auctioneerUuid).toEqualTypeOf(); + expect(data.auctioneerProfile).toBeDefined(); + expectTypeOf(data.auctioneerProfile).toEqualTypeOf(); + expect(data.bin).toBeDefined(); + expectTypeOf(data.bin).toEqualTypeOf(); + expect(data.itemBytes).toBeDefined(); + expectTypeOf(data.itemBytes).toEqualTypeOf(); + expect(data.toString()).toBeDefined(); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Auctions/BaseAuction.ts b/src/Structures/SkyBlock/Auctions/BaseAuction.ts new file mode 100644 index 000000000..edbfa30ea --- /dev/null +++ b/src/Structures/SkyBlock/Auctions/BaseAuction.ts @@ -0,0 +1,22 @@ +import ItemBytes from '../../ItemBytes.js'; + +class BaseAuction { + auctionId: string | null; + auctioneerUuid: string | null; + auctioneerProfile: string | null; + bin: boolean; + itemBytes: ItemBytes | null; + constructor(data: Record, includeItemBytes: boolean) { + this.auctionId = data.uuid || data.auction_id || null; + this.auctioneerUuid = data.auctioneer || data.seller || null; + this.auctioneerProfile = data.profile_id || data.seller_profile || null; + this.bin = data.bin || false; + this.itemBytes = includeItemBytes ? new ItemBytes(data.item_bytes) : null; + } + + toString(): string | null { + return this.auctionId; + } +} + +export default BaseAuction; diff --git a/src/Structures/SkyBlock/Auctions/Bid.ts b/src/Structures/SkyBlock/Auctions/Bid.ts new file mode 100644 index 000000000..8bfaae1f6 --- /dev/null +++ b/src/Structures/SkyBlock/Auctions/Bid.ts @@ -0,0 +1,22 @@ +class Bid { + auctionId: string; + profileId: string; + amount: number; + timestamp: number; + at: Date; + bidder: string; + constructor(data: Record) { + this.auctionId = data.auction_id; + this.profileId = data.profile_id; + this.amount = data.amount; + this.timestamp = data.timestamp; + this.at = new Date(this.timestamp); + this.bidder = data.bidder; + } + + toString(): string { + return `${this.bidder} bid ${this.amount} coins`; + } +} + +export default Bid; diff --git a/src/Structures/SkyBlock/Bazaar/Order.test.ts b/src/Structures/SkyBlock/Bazaar/Order.test.ts new file mode 100644 index 000000000..87884a135 --- /dev/null +++ b/src/Structures/SkyBlock/Bazaar/Order.test.ts @@ -0,0 +1,24 @@ +import Order from './Order.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Order', () => { + const data = new Order({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Order); + expectTypeOf(data).toEqualTypeOf(); + expect(data.amount).toBeDefined(); + expect(data.amount).toBeGreaterThanOrEqual(0); + expectTypeOf(data.amount).toEqualTypeOf(); + expect(data.pricePerUnit).toBeDefined(); + expect(data.pricePerUnit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pricePerUnit).toEqualTypeOf(); + expect(data.totalPrice).toBeDefined(); + expect(data.totalPrice).toBeGreaterThanOrEqual(0); + expectTypeOf(data.totalPrice).toEqualTypeOf(); + expect(data.orders).toBeDefined(); + expect(data.orders).toBeGreaterThanOrEqual(0); + expectTypeOf(data.orders).toEqualTypeOf(); + expect(data.toString()).toBeDefined(); + expectTypeOf(data.toString()).toEqualTypeOf(); + expect(data.toString()).toBe(data.totalPrice); +}); diff --git a/src/Structures/SkyBlock/Bazaar/Order.ts b/src/Structures/SkyBlock/Bazaar/Order.ts new file mode 100644 index 000000000..00dcf54f4 --- /dev/null +++ b/src/Structures/SkyBlock/Bazaar/Order.ts @@ -0,0 +1,18 @@ +class Order { + amount: number; + pricePerUnit: number; + totalPrice: number; + orders: number; + constructor(data: Record) { + this.amount = data.amount || 0; + this.pricePerUnit = data.pricePerUnit || 0; + this.totalPrice = Math.round(this.amount * this.pricePerUnit * 10) / 10; + this.orders = data.orders || 0; + } + + toString(): number { + return this.totalPrice; + } +} + +export default Order; diff --git a/src/Structures/SkyBlock/Bazaar/Product.test.ts b/src/Structures/SkyBlock/Bazaar/Product.test.ts new file mode 100644 index 000000000..34196588d --- /dev/null +++ b/src/Structures/SkyBlock/Bazaar/Product.test.ts @@ -0,0 +1,50 @@ +import Product from './Product.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Product', () => { + const data = new Product({ + /* eslint-disable camelcase */ + product_id: 'INK_SACK:3', + sell_summary: [ + { amount: 133865, pricePerUnit: 1.4, orders: 2 }, + { amount: 816353, pricePerUnit: 1.3, orders: 12 }, + { amount: 71680, pricePerUnit: 1.1, orders: 3 } + ], + buy_summary: [ + { amount: 46654, pricePerUnit: 4, orders: 1 }, + { amount: 71680, pricePerUnit: 5.5, orders: 1 }, + { amount: 20657, pricePerUnit: 6.9, orders: 2 }, + { amount: 30618, pricePerUnit: 7, orders: 2 }, + { amount: 53616, pricePerUnit: 7.6, orders: 1 }, + { amount: 249908, pricePerUnit: 7.7, orders: 4 }, + { amount: 203944, pricePerUnit: 7.8, orders: 12 }, + { amount: 36816, pricePerUnit: 7.9, orders: 1 }, + { amount: 92527, pricePerUnit: 8, orders: 5 }, + { amount: 53129, pricePerUnit: 8.3, orders: 2 }, + { amount: 11165, pricePerUnit: 8.4, orders: 1 }, + { amount: 184653, pricePerUnit: 8.5, orders: 4 }, + { amount: 22548, pricePerUnit: 8.6, orders: 1 }, + { amount: 949628, pricePerUnit: 8.7, orders: 14 }, + { amount: 81014, pricePerUnit: 8.8, orders: 2 }, + { amount: 13239, pricePerUnit: 8.9, orders: 2 }, + { amount: 351416, pricePerUnit: 9.7, orders: 6 }, + { amount: 779336, pricePerUnit: 9.8, orders: 12 } + ], + quick_status: { + productId: 'INK_SACK:3', + sellPrice: 1.4, + sellVolume: 1421724, + sellMovingWeek: 85720502, + sellOrders: 24, + buyPrice: 5.204576555316532, + buyVolume: 6646255, + buyMovingWeek: 39972807, + buyOrders: 152 + } + /* eslint-enable camelcase */ + }); + + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Product); + expectTypeOf(data).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Bazaar/Product.ts b/src/Structures/SkyBlock/Bazaar/Product.ts new file mode 100644 index 000000000..02ee5743b --- /dev/null +++ b/src/Structures/SkyBlock/Bazaar/Product.ts @@ -0,0 +1,26 @@ +import Order from './Order.js'; +import type { ProductStatus } from '../../../Types/Skyblock.js'; + +class Product { + productId: string; + sellSummary: Order[]; + buySummary: Order[]; + status: ProductStatus; + constructor(data: Record) { + this.productId = data.product_id; + this.sellSummary = data.sell_summary.map((sellOrder: Record) => new Order(sellOrder)); + this.buySummary = data.buy_summary.map((buyOrder: Record) => new Order(buyOrder)); + this.status = { + sellPrice: Math.round(data.quick_status.sellPrice * 100) / 100, + buyPrice: Math.round(data.quick_status.buyPrice * 100) / 100, + sellVolume: data.quick_status.sellVolume, + buyVolume: data.quick_status.buyVolume, + sellMovingWeek: data.quick_status.sellMovingWeek, + buyMovingWeek: data.quick_status.buyMovingWeek, + sellOrders: data.quick_status.sellOrders, + buyOrders: data.quick_status.buyOrders + }; + } +} + +export default Product; diff --git a/src/Structures/SkyBlock/News/SkyblockNews.ts b/src/Structures/SkyBlock/News/SkyblockNews.ts new file mode 100644 index 000000000..fc4d41fdb --- /dev/null +++ b/src/Structures/SkyBlock/News/SkyblockNews.ts @@ -0,0 +1,35 @@ +const dateRegExp = /(\d{1,2})(?:st|nd|rd|th|) ([A-Za-z]+) (\d+)/; +const versionRegExp = /v\d+(\.\d+){1,}/; + +function parseDate(stringDate: string): Date | null { + const matched = stringDate.match(dateRegExp); + if (!matched) return null; + return new Date(matched.slice(1).join(' ')); +} + +function parseVer(stringVer: string): string | null { + const matches = versionRegExp.exec(stringVer); + if (!matches?.length) return null; + return matches[0]; +} + +class SkyblockNews { + title: string; + link: string; + rawDate: string; + date: Date | null; + version: string | null; + constructor(data: Record) { + this.title = data.title; + this.link = data.link; + this.rawDate = data.text; + this.date = parseDate(data.text); + this.version = parseVer(this.title); + } + + toString(): string { + return this.title; + } +} + +export default SkyblockNews; diff --git a/src/Structures/SkyBlock/SkyblockGarden.test.ts b/src/Structures/SkyBlock/SkyblockGarden.test.ts new file mode 100644 index 000000000..77cb51aab --- /dev/null +++ b/src/Structures/SkyBlock/SkyblockGarden.test.ts @@ -0,0 +1,30 @@ +import SkyblockGarden from './SkyblockGarden.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { + SkillLevel, + SkyblockGardenComposter, + SkyblockGardenCropMilestones, + SkyblockGardenVisitor, + SkyblockGarenCrops +} from '../../Types/Skyblock.js'; + +test('SkyblockGarden', () => { + const data = new SkyblockGarden({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyblockGarden); + expectTypeOf(data).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.barnSkin).toBeDefined(); + expectTypeOf(data.barnSkin).toEqualTypeOf(); + expect(data.unlockedPlots).toBeDefined(); + expectTypeOf(data.unlockedPlots).toEqualTypeOf(); + expect(data.visitors).toBeDefined(); + expectTypeOf(data.visitors).toEqualTypeOf(); + expect(data.cropMilestones).toBeDefined(); + expectTypeOf(data.cropMilestones).toEqualTypeOf(); + expect(data.composter).toBeDefined(); + expectTypeOf(data.composter).toEqualTypeOf(); + expect(data.cropUpgrades).toBeDefined(); + expectTypeOf(data.cropUpgrades).toEqualTypeOf(); +}); diff --git a/src/structures/SkyBlock/SkyblockGarden.js b/src/Structures/SkyBlock/SkyblockGarden.ts similarity index 52% rename from src/structures/SkyBlock/SkyblockGarden.js rename to src/Structures/SkyBlock/SkyblockGarden.ts index f4f824a22..773ed8689 100644 --- a/src/structures/SkyBlock/SkyblockGarden.js +++ b/src/Structures/SkyBlock/SkyblockGarden.ts @@ -1,32 +1,24 @@ -const { getLevelByXp } = require('../../utils/SkyblockUtils'); +import { getLevelByXp } from '../../Utils/SkyblockUtils.js'; +import type { + SkillLevel, + SkyblockGardenComposter, + SkyblockGardenCropMilestones, + SkyblockGardenVisitor, + SkyblockGarenCrops +} from '../../Types/Skyblock.js'; -/** - * Skyblock Garden class - */ class SkyblockGarden { - /** - * @param {object} data Skyblock member data - */ - constructor(data) { - /** - * level - * @type {SkyblockSkillLevel} - */ + level: SkillLevel; + barnSkin: string; + unlockedPlots: string[]; + visitors: SkyblockGardenVisitor; + cropMilestones: SkyblockGardenCropMilestones; + composter: SkyblockGardenComposter; + cropUpgrades: SkyblockGarenCrops; + constructor(data: Record) { this.level = getLevelByXp(data?.garden?.garden_experience || 0, 'garden'); - /** - * Current Barn Skin - * @type {string} - */ this.barnSkin = data?.garden?.selected_barn_skin || ''; - /** - * Unlocked Plots - * @type {string[]} - */ this.unlockedPlots = data?.garden?.unlocked_plots_ids || []; - /** - * Visitor Stats - * @type {SkyblockGardenVisitor} - */ this.visitors = { visited: data?.garden?.commission_data?.visits || {}, completed: data?.garden?.commission_data?.completed || {}, @@ -35,10 +27,6 @@ class SkyblockGarden { unique: data?.garden?.commission_data?.unique_npcs_served || 0 } }; - /** - * Crop Milestones - * @type {SkyblockGarenCropMilestones} - */ this.cropMilestones = { wheat: getLevelByXp(data?.garden?.resources_collected?.WHEAT || 0, 'wheat'), carrot: getLevelByXp(data?.garden?.resources_collected?.CARROT_ITEM || 0, 'carrot'), @@ -51,10 +39,6 @@ class SkyblockGarden { mushroom: getLevelByXp(data?.garden?.resources_collected?.MUSHROOM_COLLECTION || 0, 'mushroom'), netherWart: getLevelByXp(data?.garden?.resources_collected?.NETHER_STALK || 0, 'netherWart') }; - /** - * Composter - * @type {SkyblockGardenComposter} - */ this.composter = { organicMatter: data?.garden?.composter_data?.organic_matter || 0, fuelUnits: data?.garden?.composter_data?.fuel_units || 0, @@ -69,10 +53,6 @@ class SkyblockGarden { costReduction: data?.garden?.composter_data?.upgrades?.cost_reduction || 0 } }; - /** - * Crop Upgrades - * @type {SkyblockGarenCrops} - */ this.cropUpgrades = { wheat: data?.garden?.crop_upgrade_levels?.WHEAT || 0, carrot: data?.garden?.crop_upgrade_levels?.CARROT_ITEM || 0, @@ -88,59 +68,4 @@ class SkyblockGarden { } } -/** - * @typedef {object} SkyblockGardenVisitor - * @property {Record} visited Visited - * @property {Record} completed Completed - * @property {SkyblockGardenVisitorServed} served served - */ -/** - * @typedef {object} SkyblockGardenVisitorServed - * @property {number} total total - * @property {number} unique unique - */ -/** - * @typedef {object} SkyblockGardenComposter - * @property {number} organicMatter Organic Matter - * @property {number} fuelUnits Fuel Units - * @property {number} compostUnits Compost Units - * @property {number} compostItems Compost Items - * @property {number} conversionTicks Conversion Ticks - * @property {SkyblockGardenComposterUpgrades} upgrades upgrades - */ -/** - * @typedef {object} SkyblockGardenComposterUpgrades - * @property {number} speed Speed - * @property {number} multiDrop Multi Drop - * @property {number} fuelCap Fuel Cap - * @property {number} organicMatterCap Organic Matter Cap - * @property {number} costReduction Cost Reduction - */ -/** - * @typedef {object} SkyblockGarenCrops - * @property {number} wheat Wheat - * @property {number} carrot Carrot - * @property {number} sugarCane Sugar Cane - * @property {number} potato Potato - * @property {number} pumpkin Pumpkin - * @property {number} melon Melon - * @property {number} cactus Cactus - * @property {number} cocoaBeans Cocoa Beans - * @property {number} mushroom Mushroom - * @property {number} netherWart Nether Wart - */ -/** - * @typedef {object} SkyblockGarenCropMilestones - * @property {SkyblockSkillLevel} wheat Wheat - * @property {SkyblockSkillLevel} carrot Carrot - * @property {SkyblockSkillLevel} sugarCane Sugar Cane - * @property {SkyblockSkillLevel} potato Potato - * @property {SkyblockSkillLevel} pumpkin Pumpkin - * @property {SkyblockSkillLevel} melon Melon - * @property {SkyblockSkillLevel} cactus Cactus - * @property {SkyblockSkillLevel} cocoaBeans Cocoa Beans - * @property {SkyblockSkillLevel} mushroom Mushroom - * @property {SkyblockSkillLevel} netherWart Nether Wart - */ - -module.exports = SkyblockGarden; +export default SkyblockGarden; diff --git a/src/Structures/SkyBlock/SkyblockGemstone.ts b/src/Structures/SkyBlock/SkyblockGemstone.ts new file mode 100644 index 000000000..4db4c359d --- /dev/null +++ b/src/Structures/SkyBlock/SkyblockGemstone.ts @@ -0,0 +1,12 @@ +import type { SkyblockGemstoneQuality } from '../../Types/Skyblock.js'; + +class SkyblockGemstone { + type: string; + quality: SkyblockGemstoneQuality; + constructor(data: Record) { + this.type = data.type; + this.quality = data.quality; + } +} + +export default SkyblockGemstone; diff --git a/src/Structures/SkyBlock/SkyblockInventoryItem.ts b/src/Structures/SkyBlock/SkyblockInventoryItem.ts new file mode 100644 index 000000000..f7245799a --- /dev/null +++ b/src/Structures/SkyBlock/SkyblockInventoryItem.ts @@ -0,0 +1,75 @@ +import SkyblockGemstone from './SkyblockGemstone.js'; +import { parseGearScore, parseRarity } from '../../Utils/SkyblockUtils.js'; +import type { SkyblockGemstoneQuality } from '../../Types/Skyblock.js'; + +class SkyblockInventoryItem { + itemId: number; + count: number; + name: string; + lore: string; + loreArray: string[]; + loreForEmbed: string; + color: string | null; + enchantments: Record; + reforge: string; + gemstones: SkyblockGemstone[] | []; + damage: number; + rarity: string; + dungeonStars: number; + gearScore: number; + uuid: string; + soulbound: boolean; + artOfWar: number; + rune: object; + hotPotatoBooks: number; + recombobulated: boolean; + attributes: object; + hecatomb: number; + champion: number; + cultivating: number; + expertise: number; + compact: number; + blocksWalked: number; + constructor(data: Record) { + this.itemId = data?.id || 0; + this.count = data?.Count || 0; + this.name = + null !== data?.tag?.display?.Name + ? data?.tag?.display?.Name?.toString()?.replace(/§([1-9]|[a-f])|§/gm, '') + : null; + this.lore = data?.tag?.display?.Lore?.join('\n'); + this.loreArray = data?.tag?.display?.Lore; + this.loreForEmbed = this?.lore?.replace(/§([0-9]|[a-f])|§/gm, '')?.replace(/
/gm, '\n'); + this.color = data?.tag?.ExtraAttributes?.color ?? data?.tag?.display?.color ?? null; + this.enchantments = data?.tag?.ExtraAttributes?.enchantments ?? null; + this.reforge = data?.tag?.ExtraAttributes?.modifier ?? null; + this.gemstones = data?.tag?.ExtraAttributes?.gems + ? Object.entries(data?.tag?.ExtraAttributes?.gems)?.map((gem) => { + return new SkyblockGemstone({ type: gem[0], quality: gem[1] as SkyblockGemstoneQuality }); + }) + : []; + this.damage = data?.Damage || 0; + this.rarity = parseRarity(this?.loreArray[this?.loreArray?.length - 1] || ''); + this.dungeonStars = data?.tag?.ExtraAttributes?.upgrade_level ?? 0; + this.gearScore = parseGearScore(this?.loreArray); + this.uuid = data?.tag?.ExtraAttributes?.uuid ?? ''; + this.soulbound = 1 === data?.tag?.ExtraAttributes?.donated_museum; + this.artOfWar = data?.tag?.ExtraAttributes?.art_of_war_count ?? 0; + this.rune = data?.tag?.ExtraAttributes?.runes ?? null; + this.hotPotatoBooks = data?.tag?.ExtraAttributes?.hot_potato_count ?? 0; + this.recombobulated = 1 === data?.tag?.ExtraAttributes?.rarity_upgrades; + this.attributes = data?.tag?.ExtraAttributes?.attributes ?? {}; + this.hecatomb = data?.tag?.ExtraAttributes?.hecatomb_s_runs ?? 0; + this.champion = data?.tag?.ExtraAttributes?.champion_combat_xp ?? 0; + this.cultivating = data?.tag?.ExtraAttributes?.farmed_cultivating ?? 0; + this.expertise = data?.tag?.ExtraAttributes?.expertise_kills ?? 0; + this.compact = data?.tag?.ExtraAttributes?.compact_blocks ?? 0; + this.blocksWalked = data?.tag?.ExtraAttributes?.blocks_walked ?? 0; + } + + toString(): string { + return this.name; + } +} + +export default SkyblockInventoryItem; diff --git a/src/Structures/SkyBlock/SkyblockMember.test.ts b/src/Structures/SkyBlock/SkyblockMember.test.ts new file mode 100644 index 000000000..88487f972 --- /dev/null +++ b/src/Structures/SkyBlock/SkyblockMember.test.ts @@ -0,0 +1,77 @@ +import SkyblockGarden from './SkyblockGarden.js'; +import SkyblockMember from './SkyblockMember.js'; +import SkyblockMemberStats from './SkyblockMemberStats.js'; +import SkyblockMuseum from './SkyblockMuseum.js'; +import SkyblockPet from './SkyblockPet.js'; +import { ChocolateFactoryData, CrimsonIsle, Dungeons, HOTM, JacobData, Skills, Slayer } from '../../Types/Skyblock.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyblockMember', () => { + const data = new SkyblockMember({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyblockMember); + expectTypeOf(data).toEqualTypeOf(); + expect(data.uuid).toBeDefined(); + expectTypeOf(data.uuid).toEqualTypeOf(); + expect(data.gameMode).toBeDefined(); + expectTypeOf(data.gameMode).toEqualTypeOf(); + expect(data.selected).toBeDefined(); + expectTypeOf(data.selected).toEqualTypeOf(); + expect(data.garden).toBeDefined(); + expect(data.garden).toBeNull(); + expectTypeOf(data.garden).toEqualTypeOf(); + expect(data.museum).toBeDefined(); + expect(data.museum).toBeNull(); + expectTypeOf(data.museum).toEqualTypeOf(); + expect(data.profileName).toBeDefined(); + expectTypeOf(data.profileName).toEqualTypeOf(); + expect(data.profileId).toBeDefined(); + expectTypeOf(data.profileId).toEqualTypeOf(); + expect(data.firstJoinTimestamp).toBeDefined(); + expectTypeOf(data.firstJoinTimestamp).toEqualTypeOf(); + expect(data.firstJoinAt).toBeDefined(); + expectTypeOf(data.firstJoinAt).toEqualTypeOf(); + expect(data.experience).toBeDefined(); + expect(data.experience).toBeGreaterThanOrEqual(0); + expectTypeOf(data.experience).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expect(data.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.hotm).toBeDefined(); + expectTypeOf(data.hotm).toEqualTypeOf(); + expect(data.highestMagicalPower).toBeDefined(); + expect(data.highestMagicalPower).toBeGreaterThanOrEqual(0); + expectTypeOf(data.highestMagicalPower).toEqualTypeOf(); + expect(data.fairySouls).toBeDefined(); + expect(data.fairySouls).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fairySouls).toEqualTypeOf(); + expect(data.fairyExchanges).toBeDefined(); + expect(data.fairyExchanges).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fairyExchanges).toEqualTypeOf(); + expect(data.skills).toBeDefined(); + expectTypeOf(data.skills).toEqualTypeOf(); + expect(data.bestiary).toBeDefined(); + expectTypeOf(data.bestiary).toEqualTypeOf(); + expect(data.slayer).toBeDefined(); + expectTypeOf(data.slayer).toEqualTypeOf(); + expect(data.crimsonIsle).toBeDefined(); + expectTypeOf(data.crimsonIsle).toEqualTypeOf(); + expect(data.dungeons).toBeDefined(); + expectTypeOf(data.dungeons).toEqualTypeOf(); + expect(data.collections).toBeDefined(); + expectTypeOf(data.collections).toEqualTypeOf>(); + expect(data.purse).toBeDefined(); + expect(data.purse).toBeGreaterThanOrEqual(0); + expectTypeOf(data.purse).toEqualTypeOf(); + expect(data.stats).toBeDefined(); + expectTypeOf(data.stats).toEqualTypeOf(); + expect(data.pets).toBeDefined(); + expectTypeOf(data.pets).toEqualTypeOf(); + expect(data.jacob).toBeDefined(); + expectTypeOf(data.jacob).toEqualTypeOf(); + expect(data.chocolate).toBeDefined(); + expectTypeOf(data.chocolate).toEqualTypeOf(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.uuid); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/SkyblockMember.ts b/src/Structures/SkyBlock/SkyblockMember.ts new file mode 100644 index 000000000..082409499 --- /dev/null +++ b/src/Structures/SkyBlock/SkyblockMember.ts @@ -0,0 +1,239 @@ +import SkyblockGarden from './SkyblockGarden.js'; +import SkyblockInventoryItem from './SkyblockInventoryItem.js'; +import SkyblockMemberMinions from './SkyblockMemberMinions.js'; +import SkyblockMemberStats from './SkyblockMemberStats.js'; +import SkyblockMuseum from './SkyblockMuseum.js'; +import SkyblockPet from './SkyblockPet.js'; +import { + Armor, + ChocolateFactoryData, + CrimsonIsle, + Dungeons, + Equipment, + HOTM, + JacobData, + Skills, + Slayer +} from '../../Types/Skyblock.js'; +import { NetworthResult, getNetworth } from 'skyhelper-networth'; +import { createFarmingWeightCalculator } from 'farming-weight'; +import { + decode, + getBestiaryLevel, + getChocolateFactory, + getCrimsonIsle, + getDungeons, + getHOTM, + getJacobData, + getPetLevel, + getSkills, + getSlayer +} from '../../Utils/SkyblockUtils.js'; +import { petScore } from '../../Utils/Constants.js'; + +class SkyblockMember { + uuid: string; + gameMode: string | null; + selected: boolean; + garden: SkyblockGarden | null; + museum: SkyblockMuseum | null; + profileName: string; + profileId: string; + firstJoinTimestamp: number | null; + firstJoinAt: Date | null; + experience: number; + level: number; + hotm: HOTM; + highestMagicalPower: number; + fairySouls: number; + fairyExchanges: number; + skills: Skills; + bestiary: number; + slayer: Slayer | null; + crimsonIsle: CrimsonIsle; + dungeons: Dungeons; + collections: Record; + purse: number; + stats: SkyblockMemberStats; + pets: SkyblockPet[]; + jacob: JacobData; + chocolate: ChocolateFactoryData; + minions: SkyblockMemberMinions; + getArmor: () => Promise; + getWardrobe: () => Promise; + getEnderChest: () => Promise; + getInventory: () => Promise; + getPetScore: () => number; + getEquipment: () => Promise; + getPersonalVault: () => Promise; + getNetworth: () => Promise; + getFarmingWeight: () => number; + constructor(data: Record) { + this.uuid = data?.uuid || ''; + this.gameMode = data?.gameMode || null; + this.selected = data?.selected || false; + this.garden = data?.garden || null; + this.museum = data?.museum || null; + this.profileName = data?.profileName || ''; + this.profileId = data?.profileId || ''; + this.firstJoinTimestamp = data?.m?.profile?.first_join || 0; + this.firstJoinAt = new Date(data?.m?.profile?.first_join); + this.experience = data?.m?.leveling?.experience || 0; + this.level = this.experience ? this.experience / 100 : 0; + this.hotm = getHOTM(data.m); + this.highestMagicalPower = data?.m?.accessory_bag_storage?.highest_magical_power || 0; + this.fairySouls = data?.m?.fairy_soul?.total_collected || 0; + this.fairyExchanges = data?.m?.fairy_soul?.fairy_exchanges || 0; + this.skills = getSkills(data.m); + this.bestiary = getBestiaryLevel(data.m); + this.slayer = getSlayer(data.m); + this.crimsonIsle = getCrimsonIsle(data.m); + this.dungeons = getDungeons(data.m); + this.collections = data?.m?.collection || {}; + this.purse = data?.m?.currencies?.coin_purse || 0; + this.stats = new SkyblockMemberStats(data?.m?.player_stats); + this.pets = data?.m?.pets_data?.pets ? data.m.pets_data.pets.map((pet: any) => new SkyblockPet(pet)) : []; + this.jacob = getJacobData(data.m); + this.chocolate = getChocolateFactory(data.m); + this.minions = new SkyblockMemberMinions(data.m?.player_data?.crafted_generators ?? []); + this.getArmor = async () => { + const base64 = data?.m?.inventory?.inv_armor; + const decoded = await decode(base64?.data); + const armor = { + helmet: decoded[3]?.id ? new SkyblockInventoryItem(decoded[3]) : null, + chestplate: decoded[2]?.id ? new SkyblockInventoryItem(decoded[2]) : null, + leggings: decoded[1]?.id ? new SkyblockInventoryItem(decoded[1]) : null, + boots: decoded[0]?.id ? new SkyblockInventoryItem(decoded[0]) : null + }; + return armor; + }; + this.getWardrobe = async () => { + const base64 = data?.m?.inventory?.wardrobe_contents?.data; + if (!base64) return []; + const decoded = await decode(base64); + const armor = decoded + .filter((item) => 0 !== Object.keys(item).length) + .map((item) => new SkyblockInventoryItem(item)); + return armor; + }; + this.getEnderChest = async () => { + let chest = data?.m?.inventory?.ender_chest_contents; + if (!chest) return []; + try { + chest = await decode(chest?.data); + const edited = []; + for (let i = 0; i < chest.length; i++) { + if (!chest[i]?.id) continue; + edited.push(new SkyblockInventoryItem(chest[i])); + } + return edited; + } catch { + return []; + } + }; + this.getInventory = async () => { + let inventory = data?.m?.inventory?.inv_contents; + if (!inventory) return []; + try { + inventory = await decode(inventory?.data); + const edited = []; + for (let i = 0; i < inventory.length; i++) { + if (!inventory[i]?.id) continue; + edited.push(new SkyblockInventoryItem(inventory[i])); + } + return edited; + } catch { + return []; + } + }; + this.getPetScore = () => { + const highestRarity: { [key: string]: any } = {}; + for (const pet of data?.m?.pets_data?.pets) { + if (!(pet?.type in highestRarity) || (petScore[pet?.tier] || 1) > highestRarity[pet?.type]) { + highestRarity[pet?.type] = petScore[pet?.tier]; + } + } + const highestLevel: { [key: string]: any } = {}; + for (const pet of data?.m?.pets_data?.pets) { + const maxLevel = 'GOLDEN_DRAGON' === pet?.type ? 200 : 100; + const petLevel = getPetLevel(pet?.exp, pet?.tier, maxLevel); + if (!(pet?.type in highestLevel) || petLevel?.level > highestLevel[pet?.type]) { + if (petLevel?.level < maxLevel) { + continue; + } + highestLevel[pet?.type] = 1; + } + } + return ( + Object.values(highestRarity).reduce((a, b) => a + b, 0) + Object.values(highestLevel).reduce((a, b) => a + b, 0) + ); + }; + this.getEquipment = async () => { + let equipment = data?.m?.inventory?.equipment_contents; + if (!equipment) { + return { gauntlet: null, belt: null, cloak: null, necklace: null }; + } + try { + equipment = await decode(equipment?.data); + const playerEquipment = { + gauntlet: equipment?.[3]?.id ? new SkyblockInventoryItem(equipment[3]) : null, + belt: equipment?.[2]?.id ? new SkyblockInventoryItem(equipment[2]) : null, + cloak: equipment?.[1]?.id ? new SkyblockInventoryItem(equipment[1]) : null, + necklace: equipment?.[0]?.id ? new SkyblockInventoryItem(equipment[0]) : null + }; + return playerEquipment; + } catch { + return { gauntlet: null, belt: null, cloak: null, necklace: null }; + } + }; + this.getPersonalVault = async () => { + let vault = data?.m?.inventory?.personal_vault_contents; + if (!vault) return []; + try { + vault = await decode(vault?.data); + const edited = []; + for (let i = 0; i < vault?.length; i++) { + if (!vault[i]?.id) continue; + edited.push(new SkyblockInventoryItem(vault[i])); + } + return edited; + } catch { + return []; + } + }; + this.getNetworth = async () => { + try { + const nw = await getNetworth(data?.m, data?.banking?.balance ?? 0, { + onlyNetworth: true, + v2Endpoint: true, + cache: true, + museumData: data?.museum?.raw ?? {} + }); + return nw; + } catch { + return null; + } + }; + this.getFarmingWeight = () => { + try { + return createFarmingWeightCalculator({ + collection: this.collections, + farmingXp: this.skills.farming.xp, + levelCapUpgrade: this.jacob.perks.farmingLevelCap, + anitaBonusFarmingFortuneLevel: this.jacob.perks.doubleDrops, + minions: data?.m?.player_data?.crafted_generators, + contests: Object.values(this.jacob.contests), + pests: data?.m?.bestiary?.kills + }).getWeightInfo().totalWeight; + } catch { + return 0; + } + }; + } + + toString(): string { + return this.uuid; + } +} + +export default SkyblockMember; diff --git a/src/Structures/SkyBlock/SkyblockMemberMinion.ts b/src/Structures/SkyBlock/SkyblockMemberMinion.ts new file mode 100644 index 000000000..b74822ac1 --- /dev/null +++ b/src/Structures/SkyBlock/SkyblockMemberMinion.ts @@ -0,0 +1,34 @@ +class SkyblockMemberMinion { + t1: boolean; + t2: boolean; + t3: boolean; + t4: boolean; + t5: boolean; + t6: boolean; + t7: boolean; + t8: boolean; + t9: boolean; + t10: boolean; + t11: boolean; + t12: boolean; + [key: string]: boolean; + constructor(data: number[]) { + this.t1 = false; + this.t2 = false; + this.t3 = false; + this.t4 = false; + this.t5 = false; + this.t6 = false; + this.t7 = false; + this.t8 = false; + this.t9 = false; + this.t10 = false; + this.t11 = false; + this.t12 = false; + data.forEach((tier) => { + if (1 <= tier && 12 >= tier) this[`t${tier}`] = true; + }); + } +} + +export default SkyblockMemberMinion; diff --git a/src/Structures/SkyBlock/SkyblockMemberMinions.ts b/src/Structures/SkyBlock/SkyblockMemberMinions.ts new file mode 100644 index 000000000..d359a69d6 --- /dev/null +++ b/src/Structures/SkyBlock/SkyblockMemberMinions.ts @@ -0,0 +1,32 @@ +import SkyblockMemberMinion from './SkyblockMemberMinion.js'; + +function parse(data: string[]): { [key: string]: number[] } { + const minionData: Record = {}; + data + .sort((a, b) => { + if ((a.split('_')[0] || 'Unknown') < (b.split('_')[0] || 'Unknown')) return -1; + if ((a.split('_')[0] || 'Unknown') > (b.split('_')[0] || 'Unknown')) return 1; + return 0; + }) + .forEach((minion) => { + const minionName = minion.split('_')[0] || 'Unknown'; + if (undefined === minionData[minionName]) minionData[minionName] = []; + minionData[minionName].push(Number(minion.split('_')[1] || '0')); + minionData[minionName] = minionData[minionName].sort((a, b) => a - b); + }); + return minionData; +} + +class SkyblockMemberMinions { + [key: string]: SkyblockMemberMinion; + constructor(data: string[]) { + const parsed = parse(data); + if (!parsed) return; + Object.keys(parsed).forEach((minion) => { + if (undefined === parsed[minion]) return; + this[minion.toLowerCase()] = new SkyblockMemberMinion(parsed[minion]); + }); + } +} + +export default SkyblockMemberMinions; diff --git a/src/Structures/SkyBlock/SkyblockMemberStats.ts b/src/Structures/SkyBlock/SkyblockMemberStats.ts new file mode 100644 index 000000000..5b771e1d1 --- /dev/null +++ b/src/Structures/SkyBlock/SkyblockMemberStats.ts @@ -0,0 +1,140 @@ +import { + MemberStatsAuctions, + MemberStatsCandy, + MemberStatsFishing, + MemberStatsGifts, + MemberStatsMythos, + MemberStatsPetMilestones +} from '../../Types/Skyblock.js'; + +class SkyblockMemberStats { + candy: MemberStatsCandy; + petMilestones: MemberStatsPetMilestones; + highestCriticalDamage: number; + highestDamage: number; + glowingMusroomsBroken: number; + kills: Record; + deaths: Record; + auctions: MemberStatsAuctions; + gifts: MemberStatsGifts; + itemsFished: MemberStatsFishing; + mythos: MemberStatsMythos; + constructor(data: Record) { + this.candy = { + green: data?.candy_collected?.green_candy || 0, + purple: data?.candy_collected?.purple_candy || 0, + total: data?.candy_collected?.total || 0, + festivals: [] + }; + Object.keys(data?.candy_collected || {}).forEach((year: string) => { + if ('total' !== year && 'green_candy' !== year && 'purple_candy' !== year) { + this.candy?.festivals?.push({ + year: Number(data?.candy_collected?.[`spooky_festival_${year}`] || '0'), + collected: { + green: data?.candy_collected?.[`spooky_festival_${year}`]?.green_candy || 0, + purple: data?.candy_collected?.[`spooky_festival_${year}`]?.purple_candy || 0, + total: data?.candy_collected?.[`spooky_festival_${year}`]?.total || 0 + } + }); + } + }); + this.petMilestones = { + oresMinned: data?.pets?.milestones?.ores_mined || 0, + seaCreaturesKilled: data?.pets?.milestones?.sea_creatures_killed || 0 + }; + this.highestCriticalDamage = data?.highest_critical_damage || 0; + this.highestDamage = data?.highest_damage || 0; + this.glowingMusroomsBroken = data?.glowing_mushrooms_broken || 0; + this.kills = { + total: Object.values(data?.kills || {})?.reduce((acc: any, curr) => acc + curr, 0) as number, + ...Object.keys(data?.kills || {}) + .filter((key) => 'total' !== key) + .sort((a, b) => data?.kills[b] - data?.kills[a]) + .map((key) => ({ [key]: data?.kills[key] })) + .reduce((acc, curr) => ({ ...acc, ...curr }), {}) + }; + this.deaths = { + total: Object.values(data?.deaths || {})?.reduce((acc: any, curr) => acc + curr, 0) as number, + ...Object.keys(data?.deaths || {}) + .filter((key) => 'total' !== key) + .sort((a, b) => data?.deaths[b] - data?.deaths[a]) + .map((key) => ({ [key]: data?.deaths[key] })) + .reduce((acc, curr) => ({ ...acc, ...curr }), {}) + }; + this.auctions = { + bids: data?.auctions?.bids || 0, + highestBid: data?.auctions?.highest_bid || 0, + goldSpent: data?.auctions?.gold_spent || 0, + goldEarnt: data?.auctions?.gold_earnt || 0, + auctionsWon: data?.auctions?.won || 0, + auctionsCompleted: data?.auctions?.completed || 0, + auctionsCreated: data?.auctions?.created || 0, + auctionFees: data?.auctions?.auction_fees || 0, + auctionsWithOutBids: data?.auctions?.no_bids || 0, + bought: { + uncommon: data?.auctions?.total_bought?.uncommon || 0, + common: data?.auctions?.total_bought?.common || 0, + rare: data?.auctions?.total_bought?.rare || 0, + epic: data?.auctions?.total_bought?.epic || 0, + legendary: data?.auctions?.total_bought?.legendary || 0, + special: data?.auctions?.total_bought?.special || 0, + mythic: data?.auctions?.total_bought?.mythic || 0, + total: + data?.auctions?.total_bought?.uncommon || + 0 + data?.auctions?.total_bought?.common || + 0 + data?.auctions?.total_bought?.rare || + 0 + data?.auctions?.total_bought?.epic || + 0 + data?.auctions?.total_bought?.legendary || + 0 + data?.auctions?.total_bought?.special || + 0 + data?.auctions?.total_bought?.mythic || + 0 + }, + sold: { + uncommon: data?.auctions?.total_sold?.uncommon || 0, + common: data?.auctions?.total_sold?.common || 0, + rare: data?.auctions?.total_sold?.rare || 0, + epic: data?.auctions?.total_sold?.epic || 0, + legendary: data?.auctions?.total_sold?.legendary || 0, + special: data?.auctions?.total_sold?.special || 0, + mythic: data?.auctions?.total_sold?.mythic || 0, + total: + data?.auctions?.total_sold?.uncommon || + 0 + data?.auctions?.total_sold?.common || + 0 + data?.auctions?.total_sold?.rare || + 0 + data?.auctions?.total_sold?.epic || + 0 + data?.auctions?.total_sold?.legendary || + 0 + data?.auctions?.total_sold?.special || + 0 + data?.auctions?.total_sold?.mythic || + 0 + } + }; + this.gifts = { given: data?.gifts?.total_given || 0, received: data?.gifts?.total_received || 0 }; + this.itemsFished = { + total: data?.items_fished?.total || 0, + normal: data?.items_fished?.normal || 0, + tresure: data?.items_fished?.treasure || 0, + largeTresure: data?.items_fished?.large_treasure || 0 + }; + this.mythos = { + kills: data?.mythos?.kills || 0, + burrowsDugNext: { + total: data?.mythos?.burrows_dug_next?.total || 0, + common: data?.mythos?.burrows_dug_next?.common || 0 + }, + burrowsDugCombat: { + total: data?.mythos?.burrows_dug_combat?.total || 0, + common: data?.mythos?.burrows_dug_combat?.common || 0 + }, + burrowsDugTreasure: { + total: data?.mythos?.burrows_dug_treasure?.total || 0, + common: data?.mythos?.burrows_dug_treasure?.common || 0 + }, + burrowsDugComplate: { + total: data?.mythos?.burrows_dug_complete?.total || 0, + common: data?.mythos?.burrows_dug_complete?.common || 0 + } + }; + } +} + +export default SkyblockMemberStats; diff --git a/src/Structures/SkyBlock/SkyblockMuseum.ts b/src/Structures/SkyBlock/SkyblockMuseum.ts new file mode 100644 index 000000000..525c47e7b --- /dev/null +++ b/src/Structures/SkyBlock/SkyblockMuseum.ts @@ -0,0 +1,43 @@ +import SkyblockMuseumItem from './SkyblockMuseumItem.js'; +import { decode } from '../../Utils/SkyblockUtils.js'; + +class SkyblockMuseum { + raw: Record; + value: number; + appraisal: boolean; + getItems: () => Promise; + getSpecial: () => Promise; + constructor(data: Record) { + this.raw = data.m.members?.[data.uuid] ?? {}; + this.value = data.value; + this.appraisal = data.appraisal; + this.getItems = async (): Promise => { + const items: SkyblockMuseumItem[] = []; + for (const item of Object.keys(data?.m?.members[data?.uuid]?.items) || {}) { + items.push( + new SkyblockMuseumItem( + item, + data?.m?.members[data?.uuid]?.items[item], + await decode(data?.m?.members[data?.uuid]?.items[item]?.items?.data) + ) + ); + } + return items; + }; + this.getSpecial = async (): Promise => { + const items: SkyblockMuseumItem[] = []; + for (const item of Object.keys(data?.m?.members[data?.uuid]?.special || {})) { + items.push( + new SkyblockMuseumItem( + item, + data?.m?.members[data?.uuid]?.special[item], + await decode(data?.m?.members[data?.uuid]?.special[item]?.items?.data) + ) + ); + } + return items; + }; + } +} + +export default SkyblockMuseum; diff --git a/src/Structures/SkyBlock/SkyblockMuseumItem.ts b/src/Structures/SkyBlock/SkyblockMuseumItem.ts new file mode 100644 index 000000000..fda8f9992 --- /dev/null +++ b/src/Structures/SkyBlock/SkyblockMuseumItem.ts @@ -0,0 +1,26 @@ +import SkyblockInventoryItem from './SkyblockInventoryItem.js'; + +class SkyblockMuseumItem { + name: string; + donated: number; + items: SkyblockInventoryItem[]; + borrowing: boolean; + featuredSlot: string | null; + constructor(name: string, data: Record, decoded: any[]) { + this.name = name; + this.donated = data.donated_time || 0; + this.featuredSlot = data.featured_slot || null; + this.borrowing = data.borrowing || false; + this.items = []; + decoded.forEach((item) => { + if (!item.tag) return; + this.items.push(new SkyblockInventoryItem(item)); + }); + } + + toString(): string { + return this.name; + } +} + +export default SkyblockMuseumItem; diff --git a/src/Structures/SkyBlock/SkyblockPet.ts b/src/Structures/SkyBlock/SkyblockPet.ts new file mode 100644 index 000000000..ed0fa18fb --- /dev/null +++ b/src/Structures/SkyBlock/SkyblockPet.ts @@ -0,0 +1,31 @@ +import { Rarity } from '../../Types/Skyblock.js'; +import { petScore } from '../../Utils/Constants.js'; + +class SkyblockPet { + uuid: string; + name: string; + xp: number; + active: boolean; + rarity: Rarity; + petScore: number; + heldItem: string | null; + candyUsed: number; + skin: string | null; + constructor(data: Record) { + this.uuid = data.uuid; + this.name = data.type; + this.xp = data.exp || 0; + this.active = Boolean(data.active); + this.rarity = data.tier; + this.petScore = petScore?.[this.rarity] || 0; + this.heldItem = data.heldItem ? data.heldItem.replace(/^PET_ITEM_/, '') : null; + this.candyUsed = data.candyUsed || 0; + this.skin = data.skin; + } + + toString(): string { + return this.name; + } +} + +export default SkyblockPet; diff --git a/src/Structures/SkyBlock/SkyblockProfile.ts b/src/Structures/SkyBlock/SkyblockProfile.ts new file mode 100644 index 000000000..b2a61a85d --- /dev/null +++ b/src/Structures/SkyBlock/SkyblockProfile.ts @@ -0,0 +1,45 @@ +import SkyblockGarden from './SkyblockGarden.js'; +import SkyblockMember from './SkyblockMember.js'; + +class SkyblockProfile { + profileId: string; + profileName: string; + gameMode: string | null; + banking: object; + garden: SkyblockGarden | null; + communityUpgrades: object; + selected: boolean; + members: SkyblockMember[]; + me: SkyblockMember | undefined; + constructor(data: Record) { + this.profileId = data.profileId || ''; + this.profileName = data.profileName || ''; + this.gameMode = data.gameMode || null; + this.banking = data.banking || {}; + this.garden = data.garden || null; + this.communityUpgrades = data.communityUpgrades || {}; + this.selected = data.selected || false; + this.members = Object.keys(data.members).map( + (uuid) => + new SkyblockMember({ + uuid: uuid, + profileId: this.profileId, + garden: data.garden, + museum: data.museum, + profileName: this.profileName, + gameMode: this.gameMode, + m: data.members[uuid], + banking: this.banking, + communityUpgrades: this.communityUpgrades, + selected: this.selected + }) + ); + this.me = this.members.find((x) => x.uuid === data.uuid); + } + + toString(): string { + return this.profileName; + } +} + +export default SkyblockProfile; diff --git a/src/Structures/SkyBlock/Static/Bingo.ts b/src/Structures/SkyBlock/Static/Bingo.ts new file mode 100644 index 000000000..cb065065b --- /dev/null +++ b/src/Structures/SkyBlock/Static/Bingo.ts @@ -0,0 +1,50 @@ +function parsePosition(position: number): [number, number] { + const x = (position % 5) + 1; + const y = Math.floor(position / 5) + 1; + return [x, y]; +} + +class Bingo { + name: string; + id: string; + row: number | null; + column: number | null; + rawLore: string; + lore: string; + tiers: number[]; + tierStep: number | null; + requiredAmount: number | null; + type: 'ONE_TIME' | 'ONE_TIER' | 'TIERED'; + constructor(data: Record, position: number = 0) { + this.name = data.name; + this.id = data.id; + const [row, column] = parsePosition(position); + this.row = row; + this.column = column; + this.rawLore = data.lore; + this.lore = data.lore?.replace?.(/§([1-9]|[a-l])|§/gm, '') || []; + this.tiers = Array.isArray(data.tiers) ? data.tiers.map((x) => parseInt(x, 10) || 0) : []; + this.tierStep = this.getTierStep(); + this.requiredAmount = parseInt(data.requiredAmount, 10) ?? null; + this.type = this.tiers ? 'TIERED' : this.requiredAmount ? 'ONE_TIER' : 'ONE_TIME'; + } + + toString(): string { + return this.id; + } + + private getTierStep(): number | null { + if ('TIERED' !== this.type) return null; + // No step possible + if (2 > this.tiers.length) return null; + const hypotheticStep = (this.tiers?.[1] || 0) - (this.tiers?.[0] || 0); + // Check if every 2 elements have the same step + const isConstant = this.tiers.slice(1).every((el, index) => { + return hypotheticStep === (this.tiers?.[index - 1] || 0) - el; + }); + if (!isConstant) return null; + return hypotheticStep; + } +} + +export default Bingo; diff --git a/src/Structures/SkyBlock/Static/BingoData.ts b/src/Structures/SkyBlock/Static/BingoData.ts new file mode 100644 index 000000000..cfe9ab710 --- /dev/null +++ b/src/Structures/SkyBlock/Static/BingoData.ts @@ -0,0 +1,21 @@ +import Bingo from './Bingo.js'; + +class BingoData { + lastUpdatedTimestamp: number; + lastUpdatedAt: Date | null; + id: number | null; + goals: Bingo[] | null; + constructor(data: Record) { + this.lastUpdatedTimestamp = parseInt(data.lastUpdated, 10); + this.lastUpdatedAt = new Date(this.lastUpdatedTimestamp); + this.id = parseInt(data.id, 10) || null; + this.goals = Array.isArray(data.goals) ? data.goals.map((goal, index) => new Bingo(goal, index)) : null; + } + + getGoal(column: number, row: number): Bingo | undefined { + if (!this.goals || 1 > this.goals.length) return; + return this.goals.find((goal) => goal.row === row && goal.column === column); + } +} + +export default BingoData; diff --git a/src/Structures/SkyBlock/Static/Candidate.ts b/src/Structures/SkyBlock/Static/Candidate.ts new file mode 100644 index 000000000..23604943f --- /dev/null +++ b/src/Structures/SkyBlock/Static/Candidate.ts @@ -0,0 +1,26 @@ +import Perk from './Perk.js'; + +class Candidate { + name: string; + keyBenefit: string; + perk: Perk | null; + perks: Perk[] | null; + isMayor: boolean; + isMinister: boolean; + votesReceived: number; + constructor(data: Record, isMayor: boolean = false, isMinister = false) { + this.name = data.name; + this.keyBenefit = data.key; + this.perk = data.perk?.[0] ? new Perk(data.perk[0]) : null; + this.perks = data.perks ? data.perks.map((x: any) => new Perk(x)) : null; + this.isMayor = isMayor || false; + this.isMinister = isMinister || false; + this.votesReceived = parseInt(data.votes, 10); + } + + toString(): string { + return this.name; + } +} + +export default Candidate; diff --git a/src/Structures/SkyBlock/Static/FireSale.ts b/src/Structures/SkyBlock/Static/FireSale.ts new file mode 100644 index 000000000..acf474880 --- /dev/null +++ b/src/Structures/SkyBlock/Static/FireSale.ts @@ -0,0 +1,24 @@ +class FireSale { + itemId: string; + startTimestamp: number; + startAt: Date; + endTimestamp: number; + endAt: Date; + amount: number; + price: number; + constructor(data: Record) { + this.itemId = data.item_id; + this.startTimestamp = parseInt(data.start, 10); + this.startAt = new Date(this.startTimestamp); + this.endTimestamp = parseInt(data.end, 10); + this.endAt = new Date(this.endTimestamp); + this.amount = data.amount; + this.price = data.price; + } + + toString(): string { + return this.itemId; + } +} + +export default FireSale; diff --git a/src/Structures/SkyBlock/Static/Government.ts b/src/Structures/SkyBlock/Static/Government.ts new file mode 100644 index 000000000..e2ff88c85 --- /dev/null +++ b/src/Structures/SkyBlock/Static/Government.ts @@ -0,0 +1,42 @@ +import Candidate from './Candidate.js'; + +class GovernmentData { + lastUpdatedTimestamp: number; + lastUpdatedAt: Date; + lastElectionResults: Map; + mayor: Candidate | undefined; + runningYear: number; + currentElectionResults: Map | null; + currentElectionFor: number | null; + constructor(data: Record) { + this.lastUpdatedTimestamp = parseInt(data.lastUpdated, 10); + this.lastUpdatedAt = new Date(this.lastUpdatedTimestamp); + const lastElectionResults = data.mayor.election.candidates.map( + (x: any) => new Candidate(x, x.name === data.mayor.name) + ); + this.lastElectionResults = new Map( + lastElectionResults + .sort((a: any, b: any) => a.votesReceived - b.votesReceived) + .reverse() + .map((x: any) => [x.name, x]) + ); + this.mayor = this.lastElectionResults.get(data.mayor.name); + this.runningYear = parseInt(data.mayor.election.year, 10) || 0; + const thisElection = data.current?.candidates.map((x: any) => new Candidate(x, x.name === data.mayor.name)) || null; + this.currentElectionResults = thisElection + ? new Map( + thisElection + .sort((a: any, b: any) => a.votesReceived - b.votesReceived) + .reverse() + .map((x: any) => [x.name, x]) + ) + : null; + this.currentElectionFor = parseInt(data.current?.year, 10) || null; + } + + toString(): string { + return this.mayor?.name || ''; + } +} + +export default GovernmentData; diff --git a/src/Structures/SkyBlock/Static/Perk.ts b/src/Structures/SkyBlock/Static/Perk.ts new file mode 100644 index 000000000..6024a5e32 --- /dev/null +++ b/src/Structures/SkyBlock/Static/Perk.ts @@ -0,0 +1,10 @@ +class Perk { + name: string; + description: string; + constructor(data: Record) { + this.name = data.name; + this.description = data.description; + } +} + +export default Perk; diff --git a/src/Structures/Static/Achievements/Achievements.ts b/src/Structures/Static/Achievements/Achievements.ts new file mode 100644 index 000000000..912ec5515 --- /dev/null +++ b/src/Structures/Static/Achievements/Achievements.ts @@ -0,0 +1,17 @@ +import GameAchievements from './GameAchievements.js'; + +class Achievements { + lastUpdatedTimestamp: number; + lastUpdatedAt: Date; + achievementsPerGame: Record; + constructor(data: Record) { + this.lastUpdatedTimestamp = data.lastUpdated; + this.lastUpdatedAt = new Date(this.lastUpdatedTimestamp); + this.achievementsPerGame = {}; + Object.keys(data.achievements).forEach((game) => { + this.achievementsPerGame.game = new GameAchievements(game, data.achievements[game]); + }); + } +} + +export default Achievements; diff --git a/src/Structures/Static/Achievements/BaseAchievement.ts b/src/Structures/Static/Achievements/BaseAchievement.ts new file mode 100644 index 000000000..93a329844 --- /dev/null +++ b/src/Structures/Static/Achievements/BaseAchievement.ts @@ -0,0 +1,20 @@ +class BaseAchievement { + codeName: string; + name: string; + description: string; + secret: boolean; + legacy: boolean; + constructor(achievementName: string, data: Record) { + this.codeName = achievementName; + this.name = data.name; + this.description = data.description; + this.secret = data.secret || false; + this.legacy = data.legacy || false; + } + + toString(): string { + return this.codeName; + } +} + +export default BaseAchievement; diff --git a/src/Structures/Static/Achievements/GameAchievements.ts b/src/Structures/Static/Achievements/GameAchievements.ts new file mode 100644 index 000000000..3e31ad2e0 --- /dev/null +++ b/src/Structures/Static/Achievements/GameAchievements.ts @@ -0,0 +1,23 @@ +import OneTimeAchivement from './OneTimeAchivement.js'; +import TieredAchivement from './TieredAchivement.js'; + +class GameAchievements { + game: string; + points: number; + legacyPoints: number; + oneTimeAchievements: OneTimeAchivement[]; + tieredAchievements: TieredAchivement[]; + constructor(game: string, data: Record) { + this.game = game; + this.points = data.total_points || 0; + this.legacyPoints = data.total_legacy_points || 0; + this.oneTimeAchievements = Object.keys(data.one_time).map( + (achivementKey) => new OneTimeAchivement(achivementKey, data.one_time[achivementKey]) + ); + this.tieredAchievements = Object.keys(data.tiered).map( + (achivementKey) => new TieredAchivement(achivementKey, data.tiered[achivementKey]) + ); + } +} + +export default GameAchievements; diff --git a/src/Structures/Static/Achievements/GuildAchievements.ts b/src/Structures/Static/Achievements/GuildAchievements.ts new file mode 100644 index 000000000..146cc4a4d --- /dev/null +++ b/src/Structures/Static/Achievements/GuildAchievements.ts @@ -0,0 +1,21 @@ +import OneTimeAchivement from './OneTimeAchivement.js'; +import TieredAchivement from './TieredAchivement.js'; + +class GuildAchievements { + lastUpdatedTimestamp: number; + lastUpdatedAt: Date; + oneTimeAchievements: OneTimeAchivement[]; + tieredAchievements: TieredAchivement[]; + constructor(data: Record) { + this.lastUpdatedTimestamp = data.lastUpdated; + this.lastUpdatedAt = new Date(this.lastUpdatedTimestamp); + this.oneTimeAchievements = Object.keys(data.one_time).map( + (achivementKey) => new OneTimeAchivement(achivementKey, data.one_time[achivementKey]) + ); + this.tieredAchievements = Object.keys(data.tiered).map( + (achivementKey) => new TieredAchivement(achivementKey, data.tiered[achivementKey]) + ); + } +} + +export default GuildAchievements; diff --git a/src/Structures/Static/Achievements/OneTimeAchivement.ts b/src/Structures/Static/Achievements/OneTimeAchivement.ts new file mode 100644 index 000000000..289799a64 --- /dev/null +++ b/src/Structures/Static/Achievements/OneTimeAchivement.ts @@ -0,0 +1,15 @@ +import BaseAchievement from './BaseAchievement.js'; + +class OneTimeAchivement extends BaseAchievement { + points: number; + gamePercentUnlocked: number; + globalPercentUnlocked: number; + constructor(achivementName: string, data: Record) { + super(achivementName, data); + this.points = data.points; + this.gamePercentUnlocked = data.gamePercentUnlocked || 0; + this.globalPercentUnlocked = data.globalPercentUnlocked || 0; + } +} + +export default OneTimeAchivement; diff --git a/src/Structures/Static/Achievements/TieredAchivement.ts b/src/Structures/Static/Achievements/TieredAchivement.ts new file mode 100644 index 000000000..0d3f47609 --- /dev/null +++ b/src/Structures/Static/Achievements/TieredAchivement.ts @@ -0,0 +1,12 @@ +import BaseAchievement from './BaseAchievement.js'; +import type { AchivementTier } from '../../../Types/Static.js'; + +class TieredAchivement extends BaseAchievement { + tiers: AchivementTier[]; + constructor(achivementName: string, data: Record) { + super(achivementName, data); + this.tiers = data.tiers; + } +} + +export default TieredAchivement; diff --git a/src/Structures/Static/Challenge.ts b/src/Structures/Static/Challenge.ts new file mode 100644 index 000000000..a246ffc24 --- /dev/null +++ b/src/Structures/Static/Challenge.ts @@ -0,0 +1,14 @@ +import type { ChallengeReward } from '../../Types/Static.js'; + +class Challenge { + id: string; + name: string; + rewards: ChallengeReward[]; + constructor(data: Record) { + this.id = data.id; + this.name = data.name; + this.rewards = data.rewards; + } +} + +export default Challenge; diff --git a/src/Structures/Static/Challenges.ts b/src/Structures/Static/Challenges.ts new file mode 100644 index 000000000..3967f10e5 --- /dev/null +++ b/src/Structures/Static/Challenges.ts @@ -0,0 +1,17 @@ +import GameChallenges from './GameChallenges.js'; + +class Challenges { + lastUpdatedTimestamp: number; + lastUpdatedAt: Date; + challengesPerGame: Record; + constructor(data: Record) { + this.lastUpdatedTimestamp = data.lastUpdated; + this.lastUpdatedAt = new Date(this.lastUpdatedTimestamp); + this.challengesPerGame = {}; + Object.keys(data.challenges).forEach((game) => { + this.challengesPerGame[game] = new GameChallenges(game, data.challenges[game]); + }); + } +} + +export default Challenges; diff --git a/src/Structures/Static/GameChallenges.ts b/src/Structures/Static/GameChallenges.ts new file mode 100644 index 000000000..41f0114a4 --- /dev/null +++ b/src/Structures/Static/GameChallenges.ts @@ -0,0 +1,12 @@ +import Challenge from './Challenge.js'; + +class GameChallenges { + category: string; + challenges: Challenge[]; + constructor(name: string, data: { id: string; name: string; rewards: { type: string; amount: number }[] }[]) { + this.category = name; + this.challenges = data.map((challenge) => new Challenge(challenge)); + } +} + +export default GameChallenges; diff --git a/src/Structures/Static/GameQuests.ts b/src/Structures/Static/GameQuests.ts new file mode 100644 index 000000000..a2b28b74c --- /dev/null +++ b/src/Structures/Static/GameQuests.ts @@ -0,0 +1,12 @@ +import Quest from './Quest.js'; + +class GameQuests { + game: string; + quests: Quest[]; + constructor(name: string, data: Record) { + this.game = name; + this.quests = data.map((x: any) => new Quest(x)); + } +} + +export default GameQuests; diff --git a/src/Structures/Static/Quest.test.ts b/src/Structures/Static/Quest.test.ts new file mode 100644 index 000000000..675aea6e1 --- /dev/null +++ b/src/Structures/Static/Quest.test.ts @@ -0,0 +1,25 @@ +import Quest from './Quest'; +import QuestObjective from './QuestObjective'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { QuestReward, QuestType } from '../../Types/Static'; + +test('Quest', () => { + const data = new Quest({ status: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Quest); + expectTypeOf(data).toEqualTypeOf(); + expect(data.id).toBeDefined(); + expectTypeOf(data.id).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.description).toBeDefined(); + expectTypeOf(data.description).toEqualTypeOf(); + expect(data.rewards).toBeDefined(); + expectTypeOf(data.rewards).toEqualTypeOf(); + expect(data.type).toBeDefined(); + expectTypeOf(data.type).toEqualTypeOf(); + expect(data.objectives).toBeDefined(); + expectTypeOf(data.objectives).toEqualTypeOf(); + expect(data.toString()).toBeDefined(); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/Quest.ts b/src/Structures/Static/Quest.ts new file mode 100644 index 000000000..6d9c17339 --- /dev/null +++ b/src/Structures/Static/Quest.ts @@ -0,0 +1,25 @@ +import QuestObjective from './QuestObjective.js'; +import type { QuestReward, QuestType } from '../../Types/Static.js'; + +class Quest { + id: string; + name: string; + description: string; + rewards: QuestReward[]; + type: QuestType; + objectives: QuestObjective[]; + constructor(data: Record) { + this.id = (data?.id || '').trim(); + this.name = (data?.name || '').trim(); + this.description = (data?.description || '').trim(); + this.rewards = data.rewards || []; + this.type = 'DailyResetQuestRequirement' === data.requirements?.[0].type ? 'Daily' : 'Weekly'; + this.objectives = (data?.objectives || []).map((objective: any) => new QuestObjective(objective)); + } + + toString(): string { + return this.name; + } +} + +export default Quest; diff --git a/src/Structures/Static/QuestObjective.ts b/src/Structures/Static/QuestObjective.ts new file mode 100644 index 000000000..506d0748d --- /dev/null +++ b/src/Structures/Static/QuestObjective.ts @@ -0,0 +1,14 @@ +import type { QuestObjectiveType } from '../../Types/Static.js'; + +class QuestObjective { + id: string; + type: QuestObjectiveType; + amountNeeded: number; + constructor(objective: Record) { + this.id = objective.id; + this.type = 'IntegerObjective' === objective.type ? 'Integer' : 'Boolean'; + this.amountNeeded = parseInt(objective.integer || '1', 10); + } +} + +export default QuestObjective; diff --git a/src/Structures/Static/Quests.ts b/src/Structures/Static/Quests.ts new file mode 100644 index 000000000..38c0d01b5 --- /dev/null +++ b/src/Structures/Static/Quests.ts @@ -0,0 +1,17 @@ +import GameQuests from './GameQuests.js'; + +class Quests { + lastUpdatedTimestamp: number; + lastUpdatedAt: Date; + questsPerGame: Record; + constructor(data: Record) { + this.lastUpdatedTimestamp = data.lastUpdated; + this.lastUpdatedAt = new Date(this.lastUpdatedTimestamp); + this.questsPerGame = {}; + Object.keys(data.quests).forEach((game) => { + this.questsPerGame[game] = new GameQuests(game, data.quests[game]); + }); + } +} + +export default Quests; diff --git a/src/Structures/Status.test.ts b/src/Structures/Status.test.ts new file mode 100644 index 000000000..c52ae38ee --- /dev/null +++ b/src/Structures/Status.test.ts @@ -0,0 +1,20 @@ +import Game from './Game.js'; +import Status from './Status.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Status', () => { + const data = new Status({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Status); + expectTypeOf(data).toEqualTypeOf(); + expect(data.online).toBeDefined(); + expectTypeOf(data.online).toEqualTypeOf(); + expect(data.game).toBeDefined(); + expectTypeOf(data.game).toEqualTypeOf(); + expect(data.mode).toBeDefined(); + expectTypeOf(data.mode).toEqualTypeOf(); + expect(data.map).toBeDefined(); + expectTypeOf(data.map).toEqualTypeOf(); + expect(data.toString()).toBeDefined(); + expectTypeOf(data.toString()).toEqualTypeOf<'Online' | 'Offline'>(); +}); diff --git a/src/Structures/Status.ts b/src/Structures/Status.ts new file mode 100644 index 000000000..f1b1998ed --- /dev/null +++ b/src/Structures/Status.ts @@ -0,0 +1,20 @@ +import Game from './Game.js'; + +class Status { + online: boolean; + game: Game | null; + mode: string | null; + map: string | null; + constructor(data: Record) { + this.online = data?.online || false; + this.game = data.gameType ? new Game(data.gameType) : null; + this.mode = data?.mode || null; + this.map = data?.map || null; + } + + toString(): 'Online' | 'Offline' { + return this.online ? 'Online' : 'Offline'; + } +} + +export default Status; diff --git a/src/Structures/WatchdogStats.test.ts b/src/Structures/WatchdogStats.test.ts new file mode 100644 index 000000000..930803409 --- /dev/null +++ b/src/Structures/WatchdogStats.test.ts @@ -0,0 +1,24 @@ +import WatchdogStats from './WatchdogStats.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('WatchdogStats', () => { + const data = new WatchdogStats({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(WatchdogStats); + expectTypeOf(data).toEqualTypeOf(); + expect(data.byWatchdogTotal).toBeDefined(); + expect(data.byWatchdogTotal).toBeGreaterThanOrEqual(0); + expectTypeOf(data.byWatchdogTotal).toEqualTypeOf(); + expect(data.byWatchdogLastMinute).toBeDefined(); + expect(data.byWatchdogLastMinute).toBeGreaterThanOrEqual(0); + expectTypeOf(data.byWatchdogLastMinute).toEqualTypeOf(); + expect(data.byWatchdogRollingDay).toBeDefined(); + expect(data.byWatchdogRollingDay).toBeGreaterThanOrEqual(0); + expectTypeOf(data.byWatchdogRollingDay).toEqualTypeOf(); + expect(data.byStaffTotal).toBeDefined(); + expect(data.byStaffTotal).toBeGreaterThanOrEqual(0); + expectTypeOf(data.byStaffTotal).toEqualTypeOf(); + expect(data.byStaffRollingDay).toBeDefined(); + expect(data.byStaffRollingDay).toBeGreaterThanOrEqual(0); + expectTypeOf(data.byStaffRollingDay).toEqualTypeOf(); +}); diff --git a/src/Structures/WatchdogStats.ts b/src/Structures/WatchdogStats.ts new file mode 100644 index 000000000..0c0df19b5 --- /dev/null +++ b/src/Structures/WatchdogStats.ts @@ -0,0 +1,16 @@ +class WatchdogStats { + byWatchdogTotal: number; + byWatchdogLastMinute: number; + byWatchdogRollingDay: number; + byStaffTotal: number; + byStaffRollingDay: number; + constructor(data: Record) { + this.byWatchdogTotal = data?.watchdog_total || 0; + this.byWatchdogLastMinute = data?.watchdog_lastMinute || 0; + this.byWatchdogRollingDay = data?.watchdog_rollingDaily || 0; + this.byStaffTotal = data?.staff_total || 0; + this.byStaffRollingDay = data?.staff_rollingDaily || 0; + } +} + +export default WatchdogStats; diff --git a/src/Types/API.d.ts b/src/Types/API.d.ts new file mode 100644 index 000000000..81d0a545a --- /dev/null +++ b/src/Types/API.d.ts @@ -0,0 +1,26 @@ +import Auction from '../Structures/SkyBlock/Auctions/Auction.js'; +import AuctionInfo from '../Structures/SkyBlock/Auctions/AuctionInfo.js'; +import type { RequestOptions } from './Requests.js'; + +export interface PlayerRequestOptions extends RequestOptions { + guild?: boolean; + houses?: boolean; + recentGames?: boolean; +} + +export interface AuctionRequestOptions extends RequestOptions { + includeItemBytes?: boolean; +} + +export interface SkyblockRequestOptions extends RequestOptions { + garden?: boolean; + museum?: boolean; +} + +export interface SkyblockAuctionsResult { + info: AuctionInfo; + auctions: Auction[]; +} + +export type GuildFetchOptions = 'id' | 'name' | 'player'; +export type AuctionFetchOptions = 'profile' | 'player' | 'auction'; diff --git a/src/Types/Booster.d.ts b/src/Types/Booster.d.ts new file mode 100644 index 000000000..dbcd95e22 --- /dev/null +++ b/src/Types/Booster.d.ts @@ -0,0 +1 @@ +export type BoosterType = 'STACKED' | 'QUEUED' | 'ACTIVE'; diff --git a/src/Types/Client.d.ts b/src/Types/Client.d.ts new file mode 100644 index 000000000..877fabc7d --- /dev/null +++ b/src/Types/Client.d.ts @@ -0,0 +1,10 @@ +export interface ClientOptions { + cache?: boolean; + cacheTime?: number; + cacheMaxKeys?: number; + cacheCheckPeriod?: number; + rateLimit?: 'AUTO' | 'NONE'; + silent?: boolean; + checkForUpdates?: boolean; + checkForUpdatesInterval?: number; +} diff --git a/src/Types/Color.d.ts b/src/Types/Color.d.ts new file mode 100644 index 000000000..f7e7429d3 --- /dev/null +++ b/src/Types/Color.d.ts @@ -0,0 +1,71 @@ +type ColorCode = + | 'BLACK' + | 'DARK_BLUE' + | 'DARK_GREEN' + | 'DARK_AQUA' + | 'DARK_RED' + | 'DARK_PURPLE' + | 'GOLD' + | 'GRAY' + | 'DARK_GRAY' + | 'BLUE' + | 'GREEN' + | 'AQUA' + | 'RED' + | 'LIGHT_PURPLE' + | 'YELLOW' + | 'WHITE'; + +type ColorString = + | 'Black' + | 'Dark Blue' + | 'Dark Green' + | 'Dark Aqua' + | 'Dark Red' + | 'Dark Purple' + | 'Gold' + | 'Gray' + | 'Dark Gray' + | 'Blue' + | 'Green' + | 'Aqua' + | 'Red' + | 'Light Purple' + | 'Yellow' + | 'White'; + +type ColorHex = + | '#000000' + | '#0000AA' + | '#008000' + | '#00AAAA' + | '#AA0000' + | '#AA00AA' + | '#FFAA00' + | '#AAAAAA' + | '#555555' + | '#5555FF' + | '#3CE63C' + | '#3CE6E6' + | '#FF5555' + | '#FF55FF' + | '#FFFF55' + | '#FFFFFF'; + +export type InGameCode = + | '§0' + | '§1' + | '§2' + | '§3' + | '§4' + | '§5' + | '§6' + | '§7' + | '§8' + | '§9' + | '§a' + | '§b' + | '§c' + | '§d' + | '§e' + | '§f'; diff --git a/src/Types/Game.d.ts b/src/Types/Game.d.ts new file mode 100644 index 000000000..e5665402c --- /dev/null +++ b/src/Types/Game.d.ts @@ -0,0 +1,95 @@ +export type GameID = + | 2 + | 3 + | 4 + | 5 + | 6 + | 7 + | 13 + | 14 + | 17 + | 20 + | 21 + | 23 + | 24 + | 25 + | 26 + | 51 + | 52 + | 54 + | 55 + | 56 + | 57 + | 58 + | 59 + | 60 + | 61 + | 63 + | 64 + | 65 + | 67 + | 68; + +export type GameCode = + | 'QUAKECRAFT' + | 'WALLS' + | 'PAINTBALL' + | 'SURVIVAL_GAMES' + | 'TNTGAMES' + | 'VAMPIREZ' + | 'WALLS3' + | 'ARCADE' + | 'ARENA' + | 'UHC' + | 'MCGO' + | 'BATTLEGROUND' + | 'SUPER_SMASH' + | 'GINGERBREAD' + | 'HOUSING' + | 'SKYWARS' + | 'TRUE_COMBAT' + | 'SPEED_UHC' + | 'SKYCLASH' + | 'LEGACY' + | 'PROTOTYPE' + | 'BEDWARS' + | 'MURDER_MYSTERY' + | 'BUILD_BATTLE' + | 'DUELS' + | 'SKYBLOCK' + | 'PIT' + | 'REPLAY' + | 'SMP' + | 'WOOL_GAMES'; + +export type GameString = + | 'Quake' + | 'Walls' + | 'Paintball' + | 'Blitz Survival Games' + | 'TNT Games' + | 'VampireZ' + | 'Mega Walls' + | 'Arcade' + | 'Arena' + | 'UHC Champions' + | 'Cops and Crims' + | 'Warlords' + | 'Smash Heroes' + | 'Turbo Kart Racers' + | 'Housing' + | 'SkyWars' + | 'Crazy Walls' + | 'Speed UHC' + | 'SkyClash' + | 'Classic Games' + | 'Prototype' + | 'Bed Wars' + | 'Murder Mystery' + | 'Build Battle' + | 'Duels' + | 'SkyBlock' + | 'Pit' + | 'Replay' + | 'SMP' + | 'Wool Wars'; diff --git a/src/Types/Guild.d.ts b/src/Types/Guild.d.ts new file mode 100644 index 000000000..3fa114ab5 --- /dev/null +++ b/src/Types/Guild.d.ts @@ -0,0 +1,6 @@ +export interface ExpHistory { + day: string; + date: Date | undefined; + exp: number; + totalExp: number; +} diff --git a/src/Types/Player.d.ts b/src/Types/Player.d.ts new file mode 100644 index 000000000..3df4219dd --- /dev/null +++ b/src/Types/Player.d.ts @@ -0,0 +1,594 @@ +// Credits: Pixelic: https://github.com/pixelicc - Most types in player + +import Arcade from '../Structures/MiniGames/Arcade/Arcade.ts'; +import ArenaBrawl from '../Structures/MiniGames/ArenaBrawl/ArenaBrawl.ts'; +import BedWars from '../Structures/MiniGames/BedWars/BedWars.ts'; +import BlitzSurvivalGames from '../Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.ts'; +import BuildBattle from '../Structures/MiniGames/BuildBattle.js'; +import CopsAndCrims from '../Structures/MiniGames/CopsAndCrims/CopsAndCrims.ts'; +import Duels from '../Structures/MiniGames/Duels/Duels.ts'; +import MegaWalls from '../Structures/MiniGames/MegaWalls/MegaWalls.ts'; +import MurderMystery from '../Structures/MiniGames/MurderMystery/MurderMystery.ts'; +import Paintball from '../Structures/MiniGames/Paintball.js'; +import Pit from '../Structures/MiniGames/Pit/Pit.ts'; +import PitInventoryItem from '../Structures/MiniGames/Pit/PitInventoryItem.ts'; +import Quakecraft from '../Structures/MiniGames/Quakecraft/Quakecraft.ts'; +import SkyWars from '../Structures/MiniGames/SkyWars/SkyWars.ts'; +import SmashHeroes from '../Structures/MiniGames/SmashHeroes/SmashHeroes.ts'; +import SpeedUHC from '../Structures/MiniGames/SpeedUHC/SpeedUHC.ts'; +import TNTGames from '../Structures/MiniGames/TNTGames/TNTGames.ts'; +import TurboKartRacers from '../Structures/MiniGames/TurboKartRacers/TurboKartRacers.ts'; +import UHC from '../Structures/MiniGames/UHC/UHC.ts'; +import VampireZ from '../Structures/MiniGames/VampireZ/VampireZ.ts'; +import Walls from '../Structures/MiniGames/Walls.js'; +import Warlords from '../Structures/MiniGames/Warlords/Warlords.ts'; +import WoolGames from '../Structures/MiniGames/WoolGames/WoolGames.ts'; + +export type Language = + | 'CHINESE_SIMPLIFIED' + | 'CHINESE_TRADITIONAL' + | 'CZECH' + | 'DANISH' + | 'DUTCH' + | 'ENGLISH' + | 'FINNISH' + | 'FRENCH' + | 'GERMAN' + | 'GREEK' + | 'HUNGARIAN' + | 'ITALIAN' + | 'JAPANESE' + | 'KOREAN' + | 'NORWEGIAN' + | 'POLISH' + | 'PORTUGUESE_BR' + | 'PORTUGUESE_PT' + | 'PIRATE' + | 'ROMANIAN' + | 'RUSSIAN' + | 'SERBIAN_CYRILLIC' + | 'SPANISH' + | 'SWEDISH' + | 'TURKISH' + | 'UKRAINIAN'; +export type ChatChannel = 'ALL' | 'PARTY' | 'GUILD' | 'OFFICER' | 'PM' | 'SKYBLOCK_COOP'; +export type SeasonName = 'christmas' | 'easter' | 'summer' | 'halloween' | 'anniversary'; +export type SocialMediaId = 'DISCORD' | 'TWITTER' | 'YOUTUBE' | 'INSTAGRAM' | 'TIKTOK' | 'TWITCH' | 'HYPIXEL'; +export type ZombiesMaps = 'deadend' | 'badblood' | 'alienarcadium' | 'prison'; +export type EnderSpleefTrails = 'RAINBOW' | 'GREEN' | 'DEFAULT' | 'RED' | 'BLUE'; +export type TurboKartRacersMaps = 'retro' | 'hypixelgp' | 'olympus' | 'junglerush' | 'canyon'; +export type VampireZRoles = 'human' | 'vampire'; +export type PixelPartyGameModes = 'normal' | 'hyper'; +export type QuakecraftBarrels = 'SMALL_BALL' | 'LARGE_BALL' | 'BURST' | 'STAR' | 'CREEPER'; +export type QuakecraftTriggers = 'ZERO_POINT_EIGHT_FIVE' | 'ZERO_POINT_NINE' | 'ONE_POINT_ONE' | 'ONE_POINT_THREE'; +export type ArenaBrawlModes = '1v1' | '2v2' | '4v4'; +export type ArenaBrawlRunes = 'slowing' | 'energy' | 'damage' | 'tank' | 'speed'; +export type MiniWallsKits = 'soldier' | 'archer' | 'builder'; +export type WoolWarsClassNames = 'ASSAULT' | 'TANK' | 'GOLEM' | 'SWORDSMAN' | 'ENGINEER' | 'ARCHER'; +export type MurderMysteryModes = 'MURDER_CLASSIC' | 'MURDER_ASSASSINS' | 'MURDER_DOUBLE_UP' | 'MURDER_INFECTION'; +export type SmashHeoresModes = 'normal' | '2v2' | 'teams'; +export type SkyWarsBaseModes = 'solo' | 'team'; +export type MegaWallsModes = 'face_off' | 'gvg'; +export type SpeedUHCModes = 'solo' | 'solo_normal' | 'solo_insane' | 'team' | 'team_normal' | 'team_insane'; +export type UHCModes = 'solo' | 'red_vs_blue' | 'no_diamonds' | 'brawl' | 'solo_brawl' | 'duo_brawl'; +export type CopsAndCrimsGamemodes = 'deathmatch' | 'gungame'; +export type BedWarsPracticeRecordDistances = 30 | 50 | 100; +export type BedWarsPracticeRecordElevations = 'NONE' | 'SLIGHT' | 'STAIRCASE'; +export type BedWarsPracticeModes = 'BRIDGING' | 'FIREBALL_JUMPING' | 'BOW' | 'MLG' | 'PEARL_CLUTCHING'; +export type BedwarsDreamGamemodeName = 'ultimate' | 'rush' | 'armed' | 'lucky' | 'voidless'; +export type BedwarsGamemodeName = + | 'eight_one' + | 'eight_two' + | 'four_three' + | 'four_four' + | 'two_four' + | 'castle' + | 'eight_two_ultimate' + | 'four_four_ultimate' + | 'eight_two_rush' + | 'four_four_rush' + | 'eight_two_armed' + | 'four_four_armed' + | 'eight_two_lucky' + | 'four_four_lucky' + | 'eight_two_voidless' + | 'four_four_voidless'; + +export type BlitzSurvivalGamesKits = + | 'archer' + | 'meatmaster' + | 'speleologist' + | 'baker' + | 'knight' + | 'guardian' + | 'scout' + | 'hunter' + | 'hype train' + | 'fisherman' + | 'armorer' + | 'horsetamer' + | 'astronaut' + | 'troll' + | 'reaper' + | 'shark' + | 'reddragon' + | 'toxicologist' + | 'rogue' + | 'warlock' + | 'slimeyslime' + | 'jockey' + | 'golem' + | 'viking' + | 'shadow knight' + | 'pigman' + | 'paladin' + | 'necromancer' + | 'florist' + | 'diver' + | 'arachnologist' + | 'blaze' + | 'wolftamer' + | 'tim' + | 'farmer' + | 'creepertamer' + | 'snowman'; + +export type MegaWallsKits = + | 'cow' + | 'hunter' + | 'shark' + | 'arcanist' + | 'deadlord' + | 'golem' + | 'herobrine' + | 'pigman' + | 'zombie' + | 'blaze' + | 'enderman' + | 'shaman' + | 'squid' + | 'creeper' + | 'pirate' + | 'sheep' + | 'skeleton' + | 'spider' + | 'werewolf' + | 'angel' + | 'assassin' + | 'automaton' + | 'moleman' + | 'phoenix' + | 'renegade' + | 'snowman'; + +export type SkyWarsModes = + | 'mega' + | 'mega_doubles' + | 'lab' + | 'solo_normal' + | 'solo_insane' + | 'team_normal' + | 'team_insane'; + +export type SmashHeoresHeros = + | 'THE_BULK' + | 'CAKE_MONSTER' + | 'GENERAL_CLUCK' + | 'BOTMUN' + | 'MARAUDER' + | 'PUG' + | 'TINMAN' + | 'SPODERMAN' + | 'FROSTY' + | 'SERGEANT_SHIELD' + | 'SKULLFIRE' + | 'GOKU' + | 'SANIC' + | 'DUSK_CRAWLER' + | 'SHOOP_DA_WHOOP' + | 'GREEN_HOOD'; + +export type WarlordsClasses = + | 'pyromancer' + | 'mage' + | 'thunderlord' + | 'shaman' + | 'earthwarden' + | 'aquamancer' + | 'paladin' + | 'avenger' + | 'warrior' + | 'defender' + | 'cryomancer' + | 'crusader' + | 'berserker' + | 'protector' + | 'revenant' + | 'spiritguard'; + +export type DuelsModes = + | 'blitz' + | 'classic' + | 'bow' + | 'no_debuff' + | 'combo' + | 'tnt_games' + | 'sumo' + | 'parkour' + | 'bridge' + | 'bridge_duel' + | 'bridge_doubles' + | 'bridge_threes' + | 'bridge_fours' + | '2v2v2v2' + | '3v3v3v3' + | 'capture_threes' + | 'op' + | 'mega_walls' + | 'mw_duel' + | 'mw_doubles' + | 'sw' + | 'sw_duel' + | 'sw_doubles' + | 'uhc' + | 'uhc_duel' + | 'uhc_doubles' + | 'uhc_four' + | 'uhc_meetup' + | 'blitz_duel' + | 'classic_duel' + | 'bow_duel' + | 'potion_duel' + | 'combo_duel' + | 'bowspleef_duel' + | 'sumo_duel' + | 'parkour_eight' + | 'duel_arena' + | 'op_duel' + | 'op_doubles'; + +export type PaintballHats = + | 'speed_hat' + | 'vip_kevinkool_hat' + | 'vip_rezzus_hat' + | 'vip_agentk_hat' + | 'normal_hat' + | 'tnt_hat' + | 'vip_paintballkitty_hat' + | 'vip_ghost_hat' + | 'hard_hat' + | 'ender_hat' + | 'vip_codename_b_hat' + | 'snow_hat' + | 'vip_hypixel_hat' + | 'vip_noxyd_hat' + | 'squid_hat' + | 'shaky_hat' + | 'spider_hat' + | 'drunk_hat'; + +export type QuakecraftKillSounds = + | 'anvil_land' + | 'pig_death' + | 'bat_death' + | 'level_up' + | 'cow_hurt' + | 'ghast_death' + | 'creeper_death' + | 'blaze_death' + | 'zombie_woodbreak' + | 'enderman_death' + | 'wither_idle' + | 'dragon_growl' + | 'villager_mhm' + | 'horse_death' + | 'golem_death' + | 'thunder'; + +export type QuakecraftCase = + | 'SHINY_DIAMOND_HOE' + | 'STONE_HOE' + | 'SHINY_IRON_HOE' + | 'SHINY_STONE_HOE' + | 'SHINY_WOOD_HOE' + | 'WOOD_HOE' + | 'DIAMOND_HOE' + | 'SHINY_GOLD_HOE' + | 'IRON_HOE'; + +export type QuakecraftMuzzle = + | 'SOUL_SAND' + | 'QUARTZ' + | 'REDSTONE' + | 'NONE' + | 'IRON' + | 'DIAMOND' + | 'LAPIS' + | 'OBSIDIAN' + | 'PRISMARINE' + | 'EMERALD' + | 'PUMPKIN' + | 'COMMAND_BLOCK' + | 'SEA_LANTERN'; + +export type QuakecraftSights = + | 'BLACK' + | 'RED' + | 'YELLOW' + | 'SILVER' + | 'BLUE' + | 'DIAMOND' + | 'WHITE' + | 'PURPLE' + | 'EMERALD' + | 'GRAY' + | 'GOLD' + | 'ORANGE' + | 'PINK' + | 'GREEN'; + +export type SkyWarsKitNames = + | 'kit_mythical_end-lord' + | 'kit_supporting_team_armorsmith' + | 'ecologist' + | 'rookie' + | 'enchanter' + | 'snowman' + | 'armorsmith' + | 'scout' + | 'knight' + | 'armorer' + | 'energix' + | 'enderchest' + | 'healer' + | 'frog' + | 'grenade' + | 'batguy' + | 'pharaoh' + | 'disco' + | 'princess' + | 'enderman' + | 'pyro' + | 'speleologist' + | 'farmer' + | 'cannoneer' + | 'fisherman' + | 'troll' + | 'hunter' + | 'guardian' + | 'engineer' + | 'salmon' + | 'slime' + | 'magician' + | 'sloth' + | 'zookeeper' + | 'jester' + | 'golem' + | 'cactus' + | 'warlock' + | 'archeologist' + | 'kit_advanced_solo_pig-rider' + | 'kit_attacking_team_scout' + | 'kit_basic_solo_archeologist' + | 'kit_basic_solo_frog' + | 'kit_defending_team_armorer' + | 'kit_advanced_solo_armorer' + | 'kit_defending_team_batguy' + | 'kit_supporting_team_ecologist' + | 'kit_basic_solo_disco' + | 'kit_attacking_team_knight' + | 'kit_advanced_solo_farmer' + | 'kit_advanced_solo_hunter' + | 'kit_basic_solo_ecologist' + | 'kit_supporting_team_rookie' + | 'kit_supporting_team_healer' + | 'kit_mining_team_cannoneer' + | 'kit_defending_team_disco' + | 'kit_mining_team_default' + | 'kit_advanced_solo_pyro' + | 'kit_defending_team_baseball-player' + | 'kit_basic_solo_speleologist' + | 'kit_attacking_team_energix' + | 'kit_defending_team_frog' + | 'kit_advanced_solo_enderman' + | 'kit_basic_solo_baseball-player'; + +export type UHCKits = + | 'ARCHERY_TOOLS' + | 'WORKING_TOOLS' + | 'HORSEMAN' + | 'ECOLOGIST' + | 'LOOTER' + | 'MAGIC_TOOLS' + | 'TRAPPER'; + +export type CopsAndCrimsGuns = + | 'smg' + | 'rifle' + | 'carbine' + | 'magnum' + | 'shotgun' + | 'sniper' + | 'scoped_rifle' + | 'handgun' + | 'auto_shotgun' + | 'bullpup' + | 'knife'; + +export interface LevelProgress { + level: number; + xpToNext: number; + remainingXP: number; + currentXP: number; + percent: number; + percentRemaining: number; +} + +export interface PlayerStats { + arcade: Arcade; + arenaBrawl: ArenaBrawl; + bedwars: BedWars; + blitzsg: BlitzSurvivalGames; + buildbattle: BuildBattle; + copsandcrims: CopsAndCrims; + duels: Duels; + megawalls: MegaWalls; + murdermystery: MurderMystery; + paintball: Paintball; + pit: Pit; + quakecraft: Quakecraft; + skywars: SkyWars; + smashheroes: SmashHeroes; + speeduhc: SpeedUHC; + tntgames: TNTGames; + turbokartracers: TurboKartRacers; + uhc: UHC; + vampirez: VampireZ; + walls: Walls; + warlords: Warlords; + woolgames: WoolGames; +} + +export type PlayerRank = + | null + | 'VIP' + | 'VIP+' + | 'MVP' + | 'MVP+' + | 'MVP++' + | 'Game Master' + | 'Admin' + | 'YouTube' + | 'Events' + | 'Mojang' + | 'Owner' + | 'PIG+++' + | 'Innit'; + +export interface RanksPurchaseTime { + VIP: Date | null; + VIP_PLUS: Date | null; + MVP: Date | null; + MVP_PLUS: Date | null; +} + +export interface ScorpiusBribe { + year: number; + timestamp: number; +} + +export type BedWarsPrestige = + | 'Stone' + | 'Iron' + | 'Gold' + | 'Diamond' + | 'Emerald' + | 'Sapphire' + | 'Ruby' + | 'Crystal' + | 'Opal' + | 'Amethyst' + | 'Rainbow' + | 'Iron Prime' + | 'Gold Prime' + | 'Diamond Prime' + | 'Emerald Prime' + | 'Sapphire Prime' + | 'Ruby Prime' + | 'Crystal Prime' + | 'Opal Prime' + | 'Amethyst Prime' + | 'Mirror' + | 'Light' + | 'Dawn' + | 'Dusk' + | 'Air' + | 'Wind' + | 'Nebula' + | 'Thunder' + | 'Earth' + | 'Water' + | 'Fire' + | 'Sunrise' + | 'Eclipse' + | 'Gamma' + | 'Majestic' + | 'Andesine' + | 'Marine' + | 'Element' + | 'Galaxy' + | 'Atomic' + | 'Sunset' + | 'Time' + | 'Winter' + | 'Obsidian' + | 'Spring' + | 'Ice' + | 'Summer' + | 'Spinel' + | 'Autumn' + | 'Mystic' + | 'Eternal'; + +export type SkyWarsPrestige = + | 'Iron' + | 'Gold' + | 'Diamond' + | 'Emerald' + | 'Sapphire' + | 'Ruby' + | 'Crystal' + | 'Opal' + | 'Amethyst' + | 'Rainbow' + | 'Mythic'; + +export type TurboKartRacersHorn = + | 'DEFAULT' + | 'SHY' + | 'ALIEN' + | 'TAXI' + | 'KLAXON' + | 'TRICYCLE' + | 'ALARM' + | 'KLOON' + | 'TEDDY' + | 'TRUCK' + | 'JERRY'; + +export type DuelsBaseDivision = + | 'Rookie' + | 'Iron' + | 'Gold' + | 'Diamond' + | 'Master' + | 'Legend' + | 'Grandmaster' + | 'Godlike' + | 'Celestial' + | 'Divine' + | 'Ascended'; + +export interface BuildBattleWins { + solo: number; + teams: number; + pro: number; + gtb: number; +} + +export interface WoolGamesPrivateGameConfig { + one_hit_one_kill: boolean; + rainbow_wool: 'Enabled' | 'Disabled'; + health_buff: string; + game_speed: string; + speed: string; + no_class: 'Enabled' | 'Disabled'; + respawn_enable: boolean; +} + +export interface PitArmor { + helmet: PitInventoryItem | null; + chestplate: PitInventoryItem | null; + leggings: PitInventoryItem | null; + boots: PitInventoryItem | null; +} diff --git a/src/Types/Requests.d.ts b/src/Types/Requests.d.ts new file mode 100644 index 000000000..b4f4042de --- /dev/null +++ b/src/Types/Requests.d.ts @@ -0,0 +1,4 @@ +export interface RequestOptions { + raw?: boolean; + noCache?: boolean; +} diff --git a/src/Types/Skyblock.d.ts b/src/Types/Skyblock.d.ts new file mode 100644 index 000000000..f3d56d41d --- /dev/null +++ b/src/Types/Skyblock.d.ts @@ -0,0 +1,416 @@ +import SkyblockInventoryItem from '../Structures/SkyBlock/SkyblockInventoryItem.ts'; + +export type SkyblockGemstoneQuality = 'Rough' | 'Flawed' | 'Fine' | 'Flawless' | 'Perfect'; +export type TrophyFishRank = 'Bronze' | 'Silver' | 'Gold' | 'Diamond'; +export type DungeonClass = 'healer' | 'mage' | 'berserk' | 'archer' | 'tank'; +export type CrimsonIsleFactions = 'mages' | 'barbarians'; +export type CrimsonIsleBelt = 'White' | 'Yellow' | 'Green' | 'Blue' | 'Brown' | 'Black'; +export type CrimsonIsleDojoRank = 'S' | 'A' | 'B' | 'C' | 'D' | 'F'; +export type Rarity = + | 'COMMON' + | 'UNCOMMON' + | 'RARE' + | 'EPIC' + | 'LEGENDARY' + | 'MYTHIC' + | 'DIVINE' + | 'SPECIAL' + | 'VERY_SPECIAL'; + +export interface Equipment { + gauntlet: SkyblockInventoryItem | null; + belt: SkyblockInventoryItem | null; + cloak: SkyblockInventoryItem | null; + necklace: SkyblockInventoryItem | null; +} + +export interface Armor { + helmet: SkyblockInventoryItem | null; + chestplate: SkyblockInventoryItem | null; + leggings: SkyblockInventoryItem | null; + boots: SkyblockInventoryItem | null; +} + +export interface MemberStatsCandyCollected { + green: number; + purple: number; + total: number; +} + +export interface MemberStatsFestival { + year: number; + collected: MemberStatsCandyCollected; +} + +export interface MemberStatsCandy extends MemberStatsCandyCollected { + festivals: MemberStatsFestival[]; +} + +export interface MemberStatsPetMilestones { + oresMinned: number; + seaCreaturesKilled: number; +} + +export interface MemberStatsAuctionsStats { + uncommon: number; + common: number; + rare: number; + epic: number; + legendary: number; + special: number; + mythic: number; + total: number; +} + +export interface MemberStatsAuctions { + bids: number; + highestBid: number; + goldSpent: number; + goldEarnt: number; + auctionsWon: number; + auctionsCompleted: number; + auctionsCreated: number; + auctionFees: number; + auctionsWithOutBids: number; + sold: MemberStatsAuctionsStats; + bought: MemberStatsAuctionsStats; +} + +export interface MemberStatsGifts { + given: number; + received: number; +} + +export interface MemberStatsFishing { + total: number; + normal: number; + tresure: number; + largeTresure: number; +} + +export interface MemberStatsBurrow { + total: number; + common: number; +} + +export interface MemberStatsMythos { + kills: number; + burrowsDugNext: MemberStatsBurrow; + burrowsDugCombat: MemberStatsBurrow; + burrowsDugTreasure: MemberStatsBurrow; + burrowsDugComplate: MemberStatsBurrow; +} + +export interface JacobDataMedals { + gold: number; + silver: number; + bronze: number; +} + +export interface JacobDataPerks { + doubleDrops: number; + farmingLevelCap: number; + personalBests: boolean; +} + +export interface JacobData { + medals: JacobDataMedals; + perks: JacobDataPerks; + contests: Record; +} + +export interface ChocolateFactoryDataEmployees { + bro: number; + cousin: number; + sis: number; + father: number; + grandma: number; + dog: number; + uncle: number; +} + +export interface ChocolateFactoryDataChocolate { + current: number; + total: number; + sincePrestige: number; +} + +export interface ChocolateFactoryDataTimeTower { + charges: number; + level: number; +} + +export interface ChocolateFactoryDataUpgrades { + click: number; + multiplier: number; + rabbitRarity: number; +} + +export interface ChocolateFactoryDataGoldenClick { + amount: number; + year: number; +} + +export interface ChocolateFactoryData { + employees: ChocolateFactoryDataEmployees; + chocolate: ChocolateFactoryDataChocolate; + timeTower: ChocolateFactoryDataTimeTower; + upgrades: ChocolateFactoryDataUpgrades; + goldenClick: ChocolateFactoryDataGoldenClick; + barnCapacity: number; + prestige: number; +} + +export interface SlayerData { + xp: number; + tier1: number; + tier2: number; + tier3: number; + tier4: number; + tier5: number; + level: number; +} + +export interface Slayer { + zombie: SlayerData; + spider: SlayerData; + wolf: SlayerData; + enderman: SlayerData; + blaze: SlayerData; + vampire: SlayerData; +} +export interface SkillLevel { + xp: number; + level: number; + maxLevel: number; + xpCurrent: number; + xpForNext: number; + progress: number; + cosmetic: boolean; +} + +export interface Skills { + combat: SkillLevel; + farming: SkillLevel; + fishing: SkillLevel; + mining: SkillLevel; + foraging: SkillLevel; + enchanting: SkillLevel; + alchemy: SkillLevel; + carpentry: SkillLevel; + runecrafting: SkillLevel; + taming: SkillLevel; + social: SkillLevel; + average: number; +} + +export interface RawDungeonRun { + timestamp: number; + score_exploration: number; + score_speed: number; + score_skill: number; + score_bonus: number; + dungeon_class: DungeonClass; + teammates: string[]; + elapsed_time: number; + damage_dealt: number; + deaths: number; + mobs_killed: number; + secrets_found: number; + damage_mitigated: number; + ally_healing: number; +} + +export interface DungeonsFloorStats { + fastestRun: RawDungeonRun; + fastestSRun: RawDungeonRun; + fastestSPlusRun: RawDungeonRun; + completions: number; +} + +export interface DungeonsFloors { + entrance: DungeonsFloorStats; + floor1: DungeonsFloorStats; + floor2: DungeonsFloorStats; + floor3: DungeonsFloorStats; + floor4: DungeonsFloorStats; + floor5: DungeonsFloorStats; + floor6: DungeonsFloorStats; + floor7: DungeonsFloorStats; + masterMode1: DungeonsFloorStats; + masterMode2: DungeonsFloorStats; + masterMode3: DungeonsFloorStats; + masterMode4: DungeonsFloorStats; + masterMode5: DungeonsFloorStats; + masterMode6: DungeonsFloorStats; + masterMode7: DungeonsFloorStats; +} + +export interface DungeonsClasses { + healer: SkillLevel; + mage: SkillLevel; + berserk: SkillLevel; + archer: SkillLevel; + tank: SkillLevel; + selected: DungeonClass; +} + +export interface DungeonsEssence { + diamond: number; + dragon: number; + spider: number; + wither: number; + undead: number; + gold: number; + ice: number; + crimson: number; +} +export interface DungeonsCompletions { + catacombs: Record; + masterMode: Record; +} + +export interface Dungeons { + experience: SkillLevel; + secrets: number; + completions: DungeonsCompletions; + floors: DungeonsFloors; + classes: DungeonsClasses; + essence: DungeonsEssence; +} + +export interface CrimsonIsleKuudra { + none: number; + hot: number; + burning: number; + fiery: number; + highestWaveHot: number; + highestWaveFiery: number; + infernal: number; + highestWaveInfernal: number; + highestWaveBurning: number; +} + +export interface CrimsonIsleReputation { + mages: number; + barbarians: number; +} + +export interface CrimsonIsleTrophyFishCaught { + total: number; + bronze: number; + silver: number; + gold: number; + diamond: number; +} + +export interface CrimsonIsleTrophyFish { + rank: TrophyFishRank; + caught: CrimsonIsleTrophyFishCaught; +} + +export interface CrimsonIsleDojoMinigame { + points: number; + rank: CrimsonIsleDojoRank; +} + +export interface CrimsonIsleDojo { + belt: CrimsonIsleBelt; + force: CrimsonIsleDojoMinigame; + stamina: CrimsonIsleDojoMinigame; + mastery: CrimsonIsleDojoMinigame; + discipline: CrimsonIsleDojoMinigame; + swiftness: CrimsonIsleDojoMinigame; + control: CrimsonIsleDojoMinigame; + tenacity: CrimsonIsleDojoMinigame; +} + +export interface CrimsonIsle { + faction: CrimsonIsleFactions | null; + reputation: CrimsonIsleReputation; + trophyFish: CrimsonIsleTrophyFish; + dojo: CrimsonIsleDojo; + kuudra: CrimsonIsleKuudra; +} + +export interface HOTMPowderData { + spent: number; + current: number; + total: number; +} + +export interface HOTMPowder { + mithril: HOTMPowderData; + gemstone: HOTMPowderData; + glacite: HOTMPowderData; +} + +export interface HOTM { + experience: SkillLevel; + ability: string; + powder: HOTMPowder; +} +export interface SkyblockGardenVisitorServed { + total: number; + unique: number; +} + +export interface SkyblockGardenVisitor { + visited: Record; + completed: Record; + served: SkyblockGardenVisitorServed; +} + +export interface SkyblockGardenComposterUpgrades { + speed: number; + multiDrop: number; + fuelCap: number; + organicMatterCap: number; + costReduction: number; +} + +export interface SkyblockGardenComposter { + organicMatter: number; + fuelUnits: number; + compostUnits: number; + compostItems: number; + conversionTicks: number; + upgrades: SkyblockGardenComposterUpgrades; +} + +export interface SkyblockGarenCrops { + wheat: number; + carrot: number; + sugarCane: number; + potato: number; + pumpkin: number; + melon: number; + cactus: number; + cocoaBeans: number; + mushroom: number; + netherWart: number; +} + +export interface SkyblockGardenCropMilestones { + wheat: SkillLevel; + carrot: SkillLevel; + sugarCane: SkillLevel; + potato: SkillLevel; + pumpkin: SkillLevel; + melon: SkillLevel; + cactus: SkillLevel; + cocoaBeans: SkillLevel; + mushroom: SkillLevel; + netherWart: SkillLevel; +} + +export interface ProductStatus { + sellPrice: number; + buyPrice: number; + sellVolume: number; + buyVolume: number; + sellMovingWeek: number; + buyMovingWeek: number; + sellOrders: number; + buyOrders: number; +} diff --git a/src/Types/Static.d.ts b/src/Types/Static.d.ts new file mode 100644 index 000000000..b16d4a838 --- /dev/null +++ b/src/Types/Static.d.ts @@ -0,0 +1,18 @@ +export type QuestObjectiveType = 'Integer' | 'Boolean'; +export type QuestType = 'Daily' | 'Weekly'; + +export interface QuestReward { + type: string; + amount: number; +} + +export interface ChallengeReward { + type: 'MultipliedExperienceReward'; + amount: number; +} + +export interface AchivementTier { + tier: number; + points?: number; + amount: number; +} diff --git a/src/utils/Constants.js b/src/Utils/Constants.ts similarity index 55% rename from src/utils/Constants.js rename to src/Utils/Constants.ts index 3af8041b6..a4385abb7 100644 --- a/src/utils/Constants.js +++ b/src/Utils/Constants.ts @@ -1,17 +1,235 @@ -module.exports = { - duelsDivisions: [ - { name: 'Rookie', key: 'rookie' }, - { name: 'Iron', key: 'iron' }, - { name: 'Gold', key: 'gold' }, - { name: 'Diamond', key: 'diamond' }, - { name: 'Master', key: 'master' }, - { name: 'Legend', key: 'legend' }, - { name: 'Grandmaster', key: 'grandmaster' }, - { name: 'Godlike', key: 'godlike' }, - { name: 'Celestial', key: 'celestial' }, - { name: 'Divine', key: 'divine' }, - { name: 'Ascended', key: 'ascended' } +import { GameCode, GameID, GameString } from '../Types/Game.js'; +import type { DuelsBaseDivision } from '../Types/Player.js'; + +export const games: { id: GameID; code: GameCode; name: GameString }[] = [ + { id: 2, code: 'QUAKECRAFT', name: 'Quake' }, + { id: 3, code: 'WALLS', name: 'Walls' }, + { id: 4, code: 'PAINTBALL', name: 'Paintball' }, + { id: 5, code: 'SURVIVAL_GAMES', name: 'Blitz Survival Games' }, + { id: 6, code: 'TNTGAMES', name: 'TNT Games' }, + { id: 7, code: 'VAMPIREZ', name: 'VampireZ' }, + { id: 13, code: 'WALLS3', name: 'Mega Walls' }, + { id: 14, code: 'ARCADE', name: 'Arcade' }, + { id: 17, code: 'ARENA', name: 'Arena' }, + { id: 20, code: 'UHC', name: 'UHC Champions' }, + { id: 21, code: 'MCGO', name: 'Cops and Crims' }, + { id: 23, code: 'BATTLEGROUND', name: 'Warlords' }, + { id: 24, code: 'SUPER_SMASH', name: 'Smash Heroes' }, + { id: 25, code: 'GINGERBREAD', name: 'Turbo Kart Racers' }, + { id: 26, code: 'HOUSING', name: 'Housing' }, + { id: 51, code: 'SKYWARS', name: 'SkyWars' }, + { id: 52, code: 'TRUE_COMBAT', name: 'Crazy Walls' }, + { id: 54, code: 'SPEED_UHC', name: 'Speed UHC' }, + { id: 55, code: 'SKYCLASH', name: 'SkyClash' }, + { id: 56, code: 'LEGACY', name: 'Classic Games' }, + { id: 57, code: 'PROTOTYPE', name: 'Prototype' }, + { id: 58, code: 'BEDWARS', name: 'Bed Wars' }, + { id: 59, code: 'MURDER_MYSTERY', name: 'Murder Mystery' }, + { id: 60, code: 'BUILD_BATTLE', name: 'Build Battle' }, + { id: 61, code: 'DUELS', name: 'Duels' }, + { id: 63, code: 'SKYBLOCK', name: 'SkyBlock' }, + { id: 64, code: 'PIT', name: 'Pit' }, + { id: 65, code: 'REPLAY', name: 'Replay' }, + { id: 67, code: 'SMP', name: 'SMP' }, + { id: 68, code: 'WOOL_GAMES', name: 'Wool Wars' } +]; + +export const duelsDivisions: { name: DuelsBaseDivision; key: string }[] = [ + { name: 'Rookie', key: 'rookie' }, + { name: 'Iron', key: 'iron' }, + { name: 'Gold', key: 'gold' }, + { name: 'Diamond', key: 'diamond' }, + { name: 'Master', key: 'master' }, + { name: 'Legend', key: 'legend' }, + { name: 'Grandmaster', key: 'grandmaster' }, + { name: 'Godlike', key: 'godlike' }, + { name: 'Celestial', key: 'celestial' }, + { name: 'Divine', key: 'divine' }, + { name: 'Ascended', key: 'ascended' } +]; + +export const MiniGamesString: { [key: string]: string } = { + QUAKECRAFT: 'Quakecraft', + WALLS: 'Walls', + PAINTBALL: 'Paintball', + SURVIVAL_GAMES: 'Blitz Survival Games', + TNTGAMES: 'The TNT Games', + VAMPIREZ: 'VampireZ', + WALLS3: 'Mega Walls', + ARCADE: 'Arcade', + ARENA: 'Arena Brawl', + MCGO: 'Cops and Crims', + UHC: 'UHC Champions', + BATTLEGROUND: 'Warlords', + SUPER_SMASH: 'Smash Heroes', + GINGERBREAD: 'Turbo Kart Racers', + HOUSING: 'Housing', + SKYWARS: 'SkyWars', + TRUE_COMBAT: 'Crazy Walls', + SPEED_UHC: 'Speed UHC', + SKYCLASH: 'SkyClash', + LEGACY: 'Classic Games', + PROTOTYPE: 'Prototype', + BEDWARS: 'BedWars', + MURDER_MYSTERY: 'Murder Mystery', + BUILD_BATTLE: 'Build Battle', + DUELS: 'Duels', + PIT: 'The Pit', + SKYBLOCK: 'SkyBlock', + REPLAY: 'Replay', + LIMBO: 'Limbo', + IDLE: 'Idle', + QUEUE: 'Queue', + MAIN_LOBBY: 'Main Lobby', + TOURNAMENT_LOBBY: 'Tournament Lobby', + WOOL_GAMES: 'Wool Wars' +}; + +// Credits (pit) https://github.com/PitPanda/PitPandaProduction/blob/b1971f56ea1aa8c829b722cbb33247c96591c0cb/structures/Pit.js + +interface PitPrestigeData { + Multiplier: number; + TotalXp: number; + SumXp: number; + GoldReq: number; + Renown: number; +} +interface PitLevelData { + Xp: number; +} + +export const pit: { Prestiges: PitPrestigeData[]; Levels: PitLevelData[] } = { + Prestiges: [ + { Multiplier: 1, TotalXp: 65950, SumXp: 65950, GoldReq: 10000, Renown: 0 }, + { Multiplier: 1.1, TotalXp: 72560, SumXp: 138510, GoldReq: 20000, Renown: 10 }, + { Multiplier: 1.2, TotalXp: 79170, SumXp: 217680, GoldReq: 20000, Renown: 10 }, + { Multiplier: 1.3, TotalXp: 85750, SumXp: 303430, GoldReq: 20000, Renown: 10 }, + { Multiplier: 1.4, TotalXp: 92330, SumXp: 395760, GoldReq: 30000, Renown: 10 }, + { Multiplier: 1.5, TotalXp: 98940, SumXp: 494700, GoldReq: 35000, Renown: 10 }, + { Multiplier: 1.75, TotalXp: 115440, SumXp: 610140, GoldReq: 40000, Renown: 20 }, + { Multiplier: 2, TotalXp: 131900, SumXp: 742040, GoldReq: 45000, Renown: 20 }, + { Multiplier: 2.5, TotalXp: 164890, SumXp: 906930, GoldReq: 50000, Renown: 20 }, + { Multiplier: 3, TotalXp: 197850, SumXp: 1104780, GoldReq: 60000, Renown: 20 }, + { Multiplier: 4, TotalXp: 263800, SumXp: 1368580, GoldReq: 70000, Renown: 20 }, + { Multiplier: 5, TotalXp: 329750, SumXp: 1698330, GoldReq: 80000, Renown: 30 }, + { Multiplier: 6, TotalXp: 395700, SumXp: 2094030, GoldReq: 90000, Renown: 30 }, + { Multiplier: 7, TotalXp: 461650, SumXp: 2555680, GoldReq: 100000, Renown: 30 }, + { Multiplier: 8, TotalXp: 527600, SumXp: 3083280, GoldReq: 125000, Renown: 30 }, + { Multiplier: 9, TotalXp: 593550, SumXp: 3676830, GoldReq: 150000, Renown: 30 }, + { Multiplier: 10, TotalXp: 659500, SumXp: 4336330, GoldReq: 175000, Renown: 40 }, + { Multiplier: 12, TotalXp: 791400, SumXp: 5127730, GoldReq: 200000, Renown: 40 }, + { Multiplier: 14, TotalXp: 923300, SumXp: 6051030, GoldReq: 250000, Renown: 40 }, + { Multiplier: 16, TotalXp: 1055200, SumXp: 7106230, GoldReq: 300000, Renown: 40 }, + { Multiplier: 18, TotalXp: 1187100, SumXp: 8293330, GoldReq: 350000, Renown: 40 }, + { Multiplier: 20, TotalXp: 1319000, SumXp: 9612330, GoldReq: 400000, Renown: 50 }, + { Multiplier: 24, TotalXp: 1582800, SumXp: 11195130, GoldReq: 500000, Renown: 50 }, + { Multiplier: 28, TotalXp: 1846600, SumXp: 13041730, GoldReq: 600000, Renown: 50 }, + { Multiplier: 32, TotalXp: 2110400, SumXp: 15152130, GoldReq: 700000, Renown: 50 }, + { Multiplier: 36, TotalXp: 2374200, SumXp: 17526330, GoldReq: 800000, Renown: 50 }, + { Multiplier: 40, TotalXp: 2638000, SumXp: 20164330, GoldReq: 900000, Renown: 75 }, + { Multiplier: 45, TotalXp: 2967750, SumXp: 23132080, GoldReq: 1000000, Renown: 75 }, + { Multiplier: 50, TotalXp: 3297500, SumXp: 26429580, GoldReq: 1000000, Renown: 75 }, + { Multiplier: 75, TotalXp: 4946250, SumXp: 31375830, GoldReq: 1000000, Renown: 75 }, + { Multiplier: 100, TotalXp: 6595000, SumXp: 37970830, GoldReq: 1000000, Renown: 250 }, + { Multiplier: 101, TotalXp: 6660950, SumXp: 44631780, GoldReq: 1000000, Renown: 100 }, + { Multiplier: 101, TotalXp: 6660950, SumXp: 51292730, GoldReq: 1000000, Renown: 100 }, + { Multiplier: 101, TotalXp: 6660950, SumXp: 57953680, GoldReq: 1000000, Renown: 100 }, + { Multiplier: 101, TotalXp: 6660950, SumXp: 64614630, GoldReq: 1000000, Renown: 100 }, + { Multiplier: 101, TotalXp: 6660950, SumXp: 71275580, GoldReq: 2000000, Renown: 100 }, + { Multiplier: 200, TotalXp: 13190000, SumXp: 84465580, GoldReq: 2000000, Renown: 100 }, + { Multiplier: 300, TotalXp: 19785000, SumXp: 104250580, GoldReq: 2000000, Renown: 100 }, + { Multiplier: 400, TotalXp: 26380000, SumXp: 130630580, GoldReq: 2000000, Renown: 100 }, + { Multiplier: 500, TotalXp: 32975000, SumXp: 163605580, GoldReq: 2000000, Renown: 100 }, + { Multiplier: 750, TotalXp: 49462500, SumXp: 213068080, GoldReq: 2000000, Renown: 100 }, + { Multiplier: 1000, TotalXp: 65950000, SumXp: 279018080, GoldReq: 2000000, Renown: 100 }, + { Multiplier: 1250, TotalXp: 82437500, SumXp: 361455580, GoldReq: 2000000, Renown: 100 }, + { Multiplier: 1500, TotalXp: 98925000, SumXp: 460380580, GoldReq: 2000000, Renown: 100 }, + { Multiplier: 1750, TotalXp: 115412500, SumXp: 575793080, GoldReq: 2000000, Renown: 100 }, + { Multiplier: 2000, TotalXp: 131900000, SumXp: 707693080, GoldReq: 2000000, Renown: 100 }, + { Multiplier: 3000, TotalXp: 197850000, SumXp: 905543080, GoldReq: 2000000, Renown: 100 }, + { Multiplier: 5000, TotalXp: 329750000, SumXp: 1235293080, GoldReq: 2000000, Renown: 100 }, + { Multiplier: 10000, TotalXp: 659500000, SumXp: 1894793080, GoldReq: 2000000, Renown: 100 }, + { Multiplier: 50000, TotalXp: 3297500000, SumXp: 5192293080, GoldReq: 2000000, Renown: 100 }, + { Multiplier: 100000, TotalXp: 6595000000, SumXp: 11787293080, GoldReq: 0, Renown: 100 } + ], + Levels: [ + { Xp: 15 }, + { Xp: 30 }, + { Xp: 50 }, + { Xp: 75 }, + { Xp: 125 }, + { Xp: 300 }, + { Xp: 600 }, + { Xp: 800 }, + { Xp: 900 }, + { Xp: 1000 }, + { Xp: 1200 }, + { Xp: 1500 }, + { Xp: 0 } + ] +}; + +export const bestiaryBrackets: { [key: number]: number[] } = { + 1: [ + 20, 40, 60, 100, 200, 400, 800, 1400, 2000, 3000, 6000, 12000, 20000, 30000, 40000, 50000, 60000, 72000, 86000, + 100000, 200000, 400000, 600000, 800000, 1000000 + ], + 2: [ + 5, 10, 15, 25, 50, 100, 200, 350, 500, 750, 1500, 3000, 5000, 7500, 10000, 12500, 15000, 18000, 21500, 25000, 50000, + 100000, 150000, 200000, 250000 + ], + 3: [ + 4, 8, 12, 16, 20, 40, 80, 140, 200, 300, 600, 1200, 2000, 3000, 4000, 5000, 6000, 7200, 8600, 10000, 20000, 40000, + 60000, 80000, 100000 + ], + 4: [ + 2, 4, 6, 10, 15, 20, 25, 35, 50, 75, 150, 300, 500, 750, 1000, 1350, 1650, 2000, 2500, 3000, 5000, 10000, 15000, + 20000, 25000 ], + 5: [ + 1, 2, 3, 5, 7, 10, 15, 20, 25, 30, 60, 120, 200, 300, 400, 500, 600, 720, 860, 1000, 2000, 4000, 6000, 8000, 10000 + ], + 6: [1, 2, 3, 5, 7, 9, 14, 17, 21, 25, 50, 80, 125, 175, 250, 325, 425, 525, 625, 750, 1500], + 7: [1, 2, 3, 5, 7, 9, 11, 14, 17, 20, 30, 40, 55, 75, 100, 150, 200, 275, 375, 500, 1000] +}; + +export const petLevels: number[] = [ + 100, 110, 120, 130, 145, 160, 175, 190, 210, 230, 250, 275, 300, 330, 360, 400, 440, 490, 540, 600, 660, 730, 800, + 880, 960, 1050, 1150, 1260, 1380, 1510, 1650, 1800, 1960, 2130, 2310, 2500, 2700, 2920, 3160, 3420, 3700, 4000, 4350, + 4750, 5200, 5700, 6300, 7000, 7800, 8700, 9700, 10800, 12000, 13300, 14700, 16200, 17800, 19500, 21300, 23200, 25200, + 27400, 29800, 32400, 35200, 38200, 41400, 44800, 48400, 52200, 56200, 60400, 64800, 69400, 74200, 79200, 84700, 90700, + 97200, 104200, 111700, 119700, 128200, 137200, 146700, 156700, 167700, 179700, 192700, 206700, 221700, 237700, 254700, + 272700, 291700, 311700, 333700, 357700, 383700, 411700, 441700, 476700, 516700, 561700, 611700, 666700, 726700, + 791700, 861700, 936700, 1016700, 1101700, 1191700, 1286700, 1386700, 1496700, 1616700, 1746700, 1886700, 0, 5555, + 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, + 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, + 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, + 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, + 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, + 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, + 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, + 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700 +]; + +export const petScore: { [key: string]: number } = { + COMMON: 1, + UNCOMMON: 2, + RARE: 3, + EPIC: 4, + LEGENDARY: 5, + MYTHIC: 6, + VERY_SPECIAL: 6 +}; +export const petRarityOffset: { [key: string]: number } = { + COMMON: 0, + UNCOMMON: 6, + RARE: 11, + EPIC: 16, + LEGENDARY: 20, + MYTHIC: 20 +}; + +export default { levelingXp: { 1: 50, 2: 125, @@ -62,9 +280,7 @@ module.exports = { 47: 3100000, 48: 3400000, 49: 3700000, - 50: 4000000 - }, - xpPast50: { + 50: 4000000, 51: 4300000, 52: 4600000, 53: 4900000, @@ -172,18 +388,7 @@ module.exports = { 50: 1.1625e8, 55: 1e9 }, - hotmXp: { - 1: 0, - 2: 3000, - 3: 9000, - 4: 25000, - 5: 60000, - 6: 100000, - 7: 150000, - 8: 210000, - 9: 290000, - 10: 400000 - }, + hotmXp: { 1: 0, 2: 3000, 3: 9000, 4: 25000, 5: 60000, 6: 100000, 7: 150000, 8: 210000, 9: 290000, 10: 400000 }, socialXp: { 1: 50, 2: 100, @@ -708,100 +913,6 @@ module.exports = { 45: 9000000, 46: 9000000 }, - petScore: { - COMMON: 1, - UNCOMMON: 2, - RARE: 3, - EPIC: 4, - LEGENDARY: 5, - MYTHIC: 6 - }, - petRarityOffset: { - COMMON: 0, - UNCOMMON: 6, - RARE: 11, - EPIC: 16, - LEGENDARY: 20, - MYTHIC: 20 - }, - petLevels: [ - 100, 110, 120, 130, 145, 160, 175, 190, 210, 230, 250, 275, 300, 330, 360, 400, 440, 490, 540, 600, 660, 730, 800, - 880, 960, 1050, 1150, 1260, 1380, 1510, 1650, 1800, 1960, 2130, 2310, 2500, 2700, 2920, 3160, 3420, 3700, 4000, - 4350, 4750, 5200, 5700, 6300, 7000, 7800, 8700, 9700, 10800, 12000, 13300, 14700, 16200, 17800, 19500, 21300, 23200, - 25200, 27400, 29800, 32400, 35200, 38200, 41400, 44800, 48400, 52200, 56200, 60400, 64800, 69400, 74200, 79200, - 84700, 90700, 97200, 104200, 111700, 119700, 128200, 137200, 146700, 156700, 167700, 179700, 192700, 206700, 221700, - 237700, 254700, 272700, 291700, 311700, 333700, 357700, 383700, 411700, 441700, 476700, 516700, 561700, 611700, - 666700, 726700, 791700, 861700, 936700, 1016700, 1101700, 1191700, 1286700, 1386700, 1496700, 1616700, 1746700, - 1886700, 0, 5555, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, - 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, - 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, - 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, - 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, - 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, - 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, - 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700 - ], - leaderboardNames: { - ARENA: 'ARENA', - COPS_AND_CRIMS: 'MCGO', - WARLORDS: 'BATTLEGROUND', - BLITZ_SURVIVAL_GAMES: 'SURVIVAL_GAMES', - UHC: 'UHC', - WALLS: 'WALLS', - PROTOTYPE: 'PROTOTYPE', - PAINTBALL: 'PAINTBALL', - SKYWARS: 'SKYWARS', - MURDER_MYSTERY: 'MURDER_MYSTERY', - SMASH_HEROES: 'SUPER_SMASH', - DUELS: 'DUELS', - SPEED_UHC: 'SPEED_UHC', - TNTGAMES: 'TNTGAMES', - BEDWARS: 'BEDWARS', - TURBO_KART_RACERS: 'GINGERBREAD', - BUILD_BATTLE: 'BUILD_BATTLE', - ARCADE: 'ARCADE', - SKYCLASH: 'SKYCLASH', - QUAKECRAFT: 'QUAKECRAFT', - CRAZY_WALLS: 'TRUE_COMBAT', - MEGA_WALLS: 'WALLS3', - VAMPIREZ: 'VAMPIREZ' - }, - MiniGamesString: { - QUAKECRAFT: 'Quakecraft', - WALLS: 'Walls', - PAINTBALL: 'Paintball', - SURVIVAL_GAMES: 'Blitz Survival Games', - TNTGAMES: 'The TNT Games', - VAMPIREZ: 'VampireZ', - WALLS3: 'Mega Walls', - ARCADE: 'Arcade', - ARENA: 'Arena Brawl', - MCGO: 'Cops and Crims', - UHC: 'UHC Champions', - BATTLEGROUND: 'Warlords', - SUPER_SMASH: 'Smash Heroes', - GINGERBREAD: 'Turbo Kart Racers', - HOUSING: 'Housing', - SKYWARS: 'SkyWars', - TRUE_COMBAT: 'Crazy Walls', - SPEED_UHC: 'Speed UHC', - SKYCLASH: 'SkyClash', - LEGACY: 'Classic Games', - PROTOTYPE: 'Prototype', - BEDWARS: 'BedWars', - MURDER_MYSTERY: 'Murder Mystery', - BUILD_BATTLE: 'Build Battle', - DUELS: 'Duels', - PIT: 'The Pit', - SKYBLOCK: 'SkyBlock', - REPLAY: 'Replay', - LIMBO: 'Limbo', - IDLE: 'Idle', - QUEUE: 'Queue', - MAIN_LOBBY: 'Main Lobby', - TOURNAMENT_LOBBY: 'Tournament Lobby', - WOOL_GAMES: 'Wool Wars' - }, SkyWarsPrestigeIcons: { /* eslint-disable camelcase */ default: '⋆', @@ -829,70 +940,16 @@ module.exports = { rainbow_prestige: '✺', mythic_prestige: 'ಠ_ಠ', favor_of_the_angel_prestige: '⚔' - /* eslint-enable camelcase */ }, - games: [ - { name: 'Quake Craft', code: 'QUAKECRAFT', id: 2 }, - { name: 'Walls', code: 'WALLS', id: 3 }, - { name: 'Paintball', code: 'PAINTBALL', id: 4 }, - { name: 'Blitz Survival Games', code: 'SURVIVAL_GAMES', id: 5 }, - { name: 'The TNT Games', code: 'TNTGAMES', id: 6 }, - { name: 'VampireZ', code: 'VAMPIREZ', id: 7 }, - { name: 'Mega Walls', code: 'WALLS3', id: 13 }, - { name: 'Arcade', code: 'ARCADE', id: 14 }, - { name: 'Arena Brawl', code: 'ARENA', id: 17 }, - { name: 'UHC Champions', code: 'UHC', id: 20 }, - { name: 'Cops and Crims', code: 'MCGO', id: 21 }, - { name: 'Warlords', code: 'BATTLEGROUND', id: 23 }, - { name: 'Smash Heroes', code: 'SUPER_SMASH', id: 24 }, - { name: 'Turbo Kart Racers', code: 'GINGERBREAD', id: 25 }, - { name: 'Housing', code: 'HOUSING', id: 26 }, - { name: 'SkyWars', code: 'SKYWARS', id: 51 }, - { name: 'Crazy Walls', code: 'TRUE_COMBAT', id: 52 }, - { name: 'Speed UHC', code: 'SPEED_UHC', id: 54 }, - { name: 'SkyClash', code: 'SKYCLASH', id: 55 }, - { name: 'Classic Games', code: 'LEGACY', id: 56 }, - { name: 'Prototype', code: 'PROTOTYPE', id: 57 }, - { name: 'Bed Wars', code: 'BEDWARS', id: 58 }, - { name: 'Murder Mystery', code: 'MURDER_MYSTERY', id: 59 }, - { name: 'Build Battle', code: 'BUILD_BATTLE', id: 60 }, - { name: 'Duels', code: 'DUELS', id: 61 }, - { name: 'SkyBlock', code: 'SKYBLOCK', id: 63 }, - { name: 'The Pit', code: 'PIT', id: 64 }, - { name: 'Replay', code: 'REPLAY', id: 65 }, - { name: 'SMP', code: 'SMP', id: 67 }, - { name: 'Wool Wars', code: 'WOOL_GAMES', id: 68 }, - { name: 'Limbo', code: 'LIMBO', id: -2 }, - { name: 'Queue', code: 'QUEUE', id: -3 }, - { name: 'Main Lobby', code: 'MAIN_LOBBY', id: -4 }, - { name: 'Tournament Lobby', code: 'TOURNAMENT_LOBBY', id: -5 }, - { name: 'Idle', code: 'IDLE', id: -6 } - ], - /* eslint-disable camelcase */ bestiary: { dynamic: { name: 'Private Island', - mobs: [ - { - name: 'Bat', - cap: 200, - - mobs: ['forest_island_bat_3'], - bracket: 1 - }, - { - name: 'Creeper', - cap: 200, - - mobs: ['creeper_1'], - bracket: 1 - }, + { name: 'Creeper', cap: 200, mobs: ['creeper_1'], bracket: 1 }, { name: 'Enderman', cap: 200, - mobs: [ 'enderman_1', 'enderman_2', @@ -915,7 +972,6 @@ module.exports = { { name: 'Skeleton', cap: 200, - mobs: [ 'skeleton_1', 'skeleton_2', @@ -938,7 +994,6 @@ module.exports = { { name: 'Slime', cap: 200, - mobs: [ 'slime_1', 'slime_2', @@ -961,7 +1016,6 @@ module.exports = { { name: 'Spider', cap: 200, - mobs: [ 'spider_1', 'spider_2', @@ -984,7 +1038,6 @@ module.exports = { { name: 'Witch', cap: 200, - mobs: [ 'witch_1', 'witch_2', @@ -1007,7 +1060,6 @@ module.exports = { { name: 'Zombie', cap: 200, - mobs: [ 'zombie_1', 'zombie_2', @@ -1031,229 +1083,44 @@ module.exports = { }, hub: { name: 'Hub', - mobs: [ - { - name: 'Crypt Ghoul', - cap: 40000, - - mobs: ['unburried_zombie_30'], - bracket: 1 - }, - { - name: 'Golden Ghoul', - cap: 4000, - - mobs: ['unburried_zombie_60'], - bracket: 3 - }, - { - name: 'Graveyard Zombie', - cap: 200, - - mobs: ['graveyard_zombie_1'], - bracket: 1 - }, - { - name: 'Old Wolf', - cap: 4000, - - mobs: ['old_wolf_50'], - bracket: 3 - }, - { - name: 'Wolf', - cap: 40000, - - mobs: ['ruin_wolf_15'], - bracket: 1 - }, - { - name: 'Zombie Villager', - cap: 1000, - - mobs: ['zombie_villager_1'], - bracket: 4 - } + { name: 'Crypt Ghoul', cap: 40000, mobs: ['unburried_zombie_30'], bracket: 1 }, + { name: 'Golden Ghoul', cap: 4000, mobs: ['unburried_zombie_60'], bracket: 3 }, + { name: 'Graveyard Zombie', cap: 200, mobs: ['graveyard_zombie_1'], bracket: 1 }, + { name: 'Old Wolf', cap: 4000, mobs: ['old_wolf_50'], bracket: 3 }, + { name: 'Wolf', cap: 40000, mobs: ['ruin_wolf_15'], bracket: 1 }, + { name: 'Zombie Villager', cap: 1000, mobs: ['zombie_villager_1'], bracket: 4 } ] }, farming_1: { name: 'The Farming Islands', - - mobs: [ - { - name: 'Chicken', - cap: 200, - - mobs: ['farming_chicken_1'], - bracket: 1 - }, - { - name: 'Cow', - cap: 200, - - mobs: ['farming_cow_1'], - bracket: 1 - }, - { - name: 'Mushroom Cow', - cap: 200, - - mobs: ['mushroom_cow_1'], - bracket: 1 - }, - { - name: 'Pig', - cap: 200, - - mobs: ['farming_pig_1'], - bracket: 1 - }, - { - name: 'Rabbit', - cap: 200, - - mobs: ['farming_rabbit_1'], - bracket: 1 - }, - { - name: 'Sheep', - cap: 200, - - mobs: ['farming_sheep_1'], - bracket: 1 - } - ] - }, - garden: { - name: 'Garden', - mobs: [ - { - name: 'Beetle', - cap: 250, - mobs: ['pest_beetle_1'], - bracket: 6 - }, - { - name: 'Cricket', - cap: 250, - mobs: ['pest_cricket_1'], - bracket: 6 - }, - { - name: 'Earthworm', - cap: 250, - mobs: ['pest_worm_1'], - bracket: 6 - }, - { - name: 'Field Mice', - cap: 100, - mobs: ['pest_mouse_1'], - bracket: 7 - }, - { - name: 'Fly', - cap: 250, - mobs: ['pest_fly_1'], - bracket: 6 - }, - { - name: 'Locust', - cap: 250, - mobs: ['pest_locust_1'], - bracket: 6 - }, - { - name: 'Mite', - cap: 250, - mobs: ['pest_mite_1'], - bracket: 6 - }, - { - name: 'Mosquito', - cap: 250, - mobs: ['pest_mosquito_1'], - bracket: 6 - }, - { - name: 'Moth', - cap: 250, - mobs: ['pest_moth_1'], - bracket: 6 - }, - { - name: 'Rat', - cap: 250, - mobs: ['pest_rat_1'], - bracket: 6 - }, - { - name: 'Slug', - cap: 250, - mobs: ['pest_slug_1'], - bracket: 6 - } + { name: 'Chicken', cap: 200, mobs: ['farming_chicken_1'], bracket: 1 }, + { name: 'Cow', cap: 200, mobs: ['farming_cow_1'], bracket: 1 }, + { name: 'Mushroom Cow', cap: 200, mobs: ['mushroom_cow_1'], bracket: 1 }, + { name: 'Pig', cap: 200, mobs: ['farming_pig_1'], bracket: 1 }, + { name: 'Rabbit', cap: 200, mobs: ['farming_rabbit_1'], bracket: 1 }, + { name: 'Sheep', cap: 200, mobs: ['farming_sheep_1'], bracket: 1 } ] }, combat_1: { name: 'Spiders Den', - mobs: [ - { - name: 'Arachne', - cap: 500, - - mobs: ['arachne_500', 'arachne_300'], - bracket: 7 - }, - { - name: "Arachne's Brood", - cap: 1000, - - mobs: ['arachne_brood_200', 'arachne_brood_100'], - bracket: 4 - }, - { - name: "Arachne's Keeper", - cap: 400, - - mobs: ['arachne_keeper_100'], - bracket: 5 - }, - { - name: 'Brood Mother', - cap: 400, - - mobs: ['brood_mother_spider_12'], - bracket: 5 - }, + { name: 'Arachne', cap: 500, mobs: ['arachne_500', 'arachne_300'], bracket: 7 }, + { name: "Arachne's Brood", cap: 1000, mobs: ['arachne_brood_200', 'arachne_brood_100'], bracket: 4 }, + { name: "Arachne's Keeper", cap: 400, mobs: ['arachne_keeper_100'], bracket: 5 }, + { name: 'Brood Mother', cap: 400, mobs: ['brood_mother_spider_12'], bracket: 5 }, { name: 'Dasher Spider', cap: 10000, - mobs: ['dasher_spider_50', 'dasher_spider_45', 'dasher_spider_42', 'dasher_spider_4', 'dasher_spider_6'], bracket: 2 }, - { - name: 'Gravel Skeleton', - cap: 4000, - - mobs: ['respawning_skeleton_2'], - bracket: 3 - }, - { - name: 'Rain Slime', - cap: 1000, - - mobs: ['random_slime_8', 'random_slime_20'], - bracket: 4 - }, + { name: 'Gravel Skeleton', cap: 4000, mobs: ['respawning_skeleton_2'], bracket: 3 }, + { name: 'Rain Slime', cap: 1000, mobs: ['random_slime_8', 'random_slime_20'], bracket: 4 }, { name: 'Silverfish', - cap: 10000, - + cap: 40000, mobs: [ 'jockey_shot_silverfish_3', 'splitter_spider_silverfish_2', @@ -1262,19 +1129,17 @@ module.exports = { 'splitter_spider_silverfish_50', 'jockey_shot_silverfish_42' ], - bracket: 2 + bracket: 1 }, { name: 'Spider Jockey', - cap: 4000, - + cap: 10000, mobs: ['spider_jockey_3', 'spider_jockey_42', 'spider_jockey_5'], - bracket: 3 + bracket: 2 }, { name: 'Splitter Spider', cap: 10000, - mobs: [ 'splitter_spider_2', 'splitter_spider_45', @@ -1287,15 +1152,13 @@ module.exports = { }, { name: 'Voracious Spider', - cap: 10000, - + cap: 40000, mobs: ['voracious_spider_50', 'voracious_spider_42', 'voracious_spider_45', 'voracious_spider_10'], - bracket: 2 + bracket: 1 }, { name: 'Weaver Spider', cap: 10000, - mobs: [ 'weaver_spider_3', 'weaver_spider_4', @@ -1311,12 +1174,10 @@ module.exports = { }, combat_3: { name: 'The End', - mobs: [ { name: 'Dragon', cap: 1000, - mobs: [ 'protector_dragon_100', 'old_dragon_100', @@ -1328,314 +1189,68 @@ module.exports = { ], bracket: 5 }, - { - name: 'Enderman', - cap: 25000, - - mobs: ['enderman_50', 'enderman_45', 'enderman_42'], - bracket: 4 - }, - { - name: 'Endermite', - cap: 10000, - - mobs: ['nest_endermite_50', 'endermite_37', 'endermite_40'], - bracket: 5 - }, - { - name: 'Endstone Protector', - cap: 500, - - mobs: ['corrupted_protector_100'], - bracket: 7 - }, - { - name: 'Obsidian Defender', - cap: 10000, - - mobs: ['obsidian_wither_55'], - bracket: 5 - }, - { - name: 'Voidling Extremist', - cap: 4000, - - mobs: ['voidling_extremist_100'], - bracket: 3 - }, - { - name: 'Voidling Fanatic', - cap: 25000, - - mobs: ['voidling_fanatic_85'], - bracket: 4 - }, - { - name: 'Watcher', - cap: 10000, - - mobs: ['watcher_55'], - bracket: 5 - }, - { - name: 'Zealot', - cap: 25000, - - mobs: ['zealot_bruiser_100', 'zealot_enderman_55'], - bracket: 4 - } + { name: 'Enderman', cap: 25000, mobs: ['enderman_50', 'enderman_45', 'enderman_42'], bracket: 4 }, + { name: 'Endermite', cap: 10000, mobs: ['nest_endermite_50', 'endermite_37', 'endermite_40'], bracket: 5 }, + { name: 'Endstone Protector', cap: 500, mobs: ['corrupted_protector_100'], bracket: 7 }, + { name: 'Obsidian Defender', cap: 25000, mobs: ['obsidian_wither_55'], bracket: 4 }, + { name: 'Voidling Extremist', cap: 4000, mobs: ['voidling_extremist_100'], bracket: 3 }, + { name: 'Voidling Fanatic', cap: 25000, mobs: ['voidling_fanatic_85'], bracket: 4 }, + { name: 'Watcher', cap: 25000, mobs: ['watcher_55'], bracket: 4 }, + { name: 'Zealot', cap: 100000, mobs: ['zealot_bruiser_100', 'zealot_enderman_55'], bracket: 3 } ] }, crimson_isle: { name: 'Crimson Isle', - mobs: [ + { name: 'Ashfang', cap: 1000, mobs: ['ashfang_200'], bracket: 5 }, + { name: 'Barbarian Duke X', cap: 1000, mobs: ['barbarian_duke_x_200'], bracket: 5 }, + { name: 'Bladesoul', cap: 1000, mobs: ['bladesoul_200'], bracket: 5 }, + { name: 'Blaze', cap: 3000, mobs: ['blaze_25', 'blaze_70', 'bezal_80', 'mutated_blaze_70'], bracket: 4 }, + { name: 'Smoldering Blaze', cap: 25000, mobs: ['smoldering_blaze_95'], bracket: 2 }, + { name: 'Millenia-Aged Blaze', cap: 4000, mobs: ['old_blaze_110'], bracket: 3 }, + { name: 'Flaming Spider', cap: 10000, mobs: ['flaming_spider_80'], bracket: 3 }, + { name: 'Flare', cap: 100000, mobs: ['flare_90'], bracket: 1 }, + { name: 'Ghast', cap: 1000, mobs: ['ghast_85', 'dive_ghast_90'], bracket: 4 }, + { name: 'Mage Outlaw', cap: 1000, mobs: ['mage_outlaw_200'], bracket: 5 }, { - name: 'Ashfang', - cap: 500, - - mobs: ['ashfang_200'], - bracket: 7 - }, - { - name: 'Barbarian Duke X', - cap: 500, - - mobs: ['barbarian_duke_x_200'], - bracket: 7 - }, - { - name: 'Bladesoul', - cap: 500, - - mobs: ['bladesoul_200'], - bracket: 7 - }, - { - name: 'Blaze', - cap: 3000, - - mobs: ['blaze_25', 'blaze_70', 'bezal_80', 'mutated_blaze_70'], - bracket: 4 - }, - { - name: 'Flaming Spider', + name: 'Magma Cube', cap: 10000, - - mobs: ['flaming_spider_80'], + mobs: ['pack_magma_cube_90', 'magma_cube_75', 'fireball_magma_cube_75'], bracket: 3 }, + { name: 'Magma Boss', cap: 1000, mobs: ['magma_boss_500'], bracket: 5 }, + { name: 'Matcho', cap: 400, mobs: ['matcho_100'], bracket: 5 }, + { name: 'Mushroom Bull', cap: 10000, mobs: ['charging_mushroom_cow_80'], bracket: 3 }, + { name: 'Pigman', cap: 10000, mobs: ['kada_knight_90', 'magma_cube_rider_90', 'pigman_12'], bracket: 3 }, + { name: 'Wither Skeleton', cap: 10000, mobs: ['wither_skeleton_70'], bracket: 3 }, + { name: 'Wither Spectre', cap: 10000, mobs: ['wither_spectre_70'], bracket: 3 }, + { name: 'Tentacle', cap: 1000, mobs: ['hellwisp_100'], bracket: 5 }, + { name: 'Vanquisher', cap: 1000, mobs: ['vanquisher_100'], bracket: 5 } + ] + }, + mining_2: { + name: 'Deep Caverns', + mobs: [ { - name: 'Flare', - cap: 100000, - - mobs: ['flare_90'], - bracket: 1 - }, - { - name: 'Ghast', - cap: 3000, - - mobs: ['ghast_85', 'dive_ghast_90'], - bracket: 4 - }, - { - name: 'Kada Knight', + name: 'Emerald Slime', cap: 3000, - - mobs: ['kada_knight_90'], - bracket: 4 - }, - { - name: 'Mage Outlaw', - cap: 500, - - mobs: ['mage_outlaw_200'], - bracket: 7 - }, - { - name: 'Magma Boss', - cap: 500, - - mobs: ['magma_boss_500'], - bracket: 7 - }, - { - name: 'Magma Cube', - cap: 10000, - - mobs: ['pack_magma_cube_90', 'magma_cube_75', 'fireball_magma_cube_75'], - bracket: 3 - }, - { - name: 'Magma Cube Rider', - cap: 3000, - - mobs: ['magma_cube_rider_90'], - bracket: 4 - }, - { - name: 'Matcho', - cap: 400, - - mobs: ['matcho_100'], - bracket: 5 - }, - { - name: 'Millenia-Aged Blaze', - cap: 4000, - - mobs: ['old_blaze_110'], - bracket: 3 - }, - { - name: 'Mushroom Bull', - cap: 10000, - - mobs: ['charging_mushroom_cow_80'], - bracket: 3 - }, - { - name: 'Smoldering Blaze', - cap: 25000, - - mobs: ['smoldering_blaze_95'], - bracket: 2 - }, - { - name: 'Tentacle', - cap: 1000, - - mobs: ['hellwisp_100'], - bracket: 5 - }, - { - name: 'Vanquisher', - cap: 1000, - - mobs: ['vanquisher_100'], - bracket: 5 - }, - { - name: 'Wither Skeleton', - cap: 3000, - - mobs: ['wither_skeleton_70'], - bracket: 4 - }, - { - name: 'Wither Spectre', - cap: 10000, - - mobs: ['wither_spectre_70'], - bracket: 3 - } - ] - }, - mining_2: { - name: 'Deep Caverns', - - mobs: [ - { - name: 'Emerald Slime', - cap: 3000, - - mobs: ['emerald_slime_5', 'emerald_slime_10'], - bracket: 1 - }, - { - name: 'Lapis Zombie', - cap: 3000, - - mobs: ['lapis_zombie_7'], - bracket: 1 - }, - { - name: 'Miner Skeleton', - cap: 3000, - - mobs: ['diamond_skeleton_15', 'diamond_skeleton_20'], - bracket: 1 - }, - { - name: 'Miner Zombie', - cap: 3000, - - mobs: ['diamond_zombie_15', 'diamond_zombie_20'], - bracket: 1 - }, - { - name: 'Redstone Pigman', - cap: 3000, - - mobs: ['redstone_pigman_10'], - bracket: 1 - }, - { - name: 'Sneaky Creeper', - cap: 300, - - mobs: ['invisible_creeper_3'], - bracket: 3 - } - ] - }, - mining_3: { - name: 'Dwarven Mines', - - mobs: [ - { - name: 'Diamond Goblin', - cap: 100, - mobs: ['goblin_500'], - bracket: 7 - }, - { - name: 'Ghost', - cap: 100000, - - mobs: ['caverns_ghost_250'], - bracket: 3 - }, - { - name: 'Glacite Bowman', - cap: 1000, - - mobs: ['glacite_bowman_165'], - bracket: 4 - }, - { - name: 'Glacite Caver', - cap: 1000, - - mobs: ['glacite_caver_200'], - bracket: 4 - }, - { - name: 'Glacite Mage', - cap: 1000, - - mobs: ['glacite_mage_155'], - bracket: 4 - }, - { - name: 'Glacite Mutt', - cap: 1000, - - mobs: ['glacite_mutt_180'], - bracket: 4 - }, - { - name: 'Glacite Walker', - cap: 10000, - - mobs: ['ice_walker_45'], - bracket: 2 + mobs: ['emerald_slime_5', 'emerald_slime_10', 'emerald_slime_15'], + bracket: 1 }, + { name: 'Miner Skeleton', cap: 3000, mobs: ['diamond_skeleton_15', 'diamond_skeleton_20'], bracket: 1 }, + { name: 'Miner Zombie', cap: 3000, mobs: ['diamond_zombie_15', 'diamond_zombie_20'], bracket: 1 }, + { name: 'Redstone Pigman', cap: 3000, mobs: ['redstone_pigman_10'], bracket: 1 }, + { name: 'Sneaky Creeper', cap: 300, mobs: ['invisible_creeper_3'], bracket: 3 }, + { name: 'Lapis Zombie', cap: 3000, mobs: ['lapis_zombie_7'], bracket: 1 } + ] + }, + mining_3: { + name: 'Dwarven Mines', + mobs: [ + { name: 'Ghost', cap: 250000, mobs: ['caverns_ghost_250'], bracket: 2 }, { name: 'Goblin', cap: 25000, - mobs: [ 'goblin_weakling_melee_25', 'goblin_weakling_melee_40', @@ -1653,7 +1268,6 @@ module.exports = { { name: 'Goblin Raiders', cap: 1000, - mobs: [ 'goblin_weakling_melee_5', 'goblin_weakling_bow_5', @@ -1665,242 +1279,74 @@ module.exports = { ], bracket: 4 }, - { - name: 'Golden Goblin', - cap: 400, - - mobs: ['goblin_50'], - bracket: 5 - }, - { - name: 'Powder Ghast', - cap: 200, - - mobs: ['powder_ghast_1'], - bracket: 1 - }, - { - name: 'Star Sentry', - cap: 1000, - - mobs: ['crystal_sentry_50'], - bracket: 4 - }, - { - name: 'Treasure Hoarder', - cap: 1000, - - mobs: ['treasure_hoarder_70'], - bracket: 4 - } + { name: 'Golden Goblin', cap: 400, mobs: ['goblin_50'], bracket: 5 }, + { name: 'Ice Walker', cap: 10000, mobs: ['ice_walker_45'], bracket: 2 }, + { name: 'Powder Ghast', cap: 200, mobs: ['powder_ghast_1'], bracket: 1 }, + { name: 'Star Sentry', cap: 1000, mobs: ['crystal_sentry_50'], bracket: 4 }, + { name: 'Treasure Hoarder', cap: 3000, mobs: ['treasure_hoarder_70'], bracket: 3 } ] }, crystal_hollows: { name: 'Crystal Hollows', - mobs: [ - { - name: 'Automaton', - cap: 10000, - - mobs: ['automaton_100', 'automaton_150'], - bracket: 2 - }, - { - name: 'Bal', - cap: 250, - - mobs: ['bal_boss_100'], - bracket: 6 - }, - { - name: 'Boss Corleone', - cap: 100, - - mobs: ['team_treasurite_corleone_200'], - bracket: 7 - }, - { - name: 'Butterfly', - cap: 1000, - - mobs: ['butterfly_100'], - bracket: 4 - }, + { name: 'Thyst', cap: 4000, mobs: ['thyst_20'], bracket: 3 }, + { name: 'Worm', cap: 400, mobs: ['worm_5', 'scatha_10'], bracket: 5 }, + { name: 'Yog', cap: 4000, mobs: ['yog_100'], bracket: 3 }, + { name: 'Sludge', cap: 10000, mobs: ['sludge_5', 'sludge_10', 'sludge_100'], bracket: 2 }, + { name: 'Automaton', cap: 10000, mobs: ['automaton_100', 'automaton_150'], bracket: 2 }, + { name: 'Butterfly', cap: 1000, mobs: ['butterfly_100'], bracket: 4 }, { name: 'Grunt', cap: 4000, - mobs: [ 'team_treasurite_grunt_50', 'team_treasurite_viper_100', 'team_treasurite_wendy_100', - 'team_treasurite_sebastian_100' + 'team_treasurite_sebastian_100', + 'team_treasurite_corleone_200' ], bracket: 3 }, - { - name: 'Key Guardian', - cap: 250, - - mobs: ['key_guardian_100'], - bracket: 6 - }, - { - name: 'Sludge', - cap: 10000, - - mobs: ['sludge_5', 'sludge_10', 'sludge_100'], - bracket: 2 - }, - { - name: 'Thyst', - cap: 4000, - - mobs: ['thyst_20'], - bracket: 3 - }, - { - name: 'Worm', - cap: 400, - - mobs: ['worm_5', 'scatha_10'], - bracket: 5 - }, - { - name: 'Yog', - cap: 4000, - - mobs: ['yog_100'], - bracket: 3 - } + { name: 'Bal', cap: 250, mobs: ['bal_boss_100'], bracket: 6 }, + { name: 'Key Guardian', cap: 250, mobs: ['key_guardian_100'], bracket: 6 } ] }, foraging_1: { name: 'The Park', - mobs: [ - { - name: 'Howling Spirit', - cap: 10000, - - mobs: ['howling_spirit_35'], - bracket: 2 - }, - { - name: 'Pack Spirit', - cap: 10000, - - mobs: ['pack_spirit_30'], - bracket: 2 - }, - { - name: 'Soul of the Alpha', - cap: 1000, - - mobs: ['soul_of_the_alpha_55'], - bracket: 4 - } + { name: 'Howling Spirit', cap: 10000, mobs: ['howling_spirit_35'], bracket: 2 }, + { name: 'Pack Spirit', cap: 10000, mobs: ['pack_spirit_30'], bracket: 2 }, + { name: 'Soul of the Alpha', cap: 1000, mobs: ['soul_of_the_alpha_55'], bracket: 4 } ] }, spooky_festival: { name: 'Spooky Festival', - mobs: [ - { - name: 'Crazy Witch', - cap: 750, - - mobs: ['batty_witch_60'], - bracket: 2 - }, - { - name: 'Headless Horseman', - cap: 500, - - mobs: ['horseman_horse_100'], - bracket: 7 - }, - { - name: 'Phantom Spirit', - cap: 750, - - mobs: ['phantom_spirit_35'], - bracket: 2 - }, - { - name: 'Scary Jerry', - cap: 750, - - mobs: ['scary_jerry_30'], - bracket: 2 - }, - { - name: 'Trick or Treater', - cap: 750, - - mobs: ['trick_or_treater_30'], - bracket: 2 - }, - { - name: 'Wither Gourd', - cap: 750, - - mobs: ['wither_gourd_40'], - bracket: 2 - }, - { - name: 'Wraith', - cap: 750, - - mobs: ['wraith_50'], - bracket: 2 - } + { name: 'Crazy Witch', cap: 750, mobs: ['batty_witch_60'], bracket: 2 }, + { name: 'Headless Horseman', cap: 500, mobs: ['horseman_horse_100'], bracket: 7 }, + { name: 'Phantom Spirit', cap: 750, mobs: ['phantom_spirit_35'], bracket: 2 }, + { name: 'Scary Jerry', cap: 750, mobs: ['scary_jerry_30'], bracket: 2 }, + { name: 'Trick or Treater', cap: 750, mobs: ['trick_or_treater_30'], bracket: 2 }, + { name: 'Wither Gourd', cap: 750, mobs: ['wither_gourd_40'], bracket: 2 }, + { name: 'Wraith', cap: 750, mobs: ['wraith_50'], bracket: 2 } ] }, mythological_creatures: { name: 'Mythological Creatures', - mobs: [ - { - name: 'Gaia Construct', - cap: 3000, - - mobs: ['gaia_construct_140', 'gaia_construct_260'], - bracket: 4 - }, - { - name: 'Minos Champion', - cap: 1000, - - mobs: ['minos_champion_175', 'minos_champion_310'], - bracket: 5 - }, + { name: 'Gaia Construct', cap: 3000, mobs: ['gaia_construct_140', 'gaia_construct_260'], bracket: 4 }, + { name: 'Minos Champion', cap: 1000, mobs: ['minos_champion_175', 'minos_champion_310'], bracket: 5 }, { name: 'Minos Hunter', cap: 1000, - mobs: ['minos_hunter_125', 'minos_hunter_15', 'minos_hunter_60'], bracket: 5 }, - { - name: 'Minos Inquisitor', - cap: 500, - - mobs: ['minos_inquisitor_750'], - bracket: 7 - }, - { - name: 'Minotaur', - cap: 3000, - - mobs: ['minotaur_45', 'minotaur_120', 'minotaur_210'], - bracket: 4 - }, + { name: 'Minos Inquisitor', cap: 500, mobs: ['minos_inquisitor_750'], bracket: 7 }, + { name: 'Minotaur', cap: 3000, mobs: ['minotaur_45', 'minotaur_120', 'minotaur_210'], bracket: 4 }, { name: 'Siamese Lynx', cap: 3000, - mobs: ['siamese_lynx_25', 'siamese_lynx_85', 'siamese_lynx_155'], bracket: 4 } @@ -1908,46 +1354,19 @@ module.exports = { }, jerry: { name: 'Jerry', - mobs: [ - { - name: 'Green Jerry', - cap: 75, - - mobs: ['mayor_jerry_green_1'], - bracket: 4 - }, - { - name: 'Blue Jerry', - cap: 30, - - mobs: ['mayor_jerry_blue_2'], - bracket: 5 - }, - { - name: 'Purple Jerry', - cap: 25, - - mobs: ['mayor_jerry_purple_3'], - bracket: 6 - }, - { - name: 'Golden Jerry', - cap: 20, - - mobs: ['mayor_jerry_golden_5'], - bracket: 7 - } + { name: 'Green Jerry', cap: 75, mobs: ['mayor_jerry_green_1'], bracket: 4 }, + { name: 'Blue Jerry', cap: 30, mobs: ['mayor_jerry_blue_2'], bracket: 5 }, + { name: 'Purple Jerry', cap: 25, mobs: ['mayor_jerry_purple_3'], bracket: 6 }, + { name: 'Golden Jerry', cap: 20, mobs: ['mayor_jerry_golden_5'], bracket: 7 } ] }, kuudra: { name: 'Kuudra', - mobs: [ { name: 'Blazing Golem', cap: 300, - mobs: [ 'blazing_golem_100', 'blazing_golem_200', @@ -1960,21 +1379,18 @@ module.exports = { { name: 'Blight', cap: 10000, - mobs: ['blight_100', 'blight_200', 'blight_300', 'blight_400', 'blight_500'], bracket: 3 }, { name: 'Dropship', cap: 300, - mobs: ['dropship_100', 'dropship_200', 'dropship_300', 'dropship_400', 'dropship_500'], bracket: 3 }, { name: 'Explosive Imp', - cap: 3000, - + cap: 10000, mobs: [ 'explosive_imp_100', 'explosive_imp_200', @@ -1982,12 +1398,11 @@ module.exports = { 'explosive_imp_400', 'explosive_imp_500' ], - bracket: 4 + bracket: 3 }, { name: 'Inferno Magma Cube', cap: 10000, - mobs: [ 'inferno_magma_cube_100', 'inferno_magma_cube_200', @@ -2000,7 +1415,6 @@ module.exports = { { name: 'Kuudra Berserker', cap: 10000, - mobs: [ 'kuudra_berserker_100', 'kuudra_berserker_200', @@ -2013,7 +1427,6 @@ module.exports = { { name: 'Kuudra Follower', cap: 25000, - mobs: [ 'kuudra_follower_100', 'kuudra_follower_200', @@ -2026,7 +1439,6 @@ module.exports = { { name: 'Kuudra Knocker', cap: 10000, - mobs: [ 'kuudra_knocker_100', 'kuudra_knocker_200', @@ -2039,7 +1451,6 @@ module.exports = { { name: 'Kuudra Landmine', cap: 10000, - mobs: [ 'kuudra_landmine_100', 'kuudra_landmine_200', @@ -2052,7 +1463,6 @@ module.exports = { { name: 'Kuudra Slasher', cap: 30, - mobs: [ 'kuudra_slasher_100', 'kuudra_slasher_200', @@ -2065,7 +1475,6 @@ module.exports = { { name: 'Magma Follower', cap: 30, - mobs: [ 'magma_follower_100', 'magma_follower_200', @@ -2078,7 +1487,6 @@ module.exports = { { name: 'Wandering Blaze', cap: 3000, - mobs: [ 'wandering_blaze_100', 'wandering_blaze_200', @@ -2091,7 +1499,6 @@ module.exports = { { name: 'Wither Sentry', cap: 75, - mobs: [ 'wither_sentry_100', 'wither_sentry_200', @@ -2106,379 +1513,84 @@ module.exports = { fishing: { fishing: { name: 'Fishing', - mobs: [ - { - name: 'Abyssal Miner', - cap: 250, - - mobs: ['zombie_miner_150'], - bracket: 6 - }, - { - name: 'Agarimoo', - cap: 4000, - - mobs: ['agarimoo_35'], - bracket: 3 - }, - { - name: 'Carrot King', - cap: 400, - - mobs: ['carrot_king_25'], - bracket: 5 - }, - { - name: 'Catfish', - cap: 1000, - - mobs: ['catfish_23'], - bracket: 4 - }, - { - name: 'Deep Sea Protector', - cap: 1000, - - mobs: ['deep_sea_protector_60'], - bracket: 4 - }, - { - name: 'Guardian Defender', - cap: 1000, - - mobs: ['guardian_defender_45'], - bracket: 4 - }, - { - name: 'Night Squid', - cap: 1000, - - mobs: ['night_squid_6'], - bracket: 4 - }, - { - name: 'Oasis Rabbit', - cap: 300, - - mobs: ['oasis_rabbit_10'], - bracket: 3 - }, - { - name: 'Oasis Sheep', - cap: 300, - - mobs: ['oasis_sheep_10'], - bracket: 3 - }, - { - name: 'Poisoned Water Worm', - cap: 1000, - - mobs: ['poisoned_water_worm_25'], - bracket: 4 - }, - { - name: 'Rider of the Deep', - cap: 4000, - - mobs: ['zombie_deep_20', 'chicken_deep_20'], - bracket: 3 - }, - { - name: 'Sea Archer', - cap: 4000, - - mobs: ['sea_archer_15'], - bracket: 3 - }, - { - name: 'Sea Guardian', - cap: 4000, - - mobs: ['sea_guardian_10'], - bracket: 3 - }, - { - name: 'Sea Leech', - cap: 1000, - - mobs: ['sea_leech_30'], - bracket: 4 - }, - { - name: 'Sea Walker', - cap: 4000, - - mobs: ['sea_walker_4'], - bracket: 3 - }, - { - name: 'Sea Witch', - cap: 4000, - - mobs: ['sea_witch_15'], - bracket: 3 - }, - { - name: 'Squid', - cap: 10000, - - mobs: ['pond_squid_1'], - bracket: 2 - }, - { - name: 'The Sea Emperor', - cap: 100, - - mobs: ['skeleton_emperor_150', 'guardian_emperor_150'], - bracket: 7 - }, - { - name: 'Water Hydra', - cap: 400, - - mobs: ['water_hydra_100'], - bracket: 5 - }, - { - name: 'Water Worm', - cap: 1000, - - mobs: ['water_worm_20'], - bracket: 4 - } + { name: 'Agarimoo', cap: 4000, mobs: ['agarimoo_35'], bracket: 3 }, + { name: 'Carrot King', cap: 400, mobs: ['carrot_king_25'], bracket: 5 }, + { name: 'Catfish', cap: 1000, mobs: ['catfish_23'], bracket: 4 }, + { name: 'Deep Sea Protector', cap: 1000, mobs: ['deep_sea_protector_60'], bracket: 4 }, + { name: 'Guardian Defender', cap: 1000, mobs: ['guardian_defender_45'], bracket: 4 }, + { name: 'Night Squid', cap: 1000, mobs: ['night_squid_6'], bracket: 4 }, + { name: 'Oasis Rabbit', cap: 300, mobs: ['oasis_rabbit_10'], bracket: 3 }, + { name: 'Oasis Sheep', cap: 300, mobs: ['oasis_sheep_10'], bracket: 3 }, + { name: 'Poisoned Water Worm', cap: 1000, mobs: ['poisoned_water_worm_25'], bracket: 4 }, + { name: 'Rider of the Deep', cap: 4000, mobs: ['zombie_deep_20', 'chicken_deep_20'], bracket: 3 }, + { name: 'Sea Archer', cap: 4000, mobs: ['sea_archer_15'], bracket: 3 }, + { name: 'Sea Guardian', cap: 4000, mobs: ['sea_guardian_10'], bracket: 3 }, + { name: 'Sea Leech', cap: 1000, mobs: ['sea_leech_30'], bracket: 4 }, + { name: 'Sea Walker', cap: 4000, mobs: ['sea_walker_4'], bracket: 3 }, + { name: 'Sea Witch', cap: 4000, mobs: ['sea_witch_15'], bracket: 3 }, + { name: 'Squid', cap: 10000, mobs: ['pond_squid_1'], bracket: 2 }, + { name: 'The Sea Emperor', cap: 100, mobs: ['skeleton_emperor_150', 'guardian_emperor_150'], bracket: 7 }, + { name: 'Water Hydra', cap: 400, mobs: ['water_hydra_100'], bracket: 5 }, + { name: 'Water Worm', cap: 1000, mobs: ['water_worm_20'], bracket: 4 }, + { name: 'Zombie Miner', cap: 250, mobs: ['zombie_miner_150'], bracket: 6 } ] }, lava: { name: 'Lava Fishing', - mobs: [ - { - name: 'Fire Eel', - cap: 1000, - - mobs: ['fire_eel_240'], - bracket: 4 - }, - { - name: 'Flaming Worm', - cap: 4000, - - mobs: ['flaming_worm_50'], - bracket: 3 - }, - { - name: 'Lava Blaze', - cap: 1000, - - mobs: ['lava_blaze_100'], - bracket: 4 - }, - { - name: 'Lava Flame', - cap: 1000, - - mobs: ['lava_flame_230'], - bracket: 4 - }, - { - name: 'Lava Leech', - cap: 4000, - - mobs: ['lava_leech_220'], - bracket: 3 - }, - { - name: 'Lava Pigman', - cap: 1000, - - mobs: ['lava_pigman_100'], - bracket: 4 - }, - { - name: 'Lord Jawbus', - cap: 100, - - mobs: ['lord_jawbus_600'], - bracket: 7 - }, - { - name: 'Magma Slug', - cap: 10000, - - mobs: ['magma_slug_200'], - bracket: 2 - }, - { - name: 'Moogma', - cap: 4000, - - mobs: ['moogma_210'], - bracket: 3 - }, - { - name: 'Plhlegblast', - cap: 7, - - mobs: ['pond_squid_300'], - bracket: 7 - }, - { - name: 'Pyroclastic Worm', - cap: 1000, - - mobs: ['pyroclastic_worm_240'], - bracket: 4 - }, - { - name: 'Taurus', - cap: 1000, - - mobs: ['pig_rider_250'], - bracket: 4 - }, - { - name: 'Thunder', - cap: 400, - - mobs: ['thunder_400'], - bracket: 5 - } + { name: 'Fire Eel', cap: 1000, mobs: ['fire_eel_240'], bracket: 4 }, + { name: 'Flaming Worm', cap: 4000, mobs: ['flaming_worm_50'], bracket: 3 }, + { name: 'Lava Blaze', cap: 1000, mobs: ['lava_blaze_100'], bracket: 4 }, + { name: 'Lava Flame', cap: 1000, mobs: ['lava_flame_230'], bracket: 4 }, + { name: 'Lava Leech', cap: 4000, mobs: ['lava_leech_220'], bracket: 3 }, + { name: 'Lava Pigman', cap: 1000, mobs: ['lava_pigman_100'], bracket: 4 }, + { name: 'Lord Jawbus', cap: 250, mobs: ['lord_jawbus_600'], bracket: 6 }, + { name: 'Magma Slug', cap: 10000, mobs: ['magma_slug_200'], bracket: 2 }, + { name: 'Moogma', cap: 4000, mobs: ['moogma_210'], bracket: 3 }, + { name: 'Plhlegblast', cap: 7, mobs: ['pond_squid_300'], bracket: 7 }, + { name: 'Pyroclastic Worm', cap: 4000, mobs: ['pyroclastic_worm_240'], bracket: 3 }, + { name: 'Taurus', cap: 1000, mobs: ['pig_rider_250'], bracket: 4 }, + { name: 'Thunder', cap: 400, mobs: ['thunder_400'], bracket: 5 } ] }, spooky_festival: { name: 'Spooky Festival Fishing', - mobs: [ - { - name: 'Grim Reaper', - cap: 100, - - mobs: ['grim_reaper_190'], - bracket: 7 - }, - { - name: 'Nightmare', - cap: 1000, - - mobs: ['nightmare_24'], - bracket: 4 - }, - { - name: 'Phantom Fisher', - cap: 250, - - mobs: ['phantom_fisherman_160'], - bracket: 6 - }, - { - name: 'Scarecrow', - cap: 4000, - - mobs: ['scarecrow_9'], - bracket: 3 - }, - { - name: 'Werewolf', - cap: 1000, - - mobs: ['werewolf_50'], - bracket: 4 - } + { name: 'Grim Reaper', cap: 100, mobs: ['grim_reaper_190'], bracket: 7 }, + { name: 'Nightmare', cap: 1000, mobs: ['nightmare_24'], bracket: 4 }, + { name: 'Phantom Fisher', cap: 250, mobs: ['phantom_fisherman_160'], bracket: 6 }, + { name: 'Scarecrow', cap: 4000, mobs: ['scarecrow_9'], bracket: 3 }, + { name: 'Werewolf', cap: 1000, mobs: ['werewolf_50'], bracket: 4 } ] }, fishing_festival: { name: 'Fishing Festival', - mobs: [ - { - name: 'Blue Shark', - cap: 1000, - - mobs: ['blue_shark_20'], - bracket: 4 - }, - { - name: 'Great White Shark', - cap: 400, - - mobs: ['great_white_shark_180'], - bracket: 5 - }, - { - name: 'Nurse Shark', - cap: 4000, - - mobs: ['nurse_shark_6'], - bracket: 3 - }, - { - name: 'Tiger Shark', - cap: 1000, - - mobs: ['tiger_shark_50'], - bracket: 4 - } + { name: 'Blue Shark', cap: 1000, mobs: ['blue_shark_20'], bracket: 4 }, + { name: 'Great White Shark', cap: 400, mobs: ['great_white_shark_180'], bracket: 5 }, + { name: 'Nurse Shark', cap: 4000, mobs: ['nurse_shark_6'], bracket: 3 }, + { name: 'Tiger Shark', cap: 1000, mobs: ['tiger_shark_50'], bracket: 4 } ] }, winter: { name: 'Winter Fishing', - mobs: [ - { - name: 'Frosty', - cap: 4000, - - mobs: ['frosty_the_snowman_13'], - bracket: 3 - }, - { - name: 'Frozen Steve', - cap: 4000, - - mobs: ['frozen_steve_7'], - bracket: 3 - }, - { - name: 'Grinch', - cap: 250, - - mobs: ['grinch_21'], - bracket: 6 - }, - { - name: 'Nutcracker', - cap: 400, - - mobs: ['nutcracker_50'], - bracket: 5 - }, - { - name: 'Reindrake', - cap: 100, - - mobs: ['reindrake_100'], - bracket: 7 - }, - { - name: 'Yeti', - cap: 250, - - mobs: ['yeti_175'], - bracket: 6 - } + { name: 'Frosty', cap: 4000, mobs: ['frosty_the_snowman_13'], bracket: 3 }, + { name: 'Frozen Steve', cap: 4000, mobs: ['frozen_steve_7'], bracket: 3 }, + { name: 'Grinch', cap: 250, mobs: ['grinch_21'], bracket: 6 }, + { name: 'Nutcracker', cap: 400, mobs: ['nutcracker_50'], bracket: 5 }, + { name: 'Reindrake', cap: 100, mobs: ['reindrake_100'], bracket: 7 }, + { name: 'Yeti', cap: 250, mobs: ['yeti_175'], bracket: 6 } ] } }, catacombs: { name: 'Catacombs', - mobs: [ { name: 'Angry Archeologist', - cap: 3000, - + cap: 10000, mobs: [ 'diamond_guy_80', 'diamond_guy_90', @@ -2501,19 +1613,35 @@ module.exports = { 'master_diamond_guy_160', 'master_diamond_guy_170' ], - bracket: 7 + bracket: 5 }, { - name: 'Bat', - cap: 1000, - - mobs: ['dungeon_secret_bat_1'], + name: 'Lonely Spider', + cap: 25000, + mobs: [ + 'lonely_spider_35', + 'lonely_spider_55', + 'lonely_spider_65', + 'lonely_spider_75', + 'lonely_spider_85', + 'lonely_spider_95', + 'lonely_spider_105', + 'lonely_spider_115', + 'master_lonely_spider_35', + 'master_lonely_spider_55', + 'master_lonely_spider_65', + 'master_lonely_spider_75', + 'master_lonely_spider_85', + 'master_lonely_spider_95', + 'master_lonely_spider_105', + 'master_lonely_spider_115' + ], bracket: 4 }, + { name: 'Bat', cap: 1000, mobs: ['dungeon_secret_bat_1'], bracket: 4 }, { name: 'Cellar Spider', cap: 1000, - mobs: [ 'cellar_spider_45', 'cellar_spider_65', @@ -2537,7 +1665,6 @@ module.exports = { { name: 'Crypt Dreadlord', cap: 25000, - mobs: [ 'crypt_dreadlord_47', 'crypt_dreadlord_67', @@ -2561,7 +1688,6 @@ module.exports = { { name: 'Crypt Lurker', cap: 25000, - mobs: [ 'crypt_lurker_41', 'crypt_lurker_61', @@ -2585,7 +1711,6 @@ module.exports = { { name: 'Crypt Souleater', cap: 25000, - mobs: [ 'crypt_souleater_45', 'crypt_souleater_65', @@ -2608,8 +1733,7 @@ module.exports = { }, { name: 'Fels', - cap: 10000, - + cap: 25000, mobs: [ 'tentaclees_90', 'tentaclees_100', @@ -2618,19 +1742,12 @@ module.exports = { 'master_tentaclees_100', 'master_tentaclees_110' ], - bracket: 5 - }, - { - name: 'Golem', - cap: 1000, - - mobs: ['sadan_golem_1', 'master_sadan_golem_1'], bracket: 4 }, + { name: 'Golem', cap: 1000, mobs: ['sadan_golem_1', 'master_sadan_golem_1'], bracket: 4 }, { name: 'King Midas', - cap: 750, - + cap: 1000, mobs: [ 'king_midas_130', 'king_midas_140', @@ -2643,36 +1760,11 @@ module.exports = { 'master_king_midas_160', 'master_king_midas_170' ], - bracket: 6 - }, - { - name: 'Lonely Spider', - - cap: 25000, - mobs: [ - 'lonely_spider_35', - 'lonely_spider_55', - 'lonely_spider_65', - 'lonely_spider_75', - 'lonely_spider_85', - 'lonely_spider_95', - 'lonely_spider_105', - 'lonely_spider_115', - 'master_lonely_spider_35', - 'master_lonely_spider_55', - 'master_lonely_spider_65', - 'master_lonely_spider_75', - 'master_lonely_spider_85', - 'master_lonely_spider_95', - 'master_lonely_spider_105', - 'master_lonely_spider_115' - ], - bracket: 4 + bracket: 5 }, { name: 'Lost Adventurer', - cap: 3000, - + cap: 10000, mobs: [ 'lost_adventurer_80', 'lost_adventurer_81', @@ -2765,19 +1857,17 @@ module.exports = { 'master_lost_adventurer_163', 'master_lost_adventurer_164' ], - bracket: 7 + bracket: 5 }, { name: 'Mimic', cap: 1000, - mobs: ['mimic_115', 'mimic_125', 'master_mimic_115', 'master_mimic_125'], bracket: 4 }, { name: 'Scared Skeleton', cap: 4000, - mobs: [ 'scared_skeleton_42', 'scared_skeleton_62', @@ -2790,8 +1880,7 @@ module.exports = { }, { name: 'Shadow Assassin', - cap: 3000, - + cap: 10000, mobs: [ 'shadow_assassin_120', 'shadow_assassin_130', @@ -2808,12 +1897,11 @@ module.exports = { 'master_shadow_assassin_170', 'master_shadow_assassin_171' ], - bracket: 7 + bracket: 5 }, { name: 'Skeleton Grunt', cap: 4000, - mobs: [ 'skeleton_grunt_40', 'skeleton_grunt_60', @@ -2826,17 +1914,10 @@ module.exports = { ], bracket: 3 }, - { - name: 'Skeleton Lord', - cap: 1000, - - mobs: ['skeleton_lord_150', 'master_skeleton_lord_150'], - bracket: 5 - }, + { name: 'Skeleton Lord', cap: 1000, mobs: ['skeleton_lord_150', 'master_skeleton_lord_150'], bracket: 5 }, { name: 'Skeleton Master', cap: 25000, - mobs: [ 'skeleton_master_48', 'skeleton_master_68', @@ -2860,7 +1941,6 @@ module.exports = { { name: 'Skeleton Soldier', cap: 40000, - mobs: [ 'skeleton_soldier_46', 'skeleton_soldier_66', @@ -2884,7 +1964,6 @@ module.exports = { { name: 'Skeletor', cap: 10000, - mobs: [ 'skeletor_80', 'skeletor_90', @@ -2910,7 +1989,6 @@ module.exports = { { name: 'Sniper', cap: 4000, - mobs: [ 'sniper_skeleton_43', 'sniper_skeleton_63', @@ -2934,7 +2012,6 @@ module.exports = { { name: 'Super Archer', cap: 10000, - mobs: [ 'super_archer_90', 'super_archer_100', @@ -2950,7 +2027,6 @@ module.exports = { { name: 'Super Tank Zombie', cap: 25000, - mobs: [ 'super_tank_zombie_90', 'super_tank_zombie_100', @@ -2966,7 +2042,6 @@ module.exports = { { name: 'Tank Zombie', cap: 4000, - mobs: [ 'crypt_tank_zombie_40', 'crypt_tank_zombie_60', @@ -2982,16 +2057,24 @@ module.exports = { bracket: 3 }, { - name: 'Terracotta', - cap: 40000, - - mobs: ['sadan_statue_1', 'master_sadan_statue_1'], - bracket: 1 + name: 'Withermancer', + cap: 25000, + mobs: [ + 'crypt_witherskeleton_90', + 'crypt_witherskeleton_100', + 'crypt_witherskeleton_110', + 'crypt_witherskeleton_120', + 'master_crypt_witherskeleton_90', + 'master_crypt_witherskeleton_100', + 'master_crypt_witherskeleton_110', + 'master_crypt_witherskeleton_120' + ], + bracket: 4 }, + { name: 'Terracotta', cap: 40000, mobs: ['sadan_statue_1', 'master_sadan_statue_1'], bracket: 1 }, { name: 'Undead', cap: 10000, - mobs: [ 'watcher_summon_undead_1', 'watcher_summon_undead_2', @@ -3015,7 +2098,6 @@ module.exports = { { name: 'Undead Skeleton', cap: 25000, - mobs: [ 'dungeon_respawning_skeleton_40', 'dungeon_respawning_skeleton_40', @@ -3051,47 +2133,12 @@ module.exports = { ], bracket: 4 }, - { - name: 'Wither Guard', - cap: 10000, - - mobs: ['wither_guard_100', 'master_wither_guard_100'], - bracket: 5 - }, - { - name: 'Wither Husk', - cap: 10000, - - mobs: ['master_wither_husk_100'], - bracket: 5 - }, - { - name: 'Wither Miner', - cap: 25000, - - mobs: ['wither_miner_100', 'master_wither_miner_100'], - bracket: 4 - }, - { - name: 'Withermancer', - - cap: 25000, - mobs: [ - 'crypt_witherskeleton_90', - 'crypt_witherskeleton_100', - 'crypt_witherskeleton_110', - 'crypt_witherskeleton_120', - 'master_crypt_witherskeleton_90', - 'master_crypt_witherskeleton_100', - 'master_crypt_witherskeleton_110', - 'master_crypt_witherskeleton_120' - ], - bracket: 4 - }, + { name: 'Wither Guard', cap: 10000, mobs: ['wither_guard_100', 'master_wither_guard_100'], bracket: 5 }, + { name: 'Wither Husk', cap: 10000, mobs: ['master_wither_husk_100'], bracket: 5 }, + { name: 'Wither Miner', cap: 25000, mobs: ['wither_miner_100', 'master_wither_miner_100'], bracket: 4 }, { name: 'Zombie Commander', cap: 3000, - mobs: [ 'zombie_commander_110', 'zombie_commander_120', @@ -3103,7 +2150,6 @@ module.exports = { { name: 'Zombie Grunt', cap: 4000, - mobs: [ 'zombie_grunt_40', 'zombie_grunt_60', @@ -3118,8 +2164,7 @@ module.exports = { }, { name: 'Zombie Knight', - cap: 10000, - + cap: 25000, mobs: [ 'zombie_knight_86', 'zombie_knight_96', @@ -3132,19 +2177,12 @@ module.exports = { 'master_zombie_knight_116', 'master_zombie_knight_126' ], - bracket: 5 - }, - { - name: 'Zombie Lord', - cap: 1000, - - mobs: ['zombie_lord_150', 'master_zombie_lord_150'], - bracket: 5 + bracket: 4 }, + { name: 'Zombie Lord', cap: 1000, mobs: ['zombie_lord_150', 'master_zombie_lord_150'], bracket: 5 }, { name: 'Zombie Soldier', cap: 40000, - mobs: [ 'zombie_soldier_83', 'zombie_soldier_93', @@ -3161,100 +2199,5 @@ module.exports = { } ] } - }, - bestiaryBrackets: { - 1: [ - 20, 40, 60, 100, 200, 400, 800, 1400, 2000, 3000, 6000, 12000, 20000, 30000, 40000, 50000, 60000, 72000, 86000, - 100000, 200000, 400000, 600000, 800000, 1000000 - ], - 2: [ - 5, 10, 15, 25, 50, 100, 200, 350, 500, 750, 1500, 3000, 5000, 7500, 10000, 12500, 15000, 18000, 21500, 25000, - 50000, 100000, 150000, 200000, 250000 - ], - 3: [ - 4, 8, 12, 16, 20, 40, 80, 140, 200, 300, 600, 1200, 2000, 3000, 4000, 5000, 6000, 7200, 8600, 10000, 20000, 40000, - 60000, 80000, 100000 - ], - 4: [ - 2, 4, 6, 10, 15, 20, 25, 35, 50, 75, 150, 300, 500, 750, 1000, 1350, 1650, 2000, 2500, 3000, 5000, 10000, 15000, - 20000, 25000 - ], - 5: [ - 1, 2, 3, 5, 7, 10, 15, 20, 25, 30, 60, 120, 200, 300, 400, 500, 600, 720, 860, 1000, 2000, 4000, 6000, 8000, 10000 - ], - 6: [1, 2, 3, 5, 7, 9, 14, 17, 21, 25, 50, 80, 125, 175, 250, 325, 425, 525, 625, 750, 1500, 3000, 4500, 6000, 7500], - 7: [1, 2, 3, 5, 7, 9, 11, 14, 17, 20, 30, 40, 55, 75, 100, 150, 200, 275, 375, 500, 1000, 1500, 2000, 2500, 3000] - }, - /* eslint-enable camelcase */ - // Credits (pit) https://github.com/PitPanda/PitPandaProduction/blob/b1971f56ea1aa8c829b722cbb33247c96591c0cb/structures/Pit.js - pit: { - Prestiges: [ - { Multiplier: 1, TotalXp: 65950, SumXp: 65950, GoldReq: 10000, Renown: 0 }, - { Multiplier: 1.1, TotalXp: 72560, SumXp: 138510, GoldReq: 20000, Renown: 10 }, - { Multiplier: 1.2, TotalXp: 79170, SumXp: 217680, GoldReq: 20000, Renown: 10 }, - { Multiplier: 1.3, TotalXp: 85750, SumXp: 303430, GoldReq: 20000, Renown: 10 }, - { Multiplier: 1.4, TotalXp: 92330, SumXp: 395760, GoldReq: 30000, Renown: 10 }, - { Multiplier: 1.5, TotalXp: 98940, SumXp: 494700, GoldReq: 35000, Renown: 10 }, - { Multiplier: 1.75, TotalXp: 115440, SumXp: 610140, GoldReq: 40000, Renown: 20 }, - { Multiplier: 2, TotalXp: 131900, SumXp: 742040, GoldReq: 45000, Renown: 20 }, - { Multiplier: 2.5, TotalXp: 164890, SumXp: 906930, GoldReq: 50000, Renown: 20 }, - { Multiplier: 3, TotalXp: 197850, SumXp: 1104780, GoldReq: 60000, Renown: 20 }, - { Multiplier: 4, TotalXp: 263800, SumXp: 1368580, GoldReq: 70000, Renown: 20 }, - { Multiplier: 5, TotalXp: 329750, SumXp: 1698330, GoldReq: 80000, Renown: 30 }, - { Multiplier: 6, TotalXp: 395700, SumXp: 2094030, GoldReq: 90000, Renown: 30 }, - { Multiplier: 7, TotalXp: 461650, SumXp: 2555680, GoldReq: 100000, Renown: 30 }, - { Multiplier: 8, TotalXp: 527600, SumXp: 3083280, GoldReq: 125000, Renown: 30 }, - { Multiplier: 9, TotalXp: 593550, SumXp: 3676830, GoldReq: 150000, Renown: 30 }, - { Multiplier: 10, TotalXp: 659500, SumXp: 4336330, GoldReq: 175000, Renown: 40 }, - { Multiplier: 12, TotalXp: 791400, SumXp: 5127730, GoldReq: 200000, Renown: 40 }, - { Multiplier: 14, TotalXp: 923300, SumXp: 6051030, GoldReq: 250000, Renown: 40 }, - { Multiplier: 16, TotalXp: 1055200, SumXp: 7106230, GoldReq: 300000, Renown: 40 }, - { Multiplier: 18, TotalXp: 1187100, SumXp: 8293330, GoldReq: 350000, Renown: 40 }, - { Multiplier: 20, TotalXp: 1319000, SumXp: 9612330, GoldReq: 400000, Renown: 50 }, - { Multiplier: 24, TotalXp: 1582800, SumXp: 11195130, GoldReq: 500000, Renown: 50 }, - { Multiplier: 28, TotalXp: 1846600, SumXp: 13041730, GoldReq: 600000, Renown: 50 }, - { Multiplier: 32, TotalXp: 2110400, SumXp: 15152130, GoldReq: 700000, Renown: 50 }, - { Multiplier: 36, TotalXp: 2374200, SumXp: 17526330, GoldReq: 800000, Renown: 50 }, - { Multiplier: 40, TotalXp: 2638000, SumXp: 20164330, GoldReq: 900000, Renown: 75 }, - { Multiplier: 45, TotalXp: 2967750, SumXp: 23132080, GoldReq: 1000000, Renown: 75 }, - { Multiplier: 50, TotalXp: 3297500, SumXp: 26429580, GoldReq: 1000000, Renown: 75 }, - { Multiplier: 75, TotalXp: 4946250, SumXp: 31375830, GoldReq: 1000000, Renown: 75 }, - { Multiplier: 100, TotalXp: 6595000, SumXp: 37970830, GoldReq: 1000000, Renown: 250 }, - { Multiplier: 101, TotalXp: 6660950, SumXp: 44631780, GoldReq: 1000000, Renown: 100 }, - { Multiplier: 101, TotalXp: 6660950, SumXp: 51292730, GoldReq: 1000000, Renown: 100 }, - { Multiplier: 101, TotalXp: 6660950, SumXp: 57953680, GoldReq: 1000000, Renown: 100 }, - { Multiplier: 101, TotalXp: 6660950, SumXp: 64614630, GoldReq: 1000000, Renown: 100 }, - { Multiplier: 101, TotalXp: 6660950, SumXp: 71275580, GoldReq: 2000000, Renown: 100 }, - { Multiplier: 200, TotalXp: 13190000, SumXp: 84465580, GoldReq: 2000000, Renown: 100 }, - { Multiplier: 300, TotalXp: 19785000, SumXp: 104250580, GoldReq: 2000000, Renown: 100 }, - { Multiplier: 400, TotalXp: 26380000, SumXp: 130630580, GoldReq: 2000000, Renown: 100 }, - { Multiplier: 500, TotalXp: 32975000, SumXp: 163605580, GoldReq: 2000000, Renown: 100 }, - { Multiplier: 750, TotalXp: 49462500, SumXp: 213068080, GoldReq: 2000000, Renown: 100 }, - { Multiplier: 1000, TotalXp: 65950000, SumXp: 279018080, GoldReq: 2000000, Renown: 100 }, - { Multiplier: 1250, TotalXp: 82437500, SumXp: 361455580, GoldReq: 2000000, Renown: 100 }, - { Multiplier: 1500, TotalXp: 98925000, SumXp: 460380580, GoldReq: 2000000, Renown: 100 }, - { Multiplier: 1750, TotalXp: 115412500, SumXp: 575793080, GoldReq: 2000000, Renown: 100 }, - { Multiplier: 2000, TotalXp: 131900000, SumXp: 707693080, GoldReq: 2000000, Renown: 100 }, - { Multiplier: 3000, TotalXp: 197850000, SumXp: 905543080, GoldReq: 2000000, Renown: 100 }, - { Multiplier: 5000, TotalXp: 329750000, SumXp: 1235293080, GoldReq: 2000000, Renown: 100 }, - { Multiplier: 10000, TotalXp: 659500000, SumXp: 1894793080, GoldReq: 2000000, Renown: 100 }, - { Multiplier: 50000, TotalXp: 3297500000, SumXp: 5192293080, GoldReq: 2000000, Renown: 100 }, - { Multiplier: 100000, TotalXp: 6595000000, SumXp: 11787293080, GoldReq: 0, Renown: 100 } - ], - Levels: [ - { Xp: 15 }, - { Xp: 30 }, - { Xp: 50 }, - { Xp: 75 }, - { Xp: 125 }, - { Xp: 300 }, - { Xp: 600 }, - { Xp: 800 }, - { Xp: 900 }, - { Xp: 1000 }, - { Xp: 1200 }, - { Xp: 1500 }, - { Xp: 0 } - ] } }; diff --git a/src/Utils/Divide.test.ts b/src/Utils/Divide.test.ts new file mode 100644 index 000000000..23e4cca6a --- /dev/null +++ b/src/Utils/Divide.test.ts @@ -0,0 +1,13 @@ +import Divide from './Divide.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Divide', () => { + expect(Divide(10, 2)).toBe(5); + expectTypeOf(Divide(10, 2)).toBeNumber(); + expect(Divide(10, 0)).toBe(10); + expectTypeOf(Divide(10, 0)).toBeNumber(); + expect(Divide(0, 0)).toBe(0); + expectTypeOf(Divide(0, 0)).toBeNumber(); + expect(Divide(-5, 10)).toBe(-0.5); + expectTypeOf(Divide(-5, 10)).toBeNumber(); +}); diff --git a/src/utils/divide.js b/src/Utils/Divide.ts similarity index 61% rename from src/utils/divide.js rename to src/Utils/Divide.ts index 416f28ef6..e122742ec 100644 --- a/src/utils/divide.js +++ b/src/Utils/Divide.ts @@ -1,5 +1,5 @@ -module.exports = (a = 0, b = 1) => { +export default function Divide(a: number, b: number): number { const out = Number(((a || 0) / (b || 0)).toFixed(2)) || 0; if (isFinite(out)) return out; return a; -}; +} diff --git a/src/Utils/Guild.ts b/src/Utils/Guild.ts new file mode 100644 index 000000000..5ebbc036d --- /dev/null +++ b/src/Utils/Guild.ts @@ -0,0 +1,83 @@ +import GuildMember from '../Structures/Guild/GuildMember.js'; +import GuildRank from '../Structures/Guild/GuildRank.js'; +import type { ExpHistory } from '../Types/Guild.js'; + +const dateRegExp = /(\d{4})-(\d{2})-(\d{2})/; +export function parseDate(date: Record) { + date[1] -= 1; + return new Date( + Math.round(new Date(new Date().setUTCFullYear(...(date as [any]))).setUTCHours(5, 0, 0) / 1000) * 1000 + ); +} + +export function parseHistory(historyData: Record): ExpHistory[] { + return Object.entries(historyData).map((x, index) => ({ + day: x[0], + date: x[0].match(dateRegExp) + ? parseDate( + x[0] + .match(dateRegExp)! + .slice(1) + .map((x) => parseInt(x, 10)) + ) + : undefined, + exp: x[1] || 0, + totalExp: + Object.values(historyData) + .slice(0, index + 1) + .reduce((pV: any, cV: any) => pV + cV, 0) || 0 + })); +} + +export function getGuildLevel(exp: number) { + const EXP_NEEDED: number[] = [ + 100000, 150000, 250000, 500000, 750000, 1000000, 1250000, 1500000, 2000000, 2500000, 2500000, 2500000, 2500000, + 2500000, 3000000 + ]; + let level = 0; + for (let i = 0; 1000 >= i; i += 1) { + let need: number; + if (i >= EXP_NEEDED.length) { + need = EXP_NEEDED[EXP_NEEDED.length - 1] || 0; + } else { + need = EXP_NEEDED[i] || 0; + } + if (0 > exp - need) { + return Math.round((level + exp / need) * 100) / 100; + } + level += 1; + exp -= need; + } + return 1000; +} + +export function ranks(data: Record) { + return data.ranks && data.ranks.length + ? data.ranks.map((r: any) => new GuildRank(r)).sort((a: any, b: any) => a.priority - b.priority) + : []; +} + +export function expLimit(exp: number) { + return 2e5 < exp ? (7e5 < exp ? 2.5e5 + Math.round(exp * 0.03) : 2e5 + Math.round((exp - 2e5) / 10)) : exp; +} + +export function calculateExpHistory(data: GuildMember[]): ExpHistory[] { + const finalObj: Record = {}; + if (undefined === data[0]?.expHistory) return []; + Object.keys(data[0].expHistory).forEach((day, index) => { + let gexp = 0; + data.forEach((member) => (gexp += member.expHistory?.[index]?.exp || 0)); + finalObj[data[0]?.expHistory[index]?.day || 'Unknown'] = expLimit(gexp); + }); + return parseHistory(finalObj); +} + +export function members(data: Record): GuildMember[] { + return data.length ? data.map((m: Record) => new GuildMember(m)) : []; +} + +export function totalWeeklyGexp(data: GuildMember[]): number { + let gexp: number = 0; + data.forEach((member) => (gexp += member.weeklyExperience)); + return gexp; +} diff --git a/src/Utils/Oscillation.test.ts b/src/Utils/Oscillation.test.ts new file mode 100644 index 000000000..27f7b5776 --- /dev/null +++ b/src/Utils/Oscillation.test.ts @@ -0,0 +1,18 @@ +import { expect, test } from 'vitest'; +import { monthAB } from './Oscillation.js'; + +test('Oscillation', () => { + expect(monthAB(0)).toBe('b'); + expect(monthAB(1)).toBe('a'); + expect(monthAB(2)).toBe('b'); + expect(monthAB(3)).toBe('a'); + expect(monthAB(4)).toBe('b'); + expect(monthAB(5)).toBe('a'); + expect(monthAB(6)).toBe('b'); + expect(monthAB(7)).toBe('a'); + expect(monthAB(8)).toBe('b'); + expect(monthAB(9)).toBe('a'); + expect(monthAB(10)).toBe('b'); + expect(monthAB(11)).toBe('a'); + expect(monthAB(12)).toBe('b'); +}); diff --git a/src/Utils/Oscillation.ts b/src/Utils/Oscillation.ts new file mode 100644 index 000000000..128096f3f --- /dev/null +++ b/src/Utils/Oscillation.ts @@ -0,0 +1,14 @@ +// See https://github.com/HypixelDev/PublicAPI/blob/db26b5fd3b7bb29da14e40e6d211143ec44a4519/Documentation/misc/Oscillation.md +// Month Oscillation started in December 2014, so every month that is pair ( odd in js!! ) is month A +// Weekly Oscillation started... just refer to the code in the docs +const weeklyOscillationStart = 1417237200000; +export function monthAB(month?: number) { + if (month === undefined) { + month = new Date().getMonth(); + } + return month % 2 ? 'a' : 'b'; +} + +export function weekAB() { + return (Math.abs(new Date().getTime() - weeklyOscillationStart) / 604800000) % 2 ? 'a' : 'b'; +} diff --git a/src/Utils/PlayerUtils.test.ts b/src/Utils/PlayerUtils.test.ts new file mode 100644 index 000000000..a340c3512 --- /dev/null +++ b/src/Utils/PlayerUtils.test.ts @@ -0,0 +1,82 @@ +import { describe, expect, test } from 'vitest'; +import { + getPlayerLevel, + getRank, + levelToXP, + parseClaimedRewards, + playerLevelProgress, + xpToNextLevel +} from './PlayerUtils.js'; + +test('getRank', () => { + expect(getRank({ prefix: '[EVENTS]' })).toBe('Events'); + expect(getRank({ prefix: '[MOJANG]' })).toBe('Mojang'); + expect(getRank({ prefix: '[PIG+++]' })).toBe('PIG+++'); + expect(getRank({ prefix: '[INNIT]' })).toBe('Innit'); + expect(getRank({ prefix: '[meow]' })).toBeNull(); + + expect(getRank({ rank: 'ADMIN' })).toBe('Admin'); + expect(getRank({ rank: 'GAME_MASTER' })).toBe('Game Master'); + expect(getRank({ rank: 'Meow' })).toBeNull(); + + expect(getRank({ newPackageRank: 'MVP_PLUS', monthlyPackageRank: 'SUPERSTAR' })).toBe('MVP++'); + expect(getRank({ newPackageRank: 'MVP_PLUS', monthlyPackageRank: 'Meow' })).toBe('MVP+'); + expect(getRank({ newPackageRank: 'MVP' })).toBe('MVP'); + expect(getRank({ newPackageRank: 'VIP_PLUS' })).toBe('VIP+'); + expect(getRank({ newPackageRank: 'VIP' })).toBe('VIP'); + expect(getRank({ newPackageRank: 'meow' })).toBeNull(); +}); + +test('getPlayerLevel', () => { + describe('should calculate the player level correctly', () => { + const exp = 10000; + expect(getPlayerLevel(exp)).toBe(1); + }); +}); + +test('xpToNextLevel', () => { + describe('should calculate the XP required for the next level correctly', () => { + const xp = 10000; + expect(xpToNextLevel(xp)).toBe(25000); + }); + + describe('should return 10000 if the XP is less than 10000', () => { + const xp = 5000; + expect(xpToNextLevel(xp)).toBe(10000); + }); +}); + +test('levelToXP', () => { + describe('should calculate the XP required for a given level correctly', () => { + const level = 2; + expect(levelToXP(level)).toBe(20000); + }); +}); + +test('playerLevelProgress', () => { + describe('should calculate the player level progress correctly', () => { + const xp = 15000; + const expectedProgress = { + xpToNext: 37500, + remainingXP: 22500, + currentXP: 12500, + percent: 33.33, + percentRemaining: 66.67 + }; + expect(playerLevelProgress(xp)).toEqual(expectedProgress); + }); +}); + +test('parseClaimedRewards', () => { + describe('should parse the claimed rewards correctly', () => { + /* eslint-disable camelcase */ + const data = { + levelingReward_1: true, + levelingReward_3: true, + levelingReward_5: true + }; + /* eslint-enable camelcase */ + const expectedRewards = [1, 3, 5]; + expect(parseClaimedRewards(data)).toEqual(expectedRewards); + }); +}); diff --git a/src/Utils/PlayerUtils.ts b/src/Utils/PlayerUtils.ts new file mode 100644 index 000000000..4e115bd3b --- /dev/null +++ b/src/Utils/PlayerUtils.ts @@ -0,0 +1,90 @@ +import { LevelProgress, PlayerRank } from '../Types/Player.js'; + +export function getRank(player: Record): PlayerRank { + if (player.prefix) { + switch (player.prefix.replace(/§[0-9|a-z]|\[|\]/g, '')) { + case 'EVENTS': + return 'Events'; + case 'MOJANG': + return 'Mojang'; + case 'PIG+++': + return 'PIG+++'; + case 'INNIT': + return 'Innit'; + default: + return null; + } + } else if (player.rank) { + switch (player.rank) { + case 'ADMIN': + return 'Admin'; + case 'GAME_MASTER': + return 'Game Master'; + default: + return null; + } + } else { + switch (player.newPackageRank) { + case 'MVP_PLUS': + return 'SUPERSTAR' !== player.monthlyPackageRank ? 'MVP+' : 'MVP++'; + case 'MVP': + return 'MVP'; + case 'VIP_PLUS': + return 'VIP+'; + case 'VIP': + return 'VIP'; + default: + return null; + } + } +} + +export function getPlayerLevel(exp: number): number { + const base = 10000; + const growth = 2500; + const reversePqPrefix = -(base - 0.5 * growth) / growth; + const reverseConst = reversePqPrefix * reversePqPrefix; + const growthDivides2 = 2 / growth; + const num = 1 + reversePqPrefix + Math.sqrt(reverseConst + growthDivides2 * exp); + const level = Math.round(num * 100) / 100; + return level; +} + +export function xpToNextLevel(xp: number): number { + const lvl = getPlayerLevel(xp); + const xpToNext = 2500 * Math.floor(lvl) + 5000; + if (10000 > xp) return 10000; + return xpToNext; +} + +export function levelToXP(xp: number): number { + let level = Number(Math.floor(getPlayerLevel(xp))); + level = level - 1; + return 1250 * level ** 2 + 8750 * level; +} + +export function playerLevelProgress(xp: number): LevelProgress { + const xpFromLevel = levelToXP(xp); + let currentXP = xp - xpFromLevel; + const xpToNext = xpToNextLevel(xp); + const remainingXP = xpToNext - currentXP + 2500; + currentXP = currentXP - 2500; + const percent = Math.round((currentXP / xpToNext) * 100 * 100) / 100; + const percentRemaining = Math.round((100 - percent) * 100) / 100; + return { + level: getPlayerLevel(xp), + xpToNext, + remainingXP, + currentXP, + percent, + percentRemaining + }; +} + +export function parseClaimedRewards(data: Record): number[] { + return Object.keys(data) + .map((x) => x.match(/levelingReward_(\d+)/)) + .filter((x) => x) + .map((x) => (x ? parseInt(x?.[1] || '0', 10) : null)) + .filter((x) => null !== x); +} diff --git a/src/Utils/RemoveSnakeCase.ts b/src/Utils/RemoveSnakeCase.ts new file mode 100644 index 000000000..1054b70a5 --- /dev/null +++ b/src/Utils/RemoveSnakeCase.ts @@ -0,0 +1,20 @@ +export function validateJSON(obj: any) { + return 'object' === typeof obj && '{' === JSON.stringify(obj)[0]; +} + +export function recursive(obj: any, lowerCase: boolean = false): any { + if (!validateJSON(obj)) return obj; + return Object.keys(obj).reduce( + (pV, cV) => ({ + ...pV, + [(lowerCase ? cV : cV.toLowerCase()).replace(/_[a-z]/gi, (x) => (x?.[1] || 'Unknown').toUpperCase())]: recursive( + obj[cV] + ) + }), + {} + ); +} + +export function RemoveSnakeCaseString(str: string): string { + return str.toLowerCase().replace(/_[a-z]/gi, (x) => (x?.[1] || 'Unknown').toUpperCase()); +} diff --git a/src/Utils/Romanize.test.ts b/src/Utils/Romanize.test.ts new file mode 100644 index 000000000..aad88fbc6 --- /dev/null +++ b/src/Utils/Romanize.test.ts @@ -0,0 +1,9 @@ +import Romanize from './Romanize.js'; +import { expect, test } from 'vitest'; + +test('Romanize', () => { + expect(Romanize('2')).toBe('II'); + expect(Romanize(128)).toBe('CXXVIII'); + expect(Romanize(500)).toBe('D'); + expect(Romanize('7')).toBe('VII'); +}); diff --git a/src/utils/romanize.js b/src/Utils/Romanize.ts similarity index 78% rename from src/utils/romanize.js rename to src/Utils/Romanize.ts index e4e176fc6..b9bffdb60 100644 --- a/src/utils/romanize.js +++ b/src/Utils/Romanize.ts @@ -1,5 +1,4 @@ -module.exports = (num) => { - if (isNaN(num)) return NaN; +export default function Romanize(num: number | string): string { const digits = String(Number(num)).split(''); const key = [ '', @@ -38,5 +37,5 @@ module.exports = (num) => { while (i--) { roman = (key[Number(digits.pop()) + i * 10] || '') + roman; } - return Array(Number(digits.join('')) + 1).join('M') + roman; -}; + return Array(Number(digits.join('') + 1)).join('M') + roman; +} diff --git a/src/Utils/SkyblockUtils.test.ts b/src/Utils/SkyblockUtils.test.ts new file mode 100644 index 000000000..b8b2bc5cd --- /dev/null +++ b/src/Utils/SkyblockUtils.test.ts @@ -0,0 +1,9 @@ +import { expect, test } from 'vitest'; +import { getTrophyFishRank } from './SkyblockUtils.js'; + +test('getTrophyFishRank', () => { + expect(getTrophyFishRank(1)).toBe('Bronze'); + expect(getTrophyFishRank(2)).toBe('Silver'); + expect(getTrophyFishRank(3)).toBe('Gold'); + expect(getTrophyFishRank(4)).toBe('Diamond'); +}); diff --git a/src/utils/SkyblockUtils.js b/src/Utils/SkyblockUtils.ts similarity index 50% rename from src/utils/SkyblockUtils.js rename to src/Utils/SkyblockUtils.ts index 51841c9e8..ae4837ebe 100644 --- a/src/utils/SkyblockUtils.js +++ b/src/Utils/SkyblockUtils.ts @@ -1,12 +1,27 @@ -/* eslint-disable jsdoc/require-jsdoc */ -const { parse, simplify } = require('prismarine-nbt'); -const constants = require('./Constants'); - -async function decode(base64, isBuffer = false) { +import Constants, { bestiaryBrackets, petLevels, petRarityOffset } from './Constants.js'; +import { + ChocolateFactoryData, + CrimsonIsle, + CrimsonIsleBelt, + CrimsonIsleDojoRank, + Dungeons, + HOTM, + JacobData, + Rarity, + RawDungeonRun, + SkillLevel, + Skills, + Slayer, + SlayerData, + TrophyFishRank +} from '../Types/Skyblock.js'; +import { parse, simplify } from 'prismarine-nbt'; + +export async function decode(base64: any, isBuffer: boolean = false): Promise { // Credit: https://github.com/SkyCryptWebsite/SkyCryptv2/blob/3b5b3ae4fe77c60eff90691797f09024baf68872/src/lib/server/stats/items/processing.ts#L215-L218 const buffer = isBuffer ? base64 : Buffer.from(base64, 'base64'); - let data = await parse(buffer); - data = simplify(data.parsed); + const parseData = await parse(buffer); + const data = simplify(parseData.parsed); const newdata = []; for (let i = 0; i < data.i.length; i++) { newdata.push(data.i[i]); @@ -14,69 +29,65 @@ async function decode(base64, isBuffer = false) { return newdata; } -function getLevelByXp(xp, type, levelCap) { - let xpTable; +export function getLevelByXp(xp: number, type: string): SkillLevel { + let xpTable: Record; switch (type) { case 'runecrafting': - xpTable = constants.runecraftingXp; + xpTable = Constants.runecraftingXp; break; case 'dungeons': - xpTable = constants.dungeonXp; + xpTable = Constants.dungeonXp; break; case 'hotm': - xpTable = constants.hotmXp; + xpTable = Constants.hotmXp; break; case 'social': - xpTable = constants.socialXp; + xpTable = Constants.socialXp; break; case 'garden': - xpTable = constants.garden; + xpTable = Constants.garden; break; case 'wheat': - xpTable = constants.wheat; + xpTable = Constants.wheat; break; case 'carrot': - xpTable = constants.carrot; + xpTable = Constants.carrot; break; case 'potato': - xpTable = constants.potato; + xpTable = Constants.potato; break; case 'melon': - xpTable = constants.melon; + xpTable = Constants.melon; break; case 'pumpkin': - xpTable = constants.pumpkin; + xpTable = Constants.pumpkin; break; case 'sugarCane': - xpTable = constants.sugarCane; + xpTable = Constants.sugarCane; break; case 'cocoaBeans': - xpTable = constants.cocoaBeans; + xpTable = Constants.cocoaBeans; break; case 'cactus': - xpTable = constants.cactus; + xpTable = Constants.cactus; break; case 'mushroom': - xpTable = constants.mushroom; + xpTable = Constants.mushroom; break; case 'netherWart': - xpTable = constants.netherWart; + xpTable = Constants.netherWart; break; default: - xpTable = constants.levelingXp; - } - let maxLevel = Math.max(...Object.keys(xpTable)); - if ((constants.skillsCap[type] ?? maxLevel) > maxLevel) { - xpTable = Object.assign(constants.xpPast50, xpTable); - maxLevel = 'number' === typeof levelCap ? maxLevel + levelCap : Math.max(...Object.keys(xpTable)); + xpTable = Constants.levelingXp; } + const maxLevel = Math.max(...Object.keys(xpTable).map(Number)); if (isNaN(xp)) { return { xp: 0, level: 0, maxLevel, xpCurrent: 0, - xpForNext: xpTable[1], + xpForNext: xpTable[1] || 0, progress: 0, cosmetic: Boolean('runecrafting' === type || 'social' === type) }; @@ -86,18 +97,17 @@ function getLevelByXp(xp, type, levelCap) { let xpForNext = 0; for (let x = 1; x <= maxLevel; x++) { if (!xpTable[x]) continue; - xpTotal += xpTable[x]; + xpTotal += xpTable?.[x] || 0; if (xpTotal > xp) { - xpTotal -= xpTable[x]; + xpTotal -= xpTable?.[x] || 0; break; } else { level = x; } } const xpCurrent = Math.floor(xp - xpTotal); - if (level < maxLevel) xpForNext = Math.ceil(xpTable[level + 1]); + if (level < maxLevel) xpForNext = Math.ceil(xpTable?.[level + 1] || 0); const progress = Math.floor(Math.max(0, Math.min(xpCurrent / xpForNext, 1)) * 100 * 10) / 10; - return { xp: xp, level: level, @@ -109,27 +119,17 @@ function getLevelByXp(xp, type, levelCap) { }; } -function getSlayerLevel(slayer) { +export function getSlayerLevel(slayer: Record): SlayerData { if (!slayer) { - return { - xp: 0, - tier1: 0, - tier2: 0, - tier3: 0, - tier4: 0, - tier5: 0, - level: 0 - }; + return { xp: 0, tier1: 0, tier2: 0, tier3: 0, tier4: 0, tier5: 0, level: 0 }; } - // eslint-disable-next-line camelcase const { claimed_levels } = slayer; let level = 0; - // eslint-disable-next-line camelcase for (const levelName in claimed_levels) { if (Object.prototype.hasOwnProperty.call(claimed_levels, levelName)) { - const newLevel = parseInt(levelName.replace('_special', '').split('_').pop(), 10); + const newLevel = parseInt(levelName.replace('_special', '').split('_').pop() ?? '', 10); if (newLevel > level) { level = newLevel; } @@ -146,123 +146,79 @@ function getSlayerLevel(slayer) { }; } -function getMemberStats(obj) { - return Object.keys(obj).reduce( - (result, currentKey) => { - const key = currentKey.replace(/_[a-z]/gi, (match) => match[1].toUpperCase()); - - if (currentKey.startsWith('kills') || currentKey.startsWith('deaths')) { - const category = currentKey.startsWith('kills') ? 'kills' : 'deaths'; - const subKey = key === category ? 'total' : key; - - result[category][ - subKey.replace(category, (sub, _, key) => { - return key[sub.length].toLowerCase() + key.slice(sub.length + 1); - }) - ] = obj[currentKey]; - } else { - result[key] = obj[currentKey]; - } - - return result; - }, - { kills: {}, deaths: {} } - ); -} - -function getTrophyFishRank(level) { +export function getTrophyFishRank(level: number): TrophyFishRank { if (1 === level) { return 'Bronze'; } else if (2 === level) { return 'Silver'; } else if (3 === level) { return 'Gold'; - } else if (4 <= level) { + } else if (4 === level) { return 'Diamond'; } - return null; + return 'Bronze'; } -function getSkills(data) { - const skillsObject = {}; - skillsObject.combat = getLevelByXp(data?.player_data?.experience?.SKILL_COMBAT ?? 0, 'combat'); - skillsObject.farming = getLevelByXp( - data?.player_data?.experience?.SKILL_FARMING ?? 0, - 'farming', - data?.m?.jacobs_contest?.perks?.farming_level_cap ?? 0 + 50 - ); - skillsObject.fishing = getLevelByXp(data?.player_data?.experience?.SKILL_FISHING ?? 0, 'fishing'); - skillsObject.mining = getLevelByXp(data?.player_data?.experience?.SKILL_MINING ?? 0, 'mining'); - skillsObject.foraging = getLevelByXp(data?.player_data?.experience?.SKILL_FORAGING ?? 0, 'foraging'); - skillsObject.enchanting = getLevelByXp(data?.player_data?.experience?.SKILL_ENCHANTING ?? 0, 'enchanting'); - skillsObject.alchemy = getLevelByXp(data?.player_data?.experience?.SKILL_ALCHEMY ?? 0, 'alchemy'); - skillsObject.carpentry = getLevelByXp(data?.player_data?.experience?.SKILL_CARPENTRY ?? 0, 'carpentry'); - skillsObject.runecrafting = getLevelByXp(data?.player_data?.experience?.SKILL_RUNECRAFTING ?? 0, 'runecrafting'); - skillsObject.taming = getLevelByXp(data?.player_data?.experience?.SKILL_TAMING ?? 0, 'taming'); - skillsObject.social = getLevelByXp(data?.player_data?.experience?.SKILL_SOCIAL ?? 0, 'social'); +export function getSkills(data: Record): Skills { + const skillsObject: Skills = { + combat: getLevelByXp(data?.player_data?.experience?.SKILL_COMBAT ?? 0, 'combat'), + farming: getLevelByXp(data?.player_data?.experience?.SKILL_FARMING ?? 0, 'farming'), + fishing: getLevelByXp(data?.player_data?.experience?.SKILL_FISHING ?? 0, 'fishing'), + mining: getLevelByXp(data?.player_data?.experience?.SKILL_MINING ?? 0, 'mining'), + foraging: getLevelByXp(data?.player_data?.experience?.SKILL_FORAGING ?? 0, 'foraging'), + enchanting: getLevelByXp(data?.player_data?.experience?.SKILL_ENCHANTING ?? 0, 'enchanting'), + alchemy: getLevelByXp(data?.player_data?.experience?.SKILL_ALCHEMY ?? 0, 'alchemy'), + carpentry: getLevelByXp(data?.player_data?.experience?.SKILL_CARPENTRY ?? 0, 'carpentry'), + runecrafting: getLevelByXp(data?.player_data?.experience?.SKILL_RUNECRAFTING ?? 0, 'runecrafting'), + taming: getLevelByXp(data?.player_data?.experience?.SKILL_TAMING ?? 0, 'taming'), + social: getLevelByXp(data?.player_data?.experience?.SKILL_SOCIAL ?? 0, 'social'), + average: 0 + }; const levels = Object.values(skillsObject) .filter((skill) => true !== skill.cosmetic) .map((skill) => skill.level); skillsObject.average = levels.reduce((a, b) => a + b, 0) / levels.length; return skillsObject; } - -function formatBestiaryMobs(userProfile, mobs) { +function formatBestiaryMobs(userProfile: Record, mobs: any) { const output = []; for (const mob of mobs) { - const mobBracket = constants.bestiaryBrackets[mob.bracket]; - - const totalKills = mob.mobs.reduce((acc, cur) => { + const mobBracket = bestiaryBrackets?.[mob.bracket] || []; + const totalKills = mob.mobs.reduce((acc: any, cur: any) => { return acc + (userProfile.bestiary.kills[cur] ?? 0); }, 0); - const maxKills = mob.cap; - const nextTierKills = mobBracket.find((tier) => totalKills < tier && tier <= maxKills); + const nextTierKills = mobBracket.find((tier: any) => totalKills < tier && tier <= maxKills); const tier = nextTierKills ? mobBracket.indexOf(nextTierKills) : mobBracket.indexOf(maxKills) + 1; - - output.push({ - tier: tier - }); + output.push({ tier: tier }); } - return output; } -function getBestiaryLevel(userProfile) { - try { - if (userProfile.bestiary?.kills === undefined) { - return null; - } - - const output = {}; - let tiersUnlocked = 0; - for (const [category, data] of Object.entries(constants.bestiary)) { - const { mobs } = data; - output[category] = {}; - - if ('fishing' === category) { - for (const [key, value] of Object.entries(data)) { - output[category][key] = { - mobs: formatBestiaryMobs(userProfile, value.mobs) - }; - tiersUnlocked += output[category][key].mobs.reduce((acc, cur) => acc + cur.tier, 0); - } - } else { - output[category].mobs = formatBestiaryMobs(userProfile, mobs); - tiersUnlocked += output[category].mobs.reduce((acc, cur) => acc + cur.tier, 0); +export function getBestiaryLevel(userProfile: Record): number { + if (userProfile?.bestiary?.kills === undefined) { + return 0; + } + const output: { [key: string]: any } = {}; + let tiersUnlocked = 0; + for (const [category, data] of Object.entries(Constants.bestiary)) { + const { mobs } = data as { mobs: any }; + output[category] = {}; + if ('fishing' === category) { + for (const [key, value] of Object.entries(data)) { + output[category][key] = { mobs: formatBestiaryMobs(userProfile, value.mobs) }; + tiersUnlocked += output[category][key].mobs.reduce((acc: any, cur: any) => acc + cur.tier, 0); } + } else { + output[category].mobs = formatBestiaryMobs(userProfile, mobs); + tiersUnlocked += output[category].mobs.reduce((acc: any, cur: any) => acc + cur.tier, 0); } - - return tiersUnlocked / 10; - } catch (error) { - // eslint-disable-next-line no-console - console.log(error); - return null; } + return tiersUnlocked / 10; } -function getSlayer(data) { - if (!data?.slayer?.slayer_bosses) return; +export function getSlayer(data: Record): Slayer | null { + if (!data?.slayer?.slayer_bosses) return null; return { zombie: getSlayerLevel(data?.slayer?.slayer_bosses?.zombie), spider: getSlayerLevel(data?.slayer?.slayer_bosses?.spider), @@ -273,138 +229,46 @@ function getSlayer(data) { }; } -function getScore(points) { - if (1000 <= points) { - return 'S'; - } else if (800 <= points) { - return 'A'; - } else if (600 <= points) { - return 'B'; - } else if (400 <= points) { - return 'C'; - } else if (200 <= points) { - return 'D'; - } - return 'F'; -} - -function getBelt(points) { - if (7000 <= points) { - return 'Black'; - } else if (6000 <= points) { - return 'Brown'; - } else if (4000 <= points) { - return 'Blue'; - } else if (2000 <= points) { - return 'Green'; - } else if (1000 <= points) { - return 'Yellow'; - } - return 'White'; -} - -function getCrimson(data) { - return { - faction: data?.nether_island_player_data?.selected_faction || null, - reputation: { - barbarians: data?.nether_island_player_data?.barbarians_reputation ?? 0, - mages: data?.nether_island_player_data?.mages_reputation ?? 0 - }, - trophyFish: { - rank: getTrophyFishRank((data?.trophy_fish?.rewards ?? [])?.length), - caught: { - total: data?.trophy_fish?.total_caught ?? 0, - bronze: Object.keys(data?.trophy_fish ?? {}).filter((key) => key.endsWith('_bronze'))?.length, - silver: Object.keys(data?.trophy_fish ?? {}).filter((key) => key.endsWith('_silver'))?.length, - gold: Object.keys(data?.trophy_fish ?? {}).filter((key) => key.endsWith('_gold'))?.length, - diamond: Object.keys(data?.trophy_fish ?? {}).filter((key) => key.endsWith('_diamond'))?.length - } - }, - dojo: { - belt: getBelt( - Object.keys(data?.nether_island_player_data?.dojo ?? {}) - .filter((key) => key?.startsWith('dojo_points')) - .reduce((acc, key) => acc + (data?.nether_island_player_data?.dojo[key] ?? 0), 0) - ), - force: { - points: data?.nether_island_player_data?.dojo?.dojo_points_mob_kb ?? 0, - rank: getScore(data?.nether_island_player_data?.dojo?.dojo_points_mob_kb ?? 0) - }, - stamina: { - points: data?.nether_island_player_data?.dojo?.dojo_points_wall_jump ?? 0, - rank: getScore(data?.nether_island_player_data?.dojo?.dojo_points_wall_jump ?? 0) - }, - mastery: { - points: data?.nether_island_player_data?.dojo?.dojo_points_archer ?? 0, - rank: getScore(data?.nether_island_player_data?.dojo?.dojo_points_archer ?? 0) - }, - discipline: { - points: data?.nether_island_player_data?.dojo?.dojo_points_sword_swap ?? 0, - rank: getScore(data?.nether_island_player_data?.dojo?.dojo_points_sword_swap ?? 0) - }, - swiftness: { - points: data?.nether_island_player_data?.dojo?.dojo_points_snake ?? 0, - rank: getScore(data?.nether_island_player_data?.dojo?.dojo_points_snake ?? 0) - }, - control: { - points: data?.nether_island_player_data?.dojo?.dojo_points_lock_head ?? 0, - rank: getScore(data?.nether_island_player_data?.dojo?.dojo_points_lock_head ?? 0) - }, - tenacity: { - points: data?.nether_island_player_data?.dojo?.dojo_points_fireball ?? 0, - rank: getScore(data?.nether_island_player_data?.dojo?.dojo_points_fireball ?? 0) - } - }, - kuudra: { - none: data?.nether_island_player_data?.kuudra_completed_tiers?.none ?? 0, - hot: data?.nether_island_player_data?.kuudra_completed_tiers?.hot ?? 0, - burning: data?.nether_island_player_data?.kuudra_completed_tiers?.burning ?? 0, - fiery: data?.nether_island_player_data?.kuudra_completed_tiers?.fiery ?? 0, - highestWaveHot: data?.nether_island_player_data?.kuudra_completed_tiers?.highest_wave_hot ?? 0, - highestWaveFiery: data?.nether_island_player_data?.kuudra_completed_tiers?.highest_wave_fiery ?? 0, - infernal: data?.nether_island_player_data?.kuudra_completed_tiers?.infernal ?? 0, - highestWaveInfernal: data?.nether_island_player_data?.kuudra_completed_tiers?.highest_wave_infernal ?? 0, - highestWaveBurning: data?.nether_island_player_data?.kuudra_completed_tiers?.highest_wave_burning ?? 0 - } - }; -} - -function getCompletions(data) { - const completions = { - total: 0 - }; - +function getCompletions(data: Record): Record { + const completions: Record = { total: 0 }; for (const tier in data) { if ('total' === tier) continue; - completions[`Floor_${tier}`] = data[tier]; - completions.total += data[tier]; + completions[`Floor_${tier}`] = data?.[tier]; + completions.total += data?.[tier]; } - return completions; } -function getDungeonsFloor(data, type, floor) { +function getDungeonsFloor( + data: Record, + type: 'catacombs' | 'master_catacombs', + floor: '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' +) { return { - fastestRun: (data?.dungeons?.dungeon_types?.[type]?.best_runs?.[floor] ?? []).sort( - (a, b) => a?.elapsed_time - b?.elapsed_time + fastestRun: (data?.dungeons?.dungeon_types?.[type]?.best_runs?.[floor] || [])?.sort( + (a: RawDungeonRun, b: RawDungeonRun) => a?.elapsed_time - b?.elapsed_time )[0], - fastestSRun: (data?.dungeons?.dungeon_types?.[type]?.best_runs?.[floor] ?? []) - .filter((run) => 270 >= run?.score_exploration + run?.score_speed + run?.score_skill + run?.score_bonus) - .sort((a, b) => a?.elapsed_time - b?.elapsed_time)[0], - fastestSPlusRun: (data?.dungeons?.dungeon_types?.[type]?.best_runs?.[floor] ?? []) - .filter((run) => 300 >= run?.score_exploration + run?.score_speed + run?.score_skill + run?.score_bonus) - .sort((a, b) => a?.elapsed_time - b?.elapsed_time)[0], - completions: data?.dungeonXp?.dungeon_types?.[type]?.tier_completions[floor] ?? 0 + fastestSRun: (data?.dungeons?.dungeon_types?.[type]?.best_runs?.[floor] || []) + ?.filter( + (run: RawDungeonRun) => 270 >= run?.score_exploration + run?.score_speed + run?.score_skill + run?.score_bonus + ) + ?.sort((a: RawDungeonRun, b: RawDungeonRun) => a?.elapsed_time - b?.elapsed_time)[0], + fastestSPlusRun: (data?.dungeons?.dungeon_type?.s[type]?.best_runs?.[floor] || []) + ?.filter( + (run: RawDungeonRun) => 300 >= run?.score_exploration + run?.score_speed + run?.score_skill + run?.score_bonus + ) + ?.sort((a: RawDungeonRun, b: RawDungeonRun) => a?.elapsed_time - b?.elapsed_time)[0], + completions: data?.dungeonXp?.dungeon_types?.[type]?.tier_completions?.[floor] || 0 }; } -function getDungeons(data) { +export function getDungeons(data: Record): Dungeons { return { - experience: getLevelByXp(data?.dungeons?.dungeon_types?.catacombs?.experience ?? 0, 'dungeons'), - secrets: data?.dungeons?.secrets ?? 0, + experience: getLevelByXp(data?.dungeons?.dungeon_types?.catacombs?.experience || 0, 'dungeons'), + secrets: data?.dungeons?.secrets || 0, completions: { catacombs: getCompletions(data?.dungeons?.dungeon_types?.catacombs?.tier_completions), - masterCatacombs: getCompletions(data?.dungeons?.dungeon_types?.master_catacombs?.tier_completions) + masterMode: getCompletions(data?.dungeons?.dungeon_types?.master_catacombs?.tier_completions) }, floors: { entrance: getDungeonsFloor(data, 'catacombs', '0'), @@ -415,21 +279,21 @@ function getDungeons(data) { floor5: getDungeonsFloor(data, 'catacombs', '5'), floor6: getDungeonsFloor(data, 'catacombs', '6'), floor7: getDungeonsFloor(data, 'catacombs', '7'), - masterCatacombs1: getDungeonsFloor(data, 'master_catacombs', '1'), - masterCatacombs2: getDungeonsFloor(data, 'master_catacombs', '2'), - masterCatacombs3: getDungeonsFloor(data, 'master_catacombs', '3'), - masterCatacombs4: getDungeonsFloor(data, 'master_catacombs', '4'), - masterCatacombs5: getDungeonsFloor(data, 'master_catacombs', '5'), - masterCatacombs6: getDungeonsFloor(data, 'master_catacombs', '6'), - masterCatacombs7: getDungeonsFloor(data, 'master_catacombs', '7') + masterMode1: getDungeonsFloor(data, 'master_catacombs', '1'), + masterMode2: getDungeonsFloor(data, 'master_catacombs', '2'), + masterMode3: getDungeonsFloor(data, 'master_catacombs', '3'), + masterMode4: getDungeonsFloor(data, 'master_catacombs', '4'), + masterMode5: getDungeonsFloor(data, 'master_catacombs', '5'), + masterMode6: getDungeonsFloor(data, 'master_catacombs', '6'), + masterMode7: getDungeonsFloor(data, 'master_catacombs', '7') }, classes: { - healer: getLevelByXp(data?.dungeons?.player_classes?.healer?.experience ?? 0, 'dungeons'), - mage: getLevelByXp(data?.dungeons?.player_classes?.mage?.experience ?? 0, 'dungeons'), - berserk: getLevelByXp(data?.dungeons?.player_classes?.berserk?.experience ?? 0, 'dungeons'), - archer: getLevelByXp(data?.dungeons?.player_classes?.archer?.experience ?? 0, 'dungeons'), - tank: getLevelByXp(data?.dungeons?.player_classes?.tank?.experience ?? 0, 'dungeons'), - selected: data?.dungeons?.selected_dungeon_class ?? 'mage' + healer: getLevelByXp(data?.dungeons?.player_classes?.healer?.experience || 0, 'dungeons'), + mage: getLevelByXp(data?.dungeons?.player_classes?.mage?.experience || 0, 'dungeons'), + berserk: getLevelByXp(data?.dungeons?.player_classes?.berserk?.experience || 0, 'dungeons'), + archer: getLevelByXp(data?.dungeons?.player_classes?.archer?.experience || 0, 'dungeons'), + tank: getLevelByXp(data?.dungeons?.player_classes?.tank?.experience || 0, 'dungeons'), + selected: data?.dungeons?.selected_dungeon_class || 'mage' }, essence: { diamond: data?.currencies?.essence?.DIAMOND?.current || 0, @@ -444,71 +308,30 @@ function getDungeons(data) { }; } -function getJacobData(data) { - if (!data.jacobs_contest) { - return { - medals: { - bronze: 0, - silver: 0, - gold: 0 - }, - perks: { - doubleDrops: 0, - farmingLevelCap: 0, - personalBests: false - }, - contests: {} - }; - } +export function getJacobData(data: Record): JacobData { return { - medals: data.jacobs_contest.medals_inv - ? { - bronze: data.jacobs_contest.medals_inv.bronze || 0, - silver: data.jacobs_contest.medals_inv.silver || 0, - gold: data.jacobs_contest.medals_inv.gold || 0 - } - : { bronze: 0, silver: 0, gold: 0 }, - perks: data.jacobs_contest.perks - ? { - doubleDrops: data.jacobs_contest.perks.double_drops || 0, - farmingLevelCap: data.jacobs_contest.perks.farming_level_cap || 0, - personalBests: data.jacobs_contest.perks.personal_bests || false - } - : { doubleDrops: 0, farmingLevelCap: 0, personalBests: false }, - contests: data.jacobs_contest.contests || {} + medals: { + bronze: data?.jacobs_contest?.medals_inv?.bronze || 0, + silver: data?.jacobs_contest?.medals_inv?.silver || 0, + gold: data?.jacobs_contest?.medals_inv?.gold || 0 + }, + perks: { + doubleDrops: data?.jacobs_contest?.perks?.double_drops || 0, + farmingLevelCap: data?.jacobs_contest?.perks?.farming_level_cap || 0, + personalBests: data?.jacobs_contest?.perks?.personal_bests || false + }, + contests: data?.jacobs_contestcontests || {} }; } -function getChocolateFactory(data) { +export function getChocolateFactory(data: Record): ChocolateFactoryData { if (!data?.events?.easter) { return { - employees: { - bro: 0, - cousin: 0, - sis: 0, - father: 0, - grandma: 0, - dog: 0, - uncle: 0 - }, - chocolate: { - current: 0, - total: 0, - sincePrestige: 0 - }, - timeTower: { - charges: 0, - level: 0 - }, - upgrades: { - click: 0, - multiplier: 0, - rabbitRarity: 0 - }, - goldenClick: { - amount: 0, - year: 0 - }, + employees: { bro: 0, cousin: 0, sis: 0, father: 0, grandma: 0, dog: 0, uncle: 0 }, + chocolate: { current: 0, total: 0, sincePrestige: 0 }, + timeTower: { charges: 0, level: 0 }, + upgrades: { click: 0, multiplier: 0, rabbitRarity: 0 }, + goldenClick: { amount: 0, year: 0 }, barnCapacity: 0, prestige: 0 }; @@ -546,50 +369,37 @@ function getChocolateFactory(data) { }; } -function getPetLevel(petExp, offsetRarity, maxLevel) { - const rarityOffset = constants.petRarityOffset[offsetRarity]; - const levels = constants.petLevels.slice(rarityOffset, rarityOffset + maxLevel - 1); - +export function getPetLevel(petExp: number, offsetRarity: keyof typeof petRarityOffset, maxLevel: number) { + const rarityOffset = petRarityOffset[offsetRarity] || 0; + const levels = petLevels.slice(rarityOffset, rarityOffset + maxLevel - 1) as number[]; const xpMaxLevel = levels.reduce((a, b) => a + b, 0); let xpTotal = 0; let level = 1; - let xpForNext; - for (let i = 0; i < maxLevel; i++) { - xpTotal += levels[i]; - + xpTotal += levels?.[i] || 0; if (xpTotal > petExp) { - xpTotal -= levels[i]; + xpTotal -= levels?.[i] || 0; break; } else { level++; } } - let xpCurrent = Math.floor(petExp - xpTotal); let progress; - if (level < maxLevel) { - xpForNext = Math.ceil(levels[level - 1]); + xpForNext = Math.ceil(levels?.[level - 1] || 0); progress = Math.max(0, Math.min(xpCurrent / xpForNext, 1)); } else { level = maxLevel; - xpCurrent = petExp - levels[maxLevel - 1]; + xpCurrent = petExp - (levels?.[maxLevel - 1] || 0); xpForNext = 0; progress = 1; } - - return { - level, - xpCurrent, - xpForNext, - progress, - xpMaxLevel - }; + return { level, xpCurrent, xpForNext, progress, xpMaxLevel }; } -function parseRarity(stringContainingRarity) { +export function parseRarity(str: string): Rarity { const rarityArray = [ 'COMMON', 'UNCOMMON', @@ -602,31 +412,126 @@ function parseRarity(stringContainingRarity) { 'VERY SPECIAL' ]; for (const rarity of rarityArray) { - if (stringContainingRarity.includes(rarity)) return rarity; + if (str.includes(rarity)) return rarity as Rarity; } + return 'COMMON'; } -function parseGearScore(lore) { +export function parseGearScore(lore: any): number { for (const line of lore) { if (line.match(/Gear Score: §[0-9a-f](\d+)/)) return Number(line.match(/Gear Score: §d(\d+)/)[1]); } + return 0; } -function populateGoals(achieved, all) { - const populatedAchieved = []; - const unachieved = []; - for (const goal of all) { - if (achieved.find((str) => str === goal.name)) populatedAchieved.push(goal); - else unachieved.push(goal); +function getScore(points: number): CrimsonIsleDojoRank { + if (1000 <= points) { + return 'S'; + } else if (800 <= points) { + return 'A'; + } else if (600 <= points) { + return 'B'; + } else if (400 <= points) { + return 'C'; + } else if (200 <= points) { + return 'D'; + } + return 'F'; +} + +function getBelt(points: number): CrimsonIsleBelt { + if (7000 <= points) { + return 'Black'; + } else if (6000 <= points) { + return 'Brown'; + } else if (4000 <= points) { + return 'Blue'; + } else if (2000 <= points) { + return 'Green'; + } else if (1000 <= points) { + return 'Yellow'; } - populatedAchieved.unachievedGoals = unachieved; - return populatedAchieved; + return 'White'; } -function getHOTM(data) { +export function getCrimsonIsle(data: Record): CrimsonIsle { return { - experience: getLevelByXp(data.mining_core?.experience, 'hotm'), - ability: data.mining_core?.selected_pickaxe_ability || 'none', + faction: data?.nether_island_player_data?.selected_faction || null, + reputation: { + barbarians: data?.nether_island_player_data?.barbarians_reputation ?? 0, + mages: data?.nether_island_player_data?.mages_reputation ?? 0 + }, + trophyFish: { + rank: getTrophyFishRank((data?.nether_island_player_data?.trophy_fish?.rewards ?? [])?.length), + caught: { + total: data?.nether_island_player_data?.trophy_fish?.total_caught || 0, + bronze: + Object.keys(data?.nether_island_player_data?.trophy_fish || {}).filter((key) => key.endsWith('_bronze')) + .length || 0, + silver: + Object.keys(data?.nether_island_player_data?.trophy_fish || {}).filter((key) => key.endsWith('_silver')) + .length || 0, + gold: + Object.keys(data?.nether_island_player_data?.trophy_fish || {}).filter((key) => key.endsWith('_gold')) + .length || 0, + diamond: + Object.keys(data?.nether_island_player_data?.trophy_fish || {}).filter((key) => key.endsWith('_diamond')) + .length || 0 + } + }, + dojo: { + belt: getBelt( + Object.keys(data?.nether_island_player_data?.dojo ?? {}) + .filter((key) => key.startsWith('dojo_points')) + .reduce((acc, key) => acc + (data?.nether_island_player_data?.dojo[key] || 0), 0) + ), + force: { + points: data?.nether_island_player_data?.dojo?.dojo_points_mob_kb || 0, + rank: getScore(data?.nether_island_player_data?.dojo?.dojo_points_mob_kb || 0) + }, + stamina: { + points: data?.nether_island_player_data?.dojo?.dojo_points_wall_jump || 0, + rank: getScore(data?.nether_island_player_data?.dojo?.dojo_points_wall_jump || 0) + }, + mastery: { + points: data?.nether_island_player_data?.dojo?.dojo_points_archer || 0, + rank: getScore(data?.nether_island_player_data?.dojo?.dojo_points_archer || 0) + }, + discipline: { + points: data?.nether_island_player_data?.dojo?.dojo_points_sword_swap || 0, + rank: getScore(data?.nether_island_player_data?.dojo?.dojo_points_sword_swap || 0) + }, + swiftness: { + points: data?.nether_island_player_data?.dojo?.dojo_points_snake || 0, + rank: getScore(data?.nether_island_player_data?.dojo?.dojo_points_snake || 0) + }, + control: { + points: data?.nether_island_player_data?.dojo?.dojo_points_lock_head || 0, + rank: getScore(data?.nether_island_player_data?.dojo?.dojo_points_lock_head || 0) + }, + tenacity: { + points: data?.nether_island_player_data?.dojo?.dojo_points_fireball || 0, + rank: getScore(data?.nether_island_player_data?.dojo?.dojo_points_fireball || 0) + } + }, + kuudra: { + none: data?.nether_island_player_data?.kuudra_completed_tiers?.none || 0, + hot: data?.nether_island_player_data?.kuudra_completed_tiers?.hot || 0, + burning: data?.nether_island_player_data?.kuudra_completed_tiers?.burning || 0, + fiery: data?.nether_island_player_data?.kuudra_completed_tiers?.fiery || 0, + highestWaveHot: data?.nether_island_player_data?.kuudra_completed_tiers?.highest_wave_hot || 0, + highestWaveFiery: data?.nether_island_player_data?.kuudra_completed_tiers?.highest_wave_fiery || 0, + infernal: data?.nether_island_player_data?.kuudra_completed_tiers?.infernal || 0, + highestWaveInfernal: data?.nether_island_player_data?.kuudra_completed_tiers?.highest_wave_infernal || 0, + highestWaveBurning: data?.nether_island_player_data?.kuudra_completed_tiers?.highest_wave_burning || 0 + } + }; +} + +export function getHOTM(data: Record): HOTM { + return { + experience: getLevelByXp(data?.mining_core?.experience || 0, 'hotm'), + ability: data?.mining_core?.selected_pickaxe_ability || 'none', powder: { mithril: { spent: data?.mining_core?.powder_spent_mithril || 0, @@ -646,22 +551,3 @@ function getHOTM(data) { } }; } - -module.exports = { - decode, - getLevelByXp, - getMemberStats, - getTrophyFishRank, - getSkills, - getBestiaryLevel, - getSlayer, - getCrimson, - getDungeons, - getJacobData, - getChocolateFactory, - getPetLevel, - parseRarity, - parseGearScore, - populateGoals, - getHOTM -}; diff --git a/src/index.js b/src/index.js deleted file mode 100644 index f32ed6229..000000000 --- a/src/index.js +++ /dev/null @@ -1,96 +0,0 @@ -module.exports = { - Client: require('./Client.js'), - version: require('../package.json').version, - - /* API Status */ - APIStatus: require('./structures/APIStatus.js'), - APIIncident: require('./structures/APIIncident.js'), - - Player: require('./structures/Player.js'), - Game: require('./structures/Game.js'), - Status: require('./structures/Status.js'), - Color: require('./structures/Color.js'), - Pet: require('./structures/Pet'), - Pets: require('./structures/Pets'), - PlayerCosmetics: require('./structures/PlayerCosmetics'), - - /* Challenges */ - Challenges: require('./structures/Static/Challenges.js'), - GameChallenges: require('./structures/Static/GameChallenges.js'), - - /* Watchdog */ - WatchdogStats: require('./structures/Watchdog/Stats.js'), - - /* Guild */ - Guild: require('./structures/Guild/Guild.js'), - GuildMember: require('./structures/Guild/GuildMember.js'), - GuildRank: require('./structures/Guild/GuildRank.js'), - - /* SkyBlock */ - SkyblockProfile: require('./structures/SkyBlock/SkyblockProfile.js'), - SkyblockMember: require('./structures/SkyBlock/SkyblockMember.js'), - SkyblockGarden: require('./structures/SkyBlock/SkyblockGarden.js'), - SkyblockInventoryItem: require('./structures/SkyBlock/SkyblockInventoryItem.js'), - SkyblockPet: require('./structures/SkyBlock/SkyblockPet'), - GovernmentData: require('./structures/SkyBlock/Static/Government.js'), - Candidate: require('./structures/SkyBlock/Static/Candidate.js'), - BingoData: require('./structures/SkyBlock/Static/BingoData.js'), - Bingo: require('./structures/SkyBlock/Static/Bingo.js'), - - /* Skyblock Auctions */ - BaseAuction: require('./structures/SkyBlock/Auctions/BaseAuction.js'), - PartialAuction: require('./structures/SkyBlock/Auctions/PartialAuction.js'), - Auction: require('./structures/SkyBlock/Auctions/Auction.js'), - AuctionInfo: require('./structures/SkyBlock/Auctions/AuctionInfo.js'), - Bid: require('./structures/SkyBlock/Auctions/Bid.js'), - FireSale: require('./structures/SkyBlock/Static/FireSale.js'), - - /* Skyblock Bazaar */ - Product: require('./structures/SkyBlock/Bazzar/Product.js'), - Order: require('./structures/SkyBlock/Bazzar/Order.js'), - - /* Skyblock News */ - SkyblockNews: require('./structures/SkyBlock/News/SkyblockNews'), - - /* Booster */ - Booster: require('./structures/Boosters/Booster.js'), - - /* House */ - House: require('./structures/House.js'), - - /* MiniGames */ - Arcade: require('./structures/MiniGames/Arcade.js'), - ArenaBrawl: require('./structures/MiniGames/ArenaBrawl.js'), - BedWars: require('./structures/MiniGames/BedWars.js'), - BlitzSurvivalGames: require('./structures/MiniGames/BlitzSurvivalGames.js'), - BuildBattle: require('./structures/MiniGames/BuildBattle.js'), - CopsAndCrims: require('./structures/MiniGames/CopsAndCrims.js'), - Duels: require('./structures/MiniGames/Duels.js'), - MegaWalls: require('./structures/MiniGames/MegaWalls.js'), - MurderMystery: require('./structures/MiniGames/MurderMystery.js'), - Paintball: require('./structures/MiniGames/Paintball.js'), - Pit: require('./structures/MiniGames/Pit.js'), - Quakecraft: require('./structures/MiniGames/Quakecraft.js'), - SkyWars: require('./structures/MiniGames/SkyWars.js'), - SmashHeroes: require('./structures/MiniGames/SmashHeroes.js'), - SpeedUHC: require('./structures/MiniGames/SpeedUHC.js'), - TNTGames: require('./structures/MiniGames/TNTGames.js'), - TurboKartRacers: require('./structures/MiniGames/TurboKartRacers.js'), - UHC: require('./structures/MiniGames/UHC.js'), - VampireZ: require('./structures/MiniGames/VampireZ.js'), - Walls: require('./structures/MiniGames/Walls.js'), - Warlords: require('./structures/MiniGames/Warlords.js'), - WoolGames: require('./structures/MiniGames/WoolGames.js'), - - /* Leaderboards */ - Leaderboard: require('./structures/Leaderboard.js'), - - /* Server Info */ - ServerInfo: require('./structures/ServerInfo.js'), - - /* Errors */ - Errors: require('./Errors.js'), - - /* Utils */ - Utils: require('./utils') -}; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 000000000..955b8627c --- /dev/null +++ b/src/index.ts @@ -0,0 +1,355 @@ +/* v8 ignore next 400 */ +/* eslint-disable max-len */ + +import Client from './Client.js'; +import Errors from './Errors.js'; + +export * from './Types/API.d.js'; +export * from './Types/Booster.d.js'; +export * from './Types/Client.d.js'; +export * from './Types/Color.d.js'; +export * from './Types/Game.d.js'; +export * from './Types/Guild.d.js'; +export * from './Types/Player.d.js'; +export * from './Types/Requests.d.js'; +export * from './Types/Skyblock.d.js'; +export * from './Types/Static.d.js'; + +import Achievements from './Structures/Static/Achievements/Achievements.js'; +import Arcade from './Structures/MiniGames/Arcade/Arcade.js'; +import ArenaBrawl from './Structures/MiniGames/ArenaBrawl/ArenaBrawl.js'; +import ArenaBrawlMode from './Structures/MiniGames/ArenaBrawl/ArenaBrawlMode.js'; +import Auction from './Structures/SkyBlock/Auctions/Auction.js'; +import AuctionInfo from './Structures/SkyBlock/Auctions/AuctionInfo.js'; +import BaseAchievement from './Structures/Static/Achievements/BaseAchievement.js'; +import BaseAuction from './Structures/SkyBlock/Auctions/BaseAuction.js'; +import BedWars from './Structures/MiniGames/BedWars/BedWars.js'; +import BedWarsBeds from './Structures/MiniGames/BedWars/BedWarsBeds.js'; +import BedWarsCollectedItems from './Structures/MiniGames/BedWars/BedWarsCollectedItems.js'; +import BedWarsDreamMode from './Structures/MiniGames/BedWars/BedWarsDreamMode.js'; +import BedWarsDreamStats from './Structures/MiniGames/BedWars/BedWarsDreamStats.js'; +import BedWarsMode from './Structures/MiniGames/BedWars/BedWarsMode.js'; +import BedWarsPracticeBase from './Structures/MiniGames/BedWars/Practice/BedWarsPracticeBase.js'; +import BedWarsPracticeBaseBlocksPlaced from './Structures/MiniGames/BedWars/Practice/BedWarsPracticeBaseBlocksPlaced.js'; +import BedWarsPracticeBridging from './Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridging.js'; +import BedWarsPracticeBridgingRecords from './Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridgingRecords.js'; +import BedWarsPracticeModeAttempts from './Structures/MiniGames/BedWars/Practice/BedWarsPracticeModeAttempts.js'; +import BedWarsPracticeRecord from './Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecord.js'; +import BedWarsPracticeRecordElevation from './Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecordElevation.js'; +import BedWarsPracticeStats from './Structures/MiniGames/BedWars/Practice/BedWarsPracticeStats.js'; +import Bid from './Structures/SkyBlock/Auctions/Bid.js'; +import Bingo from './Structures/SkyBlock/Static/Bingo.js'; +import BingoData from './Structures/SkyBlock/Static/BingoData.js'; +import BlitzSurvivalGames from './Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.js'; +import BlitzSurvivalGamesKit from './Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesKit.js'; +import BlockingDead from './Structures/MiniGames/Arcade/BlockingDead.js'; +import Booster from './Structures/Boosters/Booster.js'; +import BountyHunters from './Structures/MiniGames/Arcade/BountyHunters.js'; +import BowSpleef from './Structures/MiniGames/TNTGames/BowSpleef.js'; +import BuildBattle from './Structures/MiniGames/BuildBattle.js'; +import Candidate from './Structures/SkyBlock/Static/Candidate.js'; +import CaptureTheWool from './Structures/MiniGames/WoolGames/CaptureTheWool.js'; +import Challenge from './Structures/Static/Challenge.js'; +import Challenges from './Structures/Static/Challenges.js'; +import Color from './Structures/Color.js'; +import CopsAndCrims from './Structures/MiniGames/CopsAndCrims/CopsAndCrims.js'; +import CopsAndCrimsGamemode from './Structures/MiniGames/CopsAndCrims/CopsAndCrimsGamemode.js'; +import CopsAndCrimsGun from './Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.js'; +import Cosmetics from './Structures/Player/Cosmetics.js'; +import DragonWars from './Structures/MiniGames/Arcade/DragonWars.js'; +import Dropper from './Structures/MiniGames/Arcade/Dropper.js'; +import DropperMap from './Structures/MiniGames/Arcade/DropperMap.js'; +import Duels from './Structures/MiniGames/Duels/Duels.js'; +import DuelsBridge from './Structures/MiniGames/Duels/DuelsBridge.js'; +import DuelsGamemode from './Structures/MiniGames/Duels/DuelsGamemode.js'; +import DuelsMegaWalls from './Structures/MiniGames/Duels/DuelsMegaWalls.js'; +import DuelsOP from './Structures/MiniGames/Duels/DuelsOP.js'; +import DuelsSkyWars from './Structures/MiniGames/Duels/DuelsSkyWars.js'; +import DuelsUHC from './Structures/MiniGames/Duels/DuelsUHC.js'; +import EnderSpleef from './Structures/MiniGames/Arcade/EnderSpleef.js'; +import FarmHunt from './Structures/MiniGames/Arcade/FarmHunt.js'; +import FireSale from './Structures/SkyBlock/Static/FireSale.js'; +import Football from './Structures/MiniGames/Arcade/Football.js'; +import GalaxyWars from './Structures/MiniGames/Arcade/GalaxyWars.js'; +import Game from './Structures/Game.js'; +import GameAchievements from './Structures/Static/Achievements/GameAchievements.js'; +import GameChallenges from './Structures/Static/GameChallenges.js'; +import GameCounts from './Structures/GameCounts.js'; +import GameQuests from './Structures/Static/GameQuests.js'; +import Gifting from './Structures/Player/Gifting.js'; +import Government from './Structures/SkyBlock/Static/Government.js'; +import Guild from './Structures/Guild/Guild.js'; +import GuildAchievements from './Structures/Static/Achievements/GuildAchievements.js'; +import GuildMember from './Structures/Guild/GuildMember.js'; +import GuildRank from './Structures/Guild/GuildRank.js'; +import HideAndSeek from './Structures/MiniGames/Arcade/HideAndSeek.js'; +import HoleInTheWall from './Structures/MiniGames/Arcade/HoleInTheWall.js'; +import House from './Structures/House.js'; +import Housing from './Structures/Housing.js'; +import HypixelSays from './Structures/MiniGames/Arcade/HypixelSays.js'; +import ItemBytes from './Structures/ItemBytes.js'; +import Leaderboard from './Structures/Leaderboard.js'; +import MegaWalls from './Structures/MiniGames/MegaWalls/MegaWalls.js'; +import MegaWallsKitStats from './Structures/MiniGames/MegaWalls/MegaWallsKitStats.js'; +import MegaWallsModeStats from './Structures/MiniGames/MegaWalls/MegaWallsModeStats.js'; +import MiniWalls from './Structures/MiniGames/Arcade/MiniWalls.js'; +import MonthlyCrate from './Structures/Player/MonthlyCrate.js'; +import MurderMystery from './Structures/MiniGames/MurderMystery/MurderMystery.js'; +import MurderMysteryModeStats from './Structures/MiniGames/MurderMystery/MurderMysteryModeStats.js'; +import OneTimeAchivement from './Structures/Static/Achievements/OneTimeAchivement.js'; +import Order from './Structures/SkyBlock/Bazaar/Order.js'; +import PVPRun from './Structures/MiniGames/TNTGames/PVPRun.js'; +import Paintball from './Structures/MiniGames/Paintball.js'; +import Parkour from './Structures/Player/Parkour.js'; +import PartyGames from './Structures/MiniGames/Arcade/PartyGames.js'; +import PartyPooper from './Structures/MiniGames/Arcade/PartyPooper.js'; +import Perk from './Structures/SkyBlock/Static/Perk.js'; +import Pet from './Structures/Player/Pet.js'; +import PetConsumables from './Structures/Player/PetConsumables.js'; +import Pets from './Structures/Player/Pets.js'; +import Pit from './Structures/MiniGames/Pit/Pit.js'; +import PitInventoryItem from './Structures/MiniGames/Pit/PitInventoryItem.js'; +import PixelParty from './Structures/MiniGames/Arcade/PixelParty.js'; +import PixelPartyGameMode from './Structures/MiniGames/Arcade/PixelPartyGameMode.js'; +import Player from './Structures/Player/Player.js'; +import PlayerAchievements from './Structures/Player/PlayerAchievements.js'; +import PlayerAchievementsRewards from './Structures/Player/PlayerAchievementsRewards.js'; +import PlayerQuest from './Structures/Player/Quests/PlayerQuest.js'; +import PlayerQuestCompletion from './Structures/Player/Quests/PlayerQuestCompletion.js'; +import PlayerQuestCompletions from './Structures/Player/Quests/PlayerQuestCompletions.js'; +import PlayerQuests from './Structures/Player/Quests/PlayerQuests.js'; +import Product from './Structures/SkyBlock/Bazaar/Product.js'; +import PropHunt from './Structures/MiniGames/Arcade/PropHunt.js'; +import Quakecraft from './Structures/MiniGames/Quakecraft/Quakecraft.js'; +import QuakecraftMode from './Structures/MiniGames/Quakecraft/QuakecraftMode.js'; +import Quest from './Structures/Static/Quest.js'; +import QuestObjective from './Structures/Static/QuestObjective.js'; +import Quests from './Structures/Static/Quests.js'; +import RecentGame from './Structures/RecentGame.js'; +import Rewards from './Structures/Player/Rewards.js'; +import Season from './Structures/Player/Seasonal/Season.js'; +import SeasonBingo from './Structures/Player/Seasonal/SeasonBingo.js'; +import SeasonBingoTier from './Structures/Player/Seasonal/SeasonBingoTier.js'; +import SeasonYear from './Structures/Player/Seasonal/SeasonYear.js'; +import Seasonal from './Structures/Player/Seasonal/Seasonal.js'; +import SheepWars from './Structures/MiniGames/WoolGames/SheepWars.js'; +import SkyWars from './Structures/MiniGames/SkyWars/SkyWars.js'; +import SkyWarsKit from './Structures/MiniGames/SkyWars/SkyWarsKit.js'; +import SkyWarsKits from './Structures/MiniGames/SkyWars/SkyWarsKits.js'; +import SkyWarsMode from './Structures/MiniGames/SkyWars/SkyWarsMode.js'; +import SkyWarsModeStats from './Structures/MiniGames/SkyWars/SkyWarsModeStats.js'; +import SkyWarsPackages from './Structures/MiniGames/SkyWars/SkyWarsPackages.js'; +import SkyblockGarden from './Structures/SkyBlock/SkyblockGarden.js'; +import SkyblockGemstone from './Structures/SkyBlock/SkyblockGemstone.js'; +import SkyblockInventoryItem from './Structures/SkyBlock/SkyblockInventoryItem.js'; +import SkyblockMember from './Structures/SkyBlock/SkyblockMember.js'; +import SkyblockMemberMinion from './Structures/SkyBlock/SkyblockMemberMinion.js'; +import SkyblockMemberMinions from './Structures/SkyBlock/SkyblockMemberMinions.js'; +import SkyblockMemberStats from './Structures/SkyBlock/SkyblockMemberStats.js'; +import SkyblockMuseum from './Structures/SkyBlock/SkyblockMuseum.js'; +import SkyblockMuseumItem from './Structures/SkyBlock/SkyblockMuseumItem.js'; +import SkyblockNews from './Structures/SkyBlock/News/SkyblockNews.js'; +import SkyblockPet from './Structures/SkyBlock/SkyblockPet.js'; +import SkyblockProfile from './Structures/SkyBlock/SkyblockProfile.js'; +import SmashHeoresHero from './Structures/MiniGames/SmashHeroes/SmashHeoresHero.js'; +import SmashHeroes from './Structures/MiniGames/SmashHeroes/SmashHeroes.js'; +import SmashHeroesMode from './Structures/MiniGames/SmashHeroes/SmashHeroesMode.js'; +import SocialMedia from './Structures/Player/SocialMedia.js'; +import SpeedUHC from './Structures/MiniGames/SpeedUHC/SpeedUHC.js'; +import SpeedUHCMode from './Structures/MiniGames/SpeedUHC/SpeedUHCMode.js'; +import Status from './Structures/Status.js'; +import TNTGames from './Structures/MiniGames/TNTGames/TNTGames.js'; +import TNTRun from './Structures/MiniGames/TNTGames/TNTRun.js'; +import TNTTag from './Structures/MiniGames/TNTGames/TNTTag.js'; +import TNTWizards from './Structures/MiniGames/TNTGames/TNTWizards.js'; +import ThrowOut from './Structures/MiniGames/Arcade/ThrowOut.js'; +import TieredAchivement from './Structures/Static/Achievements/TieredAchivement.js'; +import Tourney from './Structures/Player/Tourney/Tourney.js'; +import TourneyData from './Structures/Player/Tourney/TourneyData.js'; +import TurboKartRacers from './Structures/MiniGames/TurboKartRacers/TurboKartRacers.js'; +import TurboKartRacersMap from './Structures/MiniGames/TurboKartRacers/TurboKartRacersMap.js'; +import UHC from './Structures/MiniGames/UHC/UHC.js'; +import UHCGamemode from './Structures/MiniGames/UHC/UHCGamemode.js'; +import VampireZ from './Structures/MiniGames/VampireZ/VampireZ.js'; +import VampireZRole from './Structures/MiniGames/VampireZ/VampireZRole.js'; +import Walls from './Structures/MiniGames/Walls.js'; +import Warlords from './Structures/MiniGames/Warlords/Warlords.js'; +import WarlordsClass from './Structures/MiniGames/Warlords/WarlordsClass.js'; +import WatchdogStats from './Structures/WatchdogStats.js'; +import WoolGames from './Structures/MiniGames/WoolGames/WoolGames.js'; +import WoolWars from './Structures/MiniGames/WoolGames/WoolWars.js'; +import WoolWarsClass from './Structures/MiniGames/WoolGames/WoolWarsClass.js'; +import Zombies from './Structures/MiniGames/Arcade/Zombies.js'; +import ZombiesStats from './Structures/MiniGames/Arcade/ZombiesStats.js'; + +export default { + Client, + Errors, + + Booster, + Color, + Game, + GameCounts, + Guild, + GuildMember, + GuildRank, + House, + Housing, + ItemBytes, + Leaderboard, + Arcade, + BlockingDead, + BountyHunters, + DragonWars, + Dropper, + DropperMap, + EnderSpleef, + FarmHunt, + Football, + GalaxyWars, + HideAndSeek, + HoleInTheWall, + HypixelSays, + MiniWalls, + PartyGames, + PartyPooper, + PixelParty, + PixelPartyGameMode, + PropHunt, + ThrowOut, + Zombies, + ZombiesStats, + ArenaBrawl, + ArenaBrawlMode, + BedWars, + BedWarsBeds, + BedWarsCollectedItems, + BedWarsDreamMode, + BedWarsDreamStats, + BedWarsMode, + BedWarsPracticeBase, + BedWarsPracticeBaseBlocksPlaced, + BedWarsPracticeBridging, + BedWarsPracticeBridgingRecords, + BedWarsPracticeModeAttempts, + BedWarsPracticeRecord, + BedWarsPracticeRecordElevation, + BedWarsPracticeStats, + BlitzSurvivalGames, + BlitzSurvivalGamesKit, + BuildBattle, + CopsAndCrims, + CopsAndCrimsGamemode, + CopsAndCrimsGun, + Duels, + DuelsBridge, + DuelsGamemode, + DuelsMegaWalls, + DuelsOP, + DuelsSkyWars, + DuelsUHC, + MegaWalls, + MegaWallsKitStats, + MegaWallsModeStats, + MurderMystery, + MurderMysteryModeStats, + Paintball, + Pit, + PitInventoryItem, + Quakecraft, + QuakecraftMode, + SkyWars, + SkyWarsKit, + SkyWarsKits, + SkyWarsMode, + SkyWarsModeStats, + SkyWarsPackages, + SmashHeoresHero, + SmashHeroes, + SmashHeroesMode, + SpeedUHC, + SpeedUHCMode, + BowSpleef, + PVPRun, + TNTGames, + TNTRun, + TNTTag, + TNTWizards, + TurboKartRacers, + TurboKartRacersMap, + UHC, + UHCGamemode, + VampireZ, + VampireZRole, + Walls, + Warlords, + WarlordsClass, + CaptureTheWool, + SheepWars, + WoolGames, + WoolWars, + WoolWarsClass, + Cosmetics, + Gifting, + MonthlyCrate, + Parkour, + Pet, + PetConsumables, + Pets, + Player, + PlayerAchievements, + PlayerAchievementsRewards, + PlayerQuest, + PlayerQuestCompletion, + PlayerQuestCompletions, + PlayerQuests, + Rewards, + Season, + SeasonBingo, + SeasonBingoTier, + SeasonYear, + Seasonal, + SocialMedia, + Tourney, + TourneyData, + RecentGame, + Auction, + AuctionInfo, + BaseAuction, + Bid, + Order, + Product, + SkyblockNews, + SkyblockGarden, + SkyblockGemstone, + SkyblockInventoryItem, + SkyblockMember, + SkyblockMemberMinion, + SkyblockMemberMinions, + SkyblockMemberStats, + SkyblockMuseum, + SkyblockMuseumItem, + SkyblockPet, + SkyblockProfile, + Bingo, + BingoData, + Candidate, + FireSale, + Government, + Perk, + Achievements, + BaseAchievement, + GameAchievements, + GuildAchievements, + OneTimeAchivement, + TieredAchivement, + Challenge, + Challenges, + GameChallenges, + GameQuests, + Quest, + QuestObjective, + Quests, + Status, + WatchdogStats +}; diff --git a/src/structures/APIIncident.js b/src/structures/APIIncident.js deleted file mode 100644 index 8da44522c..000000000 --- a/src/structures/APIIncident.js +++ /dev/null @@ -1,71 +0,0 @@ -const regex = /https:\/\/status.hypixel.net\/incidents\/([a-z0-9]+)/; -/** - * API incident class - */ -class APIIncident { - /** - * @param {object} data API incident data - */ - constructor(data) { - /** - * Link to incident - * @type {string|null} - */ - this.link = data.link || null; - /** - * Timestamp when investigation was started as Date object - * @type {object|null} - */ - this.start = data.pubDate ? new Date(data.pubDate) : null; - /** - * Formatted timestamp when investigation was started - * @type {string|null} - */ - this.startFormatted = data.pubDate || null; - /** - * Timestamp when investigation was started as Date - * @type {Date|null} - */ - this.startTimestamp = new Date(data.pubDate).getTime() || null; - /** - * Incident author - * @type {string|null} - */ - this.author = data.creator || null; - /** - * Content as HTML - * @type {string|null} - */ - this.HTMLContent = data.content || null; - /** - * Content snippet - * @type {string|null} - */ - this.snippet = data.contentSnippet || null; - /** - * GUID - * @type {string|null} - */ - this.guid = data.guid ? regex.exec(data.guid)[1] : null; - /** - * Incident categories - * @type {string[]} - */ - this.categories = data.categories || []; - /** - * Whether the incident is resolved/completed or not - * @author linearaccelerator - * @type {boolean} - */ - this.isResolved = this.HTMLContent.includes('Resolved -') || this.HTMLContent.includes('Completed -'); - } - /** - * HTML Content - * @return {string} - */ - toString() { - return this.HTMLContent; - } -} - -module.exports = APIIncident; diff --git a/src/structures/APIStatus.js b/src/structures/APIStatus.js deleted file mode 100644 index 8b95df58a..000000000 --- a/src/structures/APIStatus.js +++ /dev/null @@ -1,46 +0,0 @@ -const APIIncident = require('./APIIncident'); -/** - * API status class - */ -class APIStatus { - /** - * @param {object} data API status data - */ - constructor(data) { - /** - * Source url - * @type {string|null} - */ - this.sourceUrl = data.feedUrl || null; - /** - * Title - * @type {string|null} - */ - this.title = data.title || null; - /** - * Description - * @type {string|null} - */ - this.description = data.description || null; - /** - * API incident - * @type {APIIncident[]} - */ - this.incidents = data.items.map((x) => new APIIncident(x)); - /** - * All incidents that aren't completed/resolved - * @author linearaccelerator - * @type {APIIncident[]} - */ - this.currentIncidents = this.incidents.filter((i) => !i.isResolved); - } - /** - * Status Title - * @return {string} - */ - toString() { - return this.title; - } -} - -module.exports = APIStatus; diff --git a/src/structures/Boosters/Booster.js b/src/structures/Boosters/Booster.js deleted file mode 100644 index b43b1cece..000000000 --- a/src/structures/Boosters/Booster.js +++ /dev/null @@ -1,84 +0,0 @@ -const Game = require('../Game'); - -// eslint-disable-next-line jsdoc/require-jsdoc -function parseType(data) { - if (true === data.stacked) return 'STACKED'; - if (!data.stacked) return 'QUEUED'; - return 'ACTIVE'; -} - -/** - * Booster class - */ -class Booster { - /** - * @param {object} data - */ - constructor(data) { - /** - * Booster's purchaser's UUID - * @type {string} - */ - this.purchaser = data.purchaserUuid; - /** - * Booster's multiplier - * @type {number} - */ - this.amount = data.amount; - /** - * Booster's length in seconds - * @type {number} - */ - this.originalLength = data.originalLength; - /** - * Length remaining in seconds - * @type {number} - */ - this.remaining = data.length; - /** - * Date activated timestamp - * @type {number} - */ - this.activatedTimestamp = data.dateActivated; - /** - * Date activated - * @type {Date} - */ - this.activated = new Date(data.dateActivated); - /** - * Game type - * @type {Game} - */ - this.game = data.gameType ? new Game(data.gameType) : null; - /** - * Is Booster Active - * @type {boolean} - */ - this.isActive = Array.isArray(data.stacked); - /** - * Booster type : either 'QUEUED', 'STACKED'* or 'ACTIVE'. - * *STACKED is always queued, when active, they disappear into stackers of the active game booster - * @type {string} - */ - this.type = parseType(data); - /** - * Stacked by ( if any ) - * @type {string[]} - */ - this.stackers = Array.isArray(data.stacked) ? Array.from(data.stacked) : []; - /** - * Possibly expired booster - * Works by checking if date.length is negative - * @type {boolean} - */ - this.expired = 0 > data.length; - } - /** - * Beautiful format - * @return {string} - */ - toString() { - return `${this.purchaser}'s booster in ${this.game}`; - } -} -module.exports = Booster; diff --git a/src/structures/Color.js b/src/structures/Color.js deleted file mode 100644 index 9c50d6a73..000000000 --- a/src/structures/Color.js +++ /dev/null @@ -1,174 +0,0 @@ -/** - * Color class - */ -class Color { - /** - * @param {ColorCode} color Color code - */ - constructor(color) { - this.color = color; - } - - /** - * Returns regular color name - * @return {ColorString} - */ - toString() { - const ColorStrings = { - BLACK: 'Black', - DARK_BLUE: 'Dark Blue', - DARK_GREEN: 'Dark Green', - DARK_AQUA: 'Dark Aqua', - DARK_RED: 'Dark Red', - DARK_PURPLE: 'Dark Purple', - GOLD: 'Gold', - GRAY: 'Gray', - DARK_GRAY: 'Dark Gray', - BLUE: 'Blue', - GREEN: 'Green', - AQUA: 'Aqua', - RED: 'Red', - LIGHT_PURPLE: 'Light Purple', - YELLOW: 'Yellow', - WHITE: 'White' - }; - return ColorStrings[this.color]; - } - - /** - * Returns color HEX code - * @return {ColorHex} - */ - toHex() { - const ColorHex = { - BLACK: '#000000', - DARK_BLUE: '#0000AA', - DARK_GREEN: '#008000', - DARK_AQUA: '#00AAAA', - DARK_RED: '#AA0000', - DARK_PURPLE: '#AA00AA', - GOLD: '#FFAA00', - GRAY: '#AAAAAA', - DARK_GRAY: '#555555', - BLUE: '#5555FF', - GREEN: '#3CE63C', - AQUA: '#3CE6E6', - RED: '#FF5555', - LIGHT_PURPLE: '#FF55FF', - YELLOW: '#FFFF55', - WHITE: '#FFFFFF' - }; - return ColorHex[this.color]; - } - - /** - * Returns color code - * @return {ColorCode} - */ - toCode() { - return this.color; - } - - /** - * Returns color code - * @return {InGameCode} - */ - toInGameCode() { - const InGameCodes = { - BLACK: '§0', - DARK_BLUE: '§1', - DARK_GREEN: '§2', - DARK_AQUA: '§3', - DARK_RED: '§4', - DARK_PURPLE: '§5', - GOLD: '§6', - GRAY: '§7', - DARK_GRAY: '§8', - BLUE: '§9', - GREEN: '§a', - AQUA: '§b', - RED: '§c', - LIGHT_PURPLE: '§d', - YELLOW: '§e', - WHITE: '§f' - }; - return InGameCodes[this.color]; - } -} -/** - * @typedef {string} ColorCode - * * 'BLACK' - * * 'DARK_BLUE' - * * 'DARK_GREEN' - * * 'DARK_AQUA' - * * 'DARK_RED' - * * 'DARK_PURPLE' - * * 'GOLD' - * * 'GRAY' - * * 'DARK_GRAY' - * * 'BLUE' - * * 'GREEN' - * * 'AQUA' - * * 'RED' - * * 'LIGHT_PURPLE' - * * 'YELLOW' - * * 'WHITE' - */ -/** - * @typedef {string} ColorString - * * BLACK: 'Black' - * * DARK_BLUE: 'Dark Blue' - * * DARK_GREEN: 'Dark Green' - * * DARK_AQUA: 'Dark Aqua' - * * DARK_RED: 'Dark Red' - * * DARK_PURPLE: 'Dark Purple' - * * GOLD: 'Gold' - * * GRAY: 'Gray' - * * DARK_GRAY: 'Dark Gray' - * * BLUE: 'Blue`' - * * GREEN: 'Green' - * * AQUA: 'Aqua' - * * RED: 'Red' - * * LIGHT_PURPLE: 'Light Purple' - * * YELLOW: 'Yellow' - * * WHITE: 'White' - */ -/** - * @typedef {string} ColorHex - * * BLACK: '#000000' - * * DARK_BLUE: '#0000AA' - * * DARK_GREEN: '#008000' - * * DARK_AQUA: '#00AAAA' - * * DARK_RED: '#AA0000' - * * DARK_PURPLE: '#AA00AA' - * * GOLD: '#FFAA00' - * * GRAY: '#AAAAAA' - * * DARK_GRAY: '#555555' - * * BLUE: '#5555FF' - * * GREEN: '#3CE63C' - * * AQUA: '#3CE6E6' - * * RED: '#FF5555' - * * LIGHT_PURPLE: '#FF55FF' - * * YELLOW: '#FFFF55' - * * WHITE: '#FFFFFF' - */ -/** - * @typedef {string} InGameCode - * * BLACK: '§0' - * * DARK_BLUE: '§1' - * * DARK_GREEN: '§2' - * * DARK_AQUA: '§3' - * * DARK_RED: '§4' - * * DARK_PURPLE: '§5' - * * GOLD: '§6' - * * GRAY: '§7' - * * DARK_GRAY: '§8' - * * BLUE: '§9' - * * GREEN: '§a' - * * AQUA: '§b' - * * RED: '§c' - * * LIGHT_PURPLE: '§d' - * * YELLOW: '§e' - * * WHITE: '§f' - */ -module.exports = Color; diff --git a/src/structures/Game.js b/src/structures/Game.js deleted file mode 100644 index 1e1b0fde9..000000000 --- a/src/structures/Game.js +++ /dev/null @@ -1,166 +0,0 @@ -const { games } = require('../utils/Constants'); -/** - * Game class - */ -class Game { - /** - * @param {GameId|GameCode} game Game ID or Game Code - */ - constructor(game) { - /** - * Input - * @type {GameId|GameCode} - */ - this.game = game.toString().toLowerCase(); - const result = games.find( - (g) => g.code.toLowerCase() === this.game || g.id.toString() === this.game || g.name.toLowerCase() === this.game - ); - /** - * ID of game - * @type {GameId} - */ - this.id = result ? result.id : 'Not Found'; - /** - * Codename of game - * @type {GameCode} - */ - this.code = result ? result.code : 'Not Found'; - /** - * Name of game - * @type {GameString} - */ - this.name = result ? result.name : 'Not Found'; - /** - * Whether the game is found - * @type {boolean} - */ - this.found = Boolean(result); - } - - /** - * Returns regular game name - * @return {GameString} - */ - toString() { - return this.name; - } - - /** - * Static list of game IDs ( The list has the same order as CODES or NAMES ) - * @type {GameId[]} - */ - static get IDS() { - return games.map((x) => x.id); - } - - /** - * Static list of game codes - * @type {GameCode[]} - */ - static get CODES() { - return games.map((x) => x.code); - } - - /** - * Static list of game strings - * @type {GameString[]} - */ - static get NAMES() { - return games.map((x) => x.name); - } -} -/** - * @typedef {string} GameString - * * QUAKECRAFT: `Quake Craft` - * * WALLS: `Walls` - * * PAINTBALL: `Paintball` - * * SURVIVAL_GAMES: `Blitz Survival Games` - * * TNTGAMES: `The TNT Games` - * * VAMPIREZ: `VAMPIREZ` - * * WALLS3: `Mega Walls` - * * ARCADE: `Arcade` - * * ARENA: `Arena Brawl` - * * UHC: `UHC Champions` - * * MCGO: `Cops And Crims` - * * WARLORDS: `Warlords` - * * SUPER_SMASH: `Smash Heroes` - * * GINGERBREAD: `Turbo Kart Racers` - * * HOUSING: `Housing` - * * SKYWARS: `SkyWars` - * * TRUE_COMBAT: `Crazy Walls` - * * SPEED_UHC: `Speed UHC` - * * SKYCLASH: `SkyClash` - * * LEGACY: `Classic Games` - * * PROTOTYPE: `Prototype` - * * BEDWARS: `BedWars` - * * MURDER_MYSTERY: `Murder Mystery` - * * BUILD_BATTLE: `Build Battle` - * * DUELS: `Duels` - * * SKYBLOCK: `SkyBlock` - * * PIT: `The Pit` - * * REPLAY: `Replay` - * * SMP: `SMP` - */ -/** - * @typedef {string} GameCode - * * QUAKECRAFT - * * WALLS - * * PAINTBALL - * * SURVIVAL_GAMES - * * TNTGAMES - * * VAMPIREZ - * * WALLS3 - * * ARCADE - * * ARENA - * * UHC - * * MCGO - * * WARLORDS - * * SUPER_SMASH - * * GINGERBREAD - * * HOUSING - * * SKYWARS - * * TRUE_COMBAT - * * SPEED_UHC - * * SKYCLASH - * * LEGACY - * * PROTOTYPE - * * BEDWARS - * * MURDER_MYSTERY - * * BUILD_BATTLE - * * DUELS - * * SKYBLOCK - * * PIT - * * REPLAY - * * SMP - */ -/** - * @typedef {number} GameId - * * QUAKECRAFT: `2` - * * WALLS: `3` - * * PAINTBALL: `4` - * * SURVIVAL_GAMES: `5` - * * TNTGAMES: `6` - * * VAMPIREZ: `7` - * * WALLS3: `13` - * * ARCADE: `14` - * * ARENA: `17` - * * UHC: `20` - * * MCGO: `21` - * * BATTLEGROUND: `23` - * * SUPER_SMASH: `24` - * * GINGERBREAD: `25` - * * HOUSING: `26` - * * SKYWARS: `51` - * * TRUE_COMBAT: `52` - * * SPEED_UHC: `54` - * * SKYCLASH: `55` - * * LEGACY: `56` - * * PROTOTYPE: `57` - * * BEDWARS: `58` - * * MURDER_MYSTERY: `59` - * * BUILD_BATTLE: `60` - * * DUELS: `61` - * * SKYBLOCK: `63` - * * PIT: `64` - */ -module.exports = Game; diff --git a/src/structures/GameCounts.js b/src/structures/GameCounts.js deleted file mode 100644 index 6e4077f5d..000000000 --- a/src/structures/GameCounts.js +++ /dev/null @@ -1,151 +0,0 @@ -const { MiniGamesString } = require('../utils/Constants'); -const { removeSnakeCaseString, recursive } = require('../utils/removeSnakeCase'); -/** - * GameCounts class - */ -class GameCounts { - /** - * @param {object} data - */ - constructor(data) { - /** - * Player count in Main lobby - * @name GameCounts#mainLobby - * @type {object} - */ - /** - * Player count in Tournament lobby - * @name GameCounts#tournamentLobby - * @type {object} - */ - /** - * Player count in SkyWars - * @name GameCounts#skywars - * @type {object} - */ - /** - * Player count in The Prototype - * @name GameCounts#prototype - * @type {object} - */ - /** - * Player count in BedWars - * @name GameCounts#bedwars - * @type {object} - */ - /** - * Player count in The Classic Games - * @name GameCounts#classicGames - * @type {object} - */ - /** - * Player count in Housing - * @name GameCounts#housing - * @type {object} - */ - /** - * Player count in Blitz Survival Games - * @name GameCounts#blitzSurvivalGames - * @type {object} - */ - /** - * Player count in UHC Champions - * @name GameCounts#uhcChampions - * @type {object} - */ - /** - * Player count in The Pit - * @name GameCounts#thePit - * @type {object} - */ - /** - * Player count in SkyBlock - * @name GameCounts#skyblock - * @type {object} - */ - /** - * Player count in Warlords - * @name GameCounts#warlords - * @type {object} - */ - /** - * Player count in Smash Heroes - * @name GameCounts#smashHeroes - * @type {object} - */ - /** - * Player count in Cops And Crims - * @name GameCounts#copsAndCrims - * @type {object} - */ - /** - * Player count in Speed UHC - * @name GameCounts#speedUhc - * @type {object} - */ - /** - * Player count in Arcade - * @name GameCounts#arcade - * @type {object} - */ - /** - * Player count in The TNT Games - * @name GameCounts#theTntGames - * @type {object} - */ - /** - * Player count in Duels - * @name GameCounts#duels - * @type {object} - */ - /** - * Player count in Murder Mystery - * @name GameCounts#murderMystery - * @type {object} - */ - /** - * Player count in Mega Walls - * @name GameCounts#megaWalls - * @type {object} - */ - /** - * Player count in SMP - * @name GameCounts#smp - * @type {object} - */ - /** - * Player count in Replay - * @name GameCounts#replay - * @type {object} - */ - /** - * Player count in Limbo - * @name GameCounts#limbo - * @type {object} - */ - /** - * Player count in Idle - * @name GameCounts#idle - * @type {object} - */ - /** - * Player count in Queue - * @name GameCounts#queue - * @type {object} - */ - /** - * Current player count - * @type {number} - */ - this.playerCount = data.playerCount; - for (const game in data.games) { - if (Object.prototype.hasOwnProperty.call(MiniGamesString, game)) { - const objectName = MiniGamesString[game].toUpperCase().replace(/ +/g, '_'); - this[removeSnakeCaseString(objectName)] = recursive(data.games[game], true); - } else { - this[removeSnakeCaseString(game)] = recursive(data.games[game], true); - } - } - } -} -module.exports = GameCounts; diff --git a/src/structures/Guild/Guild.js b/src/structures/Guild/Guild.js deleted file mode 100644 index 70c109124..000000000 --- a/src/structures/Guild/Guild.js +++ /dev/null @@ -1,191 +0,0 @@ -const { getGuildLevel, ranks, calculateExpHistory } = require('../../utils/Guild'); -const GuildMember = require('./GuildMember'); -const GuildRank = require('./GuildRank'); -const Color = require('../Color'); -const Game = require('../Game'); - -// eslint-disable-next-line jsdoc/require-jsdoc -function members(data) { - return data.members.length ? data.members.map((m) => new GuildMember(m)) : []; -} - -// eslint-disable-next-line jsdoc/require-jsdoc -function totalWeeklyGexp(data) { - return members(data) - .map((m) => m.weeklyExperience) - .reduce((acc, cur) => acc + cur); -} - -/** - * Guild class - */ -class Guild { - /** - * @param {data} data Guild data - * @param {string} [me] Player uuid u#sed to search for this guild - */ - constructor(data, me = '') { - /** - * Guild ID - * @type {string} - */ - - // eslint-disable-next-line no-underscore-dangle - this.id = data._id; - /** - * Guild name - * @type {string} - */ - this.name = data.name; - /** - * Guild description - * @type {string} - */ - this.description = data.description ?? ''; - /** - * Guild experience - * @type {number} - */ - this.experience = data.exp || 0; - /** - * Guild level - * @type {number} - */ - this.level = getGuildLevel(this.experience); - /** - * Guild members - * @type {Array} - */ - this.members = members(data); - /** - * Me, if a player UUID is used to get the guild - * @type {GuildMember|null} - */ - this.me = this.members.find((member) => member.uuid === me); - /** - * Guild ranks - * @type {Array} - */ - this.ranks = ranks(data); - /** - * The total guild experience earned in the last 7 days - * @author linearaccelerator - * @type {number} - */ - this.totalWeeklyGexp = totalWeeklyGexp(data); - /** - * An array containing all guild ranks sorted by newest - * @author linearaccelerator - * @return {Array} - */ - this.getRanksByNewest = function () { - return this.ranks.length - ? this.ranks.map((r) => new GuildRank(r)).sort((a, b) => b.createdAt - a.createdAt) - : null; - }; - /** - * A map containing all guild members, keyed by their uuids - * @author linearaccelerator - * @return {Map} - */ - this.getMemberUUIDMap = function () { - return this.members.length ? new Map(this.members.map((m) => [m.uuid, m])) : null; - }; - /** - * Returns a guild rank by priority - * @author linearaccelerator - * @param {number} priority - The priority of the guild rank - * @return {GuildRank} - */ - this.getRankByPriority = function (priority) { - if (!this.ranks.length || !this.ranks.some((r) => r.priority === priority)) return null; - return new GuildRank(this.ranks.find((r) => r.priority === priority)); - }; - /** - * Date of guild creation as timestamp - * @type {string} - */ - this.createdAtTimestamp = data.created; - /** - * Date of guild creation - * @type {Date} - */ - this.createdAt = new Date(data.created); - /** - * Whether this guild can be joined using /g join - * @type {boolean} - */ - this.joinable = data.joinable ?? false; - /** - * Whether this guild is listed in the Guild Finder - * @type {boolean} - */ - this.publiclyListed = Boolean(data.publiclyListed); - /** - * Timestamp guild chat will be unmuted at. - * @type {number|null} - */ - this.chatMuteUntilTimestamp = data.chatMute ?? null; - /** - * Timestamp guild chat will be unmuted at as Date. - * @type {Date|null} - */ - this.chatMuteUntil = data.chatMute ? new Date(data.chatMute) : null; - /** - * Timestamp guild chat will be unmuted at. - * @type {Array<{ Pattern: string, Color: string }>} - */ - this.banner = data.banner ?? null; - /** - * Guild tag - * @type {string} - */ - this.tag = data.tag ?? null; - /** - * Guild tag color - * @type {Color} - */ - this.tagColor = data.tagColor ? new Color(data.tagColor) : null; - /** - * Ranking in the number of guild coins owned in the legacy guild system. (0 - indexed) - * @deprecated - * @type {number} - */ - this.legacyRank = !isNaN(data.legacyRanking) ? parseInt(data.legacyRanking + 1, 10) : 0; - /** - * Experience history per day, resets at 5 am UTC. Please remember this is only an estimation based on the sum of every guild member's daily gexp. - * @type {Array} - */ - this.expHistory = calculateExpHistory(data); - /** - * Guild achievements - * @type {{winners: number, experienceKings: number, onlinePlayers: number}} - */ - this.achievements = { - winners: data.achievements.WINNERS ?? 0, - experienceKings: data.achievements.EXPERIENCE_KINGS ?? 0, - onlinePlayers: data.achievements.ONLINE_PLAYERS ?? 0 - }; - /** - * Guild preferred games - * @type {Array} - */ - this.preferredGames = data.preferredGames ? data.preferredGames.map((g) => new Game(g)) : []; - } - /** - * Guild name - * @return {string} - */ - toString() { - return this.name; - } - /** - * The Guild Master of the guild as a GuildMember - * @type {GuildMember} - */ - get guildMaster() { - return this.members.find((member) => 'Guild Master' === member.rank || 'GUILDMASTER' === member.rank); - } -} - -module.exports = Guild; diff --git a/src/structures/Guild/GuildMember.js b/src/structures/Guild/GuildMember.js deleted file mode 100644 index dc9be2975..000000000 --- a/src/structures/Guild/GuildMember.js +++ /dev/null @@ -1,66 +0,0 @@ -const { parseHistory } = require('../../utils/Guild'); -/** - * GuildMember class - */ -class GuildMember { - /** - * @param {data} data Guild member data - */ - constructor(data) { - /** - * Guild member UUID - * @type {string} - */ - this.uuid = data.uuid; - /** - * Timestamp this member joined at - * @type {number} - */ - this.joinedAtTimestamp = data.joined; - /** - * Timestamp this member joined at as Date - * @type {Date} - */ - this.joinedAt = new Date(data.joined); - /** - * The number of challenges completed that count towards the current quest - * @type {number} - */ - this.questParticipation = data.questParticipation || 0; - /** - * Member's rank - * @type {string} - */ - this.rank = data.rank; - /** - * Timestamp this member will be unmuted at ( if muted ) - * @type {Number|null} - */ - this.mutedUntilTimestamp = data.mutedTill ?? null; - /** - * Timestamp this member will be unmuted at as Date ( if muted ) - * @type {Date|null} - */ - this.mutedUntil = data.mutedTill ? new Date(data.mutedTill) : null; - const xpCheck = data.expHistory && 'number' === typeof Object.values(data.expHistory)[0]; - /** - * Experience history per day, resets at 5 am UTC - * @type {Array} - */ - this.expHistory = parseHistory(data.expHistory); - /** - * Experience per week, resets every Monday at 5 am UTC - * @type {number} - */ - this.weeklyExperience = xpCheck ? Object.values(data.expHistory).reduce((pV, cV) => pV + cV, 0) : null; - } - /** - * UUID - * @return {string} - */ - toString() { - return this.uuid; - } -} - -module.exports = GuildMember; diff --git a/src/structures/Guild/GuildRank.js b/src/structures/Guild/GuildRank.js deleted file mode 100644 index 4da8be8b0..000000000 --- a/src/structures/Guild/GuildRank.js +++ /dev/null @@ -1,48 +0,0 @@ -/** - * GuildRank class - */ -class GuildRank { - /** - * @param {data} data Guild rank data - */ - constructor(data) { - /** - * Guild rank name - * @type {string} - */ - this.name = data.name; - /** - * Whether this rank is the default rank a player gets when they join a guild - * @type {boolean} - */ - this.default = data.default; - /** - * Guild rank tag that appears in guild chat. null if none - * @type {string|null} - */ - this.tag = data.tag ?? null; - /** - * Timestamp this rank was created at - * @type {number} - */ - this.createdAtTimestamp = data.created ? data.created : data.createdAtTimestamp; - /** - * Timestamp this rank was created at as Date - * @type {Date} - */ - this.createdAt = new Date(data.created ? data.created : data.createdAtTimestamp); - /** - * Guild rank priority - Higher number = higher up in the hierarchy - * @type {number} - */ - this.priority = data.priority; - } - /** - * Rank Name - * @return {string} - */ - toString() { - return this.name; - } -} -module.exports = GuildRank; diff --git a/src/structures/House.js b/src/structures/House.js deleted file mode 100644 index 04221dd62..000000000 --- a/src/structures/House.js +++ /dev/null @@ -1,54 +0,0 @@ -/** - * House class - */ -class House { - /** - * @param {object} data data - */ - constructor(data) { - /** - * Name of the house - * @type {string} - */ - this.name = data.name || ''; - /** - * UUID of the house - * @type {string} - */ - this.uuid = data.uuid || ''; - /** - * UUID of the house owner - * @type {string} - */ - this.owner = data.owner || ''; - /** - * Timestamp when the house was created - * @type {number} - */ - this.createdAtTimestamp = data.createdAt || 0; - /** - * Date when the house was created - * @type {Date|null} - */ - this.createdAt = new Date(this.createdAtTimestamp); - /** - * Number of players currently at the house - * @type {number} - */ - this.players = data.players || 0; - /** - * Number of cookies the house has - * @type {number} - */ - this.cookies = data.cookies?.current || 0; - } - /** - * House Nmae - * @return {string} - */ - toString() { - return this.name; - } -} - -module.exports = House; diff --git a/src/structures/ItemBytes.js b/src/structures/ItemBytes.js deleted file mode 100644 index 628d1b584..000000000 --- a/src/structures/ItemBytes.js +++ /dev/null @@ -1,33 +0,0 @@ -const { decode } = require('../utils/SkyblockUtils'); -/** - * Item Bytes class - */ -class ItemBytes { - /** - * @param {string} data base64 encoded bytes - */ - constructor(data) { - /** - * Item Bytes as Buffer - * @type {Buffer} - */ - this.bytesBuffer = Buffer.from(data, 'base64'); - } - - /** - * Returns Item Bytes in base64 encoded - * @return {String} - */ - base64() { - return this.bytesBuffer.toString('base64'); - } - - /** - * Returns NBT of Item Bytes - * @return {any[]} - */ - async readNBT() { - return await decode(this.bytesBuffer, true); - } -} -module.exports = ItemBytes; diff --git a/src/structures/Leaderboard.js b/src/structures/Leaderboard.js deleted file mode 100644 index 2e3d897c7..000000000 --- a/src/structures/Leaderboard.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Leaderboard class - */ -class Leaderboard { - /** - * @param {object} data Leaderboard data - */ - constructor(data) { - /** - * Leaderboard name - * @type {string|null} - */ - this.name = data.prefix || null; - /** - * Leaderboard title - * @type {string} - */ - this.title = data.title || null; - /** - * Leaderboard player count - * @type {string} - */ - this.playerCount = data.count || 0; - /** - * Leaderboard leaders. Array of Player UUIDs - * @type {string[]} - */ - this.leaders = data.leaders || []; - } -} -module.exports = Leaderboard; diff --git a/src/structures/MiniGames/Arcade.js b/src/structures/MiniGames/Arcade.js deleted file mode 100644 index f37ff4f70..000000000 --- a/src/structures/MiniGames/Arcade.js +++ /dev/null @@ -1,986 +0,0 @@ -// IMPORTANT : a lot of the properties from the API seem to be nonsense - -const { removeSnakeCaseString } = require('../../utils/removeSnakeCase'); -const { weekAB, monthAB } = require('../../utils/oscillation'); -const divide = require('../../utils/divide'); - -// eslint-disable-next-line jsdoc/require-jsdoc -function parseZombiesKills(data) { - const matches = Array.from(Object.keys(data)) - .map((x) => x.match(/^([A-Za-z]+)_zombie_kills_zombies$/)) - .filter((x) => x); - // From entries might be broken - return Object.fromEntries(matches.map((x) => [removeSnakeCaseString(x[1]), data[x[0]] || 0])); -} -/** - * Zombies - Stats by Map + Difficulty - */ -class ZombiesStats { - /** - * Constructor - * @param {Object} data Data from API - * @param {string} type Map name + difficulty ( default overall ) - */ - constructor(data, type = '') { - if (type) type = `_${type}`; - /** - * Best Round - * @type {number} - */ - this.bestRound = data[`best_round_zombies${type}`] || 0; - /** - * Deaths ( NOT losses ) - * @type {number} - */ - this.deaths = data[`deaths_zombies${type}`] || 0; - /** - * Doors opened - * @type {number} - */ - this.doorsOpened = data[`doors_opened_zombies${type}`] || 0; - /** - * Fastest time to reach round 10 in seconds - * @type {number} - */ - this.fastestRound10 = data[`fastest_time_10_zombies${type}_normal`] || 0; - /** - * Fastest time to reach round 20 in seconds - * @type {number} - */ - this.fastestRound20 = data[`fastest_time_20_zombies${type}_normal`] || 0; - /** - * Fastest time to reach round 30 in seconds - * @type {number} - */ - this.fastestRound30 = data[`fastest_time_30_zombies${type}_normal`] || 0; - /** - * Players revived - * @type {number} - */ - this.playersRevived = data[`players_revived_zombies${type}`] || 0; - /** - * Number of times player is knocked down - * @type {number} - */ - this.timesKnockedDown = data[`times_knocked_down_zombies${type}`] || 0; - /** - * Total amount of rounds the player survived - * @type {number} - */ - this.roundsSurvived = data[`total_rounds_survived_zombies${type}`] || 0; - /** - * Total amount of windows fully repaired by player - * @type {number} - */ - this.windowsRepaired = data[`windows_repaired_zombies${type}`] || 0; - /** - * Wins - * @type {number} - */ - this.wins = data[`wins_zombies${type}`] || 0; - /** - * Total Zombie Kills - * @type {number} - */ - this.zombieKills = data[`zombie_kills_zombies${type}`] || 0; - } -} - -/** - * Zombies - Overall stats - */ -class Zombies { - /** - * Constructor - * @param {Object} data Data from API - */ - constructor(data) { - /** - * Overall Stats - * @type {ZombiesStats} - */ - this.overall = new ZombiesStats(data); - /** - * Stats for Dead End - * @type {ZombiesStats} - */ - this.deadEnd = new ZombiesStats(data, 'deadend'); - /** - * Stats for Bad Blood - * @type {ZombiesStats} - */ - this.badBlood = new ZombiesStats(data, 'badblood'); - /** - * Stats for Alien Arcadium - * @type {ZombiesStats} - */ - this.alienArcadium = new ZombiesStats(data, 'alienarcadium'); - /** - * Stats for Prison - * @type {ZombiesStats} - */ - this.prison = new ZombiesStats(data, 'prison'); - /** - * Kills By Zombie - * @type {Record} - */ - this.killsByZombie = parseZombiesKills(data); - /** - * Bullets Hit - * @type {number} - */ - this.bulletsHit = data.bullets_hit_zombies || 0; - /** - * Bullets Shot - * @type {number} - */ - this.bulletsShot = data.bullets_shot_zombies || 0; - /** - * Gun Accuracy - * @type {number} - */ - this.gunAccuracy = divide(this.bulletsHit, this.bulletsShot); - /** - * Headshots - * @type {number} - */ - this.headshots = data.headshots_zombies || 0; - /** - * Headshot Accuracy - * @type {number} - */ - this.headshotAccuracy = divide(this.headshots, this.bulletsShot); - } -} - -/** - * Dropper stats by map - */ -class DropperMap { - /** - * Constructor - * @param {Object} data Data from API - * @param {string} mapName String map name - */ - constructor(data, mapName) { - /** - * Best Complete Time - * @type {number} - */ - this.bestTime = data?.[mapName]?.best_time ?? 0; - /** - * Total completions - * @type {number} - */ - this.completions = data?.[mapName]?.completions ?? 0; - } -} - -/** - * Blocking Dead class - */ -class BlockingDead { - constructor(data) { - /** - * Wins - * @type {number} - */ - this.wins = data.wins_dayone || 0; - /** - * Kills - * @type {number} - */ - this.kills = data.kills_dayone || 0; - /** - * Headshots - * @type {number} - */ - this.headshots = data.headshots_dayone || 0; - } -} -/** - * Bounty Hunters class - */ -class BountyHunters { - constructor(data) { - /** - * Wins - * @type {number} - */ - this.wins = data.wins_oneinthequiver || 0; - /** - * Kills - * @type {number} - */ - this.kills = data.kills_oneinthequiver || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data.deaths_oneinthequiver || 0; - /** - * Kill Death Ratio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Bounty Kills - * @type {number} - */ - this.bountyKills = data.bounty_kills_oneinthequiver || 0; - /** - * Bow Kills - * @type {number} - */ - this.bowKills = data.bow_kills_oneinthequiver || 0; - /** - * Sword Kills - * @type {number} - */ - this.swordKills = data.sword_kills_oneinthequiver || 0; - } -} -/** - * Dragon Wars class - */ -class DragonWars { - constructor(data) { - /** - * Wins - * @type {number} - */ - this.wins = data.wins_dragonwars2 || 0; - /** - * Kills - * @type {number} - */ - this.kills = data.kills_dragonwars2 || 0; - } -} -/** - * Dropper class - */ -class Dropper { - constructor(data) { - /** - * Total Wins - * @type {number} - */ - this.wins = data?.wins ?? 0; - /** - * Total Fails - * @type {number} - */ - this.fails = data?.fails ?? 0; - /** - * Fastest Game - * @type {number} - */ - this.fastestGame = data?.fastest_game ?? 0; - /** - * Total Amount of Flawless Games - * @type {number} - */ - this.flawlessGames = data?.flawless_games ?? 0; - /** - * Total Amount of Games Played - * @type {number} - */ - this.gamesPlayed = data?.games_played ?? 0; - /** - * Total Amount of Maps Completed - * @type {number} - */ - this.mapsCompleted = data?.maps_completed ?? 0; - /** - * Total Amount of Games Finished - * @type {number} - */ - this.gamesFinished = data?.games_finished ?? 0; - /** - * Maps - * @type {Object.} - */ - this.maps = {}; - Object.keys(data?.map_stats ?? {}).forEach((map) => { - this.maps[map] = new DropperMap(data?.map_stats, map); - }); - } -} -/** - * Ender Spleef class - */ -class EnderSpleef { - constructor(data) { - /** - * Wins - * @type {number} - */ - this.wins = data.wins_ender || 0; - /** - * Kills - * @type {number} - */ - this.kills = data.kills_dragonwars2 || 0; - /** - * Trail - * @type {string} - */ - this.trail = data.enderspleef_trail || ''; - /** - * Blocks Destroyed - * @type {number} - */ - this.blocksDestroyed = data.blocks_destroyed_ender || 0; - /** - * Big Shot Activations - * @type {number} - */ - this.bigShotActivations = data.bigshot_powerup_activations_ender || 0; - /** - * Triple Shot Activations - * @type {number} - */ - this.tripleShotActivations = data.tripleshot_powerup_activations_ender || 0; - /** - * Total Powerup Activations - * @type {number} - */ - this.totalPowerUpActivations = this.bigShotActivations + this.tripleShotActivations; - } -} -/** - * Farm Hunt class - */ -class FarmHunt { - constructor(data) { - /** - * Wins - * @type {number} - */ - this.wins = data.wins_farm_hunt || 0; - /** - * Wins as Animal - * @type {number} - */ - this.winsAsAnimal = data.animal_wins_farm_hunt || 0; - /** - * Wins as Hunter - * @type {number} - */ - this.winsAsHunter = data.hunter_wins_farm_hunt || 0; - /** - * Kills - * @type {number} - */ - this.kills = data.kills_farm_hunt || 0; - /** - * Kills as Animal - * @type {number} - */ - this.killsAsAnimal = data.animal_kills_farm_hunt || 0; - /** - * Kills as Hunter - * @type {number} - */ - this.killsAsHunter = data.hunter_kills_farm_hunt || 0; - /** - * Taunts Used - * @type {number} - */ - this.tauntsUsed = data.taunts_used_farm_hunt || 0; - /** - * Risky Taunts Used - * @type {number} - */ - this.riskyTauntsUsed = data.risky_taunts_used_farm_hunt || 0; - /** - * Safe Taunts Used - * @type {number} - */ - this.safeTauntsUsed = data.safe_taunts_used_farm_hunt || 0; - /** - * Dangerous Taunts Used - * @type {number} - */ - this.dangerousTauntsUsed = data.dangerous_taunts_used_farm_hunt || 0; - /** - * Firework Taunts Used - * @type {number} - */ - this.fireworkTauntsUsed = data.firework_taunts_used_farm_hunt || 0; - /** - * Poop Collected - * @type {number} - */ - this.poop = (data.poop_collected_farm_hunt || 0) + (data.poop_collected || 0); - } -} -/** - * Football class - */ -class Football { - constructor(data) { - /** - * Wins - * @type {number} - */ - this.wins = data.wins_soccer || 0; - /** - * Goals - * @type {number} - */ - this.goals = data.goals_soccer || 0; - /** - * Kikcs - * @type {number} - */ - this.kicks = data.kicks_soccer || 0; - /** - * Power Kicks - * @type {number} - */ - this.powerKicks = data.powerkicks_soccer || 0; - } -} -/** - * Galxy Wars - */ -class GalaxyWars { - /** - * @param {Object} data Data from API - */ - constructor(data) { - /** - * Wins - * @type {number} - */ - this.wins = data.sw_game_wins || 0; - /** - * Kills - * @type {number} - */ - this.kills = data.sw_kills || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data.sw_deaths || 0; - /** - * Total shots fired - * @type {number} - */ - this.shotsFired = data.sw_shots_fired || 0; - /** - * Total weekly kills - * @type {number} - */ - this.weeklyKills = parseInt(data[`weekly_kills_${weekAB()}`] || 0, 10); - /** - * Total Monthly kills - * @type {number} - */ - this.monthlyKills = parseInt(data[`monthly_kills_${monthAB()}`] || 0, 10); - /** - * Attacker Kills - * @type {number} - */ - this.attackerKills = data.sw_rebel_kills || 0; - /** - * Defender Kills - * @type {number} - */ - this.defenderKills = data.sw_empire_kills || 0; - } -} -/** - * Party Pooper Stats (Sub gamemode of Hide and Seek) - */ -class PartyPooper { - /** - * @param {Object} data Data from API - */ - constructor(data) { - /** - * Wins as Seeker - * @type {number} - */ - this.winsAsSeeker = data.party_pooper_seeker_wins_hide_and_seek || 0; - /** - * Wins as Hider - * @type {number} - */ - this.winsAsHider = data.party_pooper_hider_wins_hide_and_seek || 0; - /** - * Wins - * @type {number} - */ - this.wins = this.winsAsSeeker + this.winsAsHider; - } -} -/** - * Prop Hunt Stats (Sub gamemode of Hide and Seek) - */ -class PropHunt { - /** - * @param {Object} data Data from API - */ - constructor(data) { - /** - * Wins as Seeker - * @type {number} - */ - this.winsAsSeeker = data.prop_hunt_seeker_wins_hide_and_seek || 0; - /** - * Wins as Hider - * @type {number} - */ - this.winsAsHider = data.prop_hunt_hider_wins_hide_and_seek || 0; - /** - * Wins - * @type {number} - */ - this.wins = this.winsAsSeeker + this.winsAsHider; - } -} -/** - * Hide And Seek Stats - */ -class HideAndSeek { - /** - * @param {Object} data Data from API - */ - constructor(data) { - /** - * Party Pooper Stats - * @type {PartyPooper} - */ - this.partyPooper = new PartyPooper(data); - /** - * Prop Hunt Stats - * @type {PropHunt} - */ - this.propHunt = new PropHunt(data); - /** - * Wins as Seeker - * @type {number} - */ - this.winsAsSeeker = data.seeker_wins_hide_and_seek || 0; - /** - * Wins as Hider - * @type {number} - */ - this.winsAsHider = data.hider_wins_hide_and_seek || 0; - } -} -/** - * Hide And Seek Stats - */ -class HoleInTheWall { - /** - * @param {Object} data Data from API - */ - constructor(data) { - /** - * Wins - * @type {number} - */ - this.wins = data.wins_hole_in_the_wall || 0; - /** - * Rounds Played - * @type {number} - */ - this.rounds = data.rounds_hole_in_the_wall || 0; - /** - * Score Record in Finals - * @type {number} - */ - this.scoreRecordFinals = data.hitw_record_f || 0; - /** - * Score Record in Normal - * @type {number} - */ - this.scoreRecordNormal = data.hitw_record_q || 0; - /** - * Score Record Overall - * @type {number} - */ - this.scoreRecordOverall = this.scoreRecordFinals + this.scoreRecordNormal; - } -} -/** - * Hypixel Says Stats - */ -class HypixelSays { - constructor(data) { - /** - * Wins - * @type {number} - */ - this.wins = data.wins_simon_says || 0; - /** - * Rounds - * @type {number} - */ - this.rounds = data.rounds_simon_says || 0; - /** - * Round Wins - * @type {number} - */ - this.roundWins = data.round_wins_simon_says || 0; - /** - * Top Score - * @type {number} - */ - this.topScore = data.top_score_simon_says || 0; - } -} -/** - * Mini Walls class - */ -class MiniWalls { - /** - * Constructor - * @param {Object} data data from API - */ - constructor(data) { - /** - * Active Kit - * @type {string} - */ - this.kit = data.miniWalls_activeKit || ''; - /** - * Wins - * @type {number} - */ - this.wins = data.wins_mini_walls || 0; - /** - * Kills - * @type {number} - */ - this.kills = data.kills_mini_walls || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data.deaths_mini_walls || 0; - /** - * Kill Death Ratio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Final Kills - * @type {number} - */ - this.finalKills = data.final_kills_mini_walls || 0; - /** - * Wither Kills - * @type {number} - */ - this.witherKills = data.wither_kills_mini_walls || 0; - /** - * Wither Damage - * @type {number} - */ - this.witherDamage = data.wither_damage_mini_walls || 0; - /** - * Arrows Shot - * @type {number} - */ - this.arrowsShot = data.arrows_shot_mini_walls || 0; - /** - * Arrows Hit - * @type {number} - */ - this.arrowsHit = data.arrows_hit_mini_walls || 0; - /** - * Bow Accuracy - * @type {number} - */ - this.bowAccuracy = divide(this.arrowsHit, this.arrowsShot); - } -} -/** - * Party Games class - */ -class PartyGames { - /** - * Constructor - * @param {Object} data data from API - */ - constructor(data) { - /** - * Wins - * @type {number} - */ - this.wins = data.wins_party || 0; - /** - * Rounds Won - * @type {number} - */ - this.roundWins = data.round_wins_party || 0; - /** - * Stars Earned - * @type {number} - */ - this.stars = data.total_stars_party || 0; - } -} -/** - * Pixel Party Game Mode - */ -class PixelPartyGameMode { - /** - * Constructor - * @param {Object} data data from API - * @param {string} modeName Mode name - */ - constructor(data, modeName) { - /** - * Wins - * @type {number} - */ - this.wins = data?.[`wins_${modeName}`] || 0; - /** - * Games Played - * @type {number} - */ - this.gamesPlayed = data?.[`games_played_${modeName}`] || 0; - /** - * Losses - * @type {number} - */ - this.losses = this.gamesPlayed - this.wins; - /** - * Win Loss Ratio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - /** - * Rounds Played - * @type {number} - */ - this.roundsPlayed = data?.[`rounds_completed_${modeName}`] || 0; - /** - * Power Ups Collected - * @type {number} - */ - this.powerUpsCollected = data?.[`power_ups_collected_${modeName}`] || 0; - } -} -/** - * Party Games class - */ -class PixelParty { - /** - * Constructor - * @param {Object} data data from API - */ - constructor(data) { - /** - * Wins - * @type {number} - */ - this.wins = data?.pixel_party?.wins || 0; - /** - * Games Played - * @type {number} - */ - this.gamesPlayed = data?.pixel_party?.games_played || 0; - /** - * Losses - * @type {number} - */ - this.losses = this.gamesPlayed - this.wins; - /** - * Win Loss Ratio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - /** - * Rounds Played - * @type {number} - */ - this.roundsPlayed = data?.pixel_party?.rounds_completed || 0; - /** - * Power Ups Collected - * @type {number} - */ - this.powerUpsCollected = data?.pixel_party?.power_ups_collected || 0; - /** - * Normal Game Mode - * @type {PixelPartyGameMode} - */ - this.normal = new PixelPartyGameMode(data.pixel_party, 'normal'); - /** - * Hyper Game Mode - * @type {PixelPartyGameMode} - */ - this.hyper = new PixelPartyGameMode(data.pixel_party, 'hyper'); - /** - * Highest Round - * @type {number} - */ - this.highestRound = data?.pixel_party?.highest_round || 0; - /** - * Music Volume - * @type {number} - */ - this.musicVolume = data.pixel_party_music_volume || 0; - /** - * Color Blind Settings - * @type {object} - */ - this.colorBlind = data.pixelparty || {}; - } -} -/** - * Throw Out class - */ -class ThrowOut { - /** - * Constructor - * @param {Object} data data from API - */ - constructor(data) { - /** - * Wins - * @type {number} - */ - this.wins = data.wins_throw_out || 0; - /** - * Kills - * @type {number} - */ - this.kills = data.kills_throw_out || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data.deaths_throw_out || 0; - /** - * KDRatio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - } -} -/** - * Arcade class - */ -class Arcade { - /** - * Constructor - * @param {Object} data Data from the API - */ - constructor(data = {}) { - /** - * Amount of coins - * @type {number} - */ - this.coins = data.coins || 0; - /** - * Weekly coins - * @type {number} - */ - this.weeklyCoins = parseInt(data[`weekly_coins_${weekAB()}`] || 0, 10); - /** - * Monthly coins - * @type {number} - */ - this.monthlyCoins = parseInt(data[`monthly_coins_${monthAB()}`] || 0, 10); - /** - * Hints Disabled - * @type {boolean} - */ - this.hintsDisabled = !data.hints; - /** - * Flash Disabled - * @type {boolean} - */ - this.flashDisabled = !data.flash; - /** - * Blocking dead ( previously known as DayOne ) stats - * @type {BlockingDead} - */ - this.blockingDead = new BlockingDead(data); - /** - * Bounty Hunters (previously known as One In The Quiver) stats - * @type {BountyHunters} - */ - this.bountyHunters = new BountyHunters(data); - /** - * Dragon wars stats - * @type {DragonWars} - */ - this.dragonWars = new DragonWars(data); - /** - * Dropper - * @type {Dropper} - */ - this.dropper = new Dropper(data.dropper); - /** - * Ender Spleef stats - * @type {EnderSpleef} - */ - this.enderSpleef = new EnderSpleef(data); - /** - * Farm Hunt stats - * @type {FarmHunt} - */ - this.farmHunt = new FarmHunt(data); - /** - * Football stats - * @type {Football} - */ - this.football = new Football(data); - /** - * Galaxy Wars stats - * @type {GalaxyWars} - */ - this.galaxyWars = new GalaxyWars(data); - /** - * Hide and Seek stats - * @type {HideAndSeek} - */ - this.hideAndSeek = new HideAndSeek(data); - /** - * Hole in the Wall stats - * @type {HoleInTheWall} - */ - this.holeInTheWall = new HoleInTheWall(data); - /** - * Hypixel Says stats - * @type {HypixelSays} - */ - this.hypixelSays = new HypixelSays(data); - /** - * Mini Walls stats - * @type {MiniWalls} - */ - this.miniWalls = new MiniWalls(data); - /** - * Party games stats - * @type {PartyGames} - */ - this.partyGames = new PartyGames(data); - /** - * Pixel Party stats - * @type {PixelParty} - */ - this.pixelParty = new PixelParty(data); - /** - * Throw out stats - * @type {ThrowOut} - */ - this.throwOut = new ThrowOut(data); - /** - * Zombies - * @type {Zombies} - */ - this.zombies = new Zombies(data); - } -} - -module.exports = Arcade; diff --git a/src/structures/MiniGames/ArenaBrawl.js b/src/structures/MiniGames/ArenaBrawl.js deleted file mode 100644 index 3cfbef99b..000000000 --- a/src/structures/MiniGames/ArenaBrawl.js +++ /dev/null @@ -1,118 +0,0 @@ -const divide = require('../../utils/divide'); - -class ArenaBrawlMode { - /** - * @param {object} data ArenaBrawl data - * @param {string} mode mode - */ - constructor(data, mode) { - /** - * Damage - * @type {number} - */ - this.damage = data[`damage_${mode}`]; - /** - * Kills - * @type {number} - */ - this.kills = data[`kills_${mode}`]; - /** - * Deaths - * @type {number} - */ - this.deaths = data[`deaths_${mode}`]; - /** - * KDRatio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Healed - * @type {number} - */ - this.healed = data[`healed_${mode}`]; - /** - * Wins - * @type {number} - */ - this.wins = data[`wins_${mode}`]; - /** - * Losses - * @type {number} - */ - this.losses = data[`losses_${mode}`]; - /** - * WLRatio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - /** - * Games Played - * @type {number} - */ - this.games = data[`games_${mode}`]; - /** - * Winstreak - * @type {number} - */ - this.winstreak = data[`win_streaks_${mode}`]; - } -} - -/** - * ArenaBrawl class - */ -class ArenaBrawl { - /** - * @param {object} data ArenaBrawl data - */ - constructor(data) { - /** - * Coins - * @type {number} - */ - this.coins = data.coins || 0; - /** - * Coins Spent - * @type {number} - */ - this.coinsSpent = data.coins_spent || 0; - /** - * Wins - * @type {number} - */ - this.wins = data.wins || 0; - /** - * Keys - * @type {number} - */ - this.keys = data.keys || 0; - /** - * Chests - * @type {number} - */ - this.chests = data.magical_chest || 0; - /** - * Rune - * @type {string} - */ - this.rune = data.active_rune || ''; - /** - * ArenaBrawl mode stats - * @type {ArenaBrawlMode} - */ - this['1v1'] = new ArenaBrawlMode(data, '1v1'); - /** - * ArenaBrawl mode stats - * @type {ArenaBrawlMode} - */ - this['2v2'] = new ArenaBrawlMode(data, '2v2'); - /** - * ArenaBrawl mode stats - * @type {ArenaBrawlMode} - */ - this['4v4'] = new ArenaBrawlMode(data, '4v4'); - } -} - -module.exports = ArenaBrawl; diff --git a/src/structures/MiniGames/BedWars.js b/src/structures/MiniGames/BedWars.js deleted file mode 100644 index 14645f5c9..000000000 --- a/src/structures/MiniGames/BedWars.js +++ /dev/null @@ -1,554 +0,0 @@ -const divide = require('../../utils/divide'); - -const generateStatsForMode = (data, mode) => { - return { - winstreak: data[`${mode}_winstreak`] || 0, - playedGames: data[`${mode}_games_played_bedwars`] || 0, - - kills: data[`${mode}_kills_bedwars`] || 0, - deaths: data[`${mode}_deaths_bedwars`] || 0, - - wins: data[`${mode}_wins_bedwars`] || 0, - losses: data[`${mode}_losses_bedwars`] || 0, - - finalKills: data[`${mode}_final_kills_bedwars`] || 0, - finalDeaths: data[`${mode}_final_deaths_bedwars`] || 0, - - beds: { - broken: data[`${mode}_beds_broken_bedwars`] || 0, - lost: data[`${mode}_beds_lost_bedwars`] || 0, - BLRatio: divide(data[`${mode}_beds_broken_bedwars`], data[`${mode}_beds_lost_bedwars`]) - }, - - avg: { - kills: divide(data[`${mode}_kills_bedwars`], data[`${mode}_games_played_bedwars`]), - finalKills: divide(data[`${mode}_final_kills_bedwars`], data[`${mode}_games_played_bedwars`]), - bedsBroken: divide(data[`${mode}_beds_broken_bedwars`], data[`${mode}_games_played_bedwars`]) - }, - - KDRatio: divide(data[`${mode}_kills_bedwars`], data[`${mode}_deaths_bedwars`]), - WLRatio: divide(data[`${mode}_wins_bedwars`], data[`${mode}_losses_bedwars`]), - finalKDRatio: divide(data[`${mode}_final_kills_bedwars`], data[`${mode}_final_deaths_bedwars`]) - }; -}; - -// eslint-disable-next-line jsdoc/require-jsdoc -function getBedWarsPrestige(level) { - if (5000 <= level) return 'Eternal'; - return ( - [ - 'Stone', - 'Iron', - 'Gold', - 'Diamond', - 'Emerald', - 'Sapphire', - 'Ruby', - 'Crystal', - 'Opal', - 'Amethyst', - 'Rainbow', - 'Iron Prime', - 'Gold Prime', - 'Diamond Prime', - 'Emerald Prime', - 'Sapphire Prime', - 'Ruby Prime', - 'Crystal Prime', - 'Opal Prime', - 'Amethyst Prime', - 'Mirror', - 'Light', - 'Dawn', - 'Dusk', - 'Air', - 'Wind', - 'Nebula', - 'Thunder', - 'Earth', - 'Water', - 'Fire', - 'Sunrise', - 'Eclipse', - 'Gamma', - 'Majestic', - 'Andesine', - 'Marine', - 'Element', - 'Galaxy', - 'Atomic', - 'Sunset', - 'Time', - 'Winter', - 'Obsidian', - 'Spring', - 'Ice', - 'Summer', - 'Spinel', - 'Autumn', - 'Mystic', - 'Eternal' - ][Math.floor(level / 100)] || 'Eternal' - ); -} -const EASY_LEVELS = 4; -const EASY_LEVELS_XP = 7000; -const XP_PER_PRESTIGE = 96 * 5000 + EASY_LEVELS_XP; -const LEVELS_PER_PRESTIGE = 100; -const HIGHEST_PRESTIGE = 10; - -// eslint-disable-next-line jsdoc/require-jsdoc -function getLevelRespectingPrestige(level) { - if (level > HIGHEST_PRESTIGE * LEVELS_PER_PRESTIGE) { - return level - HIGHEST_PRESTIGE * LEVELS_PER_PRESTIGE; - } - return level % LEVELS_PER_PRESTIGE; -} - -// eslint-disable-next-line jsdoc/require-jsdoc -function getExpForLevel(level) { - if (0 === level) return 0; - const respectedLevel = getLevelRespectingPrestige(level); - if (respectedLevel > EASY_LEVELS) return 5000; - switch (respectedLevel) { - case 1: - return 500; - case 2: - return 1000; - case 3: - return 2000; - case 4: - return 3500; - default: { - return 5000; - } - } -} - -// eslint-disable-next-line jsdoc/require-jsdoc -function getLevelForExp(exp) { - const prestiges = Math.floor(exp / XP_PER_PRESTIGE); - let level = prestiges * LEVELS_PER_PRESTIGE; - let expWithoutPrestiges = exp - prestiges * XP_PER_PRESTIGE; - - for (let i = 1; i <= EASY_LEVELS; ++i) { - const expForEasyLevel = getExpForLevel(i); - if (expWithoutPrestiges < expForEasyLevel) { - break; - } - level++; - expWithoutPrestiges -= expForEasyLevel; - } - return level + Math.floor(expWithoutPrestiges / 5000); -} - -// eslint-disable-next-line jsdoc/require-jsdoc -function generateStatsForPractice(data) { - return { - selected: data?.practice?.selected || 'NONE', - bridging: { - blocksPlaced: data?.practice?.bridging?.blocks_placed ?? 0, - attempts: { - failed: data?.practice?.bridging?.failed_attempts ?? 0, - successful: data?.practice?.bridging?.successful_attempts ?? 0, - total: data?.practice?.bridging?.failed_attempts + data?.practice?.bridging?.successful_attempts - }, - records: { - blocks30: { - elevation: { - none: { - straight: data?.practice?.records?.['bridging_distance_30:elevation_NONE:angle_STRAIGHT:'] ?? 0, - diagonal: data?.practice?.records?.['bridging_distance_30:elevation_NONE:angle_DIAGONAL:'] ?? 0 - }, - slight: { - straight: data?.practice?.records?.['bridging_distance_30:elevation_SLIGHT:angle_STRAIGHT:'] ?? 0, - diagonal: data?.practice?.records?.['bridging_distance_30:elevation_SLIGHT:angle_DIAGONAL:'] ?? 0 - }, - staircase: { - straight: data?.practice?.records?.['bridging_distance_30:elevation_STAIRCASE:angle_STRAIGHT:'] ?? 0, - diagonal: data?.practice?.records?.['bridging_distance_30:elevation_STAIRCASE:angle_DIAGONAL:'] ?? 0 - } - } - }, - blocks50: { - elevation: { - none: { - straight: data?.practice?.records?.['bridging_distance_50:elevation_NONE:angle_STRAIGHT:'] ?? 0, - diagonal: data?.practice?.records?.['bridging_distance_50:elevation_NONE:angle_DIAGONAL:'] ?? 0 - }, - slight: { - straight: data?.practice?.records?.['bridging_distance_50:elevation_SLIGHT:angle_STRAIGHT:'] ?? 0, - diagonal: data?.practice?.records?.['bridging_distance_50:elevation_SLIGHT:angle_DIAGONAL:'] ?? 0 - }, - staircase: { - straight: data?.practice?.records?.['bridging_distance_50:elevation_STAIRCASE:angle_STRAIGHT:'] ?? 0, - diagonal: data?.practice?.records?.['bridging_distance_50:elevation_STAIRCASE:angle_DIAGONAL:'] ?? 0 - } - } - }, - blocks100: { - elevation: { - none: { - straight: data?.practice?.records?.['bridging_distance_100:elevation_NONE:angle_STRAIGHT:'] ?? 0, - diagonal: data?.practice?.records?.['bridging_distance_100:elevation_NONE:angle_DIAGONAL:'] ?? 0 - }, - slight: { - straight: data?.practice?.records?.['bridging_distance_100:elevation_SLIGHT:angle_STRAIGHT:'] ?? 0, - diagonal: data?.practice?.records?.['bridging_distance_100:elevation_SLIGHT:angle_DIAGONAL:'] ?? 0 - }, - staircase: { - straight: data?.practice?.records?.['bridging_distance_100:elevation_STAIRCASE:angle_STRAIGHT:'] ?? 0, - diagonal: data?.practice?.records?.['bridging_distance_100:elevation_STAIRCASE:angle_DIAGONAL:'] ?? 0 - } - } - } - } - }, - fireballJumping: { - blocksPlaced: data?.practice?.fireball_jumping?.blocks_placed ?? 0, - attempts: { - failed: data?.practice?.fireball_jumping?.failed_attempts ?? 0, - successful: data?.practice?.fireball_jumping?.successful_attempts ?? 0, - total: data?.practice?.fireball_jumping?.failed_attempts + data?.practice?.fireball_jumping?.successful_attempts - } - }, - pearlClutching: { - attempts: { - failed: data?.practice?.pearl_clutching?.failed_attempts ?? 0, - successful: data?.practice?.pearl_clutching?.successful_attempts ?? 0, - total: data?.practice?.pearl_clutching?.failed_attempts + data?.practice?.pearl_clutching?.successful_attempts - } - }, - mlg: { - blocksPlaced: data?.practice?.mlg?.blocks_placed ?? 0, - attempts: { - failed: data?.practice?.mlg?.failed_attempts ?? 0, - successful: data?.practice?.mlg?.successful_attempts ?? 0, - total: data?.practice?.mlg?.failed_attempts + data?.practice?.mlg?.successful_attempts - } - } - }; -} -/** - * BedWars class - */ -class BedWars { - /** - * @param {object} data BedWars data - */ - constructor(data) { - /** - * Tokens - * @type {number} - */ - this.tokens = data.coins || 0; - /** - * Level - * @type {number} - */ - this.level = data.Experience ? getLevelForExp(data.Experience) : 0; - /** - * Experience - * @type {number} - */ - this.experience = data.Experience || 0; - /** - * Prestige - * @type {BedWarsPrestige} - */ - this.prestige = data.Experience ? getBedWarsPrestige(getLevelForExp(data.Experience)) : 'Stone'; - /** - * Played games - * @type {number} - */ - this.playedGames = data.games_played_bedwars || 0; - /** - * Wins - * @type {number} - */ - this.wins = data.wins_bedwars || 0; - /** - * Winstreak - * @type {number} - */ - this.winstreak = data.winstreak || 0; - /** - * Kills - * @type {number} - */ - this.kills = data.kills_bedwars || 0; - /** - * Final kills - * @type {number} - */ - this.finalKills = data.final_kills_bedwars || 0; - /** - * Losses - * @type {number} - */ - this.losses = data.losses_bedwars || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data.deaths_bedwars || 0; - /** - * Final deaths - * @type {number} - */ - this.finalDeaths = data.final_deaths_bedwars || 0; - /** - * Collected items - * @type {BedWarsCollectedItems} - */ - this.collectedItemsTotal = { - iron: data.iron_resources_collected_bedwars || 0, - gold: data.gold_resources_collected_bedwars || 0, - diamond: data.diamond_resources_collected_bedwars || 0, - emerald: data.emerald_resources_collected_bedwars || 0 - }; - /** - * Beds lost/broken/BL Ratio - * @type {BedWarsBeds} - */ - this.beds = { - lost: data.beds_lost_bedwars || 0, - broken: data.beds_broken_bedwars || 0, - BLRatio: divide(data.beds_broken_bedwars, data.beds_lost_bedwars) - }; - /** - * Average Kills/Final kills/Beds broken - * @type {BedWarsAvg} - */ - this.avg = { - kills: divide(this.kills, this.playedGames), - finalKills: divide(this.finalKills, this.playedGames), - bedsBroken: divide(this.beds.broken, this.playedGames) - }; - /** - * Kill Death ratio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Final kill death ratio - * @type {number} - */ - this.finalKDRatio = divide(this.finalKills, this.finalDeaths); - /** - * Win Loss ratio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - /** - * BedWars Solo stats - * @type {BedWarsModeStats} - */ - this.solo = generateStatsForMode(data, 'eight_one'); - /** - * BedWars Doubles stats - * @type {BedWarsModeStats} - */ - this.doubles = generateStatsForMode(data, 'eight_two'); - /** - * BedWars 3v3v3v3 stats - * @type {BedWarsModeStats} - */ - this.threes = generateStatsForMode(data, 'four_three'); - /** - * BedWars 4v4v4v4 stats - * @type {BedWarsModeStats} - */ - this.fours = generateStatsForMode(data, 'four_four'); - /** - * BedWars 4v4 stats - * @type {BedWarsModeStats} - */ - this['4v4'] = generateStatsForMode(data, 'two_four'); - /** - * BedWars Dream Mode Stats - * @type {BedwarsDreamStats} - */ - this.dream = ['ultimate', 'rush', 'armed', 'lucky', 'voidless'].reduce( - (ac, mode) => ({ - [mode]: { - doubles: generateStatsForMode(data, `eight_two_${mode}`), - fours: generateStatsForMode(data, `four_four_${mode}`) - }, - ...ac - }), - {} - ); - /** - * BedWars Castle Stats - * @type {BedWarsModeStats} - */ - this.castle = generateStatsForMode(data, 'castle'); - /** - * BedWars Practice Stats - * @type {BedWarsPracticeStats} - */ - this.practice = generateStatsForPractice(data); - /** - * Bedwars Slumber Tickets - * @type {number} - */ - this.slumberTickets = data.slumber?.tickets ?? 0; - /** - * Bedwars Slumber Total Tickets - * @type {number} - */ - this.totalSlumberTicket = data.slumber?.total_tickets ?? 0; - } -} -/** - * @typedef {string} BedWarsPrestige - * * `Stone` - * * `Iron` - * * `Gold` - * * `Diamond` - * * `Emerald` - * * `Sapphire` - * * `Ruby` - * * `Crystal` - * * `Opal` - * * `Amethyst` - * * `Rainbow` - * * `Iron Prime` - * * `Gold Prime` - * * `Diamond Prime` - * * `Emerald Prime` - * * `Sapphire Prime` - * * `Ruby Prime` - * * `Crystal Prime` - * * `Opal Prime` - * * `Amethyst Prime` - * * `Mirror` - * * `Light` - * * `Dawn` - * * `Dusk` - * * `Air` - * * `Wind` - * * `Nebula` - * * `Thunder` - * * `Earth` - * * `Water` - * * `Fire` - * * `Sunrise` - * * `Eclipse` - * * `Gamma` - * * `Majestic` - * * `Andesine` - * * `Marine` - * * `Element` - * * `Galaxy` - * * `Atomic` - * * `Sunset` - * * `Time` - * * `Winter` - * * `Obsidian` - * * `Spring` - * * `Ice` - * * `Summer` - * * `Spinel` - * * `Autumn` - * * `Mystic` - * * `Eternal` - */ -/** - * @typedef {object} BedWarsAvg - * @property {number} kills Average kills - * @property {number} finalKills Average final kills - * @property {number} bedsBroken Average beds broken - */ -/** - * @typedef {object} BedWarsCollectedItems - * @property {number} iron Iron - * @property {number} gold Gold - * @property {number} diamond Diamond - * @property {number} emerald Emerald - */ -/** - * @typedef {object} BedWarsBeds - * @property {number} lost Beds lost - * @property {number} broken Beds broken - * @property {number} BLRatio Beds broken/Beds lost ratio - */ -/** - * @typedef {Object} BedWarsModeStats - * @property {number} winstreak Winstreak - * @property {number} playedGames Played games - * @property {number} kills Kills - * @property {number} deaths Deaths - * @property {number} wins Wins - * @property {number} losses Losses - * @property {number} finalKills Final kills - * @property {number} finalDeaths Final deaths - * @property {BedWarsBeds} beds Beds - * @property {BedWarsAvg} avg Average Kills/Final kills/Beds broken - * @property {number} KDRatio Kill Death ratio - * @property {number} WLRatio Win Loss ratio - * @property {number} finalKDRatio Final kills/Final deaths ratio - */ -/** - * @typedef {Object} BedwarsDreamStats - * @property {BedwarsDreamModeStats} ultimate Ultimate stats - * @property {BedwarsDreamModeStats} rush Rush stats - * @property {BedwarsDreamModeStats} armed Armed stats - * @property {BedwarsDreamModeStats} lucky Lucky Blocks stats (true api naming) - * @property {BedwarsDreamModeStats} voidless Voidless stats - */ -/** - * @typedef {Object} BedwarsDreamModeStats - * @property {BedWarsModeStats} doubles Doubles - * @property {BedWarsModeStats} fours Fours - */ -/** - * @typedef {Object} BedWarsPracticeAttempts - * @property {number} failed Total failed attempts - * @property {number} successful Total successful attempts - * @property {number} total Total Number of attempts - */ -/** - * @typedef {Object} BedWarsPracticeElevation - * @property {number} straight straight - * @property {number} diagonal diagonal - */ -/** - * @typedef {Object} BedWarsPracticeElevations - * @property {BedWarsPracticeElevation} none none - * @property {BedWarsPracticeElevation} slight slight - * @property {BedWarsPracticeElevation} staircase staircase - */ -/** - * @typedef {Object} BedWarsPracticeRecord - * @property {BedWarsPracticeElevations} elevation Elevation - */ -/** - * @typedef {Object} BedWarsPracticeRecords - * @property {BedWarsPracticeRecord} blocks30 30 Blocks - * @property {BedWarsPracticeRecord} blocks50 50 Blocks - * @property {BedWarsPracticeRecord} blocks100 100 Blocks - */ -/** - * @typedef {Object} BedWarsPracticeBridging - * @property {number} blocksPlaced Blocks placed - * @property {BedWarsPracticeAttempts} attempts Attempts - */ -/** - * @typedef {Object} BedWarsPracticePearlClutching - * @property {BedWarsPracticeAttempts} attempts Attempts - */ -/** - * @typedef {Object} BedWarsPracticeMLG - * @property {number} blocksPlaced Blocks placed - * @property {BedWarsPracticeAttempts} attempts Attempts - */ -/** - * @typedef {Object} BedWarsPracticeStats - * @property {string} selected Selected Type of Practice - * @property {BedWarsPracticeBridging} bridging Bridging stats - * @property {BedWarsPracticePearlClutching} pearlClutching Pearl Clutching stats - * @property {BedWarsPracticeMLG} mlg MLG stats - */ -module.exports = BedWars; diff --git a/src/structures/MiniGames/BlitzSurvivalGames.js b/src/structures/MiniGames/BlitzSurvivalGames.js deleted file mode 100644 index 773d6fb6c..000000000 --- a/src/structures/MiniGames/BlitzSurvivalGames.js +++ /dev/null @@ -1,424 +0,0 @@ -const divide = require('../../utils/divide'); - -class BlitzSGKit { - /** - * @param {object} data Blitz SG data - * @param {string} kitName Kit name - */ - constructor(data, kitName) { - /** - * Kit Level - * @type {number} - */ - this.level = data[kitName] || 0; - /** - * Kit Level - * @type {number} - */ - this.exp = data[`exp_${kitName}`] || 0; - /** - * Kills - * @type {number} - */ - this.kills = data[`kills_${kitName}`] || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data[`deaths_${kitName}`] || 0; - /** - * Kill Death ratio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Wins - * @type {number} - */ - this.wins = data[`wins_${kitName}`] || 0; - /** - * Games Played - * @type {number} - */ - this.gamesPlayed = data[`games_played_${kitName}`] || 0; - /** - * Losses - * @type {number} - */ - this.losses = this.gamesPlayed - this.wins; - /** - * Win Loss ratio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - /** - * Arrows Shot - * @type {number} - */ - this.arrowsShot = data[`arrows_fired_${kitName}`] || 0; - /** - * Arrows Hit - * @type {number} - */ - this.arrowsHit = data[`arrows_hit_${kitName}`] || 0; - /** - * Bow Accuracy - * @type {number} - */ - this.bowAccuracy = divide(this.arrowsHit, this.arrowsShot); - /** - * Damage Delt - * @type {number} - */ - this.damage = data[`damage_${kitName}`] || 0; - /** - * Damage Taken - * @type {number} - */ - this.damageTaken = data[`damage_taken_${kitName}`] || 0; - /** - * Potions Drunk - * @type {number} - */ - this.potionsDrunk = data[`potions_drunk_${kitName}`] || 0; - /** - * Potions Thrown - * @type {number} - */ - this.potionsThrown = data[`potions_thrown_${kitName}`] || 0; - /** - * Time Played (In seconds) - * @type {number} - */ - this.playTime = data[`time_played_${kitName}`] || 0; - /** - * Mobs Spawned - * @type {number} - */ - this.mobsSpawned = data[`mobs_spawned_${kitName}`] || 0; - /** - * Chests Opened - * @type {number} - */ - this.chestsOpened = data[`chests_opened_${kitName}`] || 0; - } -} - -/** - * Blitz SG class - */ -class BlitzSurvivalGames { - /** - * @param {object} data Blitz SG data - */ - constructor(data) { - /** - * Coins - * @type {number} - */ - this.coins = data.coins || 0; - /** - * Kills - * @type {number} - */ - this.kills = data.kills || 0; - /** - * Kit - * @type {string} - */ - this.kit = data.defaultkit || ''; - /** - * Solo Kills - * @type {number} - */ - this.killsSolo = data.kills_solo_normal || 0; - /** - * Teams Kills - * @type {number} - */ - this.killsTeams = data.kills_teams_normal || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data.deaths || 0; - /** - * Kill Death ratio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Wins - * @type {number} - */ - this.wins = data.wins || 0; - /** - * Solo wins - * @type {number} - */ - this.winsSolo = data.wins_solo_normal || 0; - /** - * Team wins - * @type {number} - */ - this.winsTeam = data.wins_teams || 0; - /** - * Games Played - * @type {number} - */ - this.gamesPlayed = data.games_played || 0; - /** - * Losses - * @type {number} - */ - this.losses = this.gamesPlayed - this.wins; - /** - * Win Loss ratio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - /** - * Arrows Shot - * @type {number} - */ - this.arrowsShot = data.arrows_fired || 0; - /** - * Arrows Hit - * @type {number} - */ - this.arrowsHit = data.arrows_hit || 0; - /** - * Bow Accuracy - * @type {number} - */ - this.bowAccuracy = divide(this.arrowsHit, this.arrowsShot); - /** - * Damage Delt - * @type {number} - */ - this.damage = data.damage || 0; - /** - * Damage Taken - * @type {number} - */ - this.damageTaken = data.damage_taken || 0; - /** - * Potions Drunk - * @type {number} - */ - this.potionsDrunk = data.potions_drunk || 0; - /** - * Potions Thrown - * @type {number} - */ - this.potionsThrown = data.potions_thrown || 0; - /** - * Mobs Spawned - * @type {number} - */ - this.mobsSpawned = data.mobs_spawned || 0; - /** - * Time Played (In seconds) - * @type {number} - */ - this.playTime = data.time_played || 0; - /** - * Blitz Uses - * @type {number} - */ - this.blitzUses = data.blitz_uses || 0; - /** - * Chests Opened - * @type {number} - */ - this.chestsOpened = data.chests_opened || 0; - - /** - * Archer Kit Stats - * @type {BlitzSGKit} - */ - this.archer = new BlitzSGKit(data, 'archer'); - /** - * Meatmaster Kit Stats - * @type {BlitzSGKit} - */ - this.meatmaster = new BlitzSGKit(data, 'meatmaster'); - /** - * Speleologist Kit Stats - * @type {BlitzSGKit} - */ - this.speleologist = new BlitzSGKit(data, 'speleologist'); - /** - * Baker Kit Stats - * @type {BlitzSGKit} - */ - this.baker = new BlitzSGKit(data, 'baker'); - /** - * Knight Kit Stats - * @type {BlitzSGKit} - */ - this.knight = new BlitzSGKit(data, 'knight'); - /** - * Guardian Kit Stats - * @type {BlitzSGKit} - */ - this.guardian = new BlitzSGKit(data, 'guardian'); - /** - * Scout Kit Stats - * @type {BlitzSGKit} - */ - this.scout = new BlitzSGKit(data, 'scout'); - /** - * Hunter Kit Stats - * @type {BlitzSGKit} - */ - this.hunter = new BlitzSGKit(data, 'hunter'); - /** - * Hype Train Kit Stats - * @type {BlitzSGKit} - */ - this.hypeTrain = new BlitzSGKit(data, 'hype train'); - /** - * Fisherman Kit Stats - * @type {BlitzSGKit} - */ - this.fisherman = new BlitzSGKit(data, 'fisherman'); - /** - * Armorer Kit Stats - * @type {BlitzSGKit} - */ - this.armorer = new BlitzSGKit(data, 'armorer'); - /** - * Horsetamer Kit Stats - * @type {BlitzSGKit} - */ - this.horsetamer = new BlitzSGKit(data, 'horsetamer'); - /** - * Astronaut Kit Stats - * @type {BlitzSGKit} - */ - this.astronaut = new BlitzSGKit(data, 'astronaut'); - /** - * Troll Kit Stats - * @type {BlitzSGKit} - */ - this.troll = new BlitzSGKit(data, 'troll'); - /** - * Reaper Kit Stats - * @type {BlitzSGKit} - */ - this.reaper = new BlitzSGKit(data, 'reaper'); - /** - * Shark Kit Stats - * @type {BlitzSGKit} - */ - this.shark = new BlitzSGKit(data, 'shark'); - /** - * Reddragon Kit Stats - * @type {BlitzSGKit} - */ - this.reddragon = new BlitzSGKit(data, 'reddragon'); - /** - * Toxicologist Kit Stats - * @type {BlitzSGKit} - */ - this.toxicologist = new BlitzSGKit(data, 'toxicologist'); - /** - * Rogue Kit Stats - * @type {BlitzSGKit} - */ - this.rogue = new BlitzSGKit(data, 'rogue'); - /** - * Warlock Kit Stats - * @type {BlitzSGKit} - */ - this.warlock = new BlitzSGKit(data, 'warlock'); - /** - * Slimeyslime Kit Stats - * @type {BlitzSGKit} - */ - this.slimeyslime = new BlitzSGKit(data, 'slimeyslime'); - /** - * Jockey Kit Stats - * @type {BlitzSGKit} - */ - this.jockey = new BlitzSGKit(data, 'jockey'); - /** - * Golem Kit Stats - * @type {BlitzSGKit} - */ - this.golem = new BlitzSGKit(data, 'golem'); - /** - * Viking Kit Stats - * @type {BlitzSGKit} - */ - this.viking = new BlitzSGKit(data, 'viking'); - /** - * Shadow Knight Kit Stats - * @type {BlitzSGKit} - */ - this.shadowKnight = new BlitzSGKit(data, 'shadow knight'); - /** - * Pigman Kit Stats - * @type {BlitzSGKit} - */ - this.pigman = new BlitzSGKit(data, 'pigman'); - /** - * Paladin Kit Stats - * @type {BlitzSGKit} - */ - this.paladin = new BlitzSGKit(data, 'paladin'); - /** - * Necromancer Kit Stats - * @type {BlitzSGKit} - */ - this.necromancer = new BlitzSGKit(data, 'necromancer'); - /** - * Florist Kit Stats - * @type {BlitzSGKit} - */ - this.florist = new BlitzSGKit(data, 'florist'); - /** - * Diver Kit Stats - * @type {BlitzSGKit} - */ - this.diver = new BlitzSGKit(data, 'diver'); - /** - * Arachnologist Kit Stats - * @type {BlitzSGKit} - */ - this.arachnologist = new BlitzSGKit(data, 'arachnologist'); - /** - * Blaze Kit Stats - * @type {BlitzSGKit} - */ - this.blaze = new BlitzSGKit(data, 'blaze'); - /** - * Wolftamer Kit Stats - * @type {BlitzSGKit} - */ - this.wolftamer = new BlitzSGKit(data, 'wolftamer'); - /** - * Tim Kit Stats - * @type {BlitzSGKit} - */ - this.tim = new BlitzSGKit(data, 'tim'); - /** - * Farmer Kit Stats - * @type {BlitzSGKit} - */ - this.farmer = new BlitzSGKit(data, 'farmer'); - /** - * Creepertamer Kit Stats - * @type {BlitzSGKit} - */ - this.creepertamer = new BlitzSGKit(data, 'creepertamer'); - /** - * Snowman Kit Stats - * @type {BlitzSGKit} - */ - this.snowman = new BlitzSGKit(data, 'snowman'); - } -} - -module.exports = BlitzSurvivalGames; diff --git a/src/structures/MiniGames/BuildBattle.js b/src/structures/MiniGames/BuildBattle.js deleted file mode 100644 index 6761e8a7e..000000000 --- a/src/structures/MiniGames/BuildBattle.js +++ /dev/null @@ -1,64 +0,0 @@ -const divide = require('../../utils/divide'); -/** - * BuildBattle class - */ -class BuildBattle { - /** - * @param {object} data BuildBattle data - */ - constructor(data) { - /** - * Score - * @type {number} - */ - this.score = data.score || 0; - /** - * Total wins - * @type {number} - */ - this.totalWins = data.wins || 0; - /** - * Played games - * @type {number} - */ - this.games = data.games_played || 0; - /** - * Win Loss ratio - * @type {number} - */ - this.WLRatio = divide(this.totalWins, this.games); - /** - * Amount of super votes the player has - * @type {number} - */ - this.superVotes = data.super_votes || 0; - /** - * Coins - * @type {number} - */ - this.coins = data.coins || 0; - /** - * Total votes - * @type {number} - */ - this.totalVotes = data.total_votes || 0; - /** - * Wins for each mode - * @type {BuildBattleWins} - */ - this.wins = { - solo: data.wins_solo_normal || 0, - teams: data.wins_teams_normal || 0, - pro: data.wins_solo_pro || 0, - gtb: data.wins_guess_the_build || 0 - }; - } -} -/** - * @typedef {object} BuildBattleWins - * @property {number} solo BuildBattle Solo wins - * @property {number} teams BuildBattle Team wins - * @property {number} pro BuildBattle Pro wins - * @property {number} gtb BuildBattle Guess The Build wins - */ -module.exports = BuildBattle; diff --git a/src/structures/MiniGames/CopsAndCrims.js b/src/structures/MiniGames/CopsAndCrims.js deleted file mode 100644 index 3437713c3..000000000 --- a/src/structures/MiniGames/CopsAndCrims.js +++ /dev/null @@ -1,318 +0,0 @@ -const divide = require('../../utils/divide'); -/** - * Cops and crims Defusal class - */ -class CopsAndCrimsDefusal { - /** - * @param {object} data Cops and crims data - - */ - constructor(data) { - /** - * Kills - * @type {number} - */ - this.kills = data.kills || 0; - /** - * Headshot kills - * @type {number} - */ - this.headshotKills = data.headshot_kills || 0; - /** - * Assists - * @type {number} - */ - this.assists = data.assists || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data.deaths || 0; - /** - * Kill Death ratio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Wins - * @type {number} - */ - this.wins = data.game_wins || 0; - /** - * Games played - * @type {number} - */ - this.gamesPlayed = data.game_plays || 0; - /** - * Losses - * @type {number} - */ - this.losses = this.gamesPlayed - this.wins; - /** - * Win Loss ratio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - /** - * Round wins - * @type {number} - */ - this.roundWins = data.round_wins || 0; - /** - * Shows fired - * @type {number} - */ - this.shotsFired = data.shots_fired || 0; - /** - * Bombs defused - * @type {number} - */ - this.bombsDefused = data.bombs_defused || 0; - /** - * Bombs planted - * @type {number} - */ - this.bombsPlanted = data.bombs_planted || 0; - /** - * Kills as Crim - * @type {number} - */ - this.killsAsCrim = data.criminal_kills || 0; - /** - * Kills as Cop - * @type {number} - */ - this.killsAsCop = data.cop_kills || 0; - } -} -/** - * Cops and crims Deathmatch class - */ -class CopsAndCrimsDeathmatch { - /** - * @param {object} data Cops and crims data - - */ - constructor(data) { - /** - * Kills - * @type {number} - */ - this.kills = data.kills_deathmatch || 0; - /** - * Assists - * @type {number} - */ - this.assists = data.assists_deathmatch || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data.deaths_deathmatch || 0; - /** - * Kill Death ratio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Wins - * @type {number} - */ - this.wins = data.game_wins_deathmatch || 0; - /** - * Games played - * @type {number} - */ - this.gamesPlayed = data.game_plays_deathmatch || 0; - /** - * Losses - * @type {number} - */ - this.losses = this.gamesPlayed - this.wins; - /** - * Win Loss ratio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - /** - * Kills as Crim - * @type {number} - */ - this.killsAsCrim = data.criminal_kills_deathmatch || 0; - /** - * Kills as Cop - * @type {number} - */ - this.killsAsCop = data.cop_kills_deathmatch || 0; - } -} -/** - * Cops and crims Gun Game class - */ -class CopsAndCrimsGunGame { - /** - * @param {object} data Cops and crims data - - */ - constructor(data) { - /** - * Kills - * @type {number} - */ - this.kills = data.kills_gungame || 0; - /** - * Assists - * @type {number} - */ - this.assists = data.assists_gungame || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data.deaths_gungame || 0; - /** - * Kill Death ratio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Wins - * @type {number} - */ - this.wins = data.game_wins_gungame || 0; - /** - * Games played - * @type {number} - */ - this.gamesPlayed = data.game_plays_gungame || 0; - /** - * Losses - * @type {number} - */ - this.losses = this.gamesPlayed - this.wins; - /** - * Win Loss ratio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - /** - * Kills as Crim - * @type {number} - */ - this.killsAsCrim = data.criminal_kills_gungame || 0; - /** - * Kills as Cop - * @type {number} - */ - this.killsAsCop = data.cop_kills_gungame || 0; - /** - * Fastest Win - * ! WARNING This number is most likely wrong as it can be negative - * @type {number} - */ - this.fastestWin = data.fastest_win_gungame || 0; - } -} -/** - * Cops and crims class - */ -class CopsAndCrims { - /** - * @param {object} data Cops and crims data - - */ - constructor(data) { - /** - * Defusal stats - * @type {CopsAndCrimsDefusal} - */ - this.defusal = new CopsAndCrimsDefusal(data); - /** - * Deathmatch stats - * @type {CopsAndCrimsDeathmatch} - */ - this.deathmath = new CopsAndCrimsDeathmatch(data); - /** - * Gun Game stats - * @type {CopsAndCrimsGunGame} - */ - this.gunGame = new CopsAndCrimsGunGame(data); - /** - * Coins - * @type {number} - */ - this.coins = data.coins || 0; - /** - * Kills - * @type {number} - */ - this.kills = this.defusal.kills + this.deathmath.kills + this.gunGame.kills; - /** - * Assists - * @type {number} - */ - this.assists = this.defusal.assists + this.deathmath.assists + this.gunGame.assists; - /** - * Deaths - * @type {number} - */ - this.deaths = this.defusal.deaths + this.deathmath.deaths + this.gunGame.deaths; - /** - * Kill Death ratio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Wins - * @type {number} - */ - this.wins = this.defusal.wins + this.deathmath.wins + this.gunGame.wins; - /** - * Games played - * @type {number} - */ - this.gamesPlayed = this.defusal.gamesPlayed + this.deathmath.gamesPlayed + this.gunGame.gamesPlayed; - /** - * Losses - * @type {number} - */ - this.losses = this.gamesPlayed - this.wins; - /** - * Win Loss ratio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - /** - * Kills as Crim - * @type {number} - */ - this.killsAsCrim = this.defusal.killsAsCrim + this.deathmath.killsAsCrim + this.gunGame.killsAsCrim; - /** - * Kills as Cop - * @type {number} - */ - this.killsAsCop = this.defusal.killsAsCop + this.deathmath.killsAsCop + this.gunGame.killsAsCop; - /** - * Prefix Color - * @type {string} - */ - this.prefixColor = data.lobbyPrefixColor || ''; - /** - * Show Prefix - * @type {boolean} - */ - this.showPrefix = data.show_lobby_prefix || false; - /** - * Selected Prefix - * @type {string} - */ - this.selectedPrefix = data.selected_lobby_prefix || ''; - /** - * Kills In Prefix - * @type {boolean} - */ - this.killsInPrefix = data.show_kills_in_prefix || false; - } -} - -module.exports = CopsAndCrims; diff --git a/src/structures/MiniGames/Duels.js b/src/structures/MiniGames/Duels.js deleted file mode 100644 index f9ce96145..000000000 --- a/src/structures/MiniGames/Duels.js +++ /dev/null @@ -1,1013 +0,0 @@ -const { duelsDivisions } = require('../../utils/Constants'); -const romanize = require('../../utils/romanize'); -const divide = require('../../utils/divide'); - -// eslint-disable-next-line jsdoc/require-jsdoc -function getTitle(data, mode = null) { - for (const div of duelsDivisions.slice().reverse()) { - const prestige = data[`${mode ? mode : 'all_modes'}_${div.key}_title_prestige`]; - if (prestige) { - return `${div.name} ${romanize(prestige)}`; - } - } - return null; -} - -class DuelsGamemode { - /** - * @param {object} data Duels data - */ - constructor(data, mode, title = '') { - /** - * Title - * @type {string} - */ - this.title = title; - /** - * Winstreak - * @type {number} - */ - this.winstreak = data[`current_winstreak_mode_${mode}`] || 0; - /** - * Best Winstreak - * @type {number} - */ - this.bestWinstreak = data[`best_winstreak_mode_${mode}`] || 0; - /** - * Kills - * @type {number} - */ - this.kills = data[`${mode}_kills`] || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data[`${mode}_deaths`] || 0; - /** - * KDRatio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Wins - * @type {number} - */ - this.wins = data[`${mode}_wins`] || 0; - /** - * Losses - * @type {number} - */ - this.losses = data[`${mode}_losses`] || 0; - /** - * WLRatio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - /** - * Played Games - * @type {number} - */ - this.playedGames = data[`${mode}_rounds_played`] || 0; - /** - * Swings - * @type {number} - */ - this.swings = data[`${mode}_melee_swings`] || 0; - /** - * Hits - * @type {number} - */ - this.hits = data[`${mode}_melee_hits`] || 0; - /** - * Melee Accuracy - * @type {number} - */ - this.meleeAccuracy = divide(this.swings, this.hits); - /** - * Bow Shots - * @type {number} - */ - this.bowShots = data[`${mode}_bow_shots`] || 0; - /** - * Bow Hits - * @type {number} - */ - this.bowHits = data[`${mode}_bow_hits`] || 0; - /** - * Bow Accuracy - * @type {number} - */ - this.bowAccuracy = divide(this.bowShots, this.bowHits); - /** - * Blocks Placed - * @type {number} - */ - this.blocksPlaced = data[`${mode}_blocks_placed`] || 0; - /** - * Health Regenerated - * @type {number} - */ - this.healthRegenerated = data[`${mode}_health_regenerated`] || 0; - /** - * Golden Apples Eatan - * @type {number} - */ - this.goldenApplesEatan = data[`${mode}_golden_apples_eaten`] || 0; - /** - * Goals (only shows up in bridge) - * @type {number} - */ - this.goals = data[`${mode}_goals`] || 0; - } -} - -class DuelsUHC { - /** - * @param {object} data Duels data - */ - constructor(data) { - /** - * Title - * @type {string} - */ - this.title = getTitle(data, 'uhc'); - /** - * Winstreak - * @type {number} - */ - this.winstreak = data.current_uhc_winstreak || 0; - /** - * Best Winstreak - * @type {number} - */ - this.bestWinstreak = data.best_uhc_winstreak || 0; - /** - * Solo Game Mode Stats - * @type {DuelsGamemode} - */ - this.solo = new DuelsGamemode(data, 'uhc_duel', this.title); - /** - * Doubles Game Mode Stats - * @type {DuelsGamemode} - */ - this.doubles = new DuelsGamemode(data, 'uhc_doubles', this.title); - /** - * Fours Game Mode Stats - * @type {DuelsGamemode} - */ - this.fours = new DuelsGamemode(data, 'uhc_four', this.title); - /** - * Deathmatch Game Mode Stats - * @type {DuelsGamemode} - */ - this.deathmatch = new DuelsGamemode(data, 'uhc_meetup', this.title); - /** - * Kills - * @type {number} - */ - this.kills = this.solo.kills + this.doubles.kills + this.fours.kills + this.deathmatch.kills; - /** - * Deaths - * @type {number} - */ - this.deaths = this.solo.deaths + this.doubles.deaths + this.fours.deaths + this.deathmatch.deaths; - /** - * KDRatio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Wins - * @type {number} - */ - this.wins = this.solo.wins + this.doubles.wins + this.fours.wins + this.deathmatch.wins; - /** - * Losses - * @type {number} - */ - this.losses = this.solo.losses + this.doubles.losses + this.fours.losses + this.deathmatch.losses; - /** - * WLRatio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - /** - * Played Games - * @type {number} - */ - this.playedGames = - this.solo.playedGames + this.doubles.playedGames + this.fours.playedGames + this.deathmatch.playedGames; - /** - * Swings - * @type {number} - */ - this.swings = this.solo.swings + this.doubles.swings + this.fours.swings + this.deathmatch.swings; - /** - * Hits - * @type {number} - */ - this.hits = this.solo.hits + this.doubles.hits + this.fours.hits + this.deathmatch.hits; - /** - * Melee Accuracy - * @type {number} - */ - this.meleeAccuracy = divide(this.hits, this.swings); - /** - * Bow Shots - * @type {number} - */ - this.bowShots = this.solo.bowShots + this.doubles.bowShots + this.fours.bowShots + this.deathmatch.bowShots; - /** - * Bow Hits - * @type {number} - */ - this.bowHits = this.solo.bowHits + this.doubles.bowHits + this.fours.bowHits + this.deathmatch.bowHits; - /** - * Bow Accuracy - * @type {number} - */ - this.bowAccuracy = divide(this.bowHits, this.bowShots); - /** - * Blocks Placed - * @type {number} - */ - this.blocksPlaced = - this.solo.blocksPlaced + this.doubles.blocksPlaced + this.fours.blocksPlaced + this.deathmatch.blocksPlaced; - /** - * Health Regenerated - * @type {number} - */ - this.healthRegenerated = - this.solo.healthRegenerated + - this.doubles.healthRegenerated + - this.fours.healthRegenerated + - this.deathmatch.healthRegenerated; - /** - * Golden Apples Eatan - * @type {number} - */ - this.goldenApplesEatan = - this.solo.goldenApplesEatan + - this.doubles.goldenApplesEatan + - this.fours.goldenApplesEatan + - this.deathmatch.goldenApplesEatan; - } -} -class DuelsSkyWars { - /** - * @param {object} data Duels data - */ - constructor(data) { - /** - * Title - * @type {string} - */ - this.title = getTitle(data, 'sw'); - /** - * Winstreak - * @type {number} - */ - this.winstreak = data.current_sw_winstreak || 0; - /** - * Best Winstreak - * @type {number} - */ - this.bestWinstreak = data.best_sw_winstreak || 0; - /** - * Solo Game Mode Stats - * @type {DuelsGamemode} - */ - this.solo = new DuelsGamemode(data, 'sw_duel', this.title); - /** - * Doubles Game Mode Stats - * @type {DuelsGamemode} - */ - this.doubles = new DuelsGamemode(data, 'sw_doubles', this.title); - /** - * Kills - * @type {number} - */ - this.kills = this.solo.kills + this.doubles.kills; - /** - * Deaths - * @type {number} - */ - this.deaths = this.solo.deaths + this.doubles.deaths; - /** - * KDRatio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Wins - * @type {number} - */ - this.wins = this.solo.wins + this.doubles.wins; - /** - * Losses - * @type {number} - */ - this.losses = this.solo.losses + this.doubles.losses; - /** - * WLRatio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - /** - * Played Games - * @type {number} - */ - this.playedGames = this.solo.playedGames + this.doubles.playedGames; - /** - * Swings - * @type {number} - */ - this.swings = this.solo.swings + this.doubles.swings; - /** - * Hits - * @type {number} - */ - this.hits = this.solo.hits + this.doubles.hits; - /** - * Melee Accuracy - * @type {number} - */ - this.meleeAccuracy = divide(this.hits, this.swings); - /** - * Bow Shots - * @type {number} - */ - this.bowShots = this.solo.bowShots + this.doubles.bowShots; - /** - * Bow Hits - * @type {number} - */ - this.bowHits = this.solo.bowHits + this.doubles.bowHits; - /** - * Bow Accuracy - * @type {number} - */ - this.bowAccuracy = divide(this.bowHits, this.bowShots); - /** - * Blocks Placed - * @type {number} - */ - this.blocksPlaced = this.solo.blocksPlaced + this.doubles.blocksPlaced; - /** - * Health Regenerated - * @type {number} - */ - this.healthRegenerated = this.solo.healthRegenerated + this.doubles.healthRegenerated; - /** - * Golden Apples Eatan - * @type {number} - */ - this.goldenApplesEatan = this.solo.goldenApplesEatan + this.doubles.goldenApplesEatan; - } -} -class DuelsMegaWalls { - /** - * @param {object} data Duels data - */ - constructor(data) { - /** - * Title - * @type {string} - */ - this.title = getTitle(data, 'mega_walls'); - /** - * Winstreak - * @type {number} - */ - this.winstreak = data.current_mega_walls_winstreak || 0; - /** - * Best Winstreak - * @type {number} - */ - this.bestWinstreak = data.best_mega_walls_winstreak || 0; - /** - * Solo Game Mode Stats - * @type {DuelsGamemode} - */ - this.solo = new DuelsGamemode(data, 'mw_duel', this.title); - /** - * Doubles Game Mode Stats - * @type {DuelsGamemode} - */ - this.doubles = new DuelsGamemode(data, 'mw_doubles', this.title); - /** - * Kills - * @type {number} - */ - this.kills = this.solo.kills + this.doubles.kills; - /** - * Deaths - * @type {number} - */ - this.deaths = this.solo.deaths + this.doubles.deaths; - /** - * KDRatio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Wins - * @type {number} - */ - this.wins = this.solo.wins + this.doubles.wins; - /** - * Losses - * @type {number} - */ - this.losses = this.solo.losses + this.doubles.losses; - /** - * WLRatio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - /** - * Played Games - * @type {number} - */ - this.playedGames = this.solo.playedGames + this.doubles.playedGames; - /** - * Swings - * @type {number} - */ - this.swings = this.solo.swings + this.doubles.swings; - /** - * Hits - * @type {number} - */ - this.hits = this.solo.hits + this.doubles.hits; - /** - * Melee Accuracy - * @type {number} - */ - this.meleeAccuracy = divide(this.hits, this.swings); - /** - * Bow Shots - * @type {number} - */ - this.bowShots = this.solo.bowShots + this.doubles.bowShots; - /** - * Bow Hits - * @type {number} - */ - this.bowHits = this.solo.bowHits + this.doubles.bowHits; - /** - * Bow Accuracy - * @type {number} - */ - this.bowAccuracy = divide(this.bowHits, this.bowShots); - /** - * Blocks Placed - * @type {number} - */ - this.blocksPlaced = this.solo.blocksPlaced + this.doubles.blocksPlaced; - /** - * Health Regenerated - * @type {number} - */ - this.healthRegenerated = this.solo.healthRegenerated + this.doubles.healthRegenerated; - /** - * Golden Apples Eatan - * @type {number} - */ - this.goldenApplesEatan = this.solo.goldenApplesEatan + this.doubles.goldenApplesEatan; - } -} -class DuelsOP { - /** - * @param {object} data Duels data - */ - constructor(data) { - /** - * Title - * @type {string} - */ - this.title = getTitle(data, 'op'); - /** - * Winstreak - * @type {number} - */ - this.winstreak = data.current_op_winstreak || 0; - /** - * Best Winstreak - * @type {number} - */ - this.bestWinstreak = data.best_op_winstreak || 0; - /** - * Solo Game Mode Stats - * @type {DuelsGamemode} - */ - this.solo = new DuelsGamemode(data, 'op_duel', this.title); - /** - * Doubles Game Mode Stats - * @type {DuelsGamemode} - */ - this.doubles = new DuelsGamemode(data, 'op_doubles', this.title); - /** - * Kills - * @type {number} - */ - this.kills = this.solo.kills + this.doubles.kills; - /** - * Deaths - * @type {number} - */ - this.deaths = this.solo.deaths + this.doubles.deaths; - /** - * KDRatio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Wins - * @type {number} - */ - this.wins = this.solo.wins + this.doubles.wins; - /** - * Losses - * @type {number} - */ - this.losses = this.solo.losses + this.doubles.losses; - /** - * WLRatio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - /** - * Played Games - * @type {number} - */ - this.playedGames = this.solo.playedGames + this.doubles.playedGames; - /** - * Swings - * @type {number} - */ - this.swings = this.solo.swings + this.doubles.swings; - /** - * Hits - * @type {number} - */ - this.hits = this.solo.hits + this.doubles.hits; - /** - * Melee Accuracy - * @type {number} - */ - this.meleeAccuracy = divide(this.hits, this.swings); - /** - * Bow Shots - * @type {number} - */ - this.bowShots = this.solo.bowShots + this.doubles.bowShots; - /** - * Bow Hits - * @type {number} - */ - this.bowHits = this.solo.bowHits + this.doubles.bowHits; - /** - * Bow Accuracy - * @type {number} - */ - this.bowAccuracy = divide(this.bowHits, this.bowShots); - /** - * Blocks Placed - * @type {number} - */ - this.blocksPlaced = this.solo.blocksPlaced + this.doubles.blocksPlaced; - /** - * Health Regenerated - * @type {number} - */ - this.healthRegenerated = this.solo.healthRegenerated + this.doubles.healthRegenerated; - /** - * Golden Apples Eatan - * @type {number} - */ - this.goldenApplesEatan = this.solo.goldenApplesEatan + this.doubles.goldenApplesEatan; - } -} -class DuelsBridge { - /** - * @param {object} data Duels data - */ - constructor(data) { - /** - * Title - * @type {string} - */ - this.title = getTitle(data, 'bridge'); - /** - * Winstreak - * @type {number} - */ - this.winstreak = data.current_bridge_winstreak || 0; - /** - * Best Winstreak - * @type {number} - */ - this.bestWinstreak = data.best_bridge_winstreak || 0; - /** - * Solo Game Mode Stats - * @type {DuelsGamemode} - */ - this.solo = new DuelsGamemode(data, 'bridge_duel', this.title); - /** - * Doubles Game Mode Stats - * @type {DuelsGamemode} - */ - this.doubles = new DuelsGamemode(data, 'bridge_doubles', this.title); - /** - * Threes Game Mode Stats - * @type {DuelsGamemode} - */ - this.threes = new DuelsGamemode(data, 'bridge_threes', this.title); - /** - * Fours Game Mode Stats - * @type {DuelsGamemode} - */ - this.fours = new DuelsGamemode(data, 'bridge_fours', this.title); - /** - * 2v2v2v2 Game Mode Stats - * @type {DuelsGamemode} - */ - this['2v2v2v2'] = new DuelsGamemode(data, '2v2v2v2', this.title); - /** - * 3v3v3v3 Game Mode Stats - * @type {DuelsGamemode} - */ - this['3v3v3v3'] = new DuelsGamemode(data, '3v3v3v3', this.title); - /** - * Capture The Flag Game Mode Stats - * @type {DuelsGamemode} - */ - this.ctf = new DuelsGamemode(data, 'capture_threes', this.title); - /** - * Kills - * @type {number} - */ - this.kills = - this.solo.kills + - this.doubles.kills + - this.threes.kills + - this.fours.kills + - this['2v2v2v2'].kills + - this['3v3v3v3'].kills + - this.ctf.kills; - /** - * Deaths - * @type {number} - */ - this.deaths = - this.solo.deaths + - this.doubles.deaths + - this.threes.deaths + - this.fours.deaths + - this['2v2v2v2'].deaths + - this['3v3v3v3'].deaths + - this.ctf.deaths; - /** - * KDRatio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Wins - * @type {number} - */ - this.wins = - this.solo.wins + - this.doubles.wins + - this.threes.wins + - this.fours.wins + - this['2v2v2v2'].wins + - this['3v3v3v3'].wins + - this.ctf.wins; - /** - * Losses - * @type {number} - */ - this.losses = - this.solo.losses + - this.doubles.losses + - this.threes.losses + - this.fours.losses + - this['2v2v2v2'].losses + - this['3v3v3v3'].losses + - this.ctf.losses; - /** - * WLRatio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - /** - * Played Games - * @type {number} - */ - this.playedGames = - this.solo.playedGames + - this.doubles.playedGames + - this.threes.playedGames + - this.fours.playedGames + - this['2v2v2v2'].playedGames + - this['3v3v3v3'].playedGames + - this.ctf.playedGames; - /** - * Swings - * @type {number} - */ - this.swings = - this.solo.swings + - this.doubles.swings + - this.threes.swings + - this.fours.swings + - this['2v2v2v2'].swings + - this['3v3v3v3'].swings + - this.ctf.swings; - /** - * Hits - * @type {number} - */ - this.hits = - this.solo.hits + - this.doubles.hits + - this.threes.hits + - this.fours.hits + - this['2v2v2v2'].hits + - this['3v3v3v3'].hits + - this.ctf.hits; - /** - * Melee Accuracy - * @type {number} - */ - this.meleeAccuracy = divide(this.hits, this.swings); - /** - * Bow Shots - * @type {number} - */ - this.bowShots = - this.solo.bowShots + - this.doubles.bowShots + - this.threes.bowShots + - this.fours.bowShots + - this['2v2v2v2'].bowShots + - this['3v3v3v3'].bowShots + - this.ctf.bowShots; - /** - * Bow Hits - * @type {number} - */ - this.bowHits = - this.solo.bowHits + - this.doubles.bowHits + - this.threes.bowHits + - this.fours.bowHits + - this['2v2v2v2'].bowHits + - this['3v3v3v3'].bowHits + - this.ctf.bowHits; - /** - * Bow Accuracy - * @type {number} - */ - this.bowAccuracy = divide(this.bowHits, this.bowShots); - /** - * Blocks Placed - * @type {number} - */ - this.blocksPlaced = - this.solo.blocksPlaced + - this.doubles.blocksPlaced + - this.threes.blocksPlaced + - this.fours.blocksPlaced + - this['2v2v2v2'].blocksPlaced + - this['3v3v3v3'].blocksPlaced + - this.ctf.blocksPlaced; - /** - * Health Regenerated - * @type {number} - */ - this.healthRegenerated = - this.solo.healthRegenerated + - this.doubles.healthRegenerated + - this.threes.healthRegenerated + - this.fours.healthRegenerated + - this['2v2v2v2'].healthRegenerated + - this['3v3v3v3'].healthRegenerated + - this.ctf.healthRegenerated; - /** - * Golden Apples Eatan - * @type {number} - */ - this.goldenApplesEatan = - this.solo.goldenApplesEatan + - this.doubles.goldenApplesEatan + - this.threes.goldenApplesEatan + - this.fours.goldenApplesEatan + - this['2v2v2v2'].goldenApplesEatan + - this['3v3v3v3'].goldenApplesEatan + - this.ctf.goldenApplesEatan; - /** - * Goals - * @type {number} - */ - this.goals = - this.solo.goals + - this.doubles.goals + - this.threes.goals + - this.fours.goals + - this['2v2v2v2'].goals + - this['3v3v3v3'].goals + - this.ctf.goals; - } -} - -/** - * Duels class - */ -class Duels { - /** - * @param {object} data Duels data - */ - constructor(data) { - /** - * Tokens - * @type {number} - */ - this.tokens = data.coins || 0; - /** - * All modes Title - * @type {string|null} - */ - this.title = getTitle(data); - /** - * Kills - * @type {number} - */ - this.kills = data.kills || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data.deaths || 0; - /** - * Kill Death ratio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Wins - * @type {number} - */ - this.wins = data.wins || 0; - /** - * Losses - * @type {number} - */ - this.losses = data.losses || 0; - /** - * Win Loss ratio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - /** - * Played games - * @type {number} - */ - this.playedGames = data.games_played_duels || 0; - /** - * Current winstreak - * @type {number} - */ - this.winstreak = data.current_winstreak || 0; - /** - * Best overall winstreak - * @type {number} - */ - this.bestWinstreak = data.best_overall_winstreak || 0; - /** - * Ping Range Preference - * @type {number} - */ - this.ping = data.pingPreference || 0; - /** - * Blocks Placed - * @type {number} - */ - this.blocksPlaced = data.blocks_placed || 0; - /** - * Swings - * @type {number} - */ - this.swings = data.melee_swings || 0; - /** - * Hits - * @type {number} - */ - this.hits = data.melee_hits || 0; - /** - * Melee Accuracy - * @type {number} - */ - this.meleeAccuracy = divide(this.hits, this.swings); - /** - * Bow Shots - * @type {number} - */ - this.bowShots = data.bow_shots || 0; - /** - * Bow Hits - * @type {number} - */ - this.bowHits = data.bow_hits || 0; - /** - * Bow Accuracy - * @type {number} - */ - this.bowAccuracy = divide(this.bowHits, this.bowShots); - /** - * Health Regenerated - * @type {number} - */ - this.healthRegenerated = data.health_regenerated || 0; - /** - * Golden Apples Eaten - * @type {number} - */ - this.goldenApplesEatan = data.golden_apples_eaten || 0; - /** - * UHC duels stats - * @type {DuelsUHC} - */ - this.uhc = new DuelsUHC(data); - - /** - * SkyWars duels stats - * @type {DuelsSkyWars} - */ - this.skywars = new DuelsSkyWars(data); - /** - * MegaWalls duels stats - * @type {DuelsMegaWalls} - */ - this.megawalls = new DuelsMegaWalls(data); - /** - * Blitz duel stats - * @type {DuelsGamemode} - */ - this.blitz = new DuelsGamemode(data, 'blitz_duel', getTitle(data, 'blitz')); - /** - * OP duels stats - * @type {DuelsOP} - */ - this.op = new DuelsOP(data); - /** - * Classic duels stats - * @type {DuelsGamemode} - */ - this.classic = new DuelsGamemode(data, 'classic_duel', getTitle(data, 'classic')); - /** - * Bow duels stats - * @type {DuelsGamemode} - */ - this.bow = new DuelsGamemode(data, 'bow_duel', getTitle(data, 'bow')); - /** - * No Debuff duels stats - * @type {DuelsGamemode} - */ - this.noDebuff = new DuelsGamemode(data, 'potion_duel', getTitle(data, 'no_debuff')); - /** - * Combo duels stats - * @type {DuelsGamemode} - */ - this.combo = new DuelsGamemode(data, 'combo_duel', getTitle(data, 'combo')); - /** - * Bow Spleef duels stats - * @type {DuelsGamemode} - */ - this.bowSpleef = new DuelsGamemode(data, 'bowspleef_duel', getTitle(data, 'tnt_games')); - /** - * Sumo duels stats - * @type {DuelsGamemode} - */ - this.sumo = new DuelsGamemode(data, 'sumo_duel', getTitle(data, 'sumo')); - /** - * Bridge duels stats - * @type {DuelsBridge} - */ - this.bridge = new DuelsBridge(data); - /** - * Parkour duels stats - * @type {DuelsGamemode} - */ - this.parkour = new DuelsGamemode(data, 'parkour_eight', getTitle(data, 'parkour')); - /** - * Arena duels stats - * @type {DuelsGamemode} - */ - this.arena = new DuelsGamemode(data, 'duel_arena'); - } -} - -module.exports = Duels; diff --git a/src/structures/MiniGames/MegaWalls.js b/src/structures/MiniGames/MegaWalls.js deleted file mode 100644 index 5953df25c..000000000 --- a/src/structures/MiniGames/MegaWalls.js +++ /dev/null @@ -1,478 +0,0 @@ -const divide = require('../../utils/divide'); - -class MegaWallsModeStats { - /** - * @param {object} data MegaWalls data - * @param {string} mode MegaWalls Mode - * @param {string} kit MegaWalls Kit - */ - constructor(data, mode, kit) { - if (kit) kit = `${kit}_`; - /** - * Kills - * @type {number} - */ - this.kills = data[`${kit}kills_${mode}`] || 0; - /** - * Assists - * @type {number} - */ - this.assists = data[`${kit}assists_${mode}`] || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data[`${kit}deaths_${mode}`] || 0; - /** - * Kill Death ratio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Wins - * @type {number} - */ - this.wins = data[`${kit}wins_${mode}`] || 0; - /** - * Losses - * @type {number} - */ - this.losses = data[`${kit}losses_${mode}`] || 0; - /** - * Win Loss ratio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - /** - * Final kills - * @type {number} - */ - this.finalKills = data[`${kit}final_kills_${mode}`] || 0; - /** - * Final assists - * @type {number} - */ - this.finalAssists = data[`${kit}final_assists_${mode}`] || 0; - /** - * Final deaths - * @type {number} - */ - this.finalDeaths = data[`${kit}final_deaths_${mode}`] || 0; - /** - * Final Kill Death ratio - * @type {number} - */ - this.finalKDRatio = divide(this.finalKills, this.finalDeaths); - /** - * Played games - * @type {number} - */ - this.playedGames = data[`${kit}games_played_${mode}`] || 0; - /** - * Wither damage - * @type {number} - */ - this.witherDamage = data[`${kit}wither_damage_${mode}`] || 0; - /** - * Defender kills - * @type {number} - */ - this.defenderKills = data[`${kit}defender_kills_${mode}`] || 0; - /** - * Walked - * @type {number} - */ - this.walked = data[`${kit}meters_walked_${mode}`] || 0; - /** - * Blocks Placed - * @type {number} - */ - this.blocksPlaced = data[`${kit}blocks_placed_${mode}`] || 0; - /** - * Blocks Broken - * @type {number} - */ - this.blocksBroken = data[`${kit}blocks_broken_${mode}`] || 0; - /** - * Melee Kills - * @type {number} - */ - this.meleeKills = data[`${kit}kills_melee_${mode}`] || 0; - /** - * Damage Delt - * @type {number} - */ - this.damageDealt = data[`${kit}damage_dealt_${mode}`] || 0; - } -} -class MegaWallsKitStats { - /** - * @param {object} data MegaWalls data - * @param {string} kit MegaWalls Kit - */ - constructor(data, kit) { - /** - * Kills - * @type {number} - */ - this.kills = data[`${kit}_kills`] || 0; - /** - * Assists - * @type {number} - */ - this.assists = data[`${kit}_assists`] || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data[`${kit}_deaths`] || 0; - /** - * Kill Death ratio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Wins - * @type {number} - */ - this.wins = data[`${kit}_wins`] || 0; - /** - * Losses - * @type {number} - */ - this.losses = data[`${kit}_losses`] || 0; - /** - * Win Loss ratio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - /** - * Final kills - * @type {number} - */ - this.finalKills = data[`${kit}_final_kills`] || 0; - /** - * Final assists - * @type {number} - */ - this.finalAssists = data[`${kit}_final_assists`] || 0; - /** - * Final deaths - * @type {number} - */ - this.finalDeaths = data[`${kit}_final_deaths`] || 0; - /** - * Final Kill Death ratio - * @type {number} - */ - this.finalKDRatio = divide(this.finalKills, this.finalDeaths); - /** - * Played games - * @type {number} - */ - this.playedGames = data[`${kit}_games_played`] || 0; - /** - * Wither damage - * @type {number} - */ - this.witherDamage = data[`${kit}_wither_damage`] || 0; - /** - * Defender kills - * @type {number} - */ - this.defenderKills = data[`${kit}_defender_kills`] || 0; - /** - * Walked - * @type {number} - */ - this.walked = data[`${kit}_meters_walked`] || 0; - /** - * Blocks Placed - * @type {number} - */ - this.blocksPlaced = data[`${kit}_blocks_placed`] || 0; - /** - * Blocks Broken - * @type {number} - */ - this.blocksBroken = data[`${kit}_blocks_broken`] || 0; - /** - * Melee Kills - * @type {number} - */ - this.meleeKills = data[`${kit}_kills_melee`] || 0; - /** - * Damage Delt - * @type {number} - */ - this.damageDealt = data[`${kit}_damage_dealt`] || 0; - /** - * Stats for each mode - * @type {MegaWallsModeStats} - */ - this.faceOff = new MegaWallsModeStats(data, 'face_off', kit); - /** - * Stats for each mode - * @type {MegaWallsModeStats} - */ - this.casualBrawl = new MegaWallsModeStats(data, 'gvg', kit); - } -} - -/** - * MegaWalls class - */ -class MegaWalls { - /** - * @param {object} data MegaWalls data - */ - constructor(data) { - /** - * Selected class - * @type {string|null} - */ - this.selectedClass = data.chosen_class || null; - /** - * Coins - * @type {number} - */ - this.coins = data.coins || 0; - /** - * Kills - * @type {number} - */ - this.kills = data.kills || 0; - /** - * Assists - * @type {number} - */ - this.assists = data.assists || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data.deaths || 0; - /** - * Kill Death ratio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Wins - * @type {number} - */ - this.wins = data.wins || 0; - /** - * Losses - * @type {number} - */ - this.losses = data.losses || 0; - /** - * Win Loss ratio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - /** - * Final kills - * @type {number} - */ - this.finalKills = (data.final_kills || 0) + (data.finalkills || 0); - /** - * Final assists - * @type {number} - */ - this.finalAssists = (data.final_assists || 0) + (data.finalassists || 0); - /** - * Final deaths - * @type {number} - */ - this.finalDeaths = (data.final_deaths || 0) + (data.finalDeaths || 0); - /** - * Final Kill Death ratio - * @type {number} - */ - this.finalKDRatio = divide(this.finalKills, this.finalDeaths); - /** - * Played games - * @type {number} - */ - this.playedGames = data.games_played || 0; - /** - * Wither damage - * @type {number} - */ - this.witherDamage = (data.wither_damage || 0) + (data.witherDamager || 0); - /** - * Defender kills - * @type {number} - */ - this.defenderKills = data.defender_kills || 0; - /** - * Walked - * @type {number} - */ - this.walked = data.meters_walked || 0; - /** - * Blocks Placed - * @type {number} - */ - this.blocksPlaced = data.blocks_placed || 0; - /** - * Blocks Broken - * @type {number} - */ - this.blocksBroken = data.blocks_broken || 0; - /** - * Melee Kills - * @type {number} - */ - this.meleeKills = data.kills_melee || 0; - /** - * Damage Delt - * @type {number} - */ - this.damageDealt = data.damage_dealt || 0; - /** - * Stats for each mode - * @type {MegaWallsModeStats} - */ - this.faceOff = new MegaWallsModeStats(data, 'face_off'); - /** - * Stats for each mode - * @type {MegaWallsModeStats} - */ - this.casualBrawl = new MegaWallsModeStats(data, 'gvg'); - /** - * cow kit stats - * @type {MegaWallsKitStats} - */ - this.cow = new MegaWallsKitStats(data, 'cow'); - /** - * hunter kit stats - * @type {MegaWallsKitStats} - */ - this.hunter = new MegaWallsKitStats(data, 'hunter'); - /** - * shark kit stats - * @type {MegaWallsKitStats} - */ - this.shark = new MegaWallsKitStats(data, 'shark'); - /** - * arcanist kit stats - * @type {MegaWallsKitStats} - */ - this.arcanist = new MegaWallsKitStats(data, 'arcanist'); - /** - * deadlord kit stats - * @type {MegaWallsKitStats} - */ - this.deadlord = new MegaWallsKitStats(data, 'deadlord'); - /** - * golem kit stats - * @type {MegaWallsKitStats} - */ - this.golem = new MegaWallsKitStats(data, 'golem'); - /** - * herobrine kit stats - * @type {MegaWallsKitStats} - */ - this.herobrine = new MegaWallsKitStats(data, 'herobrine'); - /** - * pigman kit stats - * @type {MegaWallsKitStats} - */ - this.pigman = new MegaWallsKitStats(data, 'pigman'); - /** - * zombie kit stats - * @type {MegaWallsKitStats} - */ - this.zombie = new MegaWallsKitStats(data, 'zombie'); - /** - * blaze kit stats - * @type {MegaWallsKitStats} - */ - this.blaze = new MegaWallsKitStats(data, 'blaze'); - /** - * enderman kit stats - * @type {MegaWallsKitStats} - */ - this.enderman = new MegaWallsKitStats(data, 'enderman'); - /** - * shaman kit stats - * @type {MegaWallsKitStats} - */ - this.shaman = new MegaWallsKitStats(data, 'shaman'); - /** - * squid kit stats - * @type {MegaWallsKitStats} - */ - this.squid = new MegaWallsKitStats(data, 'squid'); - /** - * creeper kit stats - * @type {MegaWallsKitStats} - */ - this.creeper = new MegaWallsKitStats(data, 'creeper'); - /** - * pirate kit stats - * @type {MegaWallsKitStats} - */ - this.pirate = new MegaWallsKitStats(data, 'pirate'); - /** - * sheep kit stats - * @type {MegaWallsKitStats} - */ - this.sheep = new MegaWallsKitStats(data, 'sheep'); - /** - * skeleton kit stats - * @type {MegaWallsKitStats} - */ - this.skeleton = new MegaWallsKitStats(data, 'skeleton'); - /** - * spider kit stats - * @type {MegaWallsKitStats} - */ - this.spider = new MegaWallsKitStats(data, 'spider'); - /** - * werewolf kit stats - * @type {MegaWallsKitStats} - */ - this.werewolf = new MegaWallsKitStats(data, 'werewolf'); - /** - * angel kit stats - * @type {MegaWallsKitStats} - */ - this.angel = new MegaWallsKitStats(data, 'angel'); - /** - * assassin kit stats - * @type {MegaWallsKitStats} - */ - this.assassin = new MegaWallsKitStats(data, 'assassin'); - /** - * automaton kit stats - * @type {MegaWallsKitStats} - */ - this.automaton = new MegaWallsKitStats(data, 'automaton'); - /** - * moleman kit stats - * @type {MegaWallsKitStats} - */ - this.moleman = new MegaWallsKitStats(data, 'moleman'); - /** - * phoenix kit stats - * @type {MegaWallsKitStats} - */ - this.phoenix = new MegaWallsKitStats(data, 'phoenix'); - /** - * renegade kit stats - * @type {MegaWallsKitStats} - */ - this.renegade = new MegaWallsKitStats(data, 'renegade'); - /** - * snowman kit stats - * @type {MegaWallsKitStats} - */ - this.snowman = new MegaWallsKitStats(data, 'snowman'); - } -} - -module.exports = MegaWalls; diff --git a/src/structures/MiniGames/MurderMystery.js b/src/structures/MiniGames/MurderMystery.js deleted file mode 100644 index 6da7df1c6..000000000 --- a/src/structures/MiniGames/MurderMystery.js +++ /dev/null @@ -1,214 +0,0 @@ -const divide = require('../../utils/divide'); - -/** - * MurderMystery stats by gamemode - */ -class MurderMysteryModeStats { - /** - * Constructor - * @param {Object} data Data from API - * @param {string} gamemode String gamemode name - */ - constructor(data, gamemode) { - /** - * Amount of gold picked up in games - * @type {number} - */ - this.goldPickedUp = data[`coins_pickedup_${gamemode}`] || 0; - /** - * Kills - * @type {number} - */ - this.kills = data[`kills_${gamemode}`] || 0; - /** - * Thrown Knife Kills - * @type {number} - */ - this.thrownKnifeKills = data[`thrown_knife_kills_${gamemode}`] || 0; - /** - * Knife Kills - * @type {number} - */ - this.knifeKills = data[`knife_kills_${gamemode}`] || 0; - /** - * Bow Kills - * @type {number} - */ - this.bowKills = data[`bow_kills_${gamemode}`] || 0; - /** - * Trap Kills - * @type {number} - */ - this.trapKills = data[`trap_kills_${gamemode}`] || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data[`deaths_${gamemode}`] || 0; - /** - * Suicides - * @type {number} - */ - this.suicides = data[`suicides_${gamemode}`] || 0; - - /** - * Kill/Death ratio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Wins as Murderer - * @type {number} - */ - this.wins = data[`wins_${gamemode}`] || 0; - /** - * Wins as Detective - * @type {number} - */ - this.winsAsDetective = data[`detective_wins_${gamemode}`] || 0; - /** - * Wins as Murderer - * @type {number} - */ - this.winsAsMurderer = data[`murderer_wins_${gamemode}`] || 0; - /** - * Wins as Hero - * @type {number} - */ - this.winsAsHero = data[`was_hero_${gamemode}`] || 0; - /** - * Played games - * @type {number} - */ - this.playedGames = data[`games_${gamemode}`] || 0; - } -} - -/** - * MurderMystery class - */ -class MurderMystery { - /** - * @param {object} data MurderMystery data - */ - constructor(data) { - /** - * Tokens - * @type {number} - */ - this.tokens = data.coins || 0; - /** - * Amount of gold picked up in games - * @type {number} - */ - this.goldPickedUp = data.coins_pickedup || 0; - /** - * Played games - * @type {number} - */ - this.playedGames = data.games || 0; - /** - * Kills - * @type {number} - */ - this.kills = data.kills || 0; - /** - * Thrown Knife Kills - * @type {number} - */ - this.thrownKnifeKills = data.thrown_knife_kills || 0; - /** - * Knife Kills - * @type {number} - */ - this.knifeKills = data.knife_kills || 0; - /** - * Trap Kills - * @type {number} - */ - this.trapKills = data.trap_kills || 0; - /** - * Bow Kills - * @type {number} - */ - this.bowKills = data.bow_kills || 0; - /** - * Kills As Murderer - * @type {number} - */ - this.killsAsMurderer = data.kills_as_murderer || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data.deaths || 0; - /** - * Kill/Death ratio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Wins as Murderer - * @type {number} - */ - this.winsAsMurderer = data.murderer_wins || 0; - /** - * Wins as Detective - * @type {number} - */ - this.winsAsDetective = data.detective_wins || 0; - /** - * Wins as Hero - * @type {number} - */ - this.winsAsHero = data.was_hero || 0; - /** - * Fastest win as the Murderer (Time in seconds) - * @type {number} - */ - this.fastestWinAsMurderer = data.quickest_murderer_win_time_seconds || 0; - /** - * Fastest win as the Detective (Time in seconds) - * @type {number} - */ - this.fastestWinAsDetective = data.quickest_detective_win_time_seconds || 0; - /** - * Total time Survived (Time in seconds) - * @type {number} - */ - this.totalTimeSurvived = data.total_time_survived_seconds || 0; - /** - * Wins - * @type {number} - */ - this.wins = data.wins || 0; - /** - * Suicides - * @type {number} - */ - this.suicides = data.suicides || 0; - /** - * Classic - * @type {MurderMysteryModeStats} - */ - this.classic = new MurderMysteryModeStats(data, 'MURDER_CLASSIC'); - /** - * Assasins - * @type {MurderMysteryModeStats} - */ - this.assassins = new MurderMysteryModeStats(data, 'MURDER_ASSASSINS'); - /** - * Double Up - * @type {MurderMysteryModeStats} - */ - this.doubleUp = new MurderMysteryModeStats(data, 'MURDER_DOUBLE_UP'); - - /** - * Infection - * @type {MurderMysteryModeStats} - */ - this.infection = new MurderMysteryModeStats(data, 'MURDER_INFECTION'); - } -} - -module.exports = MurderMystery; diff --git a/src/structures/MiniGames/Paintball.js b/src/structures/MiniGames/Paintball.js deleted file mode 100644 index 41840e307..000000000 --- a/src/structures/MiniGames/Paintball.js +++ /dev/null @@ -1,87 +0,0 @@ -const divide = require('../../utils/divide'); -/** - * Paintball class - */ -class Paintball { - /** - * @param {object} data Paintball data - */ - constructor(data) { - /** - * Coins - * @type {number} - */ - this.coins = data.coins || 0; - /** - * Kills - * @type {number} - */ - this.kills = data.kills || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data.deaths || 0; - /** - * Kill Death ratio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Wins - * @type {number} - */ - this.wins = data.wins || 0; - /** - * Shots fired - * @type {number} - */ - this.shotsFired = data.shots_fired || 0; - /** - * Kill streaks - * @type {number} - */ - this.killstreaks = data.killstreaks || 0; - /** - * Forcefield Time - * @type {number} - */ - this.forceFieldTime = data.forcefieldTime || 0; - /** - * Hat - * @type {string} - */ - this.hat = data.hat || 'None'; - /** - * Adrenaline Perk Level - * @type {number} - */ - this.adrenaline = data.adrenaline || 0; - /** - * Endurance Perk Level - * @type {number} - */ - this.endurance = data.endurance || 0; - /** - * Fortune Perk Level - * @type {number} - */ - this.fortune = data.fortune || 0; - /** - * Godfather Perk Level - * @type {number} - */ - this.godfather = data.godfather || 0; - /** - * Superluck Perk Level - * @type {number} - */ - this.superluck = data.superluck || 0; - /** - * Transfusion Perk Level - * @type {number} - */ - this.transfusion = data.transfusion || 0; - } -} -module.exports = Paintball; diff --git a/src/structures/MiniGames/Pit.js b/src/structures/MiniGames/Pit.js deleted file mode 100644 index d533359fb..000000000 --- a/src/structures/MiniGames/Pit.js +++ /dev/null @@ -1,247 +0,0 @@ -const { decode } = require('../../utils/SkyblockUtils'); -const PitInventoryItem = require('./PitInventoryItem'); -const { divide } = require('../../utils'); -const { - pit: { Levels, Prestiges } -} = require('../../utils/Constants'); - -/** - * Pit Class - */ -class Pit { - /** - * Constructor - * @param {Record} data Data from API - */ - constructor(data) { - const stats = data.pit_stats_ptl || {}; - /** - * Prestige - * @type {number} - */ - this.prestige = data.profile?.prestiges?.[data.profile?.prestiges?.length - 1].index || 0; - /** - * Xp - * @type {number} - */ - this.xp = data.profile?.xp || 0; - /** - * Level - * @type {number} - */ - this.level = - Pit.calcLevel(this.prestige, 0 < this.prestige ? this.xp - Prestiges[this.prestige - 1].SumXp : this.xp).level ?? - 0; - /** - * Kills - * @type {number} - */ - this.kills = stats.kills || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = stats.deaths || 0; - /** - * KDR - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Assists - * @type {number} - */ - this.assists = stats.assists || 0; - /** - * Max kill streak - * @type {number} - */ - this.maxKillStreak = stats.max_streak || 0; - /** - * Playtime in SECONDS - * @type {number} - */ - this.playtime = (stats.playtime_minutes || 0) * 60; - /** - * Times the played joined Pit - * @type {number} - */ - this.joins = stats.joins || 0; - - // Damage section (overall) - /** - * Damage received overall - * @type {number} - */ - this.damageReceived = stats.damage_received || 0; - /** - * Damage dealt overall - * @type {number} - */ - this.damageDealt = stats.damage_dealt || 0; - /** - * Damage dealt to damage received ratio - * @type {number} - */ - this.damageRatio = divide(this.damageDealt, this.damageReceived); - // Melee damage - /** - * Damage received in melee - * @type {number} - */ - this.meleeDamageReceived = stats.melee_damage_received || 0; - /** - * Damage dealt in melee - * @type {number} - */ - this.meleeDamageDealt = stats.melee_damage_dealt || 0; - /** - * Sword hits - * @type {number} - */ - this.swordHits = stats.sword_hits || 0; - /** - * Left Clicks (sword clicks, hit or miss) - * @type {number} - */ - this.leftClicks = stats.left_clicks || 0; - /** - * Hits divided by left clicks - * @type {number} - */ - this.meleeAccuracy = divide(this.swordHits, this.leftClicks); - /** - * Damage dealt to damage received ratio in melee - * @type {number} - */ - this.meleeDamageRatio = divide(this.meleeDamageDealt, this.meleeDamageReceived); - // Arrow damage - /** - * Damage received by arrow - * @type {number} - */ - this.bowDamageReceived = stats.bow_damage_received || 0; - /** - * Damage dealt with bow - * @type {number} - */ - this.bowDamageDealt = stats.bow_damage_dealt || 0; - /** - * Arrows hit - * @type {number} - */ - this.arrowsHit = stats.arrow_hits || 0; - /** - * Arrows fired (hit + missed) - * @type {number} - */ - this.arrowsFired = stats.arrows_fired || 0; - /** - * Hit divided by Fired - * @type {number} - */ - this.bowAccuracy = divide(this.arrowsHit, this.arrowsFired); - /** - * Damage dealt to damage received ratio in ranged (bow/arrow) - * @type {number} - */ - this.bowDamageRatio = divide(this.bowDamageDealt, this.bowDamageReceived); - /** - * Golden Heads eaten - * @type {number} - */ - this.goldenHeadsEaten = stats.ghead_eaten || 0; - /** - * Pit Player Inv - * @return {Promise} - */ - this.getInventory = async () => { - let inventory = data.profile.inv_contents; - if (!inventory) return []; - - try { - inventory = await decode(inventory.data); - const edited = []; - for (let i = 1; i < inventory.length; i++) { - if (!inventory[i].id) { - continue; - } - edited.push(new PitInventoryItem(inventory[i])); - } - return edited; - } catch { - return []; - } - }; - /** - * Pit Player Ender Chest - * @return {Promise} - */ - this.getEnterChest = async () => { - let chest = data.profile.inv_enderchest; - if (!chest) return []; - - try { - chest = await decode(chest.data); - const edited = []; - for (let i = 1; i < chest.length; i++) { - if (!chest[i].id) { - continue; - } - edited.push(new PitInventoryItem(chest[i])); - } - return edited; - } catch { - return []; - } - }; - /** - * Pit Player Armor - * @return {Promise} - */ - this.getArmor = async () => { - const base64 = data.profile.inv_armor; - const decoded = await decode(base64.data); - const armor = { - helmet: decoded[3].id ? new PitInventoryItem(decoded[3]) : null, - chestplate: decoded[2].id ? new PitInventoryItem(decoded[2]) : null, - leggings: decoded[1].id ? new PitInventoryItem(decoded[1]) : null, - boots: decoded[0].id ? new PitInventoryItem(decoded[0]) : null - }; - return armor; - }; - } - // Credit https://github.com/PitPanda/PitPandaProduction/blob/b1971f56ea1aa8c829b722cbb33247c96591c0cb/structures/Pit.js - /** - * Converts XP to Level - * @param {number} prestige Prestige Level - * @param {number} xp Current xp into the prestige - * @return {number} - */ - static calcLevel(prestige, xp) { - const multiplier = Prestiges[prestige].Multiplier; - let level = 0; - while (0 < xp && 120 > level) { - const levelXp = Levels[Math.floor(level / 10)].Xp * multiplier; - if (xp >= levelXp * 10) { - xp -= levelXp * 10; - level += 10; - } else { - const gain = Math.floor(xp / levelXp); - level += gain; - xp = 0; - } - } - return level; - } -} - -/** - * @typedef {object} PitArmor Equipped armor - * @property {PitInventoryItem|null} helmet Helmet - * @property {PitInventoryItem|null} chestplate Chestplate - * @property {PitInventoryItem|null} leggings Leggings - * @property {PitInventoryItem|null} boots Boots - */ - -module.exports = Pit; diff --git a/src/structures/MiniGames/PitInventoryItem.js b/src/structures/MiniGames/PitInventoryItem.js deleted file mode 100644 index 411b73900..000000000 --- a/src/structures/MiniGames/PitInventoryItem.js +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Item class - */ -class PitInventoryItem { - /** - * @param {object} data Item data - */ - constructor(data) { - /** - * Item ID - * @type {number} - */ - this.itemId = data.id || 0; - /** - * Item count - * @type {number} - */ - this.count = data.Count || 0; - /** - * Item name - * @type {string|null} - */ - this.name = data?.tag?.display?.Name ? data.tag.display.Name.toString().replace(/§([1-9]|[a-f])|§/gm, '') : null; - /** - * Item lore - * @type {string|null} - */ - this.lore = data?.tag?.display?.Lore ? data.tag.display.Lore.join('\n') : null; - /** - * Item lore - * @type {string[]} - */ - this.loreArray = data?.tag?.display?.Lore ?? []; - /** - * Item Extra Attributes - * @type {object|null} - */ - - this.extraAttributes = data?.tag?.ExtraAttributes ?? null; - } -} - -module.exports = PitInventoryItem; diff --git a/src/structures/MiniGames/Quakecraft.js b/src/structures/MiniGames/Quakecraft.js deleted file mode 100644 index 201171f93..000000000 --- a/src/structures/MiniGames/Quakecraft.js +++ /dev/null @@ -1,164 +0,0 @@ -const divide = require('../../utils/divide'); - -class QuakecraftMode { - /** - * @param {object} data Quakecraft data - * @param {string} gamemode Gamemode Name - */ - constructor(data, gamemode) { - if (gamemode) gamemode = `_${gamemode}`; - /** - * Wins - * @type {number} - */ - this.wins = data[`wins${gamemode}`] || 0; - /** - * Kills - * @type {number} - */ - this.kills = data[`kills${gamemode}`] || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data[`deaths${gamemode}`] || 0; - /** - * Kill Death ratio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Kill streaks - * @type {number} - */ - this.killstreaks = data[`killstreaks${gamemode}`] || 0; - /** - * Distance travelled - * @type {number} - */ - this.distanceTravelled = data[`distance_travelled${gamemode}`] || 0; - /** - * Shots fired - * @type {number} - */ - this.shotsFired = data[`shots_fired${gamemode}`] || 0; - /** - * Headshots - * @type {number} - */ - this.headshots = data[`headshots${gamemode}`] || 0; - } -} - -/** - * Quakecraft class - */ -class Quakecraft { - /** - * @param {object} data Quakecraft data - */ - constructor(data) { - /** - * Coins - * @type {number} - */ - this.coins = data.coins || 0; - /** - * Solo Quakecraft stats - * @type {QuakecraftMode} - */ - this.solo = new QuakecraftMode(data); - /** - * Teams Quakecraft stats - * @type {QuakecraftMode} - */ - this.teams = new QuakecraftMode(data, 'teams'); - /** - * Wins - * @type {number} - */ - this.wins = this.solo.wins + this.teams.wins; - /** - * Kills - * @type {number} - */ - this.kills = this.solo.kills + this.teams.kills; - /** - * Deaths - * @type {number} - */ - this.deaths = this.solo.deaths + this.teams.deaths; - /** - * Kill Death ratio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Kill streaks - * @type {number} - */ - this.killstreaks = this.solo.killstreaks + this.teams.killstreaks; - /** - * Distance travelled - * @type {number} - */ - this.distanceTravelled = this.solo.distanceTravelled + this.teams.distanceTravelled; - /** - * Shots fired - * @type {number} - */ - this.shotsFired = this.solo.shotsFired + this.teams.shotsFired; - /** - * Headshots - * @type {number} - */ - this.headshots = this.solo.headshots + this.teams.headshots; - /** - * Instant Respawn - * @type {boolean} - */ - this.instantRespawn = data.instantRespawn || false; - /** - * Kill Prefix Color - * @type {string} - */ - this.killPrefixColor = data.selectedKillPrefix || ''; - /** - * Show Prefix - * @type {boolean} - */ - this.showPrefix = data.showKillPrefix || false; - /** - * Kill Sound - * @type {string} - */ - this.killSound = data.killsound || ''; - /** - * Barrel - * @type {string} - */ - this.barrel = data.barrel || ''; - /** - * Case - * @type {string} - */ - this.case = data.case || ''; - /** - * Muzzle - * @type {string} - */ - this.muzzle = data.muzzle || ''; - /** - * Sight - * @type {string} - */ - this.sight = data.sight || ''; - /** - * Trigger - * @type {string} - */ - this.trigger = data.trigger || ''; - } -} - -module.exports = Quakecraft; diff --git a/src/structures/MiniGames/SkyWars.js b/src/structures/MiniGames/SkyWars.js deleted file mode 100644 index 8ca5b721d..000000000 --- a/src/structures/MiniGames/SkyWars.js +++ /dev/null @@ -1,669 +0,0 @@ -const { removeSnakeCaseString } = require('../../utils/removeSnakeCase'); -const { SkyWarsPrestigeIcons } = require('../../utils/Constants'); -const divide = require('../../utils/divide'); - -// eslint-disable-next-line jsdoc/require-jsdoc -function getSkyWarsPrestige(level) { - if (60 <= level) return 'Mythic'; - return ( - ['Iron', 'Iron', 'Gold', 'Diamond', 'Emerald', 'Sapphire', 'Ruby', 'Crystal', 'Opal', 'Amethyst', 'Rainbow'][ - Math.floor(level / 5) - ] || 'Iron' - ); -} - -// eslint-disable-next-line jsdoc/require-jsdoc -function getSkyWarsLevel(xp) { - const totalXp = [0, 2, 7, 15, 25, 50, 100, 200, 350, 600, 1000, 1500]; - if (15000 <= xp) return Math.floor((xp - 15000) / 10000 + 12); - const level = totalXp.findIndex((x) => 0 < x * 10 - xp); - return level; -} - -// eslint-disable-next-line jsdoc/require-jsdoc -function getSkyWarsLevelProgress(xp) { - const totalXp = [0, 2, 7, 15, 25, 50, 100, 200, 350, 600, 1000, 1500]; - const xpToNextLvl = [0, 2, 5, 8, 10, 25, 50, 100, 150, 250, 400, 500]; - let percent; - let xpToNextLevel; - let currentLevelXp = xp; - if (15000 <= xp) { - currentLevelXp -= 15000; - if (0 === currentLevelXp) return { currentLevelXp: 0, xpToNextLevel: 10000, percent: 0, xpNextLevel: 10000 }; - if (10000 < currentLevelXp) { - do { - currentLevelXp -= 10000; - } while (10000 <= currentLevelXp); - } - xpToNextLevel = 10000 - currentLevelXp; - percent = Math.round(currentLevelXp) / 100; - const percentRemaining = Math.round((100 - percent) * 100) / 100; - return { - currentLevelXp, - xpToNextLevel, - percent, - xpNextLevel: 10000, - percentRemaining - }; - } - const totalXptoNextLevel = xpToNextLvl[totalXp.findIndex((x) => 0 < x * 10 - xp)] * 10; - for (let i = 0; i < xpToNextLvl.length; i++) { - if (0 > currentLevelXp - xpToNextLvl[i] * 10) break; - currentLevelXp -= xpToNextLvl[i] * 10; - } - xpToNextLevel = totalXptoNextLevel - currentLevelXp; - percent = Math.round((currentLevelXp / totalXptoNextLevel) * 10000) / 100; - return { - currentLevelXp, - xpToNextLevel, - percent, - xpNextLevel: totalXptoNextLevel - }; -} - -class SkywarsMode { - /** - * @param {object} data Skywars data - * @param {string} gamemode Gamemode Name - */ - constructor(data, gamemode) { - /** - * Kills - * @type {number} - */ - this.kills = data[`kills_${gamemode}`] || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data[`deaths_${gamemode}`] || 0; - /** - * KDRatio - * @type {number} - */ - this.KDRatio = divide(data.kills, data.deaths); - /** - * Wins - * @type {number} - */ - this.wins = data[`wins_${gamemode}`] || 0; - /** - * Losses - * @type {number} - */ - this.losses = data[`losses_${gamemode}`] || 0; - /** - * WLRatio - * @type {number} - */ - this.WLRatio = divide(data.wins, data.losses); - } -} -class SkywarsModeStats { - /** - * @param {object} data Skywars data - * @param {string} gamemode Gamemode Name - */ - constructor(data, gamemode) { - /** - * Active Kit - * @type {string} - */ - this.activeKit = data[`activeKit_${gamemode.toUpperCase()}`] || ''; - /** - * Kill Streak - * @type {number} - */ - this.killstreak = data[`killstreak_${gamemode}`] || 0; - /** - * Kills - * @type {number} - */ - this.kills = data[`kills_${gamemode}`] || 0; - /** - * Void Kills - * @type {number} - */ - this.voidKills = data[`void_kills_${gamemode}`] || 0; - /** - * Melee Kills - * @type {number} - */ - this.meleeKills = data[`melee_kills_${gamemode}`] || 0; - /** - * Bow Kills - * @type {number} - */ - this.bowKills = data[`bow_kills_${gamemode}`] || 0; - /** - * Mob Kills - * @type {number} - */ - this.mobKills = data[`mob_kills_${gamemode}`] || 0; - /** - * Assists - * @type {number} - */ - this.assists = data[`assists_${gamemode}`] || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data[`deaths_${gamemode}`] || 0; - /** - * KDRatio - * @type {number} - */ - this.KDRatio = divide(data.kills, data.deaths); - /** - * Wins - * @type {number} - */ - this.wins = data[`wins_${gamemode}`] || 0; - /** - * Losses - * @type {number} - */ - this.losses = data[`losses_${gamemode}`] || 0; - /** - * WLRatio - * @type {number} - */ - this.WLRatio = divide(data.wins, data.losses); - /** - * Games Played - * @type {number} - */ - this.gamesPlayed = data[`games_${gamemode}`] || 0; - /** - * Survived Players - * @type {number} - */ - this.survivedPlayers = data[`survived_players_${gamemode}`] || 0; - /** - * Chests Opened - * @type {number} - */ - this.chestsOpened = data[`chests_opened_${gamemode}`] || 0; - /** - * Time Played (In Seconds) - * @type {number} - */ - this.timePlayed = data[`time_played_${gamemode}`] || 0; - /** - * Shard - * @type {number} - */ - this.shard = data[`shard_${gamemode}`] || 0; - /** - * Longest Bow Shot - * @type {number} - */ - this.longestBowShot = data[`longest_bow_shot_${gamemode}`] || 0; - /** - * Arrows Shot - * @type {number} - */ - this.arrowsShot = data[`arrows_shot_${gamemode}`] || 0; - /** - * Arrows Hit - * @type {number} - */ - this.arrowsHit = data[`arrows_hit_${gamemode}`] || 0; - /** - * Bow Accuracy - * @type {number} - */ - this.bowAccuracy = divide(this.arrowsHit, this.arrowsShot); - /** - * Fastest Win (In Seconds) - * @type {number} - */ - this.fastestWin = data[`fastest_win_${gamemode}`] || 0; - /** - * Heads - * @type {number} - */ - this.heads = data[`heads_${gamemode}`] || 0; - } -} - -/** - * Parses SkyWars Kit - */ -class SkywarsKit { - /** - * Constructor - * @param {string} kit Kit -w */ - constructor(kit) { - /** - * Kit data - * @private - * @type {string[] | null} - */ - this.kitData = kit.match(/^kit_([a-z]+)_([a-z]+)_([a-z]+)$/); - /** - * Is this a kit - * @type {boolean} - */ - this.isKit = Boolean(this.kitData); - if (!this.kitData) return; - /** - * Game mode the kit is for - * @type {KitGameModes} - */ - this.gameMode = this.kitData[2]; - /** - * Kit type - * @type {KitType} - */ - this.kitType = this.kitData[1]; - /** - * Kit name in camelCase - * @type {string} - */ - this.kitName = removeSnakeCaseString(this.kitData[3]); - } -} - -/** - * Parses SkyWars Kits - */ -class SkywarsKits { - /** - * Constructor - * @param {SkywarsKit[]} kits Potential Kits -w */ - constructor(kits) { - this.kits = kits.map((kit) => new SkywarsKit(kit)).filter((kit) => kit.isKit); - } - /** - * Get kit by type/gameMode - * @param {KitGameModes} [gameMode] Kits in said game mode - * @param {KitType} [type] Kits corresponding to this type - * @returns {SkywarsKit[]} -w */ - get(gameMode = '', type = '') { - return this.kits.filter((kit) => kit.gameMode.startsWith(gameMode) && kit.kitType.startsWith(type)); - } -} -/** - * Skywars Packages - parses every package player has - */ -class SkywarsPackages { - /** - * Constructor - * @param {string[]} data data from API -w */ - constructor(data) { - // TODO : a lot more - /** - * Raw Packages, as received from the API - * @type {string[]} - */ - this.rawPackages = data; - /** - * Cages - * @type {string[]} - */ - this.cages = this.parseCages(); - /** - * Kits - * @type {SkywarsKits} - */ - this.kits = new SkywarsKits(data); - /** - * Achievements included in packages, under the form of name0 - * @type {string[]} - */ - this.achievements = this.rawPackages - .map((pkg) => pkg.match(/^([A-Za-z]+)_?achievement([0-9]?)$/)) - .filter((x) => x) - .map((x) => x.slice(1).join('')); - } - /** - * Parses cages - * @returns {string[]} -w */ - parseCages() { - return this.rawPackages - .map((pkg) => pkg.match(/^cage_([A-Za-z]+)-cage$/)) - .filter((x) => x) - .map((x) => x[1].replace(/-[a-z]/g, (x) => x[1].toUpperCase())); - } -} - -/** - * @typedef {string} KitType - * * basic - * * supporting - * * mining - * * defending - * * attacking - * * advanced - * * enderchest - */ -/** - * @typedef {string} KitGameModes - * * solo - * * team - */ - -/** - * SkyWars class - */ -class SkyWars { - /** - * @param {object} data SkyWars data -w */ - constructor(data) { - /** - * Coins - * @type {number} - */ - this.coins = data.coins || 0; - /** - * Souls - * @type {number} - */ - this.souls = data.souls || 0; - /** - * Tokens - * @type {number} - */ - this.tokens = data.cosmetic_tokens || 0; - /** - * Experience - * @type {number} - */ - this.experience = data.skywars_experience || 0; - /** - * Level - * @type {number} - */ - this.level = getSkyWarsLevel(data.skywars_experience); - /** - * Level Progress - * @type {LevelProgress} - */ - this.levelProgress = getSkyWarsLevelProgress(data.skywars_experience); - /** - * Formatted Level - * @type {string} - */ - this.levelFormatted = data.levelFormatted - ? data.levelFormatted - .replace(/§l/gm, '**') - .replace(/§([a-f]|[1-9])/gm, '') - .replace(/§r/gm, '') - : null; - /** - * Prestige - * @type {SkyWarsPrestige} - */ - this.prestige = getSkyWarsPrestige(this.level); - /** - * Prestige Icons - * @type {SkyWarsPrestigeIcons} - */ - this.prestigeIcon = data.selected_prestige_icon ? SkyWarsPrestigeIcons[data.selected_prestige_icon] : null; - /** - * Opals - * @type {number} - */ - this.opals = data.opals || 0; - /** - * Avarice - * @type {number} - */ - this.avarice = data.avarice || 0; - /** - * Tenacity - * @type {number} - */ - this.tenacity = data.tenacity || 0; - /** - * Shards - * @type {number} - */ - this.shards = data.shard || 0; - /** - * Angel Of Death Level - * @type {number} - */ - this.angelOfDeathLevel = data.angel_of_death_level || 0; - - /** - * Killstreak - * @type {number} - */ - this.killstreak = data.killstreak || 0; - /** - * kills - * @type {number} - */ - this.kills = data.kills || 0; - /** - * Void Kills - * @type {number} - */ - this.voidKills = data.void_kills || 0; - /** - * Melee Kills - * @type {number} - */ - this.meleeKills = data.melee_kills || 0; - /** - * Bow Kills - * @type {number} - */ - this.bowKills = data.bow_kills || 0; - /** - * Mob Kills - * @type {number} - */ - this.mobKills = data.mob_kills || 0; - /** - * Assists - * @type {number} - */ - this.assists = data.assists || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data.deaths || 0; - /** - * KDRatio - * @type {number} - */ - this.KDRatio = divide(data.kills, data.deaths); - /** - * Wins - * @type {number} - */ - this.wins = data.wins || 0; - /** - * Losses - * @type {number} - */ - this.losses = data.losses || 0; - /** - * WLRatio - * @type {number} - */ - this.WLRatio = divide(data.wins, data.losses); - /** - * Games Played - * @type {number} - */ - this.gamesPlayed = data.games || 0; - /** - * Survived Players - * @type {number} - */ - this.survivedPlayers = data.survived_players || 0; - /** - * Chests Opened - * @type {number} - */ - this.chestsOpened = data.chests_opened || 0; - /** - * Time Played (In Seconds) - * @type {number} - */ - this.timePlayed = data.time_played || 0; - /** - * Shard - * @type {number} - */ - this.shard = data.shard || 0; - /** - * Longest Bow Shot - * @type {number} - */ - this.longestBowShot = data.longest_bow_shot || 0; - /** - * Arrows Shot - * @type {number} - */ - this.arrowsShot = data.arrows_shot || 0; - /** - * Arrows Hit - * @type {number} - */ - this.arrowsHit = data.arrows_hit || 0; - /** - * Bow Accuracy - * @type {number} - */ - this.bowAccuracy = divide(this.arrowsHit, this.arrowsShot); - /** - * Fastest Win - * @type {number} - */ - this.fastestWin = data.fastest_win || 0; - /** - * Heads - * @type {number} - */ - this.heads = data.heads || 0; - /** - * Blocks Placed - * @type {number} - */ - this.blocksPlaced = data.blocks_placed || 0; - /** - * Blocks Broken - * @type {number} - */ - this.blocksBroken = data.blocks_broken || 0; - /** - * Egg Thrown - * @type {number} - */ - this.eggThrown = data.egg_thrown || 0; - /** - * Enderpearls Thrown - * @type {number} - */ - this.enderpearlsThrown = data.enderpearls_thrown || 0; - - /** - * Solo Skywars Stats - * @type {SkywarsModeStats} - */ - this.solo = new SkywarsModeStats(data, 'solo'); - /** - * Solo Normal Stats - * @type {SkywarsMode} - */ - this.soloNormal = new SkywarsMode(data, 'solo_normal'); - /** - * Solo Insane Stats - * @type {SkywarsMode} - */ - this.soloInsane = new SkywarsMode(data, 'solo_insane'); - /** - * Team Skywars Stats - * @type {SkywarsModeStats} - */ - this.team = new SkywarsModeStats(data, 'team'); - /** - * Team Normal Stats - * @type {SkywarsMode} - */ - this.teamNormal = new SkywarsMode(data, 'team_normal'); - /** - * Team Insane Stats - * @type {SkywarsMode} - */ - this.teamInsane = new SkywarsMode(data, 'team_insane'); - /** - * Mega Skywars Stats - * @type {SkywarsMode} - */ - this.mega = new SkywarsMode(data, 'mega'); - /** - * Mega Doubles Skywars Stats - * @type {SkywarsMode} - */ - this.megaDoubles = new SkywarsMode(data, 'mega_doubles'); - /** - * Skywars Laboratory Stats - * @type {SkywarsMode} - */ - this.lab = new SkywarsMode(data, 'lab'); - /** - * Player Packages, can range from kits to achievement - * @type {SkywarsPackages} - */ - this.packages = new SkywarsPackages(data.packages || []); - } -} -/** - * @typedef {string} SkyWarsPrestige - * * `Iron` - * * `Iron` - * * `Gold` - * * `Diamond` - * * `Emerald` - * * `Sapphire` - * * `Ruby` - * * `Crystal` - * * `Opal` - * * `Amethyst` - * * `Rainbow` - * * `Mythic` - */ -/** - * @typedef {string} SkyWarsPrestigeIcons - * * '⋆' - * * '★' - * * '☆' - * * '⁕', - * * '✶', - * * '✳', - * * '✴', - * * '✷', - * * '❋', - * * '✼', - * * '❂', - * * '❁', - * * '☬', - * * '✙', - * * '❤️', - * * '☠', - * * '✦', - * * '✌', - * * '❦', - * * '✵', - * * '❣', - * * '☯', - * * '✺', - * * 'ಠ_ಠ', - * * '⚔' - */ - -module.exports = SkyWars; diff --git a/src/structures/MiniGames/SmashHeroes.js b/src/structures/MiniGames/SmashHeroes.js deleted file mode 100644 index 6b60a543a..000000000 --- a/src/structures/MiniGames/SmashHeroes.js +++ /dev/null @@ -1,272 +0,0 @@ -const divide = require('../../utils/divide'); - -class SmashHeroesMode { - /** - * @param {object} data SmashHeroes data - * @param {string} mode SmashHeores mode - */ - constructor(data, mode) { - /** - * kills - * @type {number} - */ - this.kills = data[`kills_${mode}`] || 0; - /** - * deaths - * @type {number} - */ - this.deaths = data[`deaths_${mode}`] || 0; - /** - * KDRatio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * wins - * @type {number} - */ - this.wins = data[`wins_${mode}`] || 0; - /** - * losses - * @type {number} - */ - this.losses = data[`losses_${mode}`] || 0; - /** - * WLRatio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - } -} - -class SmashHeoresHero { - /** - * @param {object} data SmashHeroes data - * @param {string} hero Hero name - */ - constructor(data, hero) { - /** - * Hero Name - * @type {string} - */ - this.name = hero; - /** - * Level - * @type {number} - */ - this.level = data[`lastLevel_${hero}`] || 0; - /** - * Xp - * @type {number} - */ - this.xp = data[`xp_${hero}`] || 0; - /** - * Prestige - * @type {number} - */ - this.prestige = data[`pg_${hero}`] || 0; - /** - * Played Games - * @type {number} - */ - this.playedGames = data.class_stats?.[hero]?.games || 0; - /** - * Kills - * @type {number} - */ - this.kills = data.class_stats?.[hero]?.kills || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data.class_stats?.[hero]?.deaths || 0; - /** - * KDRatio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Wins - * @type {number} - */ - this.wins = data.class_stats?.[hero]?.wins || 0; - /** - * Losses - * @type {number} - */ - this.losses = data.class_stats?.[hero]?.losses || 0; - /** - * WLRatio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - } -} - -/** - * SmashHeroes class - */ -class SmashHeroes { - /** - * @param {object} data SmashHeroes data - */ - constructor(data) { - /** - * Coins - * @type {number} - */ - this.coins = data.coins || 0; - /** - * Level - * @type {number} - */ - this.level = data.smash_level_total || 0; - /** - * Winstreak - * @type {number} - */ - this.winstreak = data.win_streak || 0; - /** - * Played games - * @type {number} - */ - this.playedGames = data.games || 0; - /** - * Kills - * @type {number} - */ - this.kills = data.kills || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data.deaths || 0; - /** - * Kill/Death ratio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Wins - * @type {number} - */ - this.wins = data.wins || 0; - /** - * Losses - * @type {number} - */ - this.losses = data.losses || 0; - /** - * Win/Loss ratio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - /** - * Smashed - * @type {number} - */ - this.smashed = data.smashed || 0; - /** - * Stats for each mode - * @type {SmashHeroesMode} - */ - this['1v1v1v1'] = new SmashHeroesMode(data, 'normal'); - /** - * Stats for each mode - * @type {SmashHeroesMode} - */ - this['2v2'] = new SmashHeroesMode(data, '2v2'); - /** - * Stats for each mode - * @type {SmashHeroesMode} - */ - this['2v2v2'] = new SmashHeroesMode(data, 'teams'); - /** - * Active class - * @type {string} - */ - this.activeClass = data.active_class || null; - /** - * The Bulk - * @type {SmashHeoresHero} - */ - this.theBulk = new SmashHeoresHero(data, 'THE_BULK'); - /** - * Cake Monster - * @type {SmashHeoresHero} - */ - this.cakeMonster = new SmashHeoresHero(data, 'CAKE_MONSTER'); - /** - * General Cluck - * @type {SmashHeoresHero} - */ - this.generalCluck = new SmashHeoresHero(data, 'GENERAL_CLUCK'); - /** - * Botmun - * @type {SmashHeoresHero} - */ - this.botmun = new SmashHeoresHero(data, 'BOTMUN'); - /** - * Marauder - * @type {SmashHeoresHero} - */ - this.marauder = new SmashHeoresHero(data, 'MARAUDER'); - /** - * Pug - * @type {SmashHeoresHero} - */ - this.pug = new SmashHeoresHero(data, 'PUG'); - /** - * Tinman - * @type {SmashHeoresHero} - */ - this.tinman = new SmashHeoresHero(data, 'TINMAN'); - /** - * Spoderman - * @type {SmashHeoresHero} - */ - this.spoderman = new SmashHeoresHero(data, 'SPODERMAN'); - /** - * Frosty - * @type {SmashHeoresHero} - */ - this.frosty = new SmashHeoresHero(data, 'FROSTY'); - /** - * Sergeant Shield - * @type {SmashHeoresHero} - */ - this.sergeantShield = new SmashHeoresHero(data, 'SERGEANT_SHIELD'); - /** - * Skullfire - * @type {SmashHeoresHero} - */ - this.skullfire = new SmashHeoresHero(data, 'SKULLFIRE'); - /** - * Goku - * @type {SmashHeoresHero} - */ - this.goku = new SmashHeoresHero(data, 'GOKU'); - /** - * Sanic - * @type {SmashHeoresHero} - */ - this.sanic = new SmashHeoresHero(data, 'SANIC'); - /** - * Dusk Crawler - * @type {SmashHeoresHero} - */ - this.duskCrawler = new SmashHeoresHero(data, 'DUSK_CRAWLER'); - /** - * Shoop Da Whoop - * @type {SmashHeoresHero} - */ - this.shoopDaWhoop = new SmashHeoresHero(data, 'SHOOP_DA_WHOOP'); - /** - * Green Hood - * @type {SmashHeoresHero} - */ - this.greenHood = new SmashHeoresHero(data, 'GREEN_HOOD'); - } -} - -module.exports = SmashHeroes; diff --git a/src/structures/MiniGames/SpeedUHC.js b/src/structures/MiniGames/SpeedUHC.js deleted file mode 100644 index 6b852d8f5..000000000 --- a/src/structures/MiniGames/SpeedUHC.js +++ /dev/null @@ -1,168 +0,0 @@ -const divide = require('../../utils/divide'); - -class SpeedUHCMode { - /** - * @param {object} data Speed UHC data - * @param {string} data Speed UHC data - */ - constructor(data, mode) { - /** - * Kills - * @type {number} - */ - this.kills = data[`kills_${mode}`] || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data[`deaths_${mode}`] || 0; - /** - * Wins - * @type {number} - */ - this.wins = data[`wins_${mode}`] || 0; - /** - * Losses - * @type {number} - */ - this.losses = data[`losses_${mode}`] || 0; - /** - * Played Games - * @type {number} - */ - this.playedGames = data[`games_${mode}`] || 0; - /** - * Winstreak - * @type {number} - */ - this.winstreak = data[`win_streak_${mode}`] || 0; - /** - * Kill Streak - * @type {number} - */ - this.killStreak = data[`killstreak_${mode}`] || 0; - /** - * Assists - * @type {number} - */ - this.assists = data[`assists_${mode}`] || 0; - } -} - -/** - * Speed UHC class - */ -class SpeedUHC { - /** - * @param {object} data Speed UHC data - */ - constructor(data) { - /** - * Coins - * @type {number} - */ - this.coins = data.coins || 0; - /** - * Kills - * @type {number} - */ - this.kills = data.kills || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data.deaths || 0; - /** - * Kill/Death ratio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Wins - * @type {number} - */ - this.wins = data.wins || 0; - /** - * Losses - * @type {number} - */ - this.losses = data.losses || 0; - /** - * Win/Loss ratio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - /** - * Played games - * @type {number} - */ - this.playedGames = data.games || 0; - /** - * Winstreak - * @type {number} - */ - this.winstreak = data.win_streak || 0; - /** - * Killstreak - * @type {number} - */ - this.killstreak = data.killstreak || 0; - /** - * Blocks Broken - * @type {number} - */ - this.blocksBroken = data.blocks_broken || 0; - /** - * Blocks Placed - * @type {number} - */ - this.blocksPlaced = data.blocks_placed || 0; - /** - * Game Quits - * @type {number} - */ - this.quits = data.quits || 0; - /** - * Items Enchanted - * @type {number} - */ - this.itemsEnchanted = data.items_enchanted || 0; - /** - * Assists - * @type {number} - */ - this.assists = data.assists || 0; - /** - * Solo - * @type {SpeedUHCMode} - */ - this.solo = new SpeedUHCMode(data, 'solo'); - /** - * Solo Normal - * @type {SpeedUHCMode} - */ - this.soloNormal = new SpeedUHCMode(data, 'solo_normal'); - /** - * Solo Insane - * @type {SpeedUHCMode} - */ - this.soloInsane = new SpeedUHCMode(data, 'solo_insane'); - /** - * Team - * @type {SpeedUHCMode} - */ - this.team = new SpeedUHCMode(data, 'team'); - /** - * Team Normal - * @type {SpeedUHCMode} - */ - this.teamNormal = new SpeedUHCMode(data, 'team_normal'); - /** - * Team Insane - * @type {SpeedUHCMode} - */ - this.teamInsane = new SpeedUHCMode(data, 'team_insane'); - } -} - -module.exports = SpeedUHC; diff --git a/src/structures/MiniGames/TNTGames.js b/src/structures/MiniGames/TNTGames.js deleted file mode 100644 index 0e4e6ae5b..000000000 --- a/src/structures/MiniGames/TNTGames.js +++ /dev/null @@ -1,285 +0,0 @@ -const divide = require('../../utils/divide'); - -class TNTRun { - /** - * @param {object} data TNT Games data - */ - constructor(data) { - /** - * Wins - * @type {number} - */ - this.wins = data.wins_tntrun || 0; - /** - * Best Time (in seconds) - * @type {number} - */ - this.bestTime = data.record_tntrun || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data.deaths_tntrun || 0; - /** - * Slowness Potion Perk Level - * @type {number} - */ - this.slownessPotions = data.new_tntrun_slowness_potions || 0; - /** - * Speed Potion Perk Level - * @type {number} - */ - this.speedPotions = data.new_tntrun_speed_potions || 0; - /** - * Double Jump Perk Level - * @type {number} - */ - this.doubleJumps = data.new_tntrun_double_jumps || 0; - /** - * prefix - * @type {string} - */ - this.prefix = data.prefix_tntrun || ''; - } -} -class PVPRun { - /** - * @param {object} data TNT Games data - */ - constructor(data) { - /** - * Wins - * @type {number} - */ - this.wins = data.wins_pvprun || 0; - /** - * Best Time Alive (in seconds) - * @type {number} - */ - this.bestTime = data.record_pvprun || 0; - /** - * Kills - * @type {number} - */ - this.kills = data.kills_pvprun || 0; - /** - * Daths - * @type {number} - */ - this.deaths = data.deaths_pvprun || 0; - /** - * KDRatio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Regeneration Perk Level - * @type {number} - */ - this.regeneration = data.new_pvprun_regeneration || 0; - /** - * Notoriety Perk Level - * @type {number} - */ - this.notoriety = data.new_pvprun_notoriety || 0; - /** - * Fortitude Perk Level - * @type {number} - */ - this.fortitude = data.new_pvprun_fortitude || 0; - /** - * Double Jump Perk level - * @type {number} - */ - this.doubleJumps = data.new_pvprun_double_jumps || 0; - /** - * Prefix - * @type {string} - */ - this.prefix = data.prefix_pvprun || ''; - } -} -class BowSpleef { - /** - * @param {object} data TNT Games data - */ - constructor(data) { - /** - * wins - * @type {number} - */ - this.wins = data.wins_bowspleef || 0; - /** - * tags - * @type {number} - */ - this.tags = data.tags_bowspleef || 0; - /** - * deaths - * @type {number} - */ - this.deaths = data.deaths_bowspleef || 0; - /** - * prefix - * @type {string} - */ - this.prefix = data.prefix_bowspleef || ''; - } -} -class TNTTag { - /** - * @param {object} data TNT Games data - */ - constructor(data) { - /** - * Wins - * @type {number} - */ - this.wins = data.wins_tntag || 0; - /** - * Kills - * @type {number} - */ - this.kills = data.kills_tntag || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data.deaths_tntag || 0; - /** - * KDRatio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Speed Perk Level - * @type {number} - */ - this.speed = data.new_tntag_speedy || 0; - /** - * Blast Protection Perk Level - * @type {number} - */ - this.blastProtection = data.tag_blastprotection || 0; - /** - * Speed It Up Perk Level - * @type {number} - */ - this.speedItUp = data.tag_speeditup || 0; - /** - * Slow It Down Perk Level - * @type {number} - */ - this.slowItDown = data.tag_slowitdown || 0; - /** - * Prefix - * @type {string} - */ - this.prefix = data.prefix_tntag || ''; - } -} -class TNTWizards { - /** - * @param {object} data TNT Games data - */ - constructor(data) { - /** - * Wins - * @type {number} - */ - this.wins = data.wins_capture || 0; - /** - * Kills - * @type {number} - */ - this.kills = data.kills_capture || 0; - /** - * Assists - * @type {number} - */ - this.assists = data.assists_capture || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data.deaths_capture || 0; - /** - * KDRatio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Points - * @type {number} - */ - this.points = data.points_capture || 0; - /** - * Kinetic Healing - * @type {number} - */ - this.kineticHealing = data.kinetic_healing_capture || 0; - /** - * Air Time (In seconds) - * @type {number} - */ - this.airTime = data.air_time_capture || 0; - /** - * Prefix - * @type {string} - */ - this.prefix = data.prefix_capture || ''; - } -} - -/** - * The TNT Games class - */ -class TNTGames { - /** - * @param {object} data TNT Games data - */ - constructor(data) { - /** - * Coins - * @type {number} - */ - this.coins = data.coins || 0; - /** - * Winstreak - * @type {number} - */ - this.winstreak = data.winstreak || 0; - /** - * Wins - * @type {number} - */ - this.wins = data.wins || 0; - /** - * TNT Run - * @type {TNTRun} - */ - this.tntrun = new TNTRun(data); - /** - * PVP Run - * @type {PVPRun} - */ - this.pvpRun = new PVPRun(data); - /** - * Bowspleef - * @type {BowSpleef} - */ - this.bowSpleef = new BowSpleef(data); - /** - * TNT Tag - * @type {TNTTag} - */ - this.tnttag = new TNTTag(data); - /** - * Wizards - * @type {TNTWizards} - */ - this.wizards = new TNTWizards(data); - } -} - -module.exports = TNTGames; diff --git a/src/structures/MiniGames/TurboKartRacers.js b/src/structures/MiniGames/TurboKartRacers.js deleted file mode 100644 index 898274d1b..000000000 --- a/src/structures/MiniGames/TurboKartRacers.js +++ /dev/null @@ -1,141 +0,0 @@ -class TurboKartRacersMap { - /** - * @param {object} data TurboKartRacers data - * @param {string} mapName TurboKartRacers Map - */ - constructor(data, mapName) { - /** - * Map - * @type {string} - */ - this.map = mapName; - /** - * Plays - * @type {number} - */ - this.plays = data[`${mapName}_plays`] || 0; - /** - * Box Pickups - * @type {number} - */ - this.boxPickups = data[`box_pickups_${mapName}`] || 0; - /** - * Bronze Trophies - * @type {number} - */ - this.bronzeTrophies = data[`bronze_trophy_${mapName}`] || 0; - /** - * Silver Trophies - * @type {number} - */ - this.silverTrophies = data[`silver_trophy_${mapName}`] || 0; - /** - * Gold Trophies - * @type {number} - */ - this.goldTrophies = data[`gold_trophy_${mapName}`] || 0; - } -} - -/** - * TurboKartRacers class - */ -class TurboKartRacers { - /** - * @param {object} data TurboKartRacers data - */ - constructor(data) { - /** - * Coins - * @type {number} - */ - this.coins = data.coins || 0; - /** - * Wins - * @type {number} - */ - this.wins = data.wins || 0; - /** - * Completed laps - * @type {number} - */ - this.completedLaps = data.laps_completed || 0; - /** - * Bronze trophies - * @type {number} - */ - this.bronzeTrophies = data.bronze_trophy || 0; - /** - * Silver trophies - * @type {number} - */ - this.silverTrophies = data.silver_trophy || 0; - /** - * Gold trophies - * @type {number} - */ - this.goldTrophies = data.gold_trophy || 0; - /** - * Box pickups - * @type {number} - */ - this.boxPickups = data.box_pickups || 0; - /** - * Horn - * @type {'DEFAULT' | 'SHY' | 'ALIEN' | 'TAXI' | 'KLAXON' | 'TRICYCLE' | 'ALARM' | 'KLOON' | 'TEDDY' | 'TRUCK' | 'JERRY'} - */ - this.horn = data.horn || 'DEFAULT'; - /** - * retro Map Stats - * @type {TurboKartRacersMap} - */ - this.retro = new TurboKartRacersMap(data, 'retro'); - /** - * HypixelHP Map Stats - * @type {TurboKartRacersMap} - */ - this.hypixelgp = new TurboKartRacersMap(data, 'hypixelgp'); - /** - * Olympus Map Stats - * @type {TurboKartRacersMap} - */ - this.olympus = new TurboKartRacersMap(data, 'olympus'); - /** - * Jungle Rush Map Stats - * @type {TurboKartRacersMap} - */ - this.junglerush = new TurboKartRacersMap(data, 'junglerush'); - /** - * Canyon Map Stats - * @type {TurboKartRacersMap} - */ - this.canyon = new TurboKartRacersMap(data, 'canyon'); - /** - * Bananas Recived - * @type {number} - */ - this.bananaHitsReceived = data.banana_hits_received || 0; - /** - * Bananas Sent - * @type {number} - */ - this.bananaHitsSent = data.banana_hits_sent || 0; - /** - * Blue Torpedos Hit - * @type {number} - */ - this.blueTorpedoHit = data.blue_torpedo_hit || 0; - /** - * Grand Prix Status - * @type {boolean} - */ - this.grandPrix = data.grand_prix || 'false'; - /** - * Grand Prix Tokens - * @type {number} - */ - this.grandPrixTokens = data.grand_prix_tokens || 0; - } -} - -module.exports = TurboKartRacers; diff --git a/src/structures/MiniGames/UHC.js b/src/structures/MiniGames/UHC.js deleted file mode 100644 index a3fd79baf..000000000 --- a/src/structures/MiniGames/UHC.js +++ /dev/null @@ -1,193 +0,0 @@ -const divide = require('../../utils/divide'); - -// eslint-disable-next-line jsdoc/require-jsdoc -function getStarLevel(kills, wins) { - const sum = Number(kills) + wins * 10; - let starLevel = 1; - const sums = [0, 1, 6, 21, 46, 96, 171, 271, 521, 1021, 1321, 1621, 1921, 2221, 2521, Infinity]; - starLevel += sums.map((x) => x * 10 - sum).findIndex((x) => 0 < x) - 1; - return starLevel; -} - -class UHCGamemode { - /** - * @param {object} data UHC data - * @param {string} mode UHC Mode Name - */ - constructor(data, mode = '') { - /** - * Kills - * @type {number} - */ - this.kills = data[`kills${mode}`] || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data[`deaths${mode}`] || 0; - /** - * Wins - * @type {number} - */ - this.wins = data[`wins${mode}`] || 0; - /** - * Golden Heads Eaten - * @type {number} - */ - this.headsEaten = data[`heads_eaten${mode}`] || 0; - /** - * Ultimates Crafted - * @type {number} - */ - this.ultimatesCrafted = data[`ultimates_crafted${mode}`] || 0; - /** - * Extra Ultimates Crafted - * @type {number} - */ - this.extraUltimatesCrafted = data[`extra_ultimates_crafted${mode}`] || 0; - } -} - -/** - * UHC class - */ -class UHC { - /** - * @param {object} data UHC data - */ - constructor(data) { - /** - * Coins - * @type {number} - */ - this.coins = data.coins || 0; - /** - * Score - * @type {number} - */ - this.score = data.score || 0; - /** - * Selected Kit - * @type {string} - */ - this.kit = data.equippedKit || ''; - /** - * Solo - * @type {UHCGamemode} - */ - this.solo = new UHCGamemode(data, '_solo'); - /** - * Teams - * @type {UHCGamemode} - */ - this.team = new UHCGamemode(data); - /** - * Red vs Blue - * @type {UHCGamemode} - */ - this.redVsBlue = new UHCGamemode(data, '_red_vs_blue'); - /** - * No Diamond - * @type {UHCGamemode} - */ - this.noDiamond = new UHCGamemode(data, '_no_diamonds'); - /** - * Brawl - * @type {UHCGamemode} - */ - this.brawl = new UHCGamemode(data, '_brawl'); - /** - * Solo brawl - * @type {UHCGamemode} - */ - this.soloBrawl = new UHCGamemode(data, '_solo_brawl'); - /** - * Duo Brawl - * @type {UHCGamemode} - */ - this.duoBrawl = new UHCGamemode(data, '_duo_brawl'); - /** - * Wins - * @type {number} - */ - this.wins = - this.solo.wins + - this.team.wins + - this.redVsBlue.wins + - this.noDiamond.wins + - this.brawl.wins + - this.soloBrawl.wins + - this.duoBrawl.wins; - /** - * Kills - * @type {number} - */ - this.kills = - this.solo.kills + - this.team.kills + - this.redVsBlue.kills + - this.noDiamond.kills + - this.brawl.kills + - this.soloBrawl.kills + - this.duoBrawl.kills; - /** - * Deaths - * @type {number} - */ - this.deaths = - this.solo.deaths + - this.team.deaths + - this.redVsBlue.deaths + - this.noDiamond.deaths + - this.brawl.deaths + - this.soloBrawl.deaths + - this.duoBrawl.deaths; - /** - * Kill/Death ratio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Heads eaten - * @type {number} - */ - this.headsEaten = - this.solo.headsEaten + - this.team.headsEaten + - this.redVsBlue.headsEaten + - this.noDiamond.headsEaten + - this.brawl.headsEaten + - this.soloBrawl.headsEaten + - this.duoBrawl.headsEaten; - /** - * Ultimates Crafted - * @type {number} - */ - this.ultimatesCrafted = - this.solo.ultimatesCrafted + - this.team.ultimatesCrafted + - this.redVsBlue.ultimatesCrafted + - this.noDiamond.ultimatesCrafted + - this.brawl.ultimatesCrafted + - this.soloBrawl.ultimatesCrafted + - this.duoBrawl.ultimatesCrafted; - /** - * Extra Ultimates Crafted - * @type {number} - */ - this.extraUltimatesCrafted = - this.solo.extraUltimatesCrafted + - this.team.extraUltimatesCrafted + - this.redVsBlue.extraUltimatesCrafted + - this.noDiamond.extraUltimatesCrafted + - this.brawl.extraUltimatesCrafted + - this.soloBrawl.extraUltimatesCrafted + - this.duoBrawl.extraUltimatesCrafted; - /** - * Star level - * @type {number} - */ - this.starLevel = getStarLevel(this.kills, this.wins); - } -} -module.exports = UHC; diff --git a/src/structures/MiniGames/VampireZ.js b/src/structures/MiniGames/VampireZ.js deleted file mode 100644 index 4939ad57e..000000000 --- a/src/structures/MiniGames/VampireZ.js +++ /dev/null @@ -1,93 +0,0 @@ -const divide = require('../../utils/divide'); - -class VampireZRole { - /** - * @param {object} data VampireZ data - * @param {string} role VampireZ Role - */ - constructor(data, role) { - /** - * Kills - * @type {number} - */ - this.kills = data[`${role}_kills`]; - /** - * Deaths - * @type {number} - */ - this.deaths = data[`${role}_deaths`]; - /** - * KDRatio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Wins - * @type {number} - */ - this.wins = data[`${role}_wins`]; - } -} - -/** - * VampireZ class - */ -class VampireZ { - /** - * @param {object} data VampireZ data - */ - constructor(data) { - /** - * Coins - * @type {number} - */ - this.coins = data.coins || 0; - /** - * Gold Bought - * @type {number} - */ - this.goldBought = data.gold_bought || 0; - /** - * Blood - * @type {boolean} - */ - this.blood = data.blood || false; - /** - * Zombie Kills - * @type {number} - */ - this.zombieKills = data.zombie_kills || 0; - /** - * Human Stats - * @type {VampireZRole} - */ - this.human = new VampireZRole(data, 'human'); - /** - * Vampire Stats - * @type {VampireZRole} - */ - this.vampire = new VampireZRole(data, 'vampire'); - /** - * Kills - * @type {number} - */ - this.kills = this.human.kills + this.vampire.kills; - /** - * Deaths - * @type {number} - */ - this.deaths = this.human.deaths + this.vampire.deaths; - /** - * KDRatio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Wins - * @type {number} - */ - this.wins = this.human.wins + this.vampire.wins; - } -} - -module.exports = VampireZ; diff --git a/src/structures/MiniGames/Walls.js b/src/structures/MiniGames/Walls.js deleted file mode 100644 index 25bcdf60c..000000000 --- a/src/structures/MiniGames/Walls.js +++ /dev/null @@ -1,52 +0,0 @@ -const divide = require('../../utils/divide'); -/** - * Walls class - */ -class Walls { - /** - * @param {object} data Walls data - */ - constructor(data) { - /** - * Coins - * @type {number} - */ - this.coins = data.coins || 0; - /** - * Kills - * @type {number} - */ - this.kills = data.kills || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data.deaths || 0; - /** - * Kill Death ratio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Wins - * @type {number} - */ - this.wins = data.wins || 0; - /** - * Losses - * @type {number} - */ - this.losses = data.losses || 0; - /** - * Win Loss ratio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - /** - * Assists - * @type {number} - */ - this.assists = data.assists || 0; - } -} -module.exports = Walls; diff --git a/src/structures/MiniGames/Warlords.js b/src/structures/MiniGames/Warlords.js deleted file mode 100644 index da85d499e..000000000 --- a/src/structures/MiniGames/Warlords.js +++ /dev/null @@ -1,187 +0,0 @@ -const divide = require('../../utils/divide'); - -class WarlordsClass { - /** - * @param {object} data Warlords data - * @param {string} className - */ - constructor(data, className) { - /** - * Wins - * @type {number} - */ - this.wins = data[`wins_${className}`] || 0; - /** - * Losses - * @type {number} - */ - this.losses = data[`losses_${className}`] || 0; - /** - * WLRatio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - /** - * Games Played - * @type {number} - */ - this.gamesPlayed = data[`${className}_plays`]; - /** - * Damage - * @type {number} - */ - this.damage = data[`damage_${className}`] || 0; - /** - * Heal - * @type {number} - */ - this.heal = data[`heal_${className}`] || 0; - /** - * Damage Prevented - * @type {number} - */ - this.damagePrevented = data[`damage_prevented_${className}`] || 0; - } -} - -/** - * Warlords class - */ -class Warlords { - /** - * @param {object} data Warlords data - */ - constructor(data) { - /** - * Coins - * @type {number} - */ - this.coins = data.coins || 0; - /** - * Kills - * @type {number} - */ - this.kills = data.kills || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data.deaths || 0; - /** - * Kill Death ratio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Wins - * @type {number} - */ - this.wins = data.wins || 0; - /** - * Losses - * @type {number} - */ - this.losses = data.losses || 0; - /** - * Win Loss ratio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - /** - * Winstreak - * @type {number} - */ - this.winstreak = data.win_streak || 0; - /** - * Assists - * @type {number} - */ - this.assists = data.assists || 0; - /** - * Chosen class - * @type {string} - */ - this.class = data.chosen_class || ''; - /** - * pyromancer - * @type {WarlordsClass} - */ - this.pyromancer = new WarlordsClass(data, 'pyromancer'); - /** - * mage - * @type {WarlordsClass} - */ - this.mage = new WarlordsClass(data, 'mage'); - /** - * thunderlord - * @type {WarlordsClass} - */ - this.thunderlord = new WarlordsClass(data, 'thunderlord'); - /** - * shaman - * @type {WarlordsClass} - */ - this.shaman = new WarlordsClass(data, 'shaman'); - /** - * earthwarden - * @type {WarlordsClass} - */ - this.earthwarden = new WarlordsClass(data, 'earthwarden'); - /** - * aquamancer - * @type {WarlordsClass} - */ - this.aquamancer = new WarlordsClass(data, 'aquamancer'); - /** - * paladin - * @type {WarlordsClass} - */ - this.paladin = new WarlordsClass(data, 'paladin'); - /** - * avenger - * @type {WarlordsClass} - */ - this.avenger = new WarlordsClass(data, 'avenger'); - /** - * warrior - * @type {WarlordsClass} - */ - this.warrior = new WarlordsClass(data, 'warrior'); - /** - * defender - * @type {WarlordsClass} - */ - this.defender = new WarlordsClass(data, 'defender'); - /** - * cryomancer - * @type {WarlordsClass} - */ - this.cryomancer = new WarlordsClass(data, 'cryomancer'); - /** - * crusader - * @type {WarlordsClass} - */ - this.crusader = new WarlordsClass(data, 'crusader'); - /** - * berserker - * @type {WarlordsClass} - */ - this.berserker = new WarlordsClass(data, 'berserker'); - /** - * protector - * @type {WarlordsClass} - */ - this.protector = new WarlordsClass(data, 'protector'); - /** - * revenant - * @type {WarlordsClass} - */ - this.revenant = new WarlordsClass(data, 'revenant'); - /** - * spiritguard - * @type {WarlordsClass} - */ - this.spiritguard = new WarlordsClass(data, 'spiritguard'); - } -} -module.exports = Warlords; diff --git a/src/structures/MiniGames/WoolGames.js b/src/structures/MiniGames/WoolGames.js deleted file mode 100644 index 0a6b828dc..000000000 --- a/src/structures/MiniGames/WoolGames.js +++ /dev/null @@ -1,405 +0,0 @@ -const { divide } = require('../../utils'); - -class WoolWarsClass { - /** - * Constructor - * @param {Record} data Data from API - */ - constructor(data, className) { - /** - * Wins - * @type {number} - */ - this.wins = data?.[className]?.wins || 0; - /** - * Kills - * @type {number} - */ - this.kills = data?.[className]?.kills || 0; - /** - * Assists - * @type {number} - */ - this.assists = data?.[className]?.assists || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data?.[className]?.deaths || 0; - /** - * KDRatio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Games Played - * @type {number} - */ - this.gamesPlayed = data?.[className]?.games_played || 0; - /** - * Wools Placed - * @type {number} - */ - this.woolsPlaced = data?.[className]?.wool_placed || 0; - /** - * Blocks Broken - * @type {number} - */ - this.blocksBroken = data?.[className]?.blocks_broken || 0; - /** - * Place Break Ratio - * @type {number} - */ - this.placeBreakRatio = divide(this.woolsPlaced, this.blocksBroken); - /** - * Powerups Collected - * @type {number} - */ - this.powerups = data?.[className]?.powerups_gotten || 0; - } -} - -/** - * Wool Wars Class - */ -class WoolWars { - /** - * Constructor - * @param {Record} data Data from API - */ - constructor(data) { - /** - * Selected Class - * @type {'ASSAULT' | 'TANK' | 'GOLEM' | 'SWORDSMAN' | 'ENGINEER' | 'ARCHER' | 'NONE'} - */ - this.selectedClass = data?.selected_class || 'NONE'; - /** - * Wins - * @type {number} - */ - this.wins = data?.stats?.wins || 0; - /** - * Kills - * @type {number} - */ - this.kills = data?.stats?.kills || 0; - /** - * Assists - * @type {number} - */ - this.assists = data?.stats?.assists || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data?.stats?.deaths || 0; - /** - * KDRatio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Games Played - * @type {number} - */ - this.gamesPlayed = data?.stats?.games_played || 0; - /** - * Wools Placed - * @type {number} - */ - this.woolsPlaced = data?.stats?.wool_placed || 0; - /** - * Blocks Broken - * @type {number} - */ - this.blocksBroken = data?.stats?.blocks_broken || 0; - /** - * Place Break Ratio - * @type {number} - */ - this.placeBreakRatio = divide(this.woolsPlaced, this.blocksBroken); - /** - * powerups - * @type {number} - */ - this.powerups = data?.powerups_gotten || 0; - /** - * Assault Class Stats - * @type {WoolWarsClass} - */ - this.assault = new WoolWarsClass(data?.stats?.classes, 'assault'); - /** - * Tank Class Stats - * @type {WoolWarsClass} - */ - this.tank = new WoolWarsClass(data?.stats?.classes, 'tank'); - /** - * Golem Class Stats - * @type {WoolWarsClass} - */ - this.golem = new WoolWarsClass(data?.stats?.classes, 'golem'); - /** - * Swordsman Class Stats - * @type {WoolWarsClass} - */ - this.swordsman = new WoolWarsClass(data?.stats?.classes, 'swordsman'); - /** - * Engineer Class Stats - * @type {WoolWarsClass} - */ - this.engineer = new WoolWarsClass(data?.stats?.classes, 'engineer'); - /** - * Archer Class Stats - * @type {WoolWarsClass} - */ - this.archer = new WoolWarsClass(data?.stats?.classes, 'archer'); - } -} -/** - * Capture The Wool Stats Class - */ -class CaptureTheWool { - /** - * Constructor - * @param {Record} data Data from API - */ - constructor(data) { - /** - * kills - * @type {number} - */ - this.kills = data?.stats?.kills || 0; - /** - * Assists - * @type {number} - */ - this.assists = data?.stats?.assists || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data?.stats?.deaths || 0; - /** - * KDRatio - * @type {number} - */ - this.KDRatio = divide(this.kills, this.deaths); - /** - * Kills With Wool - * @type {number} - */ - this.killsWithWool = data?.stats?.kills_with_wool || 0; - /** - * Deaths With Wool - * @type {number} - */ - this.deathsWithWool = data?.stats?.deaths_with_wool || 0; - /** - * KDRatio With Wool - * @type {number} - */ - this.KDRatioWithWool = divide(this.killsWithWool, this.deathsWithWool); - /** - * Wool Captured - * @type {number} - */ - this.woolCaptured = data?.stats?.wools_captured || 0; - /** - * Wool Stolen - * @type {number} - */ - this.woolStolen = data?.stats?.wools_stolen || 0; - /** - * Wool Capture Stolen Ratio - * @type {number} - */ - this.woolCaptureStolenRatio = divide(this.woolCaptured, this.woolStolen); - } -} -/** - * Sheep Wars Stats Class - */ -class SheepWars { - /** - * Constructor - * @param {Record} data Data from API - */ - constructor(data) { - /** - * Wins - * @type {number} - */ - this.wins = data?.stats?.wins || 0; - /** - * Kills - * @type {number} - */ - this.kills = data?.stats?.kills || 0; - /** - * Kills Void - * @type {number} - */ - this.killsVoid = data?.stats?.kills_void || 0; - /** - K kills Bow - * @type {number} - */ - this.killsBow = data?.stats?.kills_bow || 0; - /** - * Kills Explosive - * @type {number} - */ - this.killsExplosive = data?.stats?.kills_explosive || 0; - /** - * Deaths - * @type {number} - */ - this.deaths = data?.stats?.deaths || 0; - /** - * Deaths Void - * @type {number} - */ - this.deathsVoid = data?.stats?.deaths_void || 0; - /** - * Deaths Melee - * @type {number} - */ - this.deathsMelee = data?.stats?.deaths_melee || 0; - /** - * Deaths Explosive - * @type {number} - */ - this.deathsExplosive = data?.stats?.deaths_explosive || 0; - /** - * KDRatio - * @type {number} - */ - this.KDRatio = divide(this.wins, this.deaths); - /** - * Losses - * @type {number} - */ - this.losses = data?.stats?.losses || 0; - /** - * WLRatio - * @type {number} - */ - this.WLRatio = divide(this.wins, this.losses); - /** - * Games Played - * @type {number} - */ - this.gamesPlayed = data?.stats?.games_played || 0; - /** - * Damage Dealt - * @type {number} - */ - this.damageDealt = data?.stats?.damage_dealt || 0; - /** - * Sheep Thrown - * @type {number} - */ - this.sheepThrown = data?.stats?.sheep_thrown || 0; - /** - * Magic Wool Hit - * @type {number} - */ - this.magicWoolHit = data?.stats?.magic_wool_hit || 0; - } -} - -/** - * WoolGames Stats - */ -class WoolGames { - /** - * Constructor - * @param {Record} data Data from API - */ - constructor(data) { - /** - * Layers - * @type {number} - */ - this.layers = data?.progression?.available_layers || 0; - /** - * XP - * @type {number} - */ - this.xp = data?.progression?.experience || 0; - /** - * Exact Level - * @type {number} - */ - this.exactLevel = this.convertXPToLevel(this.xp); - /** - * Level - * @type {number} - */ - this.level = Math?.floor(this.exactLevel); - /** - * Coins - * @type {number} - */ - this.coins = data?.coins || 0; - /** - * Owned Cosmetics - * @type {string[]} - */ - this.ownedCosmetics = data?.packages || []; - /** - * Private Games Config - * @type {WoolGamesPrivateGamesConfig} - */ - this.privateGamesConfig = data?.privategames || {}; - /** - * Playtime - * @type {number} - */ - this.playtime = data?.playtime || 0; - /** - * Wool Wars - * @type {WoolWars} - */ - this.woolWars = new WoolWars(data?.wool_wars); - /** - * Capture The Wool - * @type {CaptureTheWool} - */ - this.captureTheWool = new CaptureTheWool(data?.capture_the_wool); - /** - * Sheep Wars - * @type {SheepWars} - */ - this.sheepWars = new SheepWars(data?.sheep_wars); - } - - /** - * Converts XP to Level - * @param {number} exp xp - * @return {number} - */ - convertXPToLevel(exp) { - const minimalExp = [0, 1e3, 3e3, 6e3, 1e4, 15e3]; - const baseLevel = minimalExp.length; - const baseExp = minimalExp[minimalExp.length - 1]; - const expToLevel100 = 49e4; - if (exp < baseExp) return minimalExp.findIndex((x) => exp < x); - const theoreticalLevel = (exp - baseExp) / 5e3 + baseLevel; - if (100 < theoreticalLevel) return 100 + this.convertXPToLevel(exp - expToLevel100); - return theoreticalLevel; - } -} - -/** - * @typedef {object} WoolGamesPrivateGamesConfig - * @property {boolean} one_hit_one_kill one hit one kill - * @property {'Enabled' | 'Disabled'} rainbow_wool rainbow wool - * @property {string} health_buff health buff - * @property {string} game_speed game speed - * @property {string} speed speed - * @property {'Enabled' | 'Disabled'} no_class no class - * @property {boolean} respawn_enable respawn enable - */ - -module.exports = WoolGames; diff --git a/src/structures/Pet.js b/src/structures/Pet.js deleted file mode 100644 index 28869d99e..000000000 --- a/src/structures/Pet.js +++ /dev/null @@ -1,96 +0,0 @@ -const Utils = require('../utils'); -/** - * Pet Class - */ -class Pet { - /** - * @param {string} name Name of pet - * @param {object} data data - */ - constructor(name, data) { - /** - * Is Pet Favorite - * @type {boolean} - */ - this.isFavorite = data.vanityFavorites ? Boolean(data.vanityFavorites.includes(name.toUpperCase())) : false; - name = name.replace('pet_', ''); - /** - * Official Name of the pet - * @type {string} - */ - this.name = Utils.removeSnakeCase.recursive(name) || null; - /** - * Is Active Pet - * @type {boolean} - */ - this.active = data.currentPet === name.toUpperCase(); - const stats = data.petStats && data.petStats[name.toUpperCase()]; - /** - * Stats of the pet, if any - * @type {object} - */ - if (!stats) return; - /** - * Hunger value ( 100 is highest ) - * @type {?number} - */ - this.hunger = stats.HUNGER ? stats.HUNGER.value : null; - /** - * Last time the pet was fed ( timestamp ) - * @type {?number} - */ - this.lastFed = stats.HUNGER ? stats.HUNGER.timestamp : null; - /** - * Last time the pet was fed ( Date ) - * @type {?Date} - */ - this.lastFedAt = this.lastFed ? new Date(this.lastFed) : null; - /** - * Thirst value ( 100 is highest ) - * @type {?number} - */ - this.thirst = stats.THIRST ? stats.THIRST.value : null; - /** - * Last time the pet drank ( timestamp ) - * @type {?number} - */ - this.lastDrank = stats.THIRST ? stats.THIRST.timestamp : null; - /** - * Last time the pet drank ( Date ) - * @type {?Date} - */ - this.lastDrankAt = this.lastDrank ? new Date(this.lastDrank) : null; - /** - * Exercise/Entertainment value ( 100 is highest ) - * @type {?number} - */ - this.exercise = stats.EXERCISE ? stats.EXERCISE.value : null; - /** - * Last time the pet was exercised ( timestamp ) - * @type {?number} - */ - this.lastExercised = stats.EXERCISE ? stats.EXERCISE.timestamp : null; - /** - * Last time the pet exercised ( Date ) - * @type {?Date} - */ - this.lastExercisedAt = this.lastExercised ? new Date(this.lastExerciced) : null; - /** - * Raw Nickname, if any - * @type {?string} - */ - this.rawNickname = stats.name || null; - /** - * Nickname in plain text, if any - * @type {?string} - */ - this.nickname = stats.name ? stats.name.replace(/§([0-9]|[a-f])|§/gm, '') : null; - /** - * Pet experience - * @type {number} - */ - this.experience = stats.experience || 0; - } -} - -module.exports = Pet; diff --git a/src/structures/Pets.js b/src/structures/Pets.js deleted file mode 100644 index 445c6f479..000000000 --- a/src/structures/Pets.js +++ /dev/null @@ -1,64 +0,0 @@ -const Pet = require('./Pet'); -/** - * Pets class - */ -class Pets { - /** - * @param {string[]} pets Array of pets - * @param {object} data data - */ - constructor(pets, data) { - /** - * Array of pets - * @type {Pet[]} - */ - this.pets = pets.map((x) => new Pet(x, data)); - /** - * Last Pet Journey ( as timestamp ) - * @type {number|null} - */ - this.lastJourneyTimestamp = data.petJourneyTimestamp || null; - /** - * Last Pet Journey ( as Date ) - * @type {Date|null} - */ - this.lastJourneyAt = this.lastJourneyTimestamp ? new Date(this.lastJourneyTimestamp) : null; - /** - * Pet food/drink/toys - * @type {PetConsumables} - */ - this.petConsumables = data.petConsumables; - } -} -/** - * @typedef {Object} PetConsumables - * @property {number} BAKED_POTATO Food - * @property {number} COOKIE Food - * @property {number} FEATHER Toy - * @property {number} HAY_BLOCK Food - * @property {number} SLIME_BALL Toy - * @property {number} COOKED_BEEF Food - * @property {number} RED_ROSE Food - * @property {number} WATER_BUCKET Drinks - * @property {number} MELON Food - * @property {number} STICK Toy - * @property {number} WOOD_SWORD Toy ( but not irl ) - * @property {number} MILK_BUCKET Drinks - * @property {number} GOLD_RECORD Food - * @property {number} LEASH Toy - * @property {number} LAVA_BUCKET Drinks - * @property {number} BONE Food - * @property {number} MAGMA_CREAM Food - * @property {number} WHEAT Food - * @property {number} MUSHROOM_SOUP Food - * @property {number} BREAD Food - * @property {number} PUMPKIN_PIE Food - * @property {number} APPLE Food - * @property {number} CARROT_ITEM Carrots - * @property {number} RAW_FISH Food - * @property {number} PORK Food - * @property {number} CAKE Food - * @property {number} ROTTEN_FLESH Food - */ - -module.exports = Pets; diff --git a/src/structures/Player.js b/src/structures/Player.js deleted file mode 100644 index 91733a8ec..000000000 --- a/src/structures/Player.js +++ /dev/null @@ -1,346 +0,0 @@ -const { - playerLevelProgress, - parseClaimedRewards, - getSocialMedia, - getPlayerLevel, - getRank -} = require('../utils/Player'); -const SkyWars = require('./MiniGames/SkyWars'); -const BedWars = require('./MiniGames/BedWars'); -const UHC = require('./MiniGames/UHC'); -const SpeedUHC = require('./MiniGames/SpeedUHC'); -const MurderMystery = require('./MiniGames/MurderMystery'); -const Duels = require('./MiniGames/Duels'); -const BuildBattle = require('./MiniGames/BuildBattle'); -const MegaWalls = require('./MiniGames/MegaWalls'); -const CopsAndCrims = require('./MiniGames/CopsAndCrims'); -const TNTGames = require('./MiniGames/TNTGames'); -const SmashHeroes = require('./MiniGames/SmashHeroes'); -const VampireZ = require('./MiniGames/VampireZ'); -const BlitzSurvivalGames = require('./MiniGames/BlitzSurvivalGames'); -const ArenaBrawl = require('./MiniGames/ArenaBrawl'); -const Arcade = require('./MiniGames/Arcade'); -const Color = require('./Color'); -const Game = require('./Game'); -const PlayerCosmetics = require('./PlayerCosmetics'); -const { recursive } = require('../utils/removeSnakeCase'); -const TurboKartRacers = require('./MiniGames/TurboKartRacers'); -const Paintball = require('./MiniGames/Paintball'); -const Quakecraft = require('./MiniGames/Quakecraft'); -const Walls = require('./MiniGames/Walls'); -const Warlords = require('./MiniGames/Warlords'); -const WoolGames = require('./MiniGames/WoolGames'); -const Pit = require('./MiniGames/Pit'); -const Guild = require('./Guild/Guild'); -const RecentGame = require('./RecentGame'); -/** - * Player class - */ -class Player { - /** - * @param {object} data Player data - * @param {Record} extraPayload extra data requested alongside player - */ - constructor(data, extraPayload) { - /** - * Player nickname - * @type {string} - */ - this.nickname = data.displayname; - /** - * Player UUID - * @type {string} - */ - this.uuid = data.uuid; - /** - * Player rank - * @type {PlayerRank} - */ - this.rank = getRank(data); - /** - * Current chat channel, usually ALL, PARTY, or GUILD - * @type {string|null} - */ - this.channel = data.channel || null; - /** - * Timestamp when player last logged in - * @type {number|null} - */ - this.firstLoginTimestamp = data.firstLogin || null; - /** - * Timestamp when player last logged in as Date - * @type {Date|null} - */ - this.firstLogin = data.firstLogin ? new Date(data.firstLogin) : null; - /** - * Timestamp when player last logged in as Date - * @type {Game|null} - */ - this.lastLoginTimestamp = data.lastLogin || null; - /** - * Timestamp when player first logged in unix - * @type {number|null} - */ - this.lastLogin = data.lastLogin ? new Date(data.lastLogin) : null; - /** - * Timestamp when player last logged out as Date - * @type {Date|null} - */ - this.lastLogoutTimestamp = data.lastLogout || null; - /** - * Timestamp when player first logged in unix - * @type {number|null} - */ - this.lastLogout = data.lastLogout ? new Date(data.lastLogout) : null; - /** - * Recently played game - * @type {Game|null} - */ - this.recentlyPlayedGame = data.mostRecentGameType ? new Game(data.mostRecentGameType) : null; - /** - * Player's plus color (must be a MVP+ rank) - * @type {Color|null} - */ - this.plusColor = - 'MVP+' === this.rank || 'MVP++' === this.rank - ? data.rankPlusColor - ? new Color(data.rankPlusColor) - : new Color('RED') - : null; - /** - * MVP++ prefix color - * @type {Color|null} - */ - this.prefixColor = - 'MVP++' === this.rank ? (data.monthlyRankColor ? new Color(data.monthlyRankColor) : new Color('GOLD')) : null; - /** - * Player karma - * @type {number} - */ - this.karma = data.karma || 0; - /** - * Player achievements - * @type {Object} - */ - this.achievements = recursive(data.achievements); - /** - * Player achievement points - * @type {number} - */ - this.achievementPoints = data.achievementPoints || 0; - /** - * Player total experience - * @type {number} - */ - this.totalExperience = data.networkExp || 0; - /** - * Player level - * @type {number} - */ - this.level = getPlayerLevel(this.totalExperience) || 0; - /** - * Player social media, if any - * @type {Array} - */ - this.socialMedia = getSocialMedia(data.socialMedia) || []; - /** - * Amount of gift bundles sent - * @type {number} - */ - this.giftBundlesSent = data.giftingMeta ? data.giftingMeta.realBundlesGiven || 0 : null; - /** - * Amount of gift bundles received - * @type {number} - */ - this.giftBundlesReceived = data.giftingMeta ? data.giftingMeta.realBundlesReceived || 0 : null; - /** - * Amount of gifts sent - * @type {number} - */ - this.giftsSent = data.giftingMeta ? data.giftingMeta.giftsGiven || 0 : null; - /** - * Is player online? - * @type {boolean} - */ - this.isOnline = this.lastLoginTimestamp > this.lastLogoutTimestamp; - /** - * Last time player claimed the daily reward - * @type {Date | null} - */ - this.lastDailyReward = data.lastAdsenseGenerateTime ? new Date(data.lastAdsenseGenerateTime) : null; - /** - * Last time player claimed the daily reward, as timestamp - * @type {number | null} - */ - this.lastDailyRewardTimestamp = data.lastAdsenseGenerateTime || null; - /** - * Total amount of Daily Rewards - * @type {number | null} - */ - this.totalRewards = data.totalRewards || null; - /** - * Total amount of Daily Rewards claimed - * @type {number | null} - */ - this.totalDailyRewards = data.totalDailyRewards || null; - /** - * Honestly no clue what this is specifically - * @type {number | null} - */ - this.rewardStreak = data.rewardStreak || null; - /** - * Current Daily Rewards streak - * @type {number | null} - */ - this.rewardScore = data.rewardScore || null; - /** - * Highest Daily Rewards streak - * @type {number | null} - */ - this.rewardHighScore = data.rewardHighScore || null; - /** - * Player leveling progress. - * @type {LevelProgress} - */ - this.levelProgress = playerLevelProgress(data); - /** - * Player's Guild if requested in options - * @type {Guild|null} - */ - this.guild = extraPayload?.guild || null; - /** - * Recent Games if requested in options - * @type {RecentGame[]|null} - */ - this.recentGames = extraPayload?.recentGames || null; - /** - * Player stats for each mini-game - * @type {PlayerStats} - */ - this.stats = data.stats - ? { - arcade: data.stats.Arcade ? new Arcade({ ...data.stats.Arcade, ...data.achievements }) : null, - arena: data.stats.Arena ? new ArenaBrawl(data.stats.Arena) : null, - bedwars: data.stats.Bedwars ? new BedWars(data.stats.Bedwars) : null, - blitzsg: data.stats.HungerGames ? new BlitzSurvivalGames(data.stats.HungerGames) : null, - buildbattle: data.stats.BuildBattle ? new BuildBattle(data.stats.BuildBattle) : null, - copsandcrims: data.stats.MCGO ? new CopsAndCrims(data.stats.MCGO) : null, - duels: data.stats.Duels ? new Duels(data.stats.Duels) : null, - megawalls: data.stats.Walls3 ? new MegaWalls(data.stats.Walls3) : null, - murdermystery: data.stats.MurderMystery ? new MurderMystery(data.stats.MurderMystery) : null, - paintball: data.stats.Paintball ? new Paintball(data.stats.Paintball) : null, - pit: data.stats.Pit ? new Pit(data.stats.Pit) : null, - quakecraft: data.stats.Quake ? new Quakecraft(data.stats.Quake) : null, - skywars: data.stats.SkyWars ? new SkyWars(data.stats.SkyWars) : null, - smashheroes: data.stats.SuperSmash ? new SmashHeroes(data.stats.SuperSmash) : null, - speeduhc: data.stats.SpeedUHC ? new SpeedUHC(data.stats.SpeedUHC) : null, - tntgames: data.stats.TNTGames ? new TNTGames(data.stats.TNTGames) : null, - turbokartracers: data.stats.GingerBread ? new TurboKartRacers(data.stats.GingerBread) : null, - uhc: data.stats.UHC ? new UHC(data.stats.UHC) : null, - vampirez: data.stats.VampireZ ? new VampireZ(data.stats.VampireZ) : null, - walls: data.stats.Walls ? new Walls(data.stats.Walls) : null, - warlords: data.stats.Battleground ? new Warlords(data.stats.Battleground) : null, - woolgames: data.stats.WoolGames ? new WoolGames(data.stats.WoolGames) : null - } - : null; - /** - * User's current language - * @type {string} - * @default ENGLISH Default to english - */ - this.userLanguage = data.userLanguage || 'ENGLISH'; - /** - * Claimed Leveling Rewards - * @type {number[]} - */ - this.claimedLevelingRewards = parseClaimedRewards(data) || []; - /** - * Global Cosmetics a player owns - * @type {PlayerCosmetics} - */ - this.globalCosmetics = data ? new PlayerCosmetics(data) : null; - /** - * Time at which the ranks were purchased. Can be all null if bought a long time ago, and some values can be null if player bought directly a rank above that - * @type {RanksPurchaseTime} - */ - this.ranksPurchaseTime = { - VIP: data.levelUp_VIP ? new Date(data.levelUp_VIP) : null, - VIP_PLUS: data.levelUp_VIP_PLUS ? new Date(data.levelUp_VIP_PLUS) : null, - MVP: data.levelUp_MVP ? new Date(data.levelUp_MVP) : null, - MVP_PLUS: data.levelUp_MVP_PLUS ? new Date(data.levelUp_MVP_PLUS) : null - }; - } - /** - * Player Name ( at least last known to hypixel ) - * @return {string} - */ - toString() { - return this.nickname; - } -} -/** - * @typedef {string} PlayerRank - * * `Default` - * * `VIP` - * * `VIP+` - * * `MVP` - * * `MVP+` - * * `MVP++` - * * `YouTube` - * * `Game Master` - * * `Admin` - * * `PIG+++` - * * `INNIT` - */ -/** - * @typedef {Object} PlayerSocialMedia - * Player social media object - * @property {string} name Twitter, YouTube, Instagram, Twitch, Hypixel, Discord - * @property {string} link Link to social media - * @property {string} id TWITTER, YOUTUBE, INSTRAGRAM, TWITCH, HYPIXEL, DISCORD - */ -/** - * @typedef {Object|null} PlayerStats - * Player stats for each mini-game. `null` if player has no stats. - *
- * Usage: `.stats.skywars` - * @property {Arcade|null} arcade Arcade - * @property {ArenaBrawl|null} arena Arena Brawl - * @property {BedWars|null} bedwars BedWars - * @property {BlitzSurvivalGames|null} blitzsg Blitz Survival Games - * @property {BuildBattle|null} buildbattle BuildBattle - * @property {CopsAndCrims|null} copsandcrims Cops and Crims - * @property {Duels|null} duels Duels - * @property {MegaWalls|null} megawalls MegaWalls - * @property {MurderMystery|null} murdermystery Murder Mystery - * @property {Paintball|null} paintball Paint Ball - * @property {Pit|null} pit Pit - * @property {Quakecraft|null} quakecraft Quake Craft - * @property {SkyWars|null} skywars SkyWars - * @property {SmashHeroes|null} smashheroes Smash Heroes - * @property {SpeedUHC|null} speedUHC Speed UHC - * @property {TNTGames|null} tntgames The TNT Games - * @property {TurboKartRacers|null} turbokartracers Turbo Kart Racers - * @property {UHC|null} uhc UHC - * @property {VampireZ|null} vampirez VampireZ - * @property {Walls|null} walls Walls - * @property {Warlords|null} warlords Warlords - * @property {WoolGames|null} woolgames Wool Games - */ -/** - * @typedef {Object} RanksPurchaseTime - * Time at which ranks were purchased. Beware, even if a player has MVP+(+), every value here *could* be null - * @property {Date|null} VIP VIP rank - * @property {Date|null} VIP_PLUS VIP+ rank - * @property {Date|null} MVP MVP rank - * @property {Date|null} MVP_PLUS MVP+ rank - */ -/** - * @typedef {Object} LevelProgress - * @property {number} xpToNext Total XP to a player's next level. - * @property {number} remainingXP XP to the player's next level. - * @property {number} currentXP XP the player current has. - * @property {number} percent Player level progress as a percentage. - * @property {number} percentRemaining Remaining percentage of the percent value. - */ -module.exports = Player; diff --git a/src/structures/PlayerCosmetics.js b/src/structures/PlayerCosmetics.js deleted file mode 100644 index a8fdabe93..000000000 --- a/src/structures/PlayerCosmetics.js +++ /dev/null @@ -1,155 +0,0 @@ -/* eslint-disable no-underscore-dangle */ -const { removeSnakeCaseString } = require('../utils/removeSnakeCase'); -const Pets = require('./Pets'); -/** - * Player Cosmetics class - */ -class PlayerCosmetics { - /** - * @param {object} data data - */ - constructor(data) { - /** - * All cosmetics - * @type {string[]} - */ - this.allCosmetics = data?.vanityMeta?.packages || undefined; - /** - * Pets - * @type {Pets|null} - */ - this.petManager = this.allCosmetics - ? new Pets( - this.allCosmetics.filter((x) => x.startsWith('pet_')), - data - ) - : null; - } - /** - * Suits - * @type {string[]} - */ - get suits() { - if (!this._suits) { - this._suits = this.allCosmetics - ? this.allCosmetics - .filter((x) => x.startsWith('suit_')) - .map((x) => removeSnakeCaseString(x.replace('suit_', ''))) || [] - : []; - } - return this._suits; - } - /** - * Hats - * @type {string[]} - */ - get hats() { - if (!this._hats) { - this._hats = this.allCosmetics - ? this.allCosmetics - .filter((x) => x.startsWith('hat_')) - .map((x) => removeSnakeCaseString(x.replace('hat_', ''))) || [] - : []; - } - return this._hats; - } - /** - * Gadgets - * @type {string[]} - */ - get gadgets() { - if (!this._gadgets) { - this._gadgets = this.allCosmetics - ? this.allCosmetics - .filter((x) => x.startsWith('gadget_')) - .map((x) => removeSnakeCaseString(x.replace('gadget_', ''))) || [] - : []; - } - return this._gadgets; - } - /** - * Morphs - * @type {string[]} - */ - get morphs() { - if (!this._morphs) { - this._morphs = this.allCosmetics - ? this.allCosmetics - .filter((x) => x.startsWith('morph_')) - .map((x) => removeSnakeCaseString(x.replace('morph_', ''))) || [] - : []; - } - return this._morphs; - } - /** - * Cloaks - * @type {string[]} - */ - get cloaks() { - if (!this._cloaks) { - this._cloaks = this.allCosmetics - ? this.allCosmetics - .filter((x) => x.startsWith('cloak_')) - .map((x) => removeSnakeCaseString(x.replace('cloak_', ''))) || [] - : []; - } - return this._cloaks; - } - /** - * Taunts - * @type {string[]} - */ - get taunts() { - if (!this._taunts) { - this._taunts = this.allCosmetics - ? this.allCosmetics - .filter((x) => x.startsWith('taunt_')) - .map((x) => removeSnakeCaseString(x.replace('taunt_', ''))) || [] - : []; - } - return this._taunts; - } - /** - * rankColors - * @type {string[]} - */ - get rankColors() { - if (!this._rankColors) { - this._rankColors = this.allCosmetics - ? this.allCosmetics - .filter((x) => x.startsWith('rankcolor_')) - .map((x) => removeSnakeCaseString(x.replace('rankcolor_', ''))) || [] - : []; - } - return this._rankColors; - } - /** - * Particle Packs - * @type {string[]} - */ - get particlePacks() { - if (!this._particle) { - this._particle = this.allCosmetics - ? this.allCosmetics - .filter((x) => x.startsWith('particlepack_')) - .map((x) => removeSnakeCaseString(x.replace('particlepack_', ''))) || [] - : []; - } - return this._particlepacks; - } - /** - * Click Effects - * @type {string[]} - */ - get clickEffects() { - if (!this._clickfx) { - this._clickfx = this.allCosmetics - ? this.allCosmetics - .filter((x) => x.startsWith('clickeffects_')) - .map((x) => removeSnakeCaseString(x.replace('clickeffects_', ''))) || [] - : []; - } - return this._clickfx; - } -} -module.exports = PlayerCosmetics; diff --git a/src/structures/RecentGame.js b/src/structures/RecentGame.js deleted file mode 100644 index 21f5fd9a4..000000000 --- a/src/structures/RecentGame.js +++ /dev/null @@ -1,57 +0,0 @@ -const Game = require('./Game'); -/** - * RecentGame class - * @extends {Game} - */ -class RecentGame extends Game { - /** - * @param {object} data Recent game data - */ - constructor(data) { - super(data.gameType); - /** - * Date as timestamp - * @type {number} - */ - this.dateTimestamp = data.date || null; - /** - * Date - * @type {Date} - */ - this.date = data.date ? new Date(data.date) : null; - /** - * Game mode - * @type {string} - */ - this.mode = data.mode || null; - /** - * Map - * @type {string} - */ - this.map = data.map || null; - // Per hypixel API docs : if ended isn't present, the game is ONGOING. - /** - * Is game ongoing? - * @type {boolean} - */ - this.ongoing = Boolean(!data.ended); - /** - * Game ended at as Date - * @type {Date} - */ - this.endedAt = data.ended ? new Date(data.ended) : null; - /** - * Game ended at - * @type {number} - */ - this.endedTimestamp = data.ended ? data.ended : null; - } - /** - * Name of gamemode - * @return {string} - */ - toString() { - return this.mode; - } -} -module.exports = RecentGame; diff --git a/src/structures/ServerInfo.js b/src/structures/ServerInfo.js deleted file mode 100644 index 0ded1a8fb..000000000 --- a/src/structures/ServerInfo.js +++ /dev/null @@ -1,78 +0,0 @@ -/** - * Server Info class - parses info obtained from handshaking with hypixel - */ -class ServerInfo { - /** - * Constructor - * @param {Object} data data parsed from packet - * @param {number} ping Ping - */ - constructor(data, ping) { - /** - * Protocol used for retrieving info, should be 736 - * @type {number} - */ - this.protocolUsed = data.version.protocol || 736; - /** - * Version required / Server version used - * @type {string} - */ - this.versionInfo = data.version.name || 'Unknown'; - /** - * Amount of players online and max players - * @type {PlayerInfo} - */ - this.players = { - max: data.players.max || 0, - online: data.players.online || 0, - players: data.players.sample || [], - toString: () => `${this.players.online}/${this.players.max}` - }; - /** - * Server MOTD, as it is received - * @type {string} - */ - this.rawMOTD = data.description || ''; - /** - * Clean MOTD, no color codes - * @type {string} - */ - this.cleanMOTD = this.rawMOTD.replace(/§[a-z0-9]/gi, ''); - /** - * MOTD without surrounding white spaces for centering - * @type {string} - */ - this.textMOTD = this.cleanMOTD.replace(/^\s+/gm, ''); - /** - * base64 Favicon - as it is received - * @type {string} - */ - this.faviconB64 = data.favicon || undefined; - /** - * Favicon as buffer - * @type {Buffer} - */ - this.favicon = Buffer.from(this.faviconB64, 'base64'); - /** - * Ping in ms - * @type {number} - */ - this.ping = parseInt(ping, 10); - } - /** - * toString override - * @returns {string} - */ - toString() { - return `${this.textMOTD} - ${this.players} Players (${this.ping} ms) - ${this.versionInfo}`; - } -} - -/** - * @typedef {Object} PlayerInfo - * @property {number} max Max amount of players online possible for the server - * @property {number} online Current amount of online players - * @property {any[]} players Some or all IGNs of online players, usually not provided by Hypixel - */ - -module.exports = ServerInfo; diff --git a/src/structures/SkyBlock/Auctions/Auction.js b/src/structures/SkyBlock/Auctions/Auction.js deleted file mode 100644 index 06f6c3f61..000000000 --- a/src/structures/SkyBlock/Auctions/Auction.js +++ /dev/null @@ -1,106 +0,0 @@ -const BaseAuction = require('./BaseAuction'); -const Bid = require('./Bid'); -/** - * Auction class - */ -class Auction extends BaseAuction { - /** - * @param {object} data - * @param {boolean} includeItemBytes - */ - constructor(data, includeItemBytes) { - super(data, includeItemBytes); - /** - * Coop members. Array of UUIDs - * @type {string[]} - */ - this.coop = data.coop || []; - /** - * Auction start timestamp - * @type {number|null} - */ - this.auctionStartTimestamp = data.start || null; - /** - * Auction start timestamp as Date - * @type {Date} - */ - this.auctionStart = data.start ? new Date(data.start) : null; - /** - * Auction end timestamp as Date - * @type {Date} - */ - this.auctionEnd = data.end ? new Date(data.end) : null; - /** - * Auction end timestamp as timestamp - * @type {number} - */ - this.auctionEndTimestamp = data.end || null; - /** - * Auction Item Name - * @type {string} - */ - this.item = data.item_name || null; - /** - * Auction Item lore ( plain text ) - * @type {string} - */ - this.itemLore = data.item_lore ? data.item_lore.replace(/§([1-9]|[a-l])|§/gm, '') : null; - /** - * Auctipn Item Lore as it is from the API - * @type {string} - */ - this.itemLoreRaw = data.item_lore || null; - /** - * Rarity of Item - * @type {Rarity} - */ - this.rarity = data.tier || null; - /** - * Auction starting bid, or price for BIN - * @type {number} - */ - this.startingBid = data.starting_bid || 0; - /** - * Auction's highest bid, if it is bidded or price for BIN - * @type {number} - */ - this.highestBid = this.bin ? data.starting_bid : data.highest_bid_amount || 0; - /** - * Auction bids - * @type {Bid[]} - */ - this.bids = data.bids.length ? data.bids.map((b) => new Bid(b)) : []; - /** - * is Auction Claimed - * @type {boolean} - */ - this.claimed = data.claimed || false; - /** - * Which bidders, if any, claimed - * @type {string[]} - */ - this.claimedBidders = this.claimed ? data.claimed_bidders : []; - } - /** - * Item Name - * @return {string} - */ - toString() { - return this.item; - } -} - -/** - * @typedef {string} Rarity - * * `VERY_SPECIAL` - * * `SPECIAL` - * * `SUPREME` - * * `MYTHIC` - * * `LEGENDARY` - * * `EPIC` - * * `RARE` - * * `UNCOMMON` - * * `COMMON` - */ - -module.exports = Auction; diff --git a/src/structures/SkyBlock/Auctions/AuctionInfo.js b/src/structures/SkyBlock/Auctions/AuctionInfo.js deleted file mode 100644 index ca5be4b0b..000000000 --- a/src/structures/SkyBlock/Auctions/AuctionInfo.js +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Auction info class - */ -class AuctionInfo { - /** - * @param {object} data Auction info data - */ - constructor(data) { - /** - * Page number - * @type {number} - */ - this.page = parseInt(data.page, 10) || 0; - /** - * Total pages - * @type {number} - */ - this.totalPages = parseInt(data.totalPages, 10) || 1; - /** - * Total auctions - * @type {number} - */ - this.totalAuctions = parseInt(data.totalAuctions, 10) || 0; - /** - * Last updated timestamp - * @type {number} - */ - this.lastUpdatedTimestamp = data.lastUpdated; - /** - * Last updated timestamp as Date - * @type {Date} - */ - this.lastUpdatedAt = new Date(data.lastUpdated); - /** - * Age - * @type {number} - */ - - // eslint-disable-next-line no-underscore-dangle - this.age = parseInt(data._headers.get('age'), 10) || 0; - } - - _extend(name, value) { - this[name] = value; - return this; - } - /** - * Current Page / Total Page - * @return {string} - */ - toString() { - return `${this.page} / ${this.totalPages}`; - } -} - -module.exports = AuctionInfo; diff --git a/src/structures/SkyBlock/Auctions/BaseAuction.js b/src/structures/SkyBlock/Auctions/BaseAuction.js deleted file mode 100644 index 13923f97f..000000000 --- a/src/structures/SkyBlock/Auctions/BaseAuction.js +++ /dev/null @@ -1,49 +0,0 @@ -const ItemBytes = require('../../ItemBytes'); -/** - * Base auction class - */ -class BaseAuction { - /** - * @param {object} data Base auction data - * @param {boolean} includeItemBytes - */ - constructor(data, includeItemBytes) { - /** - * Auction ID - * @type {string|null} - */ - this.auctionId = data.uuid || data.auction_id || null; - /** - * Auctioneer UUID - * @type {string|null} - */ - this.auctioneerUuid = data.auctioneer || data.seller || null; - /** - * Auctioneer's skyblock profile ID - * @type {string|null} - */ - this.auctioneerProfile = data.profile_id || data.seller_profile || null; - /** - * Bin - * @type {boolean} - */ - this.bin = data.bin || false; - /** - * Item bytes - * @type {ItemBytes|null} - */ - this.itemBytes = - includeItemBytes && data.item_bytes - ? new ItemBytes(data.item_bytes.data ? data.item_bytes.data : data.item_bytes) - : null; - } - /** - * Auction ID - * @return {string} - */ - toString() { - return this.auctionId; - } -} - -module.exports = BaseAuction; diff --git a/src/structures/SkyBlock/Auctions/Bid.js b/src/structures/SkyBlock/Auctions/Bid.js deleted file mode 100644 index dc884522e..000000000 --- a/src/structures/SkyBlock/Auctions/Bid.js +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Bid class - */ -class Bid { - /** - * @param {object} data Bid data - */ - constructor(data) { - /** - * Auction ID - * @type {string|null} - */ - this.auctionId = data.auction_id || null; - /** - * Skyblock profile ID - * @type {string|null} - */ - this.profileId = data.profile_id || null; - /** - * Amount - * @type {number} - */ - this.amount = data.amount || 0; - /** - * Auction timestamp - * @type {number} - */ - this.timestamp = data.timestamp || null; - /** - * Auction timestamp as Date - * @type {Date} - */ - this.at = data.timestamp ? new Date(data.timestamp) : null; - /** - * Bidder - * @type {string} - */ - this.bidder = data.bidder || null; - } - /** - * Bidder Name - Bid Amount - * @return {string} - */ - toString() { - return `${this.bidder} bid ${this.amount} coins`; - } -} - -module.exports = Bid; diff --git a/src/structures/SkyBlock/Auctions/PartialAuction.js b/src/structures/SkyBlock/Auctions/PartialAuction.js deleted file mode 100644 index a62657103..000000000 --- a/src/structures/SkyBlock/Auctions/PartialAuction.js +++ /dev/null @@ -1,26 +0,0 @@ -const BaseAuction = require('./BaseAuction'); -/** - * Partial auction class - * @extends {BaseAuction} - */ -class PartialAuction extends BaseAuction { - /** - * @param {object} data Partial auction data - * @param {boolean} includeItemBytes - */ - constructor(data, includeItemBytes) { - super(data, includeItemBytes); - /** - * Buyer UUID - * @type {string} - */ - this.buyer = data.buyer || null; - /** - * Price - * @type {number} - */ - this.price = parseInt(data.price, 10) || 0; - } -} - -module.exports = PartialAuction; diff --git a/src/structures/SkyBlock/Bazzar/Order.js b/src/structures/SkyBlock/Bazzar/Order.js deleted file mode 100644 index bd17eff28..000000000 --- a/src/structures/SkyBlock/Bazzar/Order.js +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Order class - */ -class Order { - /** - * @param {object} data Order data - */ - constructor(data) { - /** - * Amount - * @type {number} - */ - this.amount = data.amount || 0; - /** - * Price per unit - * @type {number} - */ - this.pricePerUnit = data.pricePerUnit || 0; - /** - * Total price - * @type {number} - */ - this.totalPrice = Math.round(this.amount * this.pricePerUnit * 10) / 10; - /** - * Orders - * @type {number} - */ - this.orders = data.orders || 0; - } - /** - * Price as string - * @return {string} - */ - toString() { - return this.totalPrice; - } -} -module.exports = Order; diff --git a/src/structures/SkyBlock/Bazzar/Product.js b/src/structures/SkyBlock/Bazzar/Product.js deleted file mode 100644 index 245aba18f..000000000 --- a/src/structures/SkyBlock/Bazzar/Product.js +++ /dev/null @@ -1,53 +0,0 @@ -const Order = require('./Order'); - -/** - * Product class - */ -class Product { - /** - * @param {object} data Product data - */ - constructor(data) { - /** - * Product ID - * @type {string} - */ - this.productId = data.product_id; - /** - * Product sell orders - * @type {Order[]} - */ - this.sellSummary = data.sell_summary.length ? data.sell_summary.map((sellOrder) => new Order(sellOrder)) : []; - /** - * Product buy orders - * @type {Order[]} - */ - this.buySummary = data.buy_summary.length ? data.buy_summary.map((buyOrder) => new Order(buyOrder)) : []; - /** - * Product status - * @type {ProductStatus} - */ - this.status = { - sellPrice: isNaN(data.quick_status.sellPrice) ? 0 : Math.round(data.quick_status.sellPrice * 100) / 100, - buyPrice: isNaN(data.quick_status.buyPrice) ? 0 : Math.round(data.quick_status.buyPrice * 100) / 100, - sellVolume: isNaN(data.quick_status.sellVolume) ? 0 : data.quick_status.sellVolume, - buyVolume: isNaN(data.quick_status.buyVolume) ? 0 : data.quick_status.buyVolume, - sellMovingWeek: isNaN(data.quick_status.sellMovingWeek) ? 0 : data.quick_status.sellMovingWeek, - buyMovingWeek: isNaN(data.quick_status.buyMovingWeek) ? 0 : data.quick_status.buyMovingWeek, - sellOrders: isNaN(data.quick_status.sellOrders) ? 0 : data.quick_status.sellOrders, - buyOrders: isNaN(data.quick_status.buyOrders) ? 0 : data.quick_status.buyOrders - }; - } -} -/** - * @typedef {object} ProductStatus - * @property {number} sellPrice Sell price - * @property {number} buyPrice Buy price - * @property {number} sellVolume Sell volume - * @property {number} buyVolume Buy volume - * @property {number} sellMovingWeek Sell moving week - * @property {number} buyMovingWeek Sell moving week - * @property {number} sellOrders Sell orders - * @property {number} buyOrders Buy orders - */ -module.exports = Product; diff --git a/src/structures/SkyBlock/News/SkyblockNews.js b/src/structures/SkyBlock/News/SkyblockNews.js deleted file mode 100644 index a8a2ed64a..000000000 --- a/src/structures/SkyBlock/News/SkyblockNews.js +++ /dev/null @@ -1,60 +0,0 @@ -const dateRegExp = /(\d{1,2})(?:st|nd|rd|th|) ([A-Za-z]+) (\d+)/; -const versionRegExp = /v\d+(\.\d+){1,}/; - -// eslint-disable-next-line jsdoc/require-jsdoc -function parseDate(stringDate) { - const matched = stringDate.match(dateRegExp); - if (!matched) return null; - return new Date(matched.slice(1).join(' ')); -} - -// eslint-disable-next-line jsdoc/require-jsdoc -function parseVer(stringVer) { - const matches = versionRegExp.exec(stringVer); - if (!matches?.length) return null; - return matches[0]; -} -/** - * SkyblockNews - */ -class SkyblockNews { - /** - * @param {object} data - */ - constructor(data) { - /** - * Title - * @type {string} - */ - this.title = data.title; - /** - * Thread - * @type {string} - */ - this.link = data.link; - /** - * Raw Date from the API Response - * @type {string} - */ - this.rawDate = data.text; - /** - * Parsed Date - * @type {Date} - */ - this.date = parseDate(data.text); - /** - * The version from the title (Skyblock v0.12.57673856757.327.2 => v0.12.57673856757.327.2) - * @author linearaccelerator - * @type {string | null} - */ - this.version = parseVer(this.title); - } - /** - * News title - * @return {string} - */ - toString() { - return this.title; - } -} -module.exports = SkyblockNews; diff --git a/src/structures/SkyBlock/PlayerBingo.js b/src/structures/SkyBlock/PlayerBingo.js deleted file mode 100644 index 5454c12aa..000000000 --- a/src/structures/SkyBlock/PlayerBingo.js +++ /dev/null @@ -1,49 +0,0 @@ -const { populateGoals } = require('../../utils/SkyblockUtils'); -// eslint-disable-next-line no-unused-vars -const BingoDataType = require('./Static/BingoData.js'); -// eslint-disable-next-line no-unused-vars -const BingoType = require('./Static/Bingo.js'); -/** - * @typedef {BingoDataType} BingoData - * @typedef {BingoType} Bingo - */ - -/** - * Player Bingo Class - */ -class PlayerBingo { - /** - * Constructor - * @param {Object} data data - * @param {BingoData|null} bingoData bingo data - */ - constructor(data, bingoData) { - const events = data.success && Array.isArray(data.events) ? data.events : []; - /** - * Data per event - * @type {PlayerBingoDataPerEvent} - */ - this.dataPerEvent = events.map((eventData) => { - let doneGoals = eventData.completed_goals; - if (!Array.isArray(doneGoals)) doneGoals = []; - const enrichable = parseInt(eventData.key, 10) === bingoData?.id; - if (enrichable) doneGoals = populateGoals(doneGoals, bingoData.goals); - return { - eventId: parseInt(eventData.key, 10) || null, - points: parseInt(eventData.points, 10) || 0, - goalsCompleted: doneGoals, - enrichedGoals: enrichable - }; - }); - } -} - -/** - * @typedef {Object} PlayerBingoDataPerEvent - * @property {number} eventId ID of event - * @property {number} points Points acquired - * @property {boolean} enrichedGoals Whether the goals are enriched (populated with data from static skyblock bingp data) - * @property {Bingo[]|string[]} goalsCompleted Special Bingo Array if enrichedGoals is true. You can however always treat SpecialBingoArray as string[] - */ - -module.exports = PlayerBingo; diff --git a/src/structures/SkyBlock/SkyblockInventoryItem.js b/src/structures/SkyBlock/SkyblockInventoryItem.js deleted file mode 100644 index 62ba1ae59..000000000 --- a/src/structures/SkyBlock/SkyblockInventoryItem.js +++ /dev/null @@ -1,168 +0,0 @@ -const { parseRarity, parseGearScore } = require('../../utils/SkyblockUtils'); -/** - * Item class - */ -class SkyblockInventoryItem { - /** - * @param {object} data Item data - */ - constructor(data) { - /** - * Item ID - * @type {number} - */ - this.itemId = data.id || 0; - /** - * Item count - * @type {number} - */ - this.count = data.Count || 0; - /** - * Item name - * @type {string} - */ - this.name = - null !== data.tag.display.Name ? data.tag.display.Name.toString().replace(/§([1-9]|[a-f])|§/gm, '') : null; - /** - * Item lore - * @type {string} - */ - this.lore = data.tag.display.Lore.join('\n'); - /** - * Item lore - * @type {string[]} - */ - this.loreArray = data.tag.display.Lore; - /** - * Item lore for embed - * @type {string} - */ - this.loreForEmbed = this.lore.replace(/§([0-9]|[a-f])|§/gm, '').replace(/
/gm, '\n'); - /** - * Hexadecimal color code of armor - * @type {string|null} - */ - this.color = data.tag.ExtraAttributes.color ?? data.tag.display.color ?? null; - /** - * Item enchantments - * @type {Record} - */ - this.enchantments = data.tag.ExtraAttributes.enchantments ?? null; - /** - * Armor reforge - * @type {string} - */ - this.reforge = data.tag.ExtraAttributes.modifier ?? null; - /** - * Equipment gemstones (if any) - * @type {SkyblockItemGemstone} - */ - this.gemstones = data.tag.ExtraAttributes.gems - ? Object.entries(data.tag.ExtraAttributes.gems).map((gem) => { - return new Object({ type: gem[0].split('_')[0], quality: gem[1] }); - }) - : null; - /** - * Damage - * @type {number} - */ - this.damage = data.Damage || 0; - /** - * What rarity the item has, as an uppercase string - * @author linearaccelerator - * @type {string} - */ - this.rarity = parseRarity(this.loreArray[this.loreArray.length - 1]); - /** - * The amount of dungeon stars the item has (each star equates to a 10% stat boost while in dungeons) - * @type {number} - */ - this.dungeonStars = data.tag.ExtraAttributes.upgrade_level ?? 0; - /** - * Dungeon gear score of the item (or null if not present) - * @author linearaccelerator - * @type {number} - */ - this.gearScore = parseGearScore(this.loreArray) || null; - /** - * UUID of the item - * @type {string} - */ - this.uuid = data.tag.ExtraAttributes.uuid ?? ''; - /** - * Is the item soulbound - * @type {boolean} - */ - this.soulbound = 1 === data.tag.ExtraAttributes.donated_museum; - /** - * Amount of art of war books applied to the item - * @type {number} - */ - this.artOfWar = data.tag.ExtraAttributes.art_of_war_count ?? 0; - /** - * Rune - * @type {object} - */ - this.rune = data.tag.ExtraAttributes.runes ?? null; - /** - * The amount of applied potato books - * @type {number} - */ - this.hotPotatoBooks = data.tag.ExtraAttributes.hot_potato_count ?? 0; - /** - * Is the item recombobulated - * @type {boolean} - */ - this.recombobulated = 1 === data.tag.ExtraAttributes.rarity_upgrades; - /** - * Item attributes - * @type {object} - */ - this.attributes = data.tag.ExtraAttributes.attributes ?? {}; - /** - * Hecatomb runs - * @type {number} - */ - this.hecatomb = data.tag.ExtraAttributes.hecatomb_s_runs ?? 0; - /** - * Champion xp - * @type {number} - */ - this.champion = data.tag.ExtraAttributes.champion_combat_xp ?? 0; - /** - * Cultivating - * @type {number} - */ - this.cultivating = data.tag.ExtraAttributes.farmed_cultivating ?? 0; - /** - * Expertise Kills - * @type {number} - */ - this.expertise = data.tag.ExtraAttributes.expertise_kills ?? 0; - /** - * Compact blocks Mined - * @type {number} - */ - this.compact = data.tag.ExtraAttributes.compact_blocks ?? 0; - /** - * Armadillos Blocks Walked - * @type {number} - */ - this.blocksWalked = data.tag.ExtraAttributes.blocks_walked ?? 0; - } - /** - * Item Name - * @return {string} - */ - toString() { - return this.name; - } -} - -/** - * @typedef {object} SkyblockItemGemstone - * @property {string} type Gemstone type - * @property {string} quality Gemstone quality (rough, flawed, fine, flawless, perfect) - */ - -module.exports = SkyblockInventoryItem; diff --git a/src/structures/SkyBlock/SkyblockMember.js b/src/structures/SkyBlock/SkyblockMember.js deleted file mode 100644 index 0305a80d2..000000000 --- a/src/structures/SkyBlock/SkyblockMember.js +++ /dev/null @@ -1,594 +0,0 @@ -const { - getMemberStats, - decode, - getSkills, - getBestiaryLevel, - getSlayer, - getCrimson, - getDungeons, - getJacobData, - getChocolateFactory, - getPetLevel, - getHOTM -} = require('../../utils/SkyblockUtils'); -const SkyblockInventoryItem = require('./SkyblockInventoryItem'); -const SkyblockMuseum = require('./SkyblockMuseum'); -const SkyblockGarden = require('./SkyblockGarden'); -const Constants = require('../../utils/Constants'); -const skyhelper = require('skyhelper-networth'); -const SkyblockPet = require('./SkyblockPet'); -const Player = require('../Player'); - -/** - * Skyblock member class - */ -class SkyblockMember { - /** - * @param {object} data Skyblock member data - */ - constructor(data) { - /** - * Skyblock member UUID - * @type {string} - */ - this.uuid = data.uuid; - /** - * Skyblock member's player profile - * If `fetchPlayer` option is `true`. - * @type {Player|null} - */ - this.player = data.m.player || null; - /** - * If `getMuseum` option is `true`. - * @type {SkyblockMuseum|null} - */ - this.museum = data.museum || null; - /** - * If `getGarden` option is `true`. - * @type {SkyblockGarden|null} - */ - this.garden = data.garden || null; - /** - * Profile's gamemode - * @type {string|null} - */ - this.gameMode = data.gameMode; - /** - * Profile is selected - * @type {boolean} - */ - this.selected = data.selected; - /** - * Skyblock member's profile name - * @type {string} - */ - this.profileName = data.profileName; - /** - * Skyblock member's profile id - * @type {string} - */ - this.profileId = data.profileId; - /** - * Timestamp when player first joined SkyBlock - * @type {number} - */ - this.firstJoinTimestamp = data.m.profile?.first_join; - /** - * Timestamp when player first joined SkyBlock as Date - * @type {Date} - */ - this.firstJoinAt = new Date(data.m.profile?.first_join); - /** - * Experience - * @type {number} - */ - this.experience = data.m.leveling?.experience ?? 0; - /** - * Skyblock Level - * @type {number} - */ - this.level = this.experience ? this.experience / 100 : 0; - /** - * Heart of the Mountain - MiningSkill - * @type {SkyblockMemberHotm} - */ - this.hotm = getHOTM(data.m); - /** - * The highest magical power **Not current one** - * @type {number} - */ - this.highestMagicalPower = data.m.accessory_bag_storage?.highest_magical_power ?? 0; - /** - * Collected fairy souls - * @type {number} - */ - this.fairySouls = data.m?.fairy_soul?.total_collected ?? 0; - /** - * Amount of fairy soul exchanges - * @type {number} - */ - this.fairyExchanges = data.m?.fairy_soul?.fairy_exchanges ?? 0; - /** - * Skyblock member skills - * @type {SkyblockMemberSkills} - */ - this.skills = getSkills(data.m); - /** - * Bestiary of the user - * @type {number} - */ - this.bestiary = getBestiaryLevel(data.m); - /** - * Skyblock member slayer - * @type {SkyblockMemberSlayer|null} - */ - this.slayer = getSlayer(data.m); - /** - * Skyblock Member Crimson Isle - * @type {SkyblockMemberCrimsonIsle} - */ - this.crimson = getCrimson(data.m); - /** - * Skyblock member dungeons - * @type {SkyblockMemberDungeons|null} - */ - this.dungeons = getDungeons(data.m); - /** - * Skyblock member collections - * @type {object} - */ - this.collections = data.m.collection ? data.m.collection : null; - /** - * Skyblock coins in purse - * @type {number} - */ - this.purse = data.m?.currencies?.coin_purse ?? 0; - /** - * Skyblock member stats - * @type {object} - */ - this.stats = data.m.player_stats ? getMemberStats(data.m.player_stats) : null; - /** - * Skyblock pets - * @type {SkyblockPet[]} - */ - this.pets = data.m?.pets_data?.pets ? data.m.pets_data.pets.map((pet) => new SkyblockPet(pet)) : []; - /** - * Skyblock jacob data - * @type {jacobData} - */ - this.jacob = getJacobData(data.m); - /** - * Skyblock Chocolate Factory - * @type {chocolateFactoryData} - */ - this.chocolate = getChocolateFactory(data.m); - /** - * Equipped armor - * @return {Promise} - */ - this.getArmor = async () => { - const base64 = data.m.inventory.inv_armor; - const decoded = await decode(base64.data); - const armor = { - helmet: decoded[3].id ? new SkyblockInventoryItem(decoded[3]) : null, - chestplate: decoded[2].id ? new SkyblockInventoryItem(decoded[2]) : null, - leggings: decoded[1].id ? new SkyblockInventoryItem(decoded[1]) : null, - boots: decoded[0].id ? new SkyblockInventoryItem(decoded[0]) : null - }; - return armor; - }; - /** - * Wardrobe contents - * @return {Promise} - */ - this.getWardrobe = async () => { - const base64 = data.m?.inventory?.wardrobe_contents?.data; - if (!base64) return []; - const decoded = await decode(base64); - const armor = decoded - .filter((item) => 0 !== Object.keys(item).length) - .map((item) => new SkyblockInventoryItem(item)); - return armor; - }; - /** - * Skyblock member enderchest - * @return {Promise} - */ - this.getEnderChest = async () => { - let chest = data.m.inventory.ender_chest_contents; - if (!chest) return []; - - try { - chest = await decode(chest.data); - const edited = []; - for (let i = 0; i < chest.length; i++) { - if (!chest[i].id) { - continue; - } - edited.push(new SkyblockInventoryItem(chest[i])); - } - return edited; - } catch { - return []; - } - }; - /** - * Skyblock member inventory - * @return {Promise} - */ - this.getInventory = async () => { - let inventory = data.m.inventory.inv_contents; - if (!inventory) return []; - - try { - inventory = await decode(inventory.data); - const edited = []; - for (let i = 0; i < inventory.length; i++) { - if (!inventory[i].id) { - continue; - } - edited.push(new SkyblockInventoryItem(inventory[i])); - } - return edited; - } catch { - return []; - } - }; - /** - * Skyblock Member pet score - * @return {number} - */ - this.getPetScore = () => { - const highestRarity = {}; - for (const pet of data.m.pets_data.pets) { - if (!(pet.type in highestRarity) || Constants.petScore[pet.tier] > highestRarity[pet.type]) { - highestRarity[pet.type] = Constants.petScore[pet.tier]; - if ('PET_ITEM_TIER_BOOST' === pet.heldItem && 'MYTHIC' !== pet.tier) { - highestRarity[pet.type] += 1; - } - } - } - - const highestLevel = {}; - for (const pet of data.m.pets_data.pets) { - const maxLevel = 'GOLDEN_DRAGON' === pet.type ? 200 : 100; - const petLevel = getPetLevel(pet.exp, pet.tier, maxLevel); - - if (!(pet.type in highestLevel) || petLevel.level > highestLevel[pet.type]) { - if (petLevel.level < maxLevel) { - continue; - } - - highestLevel[pet.type] = 1; - } - } - - return ( - Object.values(highestRarity).reduce((a, b) => a + b, 0) + Object.values(highestLevel).reduce((a, b) => a + b, 0) - ); - }; - /** - * Skyblock member equipment - * @return {Promise} - */ - this.getEquipment = async () => { - let equipment = data.m.inventory.equipment_contents; - if (!equipment) return []; - - try { - equipment = await decode(equipment.data); - const playerEquipment = { - gauntlet: equipment[3].id ? new SkyblockInventoryItem(equipment[3]) : null, - belt: equipment[2].id ? new SkyblockInventoryItem(equipment[2]) : null, - cloak: equipment[1].id ? new SkyblockInventoryItem(equipment[1]) : null, - necklace: equipment[0].id ? new SkyblockInventoryItem(equipment[0]) : null - }; - return playerEquipment; - } catch { - return []; - } - }; - /** - * Skyblock member Personal Vault - * @return {Promise} - */ - this.getPersonalVault = async () => { - let vault = data.m.inventory.personal_vault_contents; - if (!vault) return []; - - try { - vault = await decode(vault.data); - const edited = []; - for (let i = 0; i < vault.length; i++) { - if (!vault[i].id) { - continue; - } - edited.push(new SkyblockInventoryItem(vault[i])); - } - return edited; - } catch { - return []; - } - }; - /** - * Skyblock member networth (Credit to skyhelper-networth package) - * @return {Promise} - */ - this.getNetworth = async () => { - try { - const nw = await skyhelper.getNetworth(data.m, data.banking?.balance ?? 0, { - onlyNetworth: true, - v2Endpoint: true, - cache: true, - museumData: data.museum?.raw ?? {} - }); - return nw; - } catch { - return []; - } - }; - } - /** - * UUID - * @return {string} - */ - toString() { - return this.uuid; - } -} -/** - * @typedef {object} SkyblockMemberEquipment - * @property {SkyblockInventoryItem|null} gauntlet Gauntlet - * @property {SkyblockInventoryItem|null} belt Belt - * @property {SkyblockInventoryItem|null} cloak Cloak - * @property {SkyblockInventoryItem|null} necklace Necklace - */ -/** - * @typedef {object} SkyblockMemberArmor - * @property {SkyblockInventoryItem|null} helmet Helmet - * @property {SkyblockInventoryItem|null} chestplate Chestplate - * @property {SkyblockInventoryItem|null} leggings Leggings - * @property {SkyblockInventoryItem|null} boots Boots - */ -/** - * @typedef {object} SkyblockMemberSkills - * @property {SkyblockSkillLevel} combat Combat skill - * @property {SkyblockSkillLevel} farming Farming skill - * @property {SkyblockSkillLevel} fishing Fishing skill - * @property {SkyblockSkillLevel} mining Mining skill - * @property {SkyblockSkillLevel} foraging Foraging skills - * @property {SkyblockSkillLevel} enchanting Enchanting skill - * @property {SkyblockSkillLevel} alchemy Alchemy skill - * @property {SkyblockSkillLevel} carpentry Carpentry skill - * @property {SkyblockSkillLevel} runecrafting Runecrafting skill - * @property {SkyblockSkillLevel} taming Taming skill - * @property {SkyblockSkillLevel} social Social skill - * @property {number} average Average skill level - */ -/** - * @typedef {object} SkyblockSkillLevel - * There is list of skills: {@link SkyblockMemberSkills}.
- * Usage: `.skills.farming.xp`. - * - * @property {number} xp Total XP - * @property {number} level Level - * @property {number} maxLevel Max level - * @property {number} xpCurrent Current XP - * @property {number} xpForNext XP for next level - * @property {number} progress Progress - * @property {boolean} cosmetic Cosmetic - */ -/** - * @typedef {object} SkyblockMemberSlayer - * @property {SkyblockMemberSlayerLevel} zombie Zombie - * @property {SkyblockMemberSlayerLevel} spider Spider - * @property {SkyblockMemberSlayerLevel} wolf Wolf - * @property {SkyblockMemberSlayerLevel} enderman Enderman - * @property {SkyblockMemberSlayerLevel} blaze Blaze - * @property {SkyblockMemberSlayerLevel} vampire Vampire - */ -/** - * @typedef {object} SkyblockMemberSlayerLevel - * @property {number} xp Total XP - * @property {number} tier1 Tier 1 - * @property {number} tier2 Tier 2 - * @property {number} tier3 Tier 3 - * @property {number} tier4 Tier 4 - * @property {number} tier5 Tier 5 - * @property {number} level Level - */ -/** - * @typedef {object} SkyblockMemberCrimsonIsle - * @property {"mages"|"barbarians"|null} faction Faction - * @property {SkyblockMemberCrimsonIsleRepuation} repuation Repuation - * @property {SkyblockMemberCrimsonIsleTrophyFish} trophyFish trophyFish - * @property {SkyblockMemberCrimsonIsleKuudra} kuudra Kuudra - */ -/** - * @typedef {object} SkyblockMemberCrimsonIsleTrophyFishDojo - * @property {"Black"|"Brown"|"Blue"|"Green"|"Yellow"|"White"} belt Belt Color - * @property {SkyblockMemberCrimsonIsleTrophyFishDojoMode} force Force - * @property {SkyblockMemberCrimsonIsleTrophyFishDojoMode} stamina Stamina - * @property {SkyblockMemberCrimsonIsleTrophyFishDojoMode} mastery Mastery - * @property {SkyblockMemberCrimsonIsleTrophyFishDojoMode} discipline Discipline - * @property {SkyblockMemberCrimsonIsleTrophyFishDojoMode} swiftness Swiftness - * @property {SkyblockMemberCrimsonIsleTrophyFishDojoMode} control Control - * @property {SkyblockMemberCrimsonIsleTrophyFishDojoMode} tenacity Tenacity - */ -/** - * @typedef {object} SkyblockMemberCrimsonIsleTrophyFishDojoMode - * @property {number} points Points - * @property {"S"|"A"|"B"|"C"|"D"|"F"} rank Rank - */ -/** - * @typedef {object} SkyblockMemberCrimsonIsleTrophyFish - * @property {'Bronze'|'Silver'|'Gold'|'Diamond'|null} rank Trophy Fish Rank - * @property {SkyblockMemberCrimsonIsleTrophyFishCaught} caught - */ -/** - * @typedef {object} SkyblockMemberCrimsonIsleTrophyFishCaught - * @property {number} total Total Caught - * @property {number} bronze Bronze Caught - * @property {number} silver Silver Caught - * @property {number} gold Gold Caught - * @property {number} diamond Diamond Caught - */ -/** - * @typedef {object} SkyblockMemberCrimsonIsleRepuation - * @property {number} barbarians barbarian Repuation - * @property {number} mages mage Repuation - */ -/** - * @typedef {object} SkyblockMemberCrimsonIsleKuudra - * @property {number} none None Completions - * @property {number} hot Hot Completions - * @property {number} burning Burning Completions - * @property {number} fiery Fiery Completions - * @property {number} highestWaveHot Highest Wave Hot - * @property {number} highestWaveFiery Highest Wave Fiery - * @property {number} infernal Infernal Completions - * @property {number} highestWaveInfernal Highest Wave Infernal - * @property {number} highestWaveBurning Highest Wave Burning - */ -/** - * @typedef {object} SkyblockMemberDungeons - * @property {SkyblockSkillLevel} experience Dungeons Experience - * @property {number} secrets Amount of secrets found - * @property {SkyblockMemberDungeonsCompletions} completions Dungeon completions - * @property {SkyblockMemberDungeonsFloors} floors Dungeon Floor Stats - */ -/** - * @typedef {object} SkyblockMemberDungeonsCompletions - * @property {Record} catacombs Normal Dungeons - * @property {Record} masterCatacombs Master Mode Dungeons - */ -/** - * @typedef {object} SkyblockMemberDungeonsClasses - * @property {SkyblockSkillLevel} healer Healer class - * @property {SkyblockSkillLevel} mage Mage class - * @property {SkyblockSkillLevel} berserk Berserk class - * @property {SkyblockSkillLevel} archer Archer class - * @property {SkyblockSkillLevel} tank Tank class - * @property {string} selected Current Selected Class - */ -/** - * @typedef {object} SkyblockMemberDungeonsFloorRun - * @property {number} timestamp Timestamp - * @property {number} score_exploration Score Exploration - * @property {number} score_speed Score Speed - * @property {number} score_skill Score Skill - * @property {number} score_bonus Score Bonus - * @property {string} dungeon_class Dungeon Class - * @property {string[]} teammates Teammates - * @property {number} elapsed_time Elapsed Time - * @property {number} damage_dealt Damage Dealt - * @property {number} deaths Deaths - * @property {number} mobs_killed Mobs Killed - * @property {number} secrets_found Secrets Found - * @property {number} damage_mitigated Damage Mitigated - */ -/** - * @typedef {object} SkyblockMemberDungeonsFloor - * @property {SkyblockMemberDungeonsFloorRun} fastestRun Fastest Run - * @property {SkyblockMemberDungeonsFloorRun} fastestSRun Fastest S Run - * @property {SkyblockMemberDungeonsFloorRun} fastestSPlusRun Fastest S+ Run - * @property {number} completions Completions - */ -/** - * @typedef {object} SkyblockMemberDungeonsFloors - * @property {SkyblockMemberDungeonsFloor} entrance Entrance Stats - * @property {SkyblockMemberDungeonsFloor} floor1 Floor 1 Stats - * @property {SkyblockMemberDungeonsFloor} floor2 Floor 2 Stats - * @property {SkyblockMemberDungeonsFloor} floor3 Floor 3 Stats - * @property {SkyblockMemberDungeonsFloor} floor4 Floor 4 Stats - * @property {SkyblockMemberDungeonsFloor} floor5 Floor 5 Stats - * @property {SkyblockMemberDungeonsFloor} floor6 Floor 6 Stats - * @property {SkyblockMemberDungeonsFloor} floor7 Floor 7 Stats - * @property {SkyblockMemberDungeonsFloor} masterCatacombs1 Master Mode Floor 1 Stats - * @property {SkyblockMemberDungeonsFloor} masterCatacombs2 Master Mode Floor 2 Stats - * @property {SkyblockMemberDungeonsFloor} masterCatacombs3 Master Mode Floor 3 Stats - * @property {SkyblockMemberDungeonsFloor} masterCatacombs4 Master Mode Floor 4 Stats - * @property {SkyblockMemberDungeonsFloor} masterCatacombs5 Master Mode Floor 5 Stats - * @property {SkyblockMemberDungeonsFloor} masterCatacombs6 Master Mode Floor 6 Stats - * @property {SkyblockMemberDungeonsFloor} masterCatacombs7 Master Mode Floor 7 Stats - */ -/** - * @typedef {object} jacobDataPerks - * @property {number} doubleDrops Double drops - * @property {number} farmingLevelCap Farming level cap - * @property {boolean} personalBests Personal Bests - */ -/** - * @typedef {object} jacobDataMedals - * @property {number} gold gold medals - * @property {number} silver silver medals - * @property {number} bronze bronze medals - */ -/** - * @typedef {object} jacobData - * @property {jacobDataMedals} medals Medals - * @property {jacobDataPerks} perks Perks - * @property {object} contests Contests - */ -/** - * @typedef {object} chocolateFactoryDataEmployees - * @property {number} bro bro employee level - * @property {number} cousin cousin employee level - * @property {number} sis sis employee level - * @property {number} father father employee level - * @property {number} grandma grandma employee level - * @property {number} dog dog employee level - * @property {number} uncle uncle employee level - */ -/** - * @typedef {object} chocolateFactoryDataChocolate - * @property {number} count amount of current chocolate - * @property {number} total total amount of chocolate - * @property {number} sincePrestige amount of chocolate since prestige - */ -/** - * @typedef {object} chocolateFactoryDataTimeTower - * @property {number} charge amount of charges in the time tower - * @property {number} level level of the time tower - */ -/** - * @typedef {object} chocolateFactoryDataUpgrades - * @property {number} click amount of click upgrades - * @property {number} multiplier amount of multiplier upgrades - * @property {number} rabbitRarity amount of rabbit rarity upgrades - */ -/** - * @typedef {object} chocolateFactoryDataGoldenClick - * @property {number} amount amount of golden clicks - * @property {number} year year - */ -/** - * @typedef {object} chocolateFactoryData - * @property {chocolateFactoryDataEmployees} employees Employees - * @property {chocolateFactoryDataChocolate} chocolate Chocolate - * @property {chocolateFactoryDataTimeTower} timeTower Time Tower - * @property {chocolateFactoryDataUpgrades} upgrades Upgrades - * @property {chocolateFactoryDataGoldenClick} goldenClick Golden Click - * @property {number} barnCapacity Barn Capacity - * @property {number} prestige Prestige - */ -/** - * @typedef {object} SkyblockMemberHotmPowderData - * @property {number} spent Spent HOTM Powder - * @property {number} current Current HOTM Powder - * @property {number} total Total HOTM Powder - */ -/** - * @typedef {object} SkyblockMemberHotmPowder - * @property {SkyblockMemberHotmPowderData} mithril Mithril Powder - * @property {SkyblockMemberHotmPowderData} gemstone Gemstone Powder - * @property {SkyblockMemberHotmPowderData} glacite Glacite Powder - */ -/** - * @typedef {object} SkyblockMemberHotm - * @property {SkyblockSkillLevel} experience Experience - * @property {string} ability Selected Ability - * @property {SkyblockMemberHotmPowder} powder Powder Data - */ -module.exports = SkyblockMember; diff --git a/src/structures/SkyBlock/SkyblockMuseum.js b/src/structures/SkyBlock/SkyblockMuseum.js deleted file mode 100644 index 8753275e7..000000000 --- a/src/structures/SkyBlock/SkyblockMuseum.js +++ /dev/null @@ -1,60 +0,0 @@ -const SkyblockMuseumItem = require('./SkyblockMuseumItem'); -const { decode } = require('../../utils/SkyblockUtils'); -/** - * Skyblock Museum class - */ -class SkyblockMuseum { - /** - * @param {object} data Skyblock member data - */ - constructor(data) { - /** - * Raw data - * @type {object} - */ - this.raw = data.m.members?.[data.uuid] ?? {}; - /** - * Normal Items - * @returns {SkyblockMuseumItem[]} - */ - this.getItems = async () => { - const keys = Object.keys(data.m.members[data.uuid].items); - const items = []; - for (const key of keys) { - const decoded = await decode(data.m.members[data.uuid].items[key].items.data); - items.push( - new SkyblockMuseumItem({ - decoded: decoded, - borrowing: data.m.members[data.uuid].items[key].borrowing ?? false, - featuredSlot: data.m.members[data.uuid].items[key].featured_slot ?? null, - donatedTime: data.m.members[data.uuid].items[key].donated_time, - name: key.toLowerCase().replace(/_/g, ' ') - }) - ); - } - return items; - }; - /** - * Special items - * @returns {SkyblockMuseumItem[]} - */ - this.getSpecial = async () => { - const items = []; - for (const item of data.m.members[data.uuid].special) { - const decoded = await decode(item.items.data); - items.push( - new SkyblockMuseumItem({ - decoded: decoded, - borrowing: item.borrowing ?? false, - featuredSlot: item.featured_slot ?? null, - donatedTime: item.donated_time, - name: null - }) - ); - } - return items; - }; - } -} - -module.exports = SkyblockMuseum; diff --git a/src/structures/SkyBlock/SkyblockMuseumItem.js b/src/structures/SkyBlock/SkyblockMuseumItem.js deleted file mode 100644 index c1ea7cee5..000000000 --- a/src/structures/SkyBlock/SkyblockMuseumItem.js +++ /dev/null @@ -1,54 +0,0 @@ -const SkyblockInventoryItem = require('./SkyblockInventoryItem'); -/** - * Item class - */ -class SkyblockMuseumItem { - /** - * @param {object} data Item data - */ - constructor(data) { - /** - * Item name - * @type {string|null} - **/ - this.name = data.name; - /** - * Item - * @type {SkyblockInventoryItem[]} - */ - this.items = []; - data.decoded.forEach((item) => { - if (!item.tag) return; - this.items.push(new SkyblockInventoryItem(item)); - }); - /** - * Donated Time - * @type {number} - */ - this.donatedTime = data.donatedTime; - /** - * Donated Time as Date - * @type {Date} - */ - this.donatedTimeAt = new Date(data.donatedTime); - /** - * Borrowing - * @type {boolean} - */ - this.borrowing = data.borrowing; - /** - * Featured Slot - * @type {string|null} - */ - this.featuredSlot = data.featuredSlot; - } - /** - * Item Name - * @return {string} - */ - toString() { - return this.name; - } -} - -module.exports = SkyblockMuseumItem; diff --git a/src/structures/SkyBlock/SkyblockPet.js b/src/structures/SkyBlock/SkyblockPet.js deleted file mode 100644 index f6e07a78d..000000000 --- a/src/structures/SkyBlock/SkyblockPet.js +++ /dev/null @@ -1,71 +0,0 @@ -const { petScore } = require('../../utils/Constants'); -/** - * Skyblock Pet class - */ -class SkyblockPet { - /** - * Skyblock pet data - * @param {object} data - */ - constructor(data) { - /** - * Skyblock Pet UUID - * @type {string} - */ - this.uuid = data.uuid; - /** - * Skyblock Pet type - * @type {string} - */ - this.type = data.type; - /** - * Skyblock Pet experience - * @type {number} - */ - this.xp = data.exp || 0; - /** - * wether the pet is currently equipped - * @type {boolean} - */ - this.active = Boolean(data.active); - /** - * Skyblock Pet rarity - * @type {Rarity} - */ - this.rarity = data.tier; - /** - * Skyblock Pet score - * @type {number} - */ - - this.petScore = petScore[data.tier] || 0; - /** - * Skyblock Pet held item - * @type {string|null} - */ - this.heldItem = data.heldItem ? data.heldItem.replace(/^PET_ITEM_/, '') : null; - /** - * Skyblock Pet candy used - * @type {number} - */ - this.candyUsed = data.candyUsed || 0; - /** - * Skyblock Pet skin - * @type {string|null} - */ - this.skin = data.skin; - } -} -/** - * @typedef {string} Rarity - * * `VERY_SPECIAL` - * * `SPECIAL` - * * `SUPREME` - * * `MYTHIC` - * * `LEGENDARY` - * * `EPIC` - * * `RARE` - * * `UNCOMMON` - * * `COMMON` - */ -module.exports = SkyblockPet; diff --git a/src/structures/SkyBlock/SkyblockProfile.js b/src/structures/SkyBlock/SkyblockProfile.js deleted file mode 100644 index dc6b60aea..000000000 --- a/src/structures/SkyBlock/SkyblockProfile.js +++ /dev/null @@ -1,81 +0,0 @@ -const SkyblockGarden = require('./SkyblockGarden'); -const SkyblockMember = require('./SkyblockMember'); -/** - * Skyblock Profile class - */ -class SkyblockProfile { - /** - * Skyblock profile data - * @param {object} data - */ - constructor(data) { - /** - * Skyblock profile ID - * @type {string} - */ - this.profileId = data.profileId; - /** - * Skyblock profile name - * @type {string} - */ - this.profileName = data.profileName; - /** - * Profile's gamemode - * @type {string|null} - */ - this.gameMode = data.gameMode; - /** - * Profile's banking - * @type {object} - */ - this.banking = data.banking; - /** - * Profile's garden - * @type {SkyblockGarden|null} - */ - this.garden = data.garden || null; - /** - * Profile's community upgrades - * @type {object} - */ - this.communityUpgrades = data.communityUpgrades; - /** - * Profile is selected - * @type {boolean} - */ - this.selected = data.selected; - /** - * Skyblock profile members - * @type {SkyblockMember[]} - */ - this.members = Object.keys(data.members).map( - (uuid) => - new SkyblockMember({ - uuid: uuid, - profileId: this.profileId, - profileName: this.profileName, - gameMode: this.gameMode, - m: data.members[uuid], - banking: this.banking, - communityUpgrades: this.communityUpgrades, - museum: null, - garden: this.garden, - selected: this.selected - }) - ); - /** - * Queried player's member stats - * @type {SkyblockMember} - */ - this.me = this.members.find((x) => x.uuid === data.uuid); - } - /** - * Profile Name - * @return {string} - */ - toString() { - return this.profileName; - } -} - -module.exports = SkyblockProfile; diff --git a/src/structures/SkyBlock/Static/Bingo.js b/src/structures/SkyBlock/Static/Bingo.js deleted file mode 100644 index acd474854..000000000 --- a/src/structures/SkyBlock/Static/Bingo.js +++ /dev/null @@ -1,101 +0,0 @@ -// eslint-disable-next-line jsdoc/require-jsdoc -function parsePosition(position) { - const x = (position % 5) + 1; - const y = Math.floor(position / 5) + 1; - return [x, y]; -} -/** - * Bingo class - */ -class Bingo { - /** - * Constructor - * @param {Object} data data - * @param {number} position Position - */ - constructor(data, position = 0) { - /** - * Name of this bingo goal - * @type {string} - */ - this.name = data.name; - /** - * string ID (code name) - * @type {string} - */ - this.id = data.id; - const [row, column] = parsePosition(position); - /** - * 1-indexed row - * @type {number|null} - */ - this.row = row; - /** - * 1-indexed colmun - * @type {number|null} - */ - this.column = column; - /** - * Bingo lore, with color codes - * @type {string} - */ - this.rawLore = data.lore; - /** - * Bingo lore in plain text - * @type {string} - */ - this.lore = data.lore?.replace?.(/§([1-9]|[a-l])|§/gm, '') || null; - /** - * Only available for TIERED bingos - * Shows you the requirement for each tier of this achievement - * @type {number[]} - */ - this.tiers = Array.isArray(data.tiers) ? data.tiers.map((x) => parseInt(x, 10) || 0) : null; - /** - * Only available for TIERED bingos - * Difference between each tier requirement, if it is constant - * @type {number|null} - */ - this.tierStep = this.getTierStep(); - /** - * Only available for ONE_TIERED bingos - * @type {number|null} - */ - this.requiredAmount = parseInt(data.requiredAmount, 10) ?? null; - /** - * Type of Bingo - * ONE_TIME means the goal doesn't have a specific amount - * ONE_TIER means the goal specifies 1 amount to achieve - * TIERED means the goal specifies more than 1 amount to achieve - * @type {'ONE_TIME'|'ONE_TIER'|'TIERED'} - */ - this.type = this.tiers ? 'TIERED' : this.requiredAmount ? 'ONE_TIER' : 'ONE_TIME'; - } - /** - * As string - * BEWARE this returns ID to assure compatibility with PlayerBingo - * @return {string} - */ - toString() { - return this.id; - } - /** - * Gets tier step, if constant - * @private - * @returns {number|null} - */ - getTierStep() { - if ('TIERED' !== this.type) return null; - // No step possible - if (2 > this.tiers.length) return null; - const hypotheticStep = this.tiers[1] - this.tiers[0]; - // Check if every 2 elements have the same step - const isConstant = this.tiers.slice(1).every((el, index) => { - return hypotheticStep === this.tiers[index - 1] - el; - }); - if (!isConstant) return null; - return hypotheticStep; - } -} - -module.exports = Bingo; diff --git a/src/structures/SkyBlock/Static/BingoData.js b/src/structures/SkyBlock/Static/BingoData.js deleted file mode 100644 index 42a6cb363..000000000 --- a/src/structures/SkyBlock/Static/BingoData.js +++ /dev/null @@ -1,45 +0,0 @@ -const Bingo = require('./Bingo.js'); - -/** - * SB Bingo Class - */ -class BingoData { - /** - * constructor - * @param {Object} data - */ - constructor(data) { - /** - * Last time this resource was updated - * @type {number} - */ - this.lastUpdatedTimestamp = parseInt(data.lastUpdated, 10); - /** - * Last time this resource was updated, as Date - * @type {Date|null} - */ - this.lastUpdatedAt = new Date(this.lastUpdatedTimestamp); - /** - * Bingo ID - * @type {number|null} - */ - this.id = parseInt(data.id, 10) || null; - /** - * Goals - * @type {Bingo[]|null} - */ - this.goals = Array.isArray(data.goals) ? data.goals.map((goal, index) => new Bingo(goal, index)) : null; - } - /** - * Gets a goal on the bingo table by row and column - * @param {number} column Column number (starts at 1) - * @param {number} row Row number (starts at 1) - * @returns {Bingo|undefined} - */ - getGoal(column, row) { - if (!this.goals || 1 > this.goals.length) return; - return this.goals.find((goal) => goal.row === row && goal.column === column); - } -} - -module.exports = BingoData; diff --git a/src/structures/SkyBlock/Static/Candidate.js b/src/structures/SkyBlock/Static/Candidate.js deleted file mode 100644 index 9626a0f7c..000000000 --- a/src/structures/SkyBlock/Static/Candidate.js +++ /dev/null @@ -1,50 +0,0 @@ -const Perk = require('./Perk'); -/** - * Candidate class - */ -class Candidate { - /** - * Constructor - * @param {Object} data data - * @param {boolean} [isMayor=false] if this candidate is the current mayor - */ - constructor(data, isMayor = false, isMinister = false) { - /** - * Mayor's name - * @type {string} - */ - this.name = data.name; - /** - * Mayor's Key Benefit (in 1 word) - * @type {string} - */ - this.keyBenefit = data.key; - /** - * Mayor's Perk (Only shows if its the Minister) - * @type {Perk|null} - */ - this.perk = data.perk?.[0] ? new Perk(data.perk[0]) : null; - /** - * Perks - * @type {Perk[]} - */ - this.perks = data.perks?.map((x) => new Perk(x)) ?? []; - /** - * If this candidate is the current mayor - * @type {boolean} - */ - this.isMayor = isMayor || false; - /** - * If this candidate is the current mayor - * @type {boolean} - */ - this.isMinister = isMinister || false; - /** - * The number of votes received by this candidate - * @type {number} - */ - this.votesReceived = parseInt(data.votes, 10) || 0; - } -} - -module.exports = Candidate; diff --git a/src/structures/SkyBlock/Static/FireSale.js b/src/structures/SkyBlock/Static/FireSale.js deleted file mode 100644 index 20dfa18c4..000000000 --- a/src/structures/SkyBlock/Static/FireSale.js +++ /dev/null @@ -1,55 +0,0 @@ -/** - * SB Fire Sale - */ -class FireSale { - /** - * constructor - * @param {Object} data - */ - constructor(data) { - /** - * Item ID - * @type {string|null} - */ - this.itemId = data.item_id || null; - /** - * Start Timestamp as a unix - * @type {number} - */ - this.startTimestamp = parseInt(data.start, 10); - /** - * Start Date - * @type {Date} - */ - this.startAt = new Date(this.startTimestamp); - /** - * End Timestamp as a unix - * @type {number} - */ - this.endTimestamp = parseInt(data.end, 10); - /** - * End Date - * @type {Date} - */ - this.endAt = new Date(this.endTimestamp); - /** - * Amount of items being sold - * @type {number} - */ - this.amount = data.amount || 0; - /** - * Price - * @type {number} - */ - this.price = data.price || 0; - } - /** - * Item Id - * @return {string|null} - */ - toString() { - return this.itemId; - } -} - -module.exports = FireSale; diff --git a/src/structures/SkyBlock/Static/Government.js b/src/structures/SkyBlock/Static/Government.js deleted file mode 100644 index d0286455b..000000000 --- a/src/structures/SkyBlock/Static/Government.js +++ /dev/null @@ -1,79 +0,0 @@ -const Candidate = require('./Candidate'); - -/** - * SB Government Class - */ -class GovernmentData { - /** - * constructor - * @param {Object} data - */ - constructor(data) { - /** - * Last time this resource was updated - * @type {number} - */ - this.lastUpdatedTimestamp = parseInt(data.lastUpdated, 10); - /** - * Last time this resource was updated, as Date - * @type {Date|null} - */ - this.lastUpdatedAt = new Date(this.lastUpdatedTimestamp); - const lastElectionResults = data.mayor.election.candidates.map((x) => new Candidate(x, x.name === data.mayor.name)); - /** - * A map of last election results for each candidate - * Sorted ascendingly by votes received - * @type {Map} - */ - this.lastElectionResults = new Map( - lastElectionResults - .sort((a, b) => a.votesReceived - b.votesReceived) - .reverse() - .map((x) => [x.name, x]) - ); - /** - * The mayor - * @type {Candidate} - */ - this.mayor = this.lastElectionResults.get(data.mayor.name); - /** - * Minister - * @type {Candidate} - */ - this.minister = new Candidate(data.mayor.minister, false, true); - /** - * The year the mayor will be running for - * @type {number} - */ - this.runningYear = parseInt(data.mayor.election.year, 10) || 0; - const thisElection = data.current?.candidates.map((x) => new Candidate(x, x.name === data.mayor.name)) || null; - /** - * Current elections, valid for next year - * Sorted ascendingly by votes received - * RESULTS MIGHT BE TEMPORARY - * @type {Map|null} - */ - this.currentElectionResults = thisElection - ? new Map( - thisElection - .sort((a, b) => a.votesReceived - b.votesReceived) - .reverse() - .map((x) => [x.name, x]) - ) - : null; - /** - * The year the current election will be effective for - * @type {number|null} - */ - this.currentElectionFor = parseInt(data.current?.year, 10) || null; - } - /** - * Current Mayor - * @return {string} - */ - toString() { - return this.mayor.name; - } -} - -module.exports = GovernmentData; diff --git a/src/structures/SkyBlock/Static/Perk.js b/src/structures/SkyBlock/Static/Perk.js deleted file mode 100644 index 17fe0a1b6..000000000 --- a/src/structures/SkyBlock/Static/Perk.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Candidate class - */ -class Perk { - /** - * Constructor - * @param {Object} data data - */ - constructor(data) { - /** - * Perk's Name - * @type {string} - */ - this.name = data.name; - /** - * Perk's Description - * @type {string} - */ - this.description = data.description; - } -} - -module.exports = Perk; diff --git a/src/structures/Static/Achievement.js b/src/structures/Static/Achievement.js deleted file mode 100644 index 6707e0cde..000000000 --- a/src/structures/Static/Achievement.js +++ /dev/null @@ -1,87 +0,0 @@ -const AchievementTier = require('./AchievementTier'); - -// eslint-disable-next-line jsdoc/require-jsdoc -function collectAll(data) { - const mTier = data.maxTier; - let totalPoints = 0; - let totalAmount = 0; - for (let i = 1; i <= mTier; i++) { - totalPoints += data.getTier(i).pointsRewarded; - totalAmount += data.getTier(i).amountRequired; - } - return { totalPoints, totalAmount }; -} - -/** - * Achievement Class - */ -class Achievement { - /** - * constructor - * @param {string} achievementName Name of achievement - * @param {Object} data - */ - constructor(achievementName, data) { - /** - * Name of achievement, trimmed trailing spaces - * @type {string} - */ - this.name = data.name.trim(); - /** - * Code name of achievement - * @type {string} - */ - this.codeName = achievementName; - /** - * Description, trimmed trailing spaces - * @type {string} - */ - this.description = data.description.trim(); - /** - * Type of achievement - * @type {'ONE_TIME'|'TIERED'} - */ - this.type = data.tiers ? 'TIERED' : 'ONE_TIME'; - /** - * ONLY AVAILABLE IN PERSONAL ONE TIME ACHIEVEMENTS, last checked April 26th - * Unlock rate of this achievement - * Local : Fraction of players that have played the game and gotten this achievement (0 to 1 inclusive) - * Global : Fraction of players that have played Hypixel and gotten this achievement (0 to 1 inclusive) - * ...percentage : In percentage (0 to 100 inclusive) - * @type {Record<'local'|'localPercentage'|'global'|'globalPercentage', number>|null} - */ - this.rarity = { - local: parseFloat(data.gamePercentUnlocked) || 0, - localPercentage: parseFloat(data.gamePercentUnlocked) * 100 || 0, - global: data.globalPercentUnlocked, - globalPercentage: parseFloat(data.globalPercentUnlocked) * 100 || 0 - }; - /** - * ONLY AVAILABLE FOR TIERED - * @type {AchievementTier|null} - */ - this.tierInformation = 'TIERED' === this.type ? new AchievementTier(data.tiers) : null; - - const { totalPoints, totalAmount } = 'TIERED' === this.type ? collectAll(this.tierInformation) : {}; - /** - * Total points worth (sum of all tiers if tiered) - * This is always 0 for Guild Achievements - * @type {number} - */ - this.points = 'ONE_TIME' === this.type ? parseInt(data.points, 10) : totalPoints; - /** - * Total amount required to reach max tier, only for tiered - * @type {number|null} - */ - this.totalAmountRequired = 'TIERED' === this.type ? totalAmount : null; - } - /** - * As string - * @return {string} - */ - toString() { - return this.achievementName; - } -} - -module.exports = Achievement; diff --git a/src/structures/Static/AchievementTier.js b/src/structures/Static/AchievementTier.js deleted file mode 100644 index 7b13b037c..000000000 --- a/src/structures/Static/AchievementTier.js +++ /dev/null @@ -1,33 +0,0 @@ -/** - * AchievementTier class - */ -class AchievementTier { - /** - * @param {Record} data - */ - constructor(data) { - /** - * Maximum tier reachable - * getTier will be take any integer from 1 to this number (inclusive) - * @type {number} - */ - this.maxTier = data.length; - // Still make sure it is well sorted - this.tierInfo = data.sort(({ tier: tierA }, { tier: tierB }) => Number(tierA) - Number(tierB)); - } - /** - * Gets information for tier - * @param {number} tier Tier number (1-indexed!) - * @returns {Record<'pointsRewarded'|'amountRequired', number>} - */ - getTier(tier) { - const index = tier - 1; - const info = this.tierInfo[index]; - return { - pointsRewarded: parseInt(info.points, 10) || 0, - amountRequired: parseInt(info.amount, 10) || 0 - }; - } -} - -module.exports = AchievementTier; diff --git a/src/structures/Static/Achievements.js b/src/structures/Static/Achievements.js deleted file mode 100644 index f568dee2b..000000000 --- a/src/structures/Static/Achievements.js +++ /dev/null @@ -1,30 +0,0 @@ -const GameAchievements = require('./GameAchievements.js'); - -/** - * Achievement class - */ -class Achievements { - /** - * @param {object} data data - */ - constructor(data) { - /** - * Last time this resource was updated - * @type {number} - */ - this.lastUpdatedTimestamp = parseInt(data.lastUpdated, 10); - /** - * Last time this resource was updated, as Date - * @type {Date|null} - */ - this.lastUpdatedAt = new Date(this.lastUpdatedTimestamp); - /** - * @type {Record} - */ - this.achievementsPerGame = Object.fromEntries( - Object.entries(data.achievements).map(([game, data]) => [game, new GameAchievements(game, data)]) - ); - } -} - -module.exports = Achievements; diff --git a/src/structures/Static/Challenges.js b/src/structures/Static/Challenges.js deleted file mode 100644 index dff19b1ae..000000000 --- a/src/structures/Static/Challenges.js +++ /dev/null @@ -1,29 +0,0 @@ -const GameChallenges = require('./GameChallenges.js'); -/** - * Achievement class - */ -class Challenges { - /** - * @param {object} data data - */ - constructor(data) { - /** - * Last time this resource was updated - * @type {number} - */ - this.lastUpdatedTimestamp = parseInt(data.lastUpdated, 10); - /** - * Last time this resource was updated, as Date - * @type {Date|null} - */ - this.lastUpdatedAt = new Date(this.lastUpdatedTimestamp); - /** - * @type {Record} - */ - this.challengesPerGame = Object.fromEntries( - Object.entries(data.challenges).map(([game, data]) => [game, new GameChallenges(game, data)]) - ); - } -} - -module.exports = Challenges; diff --git a/src/structures/Static/GameAchievements.js b/src/structures/Static/GameAchievements.js deleted file mode 100644 index 17a3f5636..000000000 --- a/src/structures/Static/GameAchievements.js +++ /dev/null @@ -1,36 +0,0 @@ -const Achievement = require('./Achievement'); - -/** - * Game achievements class - */ -class GameAchievements { - /** - * @param {string} name game name - * @param {object} data data - */ - constructor(name, data) { - /** - * Name of game/category - * @type {StaticGameNames} - */ - this.category = name; - /** - * Total points possible from all achievements in this game - * @type {number} - */ - this.totalPoints = parseInt(data.total_points, 10) || 0; - /** - * Total legacy points possible from all achievements in this game - * @type {number} - */ - this.totalLegacyPoints = parseInt(data.total_legacy_points, 10) || 0; - /** - * @type {Achievement[]} - */ - this.achievements = Object.entries({ ...(data.one_time || {}), ...(data.tiered || {}) }).map( - ([name, data]) => new Achievement(name, data) - ); - } -} - -module.exports = GameAchievements; diff --git a/src/structures/Static/GameChallenges.js b/src/structures/Static/GameChallenges.js deleted file mode 100644 index 3254aa9f7..000000000 --- a/src/structures/Static/GameChallenges.js +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Game challenges class - */ -class GameChallenges { - /** - * @param {string} name game name - * @param {object} data data - */ - constructor(name, data) { - /** - * Name of game/category - * @type {StaticGameNames} - */ - this.category = name; - /** - * @type {Map} - */ - this.challenges = new Map(); - - data.forEach((challenge) => { - const content = { - id: challenge.id, - name: challenge.name, - reward: parseInt(challenge.rewards[0].amount, 10) || 0, - rewardType: challenge.rewards[0].type - }; - this.challenges.set(challenge.id, content); - }); - } -} - -/** - * @typedef {Object} ChallengeData - * @property {string} id String ID of the challenge - * @property {string} name String name of the challenge - * @property {number} reward Amount of XP upon challenge completion, always 3700 XP. - * @property {string} rewardType Type of reward. Always "MultipliedExperienceReward" here - */ - -module.exports = GameChallenges; diff --git a/src/structures/Static/GameQuests.js b/src/structures/Static/GameQuests.js deleted file mode 100644 index ae0af6c22..000000000 --- a/src/structures/Static/GameQuests.js +++ /dev/null @@ -1,24 +0,0 @@ -const Quest = require('./Quest'); - -/** - * Game quests class - */ -class GameQuests { - /** - * @param {string} name game name - * @param {object} data data - */ - constructor(name, data) { - /** - * Name of game - * @type {StaticGameNames} - */ - this.game = name; - /** - * @type {Quest[]} - */ - this.quests = (data || []).map((x) => new Quest(x)); - } -} - -module.exports = GameQuests; diff --git a/src/structures/Static/GuildAchievements.js b/src/structures/Static/GuildAchievements.js deleted file mode 100644 index bce03b924..000000000 --- a/src/structures/Static/GuildAchievements.js +++ /dev/null @@ -1,34 +0,0 @@ -const Achievement = require('./Achievement.js'); - -/** - * Achievement class - */ -class GuildAchievements { - /** - * @param {object} data data - */ - constructor(data) { - /** - * Last time this resource was updated - * @type {number} - */ - this.lastUpdatedTimestamp = parseInt(data.lastUpdated, 10); - /** - * Last time this resource was updated, as Date - * @type {Date|null} - */ - this.lastUpdatedAt = new Date(this.lastUpdatedTimestamp); - /** - * Achievements - * @type {Record} - */ - this.achievements = Object.fromEntries( - Object.entries({ ...(data.tiered || {}), ...(data.one_time || {}) }).map(([name, value]) => [ - name, - new Achievement(name, value) - ]) - ); - } -} - -module.exports = GuildAchievements; diff --git a/src/structures/Static/Quest.js b/src/structures/Static/Quest.js deleted file mode 100644 index d9e26233a..000000000 --- a/src/structures/Static/Quest.js +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Quest Class - */ -class Quest { - /** - * constructor - * @param {Object} data - */ - constructor(data) { - /** - * Name of quest, trimmed trailing spaces - * @type {string} - */ - this.questName = data.name.trim(); - /** - * ID of quest - * @type {string} - */ - this.questID = data.id; - /** - * Description, trimmed trailing spaces - * @type {string} - */ - this.description = data.description.trim(); - /** - * Type of quest - * @type {'DAILY'|'WEEKLY'} - */ - this.type = 'DailyResetQuestRequirement' === data.requirements?.[0].type ? 'DAILY' : 'WEEKLY'; - /** - * Objectives - * @type {Objective[]} - */ - this.objectives = data.objectives.map((objective) => ({ - id: objective.id, - type: 'IntegerObjective' === objective.type ? 'Integer' : 'Boolean', - amountNeeded: parseInt(objective.integer || '1', 10) - })); - /** - * Rewards for this quest - * @type {QuestReward[]} - */ - this.rewards = data.rewards || []; - } - /** - * As string - * @return {string} - */ - toString() { - return this.questName; - } -} - -/** - * @typedef {Object} Objective - * @property {string} id ID - * @property {'Integer'|'Boolean'} type Integer: a certain amount of something (i.e kills) is needed; Boolean: a condition needs to be fulfilled - * @property {number} amountNeeded a Boolean-typed objective will have this set to 1. (instead of null in API) - */ -/** - * @typedef {Object} QuestReward - * @property {string} type Types of reward. - * @property {number} amount Amount - */ - -module.exports = Quest; diff --git a/src/structures/Static/Quests.js b/src/structures/Static/Quests.js deleted file mode 100644 index c3f3e572e..000000000 --- a/src/structures/Static/Quests.js +++ /dev/null @@ -1,31 +0,0 @@ -const GameQuests = require('./GameQuests.js'); - -/** - * Quest class - */ -class Quests { - /** - * @param {object} data data - */ - constructor(data) { - /** - * Last time this resource was updated - * @type {number} - */ - this.lastUpdatedTimestamp = parseInt(data.lastUpdated, 10); - /** - * Last time this resource was updated, as Date - * @type {Date|null} - */ - this.lastUpdatedAt = new Date(this.lastUpdatedTimestamp); - /** - * Quests per game - * @type {Record} - */ - this.questsPerGame = Object.fromEntries( - Object.entries(data.quests).map(([game, data]) => [game, new GameQuests(game, data)]) - ); - } -} - -module.exports = Quests; diff --git a/src/structures/Status.js b/src/structures/Status.js deleted file mode 100644 index b858f1b0c..000000000 --- a/src/structures/Status.js +++ /dev/null @@ -1,41 +0,0 @@ -const Game = require('./Game'); -/** - * Status class - */ -class Status { - /** - * @param {object} data Status data - */ - constructor(data) { - /** - * Player online status.
- *
- * Players can disable this endpoint via in-game settings. When done so the API will return as if the player is offline. - * @type {boolean} - */ - this.online = data.online; - /** - * Game type - * @type {Game|null} - */ - this.game = data.gameType ? new Game(data.gameType) : null; - /** - * Game mode - * @type {string|null} - */ - this.mode = data.mode ?? null; - /** - * Map - * @type {string|null} - */ - this.map = data.map ?? null; - } - /** - * Online Status - * @return {string} - */ - toString() { - return this.online ? 'Online' : 'Offline'; - } -} -module.exports = Status; diff --git a/src/structures/Watchdog/Stats.js b/src/structures/Watchdog/Stats.js deleted file mode 100644 index 1008e07a8..000000000 --- a/src/structures/Watchdog/Stats.js +++ /dev/null @@ -1,36 +0,0 @@ -/** - * WatchdogStats class - */ -class WatchdogStats { - /** - * @param {object} data Watchdog data - */ - constructor(data) { - /** - * Total watchdog's bans - * @type {number} - */ - this.byWatchdogTotal = data.watchdog_total || 0; - /** - * Watchdog's bans in the last minute - * @type {number} - */ - this.byWatchdogLastMinute = data.watchdog_lastMinute || 0; - /** - * Watchdog's bans in the last day ( resets at 5 am UTC ). - * @type {number} - */ - this.byWatchdogRollingDay = data.watchdog_rollingDaily || 0; - /** - * Total staff bans - * @type {number} - */ - this.byStaffTotal = data.staff_total || 0; - /** - * Staff bans in the last day ( resets at 5 am UTC ). - * @type {number} - */ - this.byStaffRollingDay = data.staff_rollingDaily || 0; - } -} -module.exports = WatchdogStats; diff --git a/src/utils/Guild.js b/src/utils/Guild.js deleted file mode 100644 index 0e3bf4581..000000000 --- a/src/utils/Guild.js +++ /dev/null @@ -1,89 +0,0 @@ -/* eslint-disable jsdoc/require-jsdoc */ -const GuildRank = require('../structures/Guild/GuildRank'); -const dateRegExp = /(\d{4})-(\d{2})-(\d{2})/; - -function parseDate(date) { - date[1] -= 1; - return new Date(Math.round(new Date(new Date().setUTCFullYear(...date)).setUTCHours(5, 0, 0) / 1000) * 1000); -} - -function parseHistory(historyData) { - const expValuesReversed = Object.values(historyData).reverse(); - return Object.entries(historyData).map((x, index) => ({ - day: x[0], - date: - parseDate( - x[0] - .match(dateRegExp) - .slice(1) - .map((x) => parseInt(x, 10)) - ) || undefined, - exp: x[1] || 0, - totalExp: expValuesReversed.slice(0, expValuesReversed.length - index).reduce((pV, cV) => pV + cV) - })); -} - -function getGuildLevel(exp) { - const EXP_NEEDED = [ - 100000, 150000, 250000, 500000, 750000, 1000000, 1250000, 1500000, 2000000, 2500000, 2500000, 2500000, 2500000, - 2500000, 3000000 - ]; - - let level = 0; - - for (let i = 0; 1000 >= i; i += 1) { - let need; - if (i >= EXP_NEEDED.length) { - need = EXP_NEEDED[EXP_NEEDED.length - 1]; - } else { - need = EXP_NEEDED[i]; - } - - if (0 > exp - need) { - return Math.round((level + exp / need) * 100) / 100; - } - level += 1; - exp -= need; - } - - return 1000; -} - -function ranks(data) { - return data.ranks && data.ranks.length - ? data.ranks.map((r) => new GuildRank(r)).sort((a, b) => a.priority - b.priority) - : []; -} - -function expLimit(exp) { - return 2e5 < exp ? (7e5 < exp ? 2.5e5 + Math.round(exp * 0.03) : 2e5 + Math.round((exp - 2e5) / 10)) : exp; -} - -function calculateExpHistory(data) { - const finalObj = {}; - for (const day of Object.keys(data.members[0].expHistory)) { - let gexp = 0; - for (const member of data.members) { - gexp += member.expHistory[day] || 0; - } - finalObj[day] = expLimit(gexp); - } - return parseHistory(finalObj); -} - -/** - * @typedef {object} ExpHistory - * @property {string} day String Date ( unparsed ) - * @property {Date} date Parsed Date - * @property {number} exp Experience of the day - * @property {number} totalExp Experience earned from day 0 to this day - */ - -module.exports = { - parseDate, - parseHistory, - getGuildLevel, - ranks, - expLimit, - calculateExpHistory -}; diff --git a/src/utils/Player.js b/src/utils/Player.js deleted file mode 100644 index d7eaae119..000000000 --- a/src/utils/Player.js +++ /dev/null @@ -1,112 +0,0 @@ -/* eslint-disable jsdoc/require-jsdoc */ -function getRank(player) { - let rank; - if (player.prefix) { - rank = player.prefix.replace(/§[0-9|a-z]|\[|\]/g, ''); - } else if (player.rank && 'NORMAL' !== player.rank) { - switch (player.rank) { - case 'YOUTUBER': - rank = 'YouTube'; - break; - case 'GAME_MASTER': - rank = 'Game Master'; - break; - case 'ADMIN': - rank = 'Admin'; - break; - default: - rank = ''; - break; - } - } else { - switch (player.newPackageRank) { - case 'MVP_PLUS': - rank = player.monthlyPackageRank && 'SUPERSTAR' === player.monthlyPackageRank ? 'MVP++' : 'MVP+'; - break; - case 'MVP': - rank = 'MVP'; - break; - case 'VIP_PLUS': - rank = 'VIP+'; - break; - case 'VIP': - rank = 'VIP'; - break; - default: - rank = player.monthlyPackageRank && 'SUPERSTAR' === player.monthlyPackageRank ? 'MVP++' : 'Default'; - } - } - return rank; -} - -function getPlayerLevel(exp) { - const base = 10000; - const growth = 2500; - const reversePqPrefix = -(base - 0.5 * growth) / growth; - const reverseConst = reversePqPrefix * reversePqPrefix; - const growthDivides2 = 2 / growth; - const num = 1 + reversePqPrefix + Math.sqrt(reverseConst + growthDivides2 * exp); - const level = Math.round(num * 100) / 100; - return level; -} - -function xpToNextLevel(player) { - const lvl = getPlayerLevel(player.networkExp); - const xpToNext = 2500 * Math.floor(lvl) + 5000; - if (10000 > player.networkExp) return 10000; - return xpToNext; -} - -function levelToXP(player) { - let level = Number(Math.floor(getPlayerLevel(player.networkExp))); - level = level - 1; - const xp = 1250 * level ** 2 + 8750 * level; - return xp; -} - -function playerLevelProgress(player) { - const xpFromLevel = levelToXP(player); - let currentXP = player.networkExp - xpFromLevel; - const xpToNext = xpToNextLevel(player); - const remainingXP = xpToNext - currentXP + 2500; - currentXP = currentXP - 2500; - const percent = Math.round((currentXP / xpToNext) * 100 * 100) / 100; - const percentRemaining = Math.round((100 - percent) * 100) / 100; - return { - xpToNext, - remainingXP, - currentXP, - percent, - percentRemaining - }; -} - -function getSocialMedia(data) { - if (!data) return null; - const links = data.links; - const formattedNames = ['Twitter', 'YouTube', 'Instagram', 'Twitch', 'Hypixel', 'Discord']; - const upperNames = ['TWITTER', 'YOUTUBE', 'INSTAGRAM', 'TWITCH', 'HYPIXEL', 'DISCORD']; - if (!links) return null; - return Object.keys(links) - .map((x) => upperNames.indexOf(x)) - .filter((x) => -1 !== x) - .map((x) => ({ name: formattedNames[x], link: links[upperNames[x]], id: upperNames[x] })); -} - -function parseClaimedRewards(data) { - if (!data) return null; - return Object.keys(data) - .map((x) => x.match(/levelingReward_(\d+)/)) - .filter((x) => x) - .map((x) => parseInt(x[1], 10)); -} - -module.exports = { - getRank, - getPlayerLevel, - xpToNextLevel, - levelToXP, - playerLevelProgress, - getSocialMedia, - parseClaimedRewards -}; diff --git a/src/utils/arrayTools.js b/src/utils/arrayTools.js deleted file mode 100644 index cdd184975..000000000 --- a/src/utils/arrayTools.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - isStrArray: (input) => Array.isArray(input) || 'string' === typeof input, - strToArray: (input) => [input].flat() -}; diff --git a/src/utils/index.js b/src/utils/index.js deleted file mode 100644 index 6e9b260e5..000000000 --- a/src/utils/index.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = { - arrayTool: require('./arrayTools'), - Constants: require('./Constants'), - divide: require('./divide'), - guild: require('./Guild'), - isGuildID: require('./isGuildID'), - isUUID: require('./isUUID'), - oscillation: require('./oscillation'), - player: require('./Player'), - removeSnakeCase: require('./removeSnakeCase'), - SkyblockUtils: require('./SkyblockUtils'), - toUuid: require('./toUuid'), - varInt: require('./varInt') -}; diff --git a/src/utils/isGuildID.js b/src/utils/isGuildID.js deleted file mode 100644 index e3ec95685..000000000 --- a/src/utils/isGuildID.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = (id) => { - return 24 === id.length; -}; diff --git a/src/utils/isUUID.js b/src/utils/isUUID.js deleted file mode 100644 index 5d769e66f..000000000 --- a/src/utils/isUUID.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = (uuid) => { - const regexp = /^[0-9a-f]{32}$/i; - uuid = uuid.replace(/-/g, ''); - return regexp.test(uuid); -}; diff --git a/src/utils/oscillation.js b/src/utils/oscillation.js deleted file mode 100644 index 84190263e..000000000 --- a/src/utils/oscillation.js +++ /dev/null @@ -1,17 +0,0 @@ -// See https://github.com/HypixelDev/PublicAPI/blob/db26b5fd3b7bb29da14e40e6d211143ec44a4519/Documentation/misc/Oscillation.md -// Month oscillation started in December 2014, so every month that is pair ( odd in js!! ) is month A -// Weekly oscillation started... just refer to the code in the docs - -// eslint-disable-next-line jsdoc/require-jsdoc -function monthAB(date = Date.now()) { - return new Date(date).getMonth() % 2 ? 'a' : 'b'; -} - -const weeklyOscillationStart = 1417237200000; - -// eslint-disable-next-line jsdoc/require-jsdoc -function weekAB(date = Date.now()) { - return (Math.abs(new Date(date).getTime() - weeklyOscillationStart) / 604800000) % 2 ? 'a' : 'b'; -} - -module.exports = { monthAB, weekAB }; diff --git a/src/utils/removeSnakeCase.js b/src/utils/removeSnakeCase.js deleted file mode 100644 index 6806b742c..000000000 --- a/src/utils/removeSnakeCase.js +++ /dev/null @@ -1,33 +0,0 @@ -const single = (obj) => { - Object.keys(obj).reduce((pV, cV) => ({ ...pV, [cV.replace(/_[a-z]/gi, (x) => x[1].toUpperCase())]: obj[cV] }), {}); -}; - -// eslint-disable-next-line jsdoc/require-jsdoc -function validateJSON(obj) { - return 'object' === typeof obj && '{' === JSON.stringify(obj)[0]; -} - -// eslint-disable-next-line jsdoc/require-jsdoc -function recursive(obj, lowerCase = false) { - if (!validateJSON(obj)) return obj; - return Object.keys(obj).reduce( - (pV, cV) => ({ - ...pV, - [(lowerCase ? cV : cV.toLowerCase()).replace(/_[a-z]/gi, (x) => x[1].toUpperCase())]: recursive(obj[cV]) - }), - {} - ); -} - -// eslint-disable-next-line jsdoc/require-jsdoc -function removeSnakeCaseString(str) { - if ('string' !== typeof str) return null; - return str.toLowerCase().replace(/_[a-z]/gi, (x) => x[1].toUpperCase()); -} - -module.exports = { - single, - recursive, - validateJSON, - removeSnakeCaseString -}; diff --git a/src/utils/rgbToHexColor.js b/src/utils/rgbToHexColor.js deleted file mode 100644 index 6709170a7..000000000 --- a/src/utils/rgbToHexColor.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = (rgb) => { - let hexCode = '#'; - for (const num of rgb) { - const hex = Number(num).toString(16); - hexCode += 1 === hex.length ? '0' + hex : hex; - } - return hexCode; -}; diff --git a/src/utils/toUuid.js b/src/utils/toUuid.js deleted file mode 100644 index f1a46af5a..000000000 --- a/src/utils/toUuid.js +++ /dev/null @@ -1,24 +0,0 @@ -const fetch = require('../Private/uuidCache.js'); -const isUUID = require('./isUUID.js'); -const Errors = require('../Errors'); - -module.exports = async (input, cacheTime = 600, useThirdPartyAPI = '') => { - if (!input) throw new Error(Errors.NO_NICKNAME_UUID); - if ('string' !== typeof input) throw new Error(Errors.UUID_NICKNAME_MUST_BE_A_STRING); - if (isUUID(input)) return input.replace(/-/g, ''); - try { - const customUrl = true === useThirdPartyAPI ? 'https://api.minetools.eu/uuid/' : useThirdPartyAPI; - const url = useThirdPartyAPI ? `${customUrl}${input}` : `https://mowojang.matdoes.dev/${input}`; - const res = await fetch(url, input, cacheTime); - if (404 === res.status) { - return Promise.reject(new Error(Errors.PLAYER_DOES_NOT_EXIST)); - } else if (200 !== res.status) { - throw new Error('Unknown Error whilst retrieving player information'); - } - return res.id; - } catch { - // 2nd Try - if (!useThirdPartyAPI) return module.exports(input, cacheTime, true); - throw new Error(Errors.PLAYER_DOES_NOT_EXIST); - } -}; diff --git a/src/utils/varInt.js b/src/utils/varInt.js deleted file mode 100644 index c186fe0e0..000000000 --- a/src/utils/varInt.js +++ /dev/null @@ -1,17 +0,0 @@ -// eslint-disable-next-line jsdoc/require-jsdoc -function readVarInt(bytes) { - let numRead = 0; - let result = 0; - do { - const read = bytes[numRead]; - const value = read & 0b01111111; - result |= value << (7 * numRead); - numRead++; - if (5 < numRead) { - return NaN; - } - } while (numRead < bytes.length); - - return result; -} -module.exports = readVarInt; diff --git a/tests/Client#getAPIStatus.js b/tests/Client#getAPIStatus.js deleted file mode 100644 index 27825ef86..000000000 --- a/tests/Client#getAPIStatus.js +++ /dev/null @@ -1,22 +0,0 @@ -/* eslint-disable no-undef */ -const { APIIncident } = require('../src'); -const { client } = require('./Client.js'); -const { expect } = require('chai'); - -describe('Client#getAPIStatus', async () => { - let status; - it('expect not to throw', async () => { - status = await client.getAPIStatus(); - }); - it('should be an object', () => { - expect(status).to.be.an('object'); - }); - it('required keys should exist', () => { - if (status.sourceUrl) expect(status.sourceUrl).to.be.a('string'); - if (status.title) expect(status.title).to.be.a('string'); - if (status.description) expect(status.description).to.be.a('string'); - status.incidents.forEach((incident) => { - expect(incident).instanceOf(APIIncident); - }); - }); -}); diff --git a/tests/Client#getBoosters.js b/tests/Client#getBoosters.js deleted file mode 100644 index c2b1cee7a..000000000 --- a/tests/Client#getBoosters.js +++ /dev/null @@ -1,27 +0,0 @@ -/* eslint-disable no-undef */ -const { client } = require('./Client.js'); -const { expect } = require('chai'); - -describe('Client#getBoosters', async () => { - let boosters; - it('expect not to throw', async () => { - boosters = await client.getBoosters(); - }); - it('should be an array', () => { - expect(boosters).to.be.an('array'); - }); - it('required keys should exist', () => { - boosters.forEach((booster) => { - expect(booster).to.have.property('purchaser').that.is.a('string'); - expect(booster).to.have.property('amount').that.is.a('number'); - expect(booster).to.have.property('originalLength').that.is.a('number'); - expect(booster).to.have.property('remaining').that.is.a('number'); - expect(booster).to.have.property('activatedTimestamp').that.is.a('number'); - expect(booster).to.have.property('activated').that.is.a('Date'); - expect(booster).to.have.property('isActive').that.is.a('boolean'); - expect(booster).to.have.property('type').that.is.oneOf(['QUEUED', 'STACKED', 'ACTIVE']); - expect(booster).to.have.property('stackers').that.is.an('array'); - expect(booster).to.have.property('expired').that.is.a('boolean'); - }); - }); -}); diff --git a/tests/Client#getChallenges.js b/tests/Client#getChallenges.js deleted file mode 100644 index c352d1418..000000000 --- a/tests/Client#getChallenges.js +++ /dev/null @@ -1,42 +0,0 @@ -/* eslint-disable no-undef */ -const { GameChallenges } = require('../src/index.js'); -const { client } = require('./Client.js'); -const { expect } = require('chai'); - -describe('Client#getChallenges', async () => { - let challenges; - it('expect not to throw', async () => { - challenges = await client.getChallenges(); - }); - it('should be an objecct', () => { - expect(challenges).to.be.an('object'); - }); - it('required keys should exist', () => { - expect(challenges.lastUpdatedTimestamp).to.be.a('number'); - expect(challenges.lastUpdatedAt).to.be.a('date'); - expect(challenges.challengesPerGame).to.be.an('object'); - expect(challenges.challengesPerGame.arcade).instanceOf(GameChallenges); - expect(challenges.challengesPerGame.arena).instanceOf(GameChallenges); - expect(challenges.challengesPerGame.bedwars).instanceOf(GameChallenges); - expect(challenges.challengesPerGame.hungergames).instanceOf(GameChallenges); - expect(challenges.challengesPerGame.buildbattle).instanceOf(GameChallenges); - expect(challenges.challengesPerGame.truecombat).instanceOf(GameChallenges); - expect(challenges.challengesPerGame.duels).instanceOf(GameChallenges); - expect(challenges.challengesPerGame.mcgo).instanceOf(GameChallenges); - expect(challenges.challengesPerGame.murdermystery).instanceOf(GameChallenges); - expect(challenges.challengesPerGame.paintball).instanceOf(GameChallenges); - expect(challenges.challengesPerGame.quake).instanceOf(GameChallenges); - expect(challenges.challengesPerGame.skyclash).instanceOf(GameChallenges); - expect(challenges.challengesPerGame.skywars).instanceOf(GameChallenges); - expect(challenges.challengesPerGame.supersmash).instanceOf(GameChallenges); - expect(challenges.challengesPerGame.speeduhc).instanceOf(GameChallenges); - expect(challenges.challengesPerGame.gingerbread).instanceOf(GameChallenges); - expect(challenges.challengesPerGame.tntgames).instanceOf(GameChallenges); - expect(challenges.challengesPerGame.uhc).instanceOf(GameChallenges); - expect(challenges.challengesPerGame.vampirez).instanceOf(GameChallenges); - expect(challenges.challengesPerGame.walls3).instanceOf(GameChallenges); - expect(challenges.challengesPerGame.walls).instanceOf(GameChallenges); - expect(challenges.challengesPerGame.battleground).instanceOf(GameChallenges); - expect(challenges.challengesPerGame.woolgames).instanceOf(GameChallenges); - }); -}); diff --git a/tests/Client#getGameCounts.js b/tests/Client#getGameCounts.js deleted file mode 100644 index 0502f8abd..000000000 --- a/tests/Client#getGameCounts.js +++ /dev/null @@ -1,242 +0,0 @@ -/* eslint-disable no-undef */ -const { client } = require('./Client.js'); -const { expect } = require('chai'); - -describe('Client#getGameCounts', async () => { - let gameCounts; - it('expect not to throw', async () => { - gameCounts = await client.getGameCounts(); - }); - it('should be an object ', () => { - expect(gameCounts).to.be.an('object'); - }); - it('required keys should exist', () => { - expect(gameCounts.playerCount).to.be.a('number'); - - expect(gameCounts.mainLobby).to.be.a('object'); - expect(gameCounts.mainLobby.players).to.be.a('number'); - - if (gameCounts.tournamentLobby) { - expect(gameCounts.tournamentLobby).to.be.a('object'); - expect(gameCounts.tournamentLobby.players).to.be.a('number'); - } - - if (gameCounts.smp) { - expect(gameCounts.smp).to.be.a('object'); - expect(gameCounts.smp.players).to.be.a('number'); - } - - if (gameCounts.bedwars) { - expect(gameCounts.bedwars).to.be.a('object'); - expect(gameCounts.bedwars.players).to.be.a('number'); - if (gameCounts.bedwars.modes) { - expect(gameCounts.bedwars.modes).to.be.a('object'); - for (const mode in gameCounts.bedwars.modes) { - expect(gameCounts.bedwars.modes[mode]).to.be.a('number'); - } - } - } - - if (gameCounts.thePit) { - expect(gameCounts.thePit).to.be.a('object'); - expect(gameCounts.thePit.players).to.be.a('number'); - if (gameCounts.thePit.modes) { - expect(gameCounts.thePit.modes).to.be.a('object'); - for (const mode in gameCounts.thePit.modes) { - expect(gameCounts.thePit.modes[mode]).to.be.a('number'); - } - } - } - - if (gameCounts.theTntGames) { - expect(gameCounts.theTntGames).to.be.a('object'); - expect(gameCounts.theTntGames.players).to.be.a('number'); - if (gameCounts.theTntGames.modes) { - expect(gameCounts.theTntGames.modes).to.be.a('object'); - for (const mode in gameCounts.theTntGames.modes) { - expect(gameCounts.theTntGames.modes[mode]).to.be.a('number'); - } - } - } - - if (gameCounts.classicGames) { - expect(gameCounts.classicGames).to.be.a('object'); - expect(gameCounts.classicGames.players).to.be.a('number'); - if (gameCounts.classicGames.modes) { - expect(gameCounts.classicGames.modes).to.be.a('object'); - for (const mode in gameCounts.classicGames.modes) { - expect(gameCounts.classicGames.modes[mode]).to.be.a('number'); - } - } - } - - if (gameCounts.warlords) { - expect(gameCounts.warlords).to.be.a('object'); - expect(gameCounts.warlords.players).to.be.a('number'); - } - - if (gameCounts.duels) { - expect(gameCounts.duels).to.be.a('object'); - expect(gameCounts.duels.players).to.be.a('number'); - if (gameCounts.duels.modes) { - expect(gameCounts.duels.modes).to.be.a('object'); - for (const mode in gameCounts.duels.modes) { - expect(gameCounts.duels.modes[mode]).to.be.a('number'); - } - } - } - - if (gameCounts.smashHeroes) { - expect(gameCounts.smashHeroes).to.be.a('object'); - expect(gameCounts.smashHeroes.players).to.be.a('number'); - if (gameCounts.smashHeroes.modes) { - expect(gameCounts.smashHeroes.modes).to.be.a('object'); - for (const mode in gameCounts.smashHeroes.modes) { - expect(gameCounts.smashHeroes.modes[mode]).to.be.a('number'); - } - } - } - - if (gameCounts.skyblock) { - expect(gameCounts.skyblock).to.be.a('object'); - expect(gameCounts.skyblock.players).to.be.a('number'); - if (gameCounts.skyblock.modes) { - expect(gameCounts.skyblock.modes).to.be.a('object'); - for (const mode in gameCounts.skyblock.modes) { - expect(gameCounts.skyblock.modes[mode]).to.be.a('number'); - } - } - } - - if (gameCounts.uhcChampions) { - expect(gameCounts.uhcChampions).to.be.a('object'); - expect(gameCounts.uhcChampions.players).to.be.a('number'); - if (gameCounts.uhcChampions.modes) { - expect(gameCounts.uhcChampions.modes).to.be.a('object'); - for (const mode in gameCounts.uhcChampions.modes) { - expect(gameCounts.uhcChampions.modes[mode]).to.be.a('number'); - } - } - } - - if (gameCounts.blitzSurvivalGames) { - expect(gameCounts.blitzSurvivalGames).to.be.a('object'); - expect(gameCounts.blitzSurvivalGames.players).to.be.a('number'); - if (gameCounts.blitzSurvivalGames.modes) { - expect(gameCounts.blitzSurvivalGames.modes).to.be.a('object'); - for (const mode in gameCounts.blitzSurvivalGames.modes) { - expect(gameCounts.blitzSurvivalGames.modes[mode]).to.be.a('number'); - } - } - } - - if (gameCounts.murderMystery) { - expect(gameCounts.murderMystery).to.be.a('object'); - expect(gameCounts.murderMystery.players).to.be.a('number'); - if (gameCounts.murderMystery.modes) { - expect(gameCounts.murderMystery.modes).to.be.a('object'); - for (const mode in gameCounts.murderMystery.modes) { - expect(gameCounts.murderMystery.modes[mode]).to.be.a('number'); - } - } - } - - if (gameCounts.speedUhc) { - expect(gameCounts.speedUhc).to.be.a('object'); - expect(gameCounts.speedUhc.players).to.be.a('number'); - } - - if (gameCounts.copsAndCrims) { - expect(gameCounts.copsAndCrims).to.be.a('object'); - expect(gameCounts.copsAndCrims.players).to.be.a('number'); - if (gameCounts.copsAndCrims.modes) { - expect(gameCounts.copsAndCrims.modes).to.be.a('object'); - for (const mode in gameCounts.copsAndCrims.modes) { - expect(gameCounts.copsAndCrims.modes[mode]).to.be.a('number'); - } - } - } - - if (gameCounts.skywars) { - expect(gameCounts.skywars).to.be.a('object'); - expect(gameCounts.skywars.players).to.be.a('number'); - if (gameCounts.skywars.modes) { - expect(gameCounts.skywars.modes).to.be.a('object'); - for (const mode in gameCounts.skywars.modes) { - expect(gameCounts.skywars.modes[mode]).to.be.a('number'); - } - } - } - - if (gameCounts.replay) { - expect(gameCounts.replay).to.be.a('object'); - expect(gameCounts.replay.players).to.be.a('number'); - if (gameCounts.replay.modes) { - expect(gameCounts.replay.modes).to.be.a('object'); - for (const mode in gameCounts.replay.modes) { - expect(gameCounts.replay.modes[mode]).to.be.a('number'); - } - } - } - - if (gameCounts.arcade) { - expect(gameCounts.arcade).to.be.a('object'); - expect(gameCounts.arcade.players).to.be.a('number'); - if (gameCounts.arcade.modes) { - expect(gameCounts.arcade.modes).to.be.a('object'); - for (const mode in gameCounts.arcade.modes) { - expect(gameCounts.arcade.modes[mode]).to.be.a('number'); - } - } - } - - if (gameCounts.woolGames) { - expect(gameCounts.woolGames).to.be.a('object'); - expect(gameCounts.woolGames.players).to.be.a('number'); - if (gameCounts.woolGames.modes) { - expect(gameCounts.woolGames.modes).to.be.a('object'); - for (const mode in gameCounts.woolGames.modes) { - expect(gameCounts.woolGames.modes[mode]).to.be.a('number'); - } - } - } - - if (gameCounts.housing) { - expect(gameCounts.housing).to.be.a('object'); - expect(gameCounts.housing.players).to.be.a('number'); - } - - if (gameCounts.megaWalls) { - expect(gameCounts.megaWalls).to.be.a('object'); - expect(gameCounts.megaWalls.players).to.be.a('number'); - expect(gameCounts.megaWalls.modes).to.be.a('object'); - for (const mode in gameCounts.megaWalls.modes) { - expect(gameCounts.megaWalls.modes[mode]).to.be.a('number'); - } - } - - if (gameCounts.buildBattle) { - expect(gameCounts.buildBattle).to.be.a('object'); - expect(gameCounts.buildBattle.players).to.be.a('number'); - expect(gameCounts.buildBattle.modes).to.be.a('object'); - for (const mode in gameCounts.buildBattle.modes) { - expect(gameCounts.buildBattle.modes[mode]).to.be.a('number'); - } - } - - if (gameCounts.limbo) { - expect(gameCounts.limbo).to.be.a('object'); - expect(gameCounts.limbo.players).to.be.a('number'); - } - - if (gameCounts.idle) { - expect(gameCounts.idle).to.be.a('object'); - expect(gameCounts.idle.players).to.be.a('number'); - } - - if (gameCounts.queue) { - expect(gameCounts.queue).to.be.a('object'); - expect(gameCounts.queue.players).to.be.a('number'); - } - }); -}); diff --git a/tests/Client#getGuild.js b/tests/Client#getGuild.js deleted file mode 100644 index 0a5ebc762..000000000 --- a/tests/Client#getGuild.js +++ /dev/null @@ -1,416 +0,0 @@ -/* eslint-disable no-undef */ -const { guilds, invalid } = require('./data.js'); -const { Game, Errors } = require('../src'); -const { client } = require('./Client.js'); -const { expect } = require('chai'); - -describe('Client#getGuild', async () => { - describe('Valid', async () => { - guilds.forEach((guild) => { - let guildName; - let guildId; - let guildPlayer; - describe(`Guild Test ${guilds.indexOf(guild) + 1}`, async () => { - describe('Guild Name', async () => { - it('expect not to throw', async () => { - guildName = await client.getGuild('name', guild.name); - }); - it('should be an object', () => { - expect(guildName).to.be.an('object'); - }); - it('required keys should exist', () => { - expect(guildName.id).to.be.a('string'); - expect(guildName.name).to.be.a('string'); - expect(guildName.description).to.be.a('string'); - expect(guildName.experience).to.be.a('number'); - expect(guildName.level).to.be.a('number'); - expect(guildName.members).to.be.an('array'); - guildName.members.forEach((member) => { - expect(member).to.be.an('object'); - expect(member.uuid).to.be.a('string'); - expect(member.joinedAtTimestamp).to.be.a('number'); - expect(member.joinedAt).to.be.a('Date'); - expect(member.questParticipation).to.be.a('number'); - expect(member.rank).to.be.a('string'); - expect(member.expHistory).to.be.a('array'); - member.expHistory.forEach((history) => { - expect(history).to.be.a('object'); - expect(history.day).to.be.a('string'); - expect(history.date).to.be.a('date'); - expect(history.exp).to.be.a('number'); - expect(history.totalExp).to.be.a('number'); - }); - expect(member.weeklyExperience).to.be.a('number'); - }); - if (guildName.me) { - expect(guildName.me).to.be.an('object'); - expect(guildName.me.uuid).to.be.a('string'); - expect(guildName.me.joinedAtTimestamp).to.be.a('number'); - expect(guildName.me.joinedAt).to.be.a('Date'); - expect(guildName.me.questParticipation).to.be.a('number'); - expect(guildName.me.rank).to.be.a('string'); - expect(guildName.me.expHistory).to.be.a('array'); - guildName.me.expHistory.forEach((history) => { - expect(history).to.be.a('object'); - expect(history.day).to.be.a('string'); - expect(history.date).to.be.a('date'); - expect(history.exp).to.be.a('number'); - expect(history.totalExp).to.be.a('number'); - }); - expect(guildName.me.weeklyExperience).to.be.a('number'); - } - expect(guildName.ranks).to.be.an('array'); - guildName.ranks.forEach((rank) => { - expect(rank).to.be.an('object'); - expect(rank.name).to.be.a('string'); - expect(rank.default).to.be.a('boolean'); - if (rank.tag) expect(rank.tag).to.be.a('string'); - expect(rank.createdAt).to.be.a('date'); - expect(rank.createdAtTimestamp).to.be.a('number'); - expect(rank.priority).to.be.a('number'); - }); - expect(guildName.totalWeeklyGexp).to.be.a('number'); - expect(guildName.createdAtTimestamp).to.be.a('number'); - expect(guildName.createdAt).to.be.a('date'); - expect(guildName.joinable).to.be.a('boolean'); - expect(guildName.publiclyListed).to.be.a('boolean'); - if (guildName.banner) { - expect(guildName.banner).to.be.a('object'); - expect(guildName.banner['Base']).to.be.a('string'); - expect(guildName.banner['Patterns']).to.be.an('array'); - guildName.banner['Patterns'].forEach((pattern) => { - expect(pattern).to.be.a('object'); - expect(pattern['Pattern']).to.be.a('string'); - expect(pattern['Color']).that.satisfies( - (value) => typeof value === 'number' || typeof value === 'string' - ); - }); - } - if (guildName.tag) expect(guildName.tag).to.be.a('string'); - if (guildName.tagColor) { - expect(guildName.tagColor.color).to.be.a('string'); - expect(guildName.tagColor.color).to.be.oneOf([ - 'BLACK', - 'DARK_BLUE', - 'DARK_GREEN', - 'DARK_AQUA', - 'DARK_RED', - 'DARK_PURPLE', - 'GOLD', - 'GRAY', - 'DARK_GRAY', - 'BLUE', - 'GREEN', - 'AQUA', - 'RED', - 'LIGHT_PURPLE', - 'YELLOW', - 'WHITE' - ]); - } - expect(guildName.legacyRank).to.be.a('number'); - expect(guildName.expHistory).to.be.a('array'); - guildName.expHistory.forEach((history) => { - expect(history).to.be.a('object'); - expect(history.day).to.be.a('string'); - expect(history.date).to.be.a('date'); - expect(history.exp).to.be.a('number'); - expect(history.totalExp).to.be.a('number'); - expect(guildName.achievements).to.be.a('object'); - expect(guildName.achievements.winners).to.be.a('number'); - expect(guildName.achievements.experienceKings).to.be.a('number'); - expect(guildName.achievements.onlinePlayers).to.be.a('number'); - expect(guildName.preferredGames).to.be.an('array'); - guildName.preferredGames.forEach((game) => { - expect(game).instanceOf(Game); - }); - }); - }); - }); - describe('Guild Id', async () => { - it('expect not to throw', async () => { - guildId = await client.getGuild('id', guild.id); - }); - it('should be an object', () => { - expect(guildId).to.be.an('object'); - }); - - it('required keys should exist', () => { - expect(guildId.id).to.be.a('string'); - expect(guildId.name).to.be.a('string'); - expect(guildId.description).to.be.a('string'); - expect(guildId.experience).to.be.a('number'); - expect(guildId.level).to.be.a('number'); - expect(guildId.members).to.be.an('array'); - guildId.members.forEach((member) => { - expect(member).to.be.an('object'); - expect(member.uuid).to.be.a('string'); - expect(member.joinedAtTimestamp).to.be.a('number'); - expect(member.joinedAt).to.be.a('Date'); - expect(member.questParticipation).to.be.a('number'); - expect(member.rank).to.be.a('string'); - expect(member.expHistory).to.be.a('array'); - member.expHistory.forEach((history) => { - expect(history).to.be.a('object'); - expect(history.day).to.be.a('string'); - expect(history.date).to.be.a('date'); - expect(history.exp).to.be.a('number'); - expect(history.totalExp).to.be.a('number'); - }); - expect(member.weeklyExperience).to.be.a('number'); - }); - if (guildId.me) { - expect(guildId.me).to.be.an('object'); - expect(guildId.me.uuid).to.be.a('string'); - expect(guildId.me.joinedAtTimestamp).to.be.a('number'); - expect(guildId.me.joinedAt).to.be.a('Date'); - expect(guildId.me.questParticipation).to.be.a('number'); - expect(guildId.me.rank).to.be.a('string'); - expect(guildId.me.expHistory).to.be.a('array'); - guildId.me.expHistory.forEach((history) => { - expect(history).to.be.a('object'); - expect(history.day).to.be.a('string'); - expect(history.date).to.be.a('date'); - expect(history.exp).to.be.a('number'); - expect(history.totalExp).to.be.a('number'); - }); - expect(guildId.me.weeklyExperience).to.be.a('number'); - } - expect(guildId.ranks).to.be.an('array'); - guildId.ranks.forEach((rank) => { - expect(rank).to.be.an('object'); - expect(rank.name).to.be.a('string'); - expect(rank.default).to.be.a('boolean'); - if (rank.tag) expect(rank.tag).to.be.a('string'); - expect(rank.createdAt).to.be.a('date'); - expect(rank.createdAtTimestamp).to.be.a('number'); - expect(rank.priority).to.be.a('number'); - }); - expect(guildId.totalWeeklyGexp).to.be.a('number'); - expect(guildId.createdAtTimestamp).to.be.a('number'); - expect(guildId.createdAt).to.be.a('date'); - expect(guildId.joinable).to.be.a('boolean'); - expect(guildId.publiclyListed).to.be.a('boolean'); - if (guildId.banner) { - expect(guildId.banner).to.be.a('object'); - expect(guildId.banner['Base']).to.be.a('string'); - expect(guildId.banner['Patterns']).to.be.an('array'); - guildId.banner['Patterns'].forEach((pattern) => { - expect(pattern).to.be.a('object'); - expect(pattern['Pattern']).to.be.a('string'); - expect(pattern['Color']).that.satisfies( - (value) => typeof value === 'number' || typeof value === 'string' - ); - }); - } - if (guildId.tag) expect(guildId.tag).to.be.a('string'); - if (guildId.tagColor) { - expect(guildId.tagColor.color).to.be.a('string'); - expect(guildId.tagColor.color).to.be.oneOf([ - 'BLACK', - 'DARK_BLUE', - 'DARK_GREEN', - 'DARK_AQUA', - 'DARK_RED', - 'DARK_PURPLE', - 'GOLD', - 'GRAY', - 'DARK_GRAY', - 'BLUE', - 'GREEN', - 'AQUA', - 'RED', - 'LIGHT_PURPLE', - 'YELLOW', - 'WHITE' - ]); - } - expect(guildId.legacyRank).to.be.a('number'); - expect(guildId.expHistory).to.be.a('array'); - guildId.expHistory.forEach((history) => { - expect(history).to.be.a('object'); - expect(history.day).to.be.a('string'); - expect(history.date).to.be.a('date'); - expect(history.exp).to.be.a('number'); - expect(history.totalExp).to.be.a('number'); - expect(guildId.achievements).to.be.a('object'); - expect(guildId.achievements.winners).to.be.a('number'); - expect(guildId.achievements.experienceKings).to.be.a('number'); - expect(guildId.achievements.onlinePlayers).to.be.a('number'); - expect(guildId.preferredGames).to.be.an('array'); - guildId.preferredGames.forEach((game) => { - expect(game).instanceOf(Game); - }); - }); - }); - }); - describe('Guild Player', async () => { - it('expect not to throw', async () => { - guildPlayer = await client.getGuild('player', guild.uuid); - }); - it('should be an object', () => { - expect(guildPlayer).to.be.an('object'); - }); - it('required keys should exist', () => { - expect(guildPlayer.id).to.be.a('string'); - expect(guildPlayer.name).to.be.a('string'); - expect(guildPlayer.description).to.be.a('string'); - expect(guildPlayer.experience).to.be.a('number'); - expect(guildPlayer.level).to.be.a('number'); - expect(guildPlayer.members).to.be.an('array'); - guildPlayer.members.forEach((member) => { - expect(member).to.be.an('object'); - expect(member.uuid).to.be.a('string'); - expect(member.joinedAtTimestamp).to.be.a('number'); - expect(member.joinedAt).to.be.a('Date'); - expect(member.questParticipation).to.be.a('number'); - expect(member.rank).to.be.a('string'); - expect(member.expHistory).to.be.a('array'); - member.expHistory.forEach((history) => { - expect(history).to.be.a('object'); - expect(history.day).to.be.a('string'); - expect(history.date).to.be.a('date'); - expect(history.exp).to.be.a('number'); - expect(history.totalExp).to.be.a('number'); - }); - expect(member.weeklyExperience).to.be.a('number'); - }); - if (guildPlayer.me) { - expect(guildPlayer.me).to.be.an('object'); - expect(guildPlayer.me.uuid).to.be.a('string'); - expect(guildPlayer.me.joinedAtTimestamp).to.be.a('number'); - expect(guildPlayer.me.joinedAt).to.be.a('Date'); - expect(guildPlayer.me.questParticipation).to.be.a('number'); - expect(guildPlayer.me.rank).to.be.a('string'); - expect(guildPlayer.me.expHistory).to.be.a('array'); - guildPlayer.me.expHistory.forEach((history) => { - expect(history).to.be.a('object'); - expect(history.day).to.be.a('string'); - expect(history.date).to.be.a('date'); - expect(history.exp).to.be.a('number'); - expect(history.totalExp).to.be.a('number'); - }); - expect(guildPlayer.me.weeklyExperience).to.be.a('number'); - } - expect(guildPlayer.ranks).to.be.an('array'); - guildPlayer.ranks.forEach((rank) => { - expect(rank).to.be.an('object'); - expect(rank.name).to.be.a('string'); - expect(rank.default).to.be.a('boolean'); - if (rank.tag) expect(rank.tag).to.be.a('string'); - expect(rank.createdAt).to.be.a('date'); - expect(rank.createdAtTimestamp).to.be.a('number'); - expect(rank.priority).to.be.a('number'); - }); - expect(guildPlayer.totalWeeklyGexp).to.be.a('number'); - expect(guildPlayer.createdAtTimestamp).to.be.a('number'); - expect(guildPlayer.createdAt).to.be.a('date'); - expect(guildPlayer.joinable).to.be.a('boolean'); - expect(guildPlayer.publiclyListed).to.be.a('boolean'); - if (guildPlayer.banner) { - expect(guildPlayer.banner).to.be.a('object'); - expect(guildPlayer.banner['Base']).to.be.a('string'); - expect(guildPlayer.banner['Patterns']).to.be.an('array'); - guildPlayer.banner['Patterns'].forEach((pattern) => { - expect(pattern).to.be.a('object'); - expect(pattern['Pattern']).to.be.a('string'); - expect(pattern['Color']).that.satisfies( - (value) => typeof value === 'number' || typeof value === 'string' - ); - }); - } - if (guildPlayer.tag) expect(guildPlayer.tag).to.be.a('string'); - if (guildPlayer.tagColor) { - expect(guildPlayer.tagColor.color).to.be.a('string'); - expect(guildPlayer.tagColor.color).to.be.oneOf([ - 'BLACK', - 'DARK_BLUE', - 'DARK_GREEN', - 'DARK_AQUA', - 'DARK_RED', - 'DARK_PURPLE', - 'GOLD', - 'GRAY', - 'DARK_GRAY', - 'BLUE', - 'GREEN', - 'AQUA', - 'RED', - 'LIGHT_PURPLE', - 'YELLOW', - 'WHITE' - ]); - } - expect(guildPlayer.legacyRank).to.be.a('number'); - expect(guildPlayer.expHistory).to.be.a('array'); - guildPlayer.expHistory.forEach((history) => { - expect(history).to.be.a('object'); - expect(history.day).to.be.a('string'); - expect(history.date).to.be.a('date'); - expect(history.exp).to.be.a('number'); - expect(history.totalExp).to.be.a('number'); - expect(guildPlayer.achievements).to.be.a('object'); - expect(guildPlayer.achievements.winners).to.be.a('number'); - expect(guildPlayer.achievements.experienceKings).to.be.a('number'); - expect(guildPlayer.achievements.onlinePlayers).to.be.a('number'); - expect(guildPlayer.preferredGames).to.be.an('array'); - guildPlayer.preferredGames.forEach((game) => { - expect(game).instanceOf(Game); - }); - }); - }); - }); - }); - }); - }); - describe('Invalid', async () => { - describe('Guild Name Test', async () => { - it('expect to throw', async () => { - try { - player = await client.getGuild('name', 'This is not a valid guild name'); - throw new Error('Expected an error to be thrown, but no error was thrown.'); - } catch (error) { - expect(error.message).to.equal(Errors.GUILD_DOES_NOT_EXIST); - } - }).timeout(5000); - }); - describe('Player not in guild', async () => { - invalid.noGuild.forEach((user) => { - it('expect to throw', async () => { - player = await client.getGuild('player', user.uuid); - expect(player).to.be.null; - }).timeout(5000); - }); - }); - describe('Guild id Test', async () => { - it('expect to throw', async () => { - try { - player = await client.getGuild('id', 'This is not a valid guild id'); - throw new Error('Expected an error to be thrown, but no error was thrown.'); - } catch (error) { - expect(error.message).to.equal(Errors.INVALID_GUILD_ID); - } - }).timeout(5000); - }); - describe('No input Test', async () => { - it('expect to throw', async () => { - try { - player = await client.getGuild(); - throw new Error('Expected an error to be thrown, but no error was thrown.'); - } catch (error) { - expect(error.message).to.equal(Errors.NO_GUILD_QUERY); - } - }).timeout(5000); - }); - describe('Bad guild search', async () => { - it('expect to throw', async () => { - try { - player = await client.getGuild('test', 'no'); - throw new Error('Expected an error to be thrown, but no error was thrown.'); - } catch (error) { - expect(error.message).to.equal(Errors.INVALID_GUILD_SEARCH_PARAMETER); - } - }).timeout(5000); - }); - }); -}); diff --git a/tests/Client#getLeaderboards.js b/tests/Client#getLeaderboards.js deleted file mode 100644 index 34450a277..000000000 --- a/tests/Client#getLeaderboards.js +++ /dev/null @@ -1,29 +0,0 @@ -/* eslint-disable no-undef */ -const { client } = require('./Client.js'); -const { expect } = require('chai'); - -describe('Client#getLeaderboards', async () => { - let leaderboards; - it('expect not to throw', async () => { - leaderboards = await client.getLeaderboards(); - }); - it('should be an object', () => { - expect(leaderboards).to.be.an('object'); - }); - it('required keys should exist', () => { - for (const minigame in leaderboards) { - const minigameLbs = leaderboards[minigame]; - for (const lb of minigameLbs) { - expect(lb).to.be.an('object'); - expect(lb.leaders).to.be.an('array'); - expect(lb.playerCount).to.be.a('number'); - if (lb.name) { - expect(lb.name).to.be.a('string'); - } - if (lb.title) { - expect(lb.title).to.be.a('string'); - } - } - } - }); -}); diff --git a/tests/Client#getPlayer.js b/tests/Client#getPlayer.js deleted file mode 100644 index 945c25f23..000000000 --- a/tests/Client#getPlayer.js +++ /dev/null @@ -1,467 +0,0 @@ -/* eslint-disable no-undef */ -const { - Game, - SkyWars, - BedWars, - UHC, - SpeedUHC, - MurderMystery, - Duels, - BuildBattle, - MegaWalls, - CopsAndCrims, - TNTGames, - SmashHeroes, - VampireZ, - BlitzSurvivalGames, - ArenaBrawl, - Guild, - PlayerCosmetics, - Pets, - Pet, - Color, - WoolGames, - Errors, - Player -} = require('../src'); -const { client } = require('./Client.js'); -const { users } = require('./data.js'); -const { expect } = require('chai'); - -describe('Client#getPlayer', () => { - describe('Valid Player', async () => { - users.forEach((user) => { - let playerTest; - describe(`User Test ${users.indexOf(user) + 1} | UUID`, async () => { - it('expect not to throw', async () => { - playerTest = await client.getPlayer(user.uuid, { guild: true }); - }).timeout(5000); - it('should be an object', () => { - expect(playerTest).to.be.an('object'); - }); - it('required keys should exist', () => { - expect(playerTest).to.be.instanceOf(Player); - expect(playerTest.nickname).to.be.a('string'); - expect(playerTest.uuid).to.be.a('string'); - expect(playerTest.rank).to.be.a('string'); - if (playerTest.mcVersion) { - expect(playerTest.mcVersion).to.be.a('string'); - } - if (playerTest.firstLoginTimestamp) { - expect(playerTest.firstLoginTimestamp).to.be.a('number'); - } - if (playerTest.lastLoginTimestamp) { - expect(playerTest.lastLoginTimestamp).to.be.a('number'); - } - if (playerTest.lastLogoutTimestamp) { - expect(playerTest.lastLogoutTimestamp).to.be.a('number'); - } - if (playerTest.recentlyPlayedGame) { - expect(playerTest.recentlyPlayedGame).instanceOf(Game); - } - if (playerTest.plusColor) { - expect(playerTest.plusColor).instanceOf(Color); - } - if (playerTest.guild) { - expect(playerTest.guild).instanceOf(Guild); - } - expect(playerTest.karma).to.be.a('number'); - expect(playerTest.achievementPoints).to.be.a('number'); - expect(playerTest.totalExperience).to.be.a('number'); - expect(playerTest.level).to.be.a('number'); - expect(playerTest.socialMedia).to.be.an('array'); - if (playerTest.giftsSent) { - expect(playerTest.giftsSent).to.be.a('number'); - } - if (playerTest.giftsReceived) { - expect(playerTest.giftsReceived).to.be.a('number'); - } - if (playerTest.lastDailyRewardTimestamp) { - expect(playerTest.lastDailyRewardTimestamp).to.be.a('number'); - } - expect(playerTest.userLanguage).to.be.a('string'); - if (playerTest.claimedLevelingRewards.length) { - expect(playerTest.claimedLevelingRewards) - .to.be.an('array') - .that.satisfies((v) => { - return v.every((i) => typeof i === 'number'); - }); - } - if (playerTest.globalCosmetics) { - expect(playerTest.globalCosmetics).to.be.instanceOf(PlayerCosmetics); - expect(playerTest.globalCosmetics.allCosmetics) - .to.be.an('array') - .that.satisfies((v) => { - return v.every((i) => typeof i === 'string'); - }); - if (playerTest.globalCosmetics.petManager) { - expect(playerTest.globalCosmetics.petManager).to.be.instanceOf(Pets); - expect(playerTest.globalCosmetics.petManager.pets) - .to.be.an('array') - .that.satisfies((v) => { - return v.every((i) => i instanceof Pet); - }); - if (playerTest.globalCosmetics.petManager.lastJourneyTimestamp) { - expect(playerTest.globalCosmetics.petManager.lastJourneyTimestamp).to.be.a('number'); - } - if (playerTest.globalCosmetics.petManager.lastJourneyAt) { - expect(playerTest.globalCosmetics.petManager.lastJourneyAt).to.be.instanceOf(Date); - } - if (playerTest.globalCosmetics.petManager.petConsumables) { - expect(playerTest.globalCosmetics.petManager.petConsumables).to.be.an('object'); - } - } - if (playerTest.globalCosmetics.suits) { - expect(playerTest.globalCosmetics.suits) - .to.be.an('array') - .that.satisfies((v) => { - return v.every((i) => typeof i === 'string'); - }); - } - if (playerTest.globalCosmetics.hats) { - expect(playerTest.globalCosmetics.hats) - .to.be.an('array') - .that.satisfies((v) => { - return v.every((i) => typeof i === 'string'); - }); - } - if (playerTest.globalCosmetics.gadgets) { - expect(playerTest.globalCosmetics.gadgets) - .to.be.an('array') - .that.satisfies((v) => { - return v.every((i) => typeof i === 'string'); - }); - } - if (playerTest.globalCosmetics.morphs) { - expect(playerTest.globalCosmetics.morphs) - .to.be.an('array') - .that.satisfies((v) => { - return v.every((i) => typeof i === 'string'); - }); - } - if (playerTest.globalCosmetics.cloaks) { - expect(playerTest.globalCosmetics.cloaks) - .to.be.an('array') - .that.satisfies((v) => { - return v.every((i) => typeof i === 'string'); - }); - } - if (playerTest.globalCosmetics.rankColors) { - expect(playerTest.globalCosmetics.rankColors) - .to.be.an('array') - .that.satisfies((v) => { - return v.every((i) => typeof i === 'string'); - }); - } - if (playerTest.globalCosmetics.particlePacks) { - expect(playerTest.globalCosmetics.particlePacks) - .to.be.an('array') - .that.satisfies((v) => { - return v.every((i) => typeof i === 'string'); - }); - } - if (playerTest.globalCosmetics.clickEffects) { - expect(playerTest.globalCosmetics.clickEffects) - .to.be.an('array') - .that.satisfies((v) => { - return v.every((i) => typeof i === 'string'); - }); - } - } - if (playerTest.ranksPurchaseTime) { - if (playerTest.ranksPurchaseTime['VIP']) { - expect(playerTest.ranksPurchaseTime['VIP']).to.be.instanceOf(Date); - } - if (playerTest.ranksPurchaseTime['VIP_PLUS']) { - expect(playerTest.ranksPurchaseTime['VIP_PLUS']).to.be.instanceOf(Date); - } - if (playerTest.ranksPurchaseTime['MVP']) { - expect(playerTest.ranksPurchaseTime['MVP']).to.be.instanceOf(Date); - } - if (playerTest.ranksPurchaseTime['MVP_PLUS']) { - expect(playerTest.ranksPurchaseTime['MVP_PLUS']).to.be.instanceOf(Date); - } - } - if (playerTest.stats) { - if (playerTest.stats.skywars) { - expect(playerTest.stats.skywars).instanceOf(SkyWars); - } - if (playerTest.stats.bedwars) { - expect(playerTest.stats.bedwars).instanceOf(BedWars); - } - if (playerTest.stats.uhc) { - expect(playerTest.stats.uhc).instanceOf(UHC); - } - if (playerTest.stats.speeduhc) { - expect(playerTest.stats.speeduhc).instanceOf(SpeedUHC); - } - if (playerTest.stats.murdermystery) { - expect(playerTest.stats.murdermystery).instanceOf(MurderMystery); - } - if (playerTest.stats.duels) { - expect(playerTest.stats.duels).instanceOf(Duels); - } - if (playerTest.stats.buildbattle) { - expect(playerTest.stats.buildbattle).instanceOf(BuildBattle); - } - if (playerTest.stats.megawalls) { - expect(playerTest.stats.megawalls).instanceOf(MegaWalls); - } - if (playerTest.stats.copsandcrims) { - expect(playerTest.stats.copsandcrims).instanceOf(CopsAndCrims); - } - if (playerTest.stats.tntgames) { - expect(playerTest.stats.tntgames).instanceOf(TNTGames); - } - if (playerTest.stats.smashheroes) { - expect(playerTest.stats.smashheroes).instanceOf(SmashHeroes); - } - if (playerTest.stats.vampirez) { - expect(playerTest.stats.vampirez).instanceOf(VampireZ); - } - if (playerTest.stats.blitzsg) { - expect(playerTest.stats.blitzsg).instanceOf(BlitzSurvivalGames); - } - if (playerTest.stats.arena) { - expect(playerTest.stats.arena).instanceOf(ArenaBrawl); - } - if (playerTest.stats.woolgames) { - expect(playerTest.stats.woolgames).instanceOf(WoolGames); - } - } - }); - }); - describe(`User Test ${users.indexOf(user) + 1} | Username`, async () => { - it('expect not to throw', async () => { - playerTest = await client.getPlayer(user.username, { guild: true }); - }).timeout(5000); - it('should be an object', () => { - expect(playerTest).to.be.an('object'); - }); - it('required keys should exist', () => { - expect(playerTest).to.be.instanceOf(Player); - expect(playerTest.nickname).to.be.a('string'); - expect(playerTest.uuid).to.be.a('string'); - expect(playerTest.rank).to.be.a('string'); - if (playerTest.mcVersion) { - expect(playerTest.mcVersion).to.be.a('string'); - } - if (playerTest.firstLoginTimestamp) { - expect(playerTest.firstLoginTimestamp).to.be.a('number'); - } - if (playerTest.lastLoginTimestamp) { - expect(playerTest.lastLoginTimestamp).to.be.a('number'); - } - if (playerTest.lastLogoutTimestamp) { - expect(playerTest.lastLogoutTimestamp).to.be.a('number'); - } - if (playerTest.recentlyPlayedGame) { - expect(playerTest.recentlyPlayedGame).instanceOf(Game); - } - if (playerTest.plusColor) { - expect(playerTest.plusColor).instanceOf(Color); - } - if (playerTest.guild) { - expect(playerTest.guild).instanceOf(Guild); - } - expect(playerTest.karma).to.be.a('number'); - expect(playerTest.achievementPoints).to.be.a('number'); - expect(playerTest.totalExperience).to.be.a('number'); - expect(playerTest.level).to.be.a('number'); - expect(playerTest.socialMedia).to.be.an('array'); - if (playerTest.giftsSent) { - expect(playerTest.giftsSent).to.be.a('number'); - } - if (playerTest.giftsReceived) { - expect(playerTest.giftsReceived).to.be.a('number'); - } - if (playerTest.lastDailyRewardTimestamp) { - expect(playerTest.lastDailyRewardTimestamp).to.be.a('number'); - } - expect(playerTest.userLanguage).to.be.a('string'); - if (playerTest.claimedLevelingRewards.length) { - expect(playerTest.claimedLevelingRewards) - .to.be.an('array') - .that.satisfies((v) => { - return v.every((i) => typeof i === 'number'); - }); - } - if (playerTest.globalCosmetics) { - expect(playerTest.globalCosmetics).to.be.instanceOf(PlayerCosmetics); - expect(playerTest.globalCosmetics.allCosmetics) - .to.be.an('array') - .that.satisfies((v) => { - return v.every((i) => typeof i === 'string'); - }); - if (playerTest.globalCosmetics.petManager) { - expect(playerTest.globalCosmetics.petManager).to.be.instanceOf(Pets); - expect(playerTest.globalCosmetics.petManager.pets) - .to.be.an('array') - .that.satisfies((v) => { - return v.every((i) => i instanceof Pet); - }); - if (playerTest.globalCosmetics.petManager.lastJourneyTimestamp) { - expect(playerTest.globalCosmetics.petManager.lastJourneyTimestamp).to.be.a('number'); - } - if (playerTest.globalCosmetics.petManager.lastJourneyAt) { - expect(playerTest.globalCosmetics.petManager.lastJourneyAt).to.be.instanceOf(Date); - } - if (playerTest.globalCosmetics.petManager.petConsumables) { - expect(playerTest.globalCosmetics.petManager.petConsumables).to.be.an('object'); - } - } - if (playerTest.globalCosmetics.suits) { - expect(playerTest.globalCosmetics.suits) - .to.be.an('array') - .that.satisfies((v) => { - return v.every((i) => typeof i === 'string'); - }); - } - if (playerTest.globalCosmetics.hats) { - expect(playerTest.globalCosmetics.hats) - .to.be.an('array') - .that.satisfies((v) => { - return v.every((i) => typeof i === 'string'); - }); - } - if (playerTest.globalCosmetics.gadgets) { - expect(playerTest.globalCosmetics.gadgets) - .to.be.an('array') - .that.satisfies((v) => { - return v.every((i) => typeof i === 'string'); - }); - } - if (playerTest.globalCosmetics.morphs) { - expect(playerTest.globalCosmetics.morphs) - .to.be.an('array') - .that.satisfies((v) => { - return v.every((i) => typeof i === 'string'); - }); - } - if (playerTest.globalCosmetics.cloaks) { - expect(playerTest.globalCosmetics.cloaks) - .to.be.an('array') - .that.satisfies((v) => { - return v.every((i) => typeof i === 'string'); - }); - } - if (playerTest.globalCosmetics.rankColors) { - expect(playerTest.globalCosmetics.rankColors) - .to.be.an('array') - .that.satisfies((v) => { - return v.every((i) => typeof i === 'string'); - }); - } - if (playerTest.globalCosmetics.particlePacks) { - expect(playerTest.globalCosmetics.particlePacks) - .to.be.an('array') - .that.satisfies((v) => { - return v.every((i) => typeof i === 'string'); - }); - } - if (playerTest.globalCosmetics.clickEffects) { - expect(playerTest.globalCosmetics.clickEffects) - .to.be.an('array') - .that.satisfies((v) => { - return v.every((i) => typeof i === 'string'); - }); - } - } - if (playerTest.ranksPurchaseTime) { - if (playerTest.ranksPurchaseTime['VIP']) { - expect(playerTest.ranksPurchaseTime['VIP']).to.be.instanceOf(Date); - } - if (playerTest.ranksPurchaseTime['VIP_PLUS']) { - expect(playerTest.ranksPurchaseTime['VIP_PLUS']).to.be.instanceOf(Date); - } - if (playerTest.ranksPurchaseTime['MVP']) { - expect(playerTest.ranksPurchaseTime['MVP']).to.be.instanceOf(Date); - } - if (playerTest.ranksPurchaseTime['MVP_PLUS']) { - expect(playerTest.ranksPurchaseTime['MVP_PLUS']).to.be.instanceOf(Date); - } - } - if (playerTest.stats) { - if (playerTest.stats.skywars) { - expect(playerTest.stats.skywars).instanceOf(SkyWars); - } - if (playerTest.stats.bedwars) { - expect(playerTest.stats.bedwars).instanceOf(BedWars); - } - if (playerTest.stats.uhc) { - expect(playerTest.stats.uhc).instanceOf(UHC); - } - if (playerTest.stats.speeduhc) { - expect(playerTest.stats.speeduhc).instanceOf(SpeedUHC); - } - if (playerTest.stats.murdermystery) { - expect(playerTest.stats.murdermystery).instanceOf(MurderMystery); - } - if (playerTest.stats.duels) { - expect(playerTest.stats.duels).instanceOf(Duels); - } - if (playerTest.stats.buildbattle) { - expect(playerTest.stats.buildbattle).instanceOf(BuildBattle); - } - if (playerTest.stats.megawalls) { - expect(playerTest.stats.megawalls).instanceOf(MegaWalls); - } - if (playerTest.stats.copsandcrims) { - expect(playerTest.stats.copsandcrims).instanceOf(CopsAndCrims); - } - if (playerTest.stats.tntgames) { - expect(playerTest.stats.tntgames).instanceOf(TNTGames); - } - if (playerTest.stats.smashheroes) { - expect(playerTest.stats.smashheroes).instanceOf(SmashHeroes); - } - if (playerTest.stats.vampirez) { - expect(playerTest.stats.vampirez).instanceOf(VampireZ); - } - if (playerTest.stats.blitzsg) { - expect(playerTest.stats.blitzsg).instanceOf(BlitzSurvivalGames); - } - if (playerTest.stats.arena) { - expect(playerTest.stats.arena).instanceOf(ArenaBrawl); - } - if (playerTest.stats.woolgames) { - expect(playerTest.stats.woolgames).instanceOf(WoolGames); - } - } - }); - }); - }); - }); - describe('Invalid Player', async () => { - describe('Invalid Username Test', async () => { - it('expect to throw', async () => { - try { - player = await client.getPlayer('ThisUsernameIsInvalid', { guild: true }); - throw new Error('Expected an error to be thrown, but no error was thrown.'); - } catch (error) { - expect(error.message).to.equal(Errors.PLAYER_DOES_NOT_EXIST); - } - }).timeout(5000); - }); - describe('Invalid UUID Test', async () => { - it('expect to throw', async () => { - try { - player = await client.getPlayer('this-is-not-a-valid-uuid', { guild: true }); - throw new Error('Expected an error to be thrown, but no error was thrown.'); - } catch (error) { - expect(error.message).to.equal(Errors.PLAYER_DOES_NOT_EXIST); - } - }).timeout(5000); - }); - describe('No input Test', async () => { - it('expect to throw', async () => { - try { - player = await client.getPlayer(); - throw new Error('Expected an error to be thrown, but no error was thrown.'); - } catch (error) { - expect(error.message).to.equal(Errors.NO_NICKNAME_UUID); - } - }).timeout(5000); - }); - }); -}); diff --git a/tests/Client#getRecentGames.js b/tests/Client#getRecentGames.js deleted file mode 100644 index 922d460bf..000000000 --- a/tests/Client#getRecentGames.js +++ /dev/null @@ -1,88 +0,0 @@ -/* eslint-disable no-undef */ -const { client } = require('./Client.js'); -const { users } = require('./data.js'); -const { expect } = require('chai'); - -describe('Client#getRecentGames', async () => { - users.forEach((user) => { - let recentGames; - describe(`User Test ${users.indexOf(user) + 1} | UUID`, async () => { - it('expect not to throw', async () => { - recentGames = await client.getRecentGames(user.uuid); - }); - it('should be an array', () => { - expect(recentGames).to.be.an('array'); - }); - it('required keys should exist', () => { - if (recentGames.length === 0) return; - recentGames.forEach((game) => { - expect(game).to.have.keys([ - 'game', - 'id', - 'code', - 'name', - 'found', - 'dateTimestamp', - 'date', - 'mode', - 'map', - 'ongoing', - 'endedAt', - 'endedTimestamp' - ]); - expect(game.game).to.be.a('string'); - expect(game.id).to.be.a('number'); - expect(game.code).to.be.a('string'); - expect(game.name).to.be.a('string'); - expect(game.found).to.be.a('boolean'); - expect(game.dateTimestamp).to.be.a('number'); - expect(game.date).to.be.a('date'); - expect(game.mode).to.be.a('string'); - expect(game.map).to.be.a('string'); - expect(game.ongoing).to.be.a('boolean'); - expect(game.endedAt).to.be.a('date'); - expect(game.endedTimestamp).to.be.a('number'); - }); - }); - }); - describe(`User Test ${users.indexOf(user) + 1} | Username`, async () => { - it('expect not to throw', async () => { - recentGames = await client.getRecentGames(user.username); - }); - it('should be an array', () => { - expect(recentGames).to.be.an('array'); - }); - it('required keys should exist', () => { - if (recentGames.length === 0) return; - recentGames.forEach((game) => { - expect(game).to.have.keys([ - 'game', - 'id', - 'code', - 'name', - 'found', - 'dateTimestamp', - 'date', - 'mode', - 'map', - 'ongoing', - 'endedAt', - 'endedTimestamp' - ]); - expect(game.game).to.be.a('string'); - expect(game.id).to.be.a('number'); - expect(game.code).to.be.a('string'); - expect(game.name).to.be.a('string'); - expect(game.found).to.be.a('boolean'); - expect(game.dateTimestamp).to.be.a('number'); - expect(game.date).to.be.a('date'); - expect(game.mode).to.be.a('string'); - expect(game.map).to.be.a('string'); - expect(game.ongoing).to.be.a('boolean'); - expect(game.endedAt).to.be.a('date'); - expect(game.endedTimestamp).to.be.a('number'); - }); - }); - }); - }); -}); diff --git a/tests/Client#getServerInfo.js b/tests/Client#getServerInfo.js deleted file mode 100644 index c6975b6f8..000000000 --- a/tests/Client#getServerInfo.js +++ /dev/null @@ -1,184 +0,0 @@ -/* eslint-disable no-undef */ -const { client } = require('./Client.js'); -const { expect } = require('chai'); - -describe('Client#getServerInfo', async () => { - let server; - describe('No amount input test', async () => { - it('expect not to throw', async () => { - server = await client.getServerInfo(); - }); - it('should be an object', () => { - expect(server).to.be.an('object'); - }); - it('required keys should exist', () => { - expect(server.protocolUsed).to.be.a('number'); - expect(server.versionInfo).to.be.a('string'); - expect(server.players).to.be.an('object'); - expect(server.players.max).to.be.a('number'); - expect(server.players.online).to.be.a('number'); - expect(server.players.players).to.be.an('array'); - if (server.rawMOTD) { - expect(server.rawMOTD).to.be.a('string'); - } - if (server.cleanMOTD) { - expect(server.cleanMOTD).to.be.a('string'); - } - if (server.textMOTD) { - expect(server.textMOTD).to.be.a('string'); - } - if (server.faviconB64) { - expect(server.faviconB64).to.be.a('string'); - } - if (server.favicon) { - expect(server.favicon).to.be.instanceOf(Buffer); - } - if (server.ping) { - expect(server.ping).to.be.a('number'); - } - }); - }); - server; - describe('Number', async () => { - describe('Valid amount test', async () => { - it('expect not to throw', async () => { - server = await client.getServerInfo(2); - }); - it('should be an object', () => { - expect(server).to.be.an('object'); - }); - it('required keys should exist', () => { - expect(server.protocolUsed).to.be.a('number'); - expect(server.versionInfo).to.be.a('string'); - expect(server.players).to.be.an('object'); - expect(server.players.max).to.be.a('number'); - expect(server.players.online).to.be.a('number'); - expect(server.players.players).to.be.an('array'); - if (server.rawMOTD) { - expect(server.rawMOTD).to.be.a('string'); - } - if (server.cleanMOTD) { - expect(server.cleanMOTD).to.be.a('string'); - } - if (server.textMOTD) { - expect(server.textMOTD).to.be.a('string'); - } - if (server.faviconB64) { - expect(server.faviconB64).to.be.a('string'); - } - if (server.favicon) { - expect(server.favicon).to.be.instanceOf(Buffer); - } - if (server.ping) { - expect(server.ping).to.be.a('number'); - } - }); - }); - server; - describe('Invalid input test', async () => { - it('expect not to throw', async () => { - server = await client.getServerInfo(-1); - }); - it('should be an object', () => { - expect(server).to.be.an('object'); - }); - it('required keys should exist', () => { - expect(server.protocolUsed).to.be.a('number'); - expect(server.versionInfo).to.be.a('string'); - expect(server.players).to.be.an('object'); - expect(server.players.max).to.be.a('number'); - expect(server.players.online).to.be.a('number'); - expect(server.players.players).to.be.an('array'); - if (server.rawMOTD) { - expect(server.rawMOTD).to.be.a('string'); - } - if (server.cleanMOTD) { - expect(server.cleanMOTD).to.be.a('string'); - } - if (server.textMOTD) { - expect(server.textMOTD).to.be.a('string'); - } - if (server.faviconB64) { - expect(server.faviconB64).to.be.a('string'); - } - if (server.favicon) { - expect(server.favicon).to.be.instanceOf(Buffer); - } - if (server.ping) { - expect(server.ping).to.be.a('number'); - } - }); - }); - }); - describe('String', async () => { - describe('Valid amount test', async () => { - it('expect not to throw', async () => { - server = await client.getServerInfo('2'); - }); - it('should be an object', () => { - expect(server).to.be.an('object'); - }); - it('required keys should exist', () => { - expect(server.protocolUsed).to.be.a('number'); - expect(server.versionInfo).to.be.a('string'); - expect(server.players).to.be.an('object'); - expect(server.players.max).to.be.a('number'); - expect(server.players.online).to.be.a('number'); - expect(server.players.players).to.be.an('array'); - if (server.rawMOTD) { - expect(server.rawMOTD).to.be.a('string'); - } - if (server.cleanMOTD) { - expect(server.cleanMOTD).to.be.a('string'); - } - if (server.textMOTD) { - expect(server.textMOTD).to.be.a('string'); - } - if (server.faviconB64) { - expect(server.faviconB64).to.be.a('string'); - } - if (server.favicon) { - expect(server.favicon).to.be.instanceOf(Buffer); - } - if (server.ping) { - expect(server.ping).to.be.a('number'); - } - }); - }); - server; - describe('Invalid input test', async () => { - it('expect not to throw', async () => { - server = await client.getServerInfo('HI if u see this'); - }); - it('should be an object', () => { - expect(server).to.be.an('object'); - }); - it('required keys should exist', () => { - expect(server.protocolUsed).to.be.a('number'); - expect(server.versionInfo).to.be.a('string'); - expect(server.players).to.be.an('object'); - expect(server.players.max).to.be.a('number'); - expect(server.players.online).to.be.a('number'); - expect(server.players.players).to.be.an('array'); - if (server.rawMOTD) { - expect(server.rawMOTD).to.be.a('string'); - } - if (server.cleanMOTD) { - expect(server.cleanMOTD).to.be.a('string'); - } - if (server.textMOTD) { - expect(server.textMOTD).to.be.a('string'); - } - if (server.faviconB64) { - expect(server.faviconB64).to.be.a('string'); - } - if (server.favicon) { - expect(server.favicon).to.be.instanceOf(Buffer); - } - if (server.ping) { - expect(server.ping).to.be.a('number'); - } - }); - }); - }); -}); diff --git a/tests/Client#getStatus.js b/tests/Client#getStatus.js deleted file mode 100644 index 5418c3e11..000000000 --- a/tests/Client#getStatus.js +++ /dev/null @@ -1,56 +0,0 @@ -/* eslint-disable */ -const { client } = require('./Client.js'); -const { users } = require('./data.js'); -const { Game } = require('../src'); -const { expect } = require('chai'); - -describe('Client#getStatus', () => { - let status; - - users.forEach((user) => { - describe(`User Test ${users.indexOf(user) + 1} | UUID`, async () => { - it('expect not to throw', async () => { - status = await client.getStatus(user.uuid); - }); - it('should be an object', () => { - expect(status).to.be.an('object'); - }); - it('required keys should exist', () => { - if (status.online) { - expect(status.online).to.be.a('boolean'); - } - if (status.game) { - expect(status.game).instanceOf(Game); - } - if (status.map) { - expect(status.map).to.be.a('string'); - } - if (status.mode) { - expect(status.mode).to.be.a('string'); - } - }); - }); - describe(`User Test ${users.indexOf(user) + 1} | Username`, async () => { - it('expect not to throw', async () => { - status = await client.getStatus(user.username); - }); - it('should be an object', () => { - expect(status).to.be.an('object'); - }); - it('required keys should exist', () => { - if (status.online) { - expect(status.online).to.be.a('boolean'); - } - if (status.game) { - expect(status.game).instanceOf(Game); - } - if (status.map) { - expect(status.map).to.be.a('string'); - } - if (status.mode) { - expect(status.mode).to.be.a('string'); - } - }); - }); - }); -}); diff --git a/tests/Client#getWatchdogStats.js b/tests/Client#getWatchdogStats.js deleted file mode 100644 index 226b132cd..000000000 --- a/tests/Client#getWatchdogStats.js +++ /dev/null @@ -1,20 +0,0 @@ -/* eslint-disable no-undef */ -const { client } = require('./Client.js'); -const { expect } = require('chai'); - -describe('Client#getWatchdogStats', () => { - let watchdog; - it('expect not to throw', async () => { - watchdog = await client.getWatchdogStats(); - }); - it('should be an object', () => { - expect(watchdog).to.be.an('object'); - }); - it('required keys should exist', () => { - expect(watchdog.byStaffRollingDay).to.be.a('number'); - expect(watchdog.byStaffTotal).to.be.a('number'); - expect(watchdog.byWatchdogLastMinute).to.be.a('number'); - expect(watchdog.byWatchdogRollingDay).to.be.a('number'); - expect(watchdog.byWatchdogTotal).to.be.a('number'); - }); -}); diff --git a/tests/Client.js b/tests/Client.js deleted file mode 100644 index c71f113d0..000000000 --- a/tests/Client.js +++ /dev/null @@ -1,5 +0,0 @@ -/* eslint-disable no-undef */ -const { Client } = require('../src'); -module.exports = { - client: new Client(process.env.HYPIXEL_KEY) -}; diff --git a/tests/data.js b/tests/data.js deleted file mode 100644 index 27b0b8bcd..000000000 --- a/tests/data.js +++ /dev/null @@ -1,95 +0,0 @@ -/* eslint-disable */ -module.exports = { - users: [ - { - uuid: '37501e7512b845ab8796e2baf9e9677a', - username: 'ILoveWristSpasm', - skyblockProfileId: 'bcd05ba6-908f-4266-8862-c1649c2536a9' - }, - { - uuid: '4982eac19ae7422891b61a17a74c87a2', - username: 'JasperJazzyPants', - skyblockProfileId: '' - }, - { - uuid: '3b76b69ae5134296a730ed49171ad6f8', - username: 'WarOG', - skyblockProfileId: '3775f7d8-ccbc-46e7-bc76-b59a9b5e12d5' - }, - { - uuid: '14727faefbdc4aff848cd2713eb9939e', - username: 'Pixelic', - skyblockProfileId: '805c9751-0ff1-4cb6-8e9c-1067bf3bc601' - }, - { - uuid: 'ea805d40e8284d8d8e64e9fc8ac301ca', - username: 'Altpapier', - skyblockProfileId: 'ea805d40-e828-4d8d-8e64-e9fc8ac301ca' - }, - { - uuid: '4855c53ee4fb4100997600a92fc50984', - username: 'DuckySoSkilled', - skyblockProfileId: '00912956-3fd6-42ee-a166-3f649ceaf559' - }, - { - uuid: 'f025c1c7f55a4ea0b8d93f47d17dfe0f', - username: 'Plancke', - skyblockProfileId: 'f025c1c7-f55a-4ea0-b8d9-3f47d17dfe0f' - }, - { - uuid: 'fb3d96498a5b4d5b91b763db14b195ad', - username: 'DeathStreeks', - skyblockProfileId: 'fb3d9649-8a5b-4d5b-91b7-63db14b195ad' - }, - { - uuid: '28667672039044989b0019b14a2c34d6', - username: 'Refraction', - skyblockProfileId: 'd3df3ccc-ffd3-473f-bbba-311d5329bd25' - }, - { - uuid: '20934ef9488c465180a78f861586b4cf', - username: 'Minikloon', - skyblockProfileId: '974b2a9e-0d6d-4181-9dd1-8a05fb228965' - }, - { - uuid: 'ef962ec2df6e48a2ac9d6062c1b84652', - username: 'builder_247', - skyblockProfileId: '498228a7-32d4-4358-9aab-d1e97e6806cd' - } - ], - guilds: [ - { - name: 'PancakeSquad', - id: '557c75d90cf2ce51d4a92368', - uuid: 'f025c1c7f55a4ea0b8d93f47d17dfe0f' - }, - { - name: 'WristSpasm', - id: '5b8dd8cb0cf24573ab84c9ad', - uuid: '2700c8b565c74d8e9be5eb7a6ae19295' - }, - { - name: 'Pixelic', - id: '64b54f9d8ea8c96aaedafe84', - uuid: '14727faefbdc4aff848cd2713eb9939e' - }, - { - name: 'The Dawns Awakening', - id: '5ba94ed50cf2cc24cf043706', - uuid: '3b76b69ae5134296a730ed49171ad6f8' - } - ], - invalid: { - noSkyblockProfiles: [{ uuid: 'b45add7b081443909fb00aa9a3e15eb0' }], - noGuild: [{ uuid: '37501e7512b845ab8796e2baf9e9677a' }] - }, - houses: [ - '79006240d96a4464b4c6edaa82724a5f', - '3b76b69ae5134296a730ed49171ad6f8', - '9d9b5326e20943998c2167e8679e3d7c', - 'fb3d96498a5b4d5b91b763db14b195ad', - 'f0511d1334de468bbfbb31062204660c', - '20934ef9488c465180a78f861586b4cf', - '96f1641dde3441288f40ad8ecbfcb634' - ] -}; diff --git a/tests/housing/Client#getActiveHouses.js b/tests/housing/Client#getActiveHouses.js deleted file mode 100644 index 155ba69ed..000000000 --- a/tests/housing/Client#getActiveHouses.js +++ /dev/null @@ -1,19 +0,0 @@ -/* eslint-disable no-undef */ -const { House } = require('../../src/index.js'); -const { client } = require('../Client.js'); -const { expect } = require('chai'); - -describe('Client#getActiveHouses', async () => { - let houses; - it('expect not to throw', async () => { - houses = await client.getActiveHouses(); - }); - it('should be an objecct', () => { - expect(houses).to.be.an('array'); - }); - it('required keys should exist', () => { - houses.forEach((apiHouse) => { - expect(apiHouse).instanceOf(House); - }); - }); -}); diff --git a/tests/housing/Client#getHouse.js b/tests/housing/Client#getHouse.js deleted file mode 100644 index 7473239ca..000000000 --- a/tests/housing/Client#getHouse.js +++ /dev/null @@ -1,22 +0,0 @@ -/* eslint-disable no-undef */ -const { House } = require('../../src/index.js'); -const { client } = require('../Client.js'); -const { houses } = require('../data.js'); -const { expect } = require('chai'); - -describe('Client#getHouse', async () => { - let apiHouse; - houses.forEach((houseUUID) => { - describe(`House Test ${houses.indexOf(houseUUID) + 1}`, async () => { - it('expect not to throw', async () => { - apiHouse = await client.getHouse(houseUUID); - }); - it('should be an objecct', () => { - expect(apiHouse).to.be.an('object'); - }); - it('required keys should exist', () => { - expect(apiHouse).instanceOf(House); - }); - }); - }); -}); diff --git a/tests/housing/Client#getPlayerHouses.js b/tests/housing/Client#getPlayerHouses.js deleted file mode 100644 index e9f1ab0c2..000000000 --- a/tests/housing/Client#getPlayerHouses.js +++ /dev/null @@ -1,38 +0,0 @@ -/* eslint-disable no-undef */ -const { House } = require('../../src/index.js'); -const { client } = require('../Client.js'); -const { users } = require('../data.js'); -const { expect } = require('chai'); - -describe('Client#getPlayerHouses', async () => { - users.forEach((user) => { - describe(`User Test ${users.indexOf(user) + 1} | UUID`, async () => { - let houses; - it('expect not to throw', async () => { - houses = await client.getPlayerHouses(user.uuid); - }); - it('should be an objecct', () => { - expect(houses).to.be.an('array'); - }); - it('required keys should exist', () => { - houses.forEach((apiHouse) => { - expect(apiHouse).instanceOf(House); - }); - }); - }); - describe(`User Test ${users.indexOf(user) + 1} | Username`, async () => { - let houses; - it('expect not to throw', async () => { - houses = await client.getPlayerHouses(user.username); - }); - it('should be an objecct', () => { - expect(houses).to.be.an('array'); - }); - it('required keys should exist', () => { - houses.forEach((apiHouse) => { - expect(apiHouse).instanceOf(House); - }); - }); - }); - }); -}); diff --git a/tests/skyblock/Client#getSkyblockBingo.js b/tests/skyblock/Client#getSkyblockBingo.js deleted file mode 100644 index 1eb311767..000000000 --- a/tests/skyblock/Client#getSkyblockBingo.js +++ /dev/null @@ -1,17 +0,0 @@ -/* eslint-disable no-undef */ -const { BingoData } = require('../../src/index.js'); -const { client } = require('../Client.js'); -const { expect } = require('chai'); - -describe('Client#getSkyblockBingo', async () => { - let bingo; - it('expect not to throw', async () => { - bingo = await client.getSkyblockBingo(); - }); - it('should be an objecct', () => { - expect(bingo).to.be.an('object'); - }); - it('required keys should exist', () => { - expect(bingo).instanceOf(BingoData); - }); -}); diff --git a/tests/skyblock/Client#getSkyblockFireSales.js b/tests/skyblock/Client#getSkyblockFireSales.js deleted file mode 100644 index a2dc56381..000000000 --- a/tests/skyblock/Client#getSkyblockFireSales.js +++ /dev/null @@ -1,19 +0,0 @@ -/* eslint-disable no-undef */ -const { FireSale } = require('../../src/index.js'); -const { client } = require('../Client.js'); -const { expect } = require('chai'); - -describe('Client#getSkyblockFireSales', async () => { - let fireSales; - it('expect not to throw', async () => { - fireSales = await client.getSkyblockFireSales(); - }); - it('should be an objecct', () => { - expect(fireSales).to.be.an('array'); - }); - it('required keys should exist', () => { - fireSales.forEach((sale) => { - expect(sale).instanceOf(FireSale); - }); - }); -}); diff --git a/tests/skyblock/Client#getSkyblockGarden.js b/tests/skyblock/Client#getSkyblockGarden.js deleted file mode 100644 index 035470005..000000000 --- a/tests/skyblock/Client#getSkyblockGarden.js +++ /dev/null @@ -1,23 +0,0 @@ -/* eslint-disable no-undef */ -const { SkyblockGarden } = require('../../src/index.js'); -const { client } = require('../Client.js'); -const { users } = require('../data.js'); -const { expect } = require('chai'); - -describe('Client#getSkyblockGarden', async () => { - let garden; - users.forEach((user) => { - if (user.skyblockProfileId.length === 0) return; - describe(`User Test ${users.indexOf(user) + 1} | Skyblock Profile ID`, async () => { - it('expect not to throw', async () => { - garden = await client.getSkyblockGarden(user.skyblockProfileId); - }); - it('should be an objecct', () => { - expect(garden).to.be.an('object'); - }); - it('required keys should exist', () => { - expect(garden).instanceOf(SkyblockGarden); - }); - }); - }); -}); diff --git a/tests/skyblock/Client#getSkyblockGovernment.js b/tests/skyblock/Client#getSkyblockGovernment.js deleted file mode 100644 index 4a47ac851..000000000 --- a/tests/skyblock/Client#getSkyblockGovernment.js +++ /dev/null @@ -1,32 +0,0 @@ -/* eslint-disable no-undef */ -const { Candidate } = require('../../src/index.js'); -const { client } = require('../Client.js'); -const { expect } = require('chai'); - -describe('Client#getSkyblockGovernment', async () => { - let government; - it('expect not to throw', async () => { - government = await client.getSkyblockGovernment(); - }); - it('should be an objecct', () => { - expect(government).to.be.an('object'); - }); - it('required keys should exist', () => { - expect(government.lastUpdatedTimestamp).to.be.a('number'); - expect(government.lastUpdatedAt).to.be.a('date'); - government.lastElectionResults.forEach((mayor) => { - expect(mayor).instanceOf(Candidate); - }); - expect(government.mayor).instanceOf(Candidate); - expect(government.runningYear).to.be.a('number'); - if (government.currentElectionResults) { - expect(government.currentElectionResults).to.be.a('map'); - government.currentElectionResults.forEach((mayor) => { - expect(mayor).instanceOf(Candidate); - }); - } - if (government.currentElectionFor) { - expect(government.currentElectionFor).to.be.a('number'); - } - }); -}); diff --git a/tests/skyblock/Client#getSkyblockMember.js b/tests/skyblock/Client#getSkyblockMember.js deleted file mode 100644 index ce165c95b..000000000 --- a/tests/skyblock/Client#getSkyblockMember.js +++ /dev/null @@ -1,53 +0,0 @@ -/* eslint-disable no-undef */ -const { SkyblockMember, Errors } = require('../../src/index.js'); -const { users, invalid } = require('../data.js'); -const { client } = require('../Client.js'); -const { expect } = require('chai'); - -describe('Client#getSkyblockMember', async () => { - describe('Valid', async () => { - users.forEach((user) => { - let member; - describe(`User Test ${users.indexOf(user) + 1} | UUID`, async () => { - it('expect not to throw', async () => { - member = await client.getSkyblockMember(user.uuid); - }); - it('should be an map', () => { - expect(member).to.be.an('map'); - }); - it('required keys should exist', () => { - member.forEach((profile) => { - expect(profile).instanceOf(SkyblockMember); - }); - }); - }); - describe(`User Test ${users.indexOf(user) + 1} | Username`, async () => { - it('expect not to throw', async () => { - member = await client.getSkyblockMember(user.username); - }); - it('should be an map', () => { - expect(member).to.be.an('map'); - }); - it('required keys should exist', () => { - member.forEach((profile) => { - expect(profile).instanceOf(SkyblockMember); - }); - }); - }); - }); - }); - describe('Invalid', async () => { - describe('Never Played skyblock', async () => { - invalid.noSkyblockProfiles.forEach((user) => { - it('expect to throw', async () => { - try { - member = await client.getSkyblockMember(user.uuid); - throw new Error('Expected an error to be thrown, but no error was thrown.'); - } catch (error) { - expect(error.message).to.equal(Errors.NO_SKYBLOCK_PROFILES); - } - }).timeout(5000); - }); - }); - }); -}); diff --git a/tests/skyblock/Client#getSkyblockNews.js b/tests/skyblock/Client#getSkyblockNews.js deleted file mode 100644 index 736d2ea43..000000000 --- a/tests/skyblock/Client#getSkyblockNews.js +++ /dev/null @@ -1,21 +0,0 @@ -/* eslint-disable no-undef */ -const { client } = require('../Client.js'); -const { expect } = require('chai'); - -describe('Client#getSkyblockNews', async () => { - let news; - it('expect not to throw', async () => { - news = await client.getSkyblockNews(); - }); - it('Should be an array', () => { - expect(news).to.be.an('array'); - }); - it('required keys should exist', () => { - for (const record of news) { - expect(record.title).to.be.a('string'); - expect(record.link).to.be.a('string'); - expect(record.date).instanceOf(Date); - expect(record.rawDate).to.be.a('string'); - } - }); -}); diff --git a/tests/skyblock/Client#getSkyblockProfiles.js b/tests/skyblock/Client#getSkyblockProfiles.js deleted file mode 100644 index d9c26bf9c..000000000 --- a/tests/skyblock/Client#getSkyblockProfiles.js +++ /dev/null @@ -1,108 +0,0 @@ -/* eslint-disable no-undef */ -const { SkyblockMember, Errors } = require('../../src/index.js'); -const { users, invalid } = require('../data.js'); -const { client } = require('../Client.js'); -const { expect } = require('chai'); - -describe('Client#getSkyblockProfiles', async () => { - describe('Valid', async () => { - users.forEach((user) => { - describe(`User Test ${users.indexOf(user) + 1} | UUID`, async () => { - let profiles; - it('expect not to throw', async () => { - profiles = await client.getSkyblockProfiles(user.uuid); - }); - it('should be an array', () => { - expect(profiles).to.be.an('array'); - }); - it('required keys should exist', () => { - profiles.forEach((profile) => { - expect(profile.profileId).to.be.a('string'); - expect(profile.profileName).to.be.oneOf([ - 'Apple', - 'Banana', - 'Blueberry', - 'Coconut', - 'Cucumber', - 'Grapes', - 'Kiwi', - 'Lemon', - 'Lime', - 'Mango', - 'Orange', - 'Papaya', - 'Pear', - 'Peach', - 'Pineapple', - 'Pomegranate', - 'Raspberry', - 'Strawberry', - 'Tomato', - 'Watermelon', - 'Zucchini' - ]); - profile.members.forEach((profile) => { - expect(profile).instanceOf(SkyblockMember); - }); - expect(profile.me).instanceOf(SkyblockMember); - }); - }); - }); - describe(`User Test ${users.indexOf(user) + 1} | Username`, async () => { - let profiles; - it('expect not to throw', async () => { - profiles = await client.getSkyblockProfiles(user.username); - }); - it('should be an array', () => { - expect(profiles).to.be.an('array'); - }); - it('required keys should exist', () => { - profiles.forEach((profile) => { - expect(profile.profileId).to.be.a('string'); - expect(profile.profileName).to.be.oneOf([ - 'Apple', - 'Banana', - 'Blueberry', - 'Coconut', - 'Cucumber', - 'Grapes', - 'Kiwi', - 'Lemon', - 'Lime', - 'Mango', - 'Orange', - 'Papaya', - 'Pear', - 'Peach', - 'Pineapple', - 'Pomegranate', - 'Raspberry', - 'Strawberry', - 'Tomato', - 'Watermelon', - 'Zucchini' - ]); - profile.members.forEach((profile) => { - expect(profile).instanceOf(SkyblockMember); - }); - expect(profile.me).instanceOf(SkyblockMember); - }); - }); - }); - }); - }); - describe('Invalid', async () => { - describe('Never played skyblock', async () => { - invalid.noSkyblockProfiles.forEach((user) => { - it('expect to throw', async () => { - try { - member = await client.getSkyblockProfiles(user.uuid); - throw new Error('Expected an error to be thrown, but no error was thrown.'); - } catch (error) { - expect(error.message).to.equal(Errors.NO_SKYBLOCK_PROFILES); - } - }).timeout(5000); - }); - }); - }); -}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..a2752f1d8 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "allowJs": false, + + "target": "ES2022", + "moduleDetection": "force", + "moduleResolution": "NodeNext", + "module": "NodeNext", + + "rootDir": "./src", + "outDir": "./dist", + "declaration": true, + "sourceMap": true, + + "strict": true, + "noUncheckedIndexedAccess": true, + "forceConsistentCasingInFileNames": true, + "noUnusedLocals": true, + "resolveJsonModule": true, + "noFallthroughCasesInSwitch": true, + "declarationMap": true, + + "lib": ["ES2022"] + }, + "include": ["src/**/*"], + "exclude": ["node_modules/", "src/**/*.test.ts"] +} diff --git a/typedoc.json b/typedoc.json new file mode 100644 index 000000000..a1844e1ff --- /dev/null +++ b/typedoc.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://typedoc.org/schema.json", + "entryPoints": ["src/"], + "out": "documentation", + "includeVersion": false, + "exclude": ["**/*.test.ts"], + "plugin": ["@8hobbies/typedoc-plugin-404", "typedoc-plugin-rename-defaults", "typedoc-material-theme"], + "entryPointStrategy": "expand", + "hideGenerator": true, + "cleanOutputDir": true, + "page404Content": "This poage does not exist", + "useHostedBaseUrlForAbsoluteLinks": true, + "hostedBaseUrl": "https://hypixel-api-reborn.github.io/reborn-ts/", + "lang": "en", + "themeColor": "#2f3236" +} diff --git a/typings/index.d.ts b/typings/index.d.ts deleted file mode 100644 index 25eb165a2..000000000 --- a/typings/index.d.ts +++ /dev/null @@ -1,4335 +0,0 @@ -/* eslint-disable indent */ -/* eslint-disable max-len */ -/* eslint-disable camelcase */ -/* eslint-disable jsdoc/require-jsdoc */ -// Minimum TypeScript Version: 3.6 - -import { NetworthResult } from 'skyhelper-networth'; -import { EventEmitter } from 'events'; - -export type PLAYER_RANK = - | 'Default' - | 'VIP' - | 'VIP+' - | 'MVP' - | 'MVP+' - | 'MVP++' - | 'YouTube' - | 'Game Master' - | 'Admin' - | 'PIG+++' - | 'INNIT'; -export type GAME_NAME = - | 'Quake Craft' - | 'Walls' - | 'Paintball' - | 'Blitz Survival Games' - | 'The TNT Games' - | 'VampireZ' - | 'Mega Walls' - | 'Arcade' - | 'Arena Walls' - | 'UHC Champions' - | 'Cops and Crims' - | 'Warlords' - | 'Smash Heroes' - | 'Turbo Kart Racing' - | 'Housing' - | 'SkyWars' - | 'Crazy Walls' - | 'Speed UHC' - | 'SkyClash' - | 'Classic Games' - | 'Prototype' - | 'BedWars' - | 'Murder Mystery' - | 'Build Battle' - | 'Duels' - | 'SkyBlock' - | 'The Pit' - | 'Replay' - | 'Limbo' - | 'Queue' - | 'Main Lobby' - | 'Tournament Lobby' - | 'Idle' - | 'SMP' - | 'Wool Wars'; -export type GAME_ID = - | 2 - | 3 - | 4 - | 5 - | 6 - | 7 - | 13 - | 14 - | 17 - | 20 - | 21 - | 23 - | 24 - | 25 - | 26 - | 51 - | 52 - | 54 - | 55 - | 56 - | 57 - | 58 - | 59 - | 60 - | 61 - | 63 - | 64 - | 65 - | 67 - | 68 - | -1 - | -2 - | -3 - | -4 - | -5 - | -6; -export type GAME_CODE = - | 'QUAKECRAFT' - | 'WALLS' - | 'PAINTBALL' - | 'SURVIVAL_GAMES' - | 'TNTGAMES' - | 'VAMPIREZ' - | 'WALLS3' - | 'ARCADE' - | 'UHC' - | 'MCGO' - | 'BATTLEGROUND' - | 'SUPER_SMASH' - | 'GINGERBREAD' - | 'HOUSING' - | 'SKYWARS' - | 'TRUE_COMBAT' - | 'SPEED_UHC' - | 'SKYCLASH' - | 'LEGACY' - | 'PROTOTYPE' - | 'BEDWARS' - | 'MURDER_MYSTERY' - | 'BUILD_BATTLE' - | 'DUELS' - | 'SKYBLOCK' - | 'PIT' - | 'REPLAY' - | 'LIMBO' - | 'IDLE' - | 'QUEUE' - | 'MAIN_LOBBY' - | 'TOURNAMENT_LOBBY' - | 'SMP' - | 'WOOL_GAMES'; -export type SKYWARS_PRESTIGE = - | 'Iron' - | 'Iron' - | 'Gold' - | 'Diamond' - | 'Emerald' - | 'Sapphire' - | 'Ruby' - | 'Crystal' - | 'Opal' - | 'Amethyst' - | 'Rainbow' - | 'Mythic'; -export type SKYWARS_PRESTIGE_ICON = - | '⋆' - | '★' - | '☆' - | '⁕' - | '✶' - | '✳' - | '✴' - | '✷' - | '❋' - | '✼' - | '❂' - | '❁' - | '☬' - | '✙' - | '❤️' - | '☠' - | '✦' - | '✌' - | '❦' - | '✵' - | '❣' - | '☯' - | '✺' - | 'ಠ_ಠ' - | '⚔'; -export type BEDWARS_PRESTIGE = - | 'Iron' - | 'Gold' - | 'Diamond' - | 'Emerald' - | 'Sapphire' - | 'Ruby' - | 'Crystal' - | 'Opal' - | 'Amethyst' - | 'Rainbow' - | 'Iron Prime' - | 'Gold Prime' - | 'Diamond Prime' - | 'Emerald Prime' - | 'Sapphire Prime' - | 'Ruby Prime' - | 'Crystal Prime' - | 'Opal Prime' - | 'Amethyst Prime' - | 'Mirror' - | 'Light' - | 'Dawn' - | 'Dusk' - | 'Air' - | 'Wind' - | 'Nebula' - | 'Thunder' - | 'Earth' - | 'Water' - | 'Fire' - | 'Sunrise' - | 'Eclipse' - | 'Gamma' - | 'Majestic' - | 'Andesine' - | 'Marine' - | 'Element' - | 'Galaxy' - | 'Atomic' - | 'Sunset' - | 'Time' - | 'Winter' - | 'Obsidian' - | 'Spring' - | 'Ice' - | 'Summer' - | 'Spinel' - | 'Autumn' - | 'Mystic' - | 'Eternal'; -export type SkyblockRarity = - | 'VERY_SPECIAL' - | 'SPECIAL' - | 'SUPREME' - | 'MYTHIC' - | 'LEGENDARY' - | 'EPIC' - | 'RARE' - | 'UNCOMMON' - | 'COMMON'; -export type SOCIAL_MEDIA_ID = 'YOUTUBE' | 'DISCORD' | 'HYPIXEL' | 'TWITTER' | 'INSTAGRAM' | 'TWITCH'; -export type SKYWARS_KIT_TYPE = - | 'basic' - | 'supporting' - | 'mining' - | 'defending' - | 'attacking' - | 'advanced' - | 'enderchest'; -export type SKYWARS_KIT_GAMEMODE = 'solo' | 'team'; -export type BINGO_TYPE = 'ONE_TIME' | 'ONE_TIER' | 'TIERED'; -export type ACHIEVEMENT_TYPE = 'ONE_TIME' | 'TIERED'; -export type QUEST_TYPE = 'DAILY' | 'WEEKLY'; -export type GAME_STATIC = - | 'arcade' - | 'arena' - | 'bedwars' - | 'hungergames' - | 'buildbattle' - | 'truecombat' - | 'duels' - | 'mcgo' - | 'murdermystery' - | 'paintball' - | 'quake' - | 'skyclash' - | 'skywars' - | 'supersmash' - | 'speeduhc' - | 'gingerbread' - | 'tntgames' - | 'uhc' - | 'vampirez' - | 'walls3' - | 'walls' - | 'battleground' - | 'woolgames'; -export interface ChallengeData { - id: string; - name: string; - rewardType: string; - reward: number; -} -export interface Objective { - id: string; - type: 'Integer' | 'Boolean'; - amountNeeded: number; -} -export interface QuestReward { - type: string; - amount: number; -} -export type SKYBLOCK_BESTIARY = number; -export interface SKYBLOCK_BESTIARY_CATEGORY { - [key: string]: { - damage?: number; - head: string; - itemId?: string; - kills: number; - maxTier: number; - name: string; - tier: number; - }; -} -export interface SKYBLOCK_SKILL_DATA { - xp: number; - level: number; - maxLevel: number; - xpCurrent: number; - xpForNext: number; - progress: number; - cosmetic: boolean; -} -export interface SKYBLOCK_DUNGEONS_FLOOR_RUN { - timestamp: number; - score_exploration: number; - score_speed: number; - score_skill: number; - score_bonus: number; - dungeon_class: string; - teammates: string; - elapsed_time: number; - damage_dealt: number; - deaths: number; - mobs_killed: number; - secrets_found: number; - damage_mitigated: number; -} -export interface SKYBLOCK_DUNGEONS_FLOOR { - fastestRun: SKYBLOCK_DUNGEONS_FLOOR_RUN; - fastestSRun: SKYBLOCK_DUNGEONS_FLOOR_RUN; - fastestSPlusRun: SKYBLOCK_DUNGEONS_FLOOR_RUN; - completions: number; -} -export interface SKYBLOCK_GARDEN_CROPS { - wheat: number; - carrot: number; - sugarCane: number; - potato: number; - pumpkin: number; - melon: number; - cactus: number; - cocoaBeans: number; - mushroom: number; - netherWart: number; -} -export interface SKYBLOCK_GARDEN_COMPOSTER_UPGRADES { - speed: number; - multiDrop: number; - fuelCap: number; - organicMatterCap: number; - costReduction: number; -} -export interface SKYBLOCK_GARDEN_COMPOSTER { - organicMatter: number; - fuelUnits: number; - compostUnits: number; - compostItems: number; - conversionTicks: number; - upgrades: SKYBLOCK_GARDEN_COMPOSTER_UPGRADES; -} -export interface SKYBLOCK_GARDEN_VISITOR_SERVED { - total: number; - unique: number; -} -export interface SKYBLOCK_GARDEN_VISITOR { - visited: Record; - completed: Record; - served: SKYBLOCK_GARDEN_VISITOR_SERVED; -} -export interface SKYBLOCK_SLAYER_DATA { - xp: number; - tier1: number; - tier2: number; - tier3: number; - tier4: number; - tier5: number; - level: number; -} -export interface clientOptions { - cache?: boolean; - hypixelCacheTime?: number; - mojangCacheTime?: number; - cacheSize?: number; - cacheFilter?: string | string[] | { whitelist: string | string[]; blacklist: string | string[] }; - cacheHandler?: CacheHandler & unknown; - rateLimit?: 'HARD' | 'AUTO' | 'NONE'; - keyLimit?: number; - syncWithHeaders?: boolean; - silent?: boolean; - headers?: Record; - checkForUpdates?: boolean; -} -type PromiseLike = T | Promise; -type CacheHandler = { - set: (key: string, value: unknown) => PromiseLike; - get: (key: string) => PromiseLike; - has: (key: string) => PromiseLike; - delete: (key: string) => PromiseLike; - keys: () => PromiseLike; - size: () => PromiseLike; - clear: () => PromiseLike; -}; -export interface methodOptions { - raw?: boolean; - noCacheCheck?: boolean; - noCaching?: boolean; -} -export interface playerMethodOptions extends methodOptions { - guild?: boolean; - recentGames?: boolean; -} -export interface skyblockMemberOptions extends methodOptions { - fetchPlayer?: boolean; - getMuseum?: boolean; - getGarden?: boolean; -} -export interface auctionsOptions extends methodOptions { - noInfo?: boolean; - noAuctions?: boolean; - raw?: boolean; - retries?: number; - cooldown?: number; - race?: boolean; - includeItemBytes?: boolean; -} -export interface playerBingoOptions extends methodOptions { - fetchBingoData?: boolean; -} - -export interface LevelProgress { - currentXP: number; - remainingXP: number; - xpToNext: number; - percent: number; - percentRemaining: number; -} -declare module 'hypixel-api-reborn' { - const version: string; - const Errors: { - CACHE_FILTER_INVALID: string; - CACHE_LIMIT_MUST_BE_A_NUMBER: string; - CACHE_TIME_MUST_BE_A_NUMBER: string; - CONNECTION_ERROR: string; - ERROR_CODE_CAUSE: string; - ERROR_STATUSTEXT: string; - GUILD_DOES_NOT_EXIST: string; - INVALID_API_KEY: string; - INVALID_GUILD_ID: string; - INVALID_GUILD_SEARCH_PARAMETER: string; - INVALID_OPTION_VALUE: string; - INVALID_KEY_LIMIT_OPTION: string; - INVALID_HEADER_SYNC_OPTION: string; - INVALID_BURST_OPTION: string; - INVALID_RATE_LIMIT_OPTION: string; - INVALID_RESPONSE_BODY: string; - KEY_MUST_BE_A_STRING: string; - MALFORMED_UUID: string; - NO_API_KEY: string; - NO_GUILD_QUERY: string; - NO_NICKNAME_UUID: string; - NO_UUID: string; - OPTIONS_MUST_BE_AN_OBJECT: string; - PAGE_INDEX_ERROR: string; - PLAYER_DISABLED_ENDPOINT: string; - PLAYER_DOES_NOT_EXIST: string; - PLAYER_HAS_NEVER_LOGGED: string; - PLAYER_IS_INACTIVE: string; - RATE_LIMIT_INIT_ERROR: string; - SOMETHING_WENT_WRONG: string; - UUID_NICKNAME_MUST_BE_A_STRING: string; - MULTIPLE_INSTANCES: string; - UNEXPECTED_ERROR: string; - RATE_LIMIT_EXCEEDED: string; - }; - const Utils: { - arrayTools: { - /** - * @description Is input string or array? - */ - isStrArray(input: string | []): boolean; - /** - * @description String to array - */ - strToArray(input: string): string[]; - }; - Constants: { - duelsDivisions: [ - { name: 'Rookie'; key: 'rookie' }, - { name: 'Iron'; key: 'iron' }, - { name: 'Gold'; key: 'gold' }, - { name: 'Diamond'; key: 'diamond' }, - { name: 'Master'; key: 'master' }, - { name: 'Legend'; key: 'legend' }, - { name: 'Grandmaster'; key: 'grandmaster' }, - { name: 'Godlike'; key: 'godlike' }, - { name: 'WORLD ELITE'; key: 'world_elite' }, - { name: 'WORLD MASTER'; key: 'world_master' }, - { name: "WORLD'S BEST"; key: 'worlds_best' } - ]; - levelingXp: { - 1: 50; - 2: 125; - 3: 200; - 4: 300; - 5: 500; - 6: 750; - 7: 1000; - 8: 1500; - 9: 2000; - 10: 3500; - 11: 5000; - 12: 7500; - 13: 10000; - 14: 15000; - 15: 20000; - 16: 30000; - 17: 50000; - 18: 75000; - 19: 100000; - 20: 200000; - 21: 300000; - 22: 400000; - 23: 500000; - 24: 600000; - 25: 700000; - 26: 800000; - 27: 900000; - 28: 1000000; - 29: 1100000; - 30: 1200000; - 31: 1300000; - 32: 1400000; - 33: 1500000; - 34: 1600000; - 35: 1700000; - 36: 1800000; - 37: 1900000; - 38: 2000000; - 39: 2100000; - 40: 2200000; - 41: 2300000; - 42: 2400000; - 43: 2500000; - 44: 2600000; - 45: 2750000; - 46: 2900000; - 47: 3100000; - 48: 3400000; - 49: 3700000; - 50: 4000000; - }; - xpPast50: { - 51: 4300000; - 52: 4600000; - 53: 4900000; - 54: 5200000; - 55: 5500000; - 56: 5800000; - 57: 6100000; - 58: 6400000; - 59: 6700000; - 60: 7000000; - }; - runecraftingXp: { - 1: 50; - 2: 100; - 3: 125; - 4: 160; - 5: 200; - 6: 250; - 7: 315; - 8: 400; - 9: 500; - 10: 625; - 11: 785; - 12: 1000; - 13: 1250; - 14: 1600; - 15: 2000; - 16: 2465; - 17: 3125; - 18: 4000; - 19: 5000; - 20: 6200; - 21: 7800; - 22: 9800; - 23: 12200; - 24: 15300; - 25: 19050; - }; - skillsCap: { - taming: 60; - farming: 60; - mining: 60; - combat: 60; - foraging: 50; - fishing: 50; - enchanting: 60; - alchemy: 50; - carpentry: 50; - runecrafting: 25; - dungeons: 50; - social: 25; - }; - dungeonXp: { - 1: 50; - 2: 75; - 3: 110; - 4: 160; - 5: 230; - 6: 330; - 7: 470; - 8: 670; - 9: 950; - 10: 1340; - 11: 1890; - 12: 2665; - 13: 3760; - 14: 5260; - 15: 7380; - 16: 10300; - 17: 14400; - 18: 20000; - 19: 27600; - 20: 38000; - 21: 52500; - 22: 71500; - 23: 97000; - 24: 132000; - 25: 180000; - 26: 243000; - 27: 328000; - 28: 445000; - 29: 600000; - 30: 800000; - 31: 1065000; - 32: 1410000; - 33: 1900000; - 34: 2500000; - 35: 3300000; - 36: 4300000; - 37: 5600000; - 38: 7200000; - 39: 9200000; - 40: 1.2e7; - 41: 1.5e7; - 42: 1.9e7; - 43: 2.4e7; - 44: 3e7; - 45: 3.8e7; - 46: 4.8e7; - 47: 6e7; - 48: 7.5e7; - 49: 9.3e7; - 50: 1.1625e8; - }; - hotmXp: { - 1: 0; - 2: 3000; - 3: 9000; - 4: 25000; - 5: 60000; - 6: 100000; - 7: 150000; - }; - socialXp: { - 1: 50; - 2: 100; - 3: 150; - 4: 250; - 5: 500; - 6: 750; - 7: 1000; - 8: 1250; - 9: 1500; - 10: 2000; - 11: 2500; - 12: 3000; - 13: 3750; - 14: 4500; - 15: 6000; - 16: 8000; - 17: 10000; - 18: 12500; - 19: 15000; - 20: 20000; - 21: 25000; - 22: 30000; - 23: 35000; - 24: 40000; - 25: 50000; - }; - petScore: { - COMMON: 1; - UNCOMMON: 2; - RARE: 3; - EPIC: 4; - LEGENDARY: 5; - MYTHIC: 6; - }; - petRarityOffset: { - COMMON: 0; - UNCOMMON: 6; - RARE: 11; - EPIC: 16; - LEGENDARY: 20; - MYTHIC: 20; - }; - petLevels: [ - 100, - 110, - 120, - 130, - 145, - 160, - 175, - 190, - 210, - 230, - 250, - 275, - 300, - 330, - 360, - 400, - 440, - 490, - 540, - 600, - 660, - 730, - 800, - 880, - 960, - 1050, - 1150, - 1260, - 1380, - 1510, - 1650, - 1800, - 1960, - 2130, - 2310, - 2500, - 2700, - 2920, - 3160, - 3420, - 3700, - 4000, - 4350, - 4750, - 5200, - 5700, - 6300, - 7000, - 7800, - 8700, - 9700, - 10800, - 12000, - 13300, - 14700, - 16200, - 17800, - 19500, - 21300, - 23200, - 25200, - 27400, - 29800, - 32400, - 35200, - 38200, - 41400, - 44800, - 48400, - 52200, - 56200, - 60400, - 64800, - 69400, - 74200, - 79200, - 84700, - 90700, - 97200, - 104200, - 111700, - 119700, - 128200, - 137200, - 146700, - 156700, - 167700, - 179700, - 192700, - 206700, - 221700, - 237700, - 254700, - 272700, - 291700, - 311700, - 333700, - 357700, - 383700, - 411700, - 441700, - 476700, - 516700, - 561700, - 611700, - 666700, - 726700, - 791700, - 861700, - 936700, - 1016700, - 1101700, - 1191700, - 1286700, - 1386700, - 1496700, - 1616700, - 1746700, - 1886700, - 0, - 5555, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700 - ]; - leaderboardNames: { - ARENA: 'ARENA'; - COPS_AND_CRIMS: 'MCGO'; - WARLORDS: 'BATTLEGROUND'; - BLITZ_SURVIVAL_GAMES: 'SURVIVAL_GAMES'; - UHC: 'UHC'; - WALLS: 'WALLS'; - PROTOTYPE: 'PROTOTYPE'; - PAINTBALL: 'PAINTBALL'; - SKYWARS: 'SKYWARS'; - MURDER_MYSTERY: 'MURDER_MYSTERY'; - SMASH_HEROES: 'SUPER_SMASH'; - DUELS: 'DUELS'; - SPEED_UHC: 'SPEED_UHC'; - TNTGAMES: 'TNTGAMES'; - BEDWARS: 'BEDWARS'; - TURBO_KART_RACERS: 'GINGERBREAD'; - BUILD_BATTLE: 'BUILD_BATTLE'; - ARCADE: 'ARCADE'; - SKYCLASH: 'SKYCLASH'; - QUAKECRAFT: 'QUAKECRAFT'; - CRAZY_WALLS: 'TRUE_COMBAT'; - MEGA_WALLS: 'WALLS3'; - VAMPIREZ: 'VAMPIREZ'; - }; - MiniGamesString: { - QUAKECRAFT: 'Quakecraft'; - WALLS: 'Walls'; - PAINTBALL: 'Paintball'; - SURVIVAL_GAMES: 'Blitz Survival Games'; - TNTGAMES: 'The TNT Games'; - VAMPIREZ: 'VampireZ'; - WALLS3: 'Mega Walls'; - ARCADE: 'Arcade'; - ARENA: 'Arena Brawl'; - MCGO: 'Cops and Crims'; - UHC: 'UHC Champions'; - BATTLEGROUND: 'Warlords'; - SUPER_SMASH: 'Smash Heroes'; - GINGERBREAD: 'Turbo Kart Racers'; - HOUSING: 'Housing'; - SKYWARS: 'SkyWars'; - TRUE_COMBAT: 'Crazy Walls'; - SPEED_UHC: 'Speed UHC'; - SKYCLASH: 'SkyClash'; - LEGACY: 'Classic Games'; - PROTOTYPE: 'Prototype'; - BEDWARS: 'BedWars'; - MURDER_MYSTERY: 'Murder Mystery'; - BUILD_BATTLE: 'Build Battle'; - DUELS: 'Duels'; - PIT: 'The Pit'; - SKYBLOCK: 'SkyBlock'; - REPLAY: 'Replay'; - LIMBO: 'Limbo'; - IDLE: 'Idle'; - QUEUE: 'Queue'; - MAIN_LOBBY: 'Main Lobby'; - TOURNAMENT_LOBBY: 'Tournament Lobby'; - }; - SkyWarsPrestigeIcons: { - default: '⋆'; - angel_1: '★'; - angel_2: '☆'; - angel_3: '⁕'; - angel_4: '✶'; - angel_5: '✳'; - angel_6: '✴'; - angel_7: '✷'; - angel_8: '❋'; - angel_9: '✼'; - angel_10: '❂'; - angel_11: '❁'; - angel_12: '☬'; - iron_prestige: '✙'; - gold_prestige: '❤️'; - diamond_prestige: '☠'; - emerald_prestige: '✦'; - sapphire_prestige: '✌'; - ruby_prestige: '❦'; - crystal_prestige: '✵'; - opal_prestige: '❣'; - amethyst_prestige: '☯'; - rainbow_prestige: '✺'; - mythic_prestige: 'ಠ_ಠ'; - favor_of_the_angel_prestige: '⚔'; - }; - games: [ - { name: 'Quake Craft'; code: 'QUAKECRAFT'; id: 2 }, - { name: 'Walls'; code: 'WALLS'; id: 3 }, - { name: 'Paintball'; code: 'PAINTBALL'; id: 4 }, - { name: 'Blitz Survival Games'; code: 'SURVIVAL_GAMES'; id: 5 }, - { name: 'The TNT Games'; code: 'TNTGAMES'; id: 6 }, - { name: 'VampireZ'; code: 'VAMPIREZ'; id: 7 }, - { name: 'Mega Walls'; code: 'WALLS3'; id: 13 }, - { name: 'Arcade'; code: 'ARCADE'; id: 14 }, - { name: 'Arena Brawl'; code: 'ARENA'; id: 17 }, - { name: 'UHC Champions'; code: 'UHC'; id: 20 }, - { name: 'Cops and Crims'; code: 'MCGO'; id: 21 }, - { name: 'Warlords'; code: 'BATTLEGROUND'; id: 23 }, - { name: 'Smash Heroes'; code: 'SUPER_SMASH'; id: 24 }, - { name: 'Turbo Kart Racers'; code: 'GINGERBREAD'; id: 25 }, - { name: 'Housing'; code: 'HOUSING'; id: 26 }, - { name: 'SkyWars'; code: 'SKYWARS'; id: 51 }, - { name: 'Crazy Walls'; code: 'TRUE_COMBAT'; id: 52 }, - { name: 'Speed UHC'; code: 'SPEED_UHC'; id: 54 }, - { name: 'SkyClash'; code: 'SKYCLASH'; id: 55 }, - { name: 'Classic Games'; code: 'LEGACY'; id: 56 }, - { name: 'Prototype'; code: 'PROTOTYPE'; id: 57 }, - { name: 'BedWars'; code: 'BEDWARS'; id: 58 }, - { name: 'Murder Mystery'; code: 'MURDER_MYSTERY'; id: 59 }, - { name: 'Build Battle'; code: 'BUILD_BATTLE'; id: 60 }, - { name: 'Duels'; code: 'DUELS'; id: 61 }, - { name: 'SkyBlock'; code: 'SKYBLOCK'; id: 63 }, - { name: 'The Pit'; code: 'PIT'; id: 64 }, - { name: 'Replay'; code: 'REPLAY'; id: -1 }, - { name: 'Limbo'; code: 'LIMBO'; id: -2 }, - { name: 'Queue'; code: 'QUEUE'; id: -3 }, - { name: 'Main Lobby'; code: 'MAIN_LOBBY'; id: -4 }, - { name: 'Tournament Lobby'; code: 'TOURNAMENT_LOBBY'; id: -5 }, - { name: 'Idle'; code: 'IDLE'; id: -6 } - ]; - }; - /** - * @description Divides a by b - */ - divide(a: number, b: number): number; - guildExp: { - parseHistory(historyDate: Record): { day: string; date: Date; exp: number; totalExp: number }[]; - getGuildLevel(exp: number): number; - }; - oscillation: { - weekAB(date: Date): 'a' | 'b'; - monthAB(date: Date): 'a' | 'b'; - }; - /** - * @description Is this guild ID? - */ - isGuildID(id: string): boolean; - /** - * @description Is this uuid? - */ - isUUID(uuid: string): boolean; - removeSnakeCase: { - /** - * @description Validates JSON - */ - validateJSON(obj: Record): boolean; - /** - * @description Converts {str_str: {}} to {strStr: {}} without JSON validation - */ - single(obj: Record): Record; - /** - * @description Converts {str_str: {}} to {strStr: {}} - */ - recursive(obj: Record, lowerCase?: boolean): Record; - /** - * @description Converts 'str_str' to 'strStr' - */ - removeSnakeCaseString(str: string): string; - }; - rgbToHexColor(rgb: number[]): string; - SkyblockUtils: { - /** - * @description Decodes base64 to skyblock inventory data - */ - decode(base64: string): Promise>; - /** - * @description Get level by experience - */ - getLevelByXp(xp: number, type: string, levelCap: number | null): number; - /** - * @description Get level by achievement - */ - getLevelByAchievement( - achievementLevel: number, - type: string - ): { - xp: number; - level: number; - maxLevel: number; - xpCurrent: number; - xpForNext: number; - progress: number; - }; - /** - * @description Get slayer level - */ - getSlayerLevel(slayer: Record): { - xp: number; - tier1: number; - tier2: number; - tier3: number; - tier4: number; - level: number; - }; - }; - /** - * Calls Mojang API for player's nickname by uuid - * @param input Player UUID - */ - toIGN(input: string): Promise; - /** - * Calls Mojang API for player's uuid by nickname - * @param input Player nickname - */ - toUuid(input: string): Promise; - /** - * Converts varInts to js numbers - * @param bytes Array of numbers to be read as minecraft var ints. - */ - varInt(bytes: number[]): number; - }; - class Client extends EventEmitter { - constructor(key: string, options?: clientOptions); - /** - * @description API Key - */ - readonly key: string; - /** - * @description Client options - */ - readonly options: clientOptions; - /** - * @description Returns all cache entries - */ - readonly cache: Map; - /** - * @description Retrieves information about Hypixel achievements. - * @param {methodOptions} [options] - The method options. - */ - getAchievements(options?: methodOptions): Promise; - /** - * @description Parses the RSS feed from status.hypixel.net - * @param {methodOptions} [options] - The method options. - */ - getAPIStatus(options?: methodOptions): Promise; - /** - * @description Allows you to get all active boosters - * @param {methodOptions} [options] - The method options. - */ - getBoosters(options?: methodOptions): Promise; - /** - * @description Allows you to get information about hypixel challenges [NO KEY REQUIRED] - * @param {methodOptions} [options] - The method options. - */ - getChallenges(options?: methodOptions): Promise; - /** - * @description Allows you to get player count along with the player count of each public game - * @param {methodOptions} [options] - The method options. - */ - getGameCounts(options?: methodOptions): Promise; - /** - * @description Allows you to get statistics of hypixel guild - * @param {"id"|"name"|"player"} searchParameter - How you want to search - * @param {string} query - guild name, player nickname or guild id - * @param {methodOptions} [options] - The method options. - */ - getGuild(searchParameter: 'id' | 'name' | 'player', query: string, options?: methodOptions): Promise; - /** - * @description Allows you to get information about hypixel guild achievements [NO KEY REQUIRED] - * @param {methodOptions} [options] - The method options. - */ - getGuildAchievements(options?: methodOptions): Promise; - /** - * @description Allows you to get leaderboards of each mini-game - * @param {methodOptions} [options] - The method options. - */ - getLeaderboards(options?: methodOptions): Promise<{ - ARENA: Leaderboard[]; - COPS_AND_CRIMS: Leaderboard[]; - WARLORDS: Leaderboard[]; - BLITZ_SURVIVAL_GAMES: Leaderboard[]; - UHC: Leaderboard[]; - WALLS: Leaderboard[]; - PROTOTYPE: Leaderboard[]; - PAINTBALL: Leaderboard[]; - SKYWARS: Leaderboard[]; - MURDER_MYSTERY: Leaderboard[]; - SMASH_HEROES: Leaderboard[]; - DUELS: Leaderboard[]; - SPEED_UHC: Leaderboard[]; - TNTGAMES: Leaderboard[]; - BEDWARS: Leaderboard[]; - TURBO_KART_RACERS: Leaderboard[]; - BUILD_BATTLE: Leaderboard[]; - ARCADE: Leaderboard[]; - SKYCLASH: Leaderboard[]; - QUAKECRAFT: Leaderboard[]; - CRAZY_WALLS: Leaderboard[]; - MEGA_WALLS: Leaderboard[]; - VAMPIREZ: Leaderboard[]; - }>; - /** - * @description Allows you to get statistics of player - * @param {string} query - player nickname or uuid - * @param {playerMethodOptions} [options] - player search options - */ - getPlayer(query: string, options?: playerMethodOptions): Promise; - /** - * @description Allows you to get information about hypixel quests [NO KEY REQUIRED] - * @param {methodOptions} [options] - Options - */ - getQuests(options?: methodOptions): Promise; - /** - * @description Allows you to get recent games of a player - * @param {string} query - player nickname or uuid - * @param {methodOptions} [options] - Options - */ - getRecentGames(query: string, options?: methodOptions): Promise; - /** - * @description Parses information returned by hypixel upon a status request packet - * @param {number} repeats Amount of times to ping hypixel, preferably between 1 and 10 times. - */ - getServerInfo(repeats?: number): Promise; - /** - * @description Allows you to get player's network status - * @param {string} query - player nickname or uuid - * @param {methodOptions} [options] - Options - */ - getStatus(query: string, options?: methodOptions): Promise; - /** - * @description Allows you to get statistics of watchdog anticheat - * @param {methodOptions} [options] - Options - */ - getWatchdogStats(options?: methodOptions): Promise; - /** - * @description Allows you to get filtered skyblock auctions. Using auction ID will return an array of at most 1 element - * @name Client#getSkyblockAuction - * @param {'PROFILE' | 'PLAYER' | 'AUCTION'} type - Filter to use - * @param {string} query - uuid of profile, player, or auction. IGN can be used as well - * @param {boolean} includeItemBytes - include item bytes (optional) - * @param {methodOptions} [options] - Options - */ - getSkyblockAuction( - type: 'PROFILE' | 'PLAYER' | 'AUCTION', - query: string, - includeItemBytes?: boolean, - options?: methodOptions - ): Promise; - /** - * Allows you to get skyblock auctions - * @param {string|number|number[]} page - "*", a page number, or an array with the start and the end page number ( automatically sorted ) - * @param {auctionsOptions} [options={}] Options - * @return {Promise<{info:AuctionInfo,Auctions:Auction[]}>} - */ - getSkyblockAuctions( - page: string | number | number[], - options?: auctionsOptions - ): Promise<{ info: AuctionInfo; Auctions: Auction[] }>; - /** - * @description Allows you to get all auctions of player - * @param {string} query - player nickname or uuid - * @param {boolean} includeItemBytes - include item bytes (optional) - * @param {methodOptions} [options] - Options - */ - getSkyblockAuctionsByPlayer(query: string, includeItemBytes?: boolean, options?: methodOptions): Promise; - /** - * @description Allows you to get list of products - * @param {methodOptions} [options] - Options - */ - getSkyblockBazaar(options?: methodOptions): Promise; - /** - * @description Gets bingo data - * @param {methodOptions} [options] - Options - */ - getSkyblockBingo(options?: methodOptions): Promise; - /** - * @description Gets bingo data of a player - * @param {string} query - UUID/IGN of player - * @param {methodOptions} [options] - Options - */ - getSkyblockBingoByPlayer(query: string, options?: playerBingoOptions): Promise; - /** - * @description Allows you to get list of active skyblock firesales - * @param {methodOptions} [options] - Options - */ - getSkyblockFireSales(options?: methodOptions): Promise; - /** - * @description Allows you to get a profiles skyblock garden - * @param {methodOptions} [options] - Options - */ - getSkyblockGarden(profileId: string, options?: methodOptions); - /** - * @description Gets data of skyblock government - * @param {methodOptions} [options] - Options - */ - getSkyblockGovernment(options?: methodOptions): Promise; - /** - * @description Allows you to get a player's skyblock member data from all their profiles - * @param query - player nickname or uuid - * @param {methodOptions} [options] - Options - */ - getSkyblockMember(query: string, options?: skyblockMemberOptions): Promise>; - /** - * @description Allows you to get statistics of player - * @param {string} query - player nickname or uuid - * @param {string} profileId - profile id - * @param {methodOptions} [options] - Options - */ - getSkyblockMuseum(query: string, profileId: string, options?: methodOptions); - /** - * @description Allows you to get skyblock news - * @param {methodOptions} [options] - Options - */ - getSkyblockNews(options?: methodOptions): Promise; - /** - * @description Allows you to get a player's skyblock profiles - * @param query - player nickname or uuid - * @param {methodOptions} [options] - Options - */ - getSkyblockProfiles(query: string, options?: skyblockMemberOptions): Promise; - /** - * @description Get a array of active houses - * @param {methodOptions} [options] - Options - */ - getActiveHouses(options?: methodOptions): Promise; - /** - * @description Get a array of houses for a user - * @param query - UUID / IGN of player - * @param {methodOptions} [options] - Options - */ - getPlayerHouses(query: string, options?: methodOptions): Promise; - /** - * @description Get a house - * @param query - house uuid - * @param {methodOptions} [options] - Options - */ - getHouse(query: string, options?: methodOptions): Promise; - /** - * @param amount - Amount of cache entries to delete - * @description Allows you to clear cache - */ - sweepCache(amount?: number): void; - on(event: 'outgoingRequest', listener: (url: string, options: Record) => void): this; - on(event: 'warn', listener: (error: string) => void): this; - /** - * @description Emitted ( only once ) when rate limiter is ready. ( You don't have to wait for this event to emit UNLESS you are planning to do data scraping which means spamming requests ) - */ - once(event: 'ready', listener: () => void): this; - } - class Player { - constructor(data: Record); - nickname: string; - uuid: string; - history: string[]; - rank: PLAYER_RANK; - mcVersion: string; - channel: string; - lastLoginTimestamp: number; - lastLogin?: Date; - lastLogoutTimestamp: number; - lastLogout?: Date; - firstLoginTimestamp: number; - firstLogin: Date; - recentlyPlayedGame: Game; - plusColor?: Color; - prefixColor?: Color; - karma: number; - achievements: Record; - achievementPoints: number; - totalExperience: number; - level: number; - socialMedia: { name: string; link: string; id: SOCIAL_MEDIA_ID }[]; - giftsSent?: number; - giftBundlesSent?: number; - giftBundlesReceived?: number; - levelProgress: LevelProgress; - isOnline: boolean; - userLanguage: string; - lastDailyReward?: Date; - lastDailyRewardTimestamp?: number; - totalRewards?: number; - totalDailyRewards?: number; - rewardStreak?: number; - rewardScore?: number; - rewardHighScore?: number; - claimedLevelingRewards: number[]; - globalCosmetics: PlayerCosmetics; - ranksPurchaseTime: { - VIP: Date | null; - VIP_PLUS: Date | null; - MVP: Date | null; - MVP_PLUS: Date | null; - }; - guild?: Guild; - stats?: { - skywars?: SkyWars; - bedwars?: BedWars; - uhc?: UHC; - speeduhc?: SpeedUHC; - murdermystery?: MurderMystery; - duels?: Duels; - buildbattle?: BuildBattle; - megawalls?: MegaWalls; - copsandcrims?: CopsAndCrims; - tntgames?: TNTGames; - smashheroes?: SmashHeroes; - vampirez?: VampireZ; - blitzsg?: BlitzSurvivalGames; - arena?: ArenaBrawl; - paintball?: Paintball; - quakecraft?: Quakecraft; - turbokartracers?: TurboKartRacers; - walls?: Walls; - warlords?: Warlords; - arcade?: Arcade; - woolgames?: WoolGames; - pit?: Pit; - }; - getRecentGames(): Promise; - recentGames?: RecentGame[]; - toString(): string; - } - class Pit { - static calcLevel(prestige: number, xp: number): number; - constructor(data: Record); - prestige: number; - xp: number; - level: number; - kills: number; - deaths: number; - KDRatio: number; - assists: number; - maxKillStreak: number; - playtime: number; - joins: number; - damageReceived: number; - damageDealt: number; - damageRatio: number; - meleeDamageReceived: number; - meleeDamageDealt: number; - swordHits: number; - leftClicks: number; - meleeAccuracy: number; - meleeDamageRatio: number; - bowDamageReceived: number; - bowDamageDealt: number; - arrowsHit: number; - arrowsFired: number; - bowAccuracy: number; - bowDamageRatio: number; - goldenHeadsEaten: number; - getInventory(): Promise; - getEnterChest(): Promise; - getArmor(): Promise; - } - class PitInventoryItem { - constructor(data: Record); - itemId: number; - count: number; - name: string | null; - lore: string | null; - loreArray: string[] | []; - extraAttributes: string | null; - toString(): string; - } - class WoolWarsClass { - constructor(data: Record); - wins: number; - kills: number; - assists: number; - deaths: number; - KDRatio: number; - gamesPlayed: number; - woolsPlaced: number; - blocksBroken: number; - placeBreakRatio: number; - powerups: number; - } - class WoolWars { - constructor(data: Record); - selectedClass: 'ASSAULT' | 'TANK' | 'GOLEM' | 'SWORDSMAN' | 'ENGINEER' | 'ARCHER' | 'NONE'; - wins: number; - kills: number; - assists: number; - deaths: number; - KDRatio: number; - gamesPlayed: number; - woolsPlaced: number; - blocksBroken: number; - placeBreakRatio: number; - powerups: number; - assault: WoolWarsClass; - tank: WoolWarsClass; - golem: WoolWarsClass; - swordsman: WoolWarsClass; - engineer: WoolWarsClass; - archer: WoolWarsClass; - } - class CaptureTheWool { - constructor(data: Record); - kills: number; - assists: number; - deaths: number; - KDRatio: number; - killsWithWool: number; - deathsWithWool: number; - KDRatioWithWool: number; - woolCaptured: number; - woolStolen: number; - woolCaptureStolenRatio: number; - } - class SheepWars { - constructor(data: Record); - wins: number; - kills: number; - killsVoid: number; - killsBow: number; - killsExplosive: number; - deaths: number; - deathsVoid: number; - deathsMelee: number; - deathsExplosive: number; - KDRatio: number; - losses: number; - WLRatio: number; - gamesPlayed: number; - damageDealt: number; - sheepThrown: number; - magicWoolHit: number; - } - type PrivateGamesConfig = { - one_hit_one_kill: boolean; - rainbow_wool: 'Enabled' | 'Disabled'; - health_buff: string; - game_speed: string; - speed: string; - no_class: 'Enabled' | 'Disabled'; - respawn_enable: boolean; - }; - class WoolGames { - constructor(data: Record); - layers: number; - xp: number; - exactLevel: number; - level: number; - coins: number; - ownedCosmetics: string[]; - privateGamesConfig: PrivateGamesConfig; - playtime: number; - woolWars: WoolWars; - captureTheWool: CaptureTheWool; - sheepWars: SheepWars; - } - class PlayerCosmetics { - constructor(data: Record); - allCosmetics: string[]; - petManager: Pets | null; - get suits(): string[]; - get hats(): string[]; - get gadgets(): string[]; - get morphs(): string[]; - get cloaks(): string[]; - get taunts(): string[]; - get rankColors(): string[]; - get clickEffects(): string[]; - } - class Pets { - constructor(pets: string[], data: Record); - pets: Pet[]; - lastJourneyTimestamp: number | null; - lastJourneyAt: Date | null; - petConsumables: PetConsumables; - } - class Pet { - constructor(name: string, data: Record); - isFavorite: boolean; - name: string; - active: boolean; - stats?: { - hunger: number | null; - lastFed: number | null; - lastFedAt: Date | null; - thirst: number | null; - lastDrank: number | null; - lastDrankAt: Date | null; - exercise: number | null; - lastExercised: number | null; - lastExercisedAt: Date | null; - }; - rawNickname: string | null; - nickname: string | null; - experience: number; - } - class PetConsumables { - BAKED_POTATO: number; - COOKIE: number; - FEATHER: number; - HAY_BLOCK: number; - SLIME_BALL: number; - COOKED_BEEF: number; - RED_ROSE: number; - WATER_BUCKET: number; - MELON: number; - STICK: number; - WOOD_SWORD: number; - MILK_BUCKET: number; - GOLD_RECORD: number; - LEASH: number; - LAVA_BUCKET: number; - BONE: number; - MAGMA_CREAM: number; - WHEAT: number; - MUSHROOM_SOUP: number; - BREAD: number; - PUMPKIN_PIE: number; - APPLE: number; - CARROT_ITEM: number; - RAW_FISH: number; - PORK: number; - CAKE: number; - ROTTEN_FLESH: number; - } - class Leaderboard { - constructor(data: Record); - name: string; - title: string; - playerCount: number; - leaders: string[]; - } - /** - * @description Typings might be different. Hypixel: Due to the large amount of modes and that they can change at anytime we don't currently have a friendly list of mode keys to clean names. This may be added at a later date. - */ - class GameCounts { - constructor(data: Record); - playerCount: number; - mainLobby: { players: number }; - tournamentLobby: { players: number }; - megaWalls: { - players: number; - modes: { standard: number; faceOff: number }; - }; - classicGames: { - players: number; - modes: { - paintball: number; - walls: number; - quakecraft: number; - gingerbread: number; - arena: number; - vampirez: number; - }; - }; - thePit: { players: number; modes: { pit: number } }; - blitzSurvivalGames: { - players: number; - modes: { soloNormal: number; teamsNormal: number }; - }; - duels: { - players: number; - modes: { - duelsBowspleefDuel: number; - duelsBowDuel: number; - duelsBridge_2v2v2v2: number; - duelsMwDuel: number; - duelsUhcFour: number; - duelsUhcMeetup: number; - duelsBridgeDoubles: number; - duelsSwDoubles: number; - duelsUhcDoubles: number; - duelsBridgeFour: number; - duelsBridge_3v3v3v3: number; - duelsSumoDuel: number; - duelsUhcDuel: number; - duelsOpDoubles: number; - duelsOpDuel: number; - duelsMwDoubles: number; - duelsBlitzDuel: number; - duelsPotionDuel: number; - duelsClassicDuel: number; - duelsComboDuel: number; - duelsBridgeDuel: number; - duelsSwDuel: number; - }; - }; - uhcChampions: { players: number; modes: { teams: number; solo: number } }; - speedUhc: { players: number; modes: { soloNormal: number } }; - theTntGames: { - players: number; - modes: { - pvprun: number; - tntag: number; - tntrun: number; - bowspleef: number; - capture: number; - }; - }; - prototype: { - players: number; - modes: { towerwarsSolo: number; towerwarsTeamOfTwo: number }; - }; - smashHeroes: { - players: number; - modes: { - '1v1Normal': number; - friendsNormal: number; - soloNormal: number; - '2v2Normal': number; - teamsNormal: number; - }; - }; - bedwars: { - players: number; - modes: { - bedwarsTwoFour: number; - bedwarsFourFourRush: number; - bedwarsEightOne: number; - bedwarsEightTwoRush: number; - bedwarsEightTwoVoidless: number; - bedwarsEightTwoArmed: number; - bedwarsEightTwo: number; - bedwarsFourFour: number; - bedwarsEightTwoLucky: number; - bedwarsFourThree: number; - bedwarsFourFourVoidless: number; - bedwarsFourFourLucky: number; - bedwarsEightTwoUltimate: number; - }; - }; - buildBattle: { - players: number; - modes: { - buildBattleSoloNormalLatest: number; - buildBattleGuessTheBuild: number; - buildBattleTeamsNormal: number; - buildBattleSoloPro: number; - buildBattleSoloNormal: number; - }; - }; - housing: { players: number }; - skywars: { - players: number; - modes: { - soloInsaneLucky: number; - soloInsaneSlime: number; - teamsInsaneSlime: number; - teamsInsaneRush: number; - teamsInsane: number; - soloNormal: number; - soloInsaneHuntersVsBeasts: number; - soloInsaneTntMadness: number; - soloInsaneRush: number; - soloInsane: number; - teamsNormal: number; - megaNormal: number; - }; - }; - replay: { players: number; modes: { base: number } }; - skyblock: { - players: number; - modes: { - dungeonHub: number; - mining_2: number; - farming_2: number; - farming_1: number; - mining_3: number; - combat_3: number; - dynamic: number; - combat_1: number; - foraging_1: number; - hub: number; - dungeon: number; - combat_2: number; - mining_1: number; - }; - }; - copsAndCrims: { - players: number; - modes: { normal: number; deathmatch: number }; - }; - murderMystery: { - players: number; - modes: { - murderDoubleUp: number; - murderInfection: number; - murderAssassins: number; - murderClassic: number; - }; - }; - arcade: { - players: number; - modes: { - party: number; - holeInTheWall: number; - defender: number; - miniWalls: number; - simonSays: number; - zombiesBadBlood: number; - hideAndSeekPartyPooper: number; - dayone: number; - drawTheirThing: number; - zombiesAlienArcadium: number; - oneinthequiver: number; - soccer: number; - pvpCtw: number; - ender: number; - throwOut: number; - starwars: number; - dragonwars2: number; - zombiesDeadEnd: number; - farmHunt: number; - hideAndSeekPropHunt: number; - }; - }; - warlords: { - players: number; - modes: { ctfMini: number; domination: number; teamDeathmatch: number }; - }; - limbo: { players: number }; - idle: { players: number }; - queue: { players: number }; - } - class Arcade { - constructor(data?: Record); - lastTourneyAdTimestamp: number; - lastTourneyAdAt: Date; - coins: number; - weeklyCoins: number; - monthlyCoins: number; - hintsDisabled: boolean; - flashDisabled: boolean; - blockingDead: BlockingDead; - bountyHunters: BountyHunters; - dragonWars: DragonWars; - dropper: Dropper; - enderSpleef: EnderSpleef; - farmHunt: FarmHunt; - football: Football; - galaxyWars: GalaxyWars; - hideAndSeek: HideAndSeek; - holeInTheWall: HoleInTheWall; - hypixelSays: HypixelSays; - miniWalls: MiniWalls; - pixelParty: PixelParty; - zombies: Zombies; - } - class BlockingDead { - constructor(data: Record); - wins: number; - kills: number; - headshots: number; - } - class BountyHunters { - constructor(data: Record); - wins: number; - kills: number; - deaths: number; - KDRatio: number; - bountyKills: number; - bowKills: number; - swordKills: number; - } - class DragonWars { - constructor(data: Record); - wins: number; - kills: number; - } - class DropperMap { - constructor(data: Record, mapName: string); - bestTime: number; - completions: number; - } - class Dropper { - constructor(data: Record); - wins: number; - fails: number; - fastestGame: number; - flawlessGames: number; - gamesPlayed: number; - mapsCompleted: number; - gamesFinished: number; - maps: Record; - } - class EnderSpleef { - constructor(data: Record); - wins: number; - kills: number; - trail: string; - blocksDestroyed: number; - bigShotActivations: number; - tripleShotActivations: number; - totalPowerUpActivations: number; - } - class FarmHunt { - constructor(data: Record); - wins: number; - winsAsAnimal: number; - winsAsHunter: number; - kills: number; - killsAsAnimal: number; - killsAsHunter: number; - tauntsUsed: number; - riskyTauntsUsed: number; - safeTauntsUsed: number; - dangerousTauntsUsed: number; - fireworkTauntsUsed: number; - poop: number; - } - class Football { - constructor(data: Record); - wins: number; - kicks: number; - powerKicks: number; - goals: number; - } - class GalaxyWars { - constructor(data: Record); - wins: number; - kills: number; - deaths: number; - shotsFired: number; - weeklyKills: number; - monthlyKills: number; - attackerKills: number; - defenderKills: number; - } - class PartyPooper { - constructor(data: Record); - winsAsSeeker: number; - winsAsHider: number; - wins: number; - } - class PropHunt { - constructor(data: Record); - winsAsSeeker: number; - winsAsHider: number; - wins: number; - } - class HideAndSeek { - constructor(data: Record); - partyPooper: PartyPooper; - propHunt: PropHunt; - winsAsSeeker: number; - winsAsHider: number; - } - class HoleInTheWall { - constructor(data: Record); - wins: number; - rounds: number; - scoreRecordFinals: number; - scoreRecordNormal: number; - scoreRecordOverall: number; - } - class HypixelSays { - constructor(data: Record); - wins: number; - rounds: number; - roundWins: number; - topScore: number; - } - class MiniWalls { - constructor(data: Record); - kit: string; - wins: number; - kills: number; - deaths: number; - KDRatio: number; - finalKills: number; - witherKills: number; - witherDamage: number; - arrowsShot: number; - arrowsHit: number; - bowAccuracy: number; - } - class PixelPartyGameMode { - constructor(data: Record, modeName: string); - wins: number; - gamesPlayed: number; - losses: number; - WLRatio: number; - roundsPlayed: number; - powerUpsCollected: number; - } - class PixelParty { - constructor(data: Record); - wins: number; - gamesPlayed: number; - losses: number; - WLRatio: number; - roundsPlayed: number; - powerUpsCollected: number; - normal: PixelPartyGameMode; - hyper: PixelPartyGameMode; - highestRound: number; - musicVolume: number; - colorBlind: object; - } - class ThrowOut { - constructor(data: Record); - wins: number; - kills: number; - deaths: number; - KDRatio: number; - } - class Zombies { - constructor(data: Record); - overall: ZombiesStats; - deadEnd: ZombiesStats; - badBlood: ZombiesStats; - alienArcadium: ZombiesStats; - prison: ZombiesStats; - killsByZombie: Record; - bulletsHit: number; - bulletsShot: number; - gunAccuracy: number; - headshots: number; - headshotAccuracy: number; - } - class ZombiesStats { - constructor(data: Record, type?: string); - bestRound: number; - deaths: number; - doorsOpened: number; - fastestRound10: number; - fastestRound20: number; - fastestRound30: number; - playersRevived: number; - timesKnockedDown: number; - roundsSurvived: number; - windowsRepaired: number; - wins: number; - zombieKills: number; - } - - class ArenaBrawlMode { - constructor(data: Record); - damage: number; - kills: number; - deaths: number; - KDRatio: number; - healed: number; - wins: number; - losses: number; - WLRatio: number; - games: number; - winstreak: number; - } - class ArenaBrawl { - constructor(data: Record); - coins: number; - coinsSpent: number; - wins: number; - keys: number; - chests: number; - rune: string; - '1v1': ArenaBrawlMode; - '2v2': ArenaBrawlMode; - '4v4': ArenaBrawlMode; - } - class Paintball { - constructor(data: Record); - coins: number; - kills: number; - deaths: number; - KDRatio: number; - wins: number; - shotsFired: number; - killstreaks: number; - forceFieldTime: number; - hat: string; - adrenaline: number; - endurance: number; - fortune: number; - godfather: number; - superluck: number; - transfusion: number; - } - class QuakecraftMode { - constructor(data: Record); - wins: number; - kills: number; - deaths: number; - KDRatio: number; - killstreaks: number; - distanceTravelled: number; - shotsFired: number; - headshots: number; - } - class Quakecraft { - constructor(data: Record); - coins: number; - solo: QuakecraftMode; - teams: QuakecraftMode; - wins: number; - kills: number; - deaths: number; - KDRatio: number; - killstreaks: number; - distanceTravelled: number; - shotsFired: number; - headshots: number; - instantRespawn: boolean; - killPrefixColor: string; - showPrefix: boolean; - killSound: string; - barrel: string; - case: string; - muzzle: string; - sight: string; - trigger: string; - } - class TurboKartRacersMap { - constructor(data: Record, mapName: string); - map: string; - plays: number; - boxPickups: number; - bronzeTrophies: number; - silverTrophies: number; - goldTrophies: number; - } - class TurboKartRacers { - constructor(data: Record); - coins: number; - wins: number; - completedLaps: number; - bronzeTrophies: number; - silverTrophies: number; - goldTrophies: number; - boxPickups: number; - horn: - | 'DEFAULT' - | 'SHY' - | 'ALIEN' - | 'TAXI' - | 'KLAXON' - | 'TRICYCLE' - | 'ALARM' - | 'KLOON' - | 'TEDDY' - | 'TRUCK' - | 'JERRY'; - retro: TurboKartRacersMap; - hypixelgp: TurboKartRacersMap; - olympus: TurboKartRacersMap; - junglerush: TurboKartRacersMap; - canyon: TurboKartRacersMap; - bananaHitsReceived: number; - bananaHitsSent: number; - blueTorpedoHit: number; - grandPrix: boolean; - grandPrixTokens: number; - } - class Walls { - constructor(data: Record); - coins: number; - kills: number; - deaths: number; - KDRatio: number; - wins: number; - losses: number; - WLRatio: number; - assists: number; - } - class WarlordsClass { - constructor(data: Record, className: string); - wins: number; - losses: number; - WLRatio: number; - gamesPlayed: number; - damage: number; - heal: number; - damagePrevented: number; - } - class Warlords { - constructor(data: Record); - coins: number; - kills: number; - deaths: number; - KDRatio: number; - wins: number; - losses: number; - WLRatio: number; - winstreak: number; - assists: number; - class: string; - pyromancer: WarlordsClass; - mage: WarlordsClass; - thunderlord: WarlordsClass; - shaman: WarlordsClass; - earthwarden: WarlordsClass; - aquamancer: WarlordsClass; - paladin: WarlordsClass; - avenger: WarlordsClass; - warrior: WarlordsClass; - defender: WarlordsClass; - cryomancer: WarlordsClass; - crusader: WarlordsClass; - berserker: WarlordsClass; - protector: WarlordsClass; - revenant: WarlordsClass; - spiritguard: WarlordsClass; - } - class BlitzSGKit { - constructor(data: Record, kitName: string); - level: number; - exp: number; - kills: number; - deaths: number; - KDRatio: number; - wins: number; - gamesPlayed: number; - losses: number; - WLRatio: number; - arrowsShot: number; - arrowsHit: number; - bowAccuracy: number; - damage: number; - damageTaken: number; - potionsDrunk: number; - potionsThrown: number; - playTime: number; - mobsSpawned: number; - chestsOpened: number; - } - class BlitzSurvivalGames { - constructor(data: Record); - coins: number; - kills: number; - kit: string; - killsSolo: number; - killsTeams: number; - deaths: number; - KDRatio: number; - wins: number; - winsSolo: number; - winsTeam: number; - gamesPlayed: number; - losses: number; - WLRatio: number; - arrowsShot: number; - arrowsHit: number; - bowAccuracy: number; - damage: number; - damageTaken: number; - potionsDrunk: number; - potionsThrown: number; - mobsSpawned: number; - playTime: number; - blitzUses: number; - chestsOpened: number; - archer: BlitzSGKit; - meatmaster: BlitzSGKit; - speleologist: BlitzSGKit; - baker: BlitzSGKit; - knight: BlitzSGKit; - guardian: BlitzSGKit; - scout: BlitzSGKit; - hunter: BlitzSGKit; - hypeTrain: BlitzSGKit; - fisherman: BlitzSGKit; - armorer: BlitzSGKit; - horsetamer: BlitzSGKit; - astronaut: BlitzSGKit; - troll: BlitzSGKit; - reaper: BlitzSGKit; - shark: BlitzSGKit; - reddragon: BlitzSGKit; - toxicologist: BlitzSGKit; - rogue: BlitzSGKit; - warlock: BlitzSGKit; - slimeyslime: BlitzSGKit; - jockey: BlitzSGKit; - golem: BlitzSGKit; - viking: BlitzSGKit; - shadowKnight: BlitzSGKit; - pigman: BlitzSGKit; - paladin: BlitzSGKit; - necromancer: BlitzSGKit; - florist: BlitzSGKit; - diver: BlitzSGKit; - arachnologist: BlitzSGKit; - blaze: BlitzSGKit; - wolftamer: BlitzSGKit; - tim: BlitzSGKit; - farmer: BlitzSGKit; - creepertamer: BlitzSGKit; - snowman: BlitzSGKit; - } - class VampireZRole { - constructor(data: Record, role: string); - kills: number; - deaths: number; - KDRatio: number; - wins: number; - } - class VampireZ { - constructor(data: Record); - coins: number; - goldBought: number; - blood: boolean; - zombieKills: number; - human: VampireZRole; - vampire: VampireZRole; - kills: number; - deaths: number; - KDRatio: number; - wins: number; - } - class SmashHeroesMode { - constructor(data: Record, mode: string); - kills: number; - deaths: number; - KDRatio: number; - wins: number; - losses: number; - WLRatio: number; - } - class SmashHeoresHero { - constructor(data: Record, hero: string); - name: string; - level: number; - xp: number; - prestige: number; - playedGames: number; - kills: number; - deaths: number; - KDRatio: number; - wins: number; - losses: number; - WLRatio: number; - } - class SmashHeroes { - constructor(data: Record); - coins: number; - level: number; - winstreak: number; - playedGames: number; - kills: number; - deaths: number; - KDRatio: number; - wins: number; - losses: number; - WLRatio: number; - smashed: number; - '1v1v1v1': SmashHeroesMode; - '2v2': SmashHeroesMode; - '2v2v2': SmashHeroesMode; - activeClass: string; - theBulk: SmashHeoresHero; - cakeMonster: SmashHeoresHero; - generalCluck: SmashHeoresHero; - botmun: SmashHeoresHero; - marauder: SmashHeoresHero; - pug: SmashHeoresHero; - tinman: SmashHeoresHero; - spoderman: SmashHeoresHero; - frosty: SmashHeoresHero; - sergeantShield: SmashHeoresHero; - skullfire: SmashHeoresHero; - goku: SmashHeoresHero; - sanic: SmashHeoresHero; - duskCrawler: SmashHeoresHero; - shoopDaWhoop: SmashHeoresHero; - greenHood: SmashHeoresHero; - } - class SkyblockNews { - constructor(data: Record); - title: string; - link: string; - rawDate: string; - date: Date; - version: string | null; - } - class TNTGames { - constructor(data: Record); - coins: number; - winstreak: number; - wins: number; - tntrun: { - wins: number; - deaths: number; - record: number; - }; - pvprun: { - kills: number; - wins: number; - deaths: number; - KDRatio: number; - record: number; - }; - tnttag: { - kills: number; - wins: number; - speed: number; - }; - bowspleef: { - wins: number; - tags: number; - deaths: number; - }; - wizards: { - points: number; - class: string; - kills: number; - assists: number; - wins: number; - deaths: number; - KDRatio: number; - }; - } - class Status { - constructor(data: Record); - online: boolean; - game?: Game; - mode?: string; - map?: string; - } - class Guild { - constructor(data: Record); - id: string; - name: string; - description: string; - experience: number; - level: number; - createdAtTimestamp: number; - createdAt: Date; - joinable: boolean; - publiclyListed: boolean; - tag: string; - tagColor: Color; - legacyRank: number; - expHistory: { day: string; date: Date; exp: number; totalExp: number }[]; - achievements: { - winners: number; - experienceKings: number; - onlinePlayers: number; - }; - me?: GuildMember; - chatMuteUntilTimestamp: number; - chatMuteUntil: Date; - banner: { Base: string; Patterns: [{ Pattern: string; Color: string }] }; - preferredGames: Game[]; - members: GuildMember[]; - ranks: GuildRank[]; - totalWeeklyGexp: number; - get guildMaster(): GuildMember; - getRanksByNewest(): GuildRank[]; - getRankByPriority(priority: number): GuildRank; - getMemberUUIDMap(): Map; - toString(): string; - } - class BaseAuction { - constructor(data: Record); - auctionId: string; - auctioneerUuid: string; - auctioneerProfile: string; - bin: boolean; - itemBytes: ItemBytes | null; - } - class Auction extends BaseAuction { - constructor(data: Record); - coop: string[] | []; - auctionStartTimestamp: number; - auctionEndTimestamp: number; - auctionStart: Date; - auctionEnd: Date; - item: string; - itemLore: string; - itemLoreRaw: string; - rarity: string; - startingBid: number; - highestBid: number; - bids: Bid[]; - claimed: boolean; - claimedBidders: string[]; - } - class PartialAuction extends BaseAuction { - constructor(data: Record); - buyer: string; - price: number; - } - class AuctionInfo { - constructor(data: Record); - age: number; - lastUpdatedAt: Date; - lastUpdated: number; - totalPages: number; - page: number; - totalAuctions: number; - failedPages: number[]; - } - class Bid { - constructor(data: Record); - auctionId: string; - profileId: string; - amount: number; - timestamp: number; - at: Date; - bidder: string; - } - class Product { - constructor(data: Record); - productId: string; - sellSummary: Order[]; - buySummary: Order[]; - status: { - sellPrice: number; - buyPrice: number; - sellVolume: number; - buyVolume: number; - sellMovingWeek: number; - buyMovingWeek: number; - sellOrders: number; - buyOrders: number; - }; - } - class Order { - constructor(data: Record); - amount: number; - pricePerUnit: number; - totalPrice: number; - orders: number; - } - class BingoData { - constructor(data: Record); - lastUpdatedTimestamp: number; - lastUpdatedAt: Date | null; - id: number | null; - goals: Bingo[] | null; - getGoal(column: number, row: number): Bingo | undefined; - } - class PlayerBingo { - constructor(data: Record, bingoData: BingoData | null); - dataPerEvent: PlayerBingoDataPerEvent[]; - } - type PlayerBingoDataPerEvent = { - eventId: number; - points: number; - enrichedGoals: boolean; - goalsCompleted: SpecialBingoArray | string[]; - }; - type SpecialBingoArray = Bingo[] & { - unachievedGoals: Bingo[]; - }; - class GovernmentData { - constructor(data: Record); - lastUpdatedTimestamp: number; - lastUpdatedAt: Date | null; - lastElectionResults: Map; - mayor: Candidate; - runningYear: number; - currentElectionResults: Map | null; - currentElectionFor: number | null; - } - class Perk { - name: string; - description: string; - } - class Candidate { - constructor(data: Record, isMayor?: boolean | undefined, isMinister?: boolean | undefined); - name: string; - keyBenefit: string; - perk: Perk | null; - perks: Perk[]; - isMayor: boolean; - isMinister: boolean; - votesReceived: number; - toString(): string; - } - class FireSale { - constructor(data: Record); - itemId: string; - startTimestamp: number; - startAt: Date; - endTimestamp: number; - endAt: Date; - amount: number; - price: number; - toString(): string; - } - class WatchdogStats { - constructor(data: Record); - byWatchdogTotal: number; - byWatchdogLastMinute: number; - byWatchdogRollingDay: number; - byStaffTotal: number; - byStaffRollingDay: number; - } - class GuildMember { - constructor(data: Record); - uuid: string; - joinedAtTimestamp: number; - joinedAt: Date; - questParticipation: number; - rank: string; - weeklyExperience: number; - mutedUntilTimestamp: number; - mutedUntil: Date; - expHistory: { day: string; date: Date; exp: number; totalExp: number }[]; - } - class GuildRank { - constructor(data: Record); - name: string; - default: boolean; - tag: string | null; - createdAtTimestamp: number; - createdAt: Date; - priority: number; - } - class Booster { - constructor(data: Record); - purchaser: string; - amount: number; - originalLength: number; - remaining: number; - activatedTimestamp: number; - activated: Date; - game?: Game; - isActive: boolean; - type: 'QUEUED' | 'STACKED' | 'ACTIVE'; - stackers: string[]; - expired: boolean; - } - class SkyblockProfile { - constructor(data: Record); - profileId: string; - profileName: string; - members: SkyblockMember[]; - me: SkyblockMember; - selected: boolean; - garden?: SkyblockGarden; - } - class SkyblockPet { - constructor(data: Record); - uuid: string; - type: string; - xp: number; - active: boolean; - rarity: SkyblockRarity; - petScore: number; - heldItem: string | null; - candyUsed: number; - skin: string | null; - } - class SkyblockMuseumItem { - constructor(data: Record); - name: string | null; - items: SkyblockInventoryItem[]; - donatedTime: number; - donatedTimeAt: Date; - borrowing: boolean; - featuredSlot: string | null; - } - class SkyblockMuseum { - constructor(data: Record); - raw: object; - getWardrobe(): Promise; - getWardrobe(): Promise; - } - class SkyblockGarden { - constructor(data: Record); - level: SKYBLOCK_SKILL_DATA; - barnSkin: string; - unlockedPlots: string[]; - visitors: SKYBLOCK_GARDEN_VISITOR; - cropMilestones: { - wheat: SKYBLOCK_SKILL_DATA; - carrot: SKYBLOCK_SKILL_DATA; - sugarCane: SKYBLOCK_SKILL_DATA; - potato: SKYBLOCK_SKILL_DATA; - pumpkin: SKYBLOCK_SKILL_DATA; - melon: SKYBLOCK_SKILL_DATA; - cactus: SKYBLOCK_SKILL_DATA; - cocoaBeans: SKYBLOCK_SKILL_DATA; - mushroom: SKYBLOCK_SKILL_DATA; - netherWart: SKYBLOCK_SKILL_DATA; - }; - composter: SKYBLOCK_GARDEN_COMPOSTER; - cropUpgrades: SKYBLOCK_GARDEN_CROPS; - } - class SkyblockMember { - constructor(data: Record); - uuid: string; - player: Player | null; - museum: SkyblockMuseum | null; - garden: SkyblockGarden | null; - gameMode: string | null; - selected: boolean; - profileName: string; - profileId: string; - firstJoinTimestamp: number; - firstJoinAt: Date; - experience: number; - level: number; - hotm: { - experience: SKYBLOCK_SKILL_DATA; - ability: string; - powder: { - mithril: { - spent: number; - current: number; - total: number; - }; - gemstone: { - spent: number; - current: number; - total: number; - }; - glacite: { - spent: number; - current: number; - total: number; - }; - }; - }; - highestMagicalPower: number; - fairySouls: number; - fairyExchanges: number; - skills: { - combat: SKYBLOCK_SKILL_DATA; - farming: SKYBLOCK_SKILL_DATA; - fishing: SKYBLOCK_SKILL_DATA; - mining: SKYBLOCK_SKILL_DATA; - foraging: SKYBLOCK_SKILL_DATA; - enchanting: SKYBLOCK_SKILL_DATA; - alchemy: SKYBLOCK_SKILL_DATA; - carpentry: SKYBLOCK_SKILL_DATA; - runecrafting: SKYBLOCK_SKILL_DATA; - taming: SKYBLOCK_SKILL_DATA; - social: SKYBLOCK_SKILL_DATA; - average: number; - }; - bestiary: number; - slayer: { - zombie: SKYBLOCK_SLAYER_DATA; - spider: SKYBLOCK_SLAYER_DATA; - wolf: SKYBLOCK_SLAYER_DATA; - enderman: SKYBLOCK_SLAYER_DATA; - blaze: SKYBLOCK_SLAYER_DATA; - vampire: SKYBLOCK_SLAYER_DATA; - } | null; - crimson: { - faction: 'mages' | 'barbarians' | null; - repuation: { - barbarians: number; - mages: number; - }; - trophyFish: { - rank: 'Diamond' | 'Gold' | 'Silver' | 'Bronze' | null; - caught: { - total: number; - bronze: number; - silver: number; - gold: number; - diamond: number; - }; - }; - kuudra: { - none: number; - hot: number; - burning: number; - fiery: number; - highestWaveHot: number; - highestWaveFiery: number; - infernal: number; - highestWaveInfernal: number; - highestWaveBurning: number; - }; - }; - dungeons: { - experience: SKYBLOCK_SKILL_DATA; - secrets: number; - completions: { - catacombs: Record; - masterCatacombs: Record; - }; - floors: { - entrance: SKYBLOCK_DUNGEONS_FLOOR; - floor1: SKYBLOCK_DUNGEONS_FLOOR; - floor2: SKYBLOCK_DUNGEONS_FLOOR; - floor3: SKYBLOCK_DUNGEONS_FLOOR; - floor4: SKYBLOCK_DUNGEONS_FLOOR; - floor5: SKYBLOCK_DUNGEONS_FLOOR; - floor6: SKYBLOCK_DUNGEONS_FLOOR; - floor7: SKYBLOCK_DUNGEONS_FLOOR; - masterCatacombs1: SKYBLOCK_DUNGEONS_FLOOR; - masterCatacombs2: SKYBLOCK_DUNGEONS_FLOOR; - masterCatacombs3: SKYBLOCK_DUNGEONS_FLOOR; - masterCatacombs4: SKYBLOCK_DUNGEONS_FLOOR; - masterCatacombs5: SKYBLOCK_DUNGEONS_FLOOR; - masterCatacombs6: SKYBLOCK_DUNGEONS_FLOOR; - masterCatacombs7: SKYBLOCK_DUNGEONS_FLOOR; - }; - classes: { - healer: SKYBLOCK_SKILL_DATA; - mage: SKYBLOCK_SKILL_DATA; - berserk: SKYBLOCK_SKILL_DATA; - archer: SKYBLOCK_SKILL_DATA; - tank: SKYBLOCK_SKILL_DATA; - selected: string; - }; - essence: { - diamond: number; - dragon: number; - spider: number; - wither: number; - undead: number; - gold: number; - ice: number; - crimson: number; - }; - } | null; - collections: object; - purse: number; - stats: object; - pets: SkyblockPet[]; - jacob: { - medals: { - bronze: number; - silver: number; - gold: number; - }; - perks: { - doubleDrops: number; - farmingLevelCap: number; - personalBests: boolean; - }; - contests: object; - }; - chocolate: { - employees: { - bro: number; - cousin: number; - sis: number; - father: number; - grandma: number; - dog: number; - uncle: number; - }; - chocolate: { - current: number; - total: number; - sincePrestige: number; - }; - timeTower: { - charges: number; - level: number; - }; - upgrades: { - click: number; - multiplier: number; - rabbitRarity: number; - }; - goldenClick: { - amount: number; - year: number; - }; - barnCapacity: number; - prestige: number; - }; - getArmor(): Promise<{ - helmet: SkyblockInventoryItem; - chestplate: SkyblockInventoryItem; - leggings: SkyblockInventoryItem; - boots: SkyblockInventoryItem; - }>; - getWardrobe(): Promise; - getEnderChest(): Promise; - getInventory(): Promise; - getPetScore(): number; - getEquipment(): Promise<{ - gauntlet: SkyblockInventoryItem; - belt: SkyblockInventoryItem; - cloak: SkyblockInventoryItem; - necklace: SkyblockInventoryItem; - }>; - getPersonalVault(): Promise; - getNetworth(): Promise; - } - class Color { - constructor(color: string); - toCode(): string; - toHex(): string; - toString(): string; - toInGameCode(): string; - } - class SkyblockInventoryItem { - constructor(data: Record); - itemId: number; - count: number; - name: string; - lore: string; - loreArray: string[]; - loreForEmbed: string; - color: string | null; - enchantments: Record; - reforge: string; - gemstones?: { - type?: string; - quality?: string; - }[]; - damage: number; - rarity: string; - dungeonStars: number; - gearScore: number; - uuid: string; - soulbound: boolean; - artOfWar: number; - rune: object; - hotPotatoBooks: number; - recombobulated: boolean; - attributes: object; - hecatomb: number; - champion: number; - cultivating: number; - expertise: number; - compact: number; - blocksWalked: number; - toString(): string; - } - class Game { - constructor(game: string | number); - toString(): GAME_NAME; - code: GAME_CODE; - id: GAME_ID; - name: GAME_NAME; - found: boolean; - private game: GAME_CODE | GAME_ID | GAME_NAME; - static IDS: GAME_ID[]; - static CODES: GAME_CODE[]; - static NAMES: GAME_NAME[]; - } - class SkyWarsMode { - constructor(data: Record, gamemode: string); - kills: number; - deaths: number; - KDRatio: number; - wins: number; - losses: number; - WLRatio: number; - } - class SkywarsModeStats { - constructor(data: Record, gamemode: string); - activeKit: string; - killstreak: number; - kills: number; - voidKills: number; - meleeKills: number; - bowKills: number; - mobKills: number; - assists: number; - deaths: number; - KDRatio: number; - wins: number; - losses: number; - WLRatio: number; - gamesPlayed: number; - survivedPlayers: number; - chestsOpened: number; - timePlayed: number; - shard: number; - longestBowShot: number; - arrowsShot: number; - arrowsHit: number; - bowAccuracy: number; - fastestWin: number; - heads: number; - } - class SkywarsMode { - constructor(data: Record, gamemode: string); - kills: number; - deaths: number; - KDRatio: number; - wins: number; - losses: number; - WLRatio: number; - } - class SkyWars { - constructor(data: Record); - coins: number; - souls: number; - tokens: number; - experience: number; - level: number; - levelProgress: LevelProgress; - levelFormatted: string; - prestige: SKYWARS_PRESTIGE; - prestigeIcon: SKYWARS_PRESTIGE_ICON; - opals: number; - avarice: number; - tenacity: number; - shards: number; - angelOfDeathLevel: number; - killstreak: number; - kills: number; - voidKills: number; - meleeKills: number; - bowKills: number; - mobKills: number; - assists: number; - deaths: number; - KDRatio: number; - wins: number; - losses: number; - WLRatio: number; - gamesPlayed: number; - survivedPlayers: number; - chestsOpened: number; - timePlayed: number; - shard: number; - longestBowShot: number; - arrowsShot: number; - arrowsHit: number; - bowAccuracy: number; - fastestWin: number; - heads: number; - blocksPlaced: number; - blocksBroken: number; - eggThrown: number; - enderpearlsThrown: number; - solo: SkywarsModeStats; - soloNormal: SkywarsMode; - soloInsane: SkywarsMode; - team: SkywarsModeStats; - teamNormal: SkywarsMode; - mega: SkywarsMode; - megaDoubles: SkywarsMode; - lab: SkywarsMode; - packages: SkywarsPackages; - } - class SkywarsPackages { - constructor(data: string[]); - rawPackages: string[]; - cages: string[]; - kits: SkywarsKits; - } - class SkywarsKits { - constructor(kits: Record); - kits: SkywarsKit[]; - get(gameMode: SKYWARS_KIT_GAMEMODE, type: SKYWARS_KIT_TYPE): SkywarsKit[]; - } - class SkywarsKit { - constructor(kit: string); - private _kitData: string[] | null; - isKit: boolean; - gameMode?: SKYWARS_KIT_GAMEMODE; - kitType?: SKYWARS_KIT_TYPE; - kitName?: string; - } - class CopsAndCrims { - constructor(data: Record); - coins: number; - kills: number; - deaths: number; - KDRatio: number; - wins: number; - roundWins: number; - shotsFired: number; - headshotKills: number; - bombsDefused: number; - bombsPlanted: number; - killsAsCrim: number; - killsAsCop: number; - deathmatch: { - kills: number; - deaths: number; - KDRatio: number; - killsAsCrim: number; - killsAsCop: number; - }; - } - class BedWars { - constructor(data: Record); - tokens: number; - level: number; - experience: number; - prestige: BEDWARS_PRESTIGE; - playedGames: number; - wins: number; - winstreak: number; - kills: number; - finalKills: number; - losses: number; - deaths: number; - finalDeaths: number; - collectedItemsTotal: { - iron: number; - gold: number; - diamond: number; - emerald: number; - }; - beds: { - lost: number; - broken: number; - BLRatio: number; - }; - avg: { - finalKills: number; - kills: number; - bedsBroken: number; - }; - KDRatio: number; - finalKDRatio: number; - WLRatio: number; - solo: { - winstreak: number; - playedGames: number; - kills: number; - deaths: number; - wins: number; - losses: number; - finalKills: number; - finalDeaths: number; - beds: { - broken: number; - lost: number; - BLRatio: number; - }; - avg: { - kills: number; - finalKills: number; - bedsBroken: number; - }; - KDRatio: number; - WLRatio: number; - finalKDRatio: number; - }; - doubles: { - winstreak: number; - playedGames: number; - kills: number; - deaths: number; - wins: number; - losses: number; - finalKills: number; - finalDeaths: number; - beds: { - broken: number; - lost: number; - BLRatio: number; - }; - avg: { - kills: number; - finalKills: number; - bedsBroken: number; - }; - KDRatio: number; - WLRatio: number; - finalKDRatio: number; - }; - threes: { - winstreak: number; - playedGames: number; - kills: number; - deaths: number; - wins: number; - losses: number; - finalKills: number; - finalDeaths: number; - beds: { - broken: number; - lost: number; - BLRatio: number; - }; - avg: { - kills: number; - finalKills: number; - bedsBroken: number; - }; - KDRatio: number; - WLRatio: number; - finalKDRatio: number; - }; - fours: { - winstreak: number; - playedGames: number; - kills: number; - deaths: number; - wins: number; - losses: number; - finalKills: number; - finalDeaths: number; - beds: { - broken: number; - lost: number; - BLRatio: number; - }; - avg: { - kills: number; - finalKills: number; - bedsBroken: number; - }; - KDRatio: number; - WLRatio: number; - finalKDRatio: number; - }; - '4v4': { - winstreak: number; - playedGames: number; - kills: number; - deaths: number; - wins: number; - losses: number; - finalKills: number; - finalDeaths: number; - beds: { - broken: number; - lost: number; - BLRatio: number; - }; - avg: { - kills: number; - finalKills: number; - bedsBroken: number; - }; - KDRatio: number; - WLRatio: number; - finalKDRatio: number; - }; - dream: { - ultimate: { - doubles: { - winstreak: number; - playedGames: number; - kills: number; - deaths: number; - wins: number; - losses: number; - finalKills: number; - finalDeaths: number; - beds: { - broken: number; - lost: number; - BLRatio: number; - }; - avg: { - kills: number; - finalKills: number; - bedsBroken: number; - }; - KDRatio: number; - WLRatio: number; - finalKDRatio: number; - }; - fours: { - winstreak: number; - playedGames: number; - kills: number; - deaths: number; - wins: number; - losses: number; - finalKills: number; - finalDeaths: number; - beds: { - broken: number; - lost: number; - BLRatio: number; - }; - avg: { - kills: number; - finalKills: number; - bedsBroken: number; - }; - KDRatio: number; - WLRatio: number; - finalKDRatio: number; - }; - }; - rush: { - doubles: { - winstreak: number; - playedGames: number; - kills: number; - deaths: number; - wins: number; - losses: number; - finalKills: number; - finalDeaths: number; - beds: { - broken: number; - lost: number; - BLRatio: number; - }; - avg: { - kills: number; - finalKills: number; - bedsBroken: number; - }; - KDRatio: number; - WLRatio: number; - finalKDRatio: number; - }; - fours: { - winstreak: number; - playedGames: number; - kills: number; - deaths: number; - wins: number; - losses: number; - finalKills: number; - finalDeaths: number; - beds: { - broken: number; - lost: number; - BLRatio: number; - }; - avg: { - kills: number; - finalKills: number; - bedsBroken: number; - }; - KDRatio: number; - WLRatio: number; - finalKDRatio: number; - }; - }; - armed: { - doubles: { - winstreak: number; - playedGames: number; - kills: number; - deaths: number; - wins: number; - losses: number; - finalKills: number; - finalDeaths: number; - beds: { - broken: number; - lost: number; - BLRatio: number; - }; - avg: { - kills: number; - finalKills: number; - bedsBroken: number; - }; - KDRatio: number; - WLRatio: number; - finalKDRatio: number; - }; - fours: { - winstreak: number; - playedGames: number; - kills: number; - deaths: number; - wins: number; - losses: number; - finalKills: number; - finalDeaths: number; - beds: { - broken: number; - lost: number; - BLRatio: number; - }; - avg: { - kills: number; - finalKills: number; - bedsBroken: number; - }; - KDRatio: number; - WLRatio: number; - finalKDRatio: number; - }; - }; - lucky: { - doubles: { - winstreak: number; - playedGames: number; - kills: number; - deaths: number; - wins: number; - losses: number; - finalKills: number; - finalDeaths: number; - beds: { - broken: number; - lost: number; - BLRatio: number; - }; - avg: { - kills: number; - finalKills: number; - bedsBroken: number; - }; - KDRatio: number; - WLRatio: number; - finalKDRatio: number; - }; - fours: { - winstreak: number; - playedGames: number; - kills: number; - deaths: number; - wins: number; - losses: number; - finalKills: number; - finalDeaths: number; - beds: { - broken: number; - lost: number; - BLRatio: number; - }; - avg: { - kills: number; - finalKills: number; - bedsBroken: number; - }; - KDRatio: number; - WLRatio: number; - finalKDRatio: number; - }; - }; - voidless: { - doubles: { - winstreak: number; - playedGames: number; - kills: number; - deaths: number; - wins: number; - losses: number; - finalKills: number; - finalDeaths: number; - beds: { - broken: number; - lost: number; - BLRatio: number; - }; - avg: { - kills: number; - finalKills: number; - bedsBroken: number; - }; - KDRatio: number; - WLRatio: number; - finalKDRatio: number; - }; - fours: { - winstreak: number; - playedGames: number; - kills: number; - deaths: number; - wins: number; - losses: number; - finalKills: number; - finalDeaths: number; - beds: { - broken: number; - lost: number; - BLRatio: number; - }; - avg: { - kills: number; - finalKills: number; - bedsBroken: number; - }; - KDRatio: number; - WLRatio: number; - finalKDRatio: number; - }; - }; - }; - castle: { - winstreak: number; - playedGames: number; - kills: number; - deaths: number; - wins: number; - losses: number; - finalKills: number; - finalDeaths: number; - beds: { - broken: number; - lost: number; - BLRatio: number; - }; - avg: { - kills: number; - finalKills: number; - bedsBroken: number; - }; - }; - practice: { - selected: string; - bridging: { - blocksPlaced: number; - attempts: { - failed: number; - successful: number; - total: number; - }; - records: { - '30Blocks': { - elevation: { - none: { - straight: number; - diagonal: number; - }; - slight: { - straight: number; - diagonal: number; - }; - staircase: { - straight: number; - diagonal: number; - }; - }; - }; - '50Blocks': { - elevation: { - none: { - straight: number; - diagonal: number; - }; - slight: { - straight: number; - diagonal: number; - }; - staircase: { - straight: number; - diagonal: number; - }; - }; - }; - '100Blocks': { - elevation: { - none: { - straight: number; - diagonal: number; - }; - slight: { - straight: number; - diagonal: number; - }; - staircase: { - straight: number; - diagonal: number; - }; - }; - }; - }; - }; - fireballJumping: { - blocksPlaced: number; - attempts: { - failed: number; - successful: number; - total: number; - }; - }; - pearlClutching: { - attempts: { - failed: number; - successful: number; - total: number; - }; - }; - mlg: { - blocksPlaced: number; - attempts: { - failed: number; - successful: number; - total: number; - }; - }; - }; - slumberTickets: number; - totalSlumberTickets: number; - } - - class UHCGamemode { - constructor(data: Record, mode: string); - kills: number; - deaths: number; - wins: number; - headsEaten: number; - ultimatesCrafted: number; - extraUltimatesCrafted: number; - } - class UHC { - constructor(data: Record); - coins: number; - score: number; - kit: string; - solo: UHCGamemode; - team: UHCGamemode; - redVsBlue: UHCGamemode; - noDiamond: UHCGamemode; - brawl: UHCGamemode; - soloBrawl: UHCGamemode; - duoBrawl: UHCGamemode; - wins: number; - kills: number; - deaths: number; - KDRatio: number; - headsEaten: number; - ultimatesCrafted: number; - extraUltimatesCrafted: number; - starLevel: number; - } - class SpeedUHCMode { - constructor(data: Record, mode: string); - kills: number; - deaths: number; - wins: number; - losses: number; - playedGames: number; - winstreak: number; - killStreak: number; - assists: number; - } - class SpeedUHC { - constructor(data: Record); - coins: number; - kills: number; - deaths: number; - KDRatio: number; - wins: number; - losses: number; - WLRatio: number; - playedGames: number; - winstreak: number; - killstreak: number; - blocksBroken: number; - blocksPlaced: number; - quits: number; - itemsEnchanted: number; - assists: number; - solo: SpeedUHCMode; - soloNormal: SpeedUHCMode; - soloInsane: SpeedUHCMode; - team: SpeedUHCMode; - teamNormal: SpeedUHCMode; - teamInsane: SpeedUHCMode; - } - class MurderMysteryModeStats { - constructor(data: Record, gamemode: string); - goldPickedUp: number; - kills: number; - thrownKnifeKills: number; - knifeKills: number; - bowKills: number; - trapKills: number; - deaths: number; - suicides: number; - KDRatio: number; - wins: number; - winsAsDetective: number; - winsAsMurderer: number; - winsAsHero: number; - playedGames: number; - } - class MurderMystery { - constructor(data: Record); - tokens: number; - goldPickedUp: number; - playedGames: number; - kills: number; - thrownKnifeKills: number; - knifeKills: number; - trapKills: number; - bowKills: number; - killsAsMurderer: number; - deaths: number; - KDRatio: number; - winsAsMurderer: number; - winsAsDetective: number; - winsAsHero: number; - fastestWinAsMurderer: number; - fastestWinAsDetective: number; - totalTimeSurvived: number; - wins: number; - suicides: number; - classic: MurderMysteryModeStats; - assassins: MurderMysteryModeStats; - doubleUp: MurderMysteryModeStats; - infection: MurderMysteryModeStats; - } - class DuelsGamemode { - constructor(data: Record, mode: string, title: string); - title: string; - winstreak: number; - bestWinstreak: number; - kills: number; - deaths: number; - KDRatio: number; - wins: number; - losses: number; - WLRatio: number; - playedGames: number; - swings: number; - hits: number; - meleeAccuracy: number; - bowShots: number; - bowHits: number; - bowAccuracy: number; - blocksPlaced: number; - healthRegenerated: number; - goldenApplesEatan: number; - goals: number; - } - class DuelsUHC { - constructor(data: Record, mode: string, title: string); - title: string; - winstreak: number; - bestWinstreak: number; - solo: DuelsGamemode; - doubles: DuelsGamemode; - fours: DuelsGamemode; - deathmatch: DuelsGamemode; - kills: number; - deaths: number; - KDRatio: number; - wins: number; - losses: number; - WLRatio: number; - playedGames: number; - swings: number; - hits: number; - meleeAccuracy: number; - bowShots: number; - bowHits: number; - bowAccuracy: number; - blocksPlaced: number; - healthRegenerated: number; - goldenApplesEatan: number; - } - class DuelsSkyWars { - constructor(data: Record, mode: string, title: string); - title: string; - winstreak: number; - bestWinstreak: number; - solo: DuelsGamemode; - doubles: DuelsGamemode; - kills: number; - deaths: number; - KDRatio: number; - wins: number; - losses: number; - WLRatio: number; - playedGames: number; - swings: number; - hits: number; - meleeAccuracy: number; - bowShots: number; - bowHits: number; - bowAccuracy: number; - blocksPlaced: number; - healthRegenerated: number; - goldenApplesEatan: number; - } - class DuelsMegaWalls { - constructor(data: Record, mode: string, title: string); - title: string; - winstreak: number; - bestWinstreak: number; - solo: DuelsGamemode; - doubles: DuelsGamemode; - kills: number; - deaths: number; - KDRatio: number; - wins: number; - losses: number; - WLRatio: number; - playedGames: number; - swings: number; - hits: number; - meleeAccuracy: number; - bowShots: number; - bowHits: number; - bowAccuracy: number; - blocksPlaced: number; - healthRegenerated: number; - goldenApplesEatan: number; - } - class DuelsOP { - constructor(data: Record, mode: string, title: string); - title: string; - winstreak: number; - bestWinstreak: number; - solo: DuelsGamemode; - doubles: DuelsGamemode; - kills: number; - deaths: number; - KDRatio: number; - wins: number; - losses: number; - WLRatio: number; - playedGames: number; - swings: number; - hits: number; - meleeAccuracy: number; - bowShots: number; - bowHits: number; - bowAccuracy: number; - blocksPlaced: number; - healthRegenerated: number; - goldenApplesEatan: number; - } - class DuelsBridge { - constructor(data: Record, mode: string, title: string); - title: string; - winstreak: number; - bestWinstreak: number; - solo: DuelsGamemode; - doubles: DuelsGamemode; - threes: DuelsGamemode; - fours: DuelsGamemode; - '2v2v2v2': DuelsGamemode; - '3v3v3v3': DuelsGamemode; - ctf: DuelsGamemode; - kills: number; - deaths: number; - KDRatio: number; - wins: number; - losses: number; - WLRatio: number; - playedGames: number; - swings: number; - hits: number; - meleeAccuracy: number; - bowShots: number; - bowHits: number; - bowAccuracy: number; - blocksPlaced: number; - healthRegenerated: number; - goldenApplesEatan: number; - goals: number; - } - class Duels { - constructor(data: Record); - tokens: number; - title: string | null; - kills: number; - deaths: number; - KDRatio: number; - wins: number; - losses: number; - WLRatio: number; - playedGames: number; - winstreak: number; - bestWinstreak: number; - ping: number; - blocksPlaced: number; - swings: number; - hits: number; - meleeAccuracy: number; - bowShots: number; - bowHits: number; - bowAccuracy: number; - healthRegenerated: number; - goldenApplesEatan: number; - uhc: DuelsUHC; - skywars: DuelsSkyWars; - megawalls: DuelsMegaWalls; - blitz: DuelsGamemode; - op: DuelsOP; - classic: DuelsGamemode; - bow: DuelsGamemode; - noDebuff: DuelsGamemode; - combo: DuelsGamemode; - bowSpleef: DuelsGamemode; - sumo: DuelsGamemode; - bridge: DuelsBridge; - parkour: DuelsGamemode; - arena: DuelsGamemode; - } - class BuildBattle { - constructor(data: Record); - score: number; - totalWins: number; - games: number; - WLRatio: number; - superVotes: number; - coins: number; - totalVotes: number; - wins: { - solo: number; - teams: number; - pro: number; - gtb: number; - }; - } - class RecentGame extends Game { - constructor(data: Record); - dateTimestamp?: number; - date?: Date; - mode?: string; - map?: string; - ongoing?: boolean; - endedAt?: Date; - endedTimestamp?: number; - } - class MegaWallsModeStats { - constructor(data: Record, mode: string, kit?: string); - kills: number; - assists: number; - deaths: number; - KDRatio: number; - wins: number; - losses: number; - WLRatio: number; - finalKills: number; - finalAssists: number; - finalDeaths: number; - finalKDRatio: number; - playedGames: number; - witherDamage: number; - defenderKills: number; - walked: number; - blocksPlaced: number; - blocksBroken: number; - meleeKills: number; - damageDealt: number; - } - class MegaWallsKitStats { - constructor(data: Record, kit: string); - kills: number; - assists: number; - deaths: number; - KDRatio: number; - wins: number; - losses: number; - WLRatio: number; - finalKills: number; - finalAssists: number; - finalDeaths: number; - finalKDRatio: number; - playedGames: number; - witherDamage: number; - defenderKills: number; - walked: number; - blocksPlaced: number; - blocksBroken: number; - meleeKills: number; - damageDealt: number; - faceOff: MegaWallsModeStats; - casualBrawl: MegaWallsModeStats; - } - class MegaWalls { - constructor(data: Record); - selectedClass: string | null; - coins: number; - kills: number; - assists: number; - deaths: number; - KDRatio: number; - wins: number; - losses: number; - WLRatio: number; - finalKills: number; - finalAssists: number; - finalDeaths: number; - finalKDRatio: number; - playedGames: number; - witherDamage: number; - defenderKills: number; - walked: number; - blocksPlaced: number; - blocksBroken: number; - meleeKills: number; - damageDealt: number; - faceOff: MegaWallsModeStats; - casualBrawl: MegaWallsModeStats; - cow: MegaWallsKitStats; - hunter: MegaWallsKitStats; - shark: MegaWallsKitStats; - arcanist: MegaWallsKitStats; - deadlord: MegaWallsKitStats; - golem: MegaWallsKitStats; - herobrine: MegaWallsKitStats; - pigman: MegaWallsKitStats; - zombie: MegaWallsKitStats; - blaze: MegaWallsKitStats; - enderman: MegaWallsKitStats; - shaman: MegaWallsKitStats; - squid: MegaWallsKitStats; - creeper: MegaWallsKitStats; - pirate: MegaWallsKitStats; - sheep: MegaWallsKitStats; - skeleton: MegaWallsKitStats; - spider: MegaWallsKitStats; - werewolf: MegaWallsKitStats; - angel: MegaWallsKitStats; - assassin: MegaWallsKitStats; - automaton: MegaWallsKitStats; - moleman: MegaWallsKitStats; - phoenix: MegaWallsKitStats; - renegade: MegaWallsKitStats; - snowman: MegaWallsKitStats; - } - class APIStatus { - constructor(data: Record); - sourceUrl: string; - title: string; - description: string; - incidents: APIIncident[]; - currentIncidents: APIIncident[]; - } - class APIIncident { - constructor(data: Record); - link: string; - start: Date; - startFormatted: string; - startTimestamp: number; - author: string; - HTMLContent: string; - snippet: string; - guid: string; - categories: string[]; - isResolved: boolean; - } - class ItemBytes { - constructor(data: Record); - bytesBuffer: Buffer; - base64(): string; - /** - * @description Reads the bytes as a NBT tag - */ - readNBT(): Promise; - } - class ServerInfo { - constructor(data: Record, ping: number); - protocolUsed: number; - versionInfo: string; - players: { - max: number; - online: number; - players: string[]; - }; - rawMOTD: string; - cleanMOTD: string; - textMOTD: string; - faviconB64: string; - favicon: Buffer; - ping: number; - } - - class Achievements { - lastUpdatedTimestamp: number; - lastUpdatedAt: Date; - achievementsPerGame: { - arcade: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - arena: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - bedwars: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - blitz: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - buildbattle: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - christmas2017: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - copsandcrims: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - duels: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - easter: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - general: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - gingerbread: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - halloween2017: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - housing: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - murdermystery: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - paintball: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - pit: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - quake: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - skyblock: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - skyclash: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - skywars: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - speeduhc: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - summer: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - supersmash: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - tntgames: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - truecombat: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - uhc: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - vampirez: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - walls: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - walls3: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - warlords: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - woolgames: { - category: string; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - }; - }; - } - class Achievement { - constructor(data: Record); - name: string; - codeName: string; - description: string; - type: ACHIEVEMENT_TYPE; - rarity: { - local?: number; - localPercentage?: number; - global?: number; - globalPercentage?: number; - }; - tierInformation?: AchievementTier; - points: number; - totalAmountRequired?: number; - toString(): string; - } - class AchievementTier { - constructor(data: Record); - maxTier: number; - getTier(tier: number): { - pointsRewarded?: number; - amountRequired?: number; - }; - } - class Challenges { - constructor(data: Record); - lastUpdatedTimestamp: number; - lastUpdatedAt: Date; - challengesPerGame: Record; - } - class GameAchievement { - constructor(data: Record); - category: GAME_STATIC; - totalPoints: number; - totalLegacyPoints: number; - achievements: Achievement[]; - } - class GameChallenges { - constructor(data: Record); - category: GAME_STATIC; - challenges: Map; - } - class GameQuests { - constructor(data: Record); - game: GAME_STATIC; - quests: Quest[]; - } - class GuildAchievements { - constructor(data: Record); - lastUpdatedTimestamp: number; - lastUpdatedAt: Date; - achievements: Record; - } - class Quest { - constructor(data: Record); - questName: string; - questID: string; - description: string; - type: QUEST_TYPE; - objectives: Objective[]; - rewards: QuestReward[]; - toString(): string; - } - class Quests { - constructor(data: Record); - lastUpdatedTimestamp: number; - lastUpdatedAt: Date; - questsPerGame: Record; - } - class Bingo { - constructor(data: Record); - name: string; - id: string; - row?: number; - column?: number; - rawLore: string; - lore: string; - tiers: number[]; - type: BINGO_TYPE; - tierStep?: number; - requiredAmount?: number; - toString(): string; - } - class House { - constructor(data: Record); - name: string; - uuid: string; - owner: string; - createdAtTimestamp: number; - createdAt: Date; - players: number; - cookies: number; - toString(): string; - } -} diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 000000000..34f470db3 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + setupFiles: ['./vitest.setup.ts'], + testTimeout: 30000 + } +}); diff --git a/vitest.setup.ts b/vitest.setup.ts new file mode 100644 index 000000000..5e7189240 --- /dev/null +++ b/vitest.setup.ts @@ -0,0 +1,31 @@ +import { config } from 'dotenv'; +config(); +if (1 > (process.env.HYPIXEL_KEY || '').length) throw new Error('No API Key specified!'); + +export const defaultRequestData = { + ok: true, + status: 200, + json: () => Promise.resolve({ success: true }), + headers: new Headers(), + redirected: false, + statusText: '', + type: 'basic', + url: '', + clone: function (): Response { + throw new Error('Function not implemented.'); + }, + body: null, + bodyUsed: false, + arrayBuffer: function (): Promise { + throw new Error('Function not implemented.'); + }, + blob: function (): Promise { + throw new Error('Function not implemented.'); + }, + formData: function (): Promise { + throw new Error('Function not implemented.'); + }, + text: function (): Promise { + throw new Error('Function not implemented.'); + } +}; From 7e6dd082ec0b7e30ed7c4b8cf25c258496683b4e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 22:45:33 +0800 Subject: [PATCH 002/124] chore(config): migrate config .github/renovate.json (#656) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/renovate.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/renovate.json b/.github/renovate.json index 82e70252d..a770a0491 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -1,6 +1,6 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["config:base", "group:allNonMajor"], + "extends": ["config:recommended", "group:allNonMajor"], "rebaseWhen": "behind-base-branch", "ignoreDeps": ["pnpm", "node"], "semanticCommits": "enabled", @@ -9,13 +9,13 @@ "enabledManagers": ["npm"], "rangeStrategy": "bump", "prConcurrentLimit": 5, - "includeForks": true, + "forkProcessing": "enabled", "prHourlyLimit": 0, "timezone": "UTC", "packageRules": [ { "matchPackageNames": ["skyhelper-networth"], - "updateTypes": ["minor"], + "matchUpdateTypes": ["minor"], "automerge": true }, { From ac73bd4cd1be6e89809688f968d92b3304d5e0a6 Mon Sep 17 00:00:00 2001 From: Jacob Date: Thu, 19 Dec 2024 11:33:35 +0800 Subject: [PATCH 003/124] Update tsconfig --- .vscode/settings.json | 11 ++++- package.json | 2 +- src/API/getAchievements.ts | 4 +- src/API/getActiveHouses.ts | 4 +- src/API/getBoosters.ts | 4 +- src/API/getChallenges.test.ts | 2 +- src/API/getChallenges.ts | 4 +- src/API/getGameCounts.ts | 4 +- src/API/getGuild.ts | 6 +-- src/API/getGuildAchievements.ts | 4 +- src/API/getHouse.ts | 4 +- src/API/getLeaderboards.ts | 4 +- src/API/getPlayer.test.ts | 2 +- src/API/getPlayer.ts | 6 +-- src/API/getPlayerHouses.ts | 4 +- src/API/getQuests.test.ts | 2 +- src/API/getQuests.ts | 4 +- src/API/getRecentGames.ts | 4 +- src/API/getSkyblockAuction.test.ts | 2 +- src/API/getSkyblockAuction.ts | 6 +-- src/API/getSkyblockAuctions.test.ts | 4 +- src/API/getSkyblockAuctions.ts | 6 +-- src/API/getSkyblockAuctionsByPlayer.test.ts | 2 +- src/API/getSkyblockAuctionsByPlayer.ts | 6 +-- src/API/getSkyblockBazaar.ts | 4 +- src/API/getSkyblockBingo.ts | 4 +- src/API/getSkyblockFireSales.ts | 4 +- src/API/getSkyblockGarden.ts | 4 +- src/API/getSkyblockGovernment.ts | 4 +- src/API/getSkyblockMember.test.ts | 6 +-- src/API/getSkyblockMember.ts | 9 +++-- src/API/getSkyblockMuseum.ts | 8 +++- src/API/getSkyblockNews.ts | 4 +- src/API/getSkyblockProfiles.ts | 6 +-- src/API/getStatus.ts | 4 +- src/API/getWatchdogStats.ts | 4 +- src/Private/Functions.test.ts | 4 +- src/Private/Updater.test.ts | 8 ++-- src/Structures/Game.ts | 2 +- .../BedWarsPracticeRecordElevation.ts | 2 +- src/Structures/MiniGames/BuildBattle.test.ts | 2 +- .../MiniGames/CopsAndCrims/CopsAndCrimsGun.ts | 2 +- src/Structures/MiniGames/Pit/Pit.test.ts | 2 +- src/Structures/Player/Player.ts | 9 ++++- src/Structures/Player/Seasonal/Season.test.ts | 2 +- src/Structures/Player/Seasonal/Season.ts | 2 +- src/Structures/Player/SocialMedia.test.ts | 2 +- src/Structures/Player/SocialMedia.ts | 2 +- src/Structures/SkyBlock/Auctions/Auction.ts | 4 +- .../SkyBlock/SkyblockMember.test.ts | 10 ++++- src/Structures/SkyBlock/SkyblockMember.ts | 24 +++++------ .../SkyBlock/SkyblockMemberStats.ts | 2 +- src/Structures/SkyBlock/SkyblockPet.ts | 2 +- src/Structures/Static/Quest.test.ts | 6 +-- src/Types/{API.d.ts => API.ts} | 0 src/Types/{Booster.d.ts => Booster.ts} | 0 src/Types/{Client.d.ts => Client.ts} | 0 src/Types/{Color.d.ts => Color.ts} | 6 +-- src/Types/{Game.d.ts => Game.ts} | 0 src/Types/{Guild.d.ts => Guild.ts} | 0 src/Types/{Player.d.ts => Player.ts} | 40 +++++++++---------- src/Types/{Requests.d.ts => Requests.ts} | 0 src/Types/{Skyblock.d.ts => Skyblock.ts} | 2 +- src/Types/{Static.d.ts => Static.ts} | 0 src/Utils/Constants.ts | 2 +- src/Utils/PlayerUtils.ts | 2 +- src/Utils/SkyblockUtils.ts | 4 +- src/index.ts | 20 +++++----- tsconfig.json | 29 +++++++------- 69 files changed, 193 insertions(+), 161 deletions(-) rename src/Types/{API.d.ts => API.ts} (100%) rename src/Types/{Booster.d.ts => Booster.ts} (100%) rename src/Types/{Client.d.ts => Client.ts} (100%) rename src/Types/{Color.d.ts => Color.ts} (92%) rename src/Types/{Game.d.ts => Game.ts} (100%) rename src/Types/{Guild.d.ts => Guild.ts} (100%) rename src/Types/{Player.d.ts => Player.ts} (95%) rename src/Types/{Requests.d.ts => Requests.ts} (100%) rename src/Types/{Skyblock.d.ts => Skyblock.ts} (99%) rename src/Types/{Static.d.ts => Static.ts} (100%) diff --git a/.vscode/settings.json b/.vscode/settings.json index fe19bb9e6..a4aca83c3 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,5 +3,14 @@ "prettier.useTabs": false, "files.insertFinalNewline": true, "files.trimTrailingWhitespace": true, - "editor.trimAutoWhitespace": true + "editor.trimAutoWhitespace": true, + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit" + }, + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "typescript.format.semicolons": "insert", + "typescript.preferences.quoteStyle": "single" } diff --git a/package.json b/package.json index 25891beff..1d32b0cec 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "lint": "npx eslint src/ --fix", "prettier:check": "npx prettier --check .", "prettier": "npx prettier --write .", - "build": "npx tsc && cp -r ./src/Types dist/", + "build": "npx tsc", "test": "npx vitest run", "test:coverage": "npx vitest run --coverage", "test:ui": "npx vitest --ui --coverage", diff --git a/src/API/getAchievements.ts b/src/API/getAchievements.ts index e0b996eef..b92ec2772 100644 --- a/src/API/getAchievements.ts +++ b/src/API/getAchievements.ts @@ -5,13 +5,13 @@ import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; class getAchievements extends Endpoint { - readonly client: Client; + override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - async execute(options?: RequestOptions): Promise { + override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/resources/achievements', options); if (res.options.raw) return res; return new Achievements(res.data); diff --git a/src/API/getActiveHouses.ts b/src/API/getActiveHouses.ts index e4ec89211..57dbcfe12 100644 --- a/src/API/getActiveHouses.ts +++ b/src/API/getActiveHouses.ts @@ -5,13 +5,13 @@ import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; class getActiveHouses extends Endpoint { - readonly client: Client; + override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - async execute(options?: RequestOptions): Promise { + override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/housing/active', options); if (res.options.raw) return res; return res.data.map((b: any) => new House(b)); diff --git a/src/API/getBoosters.ts b/src/API/getBoosters.ts index fc4015771..49565b157 100644 --- a/src/API/getBoosters.ts +++ b/src/API/getBoosters.ts @@ -5,13 +5,13 @@ import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; class getBoosters extends Endpoint { - readonly client: Client; + override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - async execute(options?: RequestOptions): Promise { + override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/boosters', options); if (res.options.raw) return res; return res.data.boosters.map((b: any) => new Booster(b)).reverse(); diff --git a/src/API/getChallenges.test.ts b/src/API/getChallenges.test.ts index ca1917155..6782cd4ad 100644 --- a/src/API/getChallenges.test.ts +++ b/src/API/getChallenges.test.ts @@ -3,8 +3,8 @@ import Challenges from '../Structures/Static/Challenges.js'; import Client from '../Client.js'; import GameChallenges from '../Structures/Static/GameChallenges.js'; import RequestData from '../Private/RequestData.js'; -import { ChallengeReward } from '../Types/Static.js'; import { expect, expectTypeOf, test } from 'vitest'; +import type { ChallengeReward } from '../Types/Static.js'; test('getChallenges (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); diff --git a/src/API/getChallenges.ts b/src/API/getChallenges.ts index d68e025da..639095a30 100644 --- a/src/API/getChallenges.ts +++ b/src/API/getChallenges.ts @@ -5,13 +5,13 @@ import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; class getChallenges extends Endpoint { - readonly client: Client; + override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - async execute(options?: RequestOptions): Promise { + override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/resources/challenges', options); if (res.options.raw) return res; return new Challenges(res.data); diff --git a/src/API/getGameCounts.ts b/src/API/getGameCounts.ts index 279993d39..c72a58964 100644 --- a/src/API/getGameCounts.ts +++ b/src/API/getGameCounts.ts @@ -5,13 +5,13 @@ import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; class getGameCounts extends Endpoint { - readonly client: Client; + override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - async execute(options?: RequestOptions): Promise { + override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/counts', options); if (res.options.raw) return res; return new GameCounts(res.data); diff --git a/src/API/getGuild.ts b/src/API/getGuild.ts index bafe9113c..e326cb289 100644 --- a/src/API/getGuild.ts +++ b/src/API/getGuild.ts @@ -2,17 +2,17 @@ import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import Guild from '../Structures/Guild/Guild.js'; import RequestData from '../Private/RequestData.js'; -import { GuildFetchOptions } from '../Types/API.js'; +import type { GuildFetchOptions } from '../Types/API.js'; import type { RequestOptions } from '../Types/Requests.js'; class getGuild extends Endpoint { - readonly client: Client; + override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - async execute( + override async execute( searchParameter: GuildFetchOptions, query: string, options?: RequestOptions diff --git a/src/API/getGuildAchievements.ts b/src/API/getGuildAchievements.ts index 8104e4c49..e6a1f8cf3 100644 --- a/src/API/getGuildAchievements.ts +++ b/src/API/getGuildAchievements.ts @@ -5,13 +5,13 @@ import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; class getGuildAchievements extends Endpoint { - readonly client: Client; + override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - async execute(options?: RequestOptions): Promise { + override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/resources/guilds/achievements', options); if (res.options.raw) return res; return new GuildAchievements(res.data); diff --git a/src/API/getHouse.ts b/src/API/getHouse.ts index cc783a3d2..bdd1d5269 100644 --- a/src/API/getHouse.ts +++ b/src/API/getHouse.ts @@ -5,13 +5,13 @@ import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; class getHouse extends Endpoint { - readonly client: Client; + override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - async execute(query: string, options?: RequestOptions): Promise { + override async execute(query: string, options?: RequestOptions): Promise { if (!query) throw new Error(this.client.errors.NO_UUID); const res = await this.client.requestHandler.request(`/housing/house?house=${query}`, options); if (res.options.raw) return res; diff --git a/src/API/getLeaderboards.ts b/src/API/getLeaderboards.ts index 440069366..5e2623c76 100644 --- a/src/API/getLeaderboards.ts +++ b/src/API/getLeaderboards.ts @@ -5,13 +5,13 @@ import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; class getLeaderboards extends Endpoint { - readonly client: Client; + override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - async execute(options?: RequestOptions): Promise | RequestData> { + override async execute(options?: RequestOptions): Promise | RequestData> { const res = await this.client.requestHandler.request('/leaderboards', options); if (res.options.raw) return res; if (!res.data.leaderboards) { diff --git a/src/API/getPlayer.test.ts b/src/API/getPlayer.test.ts index a08580e43..66a53d24f 100644 --- a/src/API/getPlayer.test.ts +++ b/src/API/getPlayer.test.ts @@ -37,9 +37,9 @@ import VampireZ from '../Structures/MiniGames/VampireZ/VampireZ.js'; import Walls from '../Structures/MiniGames/Walls.js'; import Warlords from '../Structures/MiniGames/Warlords/Warlords.js'; import WoolGames from '../Structures/MiniGames/WoolGames/WoolGames.js'; -import { ChatChannel, Language, LevelProgress, PlayerRank, PlayerStats, ScorpiusBribe } from '../Types/Player.js'; import { defaultRequestData } from '../../vitest.setup.js'; import { expect, expectTypeOf, test, vi } from 'vitest'; +import type { ChatChannel, Language, LevelProgress, PlayerRank, PlayerStats, ScorpiusBribe } from '../Types/Player.js'; test('getPlayer (never joinned hypixel)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); diff --git a/src/API/getPlayer.ts b/src/API/getPlayer.ts index 72ddf63f3..7bf0df843 100644 --- a/src/API/getPlayer.ts +++ b/src/API/getPlayer.ts @@ -5,16 +5,16 @@ import House from '../Structures/House.js'; import Player from '../Structures/Player/Player.js'; import RecentGame from '../Structures/RecentGame.js'; import RequestData from '../Private/RequestData.js'; -import { PlayerRequestOptions } from '../Types/API.js'; +import type { PlayerRequestOptions } from '../Types/API.js'; class getPlayer extends Endpoint { - readonly client: Client; + override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - async execute(query: string, options?: PlayerRequestOptions): Promise { + override async execute(query: string, options?: PlayerRequestOptions): Promise { if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); query = await this.client.requestHandler.toUUID(query); const res = await this.client.requestHandler.request(`/player?uuid=${query}`, options); diff --git a/src/API/getPlayerHouses.ts b/src/API/getPlayerHouses.ts index 3f337cf25..3dd6127cb 100644 --- a/src/API/getPlayerHouses.ts +++ b/src/API/getPlayerHouses.ts @@ -5,13 +5,13 @@ import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; class getPlayerHouses extends Endpoint { - readonly client: Client; + override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - async execute(query: string, options?: RequestOptions): Promise { + override async execute(query: string, options?: RequestOptions): Promise { if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); query = await this.client.requestHandler.toUUID(query); const res = await this.client.requestHandler.request(`/housing/houses?player=${query}`, options); diff --git a/src/API/getQuests.test.ts b/src/API/getQuests.test.ts index 0f432f113..a54b566b4 100644 --- a/src/API/getQuests.test.ts +++ b/src/API/getQuests.test.ts @@ -4,8 +4,8 @@ import Quest from '../Structures/Static/Quest.js'; import QuestObjective from '../Structures/Static/QuestObjective.js'; import Quests from '../Structures/Static/Quests.js'; import RequestData from '../Private/RequestData.js'; -import { QuestReward, QuestType } from '../Types/Static.js'; import { expect, expectTypeOf, test } from 'vitest'; +import type { QuestReward, QuestType } from '../Types/Static.js'; test('getQuests (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); diff --git a/src/API/getQuests.ts b/src/API/getQuests.ts index 90916181f..ae8a0511d 100644 --- a/src/API/getQuests.ts +++ b/src/API/getQuests.ts @@ -5,13 +5,13 @@ import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; class getQuests extends Endpoint { - readonly client: Client; + override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - async execute(options?: RequestOptions): Promise { + override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/resources/quests', options); if (res.options.raw) return res; return new Quests(res.data); diff --git a/src/API/getRecentGames.ts b/src/API/getRecentGames.ts index b9630a804..e366e19ee 100644 --- a/src/API/getRecentGames.ts +++ b/src/API/getRecentGames.ts @@ -5,13 +5,13 @@ import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; class getRecentGames extends Endpoint { - readonly client: Client; + override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - async execute(query: string, options?: RequestOptions): Promise { + override async execute(query: string, options?: RequestOptions): Promise { if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); query = await this.client.requestHandler.toUUID(query); const res = await this.client.requestHandler.request(`/recentgames?uuid=${query}`, options); diff --git a/src/API/getSkyblockAuction.test.ts b/src/API/getSkyblockAuction.test.ts index 2e2ef548e..ebd8a1092 100644 --- a/src/API/getSkyblockAuction.test.ts +++ b/src/API/getSkyblockAuction.test.ts @@ -3,8 +3,8 @@ import Bid from '../Structures/SkyBlock/Auctions/Bid.js'; import Client from '../Client.js'; import ItemBytes from '../Structures/ItemBytes.js'; import RequestData from '../Private/RequestData.js'; -import { Rarity } from '../Types/Skyblock.js'; import { expect, expectTypeOf, test } from 'vitest'; +import type { Rarity } from '../Types/Skyblock.js'; test('getSkyblockAuction (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); diff --git a/src/API/getSkyblockAuction.ts b/src/API/getSkyblockAuction.ts index 9a60cc459..39009689f 100644 --- a/src/API/getSkyblockAuction.ts +++ b/src/API/getSkyblockAuction.ts @@ -2,16 +2,16 @@ import Auction from '../Structures/SkyBlock/Auctions/Auction.js'; import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; -import { AuctionFetchOptions, AuctionRequestOptions } from '../Types/API.js'; +import type { AuctionFetchOptions, AuctionRequestOptions } from '../Types/API.js'; class getSkyblockAction extends Endpoint { - readonly client: Client; + override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - async execute( + override async execute( type: AuctionFetchOptions, query: string, options?: AuctionRequestOptions diff --git a/src/API/getSkyblockAuctions.test.ts b/src/API/getSkyblockAuctions.test.ts index 0e80ae8f2..d865c0ce4 100644 --- a/src/API/getSkyblockAuctions.test.ts +++ b/src/API/getSkyblockAuctions.test.ts @@ -3,9 +3,9 @@ import AuctionInfo from '../Structures/SkyBlock/Auctions/AuctionInfo.js'; import Bid from '../Structures/SkyBlock/Auctions/Bid.js'; import Client from '../Client.js'; import ItemBytes from '../Structures/ItemBytes.js'; -import { Rarity } from '../Types/Skyblock.js'; -import { SkyblockAuctionsResult } from '../Types/API.js'; import { expect, expectTypeOf, test } from 'vitest'; +import type { Rarity } from '../Types/Skyblock.js'; +import type { SkyblockAuctionsResult } from '../Types/API.js'; test('getSkyblockAuctions (No input)', () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); diff --git a/src/API/getSkyblockAuctions.ts b/src/API/getSkyblockAuctions.ts index 32e84cc49..bc0094015 100644 --- a/src/API/getSkyblockAuctions.ts +++ b/src/API/getSkyblockAuctions.ts @@ -2,17 +2,17 @@ import Auction from '../Structures/SkyBlock/Auctions/Auction.js'; import AuctionInfo from '../Structures/SkyBlock/Auctions/AuctionInfo.js'; import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; -import { AuctionRequestOptions, SkyblockAuctionsResult } from '../Types/API.js'; +import type { AuctionRequestOptions, SkyblockAuctionsResult } from '../Types/API.js'; class getSkyblockAuctions extends Endpoint { - readonly client: Client; + override readonly client: Client; declare options: AuctionRequestOptions; constructor(client: Client) { super(client); this.client = client; } - async execute(query: number | '*', options?: AuctionRequestOptions): Promise { + override async execute(query: number | '*', options?: AuctionRequestOptions): Promise { if (!query) throw new Error(this.client.errors.INVALID_OPTION_VALUE); if ('number' === typeof query && 0 >= query) throw new Error(this.client.errors.INVALID_OPTION_VALUE); if ('number' !== typeof query && '*' !== query) throw new Error(this.client.errors.INVALID_OPTION_VALUE); diff --git a/src/API/getSkyblockAuctionsByPlayer.test.ts b/src/API/getSkyblockAuctionsByPlayer.test.ts index d1520dc1a..a7a396fbc 100644 --- a/src/API/getSkyblockAuctionsByPlayer.test.ts +++ b/src/API/getSkyblockAuctionsByPlayer.test.ts @@ -3,8 +3,8 @@ import Bid from '../Structures/SkyBlock/Auctions/Bid.js'; import Client from '../Client.js'; import ItemBytes from '../Structures/ItemBytes.js'; import RequestData from '../Private/RequestData.js'; -import { Rarity } from '../Types/Skyblock.js'; import { expect, expectTypeOf, test } from 'vitest'; +import type { Rarity } from '../Types/Skyblock.js'; test('getSkyblockAuctionsByPlayer (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); diff --git a/src/API/getSkyblockAuctionsByPlayer.ts b/src/API/getSkyblockAuctionsByPlayer.ts index 07fd57079..b6816d1f0 100644 --- a/src/API/getSkyblockAuctionsByPlayer.ts +++ b/src/API/getSkyblockAuctionsByPlayer.ts @@ -2,16 +2,16 @@ import Auction from '../Structures/SkyBlock/Auctions/Auction.js'; import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; -import { AuctionRequestOptions } from '../Types/API.js'; +import type { AuctionRequestOptions } from '../Types/API.js'; class getSkyblockActionsByPlayer extends Endpoint { - readonly client: Client; + override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - async execute(query: string, options?: AuctionRequestOptions): Promise { + override async execute(query: string, options?: AuctionRequestOptions): Promise { if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); query = await this.client.requestHandler.toUUID(query); const res = await this.client.requestHandler.request(`/skyblock/auction?player=${query}`, options); diff --git a/src/API/getSkyblockBazaar.ts b/src/API/getSkyblockBazaar.ts index f520d1165..6273f1981 100644 --- a/src/API/getSkyblockBazaar.ts +++ b/src/API/getSkyblockBazaar.ts @@ -5,13 +5,13 @@ import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; class getSkyblockBazaar extends Endpoint { - readonly client: Client; + override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - async execute(options?: RequestOptions): Promise { + override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/skyblock/bazaar', options); if (res.options.raw) return res; return Object.keys(res.data.products).map((x) => new Product(res.data.products[x])); diff --git a/src/API/getSkyblockBingo.ts b/src/API/getSkyblockBingo.ts index ec6bc76bf..36f08d892 100644 --- a/src/API/getSkyblockBingo.ts +++ b/src/API/getSkyblockBingo.ts @@ -5,13 +5,13 @@ import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; class getSkyblockBingo extends Endpoint { - readonly client: Client; + override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - async execute(options?: RequestOptions): Promise { + override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/resources/skyblock/bingo', options); if (res.options.raw) return res; return new BingoData(res.data); diff --git a/src/API/getSkyblockFireSales.ts b/src/API/getSkyblockFireSales.ts index e09371ae4..a006db26b 100644 --- a/src/API/getSkyblockFireSales.ts +++ b/src/API/getSkyblockFireSales.ts @@ -5,13 +5,13 @@ import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; class getSkyblockFireSales extends Endpoint { - readonly client: Client; + override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - async execute(options?: RequestOptions): Promise { + override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/skyblock/firesales', options); if (res.options.raw) return res; return res.data.sales.map((a: any) => new FireSale(a)); diff --git a/src/API/getSkyblockGarden.ts b/src/API/getSkyblockGarden.ts index 924f2d977..ba5db5547 100644 --- a/src/API/getSkyblockGarden.ts +++ b/src/API/getSkyblockGarden.ts @@ -5,13 +5,13 @@ import SkyblockGarden from '../Structures/SkyBlock/SkyblockGarden.js'; import type { RequestOptions } from '../Types/Requests.js'; class getSkyblockGarden extends Endpoint { - readonly client: Client; + override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - async execute(profileId: string, options?: RequestOptions): Promise { + override async execute(profileId: string, options?: RequestOptions): Promise { if (!profileId) throw new Error(this.client.errors.NO_UUID); const res = await this.client.requestHandler.request(`/skyblock/garden?profile=${profileId}`, options); if (res.options.raw) return res; diff --git a/src/API/getSkyblockGovernment.ts b/src/API/getSkyblockGovernment.ts index 62733fb18..e54b0d741 100644 --- a/src/API/getSkyblockGovernment.ts +++ b/src/API/getSkyblockGovernment.ts @@ -5,13 +5,13 @@ import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; class getSkyblockGovernment extends Endpoint { - readonly client: Client; + override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - async execute(options?: RequestOptions): Promise { + override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/resources/skyblock/election', options); if (res.options.raw) return res; return new GovernmentData(res.data); diff --git a/src/API/getSkyblockMember.test.ts b/src/API/getSkyblockMember.test.ts index 585cb14a8..51d1589bf 100644 --- a/src/API/getSkyblockMember.test.ts +++ b/src/API/getSkyblockMember.test.ts @@ -7,7 +7,8 @@ import SkyblockMember from '../Structures/SkyBlock/SkyblockMember.js'; import SkyblockMemberStats from '../Structures/SkyBlock/SkyblockMemberStats.js'; import SkyblockMuseum from '../Structures/SkyBlock/SkyblockMuseum.js'; import SkyblockPet from '../Structures/SkyBlock/SkyblockPet.js'; -import { +import { expect, expectTypeOf, test } from 'vitest'; +import type { Armor, ChocolateFactoryData, CrimsonIsle, @@ -19,8 +20,7 @@ import { Skills, Slayer } from '../Types/Skyblock.js'; -import { NetworthResult } from 'skyhelper-networth'; -import { expect, expectTypeOf, test } from 'vitest'; +import type { NetworthResult } from 'skyhelper-networth'; test('getSkyblockMember (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); diff --git a/src/API/getSkyblockMember.ts b/src/API/getSkyblockMember.ts index c84bf5a01..9a7d214b6 100644 --- a/src/API/getSkyblockMember.ts +++ b/src/API/getSkyblockMember.ts @@ -2,16 +2,19 @@ import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; import SkyblockMember from '../Structures/SkyBlock/SkyblockMember.js'; -import { SkyblockRequestOptions } from '../Types/API.js'; +import type { SkyblockRequestOptions } from '../Types/API.js'; class getSkyblockMember extends Endpoint { - readonly client: Client; + override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - async execute(query: string, options?: SkyblockRequestOptions): Promise | RequestData> { + override async execute( + query: string, + options?: SkyblockRequestOptions + ): Promise | RequestData> { if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); query = await this.client.requestHandler.toUUID(query); const res = await this.client.requestHandler.request(`/skyblock/profiles?uuid=${query}`, options); diff --git a/src/API/getSkyblockMuseum.ts b/src/API/getSkyblockMuseum.ts index 6c900a420..1e06473ad 100644 --- a/src/API/getSkyblockMuseum.ts +++ b/src/API/getSkyblockMuseum.ts @@ -5,13 +5,17 @@ import SkyblockMuseum from '../Structures/SkyBlock/SkyblockMuseum.js'; import type { RequestOptions } from '../Types/Requests.js'; class getSkyblockMuseum extends Endpoint { - readonly client: Client; + override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - async execute(query: string, profileId: string, options?: RequestOptions): Promise { + override async execute( + query: string, + profileId: string, + options?: RequestOptions + ): Promise { if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); query = await this.client.requestHandler.toUUID(query); const res = await this.client.requestHandler.request( diff --git a/src/API/getSkyblockNews.ts b/src/API/getSkyblockNews.ts index 21a914ec8..b00ef9d66 100644 --- a/src/API/getSkyblockNews.ts +++ b/src/API/getSkyblockNews.ts @@ -5,13 +5,13 @@ import SkyblockNews from '../Structures/SkyBlock/News/SkyblockNews.js'; import type { RequestOptions } from '../Types/Requests.js'; class getSkyblockNews extends Endpoint { - readonly client: Client; + override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - async execute(options?: RequestOptions): Promise { + override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/skyblock/news', options); if (res.options.raw) return res; return res.data.items.map((i: any) => new SkyblockNews(i)); diff --git a/src/API/getSkyblockProfiles.ts b/src/API/getSkyblockProfiles.ts index 7d6c7289a..bea5a7eb3 100644 --- a/src/API/getSkyblockProfiles.ts +++ b/src/API/getSkyblockProfiles.ts @@ -2,16 +2,16 @@ import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; import SkyblockProfile from '../Structures/SkyBlock/SkyblockProfile.js'; -import { SkyblockRequestOptions } from '../Types/API.js'; +import type { SkyblockRequestOptions } from '../Types/API.js'; class getSkyblockProfiles extends Endpoint { - readonly client: Client; + override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - async execute(query: string, options?: SkyblockRequestOptions): Promise { + override async execute(query: string, options?: SkyblockRequestOptions): Promise { if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); query = await this.client.requestHandler.toUUID(query); const res = await this.client.requestHandler.request(`/skyblock/profiles?uuid=${query}`, options); diff --git a/src/API/getStatus.ts b/src/API/getStatus.ts index 7e98e1832..40c288b43 100644 --- a/src/API/getStatus.ts +++ b/src/API/getStatus.ts @@ -5,13 +5,13 @@ import Status from '../Structures/Status.js'; import type { RequestOptions } from '../Types/Requests.js'; class getStatus extends Endpoint { - readonly client: Client; + override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - async execute(query: string, options?: RequestOptions): Promise { + override async execute(query: string, options?: RequestOptions): Promise { query = await this.client.requestHandler.toUUID(query); const res = await this.client.requestHandler.request(`/status?uuid=${query}`, options); if (res.options.raw) return res; diff --git a/src/API/getWatchdogStats.ts b/src/API/getWatchdogStats.ts index df7184dda..53fa6efe3 100644 --- a/src/API/getWatchdogStats.ts +++ b/src/API/getWatchdogStats.ts @@ -5,13 +5,13 @@ import WatchdogStats from '../Structures/WatchdogStats.js'; import type { RequestOptions } from '../Types/Requests.js'; class getWatchdogStats extends Endpoint { - readonly client: Client; + override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - async execute(options?: RequestOptions): Promise { + override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/punishmentstats', options); if (res.options.raw) return res; return new WatchdogStats(res.data); diff --git a/src/Private/Functions.test.ts b/src/Private/Functions.test.ts index 2e73e5287..ff3590cf7 100644 --- a/src/Private/Functions.test.ts +++ b/src/Private/Functions.test.ts @@ -1,5 +1,5 @@ -import Client from '../Client'; -import Functions from './Functions'; +import Client from '../Client.js'; +import Functions from './Functions.js'; import { expect, expectTypeOf, test } from 'vitest'; test('Functions', () => { diff --git a/src/Private/Updater.test.ts b/src/Private/Updater.test.ts index 3e68e9f57..90fa467e6 100644 --- a/src/Private/Updater.test.ts +++ b/src/Private/Updater.test.ts @@ -1,8 +1,8 @@ import Client from '../Client.js'; import Updater from './Updater.js'; +import packageJSON from '../../package.json' with { type: 'json' }; import { defaultRequestData } from '../../vitest.setup.js'; import { expect, expectTypeOf, test } from 'vitest'; -import { version } from '../../package.json'; import { vi } from 'vitest'; test('Updater', () => { @@ -13,7 +13,7 @@ test('Updater', () => { expect(client.updater).toBeDefined(); expectTypeOf(client.updater).toEqualTypeOf(); - expect(client.updater.currentVersion).toBe(version); + expect(client.updater.currentVersion).toBe(packageJSON.version); expect(client.updater.latestVersion).toBe('0.0.0'); expect(client.updater.checkForUpdates).toBeDefined(); @@ -65,11 +65,11 @@ test('Updater (check version)', async () => { client.updater.currentVersion = '1.0.0'; vi.spyOn(global, 'fetch').mockResolvedValue({ ...defaultRequestData, - json: () => Promise.resolve({ 'dist-tags': { latest: version } }) + json: () => Promise.resolve({ 'dist-tags': { latest: packageJSON.version } }) } as any); await client.updater.checkForUpdates(); expect(consoleLogSpy).toHaveBeenCalledWith( - `New version of hypixel-api-reborn is available! Current version: 1.0.0, Latest version: ${version}` + `New version of hypixel-api-reborn is available! Current version: 1.0.0, Latest version: ${packageJSON.version}` ); vi.restoreAllMocks(); client.destroy(); diff --git a/src/Structures/Game.ts b/src/Structures/Game.ts index ca4442717..d6dca3e62 100644 --- a/src/Structures/Game.ts +++ b/src/Structures/Game.ts @@ -1,5 +1,5 @@ -import { GameCode, GameID, GameString } from '../Types/Game.js'; import { games } from '../Utils/Constants.js'; +import type { GameCode, GameID, GameString } from '../Types/Game.js'; class Game { game: GameID | GameCode; diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecordElevation.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecordElevation.ts index 5c33b1f34..95b619cef 100644 --- a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecordElevation.ts +++ b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecordElevation.ts @@ -1,4 +1,4 @@ -import { BedWarsPracticeRecordDistances, BedWarsPracticeRecordElevations } from '../../../../Types/Player.js'; +import type { BedWarsPracticeRecordDistances, BedWarsPracticeRecordElevations } from '../../../../Types/Player.js'; class BedWarsPracticeRecordElevation { straight: number; diff --git a/src/Structures/MiniGames/BuildBattle.test.ts b/src/Structures/MiniGames/BuildBattle.test.ts index 2989068c6..e202a7581 100644 --- a/src/Structures/MiniGames/BuildBattle.test.ts +++ b/src/Structures/MiniGames/BuildBattle.test.ts @@ -1,6 +1,6 @@ import BuildBattle from './BuildBattle.js'; -import { BuildBattleWins } from '../../Types/Player.js'; import { expect, expectTypeOf, test } from 'vitest'; +import type { BuildBattleWins } from '../../Types/Player.js'; test('BuildBattle', () => { const data = new BuildBattle({ stats: 'meow' }); diff --git a/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.ts b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.ts index b041e14a8..96c7e68f5 100644 --- a/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.ts +++ b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.ts @@ -1,4 +1,4 @@ -import { CopsAndCrimsGuns } from '../../../Types/Player.js'; +import type { CopsAndCrimsGuns } from '../../../Types/Player.js'; class CopsAndCrimsGun { gunName: CopsAndCrimsGuns; diff --git a/src/Structures/MiniGames/Pit/Pit.test.ts b/src/Structures/MiniGames/Pit/Pit.test.ts index 997c0488e..f6b527a36 100644 --- a/src/Structures/MiniGames/Pit/Pit.test.ts +++ b/src/Structures/MiniGames/Pit/Pit.test.ts @@ -2,8 +2,8 @@ import Client from '../../../Client.js'; import Pit from './Pit.js'; import PitInventoryItem from './PitInventoryItem.js'; import Player from '../../Player/Player.js'; -import { PitArmor } from '../../../Types/Player.js'; import { expect, expectTypeOf, test } from 'vitest'; +import type { PitArmor } from '../../../Types/Player.js'; test('Pit', () => { const data = new Pit({ stats: 'meow' }); diff --git a/src/Structures/Player/Player.ts b/src/Structures/Player/Player.ts index aa56ce442..fed5ef031 100644 --- a/src/Structures/Player/Player.ts +++ b/src/Structures/Player/Player.ts @@ -34,8 +34,15 @@ import VampireZ from '../MiniGames/VampireZ/VampireZ.js'; import Walls from '../MiniGames/Walls.js'; import Warlords from '../MiniGames/Warlords/Warlords.js'; import WoolGames from '../MiniGames/WoolGames/WoolGames.js'; -import { ChatChannel, Language, LevelProgress, PlayerRank, PlayerStats, ScorpiusBribe } from '../../Types/Player.js'; import { getRank, playerLevelProgress } from '../../Utils/PlayerUtils.js'; +import type { + ChatChannel, + Language, + LevelProgress, + PlayerRank, + PlayerStats, + ScorpiusBribe +} from '../../Types/Player.js'; class Player { uuid: string; diff --git a/src/Structures/Player/Seasonal/Season.test.ts b/src/Structures/Player/Seasonal/Season.test.ts index e48173c19..7234c324a 100644 --- a/src/Structures/Player/Seasonal/Season.test.ts +++ b/src/Structures/Player/Seasonal/Season.test.ts @@ -1,7 +1,7 @@ import Season from './Season.js'; import SeasonYear from './SeasonYear.js'; -import { SeasonName } from '../../../Types/Player.js'; import { expect, expectTypeOf, test } from 'vitest'; +import type { SeasonName } from '../../../Types/Player.js'; test('Season', () => { const data = new Season({ stats: 'meow' }, 'anniversary'); diff --git a/src/Structures/Player/Seasonal/Season.ts b/src/Structures/Player/Seasonal/Season.ts index 49d21cf2d..2bbc4741e 100644 --- a/src/Structures/Player/Seasonal/Season.ts +++ b/src/Structures/Player/Seasonal/Season.ts @@ -1,5 +1,5 @@ import SeasonYear from './SeasonYear.js'; -import { SeasonName } from '../../../Types/Player.js'; +import type { SeasonName } from '../../../Types/Player.js'; class Season { season: SeasonName; diff --git a/src/Structures/Player/SocialMedia.test.ts b/src/Structures/Player/SocialMedia.test.ts index 61b61bdd7..09c4d1f43 100644 --- a/src/Structures/Player/SocialMedia.test.ts +++ b/src/Structures/Player/SocialMedia.test.ts @@ -1,6 +1,6 @@ import SocialMedia from './SocialMedia.js'; -import { SocialMediaId } from '../../Types/Player.js'; import { expect, expectTypeOf, test } from 'vitest'; +import type { SocialMediaId } from '../../Types/Player.js'; test('SocialMedia', () => { const data = new SocialMedia({ id: 'DISCORD', link: 'meow' }); diff --git a/src/Structures/Player/SocialMedia.ts b/src/Structures/Player/SocialMedia.ts index 3035a91e2..a8d86439d 100644 --- a/src/Structures/Player/SocialMedia.ts +++ b/src/Structures/Player/SocialMedia.ts @@ -1,4 +1,4 @@ -import { SocialMediaId } from '../../Types/Player.js'; +import type { SocialMediaId } from '../../Types/Player.js'; class SocialMedia { id: SocialMediaId; diff --git a/src/Structures/SkyBlock/Auctions/Auction.ts b/src/Structures/SkyBlock/Auctions/Auction.ts index 7b7d81f8b..e1f7b5af7 100644 --- a/src/Structures/SkyBlock/Auctions/Auction.ts +++ b/src/Structures/SkyBlock/Auctions/Auction.ts @@ -1,6 +1,6 @@ import BaseAuction from './BaseAuction.js'; import Bid from './Bid.js'; -import { Rarity } from '../../../Types/Skyblock.js'; +import type { Rarity } from '../../../Types/Skyblock.js'; class Auction extends BaseAuction { coop: string[]; @@ -35,7 +35,7 @@ class Auction extends BaseAuction { this.claimedBidders = this.claimed ? data.claimed_bidders : []; } - toString(): string { + override toString(): string { return this.item; } } diff --git a/src/Structures/SkyBlock/SkyblockMember.test.ts b/src/Structures/SkyBlock/SkyblockMember.test.ts index 88487f972..ef2462c65 100644 --- a/src/Structures/SkyBlock/SkyblockMember.test.ts +++ b/src/Structures/SkyBlock/SkyblockMember.test.ts @@ -3,8 +3,16 @@ import SkyblockMember from './SkyblockMember.js'; import SkyblockMemberStats from './SkyblockMemberStats.js'; import SkyblockMuseum from './SkyblockMuseum.js'; import SkyblockPet from './SkyblockPet.js'; -import { ChocolateFactoryData, CrimsonIsle, Dungeons, HOTM, JacobData, Skills, Slayer } from '../../Types/Skyblock.js'; import { expect, expectTypeOf, test } from 'vitest'; +import type { + ChocolateFactoryData, + CrimsonIsle, + Dungeons, + HOTM, + JacobData, + Skills, + Slayer +} from '../../Types/Skyblock.js'; test('SkyblockMember', () => { const data = new SkyblockMember({ stats: 'meow' }); diff --git a/src/Structures/SkyBlock/SkyblockMember.ts b/src/Structures/SkyBlock/SkyblockMember.ts index 082409499..ebcdcf0f7 100644 --- a/src/Structures/SkyBlock/SkyblockMember.ts +++ b/src/Structures/SkyBlock/SkyblockMember.ts @@ -4,18 +4,7 @@ import SkyblockMemberMinions from './SkyblockMemberMinions.js'; import SkyblockMemberStats from './SkyblockMemberStats.js'; import SkyblockMuseum from './SkyblockMuseum.js'; import SkyblockPet from './SkyblockPet.js'; -import { - Armor, - ChocolateFactoryData, - CrimsonIsle, - Dungeons, - Equipment, - HOTM, - JacobData, - Skills, - Slayer -} from '../../Types/Skyblock.js'; -import { NetworthResult, getNetworth } from 'skyhelper-networth'; +import { type NetworthResult, getNetworth } from 'skyhelper-networth'; import { createFarmingWeightCalculator } from 'farming-weight'; import { decode, @@ -30,6 +19,17 @@ import { getSlayer } from '../../Utils/SkyblockUtils.js'; import { petScore } from '../../Utils/Constants.js'; +import type { + Armor, + ChocolateFactoryData, + CrimsonIsle, + Dungeons, + Equipment, + HOTM, + JacobData, + Skills, + Slayer +} from '../../Types/Skyblock.js'; class SkyblockMember { uuid: string; diff --git a/src/Structures/SkyBlock/SkyblockMemberStats.ts b/src/Structures/SkyBlock/SkyblockMemberStats.ts index 5b771e1d1..4d8aee79c 100644 --- a/src/Structures/SkyBlock/SkyblockMemberStats.ts +++ b/src/Structures/SkyBlock/SkyblockMemberStats.ts @@ -1,4 +1,4 @@ -import { +import type { MemberStatsAuctions, MemberStatsCandy, MemberStatsFishing, diff --git a/src/Structures/SkyBlock/SkyblockPet.ts b/src/Structures/SkyBlock/SkyblockPet.ts index ed0fa18fb..8836b71a3 100644 --- a/src/Structures/SkyBlock/SkyblockPet.ts +++ b/src/Structures/SkyBlock/SkyblockPet.ts @@ -1,5 +1,5 @@ -import { Rarity } from '../../Types/Skyblock.js'; import { petScore } from '../../Utils/Constants.js'; +import type { Rarity } from '../../Types/Skyblock.js'; class SkyblockPet { uuid: string; diff --git a/src/Structures/Static/Quest.test.ts b/src/Structures/Static/Quest.test.ts index 675aea6e1..9a284beff 100644 --- a/src/Structures/Static/Quest.test.ts +++ b/src/Structures/Static/Quest.test.ts @@ -1,7 +1,7 @@ -import Quest from './Quest'; -import QuestObjective from './QuestObjective'; +import Quest from './Quest.js'; +import QuestObjective from './QuestObjective.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type { QuestReward, QuestType } from '../../Types/Static'; +import type { QuestReward, QuestType } from '../../Types/Static.js'; test('Quest', () => { const data = new Quest({ status: 'meow' }); diff --git a/src/Types/API.d.ts b/src/Types/API.ts similarity index 100% rename from src/Types/API.d.ts rename to src/Types/API.ts diff --git a/src/Types/Booster.d.ts b/src/Types/Booster.ts similarity index 100% rename from src/Types/Booster.d.ts rename to src/Types/Booster.ts diff --git a/src/Types/Client.d.ts b/src/Types/Client.ts similarity index 100% rename from src/Types/Client.d.ts rename to src/Types/Client.ts diff --git a/src/Types/Color.d.ts b/src/Types/Color.ts similarity index 92% rename from src/Types/Color.d.ts rename to src/Types/Color.ts index f7e7429d3..cf49dd30f 100644 --- a/src/Types/Color.d.ts +++ b/src/Types/Color.ts @@ -1,4 +1,4 @@ -type ColorCode = +export type ColorCode = | 'BLACK' | 'DARK_BLUE' | 'DARK_GREEN' @@ -16,7 +16,7 @@ type ColorCode = | 'YELLOW' | 'WHITE'; -type ColorString = +export type ColorString = | 'Black' | 'Dark Blue' | 'Dark Green' @@ -34,7 +34,7 @@ type ColorString = | 'Yellow' | 'White'; -type ColorHex = +export type ColorHex = | '#000000' | '#0000AA' | '#008000' diff --git a/src/Types/Game.d.ts b/src/Types/Game.ts similarity index 100% rename from src/Types/Game.d.ts rename to src/Types/Game.ts diff --git a/src/Types/Guild.d.ts b/src/Types/Guild.ts similarity index 100% rename from src/Types/Guild.d.ts rename to src/Types/Guild.ts diff --git a/src/Types/Player.d.ts b/src/Types/Player.ts similarity index 95% rename from src/Types/Player.d.ts rename to src/Types/Player.ts index 3df4219dd..c4fb72bb7 100644 --- a/src/Types/Player.d.ts +++ b/src/Types/Player.ts @@ -1,28 +1,28 @@ // Credits: Pixelic: https://github.com/pixelicc - Most types in player -import Arcade from '../Structures/MiniGames/Arcade/Arcade.ts'; -import ArenaBrawl from '../Structures/MiniGames/ArenaBrawl/ArenaBrawl.ts'; -import BedWars from '../Structures/MiniGames/BedWars/BedWars.ts'; -import BlitzSurvivalGames from '../Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.ts'; +import Arcade from '../Structures/MiniGames/Arcade/Arcade.js'; +import ArenaBrawl from '../Structures/MiniGames/ArenaBrawl/ArenaBrawl.js'; +import BedWars from '../Structures/MiniGames/BedWars/BedWars.js'; +import BlitzSurvivalGames from '../Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.js'; import BuildBattle from '../Structures/MiniGames/BuildBattle.js'; -import CopsAndCrims from '../Structures/MiniGames/CopsAndCrims/CopsAndCrims.ts'; -import Duels from '../Structures/MiniGames/Duels/Duels.ts'; -import MegaWalls from '../Structures/MiniGames/MegaWalls/MegaWalls.ts'; -import MurderMystery from '../Structures/MiniGames/MurderMystery/MurderMystery.ts'; +import CopsAndCrims from '../Structures/MiniGames/CopsAndCrims/CopsAndCrims.js'; +import Duels from '../Structures/MiniGames/Duels/Duels.js'; +import MegaWalls from '../Structures/MiniGames/MegaWalls/MegaWalls.js'; +import MurderMystery from '../Structures/MiniGames/MurderMystery/MurderMystery.js'; import Paintball from '../Structures/MiniGames/Paintball.js'; -import Pit from '../Structures/MiniGames/Pit/Pit.ts'; -import PitInventoryItem from '../Structures/MiniGames/Pit/PitInventoryItem.ts'; -import Quakecraft from '../Structures/MiniGames/Quakecraft/Quakecraft.ts'; -import SkyWars from '../Structures/MiniGames/SkyWars/SkyWars.ts'; -import SmashHeroes from '../Structures/MiniGames/SmashHeroes/SmashHeroes.ts'; -import SpeedUHC from '../Structures/MiniGames/SpeedUHC/SpeedUHC.ts'; -import TNTGames from '../Structures/MiniGames/TNTGames/TNTGames.ts'; -import TurboKartRacers from '../Structures/MiniGames/TurboKartRacers/TurboKartRacers.ts'; -import UHC from '../Structures/MiniGames/UHC/UHC.ts'; -import VampireZ from '../Structures/MiniGames/VampireZ/VampireZ.ts'; +import Pit from '../Structures/MiniGames/Pit/Pit.js'; +import PitInventoryItem from '../Structures/MiniGames/Pit/PitInventoryItem.js'; +import Quakecraft from '../Structures/MiniGames/Quakecraft/Quakecraft.js'; +import SkyWars from '../Structures/MiniGames/SkyWars/SkyWars.js'; +import SmashHeroes from '../Structures/MiniGames/SmashHeroes/SmashHeroes.js'; +import SpeedUHC from '../Structures/MiniGames/SpeedUHC/SpeedUHC.js'; +import TNTGames from '../Structures/MiniGames/TNTGames/TNTGames.js'; +import TurboKartRacers from '../Structures/MiniGames/TurboKartRacers/TurboKartRacers.js'; +import UHC from '../Structures/MiniGames/UHC/UHC.js'; +import VampireZ from '../Structures/MiniGames/VampireZ/VampireZ.js'; import Walls from '../Structures/MiniGames/Walls.js'; -import Warlords from '../Structures/MiniGames/Warlords/Warlords.ts'; -import WoolGames from '../Structures/MiniGames/WoolGames/WoolGames.ts'; +import Warlords from '../Structures/MiniGames/Warlords/Warlords.js'; +import WoolGames from '../Structures/MiniGames/WoolGames/WoolGames.js'; export type Language = | 'CHINESE_SIMPLIFIED' diff --git a/src/Types/Requests.d.ts b/src/Types/Requests.ts similarity index 100% rename from src/Types/Requests.d.ts rename to src/Types/Requests.ts diff --git a/src/Types/Skyblock.d.ts b/src/Types/Skyblock.ts similarity index 99% rename from src/Types/Skyblock.d.ts rename to src/Types/Skyblock.ts index f3d56d41d..f3309e2bf 100644 --- a/src/Types/Skyblock.d.ts +++ b/src/Types/Skyblock.ts @@ -1,4 +1,4 @@ -import SkyblockInventoryItem from '../Structures/SkyBlock/SkyblockInventoryItem.ts'; +import SkyblockInventoryItem from '../Structures/SkyBlock/SkyblockInventoryItem.js'; export type SkyblockGemstoneQuality = 'Rough' | 'Flawed' | 'Fine' | 'Flawless' | 'Perfect'; export type TrophyFishRank = 'Bronze' | 'Silver' | 'Gold' | 'Diamond'; diff --git a/src/Types/Static.d.ts b/src/Types/Static.ts similarity index 100% rename from src/Types/Static.d.ts rename to src/Types/Static.ts diff --git a/src/Utils/Constants.ts b/src/Utils/Constants.ts index a4385abb7..80de84086 100644 --- a/src/Utils/Constants.ts +++ b/src/Utils/Constants.ts @@ -1,5 +1,5 @@ -import { GameCode, GameID, GameString } from '../Types/Game.js'; import type { DuelsBaseDivision } from '../Types/Player.js'; +import type { GameCode, GameID, GameString } from '../Types/Game.js'; export const games: { id: GameID; code: GameCode; name: GameString }[] = [ { id: 2, code: 'QUAKECRAFT', name: 'Quake' }, diff --git a/src/Utils/PlayerUtils.ts b/src/Utils/PlayerUtils.ts index 4e115bd3b..54d666ac7 100644 --- a/src/Utils/PlayerUtils.ts +++ b/src/Utils/PlayerUtils.ts @@ -1,4 +1,4 @@ -import { LevelProgress, PlayerRank } from '../Types/Player.js'; +import type { LevelProgress, PlayerRank } from '../Types/Player.js'; export function getRank(player: Record): PlayerRank { if (player.prefix) { diff --git a/src/Utils/SkyblockUtils.ts b/src/Utils/SkyblockUtils.ts index ae4837ebe..81a7daf2b 100644 --- a/src/Utils/SkyblockUtils.ts +++ b/src/Utils/SkyblockUtils.ts @@ -1,5 +1,6 @@ import Constants, { bestiaryBrackets, petLevels, petRarityOffset } from './Constants.js'; -import { +import { parse, simplify } from 'prismarine-nbt'; +import type { ChocolateFactoryData, CrimsonIsle, CrimsonIsleBelt, @@ -15,7 +16,6 @@ import { SlayerData, TrophyFishRank } from '../Types/Skyblock.js'; -import { parse, simplify } from 'prismarine-nbt'; export async function decode(base64: any, isBuffer: boolean = false): Promise { // Credit: https://github.com/SkyCryptWebsite/SkyCryptv2/blob/3b5b3ae4fe77c60eff90691797f09024baf68872/src/lib/server/stats/items/processing.ts#L215-L218 diff --git a/src/index.ts b/src/index.ts index 955b8627c..8dd57b649 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,16 +4,16 @@ import Client from './Client.js'; import Errors from './Errors.js'; -export * from './Types/API.d.js'; -export * from './Types/Booster.d.js'; -export * from './Types/Client.d.js'; -export * from './Types/Color.d.js'; -export * from './Types/Game.d.js'; -export * from './Types/Guild.d.js'; -export * from './Types/Player.d.js'; -export * from './Types/Requests.d.js'; -export * from './Types/Skyblock.d.js'; -export * from './Types/Static.d.js'; +export * from './Types/API.js'; +export * from './Types/Booster.js'; +export * from './Types/Client.js'; +export * from './Types/Color.js'; +export * from './Types/Game.js'; +export * from './Types/Guild.js'; +export * from './Types/Player.js'; +export * from './Types/Requests.js'; +export * from './Types/Skyblock.js'; +export * from './Types/Static.js'; import Achievements from './Structures/Static/Achievements/Achievements.js'; import Arcade from './Structures/MiniGames/Arcade/Arcade.js'; diff --git a/tsconfig.json b/tsconfig.json index a2752f1d8..4d8e1ecab 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,27 +1,28 @@ { "compilerOptions": { "esModuleInterop": true, - "allowJs": false, - + "skipLibCheck": true, "target": "ES2022", + "allowJs": false, + "resolveJsonModule": true, "moduleDetection": "force", - "moduleResolution": "NodeNext", - "module": "NodeNext", - - "rootDir": "./src", - "outDir": "./dist", - "declaration": true, - "sourceMap": true, + "isolatedModules": true, + "verbatimModuleSyntax": true, "strict": true, "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + + "module": "NodeNext", + "moduleResolution": "NodeNext", + "outDir": "dist", + "rootDir": "src", + + "sourceMap": true, + "declaration": true, "forceConsistentCasingInFileNames": true, "noUnusedLocals": true, - "resolveJsonModule": true, - "noFallthroughCasesInSwitch": true, - "declarationMap": true, - - "lib": ["ES2022"] + "noFallthroughCasesInSwitch": true }, "include": ["src/**/*"], "exclude": ["node_modules/", "src/**/*.test.ts"] From bc615207e0c70be10f3bc4f53c497a74d21d4b85 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 23 Jan 2025 10:19:06 +0800 Subject: [PATCH 004/124] chore(deps): Update all non-major dependencies (#655) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 22 +-- pnpm-lock.yaml | 469 ++++++++++++++++++++++++++----------------------- 2 files changed, 258 insertions(+), 233 deletions(-) diff --git a/package.json b/package.json index 1d32b0cec..df2ff1bc1 100644 --- a/package.json +++ b/package.json @@ -34,11 +34,11 @@ "packageManager": "pnpm@9.7.1", "author": "Kathund", "dependencies": { - "farming-weight": "^0.7.1", + "farming-weight": "^0.8.1", "node-cache": "^5.1.2", - "prismarine-nbt": "^2.6.0", + "prismarine-nbt": "^2.7.0", "rss-parser": "^3.13.0", - "skyhelper-networth": "^1.26.0" + "skyhelper-networth": "^1.27.1" }, "license": "MIT", "readme": "https://github.com/Hypixel-API-Reborn/hypixel-api-reborn?tab=readme-ov-file#hypixel-api--reborn", @@ -51,23 +51,23 @@ "publisher": "Kathund", "devDependencies": { "@8hobbies/typedoc-plugin-404": "^3.1.0", - "@eslint/js": "^9.16.0", + "@eslint/js": "^9.18.0", "@j4cobi/eslint-plugin-sort-imports": "^1.0.2", "@types/eslint": "^9.6.1", - "@types/node": "^22.10.1", + "@types/node": "^22.10.8", "@types/xml2js": "^0.4.14", "@vitest/coverage-v8": "^2.1.8", "@vitest/ui": "^2.1.8", "dotenv": "^16.4.7", - "eslint": "^9.16.0", + "eslint": "^9.18.0", "eslint-config-prettier": "^9.1.0", - "globals": "^15.13.0", + "globals": "^15.14.0", "prettier": "^3.4.2", - "typedoc": "^0.27.3", - "typedoc-material-theme": "^1.2.0", + "typedoc": "^0.27.6", + "typedoc-material-theme": "^1.3.0", "typedoc-plugin-rename-defaults": "^0.7.2", - "typescript": "^5.7.2", - "typescript-eslint": "^8.17.0", + "typescript": "^5.7.3", + "typescript-eslint": "^8.21.0", "vitest": "^2.1.8", "xml2js": "^0.6.2" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1abfa5cb4..c345872a4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,42 +9,42 @@ importers: .: dependencies: farming-weight: - specifier: ^0.7.1 - version: 0.7.1 + specifier: ^0.8.1 + version: 0.8.1 node-cache: specifier: ^5.1.2 version: 5.1.2 prismarine-nbt: - specifier: ^2.6.0 - version: 2.6.0 + specifier: ^2.7.0 + version: 2.7.0 rss-parser: specifier: ^3.13.0 version: 3.13.0 skyhelper-networth: - specifier: ^1.26.0 - version: 1.26.0 + specifier: ^1.27.1 + version: 1.27.1 devDependencies: '@8hobbies/typedoc-plugin-404': specifier: ^3.1.0 - version: 3.1.0(typedoc@0.27.3(typescript@5.7.2)) + version: 3.1.0(typedoc@0.27.6(typescript@5.7.3)) '@eslint/js': - specifier: ^9.16.0 - version: 9.16.0 + specifier: ^9.18.0 + version: 9.18.0 '@j4cobi/eslint-plugin-sort-imports': specifier: ^1.0.2 - version: 1.0.2(eslint@9.16.0)(typescript@5.7.2) + version: 1.0.2(eslint@9.18.0)(typescript@5.7.3) '@types/eslint': specifier: ^9.6.1 version: 9.6.1 '@types/node': - specifier: ^22.10.1 - version: 22.10.1 + specifier: ^22.10.8 + version: 22.10.8 '@types/xml2js': specifier: ^0.4.14 version: 0.4.14 '@vitest/coverage-v8': specifier: ^2.1.8 - version: 2.1.8(vitest@2.1.8(@types/node@22.10.1)(@vitest/ui@2.1.8)) + version: 2.1.8(vitest@2.1.8(@types/node@22.10.8)(@vitest/ui@2.1.8)) '@vitest/ui': specifier: ^2.1.8 version: 2.1.8(vitest@2.1.8) @@ -52,35 +52,35 @@ importers: specifier: ^16.4.7 version: 16.4.7 eslint: - specifier: ^9.16.0 - version: 9.16.0 + specifier: ^9.18.0 + version: 9.18.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@9.16.0) + version: 9.1.0(eslint@9.18.0) globals: - specifier: ^15.13.0 - version: 15.13.0 + specifier: ^15.14.0 + version: 15.14.0 prettier: specifier: ^3.4.2 version: 3.4.2 typedoc: - specifier: ^0.27.3 - version: 0.27.3(typescript@5.7.2) + specifier: ^0.27.6 + version: 0.27.6(typescript@5.7.3) typedoc-material-theme: - specifier: ^1.2.0 - version: 1.2.0(typedoc@0.27.3(typescript@5.7.2)) + specifier: ^1.3.0 + version: 1.3.0(typedoc@0.27.6(typescript@5.7.3)) typedoc-plugin-rename-defaults: specifier: ^0.7.2 - version: 0.7.2(typedoc@0.27.3(typescript@5.7.2)) + version: 0.7.2(typedoc@0.27.6(typescript@5.7.3)) typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 typescript-eslint: - specifier: ^8.17.0 - version: 8.17.0(eslint@9.16.0)(typescript@5.7.2) + specifier: ^8.21.0 + version: 8.21.0(eslint@9.18.0)(typescript@5.7.3) vitest: specifier: ^2.1.8 - version: 2.1.8(@types/node@22.10.1)(@vitest/ui@2.1.8) + version: 2.1.8(@types/node@22.10.8)(@vitest/ui@2.1.8) xml2js: specifier: ^0.6.2 version: 0.6.2 @@ -269,24 +269,24 @@ packages: resolution: {integrity: sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.9.0': - resolution: {integrity: sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==} + '@eslint/core@0.10.0': + resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.2.0': resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.16.0': - resolution: {integrity: sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==} + '@eslint/js@9.18.0': + resolution: {integrity: sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.4': resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.3': - resolution: {integrity: sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==} + '@eslint/plugin-kit@0.2.5': + resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@gerrit0/mini-shiki@1.24.0': @@ -467,8 +467,8 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@22.10.1': - resolution: {integrity: sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==} + '@types/node@22.10.8': + resolution: {integrity: sha512-rk+QvAEGsbX/ZPiiyel6hJHNUS9cnSbPWVaZLvE+Er3tLqQFzWMz9JOfWW7XUmKvRPfxJfbl3qYWve+RGXncFw==} '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -476,51 +476,42 @@ packages: '@types/xml2js@0.4.14': resolution: {integrity: sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==} - '@typescript-eslint/eslint-plugin@8.17.0': - resolution: {integrity: sha512-HU1KAdW3Tt8zQkdvNoIijfWDMvdSweFYm4hWh+KwhPstv+sCmWb89hCIP8msFm9N1R/ooh9honpSuvqKWlYy3w==} + '@typescript-eslint/eslint-plugin@8.21.0': + resolution: {integrity: sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.17.0': - resolution: {integrity: sha512-Drp39TXuUlD49F7ilHHCG7TTg8IkA+hxCuULdmzWYICxGXvDXmDmWEjJYZQYgf6l/TFfYNE167m7isnc3xlIEg==} + '@typescript-eslint/parser@8.21.0': + resolution: {integrity: sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' '@typescript-eslint/scope-manager@8.16.0': resolution: {integrity: sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.17.0': - resolution: {integrity: sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg==} + '@typescript-eslint/scope-manager@8.21.0': + resolution: {integrity: sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.17.0': - resolution: {integrity: sha512-q38llWJYPd63rRnJ6wY/ZQqIzPrBCkPdpIsaCfkR3Q4t3p6sb422zougfad4TFW9+ElIFLVDzWGiGAfbb/v2qw==} + '@typescript-eslint/type-utils@8.21.0': + resolution: {integrity: sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' '@typescript-eslint/types@8.16.0': resolution: {integrity: sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.17.0': - resolution: {integrity: sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA==} + '@typescript-eslint/types@8.21.0': + resolution: {integrity: sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@8.16.0': @@ -532,14 +523,11 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.17.0': - resolution: {integrity: sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw==} + '@typescript-eslint/typescript-estree@8.21.0': + resolution: {integrity: sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' '@typescript-eslint/utils@8.16.0': resolution: {integrity: sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA==} @@ -551,22 +539,19 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.17.0': - resolution: {integrity: sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w==} + '@typescript-eslint/utils@8.21.0': + resolution: {integrity: sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' '@typescript-eslint/visitor-keys@8.16.0': resolution: {integrity: sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.17.0': - resolution: {integrity: sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg==} + '@typescript-eslint/visitor-keys@8.21.0': + resolution: {integrity: sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitest/coverage-v8@2.1.8': @@ -612,6 +597,10 @@ packages: '@vitest/utils@2.1.8': resolution: {integrity: sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==} + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -657,6 +646,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -667,6 +659,9 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -783,8 +778,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.16.0: - resolution: {integrity: sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==} + eslint@9.18.0: + resolution: {integrity: sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -816,12 +811,20 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + expect-type@1.1.0: resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} engines: {node: '>=12.0.0'} - farming-weight@0.7.1: - resolution: {integrity: sha512-C7ANMZg9JmnGLpxh7O9oYHX0PTmQlQS/WKuPIuVCdeWRT87ulg1gvwfS16gh8FpFN+Hzk+k1kBgVy/H3C8W6aw==} + farming-weight@0.8.1: + resolution: {integrity: sha512-0uV1TPkmOa+DA7l6P3JTdm7YBKJWunUn/XMN4FrbEgIehD7681jQgO6kjUIqFcHIZG3EaQ4FLH36emI60wCR+Q==} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -907,8 +910,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.13.0: - resolution: {integrity: sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==} + globals@15.14.0: + resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} engines: {node: '>=18'} graphemer@1.4.0: @@ -921,6 +924,9 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} @@ -933,9 +939,6 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -1144,15 +1147,19 @@ packages: engines: {node: '>=14'} hasBin: true - prismarine-nbt@2.6.0: - resolution: {integrity: sha512-z65ijm6hVlYOmhg8IEzdYfUz1u3AOiQtzyTSAwD8NLBCr96ZUPtUH5o/6sGAoDaN+rkDe0DNBCiO7bvXXO1fkQ==} + prismarine-nbt@2.7.0: + resolution: {integrity: sha512-Du9OLQAcCj3y29YtewOJbbV4ARaSUEJiTguw0PPQbPBy83f+eCyDRkyBpnXTi/KPyEpgYCzsjGzElevLpFoYGQ==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} protodef-validator@1.3.1: resolution: {integrity: sha512-lZ5FWKZYR9xOjpMw1+EfZRfCjzNRQWPq+Dk+jki47Sikl2EeWEPnTfnJERwnU/EwFq6us+0zqHHzSsmLeYX+Lg==} hasBin: true - protodef@1.15.0: - resolution: {integrity: sha512-bZ2Omw8dT+DACjJHLrBWZlqN4MlT9g9oSpJDdkUAJOStUzgJp+Zn42FJfPUdwutUxjaxA0PftN0PDlNa2XbneA==} + protodef@1.18.0: + resolution: {integrity: sha512-jO64lkzkh0dYc0AVWCU/GzCKwqhFFIz1kfEz0NBf0RUuRNcmvgKbopabJdfZ6W8NvALdySUXgEhvKDZPhdBwrg==} engines: {node: '>=14'} proxy-from-env@1.1.0: @@ -1169,9 +1176,9 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} @@ -1222,8 +1229,8 @@ packages: resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} engines: {node: '>=18'} - skyhelper-networth@1.26.0: - resolution: {integrity: sha512-QkBfMKt+tref6D3T+zmKzWwjJ135QEigXN/VpEmlD0FK0mJPSxuBxvnDYe3F9r3UyWpXVP7w6tge4s9tA8Hc1Q==} + skyhelper-networth@1.27.1: + resolution: {integrity: sha512-EUXKQUs25nKUxV8EyBfIJLZMtSUYuhnoFCG3W4iN9ERbsmgEHeUs+HrftqzEMf760HK7CSSQWHW9X7gUz95YuQ==} source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} @@ -1302,40 +1309,43 @@ packages: peerDependencies: typescript: '>=4.2.0' + ts-api-utils@2.0.0: + resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - typedoc-material-theme@1.2.0: - resolution: {integrity: sha512-pZ07hqdxbyRtM+Tsu0s8BFLdANAyh2CWF0J2X07B9ldmvwbmVEfNdgpE0EYky/oFah9shv2o/KjElPtpnQi1+w==} + typedoc-material-theme@1.3.0: + resolution: {integrity: sha512-4vY68NUBBkMc3gKAltDtvT0KbIYX1uaFAT/3brDwhnUxhfTiYRtfg8VXR2lr8f+9VNDh7BfEtj8gpRO7Y93TWQ==} engines: {node: '>=18.0.0', npm: '>=8.6.0'} peerDependencies: - typedoc: ^0.25.13 || ^0.26.x + typedoc: ^0.25.13 || ^0.26.x || ^0.27.x typedoc-plugin-rename-defaults@0.7.2: resolution: {integrity: sha512-9oa1CsMN4p/xuVR2JW2YDD6xE7JcrIth3KAfjR8YBi6NnrDk2Q72o4lbArybLDjxKAkOzk7N1uUdGwJlooLEOg==} peerDependencies: typedoc: '>=0.22.x <0.28.x' - typedoc@0.27.3: - resolution: {integrity: sha512-oWT7zDS5oIaxYL5yOikBX4cL99CpNAZn6mI24JZQxsYuIHbtguSSwJ7zThuzNNwSE0wqhlfTSd99HgqKu2aQXQ==} + typedoc@0.27.6: + resolution: {integrity: sha512-oBFRoh2Px6jFx366db0lLlihcalq/JzyCVp7Vaq1yphL/tbgx2e+bkpkCgJPunaPvPwoTOXSwasfklWHm7GfAw==} engines: {node: '>= 18'} hasBin: true peerDependencies: typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x - typescript-eslint@8.17.0: - resolution: {integrity: sha512-409VXvFd/f1br1DCbuKNFqQpXICoTB+V51afcwG1pn1a3Cp92MqAUges3YjwEdQ0cMUoCIodjVDAYzyD8h3SYA==} + typescript-eslint@8.21.0: + resolution: {integrity: sha512-txEKYY4XMKwPXxNkN8+AxAdX6iIJAPiJbHE/FpQccs/sxw8Lf26kqwC3cn0xkHlW8kEbLhkhCsjWuMveaY9Rxw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' - typescript@5.7.2: - resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} engines: {node: '>=14.17'} hasBin: true @@ -1348,9 +1358,6 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - vite-node@2.1.8: resolution: {integrity: sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==} engines: {node: ^18.0.0 || >=20.0.0} @@ -1457,9 +1464,9 @@ packages: snapshots: - '@8hobbies/typedoc-plugin-404@3.1.0(typedoc@0.27.3(typescript@5.7.2))': + '@8hobbies/typedoc-plugin-404@3.1.0(typedoc@0.27.6(typescript@5.7.3))': dependencies: - typedoc: 0.27.3(typescript@5.7.2) + typedoc: 0.27.6(typescript@5.7.3) '@ampproject/remapping@2.3.0': dependencies: @@ -1550,9 +1557,9 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.16.0)': + '@eslint-community/eslint-utils@4.4.0(eslint@9.18.0)': dependencies: - eslint: 9.16.0 + eslint: 9.18.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -1565,7 +1572,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/core@0.9.0': {} + '@eslint/core@0.10.0': + dependencies: + '@types/json-schema': 7.0.15 '@eslint/eslintrc@3.2.0': dependencies: @@ -1581,12 +1590,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.16.0': {} + '@eslint/js@9.18.0': {} '@eslint/object-schema@2.1.4': {} - '@eslint/plugin-kit@0.2.3': + '@eslint/plugin-kit@0.2.5': dependencies: + '@eslint/core': 0.10.0 levn: 0.4.1 '@gerrit0/mini-shiki@1.24.0': @@ -1619,9 +1629,9 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@j4cobi/eslint-plugin-sort-imports@1.0.2(eslint@9.16.0)(typescript@5.7.2)': + '@j4cobi/eslint-plugin-sort-imports@1.0.2(eslint@9.18.0)(typescript@5.7.3)': dependencies: - '@typescript-eslint/utils': 8.16.0(eslint@9.16.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.16.0(eslint@9.18.0)(typescript@5.7.3) transitivePeerDependencies: - eslint - supports-color @@ -1738,7 +1748,7 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@22.10.1': + '@types/node@22.10.8': dependencies: undici-types: 6.20.0 @@ -1746,36 +1756,34 @@ snapshots: '@types/xml2js@0.4.14': dependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.8 - '@typescript-eslint/eslint-plugin@8.17.0(@typescript-eslint/parser@8.17.0(eslint@9.16.0)(typescript@5.7.2))(eslint@9.16.0)(typescript@5.7.2)': + '@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.17.0(eslint@9.16.0)(typescript@5.7.2) - '@typescript-eslint/scope-manager': 8.17.0 - '@typescript-eslint/type-utils': 8.17.0(eslint@9.16.0)(typescript@5.7.2) - '@typescript-eslint/utils': 8.17.0(eslint@9.16.0)(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.17.0 - eslint: 9.16.0 + '@typescript-eslint/parser': 8.21.0(eslint@9.18.0)(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.21.0 + '@typescript-eslint/type-utils': 8.21.0(eslint@9.18.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.21.0(eslint@9.18.0)(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.21.0 + eslint: 9.18.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.7.2) - optionalDependencies: - typescript: 5.7.2 + ts-api-utils: 2.0.0(typescript@5.7.3) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.17.0(eslint@9.16.0)(typescript@5.7.2)': + '@typescript-eslint/parser@8.21.0(eslint@9.18.0)(typescript@5.7.3)': dependencies: - '@typescript-eslint/scope-manager': 8.17.0 - '@typescript-eslint/types': 8.17.0 - '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.17.0 + '@typescript-eslint/scope-manager': 8.21.0 + '@typescript-eslint/types': 8.21.0 + '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.21.0 debug: 4.3.7 - eslint: 9.16.0 - optionalDependencies: - typescript: 5.7.2 + eslint: 9.18.0 + typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -1784,28 +1792,27 @@ snapshots: '@typescript-eslint/types': 8.16.0 '@typescript-eslint/visitor-keys': 8.16.0 - '@typescript-eslint/scope-manager@8.17.0': + '@typescript-eslint/scope-manager@8.21.0': dependencies: - '@typescript-eslint/types': 8.17.0 - '@typescript-eslint/visitor-keys': 8.17.0 + '@typescript-eslint/types': 8.21.0 + '@typescript-eslint/visitor-keys': 8.21.0 - '@typescript-eslint/type-utils@8.17.0(eslint@9.16.0)(typescript@5.7.2)': + '@typescript-eslint/type-utils@8.21.0(eslint@9.18.0)(typescript@5.7.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.7.2) - '@typescript-eslint/utils': 8.17.0(eslint@9.16.0)(typescript@5.7.2) + '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) + '@typescript-eslint/utils': 8.21.0(eslint@9.18.0)(typescript@5.7.3) debug: 4.3.7 - eslint: 9.16.0 - ts-api-utils: 1.3.0(typescript@5.7.2) - optionalDependencies: - typescript: 5.7.2 + eslint: 9.18.0 + ts-api-utils: 2.0.0(typescript@5.7.3) + typescript: 5.7.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.16.0': {} - '@typescript-eslint/types@8.17.0': {} + '@typescript-eslint/types@8.21.0': {} - '@typescript-eslint/typescript-estree@8.16.0(typescript@5.7.2)': + '@typescript-eslint/typescript-estree@8.16.0(typescript@5.7.3)': dependencies: '@typescript-eslint/types': 8.16.0 '@typescript-eslint/visitor-keys': 8.16.0 @@ -1814,48 +1821,46 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.7.2) + ts-api-utils: 1.3.0(typescript@5.7.3) optionalDependencies: - typescript: 5.7.2 + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.17.0(typescript@5.7.2)': + '@typescript-eslint/typescript-estree@8.21.0(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.17.0 - '@typescript-eslint/visitor-keys': 8.17.0 + '@typescript-eslint/types': 8.21.0 + '@typescript-eslint/visitor-keys': 8.21.0 debug: 4.3.7 fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.7.2) - optionalDependencies: - typescript: 5.7.2 + ts-api-utils: 2.0.0(typescript@5.7.3) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.16.0(eslint@9.16.0)(typescript@5.7.2)': + '@typescript-eslint/utils@8.16.0(eslint@9.18.0)(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.16.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.18.0) '@typescript-eslint/scope-manager': 8.16.0 '@typescript-eslint/types': 8.16.0 - '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.7.2) - eslint: 9.16.0 + '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.7.3) + eslint: 9.18.0 optionalDependencies: - typescript: 5.7.2 + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.17.0(eslint@9.16.0)(typescript@5.7.2)': + '@typescript-eslint/utils@8.21.0(eslint@9.18.0)(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.16.0) - '@typescript-eslint/scope-manager': 8.17.0 - '@typescript-eslint/types': 8.17.0 - '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.7.2) - eslint: 9.16.0 - optionalDependencies: - typescript: 5.7.2 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.18.0) + '@typescript-eslint/scope-manager': 8.21.0 + '@typescript-eslint/types': 8.21.0 + '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) + eslint: 9.18.0 + typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -1864,12 +1869,12 @@ snapshots: '@typescript-eslint/types': 8.16.0 eslint-visitor-keys: 4.2.0 - '@typescript-eslint/visitor-keys@8.17.0': + '@typescript-eslint/visitor-keys@8.21.0': dependencies: - '@typescript-eslint/types': 8.17.0 + '@typescript-eslint/types': 8.21.0 eslint-visitor-keys: 4.2.0 - '@vitest/coverage-v8@2.1.8(vitest@2.1.8(@types/node@22.10.1)(@vitest/ui@2.1.8))': + '@vitest/coverage-v8@2.1.8(vitest@2.1.8(@types/node@22.10.8)(@vitest/ui@2.1.8))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -1883,7 +1888,7 @@ snapshots: std-env: 3.8.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 2.1.8(@types/node@22.10.1)(@vitest/ui@2.1.8) + vitest: 2.1.8(@types/node@22.10.8)(@vitest/ui@2.1.8) transitivePeerDependencies: - supports-color @@ -1894,13 +1899,13 @@ snapshots: chai: 5.1.2 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.8(vite@5.4.0(@types/node@22.10.1))': + '@vitest/mocker@2.1.8(vite@5.4.0(@types/node@22.10.8))': dependencies: '@vitest/spy': 2.1.8 estree-walker: 3.0.3 magic-string: 0.30.12 optionalDependencies: - vite: 5.4.0(@types/node@22.10.1) + vite: 5.4.0(@types/node@22.10.8) '@vitest/pretty-format@2.1.8': dependencies: @@ -1930,7 +1935,7 @@ snapshots: sirv: 3.0.0 tinyglobby: 0.2.10 tinyrainbow: 1.2.0 - vitest: 2.1.8(@types/node@22.10.1)(@vitest/ui@2.1.8) + vitest: 2.1.8(@types/node@22.10.8)(@vitest/ui@2.1.8) '@vitest/utils@2.1.8': dependencies: @@ -1938,6 +1943,10 @@ snapshots: loupe: 3.1.2 tinyrainbow: 1.2.0 + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + acorn-jsx@5.3.2(acorn@8.14.0): dependencies: acorn: 8.14.0 @@ -1977,6 +1986,8 @@ snapshots: balanced-match@1.0.2: {} + base64-js@1.5.1: {} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -1990,6 +2001,11 @@ snapshots: dependencies: fill-range: 7.1.1 + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + cac@6.7.14: {} callsites@3.1.0: {} @@ -2083,9 +2099,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@9.1.0(eslint@9.16.0): + eslint-config-prettier@9.1.0(eslint@9.18.0): dependencies: - eslint: 9.16.0 + eslint: 9.18.0 eslint-scope@8.2.0: dependencies: @@ -2096,15 +2112,15 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.16.0: + eslint@9.18.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.16.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.18.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.0 - '@eslint/core': 0.9.0 + '@eslint/core': 0.10.0 '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.16.0 - '@eslint/plugin-kit': 0.2.3 + '@eslint/js': 9.18.0 + '@eslint/plugin-kit': 0.2.5 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.1 @@ -2157,9 +2173,13 @@ snapshots: esutils@2.0.3: {} + event-target-shim@5.0.1: {} + + events@3.3.0: {} + expect-type@1.1.0: {} - farming-weight@0.7.1: {} + farming-weight@0.8.1: {} fast-deep-equal@3.1.3: {} @@ -2240,7 +2260,7 @@ snapshots: globals@14.0.0: {} - globals@15.13.0: {} + globals@15.14.0: {} graphemer@1.4.0: {} @@ -2248,6 +2268,8 @@ snapshots: html-escaper@2.0.2: {} + ieee754@1.2.1: {} + ignore@5.3.1: {} import-fresh@3.3.0: @@ -2257,8 +2279,6 @@ snapshots: imurmurhash@0.1.4: {} - inherits@2.0.4: {} - is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -2449,20 +2469,22 @@ snapshots: prettier@3.4.2: {} - prismarine-nbt@2.6.0: + prismarine-nbt@2.7.0: dependencies: - protodef: 1.15.0 + protodef: 1.18.0 + + process@0.11.10: {} protodef-validator@1.3.1: dependencies: ajv: 6.12.6 - protodef@1.15.0: + protodef@1.18.0: dependencies: lodash.get: 4.4.2 lodash.reduce: 4.6.0 protodef-validator: 1.3.1 - readable-stream: 3.6.2 + readable-stream: 4.7.0 proxy-from-env@1.1.0: {} @@ -2472,11 +2494,13 @@ snapshots: queue-microtask@1.2.3: {} - readable-stream@3.6.2: + readable-stream@4.7.0: dependencies: - inherits: 2.0.4 + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 string_decoder: 1.3.0 - util-deprecate: 1.0.2 resolve-from@4.0.0: {} @@ -2535,10 +2559,10 @@ snapshots: mrmime: 2.0.0 totalist: 3.0.1 - skyhelper-networth@1.26.0: + skyhelper-networth@1.27.1: dependencies: axios: 1.7.7 - prismarine-nbt: 2.6.0 + prismarine-nbt: 2.7.0 transitivePeerDependencies: - debug @@ -2605,45 +2629,48 @@ snapshots: totalist@3.0.1: {} - ts-api-utils@1.3.0(typescript@5.7.2): + ts-api-utils@1.3.0(typescript@5.7.3): dependencies: - typescript: 5.7.2 + typescript: 5.7.3 + + ts-api-utils@2.0.0(typescript@5.7.3): + dependencies: + typescript: 5.7.3 type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - typedoc-material-theme@1.2.0(typedoc@0.27.3(typescript@5.7.2)): + typedoc-material-theme@1.3.0(typedoc@0.27.6(typescript@5.7.3)): dependencies: '@material/material-color-utilities': 0.3.0 - typedoc: 0.27.3(typescript@5.7.2) + typedoc: 0.27.6(typescript@5.7.3) - typedoc-plugin-rename-defaults@0.7.2(typedoc@0.27.3(typescript@5.7.2)): + typedoc-plugin-rename-defaults@0.7.2(typedoc@0.27.6(typescript@5.7.3)): dependencies: camelcase: 8.0.0 - typedoc: 0.27.3(typescript@5.7.2) + typedoc: 0.27.6(typescript@5.7.3) - typedoc@0.27.3(typescript@5.7.2): + typedoc@0.27.6(typescript@5.7.3): dependencies: '@gerrit0/mini-shiki': 1.24.0 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 - typescript: 5.7.2 + typescript: 5.7.3 yaml: 2.6.1 - typescript-eslint@8.17.0(eslint@9.16.0)(typescript@5.7.2): + typescript-eslint@8.21.0(eslint@9.18.0)(typescript@5.7.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.17.0(@typescript-eslint/parser@8.17.0(eslint@9.16.0)(typescript@5.7.2))(eslint@9.16.0)(typescript@5.7.2) - '@typescript-eslint/parser': 8.17.0(eslint@9.16.0)(typescript@5.7.2) - '@typescript-eslint/utils': 8.17.0(eslint@9.16.0)(typescript@5.7.2) - eslint: 9.16.0 - optionalDependencies: - typescript: 5.7.2 + '@typescript-eslint/eslint-plugin': 8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3) + '@typescript-eslint/parser': 8.21.0(eslint@9.18.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.21.0(eslint@9.18.0)(typescript@5.7.3) + eslint: 9.18.0 + typescript: 5.7.3 transitivePeerDependencies: - supports-color - typescript@5.7.2: {} + typescript@5.7.3: {} uc.micro@2.1.0: {} @@ -2653,15 +2680,13 @@ snapshots: dependencies: punycode: 2.3.1 - util-deprecate@1.0.2: {} - - vite-node@2.1.8(@types/node@22.10.1): + vite-node@2.1.8(@types/node@22.10.8): dependencies: cac: 6.7.14 debug: 4.3.7 es-module-lexer: 1.5.4 pathe: 1.1.2 - vite: 5.4.0(@types/node@22.10.1) + vite: 5.4.0(@types/node@22.10.8) transitivePeerDependencies: - '@types/node' - less @@ -2673,19 +2698,19 @@ snapshots: - supports-color - terser - vite@5.4.0(@types/node@22.10.1): + vite@5.4.0(@types/node@22.10.8): dependencies: esbuild: 0.21.5 postcss: 8.4.41 rollup: 4.20.0 optionalDependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.8 fsevents: 2.3.3 - vitest@2.1.8(@types/node@22.10.1)(@vitest/ui@2.1.8): + vitest@2.1.8(@types/node@22.10.8)(@vitest/ui@2.1.8): dependencies: '@vitest/expect': 2.1.8 - '@vitest/mocker': 2.1.8(vite@5.4.0(@types/node@22.10.1)) + '@vitest/mocker': 2.1.8(vite@5.4.0(@types/node@22.10.8)) '@vitest/pretty-format': 2.1.8 '@vitest/runner': 2.1.8 '@vitest/snapshot': 2.1.8 @@ -2701,11 +2726,11 @@ snapshots: tinyexec: 0.3.1 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.0(@types/node@22.10.1) - vite-node: 2.1.8(@types/node@22.10.1) + vite: 5.4.0(@types/node@22.10.8) + vite-node: 2.1.8(@types/node@22.10.8) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.8 '@vitest/ui': 2.1.8(vitest@2.1.8) transitivePeerDependencies: - less From d4d2cdcb83f38c9110b3cbfe4f23bb9272530bfa Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 23 Jan 2025 02:20:58 +0000 Subject: [PATCH 005/124] chore(deps): update dependency eslint-config-prettier to v10 (#657) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index df2ff1bc1..5b9ebb0b0 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "@vitest/ui": "^2.1.8", "dotenv": "^16.4.7", "eslint": "^9.18.0", - "eslint-config-prettier": "^9.1.0", + "eslint-config-prettier": "^10.0.1", "globals": "^15.14.0", "prettier": "^3.4.2", "typedoc": "^0.27.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c345872a4..e7cae59dc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -55,8 +55,8 @@ importers: specifier: ^9.18.0 version: 9.18.0 eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@9.18.0) + specifier: ^10.0.1 + version: 10.0.1(eslint@9.18.0) globals: specifier: ^15.14.0 version: 15.14.0 @@ -760,8 +760,8 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-prettier@9.1.0: - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + eslint-config-prettier@10.0.1: + resolution: {integrity: sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==} hasBin: true peerDependencies: eslint: '>=7.0.0' @@ -2099,7 +2099,7 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@9.1.0(eslint@9.18.0): + eslint-config-prettier@10.0.1(eslint@9.18.0): dependencies: eslint: 9.18.0 From 098e6c26711f1e974e56fe58a7cee3f62a358d00 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 10 Mar 2025 13:18:55 +0800 Subject: [PATCH 006/124] chore(deps): Update all non-major dependencies (#659) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 28 +-- pnpm-lock.yaml | 522 +++++++++++++++++++++++++------------------------ 2 files changed, 279 insertions(+), 271 deletions(-) diff --git a/package.json b/package.json index 5b9ebb0b0..2071749ad 100644 --- a/package.json +++ b/package.json @@ -34,11 +34,11 @@ "packageManager": "pnpm@9.7.1", "author": "Kathund", "dependencies": { - "farming-weight": "^0.8.1", + "farming-weight": "^0.8.2", "node-cache": "^5.1.2", "prismarine-nbt": "^2.7.0", "rss-parser": "^3.13.0", - "skyhelper-networth": "^1.27.1" + "skyhelper-networth": "^1.27.3" }, "license": "MIT", "readme": "https://github.com/Hypixel-API-Reborn/hypixel-api-reborn?tab=readme-ov-file#hypixel-api--reborn", @@ -51,24 +51,24 @@ "publisher": "Kathund", "devDependencies": { "@8hobbies/typedoc-plugin-404": "^3.1.0", - "@eslint/js": "^9.18.0", + "@eslint/js": "^9.22.0", "@j4cobi/eslint-plugin-sort-imports": "^1.0.2", "@types/eslint": "^9.6.1", - "@types/node": "^22.10.8", + "@types/node": "^22.13.10", "@types/xml2js": "^0.4.14", - "@vitest/coverage-v8": "^2.1.8", - "@vitest/ui": "^2.1.8", + "@vitest/coverage-v8": "^2.1.9", + "@vitest/ui": "^2.1.9", "dotenv": "^16.4.7", - "eslint": "^9.18.0", - "eslint-config-prettier": "^10.0.1", - "globals": "^15.14.0", - "prettier": "^3.4.2", - "typedoc": "^0.27.6", + "eslint": "^9.22.0", + "eslint-config-prettier": "^10.1.1", + "globals": "^15.15.0", + "prettier": "^3.5.3", + "typedoc": "^0.27.9", "typedoc-material-theme": "^1.3.0", "typedoc-plugin-rename-defaults": "^0.7.2", - "typescript": "^5.7.3", - "typescript-eslint": "^8.21.0", - "vitest": "^2.1.8", + "typescript": "^5.8.2", + "typescript-eslint": "^8.26.0", + "vitest": "^2.1.9", "xml2js": "^0.6.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e7cae59dc..836bde897 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: farming-weight: - specifier: ^0.8.1 - version: 0.8.1 + specifier: ^0.8.2 + version: 0.8.2 node-cache: specifier: ^5.1.2 version: 5.1.2 @@ -21,66 +21,66 @@ importers: specifier: ^3.13.0 version: 3.13.0 skyhelper-networth: - specifier: ^1.27.1 - version: 1.27.1 + specifier: ^1.27.3 + version: 1.27.3 devDependencies: '@8hobbies/typedoc-plugin-404': specifier: ^3.1.0 - version: 3.1.0(typedoc@0.27.6(typescript@5.7.3)) + version: 3.1.0(typedoc@0.27.9(typescript@5.8.2)) '@eslint/js': - specifier: ^9.18.0 - version: 9.18.0 + specifier: ^9.22.0 + version: 9.22.0 '@j4cobi/eslint-plugin-sort-imports': specifier: ^1.0.2 - version: 1.0.2(eslint@9.18.0)(typescript@5.7.3) + version: 1.0.2(eslint@9.22.0)(typescript@5.8.2) '@types/eslint': specifier: ^9.6.1 version: 9.6.1 '@types/node': - specifier: ^22.10.8 - version: 22.10.8 + specifier: ^22.13.10 + version: 22.13.10 '@types/xml2js': specifier: ^0.4.14 version: 0.4.14 '@vitest/coverage-v8': - specifier: ^2.1.8 - version: 2.1.8(vitest@2.1.8(@types/node@22.10.8)(@vitest/ui@2.1.8)) + specifier: ^2.1.9 + version: 2.1.9(vitest@2.1.9(@types/node@22.13.10)(@vitest/ui@2.1.9)) '@vitest/ui': - specifier: ^2.1.8 - version: 2.1.8(vitest@2.1.8) + specifier: ^2.1.9 + version: 2.1.9(vitest@2.1.9) dotenv: specifier: ^16.4.7 version: 16.4.7 eslint: - specifier: ^9.18.0 - version: 9.18.0 + specifier: ^9.22.0 + version: 9.22.0 eslint-config-prettier: - specifier: ^10.0.1 - version: 10.0.1(eslint@9.18.0) + specifier: ^10.1.1 + version: 10.1.1(eslint@9.22.0) globals: - specifier: ^15.14.0 - version: 15.14.0 + specifier: ^15.15.0 + version: 15.15.0 prettier: - specifier: ^3.4.2 - version: 3.4.2 + specifier: ^3.5.3 + version: 3.5.3 typedoc: - specifier: ^0.27.6 - version: 0.27.6(typescript@5.7.3) + specifier: ^0.27.9 + version: 0.27.9(typescript@5.8.2) typedoc-material-theme: specifier: ^1.3.0 - version: 1.3.0(typedoc@0.27.6(typescript@5.7.3)) + version: 1.3.0(typedoc@0.27.9(typescript@5.8.2)) typedoc-plugin-rename-defaults: specifier: ^0.7.2 - version: 0.7.2(typedoc@0.27.6(typescript@5.7.3)) + version: 0.7.2(typedoc@0.27.9(typescript@5.8.2)) typescript: - specifier: ^5.7.3 - version: 5.7.3 + specifier: ^5.8.2 + version: 5.8.2 typescript-eslint: - specifier: ^8.21.0 - version: 8.21.0(eslint@9.18.0)(typescript@5.7.3) + specifier: ^8.26.0 + version: 8.26.0(eslint@9.22.0)(typescript@5.8.2) vitest: - specifier: ^2.1.8 - version: 2.1.8(@types/node@22.10.8)(@vitest/ui@2.1.8) + specifier: ^2.1.9 + version: 2.1.9(@types/node@22.13.10)(@vitest/ui@2.1.9) xml2js: specifier: ^0.6.2 version: 0.6.2 @@ -265,28 +265,32 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.19.0': - resolution: {integrity: sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==} + '@eslint/config-array@0.19.2': + resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.10.0': - resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} + '@eslint/config-helpers@0.1.0': + resolution: {integrity: sha512-kLrdPDJE1ckPo94kmPPf9Hfd0DU0Jw6oKYrhe+pwSC0iTUInmTa+w6fw8sGgcfkFJGNdWOUeOaDM4quW4a7OkA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.2.0': - resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + '@eslint/core@0.12.0': + resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.18.0': - resolution: {integrity: sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==} + '@eslint/eslintrc@3.3.0': + resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.4': - resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + '@eslint/js@9.22.0': + resolution: {integrity: sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.5': - resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==} + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.7': + resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@gerrit0/mini-shiki@1.24.0': @@ -308,8 +312,8 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.1': - resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + '@humanwhocodes/retry@0.4.2': + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} engines: {node: '>=18.18'} '@isaacs/cliui@8.0.2': @@ -467,8 +471,8 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@22.10.8': - resolution: {integrity: sha512-rk+QvAEGsbX/ZPiiyel6hJHNUS9cnSbPWVaZLvE+Er3tLqQFzWMz9JOfWW7XUmKvRPfxJfbl3qYWve+RGXncFw==} + '@types/node@22.13.10': + resolution: {integrity: sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==} '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -476,42 +480,42 @@ packages: '@types/xml2js@0.4.14': resolution: {integrity: sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==} - '@typescript-eslint/eslint-plugin@8.21.0': - resolution: {integrity: sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==} + '@typescript-eslint/eslint-plugin@8.26.0': + resolution: {integrity: sha512-cLr1J6pe56zjKYajK6SSSre6nl1Gj6xDp1TY0trpgPzjVbgDwd09v2Ws37LABxzkicmUjhEeg/fAUjPJJB1v5Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.21.0': - resolution: {integrity: sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA==} + '@typescript-eslint/parser@8.26.0': + resolution: {integrity: sha512-mNtXP9LTVBy14ZF3o7JG69gRPBK/2QWtQd0j0oH26HcY/foyJJau6pNUez7QrM5UHnSvwlQcJXKsk0I99B9pOA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/scope-manager@8.16.0': resolution: {integrity: sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.21.0': - resolution: {integrity: sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==} + '@typescript-eslint/scope-manager@8.26.0': + resolution: {integrity: sha512-E0ntLvsfPqnPwng8b8y4OGuzh/iIOm2z8U3S9zic2TeMLW61u5IH2Q1wu0oSTkfrSzwbDJIB/Lm8O3//8BWMPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.21.0': - resolution: {integrity: sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ==} + '@typescript-eslint/type-utils@8.26.0': + resolution: {integrity: sha512-ruk0RNChLKz3zKGn2LwXuVoeBcUMh+jaqzN461uMMdxy5H9epZqIBtYj7UiPXRuOpaALXGbmRuZQhmwHhaS04Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/types@8.16.0': resolution: {integrity: sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.21.0': - resolution: {integrity: sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==} + '@typescript-eslint/types@8.26.0': + resolution: {integrity: sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@8.16.0': @@ -523,11 +527,11 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.21.0': - resolution: {integrity: sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==} + '@typescript-eslint/typescript-estree@8.26.0': + resolution: {integrity: sha512-tiJ1Hvy/V/oMVRTbEOIeemA2XoylimlDQ03CgPPNaHYZbpsc78Hmngnt+WXZfJX1pjQ711V7g0H7cSJThGYfPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/utils@8.16.0': resolution: {integrity: sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA==} @@ -539,35 +543,35 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.21.0': - resolution: {integrity: sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==} + '@typescript-eslint/utils@8.26.0': + resolution: {integrity: sha512-2L2tU3FVwhvU14LndnQCA2frYC8JnPDVKyQtWFPf8IYFMt/ykEN1bPolNhNbCVgOmdzTlWdusCTKA/9nKrf8Ig==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/visitor-keys@8.16.0': resolution: {integrity: sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.21.0': - resolution: {integrity: sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==} + '@typescript-eslint/visitor-keys@8.26.0': + resolution: {integrity: sha512-2z8JQJWAzPdDd51dRQ/oqIJxe99/hoLIqmf8RMCAJQtYDc535W/Jt2+RTP4bP0aKeBG1F65yjIZuczOXCmbWwg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitest/coverage-v8@2.1.8': - resolution: {integrity: sha512-2Y7BPlKH18mAZYAW1tYByudlCYrQyl5RGvnnDYJKW5tCiO5qg3KSAy3XAxcxKz900a0ZXxWtKrMuZLe3lKBpJw==} + '@vitest/coverage-v8@2.1.9': + resolution: {integrity: sha512-Z2cOr0ksM00MpEfyVE8KXIYPEcBFxdbLSs56L8PO0QQMxt/6bDj45uQfxoc96v05KW3clk7vvgP0qfDit9DmfQ==} peerDependencies: - '@vitest/browser': 2.1.8 - vitest: 2.1.8 + '@vitest/browser': 2.1.9 + vitest: 2.1.9 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@2.1.8': - resolution: {integrity: sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==} + '@vitest/expect@2.1.9': + resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} - '@vitest/mocker@2.1.8': - resolution: {integrity: sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==} + '@vitest/mocker@2.1.9': + resolution: {integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 @@ -577,25 +581,25 @@ packages: vite: optional: true - '@vitest/pretty-format@2.1.8': - resolution: {integrity: sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==} + '@vitest/pretty-format@2.1.9': + resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} - '@vitest/runner@2.1.8': - resolution: {integrity: sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==} + '@vitest/runner@2.1.9': + resolution: {integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==} - '@vitest/snapshot@2.1.8': - resolution: {integrity: sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==} + '@vitest/snapshot@2.1.9': + resolution: {integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==} - '@vitest/spy@2.1.8': - resolution: {integrity: sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==} + '@vitest/spy@2.1.9': + resolution: {integrity: sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==} - '@vitest/ui@2.1.8': - resolution: {integrity: sha512-5zPJ1fs0ixSVSs5+5V2XJjXLmNzjugHRyV11RqxYVR+oMcogZ9qTuSfKW+OcTV0JeFNznI83BNylzH6SSNJ1+w==} + '@vitest/ui@2.1.9': + resolution: {integrity: sha512-izzd2zmnk8Nl5ECYkW27328RbQ1nKvkm6Bb5DAaz1Gk59EbLkiCMa6OLT0NoaAYTjOFS6N+SMYW1nh4/9ljPiw==} peerDependencies: - vitest: 2.1.8 + vitest: 2.1.9 - '@vitest/utils@2.1.8': - resolution: {integrity: sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==} + '@vitest/utils@2.1.9': + resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} @@ -640,8 +644,8 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - axios@1.7.7: - resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} + axios@1.8.2: + resolution: {integrity: sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -760,14 +764,14 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-prettier@10.0.1: - resolution: {integrity: sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==} + eslint-config-prettier@10.1.1: + resolution: {integrity: sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==} hasBin: true peerDependencies: eslint: '>=7.0.0' - eslint-scope@8.2.0: - resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + eslint-scope@8.3.0: + resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: @@ -778,8 +782,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.18.0: - resolution: {integrity: sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==} + eslint@9.22.0: + resolution: {integrity: sha512-9V/QURhsRN40xuHXWjV64yvrzMjcz7ZyNoF2jJFmy9j/SLk0u1OLSZgXi28MrXjymnjEGSR80WCdab3RGMDveQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -823,8 +827,8 @@ packages: resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} engines: {node: '>=12.0.0'} - farming-weight@0.8.1: - resolution: {integrity: sha512-0uV1TPkmOa+DA7l6P3JTdm7YBKJWunUn/XMN4FrbEgIehD7681jQgO6kjUIqFcHIZG3EaQ4FLH36emI60wCR+Q==} + farming-weight@0.8.2: + resolution: {integrity: sha512-kAId/00QD9WCoaORv/Hdssb7KXeCJuX0/T/9KZ2Olv7Q++bY3KhWW/Dt3pixhBlGR/12tOTnHlI2QFkAkHT4ZA==} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -910,8 +914,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.14.0: - resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} graphemer@1.4.0: @@ -1006,6 +1010,7 @@ packages: lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} @@ -1142,8 +1147,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.4.2: - resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} engines: {node: '>=14'} hasBin: true @@ -1229,8 +1234,8 @@ packages: resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} engines: {node: '>=18'} - skyhelper-networth@1.27.1: - resolution: {integrity: sha512-EUXKQUs25nKUxV8EyBfIJLZMtSUYuhnoFCG3W4iN9ERbsmgEHeUs+HrftqzEMf760HK7CSSQWHW9X7gUz95YuQ==} + skyhelper-networth@1.27.3: + resolution: {integrity: sha512-UYs2Jc1swM0ClggVzeCH/i44r9y+eKts88jv5feNn84ZUn9SewhXrrngdbAbJI/4/0t6S4yrq4MGNadDvKjg9A==} source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} @@ -1309,8 +1314,8 @@ packages: peerDependencies: typescript: '>=4.2.0' - ts-api-utils@2.0.0: - resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==} + ts-api-utils@2.0.1: + resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -1330,22 +1335,22 @@ packages: peerDependencies: typedoc: '>=0.22.x <0.28.x' - typedoc@0.27.6: - resolution: {integrity: sha512-oBFRoh2Px6jFx366db0lLlihcalq/JzyCVp7Vaq1yphL/tbgx2e+bkpkCgJPunaPvPwoTOXSwasfklWHm7GfAw==} + typedoc@0.27.9: + resolution: {integrity: sha512-/z585740YHURLl9DN2jCWe6OW7zKYm6VoQ93H0sxZ1cwHQEQrUn5BJrEnkWhfzUdyO+BLGjnKUZ9iz9hKloFDw==} engines: {node: '>= 18'} hasBin: true peerDependencies: - typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x + typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x - typescript-eslint@8.21.0: - resolution: {integrity: sha512-txEKYY4XMKwPXxNkN8+AxAdX6iIJAPiJbHE/FpQccs/sxw8Lf26kqwC3cn0xkHlW8kEbLhkhCsjWuMveaY9Rxw==} + typescript-eslint@8.26.0: + resolution: {integrity: sha512-PtVz9nAnuNJuAVeUFvwztjuUgSnJInODAUx47VDwWPXzd5vismPOtPtt83tzNXyOjVQbPRp786D6WFW/M2koIA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - typescript@5.7.3: - resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + typescript@5.8.2: + resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} engines: {node: '>=14.17'} hasBin: true @@ -1358,8 +1363,8 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - vite-node@2.1.8: - resolution: {integrity: sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==} + vite-node@2.1.9: + resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -1394,15 +1399,15 @@ packages: terser: optional: true - vitest@2.1.8: - resolution: {integrity: sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==} + vitest@2.1.9: + resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.1.8 - '@vitest/ui': 2.1.8 + '@vitest/browser': 2.1.9 + '@vitest/ui': 2.1.9 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -1464,9 +1469,9 @@ packages: snapshots: - '@8hobbies/typedoc-plugin-404@3.1.0(typedoc@0.27.6(typescript@5.7.3))': + '@8hobbies/typedoc-plugin-404@3.1.0(typedoc@0.27.9(typescript@5.8.2))': dependencies: - typedoc: 0.27.6(typescript@5.7.3) + typedoc: 0.27.9(typescript@5.8.2) '@ampproject/remapping@2.3.0': dependencies: @@ -1557,26 +1562,28 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.18.0)': + '@eslint-community/eslint-utils@4.4.0(eslint@9.22.0)': dependencies: - eslint: 9.18.0 + eslint: 9.22.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.19.0': + '@eslint/config-array@0.19.2': dependencies: - '@eslint/object-schema': 2.1.4 + '@eslint/object-schema': 2.1.6 debug: 4.3.7 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/core@0.10.0': + '@eslint/config-helpers@0.1.0': {} + + '@eslint/core@0.12.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.2.0': + '@eslint/eslintrc@3.3.0': dependencies: ajv: 6.12.6 debug: 4.3.7 @@ -1590,13 +1597,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.18.0': {} + '@eslint/js@9.22.0': {} - '@eslint/object-schema@2.1.4': {} + '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.5': + '@eslint/plugin-kit@0.2.7': dependencies: - '@eslint/core': 0.10.0 + '@eslint/core': 0.12.0 levn: 0.4.1 '@gerrit0/mini-shiki@1.24.0': @@ -1616,7 +1623,7 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.1': {} + '@humanwhocodes/retry@0.4.2': {} '@isaacs/cliui@8.0.2': dependencies: @@ -1629,9 +1636,9 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@j4cobi/eslint-plugin-sort-imports@1.0.2(eslint@9.18.0)(typescript@5.7.3)': + '@j4cobi/eslint-plugin-sort-imports@1.0.2(eslint@9.22.0)(typescript@5.8.2)': dependencies: - '@typescript-eslint/utils': 8.16.0(eslint@9.18.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.16.0(eslint@9.22.0)(typescript@5.8.2) transitivePeerDependencies: - eslint - supports-color @@ -1748,7 +1755,7 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@22.10.8': + '@types/node@22.13.10': dependencies: undici-types: 6.20.0 @@ -1756,34 +1763,34 @@ snapshots: '@types/xml2js@0.4.14': dependencies: - '@types/node': 22.10.8 + '@types/node': 22.13.10 - '@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.21.0(eslint@9.18.0)(typescript@5.7.3) - '@typescript-eslint/scope-manager': 8.21.0 - '@typescript-eslint/type-utils': 8.21.0(eslint@9.18.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.21.0(eslint@9.18.0)(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.21.0 - eslint: 9.18.0 + '@typescript-eslint/parser': 8.26.0(eslint@9.22.0)(typescript@5.8.2) + '@typescript-eslint/scope-manager': 8.26.0 + '@typescript-eslint/type-utils': 8.26.0(eslint@9.22.0)(typescript@5.8.2) + '@typescript-eslint/utils': 8.26.0(eslint@9.22.0)(typescript@5.8.2) + '@typescript-eslint/visitor-keys': 8.26.0 + eslint: 9.22.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - ts-api-utils: 2.0.0(typescript@5.7.3) - typescript: 5.7.3 + ts-api-utils: 2.0.1(typescript@5.8.2) + typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.21.0(eslint@9.18.0)(typescript@5.7.3)': + '@typescript-eslint/parser@8.26.0(eslint@9.22.0)(typescript@5.8.2)': dependencies: - '@typescript-eslint/scope-manager': 8.21.0 - '@typescript-eslint/types': 8.21.0 - '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.21.0 + '@typescript-eslint/scope-manager': 8.26.0 + '@typescript-eslint/types': 8.26.0 + '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.8.2) + '@typescript-eslint/visitor-keys': 8.26.0 debug: 4.3.7 - eslint: 9.18.0 - typescript: 5.7.3 + eslint: 9.22.0 + typescript: 5.8.2 transitivePeerDependencies: - supports-color @@ -1792,27 +1799,27 @@ snapshots: '@typescript-eslint/types': 8.16.0 '@typescript-eslint/visitor-keys': 8.16.0 - '@typescript-eslint/scope-manager@8.21.0': + '@typescript-eslint/scope-manager@8.26.0': dependencies: - '@typescript-eslint/types': 8.21.0 - '@typescript-eslint/visitor-keys': 8.21.0 + '@typescript-eslint/types': 8.26.0 + '@typescript-eslint/visitor-keys': 8.26.0 - '@typescript-eslint/type-utils@8.21.0(eslint@9.18.0)(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.26.0(eslint@9.22.0)(typescript@5.8.2)': dependencies: - '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.21.0(eslint@9.18.0)(typescript@5.7.3) + '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.8.2) + '@typescript-eslint/utils': 8.26.0(eslint@9.22.0)(typescript@5.8.2) debug: 4.3.7 - eslint: 9.18.0 - ts-api-utils: 2.0.0(typescript@5.7.3) - typescript: 5.7.3 + eslint: 9.22.0 + ts-api-utils: 2.0.1(typescript@5.8.2) + typescript: 5.8.2 transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.16.0': {} - '@typescript-eslint/types@8.21.0': {} + '@typescript-eslint/types@8.26.0': {} - '@typescript-eslint/typescript-estree@8.16.0(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.16.0(typescript@5.8.2)': dependencies: '@typescript-eslint/types': 8.16.0 '@typescript-eslint/visitor-keys': 8.16.0 @@ -1821,46 +1828,46 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.7.3) + ts-api-utils: 1.3.0(typescript@5.8.2) optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.21.0(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.26.0(typescript@5.8.2)': dependencies: - '@typescript-eslint/types': 8.21.0 - '@typescript-eslint/visitor-keys': 8.21.0 + '@typescript-eslint/types': 8.26.0 + '@typescript-eslint/visitor-keys': 8.26.0 debug: 4.3.7 fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 2.0.0(typescript@5.7.3) - typescript: 5.7.3 + ts-api-utils: 2.0.1(typescript@5.8.2) + typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.16.0(eslint@9.18.0)(typescript@5.7.3)': + '@typescript-eslint/utils@8.16.0(eslint@9.22.0)(typescript@5.8.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.18.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.22.0) '@typescript-eslint/scope-manager': 8.16.0 '@typescript-eslint/types': 8.16.0 - '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.7.3) - eslint: 9.18.0 + '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.8.2) + eslint: 9.22.0 optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.21.0(eslint@9.18.0)(typescript@5.7.3)': + '@typescript-eslint/utils@8.26.0(eslint@9.22.0)(typescript@5.8.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.18.0) - '@typescript-eslint/scope-manager': 8.21.0 - '@typescript-eslint/types': 8.21.0 - '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) - eslint: 9.18.0 - typescript: 5.7.3 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.22.0) + '@typescript-eslint/scope-manager': 8.26.0 + '@typescript-eslint/types': 8.26.0 + '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.8.2) + eslint: 9.22.0 + typescript: 5.8.2 transitivePeerDependencies: - supports-color @@ -1869,12 +1876,12 @@ snapshots: '@typescript-eslint/types': 8.16.0 eslint-visitor-keys: 4.2.0 - '@typescript-eslint/visitor-keys@8.21.0': + '@typescript-eslint/visitor-keys@8.26.0': dependencies: - '@typescript-eslint/types': 8.21.0 + '@typescript-eslint/types': 8.26.0 eslint-visitor-keys: 4.2.0 - '@vitest/coverage-v8@2.1.8(vitest@2.1.8(@types/node@22.10.8)(@vitest/ui@2.1.8))': + '@vitest/coverage-v8@2.1.9(vitest@2.1.9(@types/node@22.13.10)(@vitest/ui@2.1.9))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -1888,58 +1895,58 @@ snapshots: std-env: 3.8.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 2.1.8(@types/node@22.10.8)(@vitest/ui@2.1.8) + vitest: 2.1.9(@types/node@22.13.10)(@vitest/ui@2.1.9) transitivePeerDependencies: - supports-color - '@vitest/expect@2.1.8': + '@vitest/expect@2.1.9': dependencies: - '@vitest/spy': 2.1.8 - '@vitest/utils': 2.1.8 + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 chai: 5.1.2 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.8(vite@5.4.0(@types/node@22.10.8))': + '@vitest/mocker@2.1.9(vite@5.4.0(@types/node@22.13.10))': dependencies: - '@vitest/spy': 2.1.8 + '@vitest/spy': 2.1.9 estree-walker: 3.0.3 magic-string: 0.30.12 optionalDependencies: - vite: 5.4.0(@types/node@22.10.8) + vite: 5.4.0(@types/node@22.13.10) - '@vitest/pretty-format@2.1.8': + '@vitest/pretty-format@2.1.9': dependencies: tinyrainbow: 1.2.0 - '@vitest/runner@2.1.8': + '@vitest/runner@2.1.9': dependencies: - '@vitest/utils': 2.1.8 + '@vitest/utils': 2.1.9 pathe: 1.1.2 - '@vitest/snapshot@2.1.8': + '@vitest/snapshot@2.1.9': dependencies: - '@vitest/pretty-format': 2.1.8 + '@vitest/pretty-format': 2.1.9 magic-string: 0.30.12 pathe: 1.1.2 - '@vitest/spy@2.1.8': + '@vitest/spy@2.1.9': dependencies: tinyspy: 3.0.2 - '@vitest/ui@2.1.8(vitest@2.1.8)': + '@vitest/ui@2.1.9(vitest@2.1.9)': dependencies: - '@vitest/utils': 2.1.8 + '@vitest/utils': 2.1.9 fflate: 0.8.2 flatted: 3.3.1 pathe: 1.1.2 sirv: 3.0.0 tinyglobby: 0.2.10 tinyrainbow: 1.2.0 - vitest: 2.1.8(@types/node@22.10.8)(@vitest/ui@2.1.8) + vitest: 2.1.9(@types/node@22.13.10)(@vitest/ui@2.1.9) - '@vitest/utils@2.1.8': + '@vitest/utils@2.1.9': dependencies: - '@vitest/pretty-format': 2.1.8 + '@vitest/pretty-format': 2.1.9 loupe: 3.1.2 tinyrainbow: 1.2.0 @@ -1976,7 +1983,7 @@ snapshots: asynckit@0.4.0: {} - axios@1.7.7: + axios@1.8.2: dependencies: follow-redirects: 1.15.6 form-data: 4.0.0 @@ -2099,11 +2106,11 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.0.1(eslint@9.18.0): + eslint-config-prettier@10.1.1(eslint@9.22.0): dependencies: - eslint: 9.18.0 + eslint: 9.22.0 - eslint-scope@8.2.0: + eslint-scope@8.3.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 @@ -2112,18 +2119,19 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.18.0: + eslint@9.22.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.18.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.22.0) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.0 - '@eslint/core': 0.10.0 - '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.18.0 - '@eslint/plugin-kit': 0.2.5 + '@eslint/config-array': 0.19.2 + '@eslint/config-helpers': 0.1.0 + '@eslint/core': 0.12.0 + '@eslint/eslintrc': 3.3.0 + '@eslint/js': 9.22.0 + '@eslint/plugin-kit': 0.2.7 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.1 + '@humanwhocodes/retry': 0.4.2 '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 ajv: 6.12.6 @@ -2131,7 +2139,7 @@ snapshots: cross-spawn: 7.0.6 debug: 4.3.7 escape-string-regexp: 4.0.0 - eslint-scope: 8.2.0 + eslint-scope: 8.3.0 eslint-visitor-keys: 4.2.0 espree: 10.3.0 esquery: 1.6.0 @@ -2179,7 +2187,7 @@ snapshots: expect-type@1.1.0: {} - farming-weight@0.8.1: {} + farming-weight@0.8.2: {} fast-deep-equal@3.1.3: {} @@ -2260,7 +2268,7 @@ snapshots: globals@14.0.0: {} - globals@15.14.0: {} + globals@15.15.0: {} graphemer@1.4.0: {} @@ -2467,7 +2475,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier@3.4.2: {} + prettier@3.5.3: {} prismarine-nbt@2.7.0: dependencies: @@ -2559,9 +2567,9 @@ snapshots: mrmime: 2.0.0 totalist: 3.0.1 - skyhelper-networth@1.27.1: + skyhelper-networth@1.27.3: dependencies: - axios: 1.7.7 + axios: 1.8.2 prismarine-nbt: 2.7.0 transitivePeerDependencies: - debug @@ -2629,48 +2637,48 @@ snapshots: totalist@3.0.1: {} - ts-api-utils@1.3.0(typescript@5.7.3): + ts-api-utils@1.3.0(typescript@5.8.2): dependencies: - typescript: 5.7.3 + typescript: 5.8.2 - ts-api-utils@2.0.0(typescript@5.7.3): + ts-api-utils@2.0.1(typescript@5.8.2): dependencies: - typescript: 5.7.3 + typescript: 5.8.2 type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - typedoc-material-theme@1.3.0(typedoc@0.27.6(typescript@5.7.3)): + typedoc-material-theme@1.3.0(typedoc@0.27.9(typescript@5.8.2)): dependencies: '@material/material-color-utilities': 0.3.0 - typedoc: 0.27.6(typescript@5.7.3) + typedoc: 0.27.9(typescript@5.8.2) - typedoc-plugin-rename-defaults@0.7.2(typedoc@0.27.6(typescript@5.7.3)): + typedoc-plugin-rename-defaults@0.7.2(typedoc@0.27.9(typescript@5.8.2)): dependencies: camelcase: 8.0.0 - typedoc: 0.27.6(typescript@5.7.3) + typedoc: 0.27.9(typescript@5.8.2) - typedoc@0.27.6(typescript@5.7.3): + typedoc@0.27.9(typescript@5.8.2): dependencies: '@gerrit0/mini-shiki': 1.24.0 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 - typescript: 5.7.3 + typescript: 5.8.2 yaml: 2.6.1 - typescript-eslint@8.21.0(eslint@9.18.0)(typescript@5.7.3): + typescript-eslint@8.26.0(eslint@9.22.0)(typescript@5.8.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3) - '@typescript-eslint/parser': 8.21.0(eslint@9.18.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.21.0(eslint@9.18.0)(typescript@5.7.3) - eslint: 9.18.0 - typescript: 5.7.3 + '@typescript-eslint/eslint-plugin': 8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2) + '@typescript-eslint/parser': 8.26.0(eslint@9.22.0)(typescript@5.8.2) + '@typescript-eslint/utils': 8.26.0(eslint@9.22.0)(typescript@5.8.2) + eslint: 9.22.0 + typescript: 5.8.2 transitivePeerDependencies: - supports-color - typescript@5.7.3: {} + typescript@5.8.2: {} uc.micro@2.1.0: {} @@ -2680,13 +2688,13 @@ snapshots: dependencies: punycode: 2.3.1 - vite-node@2.1.8(@types/node@22.10.8): + vite-node@2.1.9(@types/node@22.13.10): dependencies: cac: 6.7.14 debug: 4.3.7 es-module-lexer: 1.5.4 pathe: 1.1.2 - vite: 5.4.0(@types/node@22.10.8) + vite: 5.4.0(@types/node@22.13.10) transitivePeerDependencies: - '@types/node' - less @@ -2698,24 +2706,24 @@ snapshots: - supports-color - terser - vite@5.4.0(@types/node@22.10.8): + vite@5.4.0(@types/node@22.13.10): dependencies: esbuild: 0.21.5 postcss: 8.4.41 rollup: 4.20.0 optionalDependencies: - '@types/node': 22.10.8 + '@types/node': 22.13.10 fsevents: 2.3.3 - vitest@2.1.8(@types/node@22.10.8)(@vitest/ui@2.1.8): + vitest@2.1.9(@types/node@22.13.10)(@vitest/ui@2.1.9): dependencies: - '@vitest/expect': 2.1.8 - '@vitest/mocker': 2.1.8(vite@5.4.0(@types/node@22.10.8)) - '@vitest/pretty-format': 2.1.8 - '@vitest/runner': 2.1.8 - '@vitest/snapshot': 2.1.8 - '@vitest/spy': 2.1.8 - '@vitest/utils': 2.1.8 + '@vitest/expect': 2.1.9 + '@vitest/mocker': 2.1.9(vite@5.4.0(@types/node@22.13.10)) + '@vitest/pretty-format': 2.1.9 + '@vitest/runner': 2.1.9 + '@vitest/snapshot': 2.1.9 + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 chai: 5.1.2 debug: 4.3.7 expect-type: 1.1.0 @@ -2726,12 +2734,12 @@ snapshots: tinyexec: 0.3.1 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.0(@types/node@22.10.8) - vite-node: 2.1.8(@types/node@22.10.8) + vite: 5.4.0(@types/node@22.13.10) + vite-node: 2.1.9(@types/node@22.13.10) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.10.8 - '@vitest/ui': 2.1.8(vitest@2.1.8) + '@types/node': 22.13.10 + '@vitest/ui': 2.1.9(vitest@2.1.9) transitivePeerDependencies: - less - lightningcss From 4122d400c6edc072d74cdaee3cdb6a75e32d21fd Mon Sep 17 00:00:00 2001 From: Bonnet Adam Date: Mon, 10 Mar 2025 14:42:04 +0100 Subject: [PATCH 007/124] feat(skybock): Add Skyblock item class and getSkyblockItems (#661) * feat(skybock): Add Skyblock item class and getSkyblockItems * add getSkyblockItems tests * feat(skyblock): enhance skyblock item * fix(skyblock): Fix skyblock items * fix eslint & prettier --------- Co-authored-by: Jacob --- src/API/getSkyblockItems.test.ts | 161 ++++++++++++++++++++++++ src/API/getSkyblockItems.ts | 21 ++++ src/API/index.ts | 2 + src/Client.ts | 5 + src/Structures/SkyBlock/SkyblockItem.ts | 128 +++++++++++++++++++ src/index.ts | 2 + 6 files changed, 319 insertions(+) create mode 100644 src/API/getSkyblockItems.test.ts create mode 100644 src/API/getSkyblockItems.ts create mode 100644 src/Structures/SkyBlock/SkyblockItem.ts diff --git a/src/API/getSkyblockItems.test.ts b/src/API/getSkyblockItems.test.ts new file mode 100644 index 000000000..d51c88fe0 --- /dev/null +++ b/src/API/getSkyblockItems.test.ts @@ -0,0 +1,161 @@ +import Client from '../Client.js'; +import RequestData from '../Private/RequestData.js'; +import SkyblockItem from '../Structures/SkyBlock/SkyblockItem.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('getSkyblockItems (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getSkyblockItems({ raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getSkyblockItems', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getSkyblockItems(); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as SkyblockItem[]; + data.forEach((item: SkyblockItem) => { + expect(item.durability).toBeDefined(); + expectTypeOf(item.durability).toEqualTypeOf(); + + expect(item.museumData).toBeDefined(); + expectTypeOf(item.museumData).toEqualTypeOf | undefined>(); + + expect(item.hasUuid).toBeDefined(); + expectTypeOf(item.hasUuid).toEqualTypeOf(); + + expect(item.gemstoneSlots).toBeDefined(); + expectTypeOf(item.gemstoneSlots).toEqualTypeOf[] | undefined>(); + + expect(item.glowing).toBeDefined(); + expectTypeOf(item.glowing).toEqualTypeOf(); + + expect(item.canAuction).toBeDefined(); + expectTypeOf(item.canAuction).toEqualTypeOf(); + + expect(item.canTrade).toBeDefined(); + expectTypeOf(item.canTrade).toEqualTypeOf(); + + expect(item.requirements).toBeDefined(); + expectTypeOf(item.requirements).toEqualTypeOf[] | undefined>(); + + expect(item.canPlace).toBeDefined(); + expectTypeOf(item.canPlace).toEqualTypeOf(); + + expect(item.museum).toBeDefined(); + expectTypeOf(item.museum).toEqualTypeOf(); + + expect(item.generator).toBeDefined(); + expectTypeOf(item.generator).toEqualTypeOf(); + + expect(item.generatorTier).toBeDefined(); + expectTypeOf(item.generatorTier).toEqualTypeOf(); + + expect(item.furniture).toBeDefined(); + expectTypeOf(item.furniture).toEqualTypeOf(); + + expect(item.itemSpecific).toBeDefined(); + expectTypeOf(item.itemSpecific).toEqualTypeOf | undefined>(); + + expect(item.description).toBeDefined(); + expectTypeOf(item.description).toEqualTypeOf(); + + expect(item.upgradeCosts).toBeDefined(); + expectTypeOf(item.upgradeCosts).toEqualTypeOf>> | undefined>(); + + expect(item.gearScore).toBeDefined(); + expectTypeOf(item.gearScore).toEqualTypeOf(); + + expect(item.dungeonItem).toBeDefined(); + expectTypeOf(item.dungeonItem).toEqualTypeOf(); + + expect(item.dungeonItemConversionCost).toBeDefined(); + expectTypeOf(item.dungeonItemConversionCost).toEqualTypeOf | undefined>(); + + expect(item.catacombsRequirements).toBeDefined(); + expectTypeOf(item.catacombsRequirements).toEqualTypeOf[] | undefined>(); + + expect(item.canHaveAttributes).toBeDefined(); + expectTypeOf(item.canHaveAttributes).toEqualTypeOf(); + + expect(item.salvageableFromRecipe).toBeDefined(); + expectTypeOf(item.salvageableFromRecipe).toEqualTypeOf(); + + expect(item.canRecombobulate).toBeDefined(); + expectTypeOf(item.canRecombobulate).toEqualTypeOf(); + + expect(item.enchantments).toBeDefined(); + expectTypeOf(item.enchantments).toEqualTypeOf | undefined>(); + + expect(item.riftTransferrable).toBeDefined(); + expectTypeOf(item.riftTransferrable).toEqualTypeOf(); + + expect(item.origin).toBeDefined(); + expectTypeOf(item.origin).toEqualTypeOf(); + + expect(item.doubleTapToDrop).toBeDefined(); + expectTypeOf(item.doubleTapToDrop).toEqualTypeOf(); + + expect(item.hideFromViewRecipeCommand).toBeDefined(); + expectTypeOf(item.hideFromViewRecipeCommand).toEqualTypeOf(); + + expect(item.swordType).toBeDefined(); + expectTypeOf(item.swordType).toEqualTypeOf(); + + expect(item.abilityDamageScaling).toBeDefined(); + expectTypeOf(item.abilityDamageScaling).toEqualTypeOf(); + + expect(item.tieredStats).toBeDefined(); + expectTypeOf(item.tieredStats).toEqualTypeOf | undefined>(); + + expect(item.motesSellPrice).toBeDefined(); + expectTypeOf(item.motesSellPrice).toEqualTypeOf(); + + expect(item.crystal).toBeDefined(); + expectTypeOf(item.crystal).toEqualTypeOf(); + + expect(item.canBurnInFurnace).toBeDefined(); + expectTypeOf(item.canBurnInFurnace).toEqualTypeOf(); + + expect(item.salvage).toBeDefined(); + expectTypeOf(item.salvage).toEqualTypeOf | undefined>(); + + expect(item.serializable).toBeDefined(); + expectTypeOf(item.serializable).toEqualTypeOf(); + + expect(item.canInteract).toBeDefined(); + expectTypeOf(item.canInteract).toEqualTypeOf(); + + expect(item.canInteractRightClick).toBeDefined(); + expectTypeOf(item.canInteractRightClick).toEqualTypeOf(); + + expect(item.privateIsland).toBeDefined(); + expectTypeOf(item.privateIsland).toEqualTypeOf(); + + expect(item.canHavePowerScroll).toBeDefined(); + expectTypeOf(item.canHavePowerScroll).toEqualTypeOf(); + + expect(item.canInteractEntity).toBeDefined(); + expectTypeOf(item.canInteractEntity).toEqualTypeOf(); + + expect(item.miningFortune).toBeDefined(); + expectTypeOf(item.miningFortune).toEqualTypeOf(); + + expect(item.recipes).toBeDefined(); + expectTypeOf(item.recipes).toEqualTypeOf[] | undefined>(); + + expect(item.cannotReforge).toBeDefined(); + expectTypeOf(item.cannotReforge).toEqualTypeOf(); + + expect(item.loseMotesValueOnTransfer).toBeDefined(); + expectTypeOf(item.loseMotesValueOnTransfer).toEqualTypeOf(); + + expect(item.prestige).toBeDefined(); + expectTypeOf(item.prestige).toEqualTypeOf | undefined>(); + }); + client.destroy(); +}); diff --git a/src/API/getSkyblockItems.ts b/src/API/getSkyblockItems.ts new file mode 100644 index 000000000..947b765da --- /dev/null +++ b/src/API/getSkyblockItems.ts @@ -0,0 +1,21 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import RequestData from '../Private/RequestData.js'; +import SkyblockItem from '../Structures/SkyBlock/SkyblockItem.js'; +import type { RequestOptions } from '../Types/Requests.js'; + +class getSkyblockItems extends Endpoint { + override readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + override async execute(options?: RequestOptions): Promise { + const res = await this.client.requestHandler.request('/resources/skyblock/items', options); + if (res.options.raw) return res; + return res.data.items.map((i: any) => new SkyblockItem(i)); + } +} + +export default getSkyblockItems; diff --git a/src/API/index.ts b/src/API/index.ts index dc844e678..2f0b41351 100644 --- a/src/API/index.ts +++ b/src/API/index.ts @@ -19,6 +19,7 @@ import getSkyblockBingo from './getSkyblockBingo.js'; import getSkyblockFireSales from './getSkyblockFireSales.js'; import getSkyblockGarden from './getSkyblockGarden.js'; import getSkyblockGovernment from './getSkyblockGovernment.js'; +import getSkyblockItems from './getSkyblockItems.js'; import getSkyblockMember from './getSkyblockMember.js'; import getSkyblockMuseum from './getSkyblockMuseum.js'; import getSkyblockNews from './getSkyblockNews.js'; @@ -51,6 +52,7 @@ export default { getSkyblockMuseum, getSkyblockNews, getSkyblockProfiles, + getSkyblockItems, getStatus, getWatchdogStats }; diff --git a/src/Client.ts b/src/Client.ts index 3fe67970e..9ba2384db 100644 --- a/src/Client.ts +++ b/src/Client.ts @@ -22,6 +22,7 @@ import RecentGame from './Structures/RecentGame.js'; import RequestData from './Private/RequestData.js'; import RequestHandler from './Private/RequestHandler.js'; import SkyblockGarden from './Structures/SkyBlock/SkyblockGarden.js'; +import SkyblockItem from './Structures/SkyBlock/SkyblockItem.js'; import SkyblockMember from './Structures/SkyBlock/SkyblockMember.js'; import SkyblockMuseum from './Structures/SkyBlock/SkyblockMuseum.js'; import SkyblockNews from './Structures/SkyBlock/News/SkyblockNews.js'; @@ -231,6 +232,10 @@ class Client { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } + public getSkyblockItems(options?: RequestOptions): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + public getStatus(query: string, options?: RequestOptions): Promise { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } diff --git a/src/Structures/SkyBlock/SkyblockItem.ts b/src/Structures/SkyBlock/SkyblockItem.ts new file mode 100644 index 000000000..fe784e27a --- /dev/null +++ b/src/Structures/SkyBlock/SkyblockItem.ts @@ -0,0 +1,128 @@ +class SkyblockItem { + name: string; + material: string; + id: string; + durability?: number; + skin?: Record; + category?: string; + tier?: string; + npcSellPrice?: number; + salvages?: Record[]; + raritySalvageable?: boolean; + stats?: Record; + unstackable?: boolean; + museumData?: Record; + color?: string; + soulbound?: string; + hasUuid?: boolean | string; + gemstoneSlots?: Record[]; + glowing?: boolean; + canAuction?: boolean; + canTrade?: boolean; + requirements?: Record[]; + canPlace?: boolean; + museum?: boolean; + generator?: string; + generatorTier?: number; + furniture?: string; + itemSpecific?: Record; + description?: string; + upgradeCosts?: Array>>; + gearScore?: number; + dungeonItem?: boolean; + dungeonItemConversionCost?: Record; + catacombsRequirements?: Record[]; + canHaveAttributes?: boolean; + salvageableFromRecipe?: boolean; + canRecombobulate?: boolean; + enchantments?: Record; + riftTransferrable?: boolean; + origin?: string; + doubleTapToDrop?: boolean; + hideFromViewRecipeCommand?: boolean; + swordType?: string; + abilityDamageScaling?: number; + tieredStats?: Record; + motesSellPrice?: number; + crystal?: string; + canBurnInFurnace?: boolean; + salvage?: Record; + serializable?: boolean; + canInteract?: boolean; + canInteractRightClick?: boolean; + privateIsland?: string; + canHavePowerScroll?: boolean; + canInteractEntity?: boolean; + miningFortune?: number; + recipes?: Record[]; + cannotReforge?: boolean; + loseMotesValueOnTransfer?: boolean; + prestige?: Record; + constructor(data: Record) { + this.name = data.name; + this.material = data.material; + this.id = data.id; + this.durability = data.durability ?? 0; + this.skin = data.skin ?? {}; + this.category = data.category ?? ''; + this.tier = data.tier ?? ''; + this.npcSellPrice = data.npc_sell_price ?? 0; + this.salvages = data.salvages ?? []; + this.raritySalvageable = data.rarity_salvageable ?? false; + this.stats = data.stats ?? {}; + this.unstackable = data.unstackable ?? false; + this.museumData = data.museum_data ?? {}; + this.color = data.color ?? ''; + this.soulbound = data.soulbound ?? ''; + this.hasUuid = data.has_uuid ?? false; + this.gemstoneSlots = data.gemstone_slots ?? []; + this.glowing = data.glowing ?? false; + this.canAuction = data.can_auction ?? false; + this.canTrade = data.can_trade ?? false; + this.requirements = data.requirements ?? []; + this.canPlace = data.can_place ?? false; + this.museum = data.museum ?? false; + this.generator = data.generator ?? ''; + this.generatorTier = data.generator_tier ?? 0; + this.furniture = data.furniture ?? ''; + this.itemSpecific = data.item_specific ?? {}; + this.description = data.description ?? ''; + this.upgradeCosts = data.upgrade_costs ?? []; + this.gearScore = data.gear_score ?? 0; + this.dungeonItem = data.dungeon_item ?? false; + this.dungeonItemConversionCost = data.dungeon_item_conversion_cost ?? {}; + this.catacombsRequirements = data.catacombs_requirements ?? []; + this.canHaveAttributes = data.can_have_attributes ?? false; + this.salvageableFromRecipe = data.salvageable_from_recipe ?? false; + this.canRecombobulate = data.can_recombobulate ?? false; + this.enchantments = data.enchantments ?? {}; + this.riftTransferrable = data.rift_transferrable ?? false; + this.origin = data.origin ?? ''; + this.doubleTapToDrop = data.double_tap_to_drop ?? false; + this.hideFromViewRecipeCommand = data.hide_from_viewrecipe_command ?? false; + this.swordType = data.sword_type ?? ''; + this.abilityDamageScaling = data.ability_damage_scaling ?? 0; + this.tieredStats = data.tiered_stats ?? {}; + this.motesSellPrice = data.motes_sell_price ?? 0; + this.crystal = data.crystal ?? ''; + this.canBurnInFurnace = data.can_burn_in_furnace ?? false; + this.salvage = data.salvage ?? {}; + this.serializable = data.serializable ?? false; + this.canInteract = data.can_interact ?? false; + this.canInteractRightClick = data.can_interact_right_click ?? false; + this.privateIsland = data.private_island ?? ''; + this.canHavePowerScroll = data.can_have_power_scroll ?? false; + this.canInteractEntity = data.can_interact_entity ?? false; + this.miningFortune = data.MINING_FORTUNE ?? 0; + this.recipes = data.recipes ?? []; + this.cannotReforge = data.cannot_reforge ?? false; + this.loseMotesValueOnTransfer = data.lose_motes_value_on_transfer ?? false; + this.prestige = data.prestige ?? {}; + } + + toString(): string { + return this.name; + } +} + +export default SkyblockItem; diff --git a/src/index.ts b/src/index.ts index 8dd57b649..e62bd4cb1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -142,6 +142,7 @@ import SkyWarsPackages from './Structures/MiniGames/SkyWars/SkyWarsPackages.js'; import SkyblockGarden from './Structures/SkyBlock/SkyblockGarden.js'; import SkyblockGemstone from './Structures/SkyBlock/SkyblockGemstone.js'; import SkyblockInventoryItem from './Structures/SkyBlock/SkyblockInventoryItem.js'; +import SkyblockItem from './Structures/SkyBlock/SkyblockItem.js'; import SkyblockMember from './Structures/SkyBlock/SkyblockMember.js'; import SkyblockMemberMinion from './Structures/SkyBlock/SkyblockMemberMinion.js'; import SkyblockMemberMinions from './Structures/SkyBlock/SkyblockMemberMinions.js'; @@ -323,6 +324,7 @@ export default { SkyblockGarden, SkyblockGemstone, SkyblockInventoryItem, + SkyblockItem, SkyblockMember, SkyblockMemberMinion, SkyblockMemberMinions, From c4a6bea9e886b1ad32a792883b6bc7eb9e91987d Mon Sep 17 00:00:00 2001 From: Jacob <55346310+Kathund@users.noreply.github.com> Date: Mon, 14 Apr 2025 12:57:20 +0800 Subject: [PATCH 008/124] SkyBlock Rewrite (#663) * feat(skyblock-rewrite): Start rewrite * Remove test.ts * feat(skyblock): tests * Fix typo `Bazzar` -> `Bazaar` * Replace `Skyblock` with `SkyBlock` * feat(getSkyBlockProfile) * feat(SkyBlockMemberInventory) * fix(SkyBlockInventoryItem): misc type changes * rewrite skyblock member inventories * feat: SkyBlockMemberBestiary level parse * feat: getSkyBlockProfiles support fetching museum * feat: getSkyBlockProfile support fetching museum * fix: spelling --- .github/scripts/checkCoverage.ts | 2 + .github/scripts/generateIndexFile.ts | 98 + package.json | 5 +- pnpm-lock.yaml | 977 ++-- src/API/getPlayer.test.ts | 16 +- src/API/getSkyBlockAuction.test.ts | 71 + src/API/getSkyBlockAuction.ts | 56 + src/API/getSkyBlockAuctions.test.ts | 69 + src/API/getSkyBlockAuctions.ts | 54 + src/API/getSkyBlockBazaar.test.ts | 29 + ...SkyblockBazaar.ts => getSkyBlockBazaar.ts} | 10 +- src/API/getSkyBlockBingo.test.ts | 41 + ...etSkyblockBingo.ts => getSkyBlockBingo.ts} | 10 +- src/API/getSkyBlockCollections.test.ts | 41 + src/API/getSkyBlockCollections.ts | 21 + src/API/getSkyBlockElection.test.ts | 31 + ...ckGovernment.ts => getSkyBlockElection.ts} | 10 +- src/API/getSkyBlockEndedAuctions.test.ts | 28 + src/API/getSkyBlockEndedAuctions.ts | 26 + ...s.test.ts => getSkyBlockFireSales.test.ts} | 31 +- ...ckFireSales.ts => getSkyBlockFireSales.ts} | 10 +- src/API/getSkyBlockGarden.test.ts | 55 + ...SkyblockGarden.ts => getSkyBlockGarden.ts} | 10 +- src/API/getSkyBlockItems.test.ts | 27 + ...etSkyblockItems.ts => getSkyBlockItems.ts} | 10 +- src/API/getSkyBlockMuseum.test.ts | 34 + src/API/getSkyBlockMuseum.ts | 22 + ...ckNews.test.ts => getSkyBlockNews.test.ts} | 24 +- ...{getSkyblockNews.ts => getSkyBlockNews.ts} | 10 +- src/API/getSkyBlockProfile.test.ts | 68 + src/API/getSkyBlockProfile.ts | 46 + src/API/getSkyBlockProfiles.test.ts | 70 + src/API/getSkyBlockProfiles.ts | 55 + src/API/getSkyBlockSkills.test.ts | 51 + src/API/getSkyBlockSkills.ts | 21 + src/API/getSkyblockAuction.test.ts | 376 -- src/API/getSkyblockAuction.ts | 37 - src/API/getSkyblockAuctions.test.ts | 358 -- src/API/getSkyblockAuctions.ts | 55 - src/API/getSkyblockAuctionsByPlayer.test.ts | 250 - src/API/getSkyblockAuctionsByPlayer.ts | 23 - src/API/getSkyblockBazaar.test.ts | 51 - src/API/getSkyblockBingo.test.ts | 43 - src/API/getSkyblockGarden.test.ts | 53 - src/API/getSkyblockGovernment.test.ts | 62 - src/API/getSkyblockItems.test.ts | 161 - src/API/getSkyblockMember.test.ts | 657 --- src/API/getSkyblockMember.ts | 45 - src/API/getSkyblockMuseum.test.ts | 96 - src/API/getSkyblockMuseum.ts | 30 - src/API/getSkyblockProfiles.test.ts | 159 - src/API/getSkyblockProfiles.ts | 40 - src/API/index.ts | 59 +- src/Client.ts | 81 +- src/Errors.ts | 4 +- src/Structures/Guild/GuildMember.ts | 3 +- src/Structures/House.ts | 4 +- src/Structures/MiniGames/Pit/Pit.ts | 2 +- src/Structures/Player/Player.test.ts | 4 +- src/Structures/Player/Player.ts | 7 +- src/Structures/SkyBlock/Auctions/Auction.ts | 43 - .../SkyBlock/Auctions/AuctionInfo.ts | 16 - .../SkyBlock/Auctions/BaseAuction.test.ts | 22 - .../SkyBlock/Auctions/BaseAuction.ts | 22 - src/Structures/SkyBlock/Auctions/Bid.ts | 22 - .../SkyBlock/Auctions/SkyBlockAuction.test.ts | 48 + .../SkyBlock/Auctions/SkyBlockAuction.ts | 42 + .../Auctions/SkyBlockAuctionBid.test.ts | 26 + .../SkyBlock/Auctions/SkyBlockAuctionBid.ts | 24 + .../Auctions/SkyBlockAuctionInfo.test.ts | 15 + .../SkyBlock/Auctions/SkyBlockAuctionInfo.ts | 15 + .../Auctions/SkyBlockBaseAuction.test.ts | 45 + .../SkyBlock/Auctions/SkyBlockBaseAuction.ts | 22 + .../Auctions/SkyBlockBaseAuctionInfo.test.ts | 13 + .../Auctions/SkyBlockBaseAuctionInfo.ts | 10 + src/Structures/SkyBlock/Bazaar/Order.test.ts | 24 - src/Structures/SkyBlock/Bazaar/Order.ts | 18 - .../SkyBlock/Bazaar/Product.test.ts | 50 - src/Structures/SkyBlock/Bazaar/Product.ts | 26 - .../SkyBlock/Bazaar/SkyBlockBazaar.test.ts | 26 + .../SkyBlock/Bazaar/SkyBlockBazaar.ts | 15 + .../Bazaar/SkyBlockBazaarProduct.test.ts | 24 + .../SkyBlock/Bazaar/SkyBlockBazaarProduct.ts | 26 + .../Bazaar/SkyBlockBazaarProductOrder.test.ts | 19 + .../Bazaar/SkyBlockBazaarProductOrder.ts | 16 + .../Bazaar/SkyBlockBazaarQuickStatus.test.ts | 32 + .../Bazaar/SkyBlockBazaarQuickStatus.ts | 30 + .../SkyBlock/Bingo/SkyBlockBingo.test.ts | 34 + .../SkyBlock/Bingo/SkyBlockBingo.ts | 30 + .../SkyBlock/Bingo/SkyBlockBingoGoal.test.ts | 33 + .../SkyBlock/Bingo/SkyBlockBingoGoal.ts | 37 + .../Collections/SkyBlockCollection.test.ts | 23 + .../Collections/SkyBlockCollection.ts | 20 + .../SkyBlockCollectionTier.test.ts | 16 + .../Collections/SkyBlockCollectionTier.ts | 12 + .../Collections/SkyBlockCollections.test.ts | 35 + .../Collections/SkyBlockCollections.ts | 48 + .../Election/SkyBlockElection.test.ts | 24 + .../SkyBlock/Election/SkyBlockElection.ts | 18 + .../SkyBlockElectionCandidate.test.ts | 24 + .../Election/SkyBlockElectionCandidate.ts | 21 + .../SkyBlockElectionCandidatePerk.test.ts | 20 + .../Election/SkyBlockElectionCandidatePerk.ts | 16 + .../Election/SkyBlockElectionData.test.ts | 18 + .../SkyBlock/Election/SkyBlockElectionData.ts | 16 + .../FireSale/SkyBlockFireSale.test.ts | 33 + .../SkyBlockFireSale.ts} | 14 +- .../SkyBlock/Garden/SkyBlockGarden.test.ts | 46 + .../SkyBlock/Garden/SkyBlockGarden.ts | 38 + .../SkyBlockGardenActiveVisitor.test.ts | 24 + .../Garden/SkyBlockGardenActiveVisitor.ts | 23 + ...lockGardenActiveVisitorRequirement.test.ts | 22 + .../SkyBlockGardenActiveVisitorRequirement.ts | 18 + .../Garden/SkyBlockGardenComposter.test.ts | 27 + .../Garden/SkyBlockGardenComposter.ts | 24 + .../SkyBlockGardenComposterUpgrades.test.ts | 19 + .../Garden/SkyBlockGardenComposterUpgrades.ts | 16 + .../SkyBlockGardenCropMilestones.test.ts | 35 + .../Garden/SkyBlockGardenCropMilestones.ts | 46 + .../SkyBlockGardenCropsUpgrades.test.ts | 34 + .../Garden/SkyBlockGardenCropsUpgrades.ts | 43 + .../Garden/SkyBlockGardenVisitors.test.ts | 17 + .../SkyBlock/Garden/SkyBlockGardenVisitors.ts | 14 + .../Inventory/SkyBlockInventoryItem.ts | 202 + .../SkyBlockInventoryItemAttribute.ts | 14 + .../SkyBlockInventoryItemEnchantment.ts | 14 + .../Inventory/SkyBlockInventoryItemRune.ts | 14 + .../SkyBlockMemberAccessoryBag.test.ts | 26 + .../SkyBlockMemberAccessoryBag.ts | 34 + .../SkyBlockMemberAccessoryBagTuning.test.ts | 33 + .../SkyBlockMemberAccessoryBagTuning.ts | 30 + ...yBlockMemberAccessoryBagTuningSlot.test.ts | 36 + .../SkyBlockMemberAccessoryBagTuningSlot.ts | 32 + .../Bestiary/SkyBlockMemberBestiary.test.ts | 47 + .../Member/Bestiary/SkyBlockMemberBestiary.ts | 96 + .../SkyBlockMemberChocolateFactory.test.ts | 50 + .../SkyBlockMemberChocolateFactory.ts | 52 + ...SkyBlockMemberChocolateFactoryEggs.test.ts | 21 + .../SkyBlockMemberChocolateFactoryEggs.ts | 18 + ...ockMemberChocolateFactoryEmployees.test.ts | 23 + ...SkyBlockMemberChocolateFactoryEmployees.ts | 20 + ...yBlockMemberChocolateFactoryHitmen.test.ts | 26 + .../SkyBlockMemberChocolateFactoryHitmen.ts | 22 + ...ockMemberChocolateFactoryTimeTower.test.ts | 26 + ...SkyBlockMemberChocolateFactoryTimeTower.ts | 22 + ...lockMemberChocolateFactoryUpgrades.test.ts | 15 + .../SkyBlockMemberChocolateFactoryUpgrades.ts | 12 + .../SkyBlockMemberCrimsonIsle.test.ts | 38 + .../CrimsonIsle/SkyBlockMemberCrimsonIsle.ts | 38 + .../SkyBlockMemberCrimsonIsleAbiphone.test.ts | 33 + .../SkyBlockMemberCrimsonIsleAbiphone.ts | 31 + .../SkyBlockMemberCrimsonIsleDojo.test.ts | 120 + .../SkyBlockMemberCrimsonIsleDojo.ts | 52 + ...BlockMemberCrimsonIsleDojoMinigame.test.ts | 21 + .../SkyBlockMemberCrimsonIsleDojoMinigame.ts | 33 + .../SkyBlockMemberCrimsonIsleKuudra.test.ts | 39 + .../SkyBlockMemberCrimsonIsleKuudra.ts | 41 + ...MemberCrimsonIsleKuudraPartyFinder.test.ts | 19 + ...BlockMemberCrimsonIsleKuudraPartyFinder.ts | 17 + ...SkyBlockMemberCrimsonIsleMatriarch.test.ts | 20 + .../SkyBlockMemberCrimsonIsleMatriarch.ts | 16 + ...kyBlockMemberCrimsonIsleTrophyFish.test.ts | 106 + .../SkyBlockMemberCrimsonIsleTrophyFish.ts | 67 + ...ockMemberCrimsonIsleTrophyFishFish.test.ts | 24 + ...SkyBlockMemberCrimsonIsleTrophyFishFish.ts | 20 + .../Dungeons/SkyBlockMemberDungeons.test.ts | 34 + .../Member/Dungeons/SkyBlockMemberDungeons.ts | 34 + .../SkyBlockMemberDungeonsClasses.test.ts | 29 + .../Dungeons/SkyBlockMemberDungeonsClasses.ts | 27 + .../SkyBlockMemberDungeonsFloor.test.ts | 43 + .../Dungeons/SkyBlockMemberDungeonsFloor.ts | 42 + .../SkyBlockMemberDungeonsFloorRun.test.ts | 46 + .../SkyBlockMemberDungeonsFloorRun.ts | 43 + .../SkyBlockMemberDungeonsMode.test.ts | 33 + .../Dungeons/SkyBlockMemberDungeonsMode.ts | 31 + .../SkyBlockMemberDungeonsTreasureRun.test.ts | 33 + .../SkyBlockMemberDungeonsTreasureRun.ts | 30 + ...yBlockMemberDungeonsTreasuresChest.test.ts | 28 + .../SkyBlockMemberDungeonsTreasuresChest.ts | 30 + .../SkyBlockMemberInventoriesArmor.test.ts | 9 + .../Armor/SkyBlockMemberInventoriesArmor.ts | 13 + ...BlockMemberInventoriesArmorDecoded.test.ts | 9 + .../SkyBlockMemberInventoriesArmorDecoded.ts | 16 + .../SkyBlockMemberInventoriesBackpack.test.ts | 31 + .../SkyBlockMemberInventoriesBackpack.ts | 21 + ...ckMemberInventoriesBackpackDecoded.test.ts | 53 + ...kyBlockMemberInventoriesBackpackDecoded.ts | 18 + ...SkyBlockMemberInventoriesBackpacks.test.ts | 46 + .../SkyBlockMemberInventoriesBackpacks.ts | 98 + .../SkyBlockMemberInventoriesBags.test.ts | 41 + .../Bags/SkyBlockMemberInventoriesBags.ts | 19 + ...BlockMemberInventoriesBagsTalisman.test.ts | 19 + .../SkyBlockMemberInventoriesBagsTalisman.ts | 13 + ...mberInventoriesBagsTalismanDecoded.test.ts | 40 + ...ockMemberInventoriesBagsTalismanDecoded.ts | 25 + ...SkyBlockMemberInventoriesEquipment.test.ts | 19 + .../SkyBlockMemberInventoriesEquipment.ts | 13 + ...kMemberInventoriesEquipmentDecoded.test.ts | 179 + ...yBlockMemberInventoriesEquipmentDecoded.ts | 16 + ...SkyBlockMemberInventoriesInventory.test.ts | 19 + .../SkyBlockMemberInventoriesInventory.ts | 13 + ...kMemberInventoriesInventoryDecoded.test.ts | 87 + ...yBlockMemberInventoriesInventoryDecoded.ts | 15 + .../SkyBlockMemberInventories.test.ts | 30 + .../Inventories/SkyBlockMemberInventories.ts | 31 + ...lockMemberInventoriesBaseInventory.test.ts | 13 + .../SkyBlockMemberInventoriesBaseInventory.ts | 12 + .../SkyBlockMemberJacobContest.test.ts | 17 + .../SkyBlockMemberJacobContest.ts | 14 + .../SkyBlockMemberJacobContests.test.ts | 24 + .../SkyBlockMemberJacobContests.ts | 26 + .../SkyBlockMemberJacobContestsMedals.test.ts | 15 + .../SkyBlockMemberJacobContestsMedals.ts | 12 + .../SkyBlockMemberJacobContestsPerks.test.ts | 15 + .../SkyBlockMemberJacobContestsPerks.ts | 12 + ...kMemberJacobContestsUniqueBrackets.test.ts | 20 + ...yBlockMemberJacobContestsUniqueBrackets.ts | 18 + .../Mining/SkyBlockMemberMining.test.ts | 25 + .../Member/Mining/SkyBlockMemberMining.ts | 27 + .../SkyBlockMemberMiningCrystal.test.ts | 20 + .../Mining/SkyBlockMemberMiningCrystal.ts | 16 + .../Mining/SkyBlockMemberMiningHotm.test.ts | 24 + .../Member/Mining/SkyBlockMemberMiningHotm.ts | 25 + .../SkyBlockMemberMiningHotmForge.test.ts | 26 + .../Mining/SkyBlockMemberMiningHotmForge.ts | 22 + .../SkyBlockMemberMiningHotmForgeItem.test.ts | 35 + .../SkyBlockMemberMiningHotmForgeItem.ts | 34 + .../Mining/SkyBlockMemberMiningPowder.test.ts | 20 + .../Mining/SkyBlockMemberMiningPowder.ts | 18 + .../SkyBlockMemberMiningPowders.test.ts | 18 + .../Mining/SkyBlockMemberMiningPowders.ts | 14 + .../Member/Pets/SkyBlockMemberPet.test.ts | 34 + .../SkyBlock/Member/Pets/SkyBlockMemberPet.ts | 32 + .../Member/Pets/SkyBlockMemberPets.test.ts | 24 + .../Member/Pets/SkyBlockMemberPets.ts | 62 + .../SkyBlockMemberPetsAutoPetRule.test.ts | 29 + .../Pets/SkyBlockMemberPetsAutoPetRule.ts | 26 + .../Pets/SkyBlockMemberPetsAutoPets.test.ts | 14 + .../Member/Pets/SkyBlockMemberPetsAutoPets.ts | 12 + .../Pets/SkyBlockMemberPetsCare.test.ts | 19 + .../Member/Pets/SkyBlockMemberPetsCare.ts | 16 + .../SkyBlockMemberPlayerData.test.ts | 43 + .../PlayerData/SkyBlockMemberPlayerData.ts | 43 + ...yBlockMemberPlayerDataActiveEffect.test.ts | 13 + .../SkyBlockMemberPlayerDataActiveEffect.ts | 16 + .../SkyBlockMemberPlayerDataMinion.test.ts | 36 + .../SkyBlockMemberPlayerDataMinion.ts | 47 + .../SkyBlockMemberPlayerDataMinions.test.ts | 11 + .../SkyBlockMemberPlayerDataMinions.ts | 127 + .../SkyBlockMemberPlayerDataSkills.test.ts | 32 + .../SkyBlockMemberPlayerDataSkills.ts | 61 + .../SkyBlockMemberPlayerStats.test.ts | 42 + .../PlayerStats/SkyBlockMemberPlayerStats.ts | 60 + .../SkyBlockMemberPlayerStatsAuctions.test.ts | 32 + .../SkyBlockMemberPlayerStatsAuctions.ts | 30 + ...lockMemberPlayerStatsAuctionsStats.test.ts | 25 + .../SkyBlockMemberPlayerStatsAuctionsStats.ts | 26 + .../SkyBlockMemberPlayerStatsCandy.test.ts | 20 + .../SkyBlockMemberPlayerStatsCandy.ts | 28 + ...SkyBlockMemberPlayerStatsEndIsland.test.ts | 16 + .../SkyBlockMemberPlayerStatsEndIsland.ts | 14 + ...berPlayerStatsEndIslandDragonFight.test.ts | 9 + ...ckMemberPlayerStatsEndIslandDragonFight.ts | 25 + ...yerStatsEndIslandDragonFightDragon.test.ts | 20 + ...erPlayerStatsEndIslandDragonFightDragon.ts | 22 + .../SkyBlockMemberPlayerStatsFishing.test.ts | 21 + .../SkyBlockMemberPlayerStatsFishing.ts | 22 + .../SkyBlockMemberPlayerStatsGifts.test.ts | 13 + .../SkyBlockMemberPlayerStatsGifts.ts | 16 + .../SkyBlockMemberPlayerStatsMythos.test.ts | 19 + .../SkyBlockMemberPlayerStatsMythos.ts | 20 + ...ockMemberPlayerStatsSpookyFestival.test.ts | 17 + ...SkyBlockMemberPlayerStatsSpookyFestival.ts | 18 + .../SkyBlockMemberPlayerStatsWinter.test.ts | 17 + .../SkyBlockMemberPlayerStatsWinter.ts | 14 + .../Quests/SkyBlockMemberQuests.test.ts | 15 + .../Member/Quests/SkyBlockMemberQuests.ts | 13 + .../Quests/SkyBlockMemberQuestsHarp.test.ts | 47 + .../Member/Quests/SkyBlockMemberQuestsHarp.ts | 47 + .../SkyBlockMemberQuestsHarpSong.test.ts | 18 + .../Quests/SkyBlockMemberQuestsHarpSong.ts | 20 + .../SkyBlockMemberQuestsTrapper.test.ts | 15 + .../Quests/SkyBlockMemberQuestsTrapper.ts | 16 + .../Member/Rift/SkyBlockMemberRift.test.ts | 47 + .../Member/Rift/SkyBlockMemberRift.ts | 45 + .../Rift/SkyBlockMemberRiftAccess.test.ts | 19 + .../Member/Rift/SkyBlockMemberRiftAccess.ts | 16 + .../SkyBlockMemberRiftBlackLagoon.test.ts | 17 + .../Rift/SkyBlockMemberRiftBlackLagoon.ts | 14 + .../Rift/SkyBlockMemberRiftCastle.test.ts | 15 + .../Member/Rift/SkyBlockMemberRiftCastle.ts | 12 + .../Rift/SkyBlockMemberRiftDeadCats.test.ts | 20 + .../Member/Rift/SkyBlockMemberRiftDeadCats.ts | 18 + .../Rift/SkyBlockMemberRiftDreamFarm.test.ts | 13 + .../Rift/SkyBlockMemberRiftDreamFarm.ts | 10 + .../Rift/SkyBlockMemberRiftEnigma.test.ts | 15 + .../Member/Rift/SkyBlockMemberRiftEnigma.ts | 12 + .../Rift/SkyBlockMemberRiftGallery.test.ts | 17 + .../Member/Rift/SkyBlockMemberRiftGallery.ts | 17 + ...lockMemberRiftGallerySecuredTrophy.test.ts | 18 + .../SkyBlockMemberRiftGallerySecuredTrophy.ts | 16 + .../Rift/SkyBlockMemberRiftInventory.test.ts | 22 + .../Rift/SkyBlockMemberRiftInventory.ts | 20 + .../Rift/SkyBlockMemberRiftWitherCage.test.ts | 12 + .../Rift/SkyBlockMemberRiftWitherCage.ts | 10 + .../SkyBlockMemberRiftWizardTower.test.ts | 9 + .../Rift/SkyBlockMemberRiftWizardTower.ts | 10 + .../Rift/SkyBlockMemberRiftWyldWoods.test.ts | 21 + .../Rift/SkyBlockMemberRiftWyldWoods.ts | 18 + .../SkyBlockMemberRiftVillagePlaza.test.ts | 26 + .../SkyBlockMemberRiftVillagePlaza.ts | 24 + ...kyBlockMemberRiftVillagePlazaBarry.test.ts | 15 + .../SkyBlockMemberRiftVillagePlazaBarry.ts | 12 + ...yBlockMemberRiftVillagePlazaCowboy.test.ts | 16 + .../SkyBlockMemberRiftVillagePlazaCowboy.ts | 14 + ...yBlockMemberRiftVillagePlazaMurder.test.ts | 17 + .../SkyBlockMemberRiftVillagePlazaMurder.ts | 14 + .../SkyBlockMemberRiftWestVillage.test.ts | 21 + .../SkyBlockMemberRiftWestVillage.ts | 19 + ...ockMemberRiftWestVillageCrazyKloon.test.ts | 17 + ...SkyBlockMemberRiftWestVillageCrazyKloon.ts | 14 + ...kyBlockMemberRiftWestVillageGlyphs.test.ts | 21 + .../SkyBlockMemberRiftWestVillageGlyphs.ts | 18 + ...BlockMemberRiftWestVillageKatHouse.test.ts | 15 + .../SkyBlockMemberRiftWestVillageKatHouse.ts | 12 + ...ckMemberRiftWestVillageMirrorverse.test.ts | 18 + ...kyBlockMemberRiftWestVillageMirrorverse.ts | 16 + .../SkyBlock/Member/SkyBlockMember.test.ts | 78 + .../SkyBlock/Member/SkyBlockMember.ts | 81 + .../Member/SkyBlockMemberCurrencies.test.ts | 29 + .../Member/SkyBlockMemberCurrencies.ts | 26 + .../Member/SkyBlockMemberFairySouls.test.ts | 15 + .../Member/SkyBlockMemberFairySouls.ts | 16 + .../Member/SkyBlockMemberLeveling.test.ts | 34 + .../SkyBlock/Member/SkyBlockMemberLeveling.ts | 36 + .../Member/SkyBlockMemberObjectives.test.ts | 14 + .../Member/SkyBlockMemberObjectives.ts | 17 + .../Member/SkyBlockMemberProfile.test.ts | 19 + .../SkyBlock/Member/SkyBlockMemberProfile.ts | 16 + .../Slayers/SkyBlockMemberSlayer.test.ts | 25 + .../Member/Slayers/SkyBlockMemberSlayer.ts | 28 + .../SkyBlockMemberSlayerClaimedLevels.test.ts | 27 + .../SkyBlockMemberSlayerClaimedLevels.ts | 24 + .../Slayers/SkyBlockMemberSlayers.test.ts | 25 + .../Member/Slayers/SkyBlockMemberSlayers.ts | 23 + .../SkyBlockMemberSlayersQuest.test.ts | 36 + .../Slayers/SkyBlockMemberSlayersQuest.ts | 36 + .../SkyBlock/Museum/SkyBlockMuseum.test.ts | 13 + .../SkyBlock/Museum/SkyBlockMuseum.ts | 15 + .../Museum/SkyBlockMuseumItem.test.ts | 22 + .../SkyBlock/Museum/SkyBlockMuseumItem.ts | 28 + .../Museum/SkyBlockMuseumMember.test.ts | 18 + .../SkyBlock/Museum/SkyBlockMuseumMember.ts | 25 + .../SkyBlock/News/SkyBlockNews.test.ts | 17 + .../News/{SkyblockNews.ts => SkyBlockNews.ts} | 12 +- .../SkyBlock/Potion/SkyBlockPotionEffect.ts | 25 + .../Banking/SkyBlockProfileBanking.test.ts | 14 + .../Profile/Banking/SkyBlockProfileBanking.ts | 18 + ...SkyBlockProfilesBankingTransaction.test.ts | 18 + .../SkyBlockProfilesBankingTransaction.ts | 20 + .../SkyBlockProfileCommunityUpgrades.test.ts | 15 + .../SkyBlockProfileCommunityUpgrades.ts | 22 + ...ockProfileCommunityUpgradesUpgrade.test.ts | 16 + ...SkyBlockProfileCommunityUpgradesUpgrade.ts | 18 + ...ckProfileCommunityUpgradesUpgraded.test.ts | 21 + ...kyBlockProfileCommunityUpgradesUpgraded.ts | 21 + ...kProfileCommunityUpgradesUpgrading.test.ts | 13 + ...yBlockProfileCommunityUpgradesUpgrading.ts | 13 + .../SkyBlock/Profile/SkyBlockProfile.test.ts | 36 + .../SkyBlock/Profile/SkyBlockProfile.ts | 46 + .../SkyBlock/Skills/SkyBlockSkill.test.ts | 18 + .../SkyBlock/Skills/SkyBlockSkill.ts | 20 + .../Skills/SkyBlockSkillLevel.test.ts | 15 + .../SkyBlock/Skills/SkyBlockSkillLevel.ts | 16 + .../SkyBlock/Skills/SkyBlockSkills.test.ts | 38 + .../SkyBlock/Skills/SkyBlockSkills.ts | 36 + src/Structures/SkyBlock/SkyBlockItem.test.ts | 127 + src/Structures/SkyBlock/SkyBlockItem.ts | 128 + .../SkyBlock/SkyblockGarden.test.ts | 30 - src/Structures/SkyBlock/SkyblockGarden.ts | 71 - src/Structures/SkyBlock/SkyblockGemstone.ts | 12 - .../SkyBlock/SkyblockInventoryItem.ts | 75 - src/Structures/SkyBlock/SkyblockItem.ts | 128 - .../SkyBlock/SkyblockMember.test.ts | 85 - src/Structures/SkyBlock/SkyblockMember.ts | 239 - .../SkyBlock/SkyblockMemberMinion.ts | 34 - .../SkyBlock/SkyblockMemberMinions.ts | 32 - .../SkyBlock/SkyblockMemberStats.ts | 140 - src/Structures/SkyBlock/SkyblockMuseum.ts | 43 - src/Structures/SkyBlock/SkyblockMuseumItem.ts | 26 - src/Structures/SkyBlock/SkyblockPet.ts | 31 - src/Structures/SkyBlock/SkyblockProfile.ts | 45 - src/Structures/SkyBlock/Static/Bingo.ts | 50 - src/Structures/SkyBlock/Static/BingoData.ts | 21 - src/Structures/SkyBlock/Static/Candidate.ts | 26 - src/Structures/SkyBlock/Static/Government.ts | 42 - src/Structures/SkyBlock/Static/Perk.ts | 10 - src/Types/API.ts | 22 +- src/Types/Booster.ts | 2 + src/Types/Client.ts | 2 + src/Types/Color.ts | 2 + src/Types/Game.ts | 2 + src/Types/Global.ts | 4 + src/Types/Guild.ts | 2 + src/Types/Player.ts | 1 + src/Types/Requests.ts | 2 + src/Types/SkyBlock.ts | 3532 ++++++++++++ src/Types/Skyblock.ts | 416 -- src/Types/Static.ts | 2 + src/Utils/Constants.ts | 4864 ++++++++++------- src/Utils/SkyBlockUtils.ts | 214 + src/Utils/SkyblockUtils.test.ts | 9 - src/Utils/SkyblockUtils.ts | 553 -- src/Utils/TicksToMilliseconds.ts | 3 + src/index.ts | 519 +- vitest.config.ts | 3 +- 416 files changed, 17356 insertions(+), 7559 deletions(-) create mode 100644 .github/scripts/generateIndexFile.ts create mode 100644 src/API/getSkyBlockAuction.test.ts create mode 100644 src/API/getSkyBlockAuction.ts create mode 100644 src/API/getSkyBlockAuctions.test.ts create mode 100644 src/API/getSkyBlockAuctions.ts create mode 100644 src/API/getSkyBlockBazaar.test.ts rename src/API/{getSkyblockBazaar.ts => getSkyBlockBazaar.ts} (58%) create mode 100644 src/API/getSkyBlockBingo.test.ts rename src/API/{getSkyblockBingo.ts => getSkyBlockBingo.ts} (61%) create mode 100644 src/API/getSkyBlockCollections.test.ts create mode 100644 src/API/getSkyBlockCollections.ts create mode 100644 src/API/getSkyBlockElection.test.ts rename src/API/{getSkyblockGovernment.ts => getSkyBlockElection.ts} (58%) create mode 100644 src/API/getSkyBlockEndedAuctions.test.ts create mode 100644 src/API/getSkyBlockEndedAuctions.ts rename src/API/{getSkyblockFireSales.test.ts => getSkyBlockFireSales.test.ts} (70%) rename src/API/{getSkyblockFireSales.ts => getSkyBlockFireSales.ts} (55%) create mode 100644 src/API/getSkyBlockGarden.test.ts rename src/API/{getSkyblockGarden.ts => getSkyBlockGarden.ts} (70%) create mode 100644 src/API/getSkyBlockItems.test.ts rename src/API/{getSkyblockItems.ts => getSkyBlockItems.ts} (62%) create mode 100644 src/API/getSkyBlockMuseum.test.ts create mode 100644 src/API/getSkyBlockMuseum.ts rename src/API/{getSkyblockNews.test.ts => getSkyBlockNews.test.ts} (57%) rename src/API/{getSkyblockNews.ts => getSkyBlockNews.ts} (63%) create mode 100644 src/API/getSkyBlockProfile.test.ts create mode 100644 src/API/getSkyBlockProfile.ts create mode 100644 src/API/getSkyBlockProfiles.test.ts create mode 100644 src/API/getSkyBlockProfiles.ts create mode 100644 src/API/getSkyBlockSkills.test.ts create mode 100644 src/API/getSkyBlockSkills.ts delete mode 100644 src/API/getSkyblockAuction.test.ts delete mode 100644 src/API/getSkyblockAuction.ts delete mode 100644 src/API/getSkyblockAuctions.test.ts delete mode 100644 src/API/getSkyblockAuctions.ts delete mode 100644 src/API/getSkyblockAuctionsByPlayer.test.ts delete mode 100644 src/API/getSkyblockAuctionsByPlayer.ts delete mode 100644 src/API/getSkyblockBazaar.test.ts delete mode 100644 src/API/getSkyblockBingo.test.ts delete mode 100644 src/API/getSkyblockGarden.test.ts delete mode 100644 src/API/getSkyblockGovernment.test.ts delete mode 100644 src/API/getSkyblockItems.test.ts delete mode 100644 src/API/getSkyblockMember.test.ts delete mode 100644 src/API/getSkyblockMember.ts delete mode 100644 src/API/getSkyblockMuseum.test.ts delete mode 100644 src/API/getSkyblockMuseum.ts delete mode 100644 src/API/getSkyblockProfiles.test.ts delete mode 100644 src/API/getSkyblockProfiles.ts delete mode 100644 src/Structures/SkyBlock/Auctions/Auction.ts delete mode 100644 src/Structures/SkyBlock/Auctions/AuctionInfo.ts delete mode 100644 src/Structures/SkyBlock/Auctions/BaseAuction.test.ts delete mode 100644 src/Structures/SkyBlock/Auctions/BaseAuction.ts delete mode 100644 src/Structures/SkyBlock/Auctions/Bid.ts create mode 100644 src/Structures/SkyBlock/Auctions/SkyBlockAuction.test.ts create mode 100644 src/Structures/SkyBlock/Auctions/SkyBlockAuction.ts create mode 100644 src/Structures/SkyBlock/Auctions/SkyBlockAuctionBid.test.ts create mode 100644 src/Structures/SkyBlock/Auctions/SkyBlockAuctionBid.ts create mode 100644 src/Structures/SkyBlock/Auctions/SkyBlockAuctionInfo.test.ts create mode 100644 src/Structures/SkyBlock/Auctions/SkyBlockAuctionInfo.ts create mode 100644 src/Structures/SkyBlock/Auctions/SkyBlockBaseAuction.test.ts create mode 100644 src/Structures/SkyBlock/Auctions/SkyBlockBaseAuction.ts create mode 100644 src/Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.test.ts create mode 100644 src/Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.ts delete mode 100644 src/Structures/SkyBlock/Bazaar/Order.test.ts delete mode 100644 src/Structures/SkyBlock/Bazaar/Order.ts delete mode 100644 src/Structures/SkyBlock/Bazaar/Product.test.ts delete mode 100644 src/Structures/SkyBlock/Bazaar/Product.ts create mode 100644 src/Structures/SkyBlock/Bazaar/SkyBlockBazaar.test.ts create mode 100644 src/Structures/SkyBlock/Bazaar/SkyBlockBazaar.ts create mode 100644 src/Structures/SkyBlock/Bazaar/SkyBlockBazaarProduct.test.ts create mode 100644 src/Structures/SkyBlock/Bazaar/SkyBlockBazaarProduct.ts create mode 100644 src/Structures/SkyBlock/Bazaar/SkyBlockBazaarProductOrder.test.ts create mode 100644 src/Structures/SkyBlock/Bazaar/SkyBlockBazaarProductOrder.ts create mode 100644 src/Structures/SkyBlock/Bazaar/SkyBlockBazaarQuickStatus.test.ts create mode 100644 src/Structures/SkyBlock/Bazaar/SkyBlockBazaarQuickStatus.ts create mode 100644 src/Structures/SkyBlock/Bingo/SkyBlockBingo.test.ts create mode 100644 src/Structures/SkyBlock/Bingo/SkyBlockBingo.ts create mode 100644 src/Structures/SkyBlock/Bingo/SkyBlockBingoGoal.test.ts create mode 100644 src/Structures/SkyBlock/Bingo/SkyBlockBingoGoal.ts create mode 100644 src/Structures/SkyBlock/Collections/SkyBlockCollection.test.ts create mode 100644 src/Structures/SkyBlock/Collections/SkyBlockCollection.ts create mode 100644 src/Structures/SkyBlock/Collections/SkyBlockCollectionTier.test.ts create mode 100644 src/Structures/SkyBlock/Collections/SkyBlockCollectionTier.ts create mode 100644 src/Structures/SkyBlock/Collections/SkyBlockCollections.test.ts create mode 100644 src/Structures/SkyBlock/Collections/SkyBlockCollections.ts create mode 100644 src/Structures/SkyBlock/Election/SkyBlockElection.test.ts create mode 100644 src/Structures/SkyBlock/Election/SkyBlockElection.ts create mode 100644 src/Structures/SkyBlock/Election/SkyBlockElectionCandidate.test.ts create mode 100644 src/Structures/SkyBlock/Election/SkyBlockElectionCandidate.ts create mode 100644 src/Structures/SkyBlock/Election/SkyBlockElectionCandidatePerk.test.ts create mode 100644 src/Structures/SkyBlock/Election/SkyBlockElectionCandidatePerk.ts create mode 100644 src/Structures/SkyBlock/Election/SkyBlockElectionData.test.ts create mode 100644 src/Structures/SkyBlock/Election/SkyBlockElectionData.ts create mode 100644 src/Structures/SkyBlock/FireSale/SkyBlockFireSale.test.ts rename src/Structures/SkyBlock/{Static/FireSale.ts => FireSale/SkyBlockFireSale.ts} (56%) create mode 100644 src/Structures/SkyBlock/Garden/SkyBlockGarden.test.ts create mode 100644 src/Structures/SkyBlock/Garden/SkyBlockGarden.ts create mode 100644 src/Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitor.test.ts create mode 100644 src/Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitor.ts create mode 100644 src/Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitorRequirement.test.ts create mode 100644 src/Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitorRequirement.ts create mode 100644 src/Structures/SkyBlock/Garden/SkyBlockGardenComposter.test.ts create mode 100644 src/Structures/SkyBlock/Garden/SkyBlockGardenComposter.ts create mode 100644 src/Structures/SkyBlock/Garden/SkyBlockGardenComposterUpgrades.test.ts create mode 100644 src/Structures/SkyBlock/Garden/SkyBlockGardenComposterUpgrades.ts create mode 100644 src/Structures/SkyBlock/Garden/SkyBlockGardenCropMilestones.test.ts create mode 100644 src/Structures/SkyBlock/Garden/SkyBlockGardenCropMilestones.ts create mode 100644 src/Structures/SkyBlock/Garden/SkyBlockGardenCropsUpgrades.test.ts create mode 100644 src/Structures/SkyBlock/Garden/SkyBlockGardenCropsUpgrades.ts create mode 100644 src/Structures/SkyBlock/Garden/SkyBlockGardenVisitors.test.ts create mode 100644 src/Structures/SkyBlock/Garden/SkyBlockGardenVisitors.ts create mode 100644 src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.ts create mode 100644 src/Structures/SkyBlock/Inventory/SkyBlockInventoryItemAttribute.ts create mode 100644 src/Structures/SkyBlock/Inventory/SkyBlockInventoryItemEnchantment.ts create mode 100644 src/Structures/SkyBlock/Inventory/SkyBlockInventoryItemRune.ts create mode 100644 src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBag.test.ts create mode 100644 src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBag.ts create mode 100644 src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBagTuning.test.ts create mode 100644 src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBagTuning.ts create mode 100644 src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBagTuningSlot.test.ts create mode 100644 src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBagTuningSlot.ts create mode 100644 src/Structures/SkyBlock/Member/Bestiary/SkyBlockMemberBestiary.test.ts create mode 100644 src/Structures/SkyBlock/Member/Bestiary/SkyBlockMemberBestiary.ts create mode 100644 src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactory.test.ts create mode 100644 src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactory.ts create mode 100644 src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryEggs.test.ts create mode 100644 src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryEggs.ts create mode 100644 src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryEmployees.test.ts create mode 100644 src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryEmployees.ts create mode 100644 src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryHitmen.test.ts create mode 100644 src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryHitmen.ts create mode 100644 src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryTimeTower.test.ts create mode 100644 src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryTimeTower.ts create mode 100644 src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryUpgrades.test.ts create mode 100644 src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryUpgrades.ts create mode 100644 src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsle.test.ts create mode 100644 src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsle.ts create mode 100644 src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleAbiphone.test.ts create mode 100644 src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleAbiphone.ts create mode 100644 src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojo.test.ts create mode 100644 src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojo.ts create mode 100644 src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojoMinigame.test.ts create mode 100644 src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojoMinigame.ts create mode 100644 src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleKuudra.test.ts create mode 100644 src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleKuudra.ts create mode 100644 src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleKuudraPartyFinder.test.ts create mode 100644 src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleKuudraPartyFinder.ts create mode 100644 src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleMatriarch.test.ts create mode 100644 src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleMatriarch.ts create mode 100644 src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish.test.ts create mode 100644 src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish.ts create mode 100644 src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFishFish.test.ts create mode 100644 src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFishFish.ts create mode 100644 src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeons.test.ts create mode 100644 src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeons.ts create mode 100644 src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsClasses.test.ts create mode 100644 src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsClasses.ts create mode 100644 src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsFloor.test.ts create mode 100644 src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsFloor.ts create mode 100644 src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsFloorRun.test.ts create mode 100644 src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsFloorRun.ts create mode 100644 src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsMode.test.ts create mode 100644 src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsMode.ts create mode 100644 src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasureRun.test.ts create mode 100644 src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasureRun.ts create mode 100644 src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasuresChest.test.ts create mode 100644 src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasuresChest.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmor.test.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmor.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmorDecoded.test.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmorDecoded.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.test.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpackDecoded.test.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpackDecoded.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpacks.test.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpacks.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBags.test.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBags.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalisman.test.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalisman.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalismanDecoded.test.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalismanDecoded.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipment.test.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipment.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipmentDecoded.test.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipmentDecoded.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventory.test.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventory.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventoryDecoded.test.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventoryDecoded.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.test.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventoriesBaseInventory.test.ts create mode 100644 src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventoriesBaseInventory.ts create mode 100644 src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContest.test.ts create mode 100644 src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContest.ts create mode 100644 src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContests.test.ts create mode 100644 src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContests.ts create mode 100644 src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsMedals.test.ts create mode 100644 src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsMedals.ts create mode 100644 src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsPerks.test.ts create mode 100644 src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsPerks.ts create mode 100644 src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsUniqueBrackets.test.ts create mode 100644 src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsUniqueBrackets.ts create mode 100644 src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMining.test.ts create mode 100644 src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMining.ts create mode 100644 src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningCrystal.test.ts create mode 100644 src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningCrystal.ts create mode 100644 src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotm.test.ts create mode 100644 src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotm.ts create mode 100644 src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForge.test.ts create mode 100644 src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForge.ts create mode 100644 src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForgeItem.test.ts create mode 100644 src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForgeItem.ts create mode 100644 src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningPowder.test.ts create mode 100644 src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningPowder.ts create mode 100644 src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningPowders.test.ts create mode 100644 src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningPowders.ts create mode 100644 src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPet.test.ts create mode 100644 src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPet.ts create mode 100644 src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPets.test.ts create mode 100644 src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPets.ts create mode 100644 src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsAutoPetRule.test.ts create mode 100644 src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsAutoPetRule.ts create mode 100644 src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsAutoPets.test.ts create mode 100644 src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsAutoPets.ts create mode 100644 src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsCare.test.ts create mode 100644 src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsCare.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerData.test.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerData.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataActiveEffect.test.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataActiveEffect.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataMinion.test.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataMinion.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataMinions.test.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataMinions.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataSkills.test.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataSkills.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStats.test.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStats.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsAuctions.test.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsAuctions.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsAuctionsStats.test.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsAuctionsStats.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsCandy.test.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsCandy.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIsland.test.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIsland.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFight.test.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFight.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFightDragon.test.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFightDragon.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsFishing.test.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsFishing.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsGifts.test.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsGifts.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsMythos.test.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsMythos.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsSpookyFestival.test.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsSpookyFestival.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsWinter.test.ts create mode 100644 src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsWinter.ts create mode 100644 src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuests.test.ts create mode 100644 src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuests.ts create mode 100644 src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsHarp.test.ts create mode 100644 src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsHarp.ts create mode 100644 src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsHarpSong.test.ts create mode 100644 src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsHarpSong.ts create mode 100644 src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsTrapper.test.ts create mode 100644 src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsTrapper.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRift.test.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRift.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftAccess.test.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftAccess.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftBlackLagoon.test.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftBlackLagoon.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftCastle.test.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftCastle.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftDeadCats.test.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftDeadCats.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftDreamFarm.test.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftDreamFarm.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftEnigma.test.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftEnigma.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftGallery.test.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftGallery.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftGallerySecuredTrophy.test.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftGallerySecuredTrophy.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftInventory.test.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftInventory.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWitherCage.test.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWitherCage.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWizardTower.test.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWizardTower.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWyldWoods.test.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWyldWoods.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlaza.test.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlaza.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaBarry.test.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaBarry.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaCowboy.test.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaCowboy.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaMurder.test.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaMurder.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillage.test.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillage.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageCrazyKloon.test.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageCrazyKloon.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageGlyphs.test.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageGlyphs.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageKatHouse.test.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageKatHouse.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageMirrorverse.test.ts create mode 100644 src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageMirrorverse.ts create mode 100644 src/Structures/SkyBlock/Member/SkyBlockMember.test.ts create mode 100644 src/Structures/SkyBlock/Member/SkyBlockMember.ts create mode 100644 src/Structures/SkyBlock/Member/SkyBlockMemberCurrencies.test.ts create mode 100644 src/Structures/SkyBlock/Member/SkyBlockMemberCurrencies.ts create mode 100644 src/Structures/SkyBlock/Member/SkyBlockMemberFairySouls.test.ts create mode 100644 src/Structures/SkyBlock/Member/SkyBlockMemberFairySouls.ts create mode 100644 src/Structures/SkyBlock/Member/SkyBlockMemberLeveling.test.ts create mode 100644 src/Structures/SkyBlock/Member/SkyBlockMemberLeveling.ts create mode 100644 src/Structures/SkyBlock/Member/SkyBlockMemberObjectives.test.ts create mode 100644 src/Structures/SkyBlock/Member/SkyBlockMemberObjectives.ts create mode 100644 src/Structures/SkyBlock/Member/SkyBlockMemberProfile.test.ts create mode 100644 src/Structures/SkyBlock/Member/SkyBlockMemberProfile.ts create mode 100644 src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayer.test.ts create mode 100644 src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayer.ts create mode 100644 src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayerClaimedLevels.test.ts create mode 100644 src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayerClaimedLevels.ts create mode 100644 src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayers.test.ts create mode 100644 src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayers.ts create mode 100644 src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayersQuest.test.ts create mode 100644 src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayersQuest.ts create mode 100644 src/Structures/SkyBlock/Museum/SkyBlockMuseum.test.ts create mode 100644 src/Structures/SkyBlock/Museum/SkyBlockMuseum.ts create mode 100644 src/Structures/SkyBlock/Museum/SkyBlockMuseumItem.test.ts create mode 100644 src/Structures/SkyBlock/Museum/SkyBlockMuseumItem.ts create mode 100644 src/Structures/SkyBlock/Museum/SkyBlockMuseumMember.test.ts create mode 100644 src/Structures/SkyBlock/Museum/SkyBlockMuseumMember.ts create mode 100644 src/Structures/SkyBlock/News/SkyBlockNews.test.ts rename src/Structures/SkyBlock/News/{SkyblockNews.ts => SkyBlockNews.ts} (77%) create mode 100644 src/Structures/SkyBlock/Potion/SkyBlockPotionEffect.ts create mode 100644 src/Structures/SkyBlock/Profile/Banking/SkyBlockProfileBanking.test.ts create mode 100644 src/Structures/SkyBlock/Profile/Banking/SkyBlockProfileBanking.ts create mode 100644 src/Structures/SkyBlock/Profile/Banking/SkyBlockProfilesBankingTransaction.test.ts create mode 100644 src/Structures/SkyBlock/Profile/Banking/SkyBlockProfilesBankingTransaction.ts create mode 100644 src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgrades.test.ts create mode 100644 src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgrades.ts create mode 100644 src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgrade.test.ts create mode 100644 src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgrade.ts create mode 100644 src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgraded.test.ts create mode 100644 src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgraded.ts create mode 100644 src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgrading.test.ts create mode 100644 src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgrading.ts create mode 100644 src/Structures/SkyBlock/Profile/SkyBlockProfile.test.ts create mode 100644 src/Structures/SkyBlock/Profile/SkyBlockProfile.ts create mode 100644 src/Structures/SkyBlock/Skills/SkyBlockSkill.test.ts create mode 100644 src/Structures/SkyBlock/Skills/SkyBlockSkill.ts create mode 100644 src/Structures/SkyBlock/Skills/SkyBlockSkillLevel.test.ts create mode 100644 src/Structures/SkyBlock/Skills/SkyBlockSkillLevel.ts create mode 100644 src/Structures/SkyBlock/Skills/SkyBlockSkills.test.ts create mode 100644 src/Structures/SkyBlock/Skills/SkyBlockSkills.ts create mode 100644 src/Structures/SkyBlock/SkyBlockItem.test.ts create mode 100644 src/Structures/SkyBlock/SkyBlockItem.ts delete mode 100644 src/Structures/SkyBlock/SkyblockGarden.test.ts delete mode 100644 src/Structures/SkyBlock/SkyblockGarden.ts delete mode 100644 src/Structures/SkyBlock/SkyblockGemstone.ts delete mode 100644 src/Structures/SkyBlock/SkyblockInventoryItem.ts delete mode 100644 src/Structures/SkyBlock/SkyblockItem.ts delete mode 100644 src/Structures/SkyBlock/SkyblockMember.test.ts delete mode 100644 src/Structures/SkyBlock/SkyblockMember.ts delete mode 100644 src/Structures/SkyBlock/SkyblockMemberMinion.ts delete mode 100644 src/Structures/SkyBlock/SkyblockMemberMinions.ts delete mode 100644 src/Structures/SkyBlock/SkyblockMemberStats.ts delete mode 100644 src/Structures/SkyBlock/SkyblockMuseum.ts delete mode 100644 src/Structures/SkyBlock/SkyblockMuseumItem.ts delete mode 100644 src/Structures/SkyBlock/SkyblockPet.ts delete mode 100644 src/Structures/SkyBlock/SkyblockProfile.ts delete mode 100644 src/Structures/SkyBlock/Static/Bingo.ts delete mode 100644 src/Structures/SkyBlock/Static/BingoData.ts delete mode 100644 src/Structures/SkyBlock/Static/Candidate.ts delete mode 100644 src/Structures/SkyBlock/Static/Government.ts delete mode 100644 src/Structures/SkyBlock/Static/Perk.ts create mode 100644 src/Types/Global.ts create mode 100644 src/Types/SkyBlock.ts delete mode 100644 src/Types/Skyblock.ts create mode 100644 src/Utils/SkyBlockUtils.ts delete mode 100644 src/Utils/SkyblockUtils.test.ts delete mode 100644 src/Utils/SkyblockUtils.ts create mode 100644 src/Utils/TicksToMilliseconds.ts diff --git a/.github/scripts/checkCoverage.ts b/.github/scripts/checkCoverage.ts index 574bcd08f..9b4685c7f 100644 --- a/.github/scripts/checkCoverage.ts +++ b/.github/scripts/checkCoverage.ts @@ -1,3 +1,5 @@ +/* v8 ignore next 1000 */ + import { parseString } from 'xml2js'; import { readFile } from 'fs'; diff --git a/.github/scripts/generateIndexFile.ts b/.github/scripts/generateIndexFile.ts new file mode 100644 index 000000000..82f4ae60b --- /dev/null +++ b/.github/scripts/generateIndexFile.ts @@ -0,0 +1,98 @@ +/* v8 ignore next 1000 */ + +import { readdir } from 'fs/promises'; +import { writeFileSync } from 'fs'; + +async function scanDirectory(directoryPath: string, goDeep: boolean = true): Promise { + const filePaths: string[] = []; + const files = await readdir(directoryPath, { withFileTypes: true }); + + for (const file of files) { + const fullPath = directoryPath + file.name; + if (file.isDirectory() && goDeep) { + const paths = await scanDirectory(`${fullPath}/`); + paths.forEach((path) => filePaths.push(path)); + } else { + if (fullPath.endsWith('.test.ts')) continue; + if (fullPath.endsWith('index.ts')) continue; + filePaths.push(fullPath.replaceAll('./src/', './')); + } + } + + return filePaths; +} + +async function generateBaseIndex() { + const lines: string[] = [ + '/* v8 ignore next 1000 */', + '/* eslint-disable max-len */', + '', + '', + "import Client from './Client.js';", + "import Errors from './Errors.js';", + '' + ]; + + const importNames: string[] = []; + + const typesPaths = await scanDirectory('./src/Types/'); + typesPaths.forEach((path) => { + const fixedPath = path.replaceAll('.ts', '.js'); + lines.push(`export * from '${fixedPath}';`); + }); + + lines.push(''); + + const structuresPaths = await scanDirectory('./src/Structures/'); + const fixedStructuresPaths: string[] = []; + + structuresPaths.forEach((path) => { + const importName = path.split('.ts')[0].split('/')[path.split('.ts')[0].split('/').length - 1]; + importNames.push(importName); + const fixedPath = path.replaceAll('.ts', '.js'); + fixedStructuresPaths.push(`import ${importName} from '${fixedPath}';`); + }); + + fixedStructuresPaths.sort().forEach((path) => lines.push(path)); + + lines.push(''); + lines.push('export default {'); + lines.push('Client,'); + lines.push('Errors,'); + lines.push(''); + + importNames.sort().forEach((importName) => lines.push(`${importName},`)); + lines.push('};'); + lines.push(''); + + writeFileSync('./src/index.ts', lines.join('\n')); +} + +async function generateAPIIndex() { + const lines: string[] = ['/* v8 ignore next 400 */', '']; + + const importNames: string[] = []; + + const apiPaths = await scanDirectory('./src/API/', false); + const fixedAPIPaths: string[] = []; + + apiPaths.forEach((path) => { + const importName = path.split('.ts')[0].split('/')[path.split('.ts')[0].split('/').length - 1]; + importNames.push(importName); + const fixedPath = path.replaceAll('.ts', '.js').replaceAll('./API/', './'); + fixedAPIPaths.push(`import ${importName} from '${fixedPath}';`); + }); + + fixedAPIPaths.sort().forEach((path) => lines.push(path)); + + lines.push(''); + lines.push('export default {'); + importNames.sort().forEach((importName) => lines.push(`${importName},`)); + lines.push('};'); + lines.push(''); + + writeFileSync('./src/API/index.ts', lines.join('\n')); +} + +generateBaseIndex(); +generateAPIIndex(); diff --git a/package.json b/package.json index 2071749ad..2aef4ba6c 100644 --- a/package.json +++ b/package.json @@ -34,11 +34,10 @@ "packageManager": "pnpm@9.7.1", "author": "Kathund", "dependencies": { - "farming-weight": "^0.8.2", + "minecraft-data": "^3.85.0", "node-cache": "^5.1.2", "prismarine-nbt": "^2.7.0", - "rss-parser": "^3.13.0", - "skyhelper-networth": "^1.27.3" + "rss-parser": "^3.13.0" }, "license": "MIT", "readme": "https://github.com/Hypixel-API-Reborn/hypixel-api-reborn?tab=readme-ov-file#hypixel-api--reborn", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 836bde897..ff012a1f3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,9 @@ importers: .: dependencies: - farming-weight: - specifier: ^0.8.2 - version: 0.8.2 + minecraft-data: + specifier: ^3.85.0 + version: 3.85.0 node-cache: specifier: ^5.1.2 version: 5.1.2 @@ -20,31 +20,28 @@ importers: rss-parser: specifier: ^3.13.0 version: 3.13.0 - skyhelper-networth: - specifier: ^1.27.3 - version: 1.27.3 devDependencies: '@8hobbies/typedoc-plugin-404': specifier: ^3.1.0 - version: 3.1.0(typedoc@0.27.9(typescript@5.8.2)) + version: 3.2.1(typedoc@0.27.9(typescript@5.8.2)) '@eslint/js': specifier: ^9.22.0 - version: 9.22.0 + version: 9.23.0 '@j4cobi/eslint-plugin-sort-imports': specifier: ^1.0.2 - version: 1.0.2(eslint@9.22.0)(typescript@5.8.2) + version: 1.0.2(eslint@9.23.0)(typescript@5.8.2) '@types/eslint': specifier: ^9.6.1 version: 9.6.1 '@types/node': specifier: ^22.13.10 - version: 22.13.10 + version: 22.13.13 '@types/xml2js': specifier: ^0.4.14 version: 0.4.14 '@vitest/coverage-v8': specifier: ^2.1.9 - version: 2.1.9(vitest@2.1.9(@types/node@22.13.10)(@vitest/ui@2.1.9)) + version: 2.1.9(vitest@2.1.9(@types/node@22.13.13)(@vitest/ui@2.1.9)) '@vitest/ui': specifier: ^2.1.9 version: 2.1.9(vitest@2.1.9) @@ -53,10 +50,10 @@ importers: version: 16.4.7 eslint: specifier: ^9.22.0 - version: 9.22.0 + version: 9.23.0 eslint-config-prettier: specifier: ^10.1.1 - version: 10.1.1(eslint@9.22.0) + version: 10.1.1(eslint@9.23.0) globals: specifier: ^15.15.0 version: 15.15.0 @@ -71,25 +68,25 @@ importers: version: 1.3.0(typedoc@0.27.9(typescript@5.8.2)) typedoc-plugin-rename-defaults: specifier: ^0.7.2 - version: 0.7.2(typedoc@0.27.9(typescript@5.8.2)) + version: 0.7.3(typedoc@0.27.9(typescript@5.8.2)) typescript: specifier: ^5.8.2 version: 5.8.2 typescript-eslint: specifier: ^8.26.0 - version: 8.26.0(eslint@9.22.0)(typescript@5.8.2) + version: 8.28.0(eslint@9.23.0)(typescript@5.8.2) vitest: specifier: ^2.1.9 - version: 2.1.9(@types/node@22.13.10)(@vitest/ui@2.1.9) + version: 2.1.9(@types/node@22.13.13)(@vitest/ui@2.1.9) xml2js: specifier: ^0.6.2 version: 0.6.2 packages: - '@8hobbies/typedoc-plugin-404@3.1.0': - resolution: {integrity: sha512-37XsNnSyoeLOTLnlMz9MF9v2DUjaS3V6k1qcI9EHZRnxO68qA3gzdtEIpvQRU+LFDcVhO6hF/bxttku9zJHiUg==} - engines: {node: ^18 || ^20 || ^22 || >= 23} + '@8hobbies/typedoc-plugin-404@3.2.1': + resolution: {integrity: sha512-0e4IDEcFfTap0b2PpTcxdyr3oCNE/1OgB1kLiG/Arz4tf5fjYlVDEKpun6wsHRZLBULf874kVSK1rAh4LR0vYg==} + engines: {node: ^20 || ^22 || >= 23} peerDependencies: typedoc: ^0.26.11 || ^0.27.2 @@ -105,13 +102,13 @@ packages: resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/parser@7.26.1': - resolution: {integrity: sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw==} + '@babel/parser@7.27.0': + resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/types@7.26.0': - resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} + '@babel/types@7.27.0': + resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': @@ -255,8 +252,8 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + '@eslint-community/eslint-utils@4.5.1': + resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -269,20 +266,20 @@ packages: resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.1.0': - resolution: {integrity: sha512-kLrdPDJE1ckPo94kmPPf9Hfd0DU0Jw6oKYrhe+pwSC0iTUInmTa+w6fw8sGgcfkFJGNdWOUeOaDM4quW4a7OkA==} + '@eslint/config-helpers@0.2.0': + resolution: {integrity: sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/core@0.12.0': resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.0': - resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.22.0': - resolution: {integrity: sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ==} + '@eslint/js@9.23.0': + resolution: {integrity: sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': @@ -293,8 +290,8 @@ packages: resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@gerrit0/mini-shiki@1.24.0': - resolution: {integrity: sha512-eopM3SyeUZQZSBu1VCV8/d1LtJXDd0aMpLjyWpGkjD6ux3sNwoLNeuEb5xmiWVfQvFeMUXa1WTjh06lqm3KETA==} + '@gerrit0/mini-shiki@1.27.2': + resolution: {integrity: sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==} '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} @@ -327,8 +324,8 @@ packages: '@j4cobi/eslint-plugin-sort-imports@1.0.2': resolution: {integrity: sha512-0bTHYIohk2RnWW8+FQoE06s/80aF1iPxP62JiS2+9chUFrs9D7+p0niFtNctcZGRPo5aOKG9q/ypPlT8OWcwyg==} - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} '@jridgewell/resolve-uri@3.1.2': @@ -364,115 +361,135 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@polka/url@1.0.0-next.25': - resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} + '@polka/url@1.0.0-next.28': + resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} - '@rollup/rollup-android-arm-eabi@4.20.0': - resolution: {integrity: sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==} + '@rollup/rollup-android-arm-eabi@4.37.0': + resolution: {integrity: sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.20.0': - resolution: {integrity: sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==} + '@rollup/rollup-android-arm64@4.37.0': + resolution: {integrity: sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.20.0': - resolution: {integrity: sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==} + '@rollup/rollup-darwin-arm64@4.37.0': + resolution: {integrity: sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.20.0': - resolution: {integrity: sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==} + '@rollup/rollup-darwin-x64@4.37.0': + resolution: {integrity: sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.20.0': - resolution: {integrity: sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==} + '@rollup/rollup-freebsd-arm64@4.37.0': + resolution: {integrity: sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.37.0': + resolution: {integrity: sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.37.0': + resolution: {integrity: sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.20.0': - resolution: {integrity: sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==} + '@rollup/rollup-linux-arm-musleabihf@4.37.0': + resolution: {integrity: sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.20.0': - resolution: {integrity: sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==} + '@rollup/rollup-linux-arm64-gnu@4.37.0': + resolution: {integrity: sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.20.0': - resolution: {integrity: sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==} + '@rollup/rollup-linux-arm64-musl@4.37.0': + resolution: {integrity: sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': - resolution: {integrity: sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==} + '@rollup/rollup-linux-loongarch64-gnu@4.37.0': + resolution: {integrity: sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.37.0': + resolution: {integrity: sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.20.0': - resolution: {integrity: sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==} + '@rollup/rollup-linux-riscv64-gnu@4.37.0': + resolution: {integrity: sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.20.0': - resolution: {integrity: sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==} + '@rollup/rollup-linux-riscv64-musl@4.37.0': + resolution: {integrity: sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.37.0': + resolution: {integrity: sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.20.0': - resolution: {integrity: sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==} + '@rollup/rollup-linux-x64-gnu@4.37.0': + resolution: {integrity: sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.20.0': - resolution: {integrity: sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==} + '@rollup/rollup-linux-x64-musl@4.37.0': + resolution: {integrity: sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.20.0': - resolution: {integrity: sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==} + '@rollup/rollup-win32-arm64-msvc@4.37.0': + resolution: {integrity: sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.20.0': - resolution: {integrity: sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==} + '@rollup/rollup-win32-ia32-msvc@4.37.0': + resolution: {integrity: sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.20.0': - resolution: {integrity: sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==} + '@rollup/rollup-win32-x64-msvc@4.37.0': + resolution: {integrity: sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==} cpu: [x64] os: [win32] - '@shikijs/engine-oniguruma@1.24.0': - resolution: {integrity: sha512-Eua0qNOL73Y82lGA4GF5P+G2+VXX9XnuUxkiUuwcxQPH4wom+tE39kZpBFXfUuwNYxHSkrSxpB1p4kyRW0moSg==} + '@shikijs/engine-oniguruma@1.29.2': + resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} - '@shikijs/types@1.24.0': - resolution: {integrity: sha512-aptbEuq1Pk88DMlCe+FzXNnBZ17LCiLIGWAeCWhoFDzia5Q5Krx3DgnULLiouSdd6+LUM39XwXGppqYE0Ghtug==} + '@shikijs/types@1.29.2': + resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} - '@shikijs/vscode-textmate@9.3.0': - resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@22.13.10': - resolution: {integrity: sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==} + '@types/node@22.13.13': + resolution: {integrity: sha512-ClsL5nMwKaBRwPcCvH8E7+nU4GxHVx1axNvMZTFHMEfNI7oahimt26P5zjVCRrjiIWj6YFXfE1v3dEp94wLcGQ==} '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -480,82 +497,51 @@ packages: '@types/xml2js@0.4.14': resolution: {integrity: sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==} - '@typescript-eslint/eslint-plugin@8.26.0': - resolution: {integrity: sha512-cLr1J6pe56zjKYajK6SSSre6nl1Gj6xDp1TY0trpgPzjVbgDwd09v2Ws37LABxzkicmUjhEeg/fAUjPJJB1v5Q==} + '@typescript-eslint/eslint-plugin@8.28.0': + resolution: {integrity: sha512-lvFK3TCGAHsItNdWZ/1FkvpzCxTHUVuFrdnOGLMa0GGCFIbCgQWVk3CzCGdA7kM3qGVc+dfW9tr0Z/sHnGDFyg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.26.0': - resolution: {integrity: sha512-mNtXP9LTVBy14ZF3o7JG69gRPBK/2QWtQd0j0oH26HcY/foyJJau6pNUez7QrM5UHnSvwlQcJXKsk0I99B9pOA==} + '@typescript-eslint/parser@8.28.0': + resolution: {integrity: sha512-LPcw1yHD3ToaDEoljFEfQ9j2xShY367h7FZ1sq5NJT9I3yj4LHer1Xd1yRSOdYy9BpsrxU7R+eoDokChYM53lQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/scope-manager@8.16.0': - resolution: {integrity: sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg==} + '@typescript-eslint/scope-manager@8.28.0': + resolution: {integrity: sha512-u2oITX3BJwzWCapoZ/pXw6BCOl8rJP4Ij/3wPoGvY8XwvXflOzd1kLrDUUUAIEdJSFh+ASwdTHqtan9xSg8buw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.26.0': - resolution: {integrity: sha512-E0ntLvsfPqnPwng8b8y4OGuzh/iIOm2z8U3S9zic2TeMLW61u5IH2Q1wu0oSTkfrSzwbDJIB/Lm8O3//8BWMPA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/type-utils@8.26.0': - resolution: {integrity: sha512-ruk0RNChLKz3zKGn2LwXuVoeBcUMh+jaqzN461uMMdxy5H9epZqIBtYj7UiPXRuOpaALXGbmRuZQhmwHhaS04Q==} + '@typescript-eslint/type-utils@8.28.0': + resolution: {integrity: sha512-oRoXu2v0Rsy/VoOGhtWrOKDiIehvI+YNrDk5Oqj40Mwm0Yt01FC/Q7nFqg088d3yAsR1ZcZFVfPCTTFCe/KPwg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/types@8.16.0': - resolution: {integrity: sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/types@8.26.0': - resolution: {integrity: sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA==} + '@typescript-eslint/types@8.28.0': + resolution: {integrity: sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.16.0': - resolution: {integrity: sha512-E2+9IzzXMc1iaBy9zmo+UYvluE3TW7bCGWSF41hVWUE01o8nzr1rvOQYSxelxr6StUvRcTMe633eY8mXASMaNw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/typescript-estree@8.26.0': - resolution: {integrity: sha512-tiJ1Hvy/V/oMVRTbEOIeemA2XoylimlDQ03CgPPNaHYZbpsc78Hmngnt+WXZfJX1pjQ711V7g0H7cSJThGYfPQ==} + '@typescript-eslint/typescript-estree@8.28.0': + resolution: {integrity: sha512-H74nHEeBGeklctAVUvmDkxB1mk+PAZ9FiOMPFncdqeRBXxk1lWSYraHw8V12b7aa6Sg9HOBNbGdSHobBPuQSuA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.16.0': - resolution: {integrity: sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/utils@8.26.0': - resolution: {integrity: sha512-2L2tU3FVwhvU14LndnQCA2frYC8JnPDVKyQtWFPf8IYFMt/ykEN1bPolNhNbCVgOmdzTlWdusCTKA/9nKrf8Ig==} + '@typescript-eslint/utils@8.28.0': + resolution: {integrity: sha512-OELa9hbTYciYITqgurT1u/SzpQVtDLmQMFzy/N8pQE+tefOyCWT79jHsav294aTqV1q1u+VzqDGbuujvRYaeSQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/visitor-keys@8.16.0': - resolution: {integrity: sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/visitor-keys@8.26.0': - resolution: {integrity: sha512-2z8JQJWAzPdDd51dRQ/oqIJxe99/hoLIqmf8RMCAJQtYDc535W/Jt2+RTP4bP0aKeBG1F65yjIZuczOXCmbWwg==} + '@typescript-eslint/visitor-keys@8.28.0': + resolution: {integrity: sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitest/coverage-v8@2.1.9': @@ -610,8 +596,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} engines: {node: '>=0.4.0'} hasBin: true @@ -622,8 +608,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} ansi-styles@4.3.0: @@ -641,12 +627,6 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - axios@1.8.2: - resolution: {integrity: sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==} - balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -678,8 +658,8 @@ packages: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} - chai@5.1.2: - resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} + chai@5.2.0: + resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} engines: {node: '>=12'} chalk@4.1.2: @@ -701,10 +681,6 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -712,8 +688,8 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -728,10 +704,6 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dotenv@16.4.7: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} @@ -752,8 +724,8 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - es-module-lexer@1.5.4: - resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} @@ -782,8 +754,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.22.0: - resolution: {integrity: sha512-9V/QURhsRN40xuHXWjV64yvrzMjcz7ZyNoF2jJFmy9j/SLk0u1OLSZgXi28MrXjymnjEGSR80WCdab3RGMDveQ==} + eslint@9.23.0: + resolution: {integrity: sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -823,18 +795,15 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - expect-type@1.1.0: - resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + expect-type@1.2.0: + resolution: {integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==} engines: {node: '>=12.0.0'} - farming-weight@0.8.2: - resolution: {integrity: sha512-kAId/00QD9WCoaORv/Hdssb7KXeCJuX0/T/9KZ2Olv7Q++bY3KhWW/Dt3pixhBlGR/12tOTnHlI2QFkAkHT4ZA==} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: @@ -843,11 +812,11 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - fdir@6.4.2: - resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -873,26 +842,13 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - - follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - foreground-child@3.3.0: - resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -931,12 +887,12 @@ packages: ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} imurmurhash@0.1.4: @@ -1018,8 +974,8 @@ packages: lodash.reduce@4.6.0: resolution: {integrity: sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==} - loupe@3.1.2: - resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} + loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -1027,8 +983,8 @@ packages: lunr@2.3.9: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} - magic-string@0.30.12: - resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} @@ -1048,17 +1004,12 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + minecraft-data@3.85.0: + resolution: {integrity: sha512-7RhCjMuvO6ZwhTB7eNymCj4TAZY1Xqkg4XYv6ieLeWjmW1Lc1PGCG6BhR4/xN3zYRVqMNKiBOtAQoGqkVTKECg==} minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1071,15 +1022,15 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - mrmime@2.0.0: - resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -1102,8 +1053,8 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - package-json-from-dist@1.0.0: - resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} @@ -1128,8 +1079,8 @@ packages: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} - picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -1139,8 +1090,8 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} - postcss@8.4.41: - resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -1159,17 +1110,14 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} - protodef-validator@1.3.1: - resolution: {integrity: sha512-lZ5FWKZYR9xOjpMw1+EfZRfCjzNRQWPq+Dk+jki47Sikl2EeWEPnTfnJERwnU/EwFq6us+0zqHHzSsmLeYX+Lg==} + protodef-validator@1.4.0: + resolution: {integrity: sha512-2y2coBolqCEuk5Kc3QwO7ThR+/7TZiOit4FrpAgl+vFMvq8w76nDhh09z08e2NQOdrgPLsN2yzXsvRvtADgUZQ==} hasBin: true protodef@1.18.0: resolution: {integrity: sha512-jO64lkzkh0dYc0AVWCU/GzCKwqhFFIz1kfEz0NBf0RUuRNcmvgKbopabJdfZ6W8NvALdySUXgEhvKDZPhdBwrg==} engines: {node: '>=14'} - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} @@ -1189,12 +1137,12 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.20.0: - resolution: {integrity: sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==} + rollup@4.37.0: + resolution: {integrity: sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -1210,8 +1158,8 @@ packages: sax@1.4.1: resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} engines: {node: '>=10'} hasBin: true @@ -1230,22 +1178,19 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - sirv@3.0.0: - resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} + sirv@3.0.1: + resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} engines: {node: '>=18'} - skyhelper-networth@1.27.3: - resolution: {integrity: sha512-UYs2Jc1swM0ClggVzeCH/i44r9y+eKts88jv5feNn84ZUn9SewhXrrngdbAbJI/4/0t6S4yrq4MGNadDvKjg9A==} - - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@3.8.0: - resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + std-env@3.8.1: + resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==} string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -1281,15 +1226,15 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@0.3.1: - resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.10: - resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} - tinypool@1.0.1: - resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} + tinypool@1.0.2: + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} engines: {node: ^18.0.0 || >=20.0.0} tinyrainbow@1.2.0: @@ -1308,14 +1253,8 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} - ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - - ts-api-utils@2.0.1: - resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -1330,10 +1269,10 @@ packages: peerDependencies: typedoc: ^0.25.13 || ^0.26.x || ^0.27.x - typedoc-plugin-rename-defaults@0.7.2: - resolution: {integrity: sha512-9oa1CsMN4p/xuVR2JW2YDD6xE7JcrIth3KAfjR8YBi6NnrDk2Q72o4lbArybLDjxKAkOzk7N1uUdGwJlooLEOg==} + typedoc-plugin-rename-defaults@0.7.3: + resolution: {integrity: sha512-fDtrWZ9NcDfdGdlL865GW7uIGQXlthPscURPOhDkKUe4DBQSRRFUf33fhWw41FLlsz8ZTeSxzvvuNmh54MynFA==} peerDependencies: - typedoc: '>=0.22.x <0.28.x' + typedoc: '>=0.22.x <0.29.x' typedoc@0.27.9: resolution: {integrity: sha512-/z585740YHURLl9DN2jCWe6OW7zKYm6VoQ93H0sxZ1cwHQEQrUn5BJrEnkWhfzUdyO+BLGjnKUZ9iz9hKloFDw==} @@ -1342,8 +1281,8 @@ packages: peerDependencies: typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x - typescript-eslint@8.26.0: - resolution: {integrity: sha512-PtVz9nAnuNJuAVeUFvwztjuUgSnJInODAUx47VDwWPXzd5vismPOtPtt83tzNXyOjVQbPRp786D6WFW/M2koIA==} + typescript-eslint@8.28.0: + resolution: {integrity: sha512-jfZtxJoHm59bvoCMYCe2BM0/baMswRhMmYhy+w6VfcyHrjxZ0OJe0tGasydCpIpA+A/WIJhTyZfb3EtwNC/kHQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1368,8 +1307,8 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite@5.4.0: - resolution: {integrity: sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==} + vite@5.4.15: + resolution: {integrity: sha512-6ANcZRivqL/4WtwPGTKNaosuNJr5tWiftOC7liM7G9+rMb8+oeJeyzymDu4rTN93seySBmbjSfsS3Vzr19KNtA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -1458,8 +1397,8 @@ packages: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} - yaml@2.6.1: - resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} + yaml@2.7.0: + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} engines: {node: '>= 14'} hasBin: true @@ -1469,24 +1408,24 @@ packages: snapshots: - '@8hobbies/typedoc-plugin-404@3.1.0(typedoc@0.27.9(typescript@5.8.2))': + '@8hobbies/typedoc-plugin-404@3.2.1(typedoc@0.27.9(typescript@5.8.2))': dependencies: typedoc: 0.27.9(typescript@5.8.2) '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 '@babel/helper-string-parser@7.25.9': {} '@babel/helper-validator-identifier@7.25.9': {} - '@babel/parser@7.26.1': + '@babel/parser@7.27.0': dependencies: - '@babel/types': 7.26.0 + '@babel/types': 7.27.0 - '@babel/types@7.26.0': + '@babel/types@7.27.0': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 @@ -1562,9 +1501,9 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.22.0)': + '@eslint-community/eslint-utils@4.5.1(eslint@9.23.0)': dependencies: - eslint: 9.22.0 + eslint: 9.23.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -1572,32 +1511,32 @@ snapshots: '@eslint/config-array@0.19.2': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.3.7 + debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.1.0': {} + '@eslint/config-helpers@0.2.0': {} '@eslint/core@0.12.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.0': + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.3.7 + debug: 4.4.0 espree: 10.3.0 globals: 14.0.0 - ignore: 5.3.1 - import-fresh: 3.3.0 + ignore: 5.3.2 + import-fresh: 3.3.1 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.22.0': {} + '@eslint/js@9.23.0': {} '@eslint/object-schema@2.1.6': {} @@ -1606,11 +1545,11 @@ snapshots: '@eslint/core': 0.12.0 levn: 0.4.1 - '@gerrit0/mini-shiki@1.24.0': + '@gerrit0/mini-shiki@1.27.2': dependencies: - '@shikijs/engine-oniguruma': 1.24.0 - '@shikijs/types': 1.24.0 - '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/engine-oniguruma': 1.29.2 + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.2 '@humanfs/core@0.19.1': {} @@ -1636,15 +1575,15 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@j4cobi/eslint-plugin-sort-imports@1.0.2(eslint@9.22.0)(typescript@5.8.2)': + '@j4cobi/eslint-plugin-sort-imports@1.0.2(eslint@9.23.0)(typescript@5.8.2)': dependencies: - '@typescript-eslint/utils': 8.16.0(eslint@9.22.0)(typescript@5.8.2) + '@typescript-eslint/utils': 8.28.0(eslint@9.23.0)(typescript@5.8.2) transitivePeerDependencies: - eslint - supports-color - typescript - '@jridgewell/gen-mapping@0.3.5': + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.5.0 @@ -1673,89 +1612,101 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.19.1 '@pkgjs/parseargs@0.11.0': optional: true - '@polka/url@1.0.0-next.25': {} + '@polka/url@1.0.0-next.28': {} + + '@rollup/rollup-android-arm-eabi@4.37.0': + optional: true + + '@rollup/rollup-android-arm64@4.37.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.37.0': + optional: true + + '@rollup/rollup-darwin-x64@4.37.0': + optional: true - '@rollup/rollup-android-arm-eabi@4.20.0': + '@rollup/rollup-freebsd-arm64@4.37.0': optional: true - '@rollup/rollup-android-arm64@4.20.0': + '@rollup/rollup-freebsd-x64@4.37.0': optional: true - '@rollup/rollup-darwin-arm64@4.20.0': + '@rollup/rollup-linux-arm-gnueabihf@4.37.0': optional: true - '@rollup/rollup-darwin-x64@4.20.0': + '@rollup/rollup-linux-arm-musleabihf@4.37.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.20.0': + '@rollup/rollup-linux-arm64-gnu@4.37.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.20.0': + '@rollup/rollup-linux-arm64-musl@4.37.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.20.0': + '@rollup/rollup-linux-loongarch64-gnu@4.37.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.20.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.37.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': + '@rollup/rollup-linux-riscv64-gnu@4.37.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.20.0': + '@rollup/rollup-linux-riscv64-musl@4.37.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.20.0': + '@rollup/rollup-linux-s390x-gnu@4.37.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.20.0': + '@rollup/rollup-linux-x64-gnu@4.37.0': optional: true - '@rollup/rollup-linux-x64-musl@4.20.0': + '@rollup/rollup-linux-x64-musl@4.37.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.20.0': + '@rollup/rollup-win32-arm64-msvc@4.37.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.20.0': + '@rollup/rollup-win32-ia32-msvc@4.37.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.20.0': + '@rollup/rollup-win32-x64-msvc@4.37.0': optional: true - '@shikijs/engine-oniguruma@1.24.0': + '@shikijs/engine-oniguruma@1.29.2': dependencies: - '@shikijs/types': 1.24.0 - '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/types@1.24.0': + '@shikijs/types@1.29.2': dependencies: - '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - '@shikijs/vscode-textmate@9.3.0': {} + '@shikijs/vscode-textmate@10.0.2': {} '@types/eslint@9.6.1': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/json-schema': 7.0.15 - '@types/estree@1.0.5': {} - '@types/estree@1.0.6': {} + '@types/estree@1.0.7': {} + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 '@types/json-schema@7.0.15': {} - '@types/node@22.13.10': + '@types/node@22.13.13': dependencies: undici-types: 6.20.0 @@ -1763,139 +1714,100 @@ snapshots: '@types/xml2js@0.4.14': dependencies: - '@types/node': 22.13.10 + '@types/node': 22.13.13 - '@typescript-eslint/eslint-plugin@8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2)': + '@typescript-eslint/eslint-plugin@8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.26.0(eslint@9.22.0)(typescript@5.8.2) - '@typescript-eslint/scope-manager': 8.26.0 - '@typescript-eslint/type-utils': 8.26.0(eslint@9.22.0)(typescript@5.8.2) - '@typescript-eslint/utils': 8.26.0(eslint@9.22.0)(typescript@5.8.2) - '@typescript-eslint/visitor-keys': 8.26.0 - eslint: 9.22.0 + '@typescript-eslint/parser': 8.28.0(eslint@9.23.0)(typescript@5.8.2) + '@typescript-eslint/scope-manager': 8.28.0 + '@typescript-eslint/type-utils': 8.28.0(eslint@9.23.0)(typescript@5.8.2) + '@typescript-eslint/utils': 8.28.0(eslint@9.23.0)(typescript@5.8.2) + '@typescript-eslint/visitor-keys': 8.28.0 + eslint: 9.23.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 2.0.1(typescript@5.8.2) + ts-api-utils: 2.1.0(typescript@5.8.2) typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.26.0(eslint@9.22.0)(typescript@5.8.2)': + '@typescript-eslint/parser@8.28.0(eslint@9.23.0)(typescript@5.8.2)': dependencies: - '@typescript-eslint/scope-manager': 8.26.0 - '@typescript-eslint/types': 8.26.0 - '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.8.2) - '@typescript-eslint/visitor-keys': 8.26.0 - debug: 4.3.7 - eslint: 9.22.0 + '@typescript-eslint/scope-manager': 8.28.0 + '@typescript-eslint/types': 8.28.0 + '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.2) + '@typescript-eslint/visitor-keys': 8.28.0 + debug: 4.4.0 + eslint: 9.23.0 typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.16.0': + '@typescript-eslint/scope-manager@8.28.0': dependencies: - '@typescript-eslint/types': 8.16.0 - '@typescript-eslint/visitor-keys': 8.16.0 + '@typescript-eslint/types': 8.28.0 + '@typescript-eslint/visitor-keys': 8.28.0 - '@typescript-eslint/scope-manager@8.26.0': + '@typescript-eslint/type-utils@8.28.0(eslint@9.23.0)(typescript@5.8.2)': dependencies: - '@typescript-eslint/types': 8.26.0 - '@typescript-eslint/visitor-keys': 8.26.0 - - '@typescript-eslint/type-utils@8.26.0(eslint@9.22.0)(typescript@5.8.2)': - dependencies: - '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.8.2) - '@typescript-eslint/utils': 8.26.0(eslint@9.22.0)(typescript@5.8.2) - debug: 4.3.7 - eslint: 9.22.0 - ts-api-utils: 2.0.1(typescript@5.8.2) + '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.2) + '@typescript-eslint/utils': 8.28.0(eslint@9.23.0)(typescript@5.8.2) + debug: 4.4.0 + eslint: 9.23.0 + ts-api-utils: 2.1.0(typescript@5.8.2) typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.16.0': {} - - '@typescript-eslint/types@8.26.0': {} + '@typescript-eslint/types@8.28.0': {} - '@typescript-eslint/typescript-estree@8.16.0(typescript@5.8.2)': + '@typescript-eslint/typescript-estree@8.28.0(typescript@5.8.2)': dependencies: - '@typescript-eslint/types': 8.16.0 - '@typescript-eslint/visitor-keys': 8.16.0 - debug: 4.3.7 - fast-glob: 3.3.2 + '@typescript-eslint/types': 8.28.0 + '@typescript-eslint/visitor-keys': 8.28.0 + debug: 4.4.0 + fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.8.2) - optionalDependencies: - typescript: 5.8.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@8.26.0(typescript@5.8.2)': - dependencies: - '@typescript-eslint/types': 8.26.0 - '@typescript-eslint/visitor-keys': 8.26.0 - debug: 4.3.7 - fast-glob: 3.3.2 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 2.0.1(typescript@5.8.2) - typescript: 5.8.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.16.0(eslint@9.22.0)(typescript@5.8.2)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.22.0) - '@typescript-eslint/scope-manager': 8.16.0 - '@typescript-eslint/types': 8.16.0 - '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.8.2) - eslint: 9.22.0 - optionalDependencies: + semver: 7.7.1 + ts-api-utils: 2.1.0(typescript@5.8.2) typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.26.0(eslint@9.22.0)(typescript@5.8.2)': + '@typescript-eslint/utils@8.28.0(eslint@9.23.0)(typescript@5.8.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.22.0) - '@typescript-eslint/scope-manager': 8.26.0 - '@typescript-eslint/types': 8.26.0 - '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.8.2) - eslint: 9.22.0 + '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0) + '@typescript-eslint/scope-manager': 8.28.0 + '@typescript-eslint/types': 8.28.0 + '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.2) + eslint: 9.23.0 typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.16.0': + '@typescript-eslint/visitor-keys@8.28.0': dependencies: - '@typescript-eslint/types': 8.16.0 + '@typescript-eslint/types': 8.28.0 eslint-visitor-keys: 4.2.0 - '@typescript-eslint/visitor-keys@8.26.0': - dependencies: - '@typescript-eslint/types': 8.26.0 - eslint-visitor-keys: 4.2.0 - - '@vitest/coverage-v8@2.1.9(vitest@2.1.9(@types/node@22.13.10)(@vitest/ui@2.1.9))': + '@vitest/coverage-v8@2.1.9(vitest@2.1.9(@types/node@22.13.13)(@vitest/ui@2.1.9))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 - debug: 4.3.7 + debug: 4.4.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.1.7 - magic-string: 0.30.12 + magic-string: 0.30.17 magicast: 0.3.5 - std-env: 3.8.0 + std-env: 3.8.1 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 2.1.9(@types/node@22.13.10)(@vitest/ui@2.1.9) + vitest: 2.1.9(@types/node@22.13.13)(@vitest/ui@2.1.9) transitivePeerDependencies: - supports-color @@ -1903,16 +1815,16 @@ snapshots: dependencies: '@vitest/spy': 2.1.9 '@vitest/utils': 2.1.9 - chai: 5.1.2 + chai: 5.2.0 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.9(vite@5.4.0(@types/node@22.13.10))': + '@vitest/mocker@2.1.9(vite@5.4.15(@types/node@22.13.13))': dependencies: '@vitest/spy': 2.1.9 estree-walker: 3.0.3 - magic-string: 0.30.12 + magic-string: 0.30.17 optionalDependencies: - vite: 5.4.0(@types/node@22.13.10) + vite: 5.4.15(@types/node@22.13.13) '@vitest/pretty-format@2.1.9': dependencies: @@ -1926,7 +1838,7 @@ snapshots: '@vitest/snapshot@2.1.9': dependencies: '@vitest/pretty-format': 2.1.9 - magic-string: 0.30.12 + magic-string: 0.30.17 pathe: 1.1.2 '@vitest/spy@2.1.9': @@ -1937,28 +1849,28 @@ snapshots: dependencies: '@vitest/utils': 2.1.9 fflate: 0.8.2 - flatted: 3.3.1 + flatted: 3.3.3 pathe: 1.1.2 - sirv: 3.0.0 - tinyglobby: 0.2.10 + sirv: 3.0.1 + tinyglobby: 0.2.12 tinyrainbow: 1.2.0 - vitest: 2.1.9(@types/node@22.13.10)(@vitest/ui@2.1.9) + vitest: 2.1.9(@types/node@22.13.13)(@vitest/ui@2.1.9) '@vitest/utils@2.1.9': dependencies: '@vitest/pretty-format': 2.1.9 - loupe: 3.1.2 + loupe: 3.1.3 tinyrainbow: 1.2.0 abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 - acorn-jsx@5.3.2(acorn@8.14.0): + acorn-jsx@5.3.2(acorn@8.14.1): dependencies: - acorn: 8.14.0 + acorn: 8.14.1 - acorn@8.14.0: {} + acorn@8.14.1: {} ajv@6.12.6: dependencies: @@ -1969,7 +1881,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.0.1: {} + ansi-regex@6.1.0: {} ansi-styles@4.3.0: dependencies: @@ -1981,16 +1893,6 @@ snapshots: assertion-error@2.0.1: {} - asynckit@0.4.0: {} - - axios@1.8.2: - dependencies: - follow-redirects: 1.15.6 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - balanced-match@1.0.2: {} base64-js@1.5.1: {} @@ -2019,12 +1921,12 @@ snapshots: camelcase@8.0.0: {} - chai@5.1.2: + chai@5.2.0: dependencies: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 - loupe: 3.1.2 + loupe: 3.1.3 pathval: 2.0.0 chalk@4.1.2: @@ -2042,10 +1944,6 @@ snapshots: color-name@1.1.4: {} - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - concat-map@0.0.1: {} cross-spawn@7.0.6: @@ -2054,7 +1952,7 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - debug@4.3.7: + debug@4.4.0: dependencies: ms: 2.1.3 @@ -2062,8 +1960,6 @@ snapshots: deep-is@0.1.4: {} - delayed-stream@1.0.0: {} - dotenv@16.4.7: {} eastasianwidth@0.2.0: {} @@ -2076,7 +1972,7 @@ snapshots: entities@4.5.0: {} - es-module-lexer@1.5.4: {} + es-module-lexer@1.6.0: {} esbuild@0.21.5: optionalDependencies: @@ -2106,9 +2002,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.1(eslint@9.22.0): + eslint-config-prettier@10.1.1(eslint@9.23.0): dependencies: - eslint: 9.22.0 + eslint: 9.23.0 eslint-scope@8.3.0: dependencies: @@ -2119,25 +2015,25 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.22.0: + eslint@9.23.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.22.0) + '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.2 - '@eslint/config-helpers': 0.1.0 + '@eslint/config-helpers': 0.2.0 '@eslint/core': 0.12.0 - '@eslint/eslintrc': 3.3.0 - '@eslint/js': 9.22.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.23.0 '@eslint/plugin-kit': 0.2.7 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.2 - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.3.7 + debug: 4.4.0 escape-string-regexp: 4.0.0 eslint-scope: 8.3.0 eslint-visitor-keys: 4.2.0 @@ -2148,7 +2044,7 @@ snapshots: file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - ignore: 5.3.1 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 @@ -2161,8 +2057,8 @@ snapshots: espree@10.3.0: dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) eslint-visitor-keys: 4.2.0 esquery@1.6.0: @@ -2177,7 +2073,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 esutils@2.0.3: {} @@ -2185,29 +2081,27 @@ snapshots: events@3.3.0: {} - expect-type@1.1.0: {} - - farming-weight@0.8.2: {} + expect-type@1.2.0: {} fast-deep-equal@3.1.3: {} - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.7 + micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} - fastq@1.17.1: + fastq@1.19.1: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 - fdir@6.4.2(picomatch@4.0.2): + fdir@6.4.3(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -2228,24 +2122,16 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.1 + flatted: 3.3.3 keyv: 4.5.4 - flatted@3.3.1: {} + flatted@3.3.3: {} - follow-redirects@1.15.6: {} - - foreground-child@3.3.0: + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@4.0.0: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - fsevents@2.3.3: optional: true @@ -2259,11 +2145,11 @@ snapshots: glob@10.4.5: dependencies: - foreground-child: 3.3.0 + foreground-child: 3.3.1 jackspeak: 3.4.3 minimatch: 9.0.5 minipass: 7.1.2 - package-json-from-dist: 1.0.0 + package-json-from-dist: 1.0.1 path-scurry: 1.11.1 globals@14.0.0: {} @@ -2278,9 +2164,9 @@ snapshots: ieee754@1.2.1: {} - ignore@5.3.1: {} + ignore@5.3.2: {} - import-fresh@3.3.0: + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 @@ -2310,7 +2196,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: '@jridgewell/trace-mapping': 0.3.25 - debug: 4.3.7 + debug: 4.4.0 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -2359,25 +2245,25 @@ snapshots: lodash.reduce@4.6.0: {} - loupe@3.1.2: {} + loupe@3.1.3: {} lru-cache@10.4.3: {} lunr@2.3.9: {} - magic-string@0.30.12: + magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 magicast@0.3.5: dependencies: - '@babel/parser': 7.26.1 - '@babel/types': 7.26.0 - source-map-js: 1.2.0 + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + source-map-js: 1.2.1 make-dir@4.0.0: dependencies: - semver: 7.6.3 + semver: 7.7.1 markdown-it@14.1.0: dependencies: @@ -2392,16 +2278,12 @@ snapshots: merge2@1.4.1: {} - micromatch@4.0.7: + micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 + minecraft-data@3.85.0: {} minimatch@3.1.2: dependencies: @@ -2413,11 +2295,11 @@ snapshots: minipass@7.1.2: {} - mrmime@2.0.0: {} + mrmime@2.0.1: {} ms@2.1.3: {} - nanoid@3.3.7: {} + nanoid@3.3.11: {} natural-compare@1.4.0: {} @@ -2442,7 +2324,7 @@ snapshots: dependencies: p-limit: 3.1.0 - package-json-from-dist@1.0.0: {} + package-json-from-dist@1.0.1: {} parent-module@1.0.1: dependencies: @@ -2461,17 +2343,17 @@ snapshots: pathval@2.0.0: {} - picocolors@1.0.1: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} picomatch@4.0.2: {} - postcss@8.4.41: + postcss@8.5.3: dependencies: - nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 prelude-ls@1.2.1: {} @@ -2483,7 +2365,7 @@ snapshots: process@0.11.10: {} - protodef-validator@1.3.1: + protodef-validator@1.4.0: dependencies: ajv: 6.12.6 @@ -2491,11 +2373,9 @@ snapshots: dependencies: lodash.get: 4.4.2 lodash.reduce: 4.6.0 - protodef-validator: 1.3.1 + protodef-validator: 1.4.0 readable-stream: 4.7.0 - proxy-from-env@1.1.0: {} - punycode.js@2.3.1: {} punycode@2.3.1: {} @@ -2512,28 +2392,32 @@ snapshots: resolve-from@4.0.0: {} - reusify@1.0.4: {} + reusify@1.1.0: {} - rollup@4.20.0: + rollup@4.37.0: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.20.0 - '@rollup/rollup-android-arm64': 4.20.0 - '@rollup/rollup-darwin-arm64': 4.20.0 - '@rollup/rollup-darwin-x64': 4.20.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.20.0 - '@rollup/rollup-linux-arm-musleabihf': 4.20.0 - '@rollup/rollup-linux-arm64-gnu': 4.20.0 - '@rollup/rollup-linux-arm64-musl': 4.20.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.20.0 - '@rollup/rollup-linux-riscv64-gnu': 4.20.0 - '@rollup/rollup-linux-s390x-gnu': 4.20.0 - '@rollup/rollup-linux-x64-gnu': 4.20.0 - '@rollup/rollup-linux-x64-musl': 4.20.0 - '@rollup/rollup-win32-arm64-msvc': 4.20.0 - '@rollup/rollup-win32-ia32-msvc': 4.20.0 - '@rollup/rollup-win32-x64-msvc': 4.20.0 + '@rollup/rollup-android-arm-eabi': 4.37.0 + '@rollup/rollup-android-arm64': 4.37.0 + '@rollup/rollup-darwin-arm64': 4.37.0 + '@rollup/rollup-darwin-x64': 4.37.0 + '@rollup/rollup-freebsd-arm64': 4.37.0 + '@rollup/rollup-freebsd-x64': 4.37.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.37.0 + '@rollup/rollup-linux-arm-musleabihf': 4.37.0 + '@rollup/rollup-linux-arm64-gnu': 4.37.0 + '@rollup/rollup-linux-arm64-musl': 4.37.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.37.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.37.0 + '@rollup/rollup-linux-riscv64-gnu': 4.37.0 + '@rollup/rollup-linux-riscv64-musl': 4.37.0 + '@rollup/rollup-linux-s390x-gnu': 4.37.0 + '@rollup/rollup-linux-x64-gnu': 4.37.0 + '@rollup/rollup-linux-x64-musl': 4.37.0 + '@rollup/rollup-win32-arm64-msvc': 4.37.0 + '@rollup/rollup-win32-ia32-msvc': 4.37.0 + '@rollup/rollup-win32-x64-msvc': 4.37.0 fsevents: 2.3.3 rss-parser@3.13.0: @@ -2549,7 +2433,7 @@ snapshots: sax@1.4.1: {} - semver@7.6.3: {} + semver@7.7.1: {} shebang-command@2.0.0: dependencies: @@ -2561,24 +2445,17 @@ snapshots: signal-exit@4.1.0: {} - sirv@3.0.0: + sirv@3.0.1: dependencies: - '@polka/url': 1.0.0-next.25 - mrmime: 2.0.0 + '@polka/url': 1.0.0-next.28 + mrmime: 2.0.1 totalist: 3.0.1 - skyhelper-networth@1.27.3: - dependencies: - axios: 1.8.2 - prismarine-nbt: 2.7.0 - transitivePeerDependencies: - - debug - - source-map-js@1.2.0: {} + source-map-js@1.2.1: {} stackback@0.0.2: {} - std-env@3.8.0: {} + std-env@3.8.1: {} string-width@4.2.3: dependencies: @@ -2602,7 +2479,7 @@ snapshots: strip-ansi@7.1.0: dependencies: - ansi-regex: 6.0.1 + ansi-regex: 6.1.0 strip-json-comments@3.1.1: {} @@ -2618,14 +2495,14 @@ snapshots: tinybench@2.9.0: {} - tinyexec@0.3.1: {} + tinyexec@0.3.2: {} - tinyglobby@0.2.10: + tinyglobby@0.2.12: dependencies: - fdir: 6.4.2(picomatch@4.0.2) + fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 - tinypool@1.0.1: {} + tinypool@1.0.2: {} tinyrainbow@1.2.0: {} @@ -2637,11 +2514,7 @@ snapshots: totalist@3.0.1: {} - ts-api-utils@1.3.0(typescript@5.8.2): - dependencies: - typescript: 5.8.2 - - ts-api-utils@2.0.1(typescript@5.8.2): + ts-api-utils@2.1.0(typescript@5.8.2): dependencies: typescript: 5.8.2 @@ -2654,26 +2527,26 @@ snapshots: '@material/material-color-utilities': 0.3.0 typedoc: 0.27.9(typescript@5.8.2) - typedoc-plugin-rename-defaults@0.7.2(typedoc@0.27.9(typescript@5.8.2)): + typedoc-plugin-rename-defaults@0.7.3(typedoc@0.27.9(typescript@5.8.2)): dependencies: camelcase: 8.0.0 typedoc: 0.27.9(typescript@5.8.2) typedoc@0.27.9(typescript@5.8.2): dependencies: - '@gerrit0/mini-shiki': 1.24.0 + '@gerrit0/mini-shiki': 1.27.2 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 typescript: 5.8.2 - yaml: 2.6.1 + yaml: 2.7.0 - typescript-eslint@8.26.0(eslint@9.22.0)(typescript@5.8.2): + typescript-eslint@8.28.0(eslint@9.23.0)(typescript@5.8.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2) - '@typescript-eslint/parser': 8.26.0(eslint@9.22.0)(typescript@5.8.2) - '@typescript-eslint/utils': 8.26.0(eslint@9.22.0)(typescript@5.8.2) - eslint: 9.22.0 + '@typescript-eslint/eslint-plugin': 8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2) + '@typescript-eslint/parser': 8.28.0(eslint@9.23.0)(typescript@5.8.2) + '@typescript-eslint/utils': 8.28.0(eslint@9.23.0)(typescript@5.8.2) + eslint: 9.23.0 typescript: 5.8.2 transitivePeerDependencies: - supports-color @@ -2688,13 +2561,13 @@ snapshots: dependencies: punycode: 2.3.1 - vite-node@2.1.9(@types/node@22.13.10): + vite-node@2.1.9(@types/node@22.13.13): dependencies: cac: 6.7.14 - debug: 4.3.7 - es-module-lexer: 1.5.4 + debug: 4.4.0 + es-module-lexer: 1.6.0 pathe: 1.1.2 - vite: 5.4.0(@types/node@22.13.10) + vite: 5.4.15(@types/node@22.13.13) transitivePeerDependencies: - '@types/node' - less @@ -2706,39 +2579,39 @@ snapshots: - supports-color - terser - vite@5.4.0(@types/node@22.13.10): + vite@5.4.15(@types/node@22.13.13): dependencies: esbuild: 0.21.5 - postcss: 8.4.41 - rollup: 4.20.0 + postcss: 8.5.3 + rollup: 4.37.0 optionalDependencies: - '@types/node': 22.13.10 + '@types/node': 22.13.13 fsevents: 2.3.3 - vitest@2.1.9(@types/node@22.13.10)(@vitest/ui@2.1.9): + vitest@2.1.9(@types/node@22.13.13)(@vitest/ui@2.1.9): dependencies: '@vitest/expect': 2.1.9 - '@vitest/mocker': 2.1.9(vite@5.4.0(@types/node@22.13.10)) + '@vitest/mocker': 2.1.9(vite@5.4.15(@types/node@22.13.13)) '@vitest/pretty-format': 2.1.9 '@vitest/runner': 2.1.9 '@vitest/snapshot': 2.1.9 '@vitest/spy': 2.1.9 '@vitest/utils': 2.1.9 - chai: 5.1.2 - debug: 4.3.7 - expect-type: 1.1.0 - magic-string: 0.30.12 + chai: 5.2.0 + debug: 4.4.0 + expect-type: 1.2.0 + magic-string: 0.30.17 pathe: 1.1.2 - std-env: 3.8.0 + std-env: 3.8.1 tinybench: 2.9.0 - tinyexec: 0.3.1 - tinypool: 1.0.1 + tinyexec: 0.3.2 + tinypool: 1.0.2 tinyrainbow: 1.2.0 - vite: 5.4.0(@types/node@22.13.10) - vite-node: 2.1.9(@types/node@22.13.10) + vite: 5.4.15(@types/node@22.13.13) + vite-node: 2.1.9(@types/node@22.13.13) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.13.10 + '@types/node': 22.13.13 '@vitest/ui': 2.1.9(vitest@2.1.9) transitivePeerDependencies: - less @@ -2786,6 +2659,6 @@ snapshots: xmlbuilder@11.0.1: {} - yaml@2.6.1: {} + yaml@2.7.0: {} yocto-queue@0.1.0: {} diff --git a/src/API/getPlayer.test.ts b/src/API/getPlayer.test.ts index 66a53d24f..9c8fe83db 100644 --- a/src/API/getPlayer.test.ts +++ b/src/API/getPlayer.test.ts @@ -118,8 +118,8 @@ test('getPlayer (guild)', async () => { expect(data.karma).toBeDefined(); expect(data.karma).toBeGreaterThanOrEqual(0); expectTypeOf(data.karma).toEqualTypeOf(); - expect(data.freeSkyblockCookie).toBeDefined(); - expectTypeOf(data.freeSkyblockCookie).toEqualTypeOf(); + expect(data.freeSkyBlockCookie).toBeDefined(); + expectTypeOf(data.freeSkyBlockCookie).toEqualTypeOf(); expect(data.tourney).toBeDefined(); expectTypeOf(data.tourney).toEqualTypeOf(); expect(data.rewards).toBeDefined(); @@ -266,8 +266,8 @@ test('getPlayer (houses)', async () => { expect(data.karma).toBeDefined(); expect(data.karma).toBeGreaterThanOrEqual(0); expectTypeOf(data.karma).toEqualTypeOf(); - expect(data.freeSkyblockCookie).toBeDefined(); - expectTypeOf(data.freeSkyblockCookie).toEqualTypeOf(); + expect(data.freeSkyBlockCookie).toBeDefined(); + expectTypeOf(data.freeSkyBlockCookie).toEqualTypeOf(); expect(data.tourney).toBeDefined(); expectTypeOf(data.tourney).toEqualTypeOf(); expect(data.rewards).toBeDefined(); @@ -415,8 +415,8 @@ test('getPlayer (recent games)', async () => { expect(data.karma).toBeDefined(); expect(data.karma).toBeGreaterThanOrEqual(0); expectTypeOf(data.karma).toEqualTypeOf(); - expect(data.freeSkyblockCookie).toBeDefined(); - expectTypeOf(data.freeSkyblockCookie).toEqualTypeOf(); + expect(data.freeSkyBlockCookie).toBeDefined(); + expectTypeOf(data.freeSkyBlockCookie).toEqualTypeOf(); expect(data.tourney).toBeDefined(); expectTypeOf(data.tourney).toEqualTypeOf(); expect(data.rewards).toBeDefined(); @@ -565,8 +565,8 @@ test('getPlayer', async () => { expect(data.karma).toBeDefined(); expect(data.karma).toBeGreaterThanOrEqual(0); expectTypeOf(data.karma).toEqualTypeOf(); - expect(data.freeSkyblockCookie).toBeDefined(); - expectTypeOf(data.freeSkyblockCookie).toEqualTypeOf(); + expect(data.freeSkyBlockCookie).toBeDefined(); + expectTypeOf(data.freeSkyBlockCookie).toEqualTypeOf(); expect(data.tourney).toBeDefined(); expectTypeOf(data.tourney).toEqualTypeOf(); expect(data.rewards).toBeDefined(); diff --git a/src/API/getSkyBlockAuction.test.ts b/src/API/getSkyBlockAuction.test.ts new file mode 100644 index 000000000..9a88a8dc4 --- /dev/null +++ b/src/API/getSkyBlockAuction.test.ts @@ -0,0 +1,71 @@ +import Client from '../Client.js'; +import RequestData from '../Private/RequestData.js'; +import SkyBlockAuction from '../Structures/SkyBlock/Auctions/SkyBlockAuction.js'; +import SkyBlockBaseAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { SkyBlockAuctionResult, SkyBlockAuctionsResult } from '../Types/API.js'; + +test('getSkyBlockAuction (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const auctions = (await client.getSkyBlockAuctions(1)) as SkyBlockAuctionsResult; + if (undefined === auctions.auctions[0]) return; + if (!auctions.auctions[0].auctioneerUuid) throw new Error("Something wen't wrong while fetching auctions"); + const data = await client.getSkyBlockAuction('AUCTION_ID', auctions.auctions[0].auctionId, { raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); +}); + +test('getSkyBlockAuction (No Type Input)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + expect(() => client.getSkyBlockAuction()).rejects.toThrowError(client.errors.BAD_AUCTION_FILTER); + client.destroy(); +}); + +test('getSkyBlockAuction (Bad Type Input)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + expect(() => client.getSkyBlockAuction('meow', 'meow')).rejects.toThrowError(client.errors.BAD_AUCTION_FILTER); + client.destroy(); +}); + +test('getSkyBlockAuction (No Query Input)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + expect(() => client.getSkyBlockAuction('AUCTION_ID')).rejects.toThrowError(client.errors.NO_UUID); + client.destroy(); +}); + +test('getSkyBlockAuction (PROFILE)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const auctions = (await client.getSkyBlockAuctions(1)) as SkyBlockAuctionsResult; + if (undefined === auctions.auctions[0]) return; + if (!auctions.auctions[0].auctioneerUuid) throw new Error("Something wen't wrong while fetching auctions"); + let data = await client.getSkyBlockAuction('PROFILE', auctions.auctions[0].auctioneerProfile); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as SkyBlockAuctionResult; + expect(data.info).toBeDefined(); + expectTypeOf(data.info).toEqualTypeOf(); + expect(data.auctions).toBeDefined(); + expectTypeOf(data.auctions).toEqualTypeOf(); +}); + +test('getSkyBlockAuction (PLAYER)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const auctions = (await client.getSkyBlockAuctions(1)) as SkyBlockAuctionsResult; + if (undefined === auctions.auctions[0]) return; + if (!auctions.auctions[0].auctioneerUuid) throw new Error("Something wen't wrong while fetching auctions"); + let data = await client.getSkyBlockAuction('PLAYER', auctions.auctions[0].auctioneerUuid); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as SkyBlockAuctionResult; + expect(data.info).toBeDefined(); + expectTypeOf(data.info).toEqualTypeOf(); + expect(data.auctions).toBeDefined(); + expectTypeOf(data.auctions).toEqualTypeOf(); +}); diff --git a/src/API/getSkyBlockAuction.ts b/src/API/getSkyBlockAuction.ts new file mode 100644 index 000000000..0a567c855 --- /dev/null +++ b/src/API/getSkyBlockAuction.ts @@ -0,0 +1,56 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import RequestData from '../Private/RequestData.js'; +import SkyBlockAuction from '../Structures/SkyBlock/Auctions/SkyBlockAuction.js'; +import SkyBlockBaseAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.js'; +import type { AuctionFetchOptions, AuctionRequestOptions, SkyBlockAuctionResult } from '../Types/API.js'; + +class getSkyBlockAction extends Endpoint { + override readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + override async execute( + type: AuctionFetchOptions, + query: string, + options?: AuctionRequestOptions + ): Promise { + let filter: string | null; + if (type === undefined) throw new Error(this.client.errors.BAD_AUCTION_FILTER); + if (query === undefined) throw new Error(this.client.errors.NO_UUID); + + switch (type) { + case 'PROFILE': { + filter = 'profile'; + break; + } + case 'PLAYER': { + filter = 'player'; + break; + } + case 'AUCTION_ID': { + filter = 'uuid'; + break; + } + default: { + filter = null; + break; + } + } + + if (null === filter) throw new Error(this.client.errors.BAD_AUCTION_FILTER); + + const res = await this.client.requestHandler.request(`/skyblock/auction?${filter}=${query}`, options); + if (res.options.raw) return res; + return { + info: new SkyBlockBaseAuctionInfo(res.data), + auctions: res.data.auctions.map( + (Auction: Record) => new SkyBlockAuction(Auction, options?.includeItemBytes ?? false) + ) + }; + } +} + +export default getSkyBlockAction; diff --git a/src/API/getSkyBlockAuctions.test.ts b/src/API/getSkyBlockAuctions.test.ts new file mode 100644 index 000000000..b1f30cf49 --- /dev/null +++ b/src/API/getSkyBlockAuctions.test.ts @@ -0,0 +1,69 @@ +import Client from '../Client.js'; +import RequestData from '../Private/RequestData.js'; +import SkyBlockAuction from '../Structures/SkyBlock/Auctions/SkyBlockAuction.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockAuctionInfo.js'; +import type { SkyBlockAuctionsResult } from '../Types/API.js'; + +test('getSkyBlockAuctions (No Input)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + expect(() => client.getSkyBlockAuctions()).rejects.toThrowError(client.errors.INVALID_OPTION_VALUE); + client.destroy(); +}); + +test('getSkyBlockAuctions (Negative Input)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + expect(() => client.getSkyBlockAuctions(-1)).rejects.toThrowError(client.errors.INVALID_OPTION_VALUE); + client.destroy(); +}); + +test('getSkyBlockAuctions (Page 0)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + expect(() => client.getSkyBlockAuctions(0)).rejects.toThrowError(client.errors.INVALID_OPTION_VALUE); + client.destroy(); +}); + +test('getSkyBlockAuctions (String Input)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + expect(() => client.getSkyBlockAuctions('hi')).rejects.toThrowError(client.errors.INVALID_OPTION_VALUE); + client.destroy(); +}); + +test('getSkyBlockAuctions (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getSkyBlockAuctions(1, { raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getSkyBlockAuctions (One Page)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getSkyBlockAuctions(1); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as SkyBlockAuctionsResult; + expect(data.info).toBeDefined(); + expectTypeOf(data.info).toEqualTypeOf(); + expect(data.auctions).toBeDefined(); + expectTypeOf(data.auctions).toEqualTypeOf(); + client.destroy(); +}); + +test('getSkyBlockAuctions (All Pages)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getSkyBlockAuctions('*'); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as SkyBlockAuctionsResult; + expect(data.info).toBeDefined(); + expectTypeOf(data.info).toEqualTypeOf(); + expect(data.auctions).toBeDefined(); + expectTypeOf(data.auctions).toEqualTypeOf(); + client.destroy(); +}); diff --git a/src/API/getSkyBlockAuctions.ts b/src/API/getSkyBlockAuctions.ts new file mode 100644 index 000000000..8d4f74409 --- /dev/null +++ b/src/API/getSkyBlockAuctions.ts @@ -0,0 +1,54 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import SkyBlockAuction from '../Structures/SkyBlock/Auctions/SkyBlockAuction.js'; +import SkyBlockAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockAuctionInfo.js'; +import type RequestData from '../Private/RequestData.js'; +import type { AuctionRequestOptions, SkyBlockAuctionsResult } from '../Types/API.js'; + +class getSkyBlockAuctions extends Endpoint { + override readonly client: Client; + declare options: AuctionRequestOptions; + constructor(client: Client) { + super(client); + this.client = client; + } + + override async execute( + query: number | '*', + options?: AuctionRequestOptions + ): Promise { + if (!query) throw new Error(this.client.errors.INVALID_OPTION_VALUE); + if ('number' === typeof query && 0 >= query) throw new Error(this.client.errors.INVALID_OPTION_VALUE); + if ('number' !== typeof query && '*' !== query) throw new Error(this.client.errors.INVALID_OPTION_VALUE); + if ('*' === query) return await this.getAllPages(); + return await this.getPage(query, options); + } + + async getAllPages(): Promise { + const page = 0; + const { info, auctions } = (await this.getPage(page)) as SkyBlockAuctionsResult; + const pages = info.totalPages; + const requests = []; + for (let i = 1; i < pages; i++) { + requests.push(this.getPage(i)); + } + const results = (await Promise.all(requests)) as SkyBlockAuctionsResult[]; + results.forEach(({ auctions: newAuctions }) => { + auctions.push(...newAuctions); + }); + return { info, auctions }; + } + + private async getPage(page: number, options?: AuctionRequestOptions): Promise { + const res = await this.client.requestHandler.request(`/skyblock/auctions?page=${page}`, options); + if (options?.raw) return res; + return { + info: new SkyBlockAuctionInfo(res.data), + auctions: res.data.auctions.map( + (Auction: Record) => new SkyBlockAuction(Auction, options?.includeItemBytes || false) + ) + }; + } +} + +export default getSkyBlockAuctions; diff --git a/src/API/getSkyBlockBazaar.test.ts b/src/API/getSkyBlockBazaar.test.ts new file mode 100644 index 000000000..44d7d4b78 --- /dev/null +++ b/src/API/getSkyBlockBazaar.test.ts @@ -0,0 +1,29 @@ +import Client from '../Client.js'; +import RequestData from '../Private/RequestData.js'; +import SkyBlockBazaar from '../Structures/SkyBlock/Bazaar/SkyBlockBazaar.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockBazaarProduct from '../Structures/SkyBlock/Bazaar/SkyBlockBazaarProduct.js'; + +test('getSkyBlockBazaar (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getSkyBlockBazaar({ raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getSkyBlockBazaar', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getSkyBlockBazaar(); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as SkyBlockBazaar; + expect(data.lastUpdated).toBeDefined(); + expectTypeOf(data.lastUpdated).toEqualTypeOf(); + expect(data.lastUpdatedAt).toBeDefined(); + expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); + expect(data.products).toBeDefined(); + expectTypeOf(data.products).toEqualTypeOf(); + client.destroy(); +}); diff --git a/src/API/getSkyblockBazaar.ts b/src/API/getSkyBlockBazaar.ts similarity index 58% rename from src/API/getSkyblockBazaar.ts rename to src/API/getSkyBlockBazaar.ts index 6273f1981..8bbcedeb8 100644 --- a/src/API/getSkyblockBazaar.ts +++ b/src/API/getSkyBlockBazaar.ts @@ -1,21 +1,21 @@ import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; -import Product from '../Structures/SkyBlock/Bazaar/Product.js'; import RequestData from '../Private/RequestData.js'; +import SkyBlockBazaar from '../Structures/SkyBlock/Bazaar/SkyBlockBazaar.js'; import type { RequestOptions } from '../Types/Requests.js'; -class getSkyblockBazaar extends Endpoint { +class getSkyBlockBazaar extends Endpoint { override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - override async execute(options?: RequestOptions): Promise { + override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/skyblock/bazaar', options); if (res.options.raw) return res; - return Object.keys(res.data.products).map((x) => new Product(res.data.products[x])); + return new SkyBlockBazaar(res.data); } } -export default getSkyblockBazaar; +export default getSkyBlockBazaar; diff --git a/src/API/getSkyBlockBingo.test.ts b/src/API/getSkyBlockBingo.test.ts new file mode 100644 index 000000000..4dc078da4 --- /dev/null +++ b/src/API/getSkyBlockBingo.test.ts @@ -0,0 +1,41 @@ +import Client from '../Client.js'; +import RequestData from '../Private/RequestData.js'; +import SkyBlockBingo from '../Structures/SkyBlock/Bingo/SkyBlockBingo.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockBingoGoal from '../Structures/SkyBlock/Bingo/SkyBlockBingoGoal.js'; + +test('getSkyBlockBingo (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getSkyBlockBingo({ raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getSkyBlockBingo', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getSkyBlockBingo(); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as SkyBlockBingo; + expect(data.lastUpdatedTimestamp).toBeDefined(); + expectTypeOf(data.lastUpdatedTimestamp).toEqualTypeOf(); + expect(data.lastUpdatedAt).toBeDefined(); + expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); + expect(data.id).toBeDefined(); + expectTypeOf(data.id).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.start).toBeDefined(); + expectTypeOf(data.start).toEqualTypeOf(); + expect(data.startAt).toBeDefined(); + expectTypeOf(data.startAt).toEqualTypeOf(); + expect(data.end).toBeDefined(); + expectTypeOf(data.end).toEqualTypeOf(); + expect(data.endAt).toBeDefined(); + expectTypeOf(data.endAt).toEqualTypeOf(); + expect(data.goals).toBeDefined(); + expectTypeOf(data.goals).toEqualTypeOf(); + client.destroy(); +}); diff --git a/src/API/getSkyblockBingo.ts b/src/API/getSkyBlockBingo.ts similarity index 61% rename from src/API/getSkyblockBingo.ts rename to src/API/getSkyBlockBingo.ts index 36f08d892..9ecb6b6ba 100644 --- a/src/API/getSkyblockBingo.ts +++ b/src/API/getSkyBlockBingo.ts @@ -1,21 +1,21 @@ -import BingoData from '../Structures/SkyBlock/Static/BingoData.js'; import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; +import SkyBlockBingo from '../Structures/SkyBlock/Bingo/SkyBlockBingo.js'; import type { RequestOptions } from '../Types/Requests.js'; -class getSkyblockBingo extends Endpoint { +class getSkyBlockBingo extends Endpoint { override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - override async execute(options?: RequestOptions): Promise { + override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/resources/skyblock/bingo', options); if (res.options.raw) return res; - return new BingoData(res.data); + return new SkyBlockBingo(res.data); } } -export default getSkyblockBingo; +export default getSkyBlockBingo; diff --git a/src/API/getSkyBlockCollections.test.ts b/src/API/getSkyBlockCollections.test.ts new file mode 100644 index 000000000..8efb94395 --- /dev/null +++ b/src/API/getSkyBlockCollections.test.ts @@ -0,0 +1,41 @@ +import Client from '../Client.js'; +import RequestData from '../Private/RequestData.js'; +import SkyBlockCollection from '../Structures/SkyBlock/Collections/SkyBlockCollection.js'; +import SkyBlockCollections from '../Structures/SkyBlock/Collections/SkyBlockCollections.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('getSkyBlockCollections (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getSkyBlockCollections({ raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getSkyBlockCollections', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getSkyBlockCollections(); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as SkyBlockCollections; + expect(data.lastUpdated).toBeDefined(); + expectTypeOf(data.lastUpdated).toEqualTypeOf(); + expect(data.lastUpdatedAt).toBeDefined(); + expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); + expect(data.version).toBeDefined(); + expectTypeOf(data.version).toEqualTypeOf(); + expect(data.farming).toBeDefined(); + expectTypeOf(data.farming).toEqualTypeOf(); + expect(data.mining).toBeDefined(); + expectTypeOf(data.mining).toEqualTypeOf(); + expect(data.combat).toBeDefined(); + expectTypeOf(data.combat).toEqualTypeOf(); + expect(data.foraging).toBeDefined(); + expectTypeOf(data.foraging).toEqualTypeOf(); + expect(data.fishing).toBeDefined(); + expectTypeOf(data.fishing).toEqualTypeOf(); + expect(data.rift).toBeDefined(); + expectTypeOf(data.rift).toEqualTypeOf(); + client.destroy(); +}); diff --git a/src/API/getSkyBlockCollections.ts b/src/API/getSkyBlockCollections.ts new file mode 100644 index 000000000..6a5c3e7e8 --- /dev/null +++ b/src/API/getSkyBlockCollections.ts @@ -0,0 +1,21 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import RequestData from '../Private/RequestData.js'; +import SkyBlockCollections from '../Structures/SkyBlock/Collections/SkyBlockCollections.js'; +import type { RequestOptions } from '../Types/Requests.js'; + +class getSkyBlockCollections extends Endpoint { + override readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + override async execute(options?: RequestOptions): Promise { + const res = await this.client.requestHandler.request('/resources/skyblock/items', options); + if (res.options.raw) return res; + return new SkyBlockCollections(res.data); + } +} + +export default getSkyBlockCollections; diff --git a/src/API/getSkyBlockElection.test.ts b/src/API/getSkyBlockElection.test.ts new file mode 100644 index 000000000..0331ededc --- /dev/null +++ b/src/API/getSkyBlockElection.test.ts @@ -0,0 +1,31 @@ +import Client from '../Client.js'; +import RequestData from '../Private/RequestData.js'; +import SkyBlockElection from '../Structures/SkyBlock/Election/SkyBlockElection.js'; +import SkyBlockElectionData from '../Structures/SkyBlock/Election/SkyBlockElectionData.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('getSkyBlockElection (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getSkyBlockElection({ raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getSkyBlockElection', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getSkyBlockElection(); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as SkyBlockElectionData; + expect(data.lastUpdatedTimestamp).toBeDefined(); + expectTypeOf(data.lastUpdatedTimestamp).toEqualTypeOf(); + expect(data.lastUpdatedAt).toBeDefined(); + expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); + expect(data.lastElectionResults).toBeDefined(); + expectTypeOf(data.lastElectionResults).toEqualTypeOf(); + expect(data.currentElection).toBeDefined(); + expectTypeOf(data.currentElection).toEqualTypeOf(); + client.destroy(); +}); diff --git a/src/API/getSkyblockGovernment.ts b/src/API/getSkyBlockElection.ts similarity index 58% rename from src/API/getSkyblockGovernment.ts rename to src/API/getSkyBlockElection.ts index e54b0d741..467165a65 100644 --- a/src/API/getSkyblockGovernment.ts +++ b/src/API/getSkyBlockElection.ts @@ -1,21 +1,21 @@ import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; -import GovernmentData from '../Structures/SkyBlock/Static/Government.js'; import RequestData from '../Private/RequestData.js'; +import SkyBlockElectionData from '../Structures/SkyBlock/Election/SkyBlockElectionData.js'; import type { RequestOptions } from '../Types/Requests.js'; -class getSkyblockGovernment extends Endpoint { +class getSkyBlockElection extends Endpoint { override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - override async execute(options?: RequestOptions): Promise { + override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/resources/skyblock/election', options); if (res.options.raw) return res; - return new GovernmentData(res.data); + return new SkyBlockElectionData(res.data); } } -export default getSkyblockGovernment; +export default getSkyBlockElection; diff --git a/src/API/getSkyBlockEndedAuctions.test.ts b/src/API/getSkyBlockEndedAuctions.test.ts new file mode 100644 index 000000000..a87188924 --- /dev/null +++ b/src/API/getSkyBlockEndedAuctions.test.ts @@ -0,0 +1,28 @@ +import Client from '../Client.js'; +import RequestData from '../Private/RequestData.js'; +import SkyBlockAuction from '../Structures/SkyBlock/Auctions/SkyBlockAuction.js'; +import SkyBlockBaseAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { SkyBlockAuctionResult } from '../Types/API.js'; + +test('getSkyBlockEndedAuctions (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getSkyBlockEndedAuctions({ raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getSkyBlockEndedAuctions', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getSkyBlockEndedAuctions(); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as SkyBlockAuctionResult; + expect(data.info).toBeDefined(); + expectTypeOf(data.info).toEqualTypeOf(); + expect(data.auctions).toBeDefined(); + expectTypeOf(data.auctions).toEqualTypeOf(); + client.destroy(); +}); diff --git a/src/API/getSkyBlockEndedAuctions.ts b/src/API/getSkyBlockEndedAuctions.ts new file mode 100644 index 000000000..fe1b9d15b --- /dev/null +++ b/src/API/getSkyBlockEndedAuctions.ts @@ -0,0 +1,26 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import SkyBlockAuction from '../Structures/SkyBlock/Auctions/SkyBlockAuction.js'; +import SkyBlockBaseAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.js'; +import type RequestData from '../Private/RequestData.js'; +import type { AuctionRequestOptions, SkyBlockAuctionResult } from '../Types/API.js'; + +class getSkyBlockEndedAuctions extends Endpoint { + override readonly client: Client; + declare options: AuctionRequestOptions; + constructor(client: Client) { + super(client); + this.client = client; + } + + override async execute(options?: AuctionRequestOptions): Promise { + const res = await this.client.requestHandler.request('/skyblock/auctions_ended', options); + if (res.options.raw) return res; + return { + info: new SkyBlockBaseAuctionInfo(res.data), + auctions: res.data.auctions.map((Auction: Record) => new SkyBlockAuction(Auction)) + }; + } +} + +export default getSkyBlockEndedAuctions; diff --git a/src/API/getSkyblockFireSales.test.ts b/src/API/getSkyBlockFireSales.test.ts similarity index 70% rename from src/API/getSkyblockFireSales.test.ts rename to src/API/getSkyBlockFireSales.test.ts index b68941245..c5bc3c536 100644 --- a/src/API/getSkyblockFireSales.test.ts +++ b/src/API/getSkyBlockFireSales.test.ts @@ -1,19 +1,19 @@ import Client from '../Client.js'; -import FireSale from '../Structures/SkyBlock/Static/FireSale.js'; import RequestData from '../Private/RequestData.js'; +import SkyBlockFireSale from '../Structures/SkyBlock/FireSale/SkyBlockFireSale.js'; import { defaultRequestData } from '../../vitest.setup.js'; import { expect, expectTypeOf, test, vi } from 'vitest'; -test('getSkyblockFireSales (raw)', async () => { +test('getSkyBlockFireSales (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - const data = await client.getSkyblockFireSales({ raw: true }); + const data = await client.getSkyBlockFireSales({ raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); - expectTypeOf(data).toEqualTypeOf(); + expectTypeOf(data).toEqualTypeOf(); client.destroy(); }); -test('getSkyblockFireSales', async () => { +test('getSkyBlockFireSales', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); vi.spyOn(global, 'fetch').mockResolvedValue({ ...defaultRequestData, @@ -29,32 +29,31 @@ test('getSkyblockFireSales', async () => { /* eslint-enable camelcase */ } as any); - let data = await client.getSkyblockFireSales(); + let data = await client.getSkyBlockFireSales(); expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf(); - data = data as FireSale[]; - data.forEach((firesale: FireSale) => { - expect(firesale).toBeDefined(); - expect(firesale).toBeInstanceOf(FireSale); - expectTypeOf(firesale).toEqualTypeOf(); + expectTypeOf(data).toEqualTypeOf(); + data = data as SkyBlockFireSale[]; + data.forEach((firesale: SkyBlockFireSale) => { expect(firesale.itemId).toBeDefined(); expectTypeOf(firesale.itemId).toEqualTypeOf(); expect(firesale.startTimestamp).toBeDefined(); - expect(firesale.startTimestamp).toBeGreaterThanOrEqual(0); expectTypeOf(firesale.startTimestamp).toEqualTypeOf(); expect(firesale.startAt).toBeDefined(); expectTypeOf(firesale.startAt).toEqualTypeOf(); expect(firesale.endTimestamp).toBeDefined(); expectTypeOf(firesale.endTimestamp).toEqualTypeOf(); - expect(firesale.endTimestamp).toBeGreaterThanOrEqual(0); expect(firesale.endAt).toBeDefined(); expectTypeOf(firesale.endAt).toEqualTypeOf(); expect(firesale.amount).toBeDefined(); expectTypeOf(firesale.amount).toEqualTypeOf(); - expect(firesale.amount).toBeGreaterThanOrEqual(0); + expect(firesale.price).toBeDefined(); + expectTypeOf(firesale.price).toEqualTypeOf(); + expect(firesale.toString).toBeDefined(); + expectTypeOf(firesale.toString).toEqualTypeOf<() => string>(); expect(firesale.toString()).toBeDefined(); - expectTypeOf(firesale.toString()).toEqualTypeOf(); expect(firesale.toString()).toBe(firesale.itemId); + expectTypeOf(firesale.toString()).toEqualTypeOf(); }); + vi.restoreAllMocks(); client.destroy(); }); diff --git a/src/API/getSkyblockFireSales.ts b/src/API/getSkyBlockFireSales.ts similarity index 55% rename from src/API/getSkyblockFireSales.ts rename to src/API/getSkyBlockFireSales.ts index a006db26b..01045cc7f 100644 --- a/src/API/getSkyblockFireSales.ts +++ b/src/API/getSkyBlockFireSales.ts @@ -1,21 +1,21 @@ import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; -import FireSale from '../Structures/SkyBlock/Static/FireSale.js'; import RequestData from '../Private/RequestData.js'; +import SkyBlockFireSale from '../Structures/SkyBlock/FireSale/SkyBlockFireSale.js'; import type { RequestOptions } from '../Types/Requests.js'; -class getSkyblockFireSales extends Endpoint { +class getSkyBlockSkyBlockFireSales extends Endpoint { override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - override async execute(options?: RequestOptions): Promise { + override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/skyblock/firesales', options); if (res.options.raw) return res; - return res.data.sales.map((a: any) => new FireSale(a)); + return res.data.sales.map((sale: any) => new SkyBlockFireSale(sale)); } } -export default getSkyblockFireSales; +export default getSkyBlockSkyBlockFireSales; diff --git a/src/API/getSkyBlockGarden.test.ts b/src/API/getSkyBlockGarden.test.ts new file mode 100644 index 000000000..a29818e98 --- /dev/null +++ b/src/API/getSkyBlockGarden.test.ts @@ -0,0 +1,55 @@ +import Client from '../Client.js'; +import RequestData from '../Private/RequestData.js'; +import SkyBlockGarden from '../Structures/SkyBlock/Garden/SkyBlockGarden.js'; +import SkyBlockGardenActiveVisitor from '../Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitor.js'; +import SkyBlockGardenComposter from '../Structures/SkyBlock/Garden/SkyBlockGardenComposter.js'; +import SkyBlockGardenCropMilestones from '../Structures/SkyBlock/Garden/SkyBlockGardenCropMilestones.js'; +import SkyBlockGardenCropsUpgrades from '../Structures/SkyBlock/Garden/SkyBlockGardenCropsUpgrades.js'; +import SkyBlockGardenVisitors from '../Structures/SkyBlock/Garden/SkyBlockGardenVisitors.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { BarnPlot, BarnSkin, SkillLevelData } from '../Types/SkyBlock.js'; + +test('getSkyBlockGarden (no input)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + expect(() => client.getSkyBlockGarden()).rejects.toThrowError(client.errors.NO_UUID); + client.destroy(); +}); + +test('getSkyBlockGarden (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getSkyBlockGarden('ed9b9d6d-d9b7-43b1-9841-5d0c20b55494', { raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getSkyBlockGarden', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getSkyBlockGarden('ed9b9d6d-d9b7-43b1-9841-5d0c20b55494'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockGarden); + expectTypeOf(data).toEqualTypeOf(); + data = data as SkyBlockGarden; + expect(data.level).toBeDefined(); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.barnSkin).toBeDefined(); + expectTypeOf(data.barnSkin).toEqualTypeOf(); + expect(data.unlockedBarnSkins).toBeDefined(); + expectTypeOf(data.unlockedBarnSkins).toEqualTypeOf(); + expect(data.unlockedPlots).toBeDefined(); + expectTypeOf(data.unlockedPlots).toEqualTypeOf(); + expect(data.visitors).toBeDefined(); + expectTypeOf(data.visitors).toEqualTypeOf(); + expect(data.currentVisitors).toBeDefined(); + expectTypeOf(data.currentVisitors).toEqualTypeOf(); + expect(data.cropMilestones).toBeDefined(); + expectTypeOf(data.cropMilestones).toEqualTypeOf(); + expect(data.composter).toBeDefined(); + expectTypeOf(data.composter).toEqualTypeOf(); + expect(data.cropUpgrades).toBeDefined(); + expectTypeOf(data.cropUpgrades).toEqualTypeOf(); + client.destroy(); +}); diff --git a/src/API/getSkyblockGarden.ts b/src/API/getSkyBlockGarden.ts similarity index 70% rename from src/API/getSkyblockGarden.ts rename to src/API/getSkyBlockGarden.ts index ba5db5547..a15e0a2fa 100644 --- a/src/API/getSkyblockGarden.ts +++ b/src/API/getSkyBlockGarden.ts @@ -1,22 +1,22 @@ import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; -import SkyblockGarden from '../Structures/SkyBlock/SkyblockGarden.js'; +import SkyBlockGarden from '../Structures/SkyBlock/Garden/SkyBlockGarden.js'; import type { RequestOptions } from '../Types/Requests.js'; -class getSkyblockGarden extends Endpoint { +class getSkyBlockGarden extends Endpoint { override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - override async execute(profileId: string, options?: RequestOptions): Promise { + override async execute(profileId: string, options?: RequestOptions): Promise { if (!profileId) throw new Error(this.client.errors.NO_UUID); const res = await this.client.requestHandler.request(`/skyblock/garden?profile=${profileId}`, options); if (res.options.raw) return res; - return new SkyblockGarden(res.data); + return new SkyBlockGarden(res.data.garden); } } -export default getSkyblockGarden; +export default getSkyBlockGarden; diff --git a/src/API/getSkyBlockItems.test.ts b/src/API/getSkyBlockItems.test.ts new file mode 100644 index 000000000..92465b41b --- /dev/null +++ b/src/API/getSkyBlockItems.test.ts @@ -0,0 +1,27 @@ +import Client from '../Client.js'; +import RequestData from '../Private/RequestData.js'; +import SkyBlockItem from '../Structures/SkyBlock/SkyBlockItem.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('getSkyBlockItems (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getSkyBlockItems({ raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getSkyBlockItems', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getSkyBlockItems(); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as SkyBlockItem[]; + data.forEach((item: SkyBlockItem) => { + expect(item).toBeDefined(); + expect(item).toBeInstanceOf(SkyBlockItem); + expectTypeOf(item).toEqualTypeOf(); + }); + client.destroy(); +}); diff --git a/src/API/getSkyblockItems.ts b/src/API/getSkyBlockItems.ts similarity index 62% rename from src/API/getSkyblockItems.ts rename to src/API/getSkyBlockItems.ts index 947b765da..d90bdcd01 100644 --- a/src/API/getSkyblockItems.ts +++ b/src/API/getSkyBlockItems.ts @@ -1,21 +1,21 @@ import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; -import SkyblockItem from '../Structures/SkyBlock/SkyblockItem.js'; +import SkyBlockItem from '../Structures/SkyBlock/SkyBlockItem.js'; import type { RequestOptions } from '../Types/Requests.js'; -class getSkyblockItems extends Endpoint { +class getSkyBlockItems extends Endpoint { override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - override async execute(options?: RequestOptions): Promise { + override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/resources/skyblock/items', options); if (res.options.raw) return res; - return res.data.items.map((i: any) => new SkyblockItem(i)); + return res.data.items.map((item: Record) => new SkyBlockItem(item)); } } -export default getSkyblockItems; +export default getSkyBlockItems; diff --git a/src/API/getSkyBlockMuseum.test.ts b/src/API/getSkyBlockMuseum.test.ts new file mode 100644 index 000000000..e4dc4931b --- /dev/null +++ b/src/API/getSkyBlockMuseum.test.ts @@ -0,0 +1,34 @@ +import Client from '../Client.js'; +import RequestData from '../Private/RequestData.js'; +import SkyBlockMuseum from '../Structures/SkyBlock/Museum/SkyBlockMuseum.js'; +import SkyBlockMuseumMember from '../Structures/SkyBlock/Museum/SkyBlockMuseumMember.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { UUID } from '../Types/Global.js'; + +test('getSkyBlockMuseum (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getSkyBlockMuseum('63fe6f4c-4b06-43b2-abd0-2d15dc303e41', { raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getSkyBlockMuseum (No input)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + expect(() => client.getSkyBlockMuseum()).rejects.toThrowError(client.errors.NO_UUID); + client.destroy(); +}); + +test('getSkyBlockMuseum', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getSkyBlockMuseum('63fe6f4c-4b06-43b2-abd0-2d15dc303e41'); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as SkyBlockMuseum; + expect(data.members).toBeDefined(); + expectTypeOf(data.members).toEqualTypeOf>(); + client.destroy(); +}); diff --git a/src/API/getSkyBlockMuseum.ts b/src/API/getSkyBlockMuseum.ts new file mode 100644 index 000000000..d7f5ca72c --- /dev/null +++ b/src/API/getSkyBlockMuseum.ts @@ -0,0 +1,22 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import RequestData from '../Private/RequestData.js'; +import SkyBlockMuseum from '../Structures/SkyBlock/Museum/SkyBlockMuseum.js'; +import type { RequestOptions } from '../Types/Requests.js'; + +class getSkyBlockMuseum extends Endpoint { + override readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + override async execute(profileId: string, options?: RequestOptions): Promise { + if (!profileId) throw new Error(this.client.errors.NO_UUID); + const res = await this.client.requestHandler.request(`/skyblock/museum?profile=${profileId}`, options); + if (res.options.raw) return res; + return new SkyBlockMuseum(res.data); + } +} + +export default getSkyBlockMuseum; diff --git a/src/API/getSkyblockNews.test.ts b/src/API/getSkyBlockNews.test.ts similarity index 57% rename from src/API/getSkyblockNews.test.ts rename to src/API/getSkyBlockNews.test.ts index 61904eebb..4caef520a 100644 --- a/src/API/getSkyblockNews.test.ts +++ b/src/API/getSkyBlockNews.test.ts @@ -1,38 +1,32 @@ import Client from '../Client.js'; import RequestData from '../Private/RequestData.js'; -import SkyblockNews from '../Structures/SkyBlock/News/SkyblockNews.js'; +import SkyBlockNews from '../Structures/SkyBlock/News/SkyBlockNews.js'; import { expect, expectTypeOf, test } from 'vitest'; -test('getSkyblockNews (raw)', async () => { +test('getSkyBlockNews (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - const data = await client.getSkyblockNews({ raw: true }); + const data = await client.getSkyBlockNews({ raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); - expectTypeOf(data).toEqualTypeOf(); + expectTypeOf(data).toEqualTypeOf(); client.destroy(); }); -test('getSkyblockNews', async () => { +test('getSkyBlockNews', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getSkyblockNews(); + let data = await client.getSkyBlockNews(); expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf(); - data = data as SkyblockNews[]; - data.forEach((news: SkyblockNews) => { + expectTypeOf(data).toEqualTypeOf(); + data = data as SkyBlockNews[]; + data.forEach((news: SkyBlockNews) => { expect(news.title).toBeDefined(); expectTypeOf(news.title).toEqualTypeOf(); expect(news.link).toBeDefined(); expectTypeOf(news.link).toEqualTypeOf(); - expect(news.rawDate).toBeDefined(); - expectTypeOf(news.rawDate).toEqualTypeOf(); expect(news.date).toBeDefined(); expectTypeOf(news.date).toEqualTypeOf(); expect(news.version).toBeDefined(); expectTypeOf(news.version).toEqualTypeOf(); - expect(news.toString()).toBeDefined(); - expect(news.toString()).toBe(news.title); - expectTypeOf(news.toString()).toEqualTypeOf(); }); - client.destroy(); }); diff --git a/src/API/getSkyblockNews.ts b/src/API/getSkyBlockNews.ts similarity index 63% rename from src/API/getSkyblockNews.ts rename to src/API/getSkyBlockNews.ts index b00ef9d66..8015f2ee9 100644 --- a/src/API/getSkyblockNews.ts +++ b/src/API/getSkyBlockNews.ts @@ -1,21 +1,21 @@ import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; -import SkyblockNews from '../Structures/SkyBlock/News/SkyblockNews.js'; +import SkyBlockNews from '../Structures/SkyBlock/News/SkyBlockNews.js'; import type { RequestOptions } from '../Types/Requests.js'; -class getSkyblockNews extends Endpoint { +class getSkyBlockNews extends Endpoint { override readonly client: Client; constructor(client: Client) { super(client); this.client = client; } - override async execute(options?: RequestOptions): Promise { + override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/skyblock/news', options); if (res.options.raw) return res; - return res.data.items.map((i: any) => new SkyblockNews(i)); + return res.data.items.map((news: any) => new SkyBlockNews(news)); } } -export default getSkyblockNews; +export default getSkyBlockNews; diff --git a/src/API/getSkyBlockProfile.test.ts b/src/API/getSkyBlockProfile.test.ts new file mode 100644 index 000000000..83abea58f --- /dev/null +++ b/src/API/getSkyBlockProfile.test.ts @@ -0,0 +1,68 @@ +import Client from '../Client.js'; +import RequestData from '../Private/RequestData.js'; +import SkyBlockGarden from '../Structures/SkyBlock/Garden/SkyBlockGarden.js'; +import SkyBlockMember from '../Structures/SkyBlock/Member/SkyBlockMember.js'; +import SkyBlockProfile from '../Structures/SkyBlock/Profile/SkyBlockProfile.js'; +import SkyBlockProfileBanking from '../Structures/SkyBlock/Profile/Banking/SkyBlockProfileBanking.js'; +// eslint-disable-next-line max-len +import SkyBlockProfileCommunityUpgrades from '../Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgrades.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { SkyBlockProfileName, SkyBlockProfileType } from '../Types/SkyBlock.js'; + +test('getSkyBlockProfile (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getSkyBlockProfile('14727faefbdc4aff848cd2713eb9939e', { raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getSkyBlockProfile (no input)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + expect(() => client.getSkyBlockProfile()).rejects.toThrowError(client.errors.NO_UUID); + client.destroy(); +}); + +test('getSkyBlockProfile (no profiles)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + expect(() => client.getSkyBlockProfile('ce6685dd-78dd-4418-9f6f-b01cf9778daa')).rejects.toThrowError( + client.errors.NO_SKYBLOCK_PROFILES + ); + client.destroy(); +}); + +test('getSkyBlockProfile', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getSkyBlockProfile('ed9b9d6d-d9b7-43b1-9841-5d0c20b55494'); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as SkyBlockProfile; + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + expect(data.profileId).toBeDefined(); + expectTypeOf(data.profileId).toEqualTypeOf(); + expect(data.communityUpgrades).toBeDefined(); + expectTypeOf(data.communityUpgrades).toEqualTypeOf(); + expect(data.createdTimestamp).toBeDefined(); + expectTypeOf(data.createdTimestamp).toEqualTypeOf(); + expect(data.createdAt).toBeDefined(); + expectTypeOf(data.createdAt).toEqualTypeOf(); + expect(data.members).toBeDefined(); + expectTypeOf(data.members).toEqualTypeOf(); + expect(data.me).toBeDefined(); + expectTypeOf(data.me).toEqualTypeOf(); + expect(data.gameMode).toBeDefined(); + expectTypeOf(data.gameMode).toEqualTypeOf(); + expect(data.banking).toBeDefined(); + expectTypeOf(data.banking).toEqualTypeOf(); + expect(data.profileName).toBeDefined(); + expectTypeOf(data.profileName).toEqualTypeOf(); + expect(data.selected).toBeDefined(); + expectTypeOf(data.selected).toEqualTypeOf(); + expect(data.garden).toBeDefined(); + expectTypeOf(data.garden).toEqualTypeOf(); + client.destroy(); +}); diff --git a/src/API/getSkyBlockProfile.ts b/src/API/getSkyBlockProfile.ts new file mode 100644 index 000000000..ac9a96918 --- /dev/null +++ b/src/API/getSkyBlockProfile.ts @@ -0,0 +1,46 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import RequestData from '../Private/RequestData.js'; +import SkyBlockGarden from '../Structures/SkyBlock/Garden/SkyBlockGarden.js'; +import SkyBlockProfile from '../Structures/SkyBlock/Profile/SkyBlockProfile.js'; +import type SkyBlockMuseum from '../Structures/SkyBlock/Museum/SkyBlockMuseum.js'; +import type { SkyBlockRequestOptions } from '../Types/API.js'; + +class getSkyBlockProfile extends Endpoint { + override readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + override async execute(profileId: string, options?: SkyBlockRequestOptions): Promise { + if (!profileId) throw new Error(this.client.errors.NO_UUID); + const res = await this.client.requestHandler.request(`/skyblock/profile?profile=${profileId}`, options); + if (res.options.raw) return res; + if (!res.data.profile) throw new Error(this.client.errors.NO_SKYBLOCK_PROFILES); + const garden = await this.handleGettingSkyBlockGarden(res.data.profile.profile_id); + const museum = await this.handleGettingSkyBlockMuseum(res.data.profile.profile_id); + const parsedProfile = new SkyBlockProfile(res.data.profile, { uuid: null, garden, museum }); + return parsedProfile; + } + + private async handleGettingSkyBlockGarden(profileId: string): Promise { + try { + const garden = await this.client.getSkyBlockGarden(profileId); + return garden as SkyBlockGarden; + } catch { + return null; + } + } + + private async handleGettingSkyBlockMuseum(profileId: string): Promise { + try { + const museum = await this.client.getSkyBlockMuseum(profileId); + return museum as SkyBlockMuseum; + } catch { + return null; + } + } +} + +export default getSkyBlockProfile; diff --git a/src/API/getSkyBlockProfiles.test.ts b/src/API/getSkyBlockProfiles.test.ts new file mode 100644 index 000000000..352e33a92 --- /dev/null +++ b/src/API/getSkyBlockProfiles.test.ts @@ -0,0 +1,70 @@ +import Client from '../Client.js'; +import RequestData from '../Private/RequestData.js'; +import SkyBlockGarden from '../Structures/SkyBlock/Garden/SkyBlockGarden.js'; +import SkyBlockMember from '../Structures/SkyBlock/Member/SkyBlockMember.js'; +import SkyBlockProfile from '../Structures/SkyBlock/Profile/SkyBlockProfile.js'; +import SkyBlockProfileBanking from '../Structures/SkyBlock/Profile/Banking/SkyBlockProfileBanking.js'; +// eslint-disable-next-line max-len +import SkyBlockProfileCommunityUpgrades from '../Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgrades.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { SkyBlockProfileName, SkyBlockProfileType } from '../Types/SkyBlock.js'; + +test('getSkyBlockProfiles (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getSkyBlockProfiles('14727faefbdc4aff848cd2713eb9939e', { raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf | RequestData>(); + client.destroy(); +}); + +test('getSkyBlockProfiles (no input)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + expect(() => client.getSkyBlockProfiles()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); + client.destroy(); +}); + +test('getSkyBlockProfiles (no profiles)', () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + expect(() => client.getSkyBlockProfiles('b45add7b081443909fb00aa9a3e15eb0')).rejects.toThrowError( + client.errors.NO_SKYBLOCK_PROFILES + ); + client.destroy(); +}); + +test('getSkyBlockProfiles', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getSkyBlockProfiles('14727faefbdc4aff848cd2713eb9939e'); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf | RequestData>(); + data = data as Map; + data.forEach((profile) => { + expect(profile).toBeDefined(); + expectTypeOf(profile).toEqualTypeOf(); + expect(profile.profileId).toBeDefined(); + expectTypeOf(profile.profileId).toEqualTypeOf(); + expect(profile.communityUpgrades).toBeDefined(); + expectTypeOf(profile.communityUpgrades).toEqualTypeOf(); + expect(profile.createdTimestamp).toBeDefined(); + expectTypeOf(profile.createdTimestamp).toEqualTypeOf(); + expect(profile.createdAt).toBeDefined(); + expectTypeOf(profile.createdAt).toEqualTypeOf(); + expect(profile.members).toBeDefined(); + expectTypeOf(profile.members).toEqualTypeOf(); + expect(profile.me).toBeDefined(); + expectTypeOf(profile.me).toEqualTypeOf(); + expect(profile.gameMode).toBeDefined(); + expectTypeOf(profile.gameMode).toEqualTypeOf(); + expect(profile.banking).toBeDefined(); + expectTypeOf(profile.banking).toEqualTypeOf(); + expect(profile.profileName).toBeDefined(); + expectTypeOf(profile.profileName).toEqualTypeOf(); + expect(profile.selected).toBeDefined(); + expectTypeOf(profile.selected).toEqualTypeOf(); + expect(profile.garden).toBeDefined(); + expectTypeOf(profile.garden).toEqualTypeOf(); + }); + client.destroy(); +}); diff --git a/src/API/getSkyBlockProfiles.ts b/src/API/getSkyBlockProfiles.ts new file mode 100644 index 000000000..b9ba5fcfa --- /dev/null +++ b/src/API/getSkyBlockProfiles.ts @@ -0,0 +1,55 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import RequestData from '../Private/RequestData.js'; +import SkyBlockGarden from '../Structures/SkyBlock/Garden/SkyBlockGarden.js'; +import SkyBlockProfile from '../Structures/SkyBlock/Profile/SkyBlockProfile.js'; +import type SkyBlockMuseum from '../Structures/SkyBlock/Museum/SkyBlockMuseum.js'; +import type { SkyBlockProfileName } from '../Types/SkyBlock.js'; +import type { SkyBlockRequestOptions } from '../Types/API.js'; + +class getSkyBlockProfiles extends Endpoint { + override readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + override async execute( + query: string, + options?: SkyBlockRequestOptions + ): Promise | RequestData> { + if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); + query = await this.client.requestHandler.toUUID(query); + const res = await this.client.requestHandler.request(`/skyblock/profiles?uuid=${query}`, options); + if (res.options.raw) return res; + if (!res.data.profiles || !res.data.profiles.length) throw new Error(this.client.errors.NO_SKYBLOCK_PROFILES); + const profiles: Map = new Map(); + for (const profile of res.data.profiles) { + const garden = await this.handleGettingSkyBlockGarden(profile.profile_id); + const museum = await this.handleGettingSkyBlockMuseum(profile.profile_id); + const parsedProfile = new SkyBlockProfile(profile, { uuid: query, garden, museum }); + profiles.set(parsedProfile.profileName, parsedProfile); + } + return profiles; + } + + private async handleGettingSkyBlockGarden(profileId: string): Promise { + try { + const garden = await this.client.getSkyBlockGarden(profileId); + return garden as SkyBlockGarden; + } catch { + return null; + } + } + + private async handleGettingSkyBlockMuseum(profileId: string): Promise { + try { + const museum = await this.client.getSkyBlockMuseum(profileId); + return museum as SkyBlockMuseum; + } catch { + return null; + } + } +} + +export default getSkyBlockProfiles; diff --git a/src/API/getSkyBlockSkills.test.ts b/src/API/getSkyBlockSkills.test.ts new file mode 100644 index 000000000..ae817f605 --- /dev/null +++ b/src/API/getSkyBlockSkills.test.ts @@ -0,0 +1,51 @@ +import Client from '../Client.js'; +import RequestData from '../Private/RequestData.js'; +import SkyBlockSkill from '../Structures/SkyBlock/Skills/SkyBlockSkill.js'; +import SkyBlockSkills from '../Structures/SkyBlock/Skills/SkyBlockSkills.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('getSkyBlockSkills (raw)', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + const data = await client.getSkyBlockSkills({ raw: true }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RequestData); + expectTypeOf(data).toEqualTypeOf(); + client.destroy(); +}); + +test('getSkyBlockSkills', async () => { + const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + let data = await client.getSkyBlockSkills(); + expect(data).toBeDefined(); + expectTypeOf(data).toEqualTypeOf(); + data = data as SkyBlockSkills; + expect(data.lastUpdated).toBeDefined(); + expectTypeOf(data.lastUpdated).toEqualTypeOf(); + expect(data.lastUpdatedAt).toBeDefined(); + expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); + expect(data.version).toBeDefined(); + expectTypeOf(data.version).toEqualTypeOf(); + expect(data.farming).toBeDefined(); + expectTypeOf(data.farming).toEqualTypeOf(); + expect(data.mining).toBeDefined(); + expectTypeOf(data.mining).toEqualTypeOf(); + expect(data.combat).toBeDefined(); + expectTypeOf(data.combat).toEqualTypeOf(); + expect(data.foraging).toBeDefined(); + expectTypeOf(data.foraging).toEqualTypeOf(); + expect(data.fishing).toBeDefined(); + expectTypeOf(data.fishing).toEqualTypeOf(); + expect(data.enchanting).toBeDefined(); + expectTypeOf(data.enchanting).toEqualTypeOf(); + expect(data.alchemy).toBeDefined(); + expectTypeOf(data.alchemy).toEqualTypeOf(); + expect(data.carpentry).toBeDefined(); + expectTypeOf(data.carpentry).toEqualTypeOf(); + expect(data.runecrafting).toBeDefined(); + expectTypeOf(data.runecrafting).toEqualTypeOf(); + expect(data.social).toBeDefined(); + expectTypeOf(data.social).toEqualTypeOf(); + expect(data.taming).toBeDefined(); + expectTypeOf(data.taming).toEqualTypeOf(); + client.destroy(); +}); diff --git a/src/API/getSkyBlockSkills.ts b/src/API/getSkyBlockSkills.ts new file mode 100644 index 000000000..c5057d98b --- /dev/null +++ b/src/API/getSkyBlockSkills.ts @@ -0,0 +1,21 @@ +import Client from '../Client.js'; +import Endpoint from '../Private/Endpoint.js'; +import RequestData from '../Private/RequestData.js'; +import SkyBlockSkills from '../Structures/SkyBlock/Skills/SkyBlockSkills.js'; +import type { RequestOptions } from '../Types/Requests.js'; + +class getSkyBlockSkills extends Endpoint { + override readonly client: Client; + constructor(client: Client) { + super(client); + this.client = client; + } + + override async execute(options?: RequestOptions): Promise { + const res = await this.client.requestHandler.request('/resources/skyblock/skills', options); + if (res.options.raw) return res; + return new SkyBlockSkills(res.data); + } +} + +export default getSkyBlockSkills; diff --git a/src/API/getSkyblockAuction.test.ts b/src/API/getSkyblockAuction.test.ts deleted file mode 100644 index ebd8a1092..000000000 --- a/src/API/getSkyblockAuction.test.ts +++ /dev/null @@ -1,376 +0,0 @@ -import Auction from '../Structures/SkyBlock/Auctions/Auction.js'; -import Bid from '../Structures/SkyBlock/Auctions/Bid.js'; -import Client from '../Client.js'; -import ItemBytes from '../Structures/ItemBytes.js'; -import RequestData from '../Private/RequestData.js'; -import { expect, expectTypeOf, test } from 'vitest'; -import type { Rarity } from '../Types/Skyblock.js'; - -test('getSkyblockAuction (raw)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - const auctions = await client.getSkyblockAuctions(1); - if (undefined === auctions.auctions[0]) return; - if (!auctions.auctions[0].auctioneerUuid) throw new Error("Something wen't wrong while fetching auctions"); - const data = await client.getSkyblockAuction('player', auctions.auctions[0].auctioneerUuid, { raw: true }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(RequestData); - expectTypeOf(data).toEqualTypeOf(); - client.destroy(); -}); - -test('getSkyblockAuction (No Query)', () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - expect(() => client.getSkyblockAuction('auction', '')).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); - client.destroy(); -}); - -test('getSkyblockAuction (Bad Filter)', () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - expect(() => client.getSkyblockAuction('meow')).rejects.toThrowError(client.errors.BAD_AUCTION_FILTER); - client.destroy(); -}); - -test('getSkyblockAuction (Auction)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - const auctions = await client.getSkyblockAuctions(1); - if (undefined === auctions.auctions[0]) return; - if (!auctions.auctions[0].auctioneerUuid) throw new Error("Something wen't wrong while fetching auctions"); - let data = await client.getSkyblockAuction('auction', auctions.auctions[0].auctioneerUuid); - expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf(); - data = data as Auction[]; - expect(data.length).toBeGreaterThanOrEqual(0); - expectTypeOf(data.length).toEqualTypeOf(); - data.forEach((auction: Auction) => { - expect(auction).toBeDefined(); - expect(auction).toBeInstanceOf(Auction); - expectTypeOf(auction).toEqualTypeOf(); - expect(auction.auctionId).toBeDefined(); - expectTypeOf(auction.auctionId).toEqualTypeOf(); - expect(auction.auctioneerUuid).toBeDefined(); - expectTypeOf(auction.auctioneerUuid).toEqualTypeOf(); - expect(auction.auctioneerProfile).toBeDefined(); - expectTypeOf(auction.auctioneerProfile).toEqualTypeOf(); - expect(auction.bin).toBeDefined(); - expectTypeOf(auction.bin).toEqualTypeOf(); - expect(auction.itemBytes).toBeDefined(); - expect(auction.itemBytes).toBeNull(); - expectTypeOf(auction.itemBytes).toEqualTypeOf(); - expect(auction.coop).toBeDefined(); - expectTypeOf(auction.coop).toEqualTypeOf(); - expect(auction.auctionStartTimestamp).toBeDefined(); - expect(auction.auctionStartTimestamp).toBeGreaterThanOrEqual(0); - expectTypeOf(auction.auctionStartTimestamp).toEqualTypeOf(); - expect(auction.auctionStart).toBeDefined(); - expectTypeOf(auction.auctionStart).toEqualTypeOf(); - expect(auction.auctionEndTimestamp).toBeDefined(); - expectTypeOf(auction.auctionEndTimestamp).toEqualTypeOf(); - expect(auction.auctionEnd).toBeDefined(); - expectTypeOf(auction.auctionEnd).toEqualTypeOf(); - expect(auction.item).toBeDefined(); - expectTypeOf(auction.item).toEqualTypeOf(); - expect(auction.itemLore).toBeDefined(); - expectTypeOf(auction.itemLore).toEqualTypeOf(); - expect(auction.itemLoreRaw).toBeDefined(); - expectTypeOf(auction.itemLoreRaw).toEqualTypeOf(); - expect(auction.rarity).toBeDefined(); - expectTypeOf(auction.rarity).toEqualTypeOf(); - expect(auction.startingBid).toBeDefined(); - expectTypeOf(auction.startingBid).toEqualTypeOf(); - expect(auction.highestBid).toBeDefined(); - expectTypeOf(auction.highestBid).toEqualTypeOf(); - expect(auction.bids).toBeDefined(); - expectTypeOf(auction.bids).toEqualTypeOf(); - auction.bids.forEach((bid: Bid) => { - expect(bid).toBeDefined(); - expect(bid).toBeInstanceOf(Bid); - expectTypeOf(bid).toEqualTypeOf(); - expect(bid.auctionId).toBeDefined(); - expectTypeOf(bid.auctionId).toEqualTypeOf(); - expect(bid.profileId).toBeDefined(); - expectTypeOf(bid.profileId).toEqualTypeOf(); - expect(bid.amount).toBeDefined(); - expect(bid.amount).toBeGreaterThanOrEqual(0); - expectTypeOf(bid.amount).toEqualTypeOf(); - expect(bid.timestamp).toBeDefined(); - expectTypeOf(bid.timestamp).toEqualTypeOf(); - expect(bid.at).toBeDefined(); - expectTypeOf(bid.at).toEqualTypeOf(); - expect(bid.bidder).toBeDefined(); - expectTypeOf(bid.bidder).toEqualTypeOf(); - expect(bid.toString()).toBeDefined(); - expect(bid.toString()).toBe(`${bid.bidder} bid ${bid.amount} coins`); - expectTypeOf(bid.toString()).toEqualTypeOf(); - }); - expect(auction.claimed).toBeDefined(); - expectTypeOf(auction.claimed).toEqualTypeOf(); - expect(auction.claimedBidders).toBeDefined(); - expectTypeOf(auction.claimedBidders).toEqualTypeOf(); - expect(auction.toString()).toBeDefined(); - expect(auction.toString()).toEqual(auction.item); - expectTypeOf(auction.toString()).toEqualTypeOf(); - }); - client.destroy(); -}); - -test('getSkyblockAuction (Player)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - const auctions = await client.getSkyblockAuctions(1); - if (undefined === auctions.auctions[0]) return; - if (!auctions.auctions[0].auctioneerUuid) throw new Error("Something wen't wrong while fetching auctions"); - let data = await client.getSkyblockAuction('player', auctions.auctions[0].auctioneerUuid); - expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf(); - data = data as Auction[]; - expect(data.length).toBeGreaterThanOrEqual(0); - expectTypeOf(data.length).toEqualTypeOf(); - data.forEach((auction: Auction) => { - expect(auction).toBeDefined(); - expect(auction).toBeInstanceOf(Auction); - expectTypeOf(auction).toEqualTypeOf(); - expect(auction.auctionId).toBeDefined(); - expectTypeOf(auction.auctionId).toEqualTypeOf(); - expect(auction.auctioneerUuid).toBeDefined(); - expectTypeOf(auction.auctioneerUuid).toEqualTypeOf(); - expect(auction.auctioneerProfile).toBeDefined(); - expectTypeOf(auction.auctioneerProfile).toEqualTypeOf(); - expect(auction.bin).toBeDefined(); - expectTypeOf(auction.bin).toEqualTypeOf(); - expect(auction.itemBytes).toBeNull(); - expect(auction.itemBytes).toBeDefined(); - expectTypeOf(auction.itemBytes).toEqualTypeOf(); - expect(auction.coop).toBeDefined(); - expectTypeOf(auction.coop).toEqualTypeOf(); - expect(auction.auctionStartTimestamp).toBeDefined(); - expect(auction.auctionStartTimestamp).toBeGreaterThanOrEqual(0); - expectTypeOf(auction.auctionStartTimestamp).toEqualTypeOf(); - expect(auction.auctionStart).toBeDefined(); - expectTypeOf(auction.auctionStart).toEqualTypeOf(); - expect(auction.auctionEndTimestamp).toBeDefined(); - expectTypeOf(auction.auctionEndTimestamp).toEqualTypeOf(); - expect(auction.auctionEnd).toBeDefined(); - expectTypeOf(auction.auctionEnd).toEqualTypeOf(); - expect(auction.item).toBeDefined(); - expectTypeOf(auction.item).toEqualTypeOf(); - expect(auction.itemLore).toBeDefined(); - expectTypeOf(auction.itemLore).toEqualTypeOf(); - expect(auction.itemLoreRaw).toBeDefined(); - expectTypeOf(auction.itemLoreRaw).toEqualTypeOf(); - expect(auction.rarity).toBeDefined(); - expectTypeOf(auction.rarity).toEqualTypeOf(); - expect(auction.startingBid).toBeDefined(); - expectTypeOf(auction.startingBid).toEqualTypeOf(); - expect(auction.highestBid).toBeDefined(); - expectTypeOf(auction.highestBid).toEqualTypeOf(); - expect(auction.bids).toBeDefined(); - expectTypeOf(auction.bids).toEqualTypeOf(); - auction.bids.forEach((bid: Bid) => { - expect(bid).toBeDefined(); - expect(bid).toBeInstanceOf(Bid); - expectTypeOf(bid).toEqualTypeOf(); - expect(bid.auctionId).toBeDefined(); - expectTypeOf(bid.auctionId).toEqualTypeOf(); - expect(bid.profileId).toBeDefined(); - expectTypeOf(bid.profileId).toEqualTypeOf(); - expect(bid.amount).toBeDefined(); - expect(bid.amount).toBeGreaterThanOrEqual(0); - expectTypeOf(bid.amount).toEqualTypeOf(); - expect(bid.timestamp).toBeDefined(); - expectTypeOf(bid.timestamp).toEqualTypeOf(); - expect(bid.at).toBeDefined(); - expectTypeOf(bid.at).toEqualTypeOf(); - expect(bid.bidder).toBeDefined(); - expectTypeOf(bid.bidder).toEqualTypeOf(); - expect(bid.toString()).toBeDefined(); - expect(bid.toString()).toBe(`${bid.bidder} bid ${bid.amount} coins`); - expectTypeOf(bid.toString()).toEqualTypeOf(); - }); - expect(auction.claimed).toBeDefined(); - expectTypeOf(auction.claimed).toEqualTypeOf(); - expect(auction.claimedBidders).toBeDefined(); - expectTypeOf(auction.claimedBidders).toEqualTypeOf(); - expect(auction.toString()).toBeDefined(); - expect(auction.toString()).toEqual(auction.item); - expectTypeOf(auction.toString()).toEqualTypeOf(); - }); - client.destroy(); -}); - -test('getSkyblockAuction (Profile)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - const auctions = await client.getSkyblockAuctions(1); - if (undefined === auctions.auctions[0]) return; - if (!auctions.auctions[0].auctioneerProfile) throw new Error("Something wen't wrong while fetching auctions"); - let data = await client.getSkyblockAuction('profile', auctions.auctions[0].auctioneerProfile); - expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf(); - data = data as Auction[]; - expect(data.length).toBeGreaterThanOrEqual(0); - expectTypeOf(data.length).toEqualTypeOf(); - data.forEach((auction: Auction) => { - expect(auction).toBeDefined(); - expect(auction).toBeInstanceOf(Auction); - expectTypeOf(auction).toEqualTypeOf(); - expect(auction.auctionId).toBeDefined(); - expectTypeOf(auction.auctionId).toEqualTypeOf(); - expect(auction.auctioneerUuid).toBeDefined(); - expectTypeOf(auction.auctioneerUuid).toEqualTypeOf(); - expect(auction.auctioneerProfile).toBeDefined(); - expectTypeOf(auction.auctioneerProfile).toEqualTypeOf(); - expect(auction.bin).toBeDefined(); - expectTypeOf(auction.bin).toEqualTypeOf(); - expect(auction.itemBytes).toBeDefined(); - expect(auction.itemBytes).toBeNull(); - expectTypeOf(auction.itemBytes).toEqualTypeOf(); - expect(auction.coop).toBeDefined(); - expectTypeOf(auction.coop).toEqualTypeOf(); - expect(auction.auctionStartTimestamp).toBeDefined(); - expect(auction.auctionStartTimestamp).toBeGreaterThanOrEqual(0); - expectTypeOf(auction.auctionStartTimestamp).toEqualTypeOf(); - expect(auction.auctionStart).toBeDefined(); - expectTypeOf(auction.auctionStart).toEqualTypeOf(); - expect(auction.auctionEndTimestamp).toBeDefined(); - expectTypeOf(auction.auctionEndTimestamp).toEqualTypeOf(); - expect(auction.auctionEnd).toBeDefined(); - expectTypeOf(auction.auctionEnd).toEqualTypeOf(); - expect(auction.item).toBeDefined(); - expectTypeOf(auction.item).toEqualTypeOf(); - expect(auction.itemLore).toBeDefined(); - expectTypeOf(auction.itemLore).toEqualTypeOf(); - expect(auction.itemLoreRaw).toBeDefined(); - expectTypeOf(auction.itemLoreRaw).toEqualTypeOf(); - expect(auction.rarity).toBeDefined(); - expectTypeOf(auction.rarity).toEqualTypeOf(); - expect(auction.startingBid).toBeDefined(); - expectTypeOf(auction.startingBid).toEqualTypeOf(); - expect(auction.highestBid).toBeDefined(); - expectTypeOf(auction.highestBid).toEqualTypeOf(); - expect(auction.bids).toBeDefined(); - expectTypeOf(auction.bids).toEqualTypeOf(); - auction.bids.forEach((bid: Bid) => { - expect(bid).toBeDefined(); - expect(bid).toBeInstanceOf(Bid); - expectTypeOf(bid).toEqualTypeOf(); - expect(bid.auctionId).toBeDefined(); - expectTypeOf(bid.auctionId).toEqualTypeOf(); - expect(bid.profileId).toBeDefined(); - expectTypeOf(bid.profileId).toEqualTypeOf(); - expect(bid.amount).toBeDefined(); - expect(bid.amount).toBeGreaterThanOrEqual(0); - expectTypeOf(bid.amount).toEqualTypeOf(); - expect(bid.timestamp).toBeDefined(); - expectTypeOf(bid.timestamp).toEqualTypeOf(); - expect(bid.at).toBeDefined(); - expectTypeOf(bid.at).toEqualTypeOf(); - expect(bid.bidder).toBeDefined(); - expectTypeOf(bid.bidder).toEqualTypeOf(); - expect(bid.toString()).toBeDefined(); - expect(bid.toString()).toBe(`${bid.bidder} bid ${bid.amount} coins`); - expectTypeOf(bid.toString()).toEqualTypeOf(); - }); - expect(auction.claimed).toBeDefined(); - expectTypeOf(auction.claimed).toEqualTypeOf(); - expect(auction.claimedBidders).toBeDefined(); - expectTypeOf(auction.claimedBidders).toEqualTypeOf(); - expect(auction.toString()).toBeDefined(); - expect(auction.toString()).toEqual(auction.item); - expectTypeOf(auction.toString()).toEqualTypeOf(); - }); - client.destroy(); -}); - -test('getSkyblockAuction (Include Item Bytes)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - const auctions = await client.getSkyblockAuctions(1); - if (undefined === auctions.auctions[0]) return; - if (!auctions.auctions[0].auctioneerProfile) throw new Error("Something wen't wrong while fetching auctions"); - let data = await client.getSkyblockAuction('profile', auctions.auctions[0].auctioneerProfile, { - includeItemBytes: true - }); - expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf(); - data = data as Auction[]; - expect(data.length).toBeGreaterThanOrEqual(0); - expectTypeOf(data.length).toEqualTypeOf(); - data.forEach((auction: Auction) => { - expect(auction).toBeDefined(); - expect(auction).toBeInstanceOf(Auction); - expectTypeOf(auction).toEqualTypeOf(); - expect(auction.auctionId).toBeDefined(); - expectTypeOf(auction.auctionId).toEqualTypeOf(); - expect(auction.auctioneerUuid).toBeDefined(); - expectTypeOf(auction.auctioneerUuid).toEqualTypeOf(); - expect(auction.auctioneerProfile).toBeDefined(); - expectTypeOf(auction.auctioneerProfile).toEqualTypeOf(); - expect(auction.bin).toBeDefined(); - expectTypeOf(auction.bin).toEqualTypeOf(); - expect(auction.itemBytes).toBeDefined(); - expectTypeOf(auction.itemBytes).toEqualTypeOf(); - expect(auction.itemBytes).toBeDefined(); - if (auction.itemBytes) { - expect(auction.itemBytes).instanceOf(ItemBytes); - expect(auction.itemBytes.bytesBuffer).toBeDefined(); - expectTypeOf(auction.itemBytes.bytesBuffer).toEqualTypeOf(); - expect(auction.itemBytes.base64).toBeDefined(); - expectTypeOf(auction.itemBytes.base64).toEqualTypeOf<() => string>(); - expect(auction.itemBytes.base64()).toBeDefined(); - expectTypeOf(auction.itemBytes.base64()).toEqualTypeOf(); - } - expect(auction.coop).toBeDefined(); - expectTypeOf(auction.coop).toEqualTypeOf(); - expect(auction.auctionStartTimestamp).toBeDefined(); - expect(auction.auctionStartTimestamp).toBeGreaterThanOrEqual(0); - expectTypeOf(auction.auctionStartTimestamp).toEqualTypeOf(); - expect(auction.auctionStart).toBeDefined(); - expectTypeOf(auction.auctionStart).toEqualTypeOf(); - expect(auction.auctionEndTimestamp).toBeDefined(); - expectTypeOf(auction.auctionEndTimestamp).toEqualTypeOf(); - expect(auction.auctionEnd).toBeDefined(); - expectTypeOf(auction.auctionEnd).toEqualTypeOf(); - expect(auction.item).toBeDefined(); - expectTypeOf(auction.item).toEqualTypeOf(); - expect(auction.itemLore).toBeDefined(); - expectTypeOf(auction.itemLore).toEqualTypeOf(); - expect(auction.itemLoreRaw).toBeDefined(); - expectTypeOf(auction.itemLoreRaw).toEqualTypeOf(); - expect(auction.rarity).toBeDefined(); - expectTypeOf(auction.rarity).toEqualTypeOf(); - expect(auction.startingBid).toBeDefined(); - expectTypeOf(auction.startingBid).toEqualTypeOf(); - expect(auction.highestBid).toBeDefined(); - expectTypeOf(auction.highestBid).toEqualTypeOf(); - expect(auction.bids).toBeDefined(); - expectTypeOf(auction.bids).toEqualTypeOf(); - auction.bids.forEach((bid: Bid) => { - expect(bid).toBeDefined(); - expect(bid).toBeInstanceOf(Bid); - expectTypeOf(bid).toEqualTypeOf(); - expect(bid.auctionId).toBeDefined(); - expectTypeOf(bid.auctionId).toEqualTypeOf(); - expect(bid.profileId).toBeDefined(); - expectTypeOf(bid.profileId).toEqualTypeOf(); - expect(bid.amount).toBeDefined(); - expect(bid.amount).toBeGreaterThanOrEqual(0); - expectTypeOf(bid.amount).toEqualTypeOf(); - expect(bid.timestamp).toBeDefined(); - expectTypeOf(bid.timestamp).toEqualTypeOf(); - expect(bid.at).toBeDefined(); - expectTypeOf(bid.at).toEqualTypeOf(); - expect(bid.bidder).toBeDefined(); - expectTypeOf(bid.bidder).toEqualTypeOf(); - expect(bid.toString()).toBeDefined(); - expect(bid.toString()).toBe(`${bid.bidder} bid ${bid.amount} coins`); - expectTypeOf(bid.toString()).toEqualTypeOf(); - }); - expect(auction.claimed).toBeDefined(); - expectTypeOf(auction.claimed).toEqualTypeOf(); - expect(auction.claimedBidders).toBeDefined(); - expectTypeOf(auction.claimedBidders).toEqualTypeOf(); - expect(auction.toString()).toBeDefined(); - expect(auction.toString()).toEqual(auction.item); - expectTypeOf(auction.toString()).toEqualTypeOf(); - }); - client.destroy(); -}); diff --git a/src/API/getSkyblockAuction.ts b/src/API/getSkyblockAuction.ts deleted file mode 100644 index 39009689f..000000000 --- a/src/API/getSkyblockAuction.ts +++ /dev/null @@ -1,37 +0,0 @@ -import Auction from '../Structures/SkyBlock/Auctions/Auction.js'; -import Client from '../Client.js'; -import Endpoint from '../Private/Endpoint.js'; -import RequestData from '../Private/RequestData.js'; -import type { AuctionFetchOptions, AuctionRequestOptions } from '../Types/API.js'; - -class getSkyblockAction extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - - override async execute( - type: AuctionFetchOptions, - query: string, - options?: AuctionRequestOptions - ): Promise { - let filter; - if ('profile' === type) { - filter = 'profile'; - } else if ('player' === type && query) { - query = await this.client.requestHandler.toUUID(query); - filter = 'player'; - } else if ('auction' === type) { - filter = 'uuid'; - } else { - throw new Error(this.client.errors.BAD_AUCTION_FILTER); - } - if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); - const res = await this.client.requestHandler.request(`/skyblock/auction?${filter}=${query}`, options); - if (res.options.raw) return res; - return res.data.auctions.map((a: any) => new Auction(a, options?.includeItemBytes ?? false)); - } -} - -export default getSkyblockAction; diff --git a/src/API/getSkyblockAuctions.test.ts b/src/API/getSkyblockAuctions.test.ts deleted file mode 100644 index d865c0ce4..000000000 --- a/src/API/getSkyblockAuctions.test.ts +++ /dev/null @@ -1,358 +0,0 @@ -import Auction from '../Structures/SkyBlock/Auctions/Auction.js'; -import AuctionInfo from '../Structures/SkyBlock/Auctions/AuctionInfo.js'; -import Bid from '../Structures/SkyBlock/Auctions/Bid.js'; -import Client from '../Client.js'; -import ItemBytes from '../Structures/ItemBytes.js'; -import { expect, expectTypeOf, test } from 'vitest'; -import type { Rarity } from '../Types/Skyblock.js'; -import type { SkyblockAuctionsResult } from '../Types/API.js'; - -test('getSkyblockAuctions (No input)', () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - expect(() => client.getSkyblockAuctions()).rejects.toThrowError(client.errors.INVALID_OPTION_VALUE); - client.destroy(); -}); - -test('getSkyblockAuctions (Negative Input)', () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - expect(() => client.getSkyblockAuctions(-1)).rejects.toThrowError(client.errors.INVALID_OPTION_VALUE); - client.destroy(); -}); - -test('getSkyblockAuctions (Page 0)', () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - expect(() => client.getSkyblockAuctions(0)).rejects.toThrowError(client.errors.INVALID_OPTION_VALUE); - client.destroy(); -}); - -test('getSkyblockAuctions (String Input)', () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - expect(() => client.getSkyblockAuctions('hi')).rejects.toThrowError(client.errors.INVALID_OPTION_VALUE); - client.destroy(); -}); - -test('getSkyblockAuctions (One Page)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - const data = await client.getSkyblockAuctions(1); - expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf(); - expect(data.info).toBeDefined(); - expect(data.info).toBeInstanceOf(AuctionInfo); - expectTypeOf(data.info).toEqualTypeOf(); - expect(data.info.page).toBeDefined(); - expect(data.info.page).toBeGreaterThanOrEqual(0); - expectTypeOf(data.info.page).toEqualTypeOf(); - expect(data.info.totalPages).toBeDefined(); - expect(data.info.totalPages).toBeGreaterThanOrEqual(0); - expectTypeOf(data.info.totalPages).toEqualTypeOf(); - expect(data.info.totalAuctions).toBeDefined(); - expect(data.info.totalAuctions).toBeGreaterThanOrEqual(0); - expectTypeOf(data.info.totalAuctions).toEqualTypeOf(); - expect(data.info.lastUpdatedTimestamp).toBeDefined(); - expect(data.info.lastUpdatedTimestamp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.info.lastUpdatedTimestamp).toEqualTypeOf(); - expect(data.info.lastUpdatedAt).toBeDefined(); - expectTypeOf(data.info.lastUpdatedAt).toEqualTypeOf(); - expect(data.auctions).toBeDefined(); - expectTypeOf(data.auctions).toEqualTypeOf(); - expect(data.auctions.length).toBeGreaterThanOrEqual(0); - expectTypeOf(data.auctions.length).toEqualTypeOf(); - data.auctions.forEach((auction: Auction) => { - expect(auction).toBeDefined(); - expect(auction).toBeInstanceOf(Auction); - expectTypeOf(auction).toEqualTypeOf(); - expect(auction.auctionId).toBeDefined(); - expectTypeOf(auction.auctionId).toEqualTypeOf(); - expect(auction.auctioneerUuid).toBeDefined(); - expectTypeOf(auction.auctioneerUuid).toEqualTypeOf(); - expect(auction.auctioneerProfile).toBeDefined(); - expectTypeOf(auction.auctioneerProfile).toEqualTypeOf(); - expect(auction.bin).toBeDefined(); - expectTypeOf(auction.bin).toEqualTypeOf(); - expect(auction.itemBytes).toBeDefined(); - expectTypeOf(auction.itemBytes).toEqualTypeOf(); - if (auction.itemBytes) { - expect(auction.itemBytes).toBeDefined(); - expectTypeOf(auction.itemBytes).toEqualTypeOf(); - expect(auction.itemBytes.bytesBuffer).toBeDefined(); - expectTypeOf(auction.itemBytes.bytesBuffer).toEqualTypeOf(); - expect(auction.itemBytes.base64).toBeDefined(); - expectTypeOf(auction.itemBytes.base64).toEqualTypeOf<() => string>(); - expect(auction.itemBytes.base64()).toBeDefined(); - expectTypeOf(auction.itemBytes.base64()).toEqualTypeOf(); - } - expect(auction.coop).toBeDefined(); - expectTypeOf(auction.coop).toEqualTypeOf(); - expect(auction.auctionStartTimestamp).toBeDefined(); - expect(auction.auctionStartTimestamp).toBeGreaterThanOrEqual(0); - expectTypeOf(auction.auctionStartTimestamp).toEqualTypeOf(); - expect(auction.auctionStart).toBeDefined(); - expectTypeOf(auction.auctionStart).toEqualTypeOf(); - expect(auction.auctionEndTimestamp).toBeDefined(); - expectTypeOf(auction.auctionEndTimestamp).toEqualTypeOf(); - expect(auction.auctionEnd).toBeDefined(); - expectTypeOf(auction.auctionEnd).toEqualTypeOf(); - expect(auction.item).toBeDefined(); - expectTypeOf(auction.item).toEqualTypeOf(); - expect(auction.itemLore).toBeDefined(); - expectTypeOf(auction.itemLore).toEqualTypeOf(); - expect(auction.itemLoreRaw).toBeDefined(); - expectTypeOf(auction.itemLoreRaw).toEqualTypeOf(); - expect(auction.rarity).toBeDefined(); - expectTypeOf(auction.rarity).toEqualTypeOf(); - expect(auction.startingBid).toBeDefined(); - expectTypeOf(auction.startingBid).toEqualTypeOf(); - expect(auction.highestBid).toBeDefined(); - expectTypeOf(auction.highestBid).toEqualTypeOf(); - expect(auction.bids).toBeDefined(); - expectTypeOf(auction.bids).toEqualTypeOf(); - auction.bids.forEach((bid: Bid) => { - expect(bid).toBeDefined(); - expect(bid).toBeInstanceOf(Bid); - expectTypeOf(bid).toEqualTypeOf(); - expect(bid.auctionId).toBeDefined(); - expectTypeOf(bid.auctionId).toEqualTypeOf(); - expect(bid.profileId).toBeDefined(); - expectTypeOf(bid.profileId).toEqualTypeOf(); - expect(bid.amount).toBeDefined(); - expect(bid.amount).toBeGreaterThanOrEqual(0); - expectTypeOf(bid.amount).toEqualTypeOf(); - expect(bid.timestamp).toBeDefined(); - expectTypeOf(bid.timestamp).toEqualTypeOf(); - expect(bid.at).toBeDefined(); - expectTypeOf(bid.at).toEqualTypeOf(); - expect(bid.bidder).toBeDefined(); - expectTypeOf(bid.bidder).toEqualTypeOf(); - expect(bid.toString()).toBeDefined(); - expect(bid.toString()).toBe(`${bid.bidder} bid ${bid.amount} coins`); - expectTypeOf(bid.toString()).toEqualTypeOf(); - }); - expect(auction.claimed).toBeDefined(); - expectTypeOf(auction.claimed).toEqualTypeOf(); - expect(auction.claimedBidders).toBeDefined(); - expectTypeOf(auction.claimedBidders).toEqualTypeOf(); - expect(auction.toString()).toBeDefined(); - expect(auction.toString()).toEqual(auction.item); - expectTypeOf(auction.toString()).toEqualTypeOf(); - }); - client.destroy(); -}); - -test('getSkyblockAuctions (One Page Include Item Bytes)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - const data = await client.getSkyblockAuctions(1, { includeItemBytes: true }); - expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf<{ info: AuctionInfo; auctions: Auction[] }>(); - expect(data.info).toBeDefined(); - expect(data.info).toBeInstanceOf(AuctionInfo); - expectTypeOf(data.info).toEqualTypeOf(); - expect(data.info.page).toBeDefined(); - expect(data.info.page).toBeGreaterThanOrEqual(0); - expectTypeOf(data.info.page).toEqualTypeOf(); - expect(data.info.totalPages).toBeDefined(); - expect(data.info.totalPages).toBeGreaterThanOrEqual(0); - expectTypeOf(data.info.totalPages).toEqualTypeOf(); - expect(data.info.totalAuctions).toBeDefined(); - expect(data.info.totalAuctions).toBeGreaterThanOrEqual(0); - expectTypeOf(data.info.totalAuctions).toEqualTypeOf(); - expect(data.info.lastUpdatedTimestamp).toBeDefined(); - expect(data.info.lastUpdatedTimestamp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.info.lastUpdatedTimestamp).toEqualTypeOf(); - expect(data.info.lastUpdatedAt).toBeDefined(); - expectTypeOf(data.info.lastUpdatedAt).toEqualTypeOf(); - expect(data.auctions).toBeDefined(); - expectTypeOf(data.auctions).toEqualTypeOf(); - expect(data.auctions.length).toBeGreaterThanOrEqual(0); - expectTypeOf(data.auctions.length).toEqualTypeOf(); - data.auctions.forEach((auction: Auction) => { - expect(auction).toBeDefined(); - expect(auction).toBeInstanceOf(Auction); - expectTypeOf(auction).toEqualTypeOf(); - expect(auction.auctionId).toBeDefined(); - expectTypeOf(auction.auctionId).toEqualTypeOf(); - expect(auction.auctioneerUuid).toBeDefined(); - expectTypeOf(auction.auctioneerUuid).toEqualTypeOf(); - expect(auction.auctioneerProfile).toBeDefined(); - expectTypeOf(auction.auctioneerProfile).toEqualTypeOf(); - expect(auction.bin).toBeDefined(); - expectTypeOf(auction.bin).toEqualTypeOf(); - expect(auction.itemBytes).toBeDefined(); - expectTypeOf(auction.itemBytes).toEqualTypeOf(); - if (auction.itemBytes) { - expect(auction.itemBytes).toBeDefined(); - expectTypeOf(auction.itemBytes).toEqualTypeOf(); - expect(auction.itemBytes.bytesBuffer).toBeDefined(); - expectTypeOf(auction.itemBytes.bytesBuffer).toEqualTypeOf(); - expect(auction.itemBytes.base64).toBeDefined(); - expectTypeOf(auction.itemBytes.base64).toEqualTypeOf<() => string>(); - expect(auction.itemBytes.base64()).toBeDefined(); - expectTypeOf(auction.itemBytes.base64()).toEqualTypeOf(); - } - expect(auction.coop).toBeDefined(); - expectTypeOf(auction.coop).toEqualTypeOf(); - expect(auction.auctionStartTimestamp).toBeDefined(); - expect(auction.auctionStartTimestamp).toBeGreaterThanOrEqual(0); - expectTypeOf(auction.auctionStartTimestamp).toEqualTypeOf(); - expect(auction.auctionStart).toBeDefined(); - expectTypeOf(auction.auctionStart).toEqualTypeOf(); - expect(auction.auctionEndTimestamp).toBeDefined(); - expectTypeOf(auction.auctionEndTimestamp).toEqualTypeOf(); - expect(auction.auctionEnd).toBeDefined(); - expectTypeOf(auction.auctionEnd).toEqualTypeOf(); - expect(auction.item).toBeDefined(); - expectTypeOf(auction.item).toEqualTypeOf(); - expect(auction.itemLore).toBeDefined(); - expectTypeOf(auction.itemLore).toEqualTypeOf(); - expect(auction.itemLoreRaw).toBeDefined(); - expectTypeOf(auction.itemLoreRaw).toEqualTypeOf(); - expect(auction.rarity).toBeDefined(); - expectTypeOf(auction.rarity).toEqualTypeOf(); - expect(auction.startingBid).toBeDefined(); - expectTypeOf(auction.startingBid).toEqualTypeOf(); - expect(auction.highestBid).toBeDefined(); - expectTypeOf(auction.highestBid).toEqualTypeOf(); - expect(auction.bids).toBeDefined(); - expectTypeOf(auction.bids).toEqualTypeOf(); - auction.bids.forEach((bid: Bid) => { - expect(bid).toBeDefined(); - expect(bid).toBeInstanceOf(Bid); - expectTypeOf(bid).toEqualTypeOf(); - expect(bid.auctionId).toBeDefined(); - expectTypeOf(bid.auctionId).toEqualTypeOf(); - expect(bid.profileId).toBeDefined(); - expectTypeOf(bid.profileId).toEqualTypeOf(); - expect(bid.amount).toBeDefined(); - expect(bid.amount).toBeGreaterThanOrEqual(0); - expectTypeOf(bid.amount).toEqualTypeOf(); - expect(bid.timestamp).toBeDefined(); - expectTypeOf(bid.timestamp).toEqualTypeOf(); - expect(bid.at).toBeDefined(); - expectTypeOf(bid.at).toEqualTypeOf(); - expect(bid.bidder).toBeDefined(); - expectTypeOf(bid.bidder).toEqualTypeOf(); - expect(bid.toString()).toBeDefined(); - expect(bid.toString()).toBe(`${bid.bidder} bid ${bid.amount} coins`); - expectTypeOf(bid.toString()).toEqualTypeOf(); - }); - expect(auction.claimed).toBeDefined(); - expectTypeOf(auction.claimed).toEqualTypeOf(); - expect(auction.claimedBidders).toBeDefined(); - expectTypeOf(auction.claimedBidders).toEqualTypeOf(); - expect(auction.toString()).toBeDefined(); - expect(auction.toString()).toEqual(auction.item); - expectTypeOf(auction.toString()).toEqualTypeOf(); - }); - client.destroy(); -}); - -test('getSkyblockAuctions (All Pages)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false }); - - const data = await client.getSkyblockAuctions('*'); - expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf<{ info: AuctionInfo; auctions: Auction[] }>(); - expect(data.info).toBeDefined(); - expect(data.info).toBeInstanceOf(AuctionInfo); - expectTypeOf(data.info).toEqualTypeOf(); - expect(data.info.page).toBeDefined(); - expect(data.info.page).toBeGreaterThanOrEqual(0); - expectTypeOf(data.info.page).toEqualTypeOf(); - expect(data.info.totalPages).toBeDefined(); - expect(data.info.totalPages).toBeGreaterThanOrEqual(0); - expectTypeOf(data.info.totalPages).toEqualTypeOf(); - expect(data.info.totalAuctions).toBeDefined(); - expect(data.info.totalAuctions).toBeGreaterThanOrEqual(0); - expectTypeOf(data.info.totalAuctions).toEqualTypeOf(); - expect(data.info.lastUpdatedTimestamp).toBeDefined(); - expect(data.info.lastUpdatedTimestamp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.info.lastUpdatedTimestamp).toEqualTypeOf(); - expect(data.info.lastUpdatedAt).toBeDefined(); - expectTypeOf(data.info.lastUpdatedAt).toEqualTypeOf(); - expect(data.auctions).toBeDefined(); - expectTypeOf(data.auctions).toEqualTypeOf(); - expect(data.auctions.length).toBeGreaterThanOrEqual(0); - expectTypeOf(data.auctions.length).toEqualTypeOf(); - data.auctions.forEach((auction: Auction) => { - expect(auction).toBeDefined(); - expect(auction).toBeInstanceOf(Auction); - expectTypeOf(auction).toEqualTypeOf(); - expect(auction.auctionId).toBeDefined(); - expectTypeOf(auction.auctionId).toEqualTypeOf(); - expect(auction.auctioneerUuid).toBeDefined(); - expectTypeOf(auction.auctioneerUuid).toEqualTypeOf(); - expect(auction.auctioneerProfile).toBeDefined(); - expectTypeOf(auction.auctioneerProfile).toEqualTypeOf(); - expect(auction.bin).toBeDefined(); - expectTypeOf(auction.bin).toEqualTypeOf(); - expect(auction.itemBytes).toBeDefined(); - expectTypeOf(auction.itemBytes).toEqualTypeOf(); - if (auction.itemBytes) { - expect(auction.itemBytes).toBeDefined(); - expectTypeOf(auction.itemBytes).toEqualTypeOf(); - expect(auction.itemBytes.bytesBuffer).toBeDefined(); - expectTypeOf(auction.itemBytes.bytesBuffer).toEqualTypeOf(); - expect(auction.itemBytes.base64).toBeDefined(); - expectTypeOf(auction.itemBytes.base64).toEqualTypeOf<() => string>(); - expect(auction.itemBytes.base64()).toBeDefined(); - expectTypeOf(auction.itemBytes.base64()).toEqualTypeOf(); - } - expect(auction.coop).toBeDefined(); - expectTypeOf(auction.coop).toEqualTypeOf(); - expect(auction.auctionStartTimestamp).toBeDefined(); - expect(auction.auctionStartTimestamp).toBeGreaterThanOrEqual(0); - expectTypeOf(auction.auctionStartTimestamp).toEqualTypeOf(); - expect(auction.auctionStart).toBeDefined(); - expectTypeOf(auction.auctionStart).toEqualTypeOf(); - expect(auction.auctionEndTimestamp).toBeDefined(); - expectTypeOf(auction.auctionEndTimestamp).toEqualTypeOf(); - expect(auction.auctionEnd).toBeDefined(); - expectTypeOf(auction.auctionEnd).toEqualTypeOf(); - expect(auction.item).toBeDefined(); - expectTypeOf(auction.item).toEqualTypeOf(); - expect(auction.itemLore).toBeDefined(); - expectTypeOf(auction.itemLore).toEqualTypeOf(); - expect(auction.itemLoreRaw).toBeDefined(); - expectTypeOf(auction.itemLoreRaw).toEqualTypeOf(); - expect(auction.rarity).toBeDefined(); - expectTypeOf(auction.rarity).toEqualTypeOf(); - expect(auction.startingBid).toBeDefined(); - expectTypeOf(auction.startingBid).toEqualTypeOf(); - expect(auction.highestBid).toBeDefined(); - expectTypeOf(auction.highestBid).toEqualTypeOf(); - expect(auction.bids).toBeDefined(); - expectTypeOf(auction.bids).toEqualTypeOf(); - auction.bids.forEach((bid: Bid) => { - expect(bid).toBeDefined(); - expect(bid).toBeInstanceOf(Bid); - expectTypeOf(bid).toEqualTypeOf(); - expect(bid.auctionId).toBeDefined(); - expectTypeOf(bid.auctionId).toEqualTypeOf(); - expect(bid.profileId).toBeDefined(); - expectTypeOf(bid.profileId).toEqualTypeOf(); - expect(bid.amount).toBeDefined(); - expect(bid.amount).toBeGreaterThanOrEqual(0); - expectTypeOf(bid.amount).toEqualTypeOf(); - expect(bid.timestamp).toBeDefined(); - expectTypeOf(bid.timestamp).toEqualTypeOf(); - expect(bid.at).toBeDefined(); - expectTypeOf(bid.at).toEqualTypeOf(); - expect(bid.bidder).toBeDefined(); - expectTypeOf(bid.bidder).toEqualTypeOf(); - expect(bid.toString()).toBeDefined(); - expect(bid.toString()).toBe(`${bid.bidder} bid ${bid.amount} coins`); - expectTypeOf(bid.toString()).toEqualTypeOf(); - }); - expect(auction.claimed).toBeDefined(); - expectTypeOf(auction.claimed).toEqualTypeOf(); - expect(auction.claimedBidders).toBeDefined(); - expectTypeOf(auction.claimedBidders).toEqualTypeOf(); - expect(auction.toString()).toBeDefined(); - expect(auction.toString()).toEqual(auction.item); - expectTypeOf(auction.toString()).toEqualTypeOf(); - }); - client.destroy(); -}); diff --git a/src/API/getSkyblockAuctions.ts b/src/API/getSkyblockAuctions.ts deleted file mode 100644 index bc0094015..000000000 --- a/src/API/getSkyblockAuctions.ts +++ /dev/null @@ -1,55 +0,0 @@ -import Auction from '../Structures/SkyBlock/Auctions/Auction.js'; -import AuctionInfo from '../Structures/SkyBlock/Auctions/AuctionInfo.js'; -import Client from '../Client.js'; -import Endpoint from '../Private/Endpoint.js'; -import type { AuctionRequestOptions, SkyblockAuctionsResult } from '../Types/API.js'; - -class getSkyblockAuctions extends Endpoint { - override readonly client: Client; - declare options: AuctionRequestOptions; - constructor(client: Client) { - super(client); - this.client = client; - } - - override async execute(query: number | '*', options?: AuctionRequestOptions): Promise { - if (!query) throw new Error(this.client.errors.INVALID_OPTION_VALUE); - if ('number' === typeof query && 0 >= query) throw new Error(this.client.errors.INVALID_OPTION_VALUE); - if ('number' !== typeof query && '*' !== query) throw new Error(this.client.errors.INVALID_OPTION_VALUE); - this.options = this.parseOptions(options); - if ('*' === query) return await this.getAllPages(); - return await this.getPage(query); - } - - async getAllPages(): Promise { - const page = 0; - const { info, auctions } = await this.getPage(page); - const pages = info.totalPages; - const requests = []; - for (let i = 1; i < pages; i++) { - requests.push(this.getPage(i)); - } - const results = await Promise.all(requests); - results.forEach(({ auctions: newAuctions }) => { - auctions.push(...newAuctions); - }); - return { info, auctions }; - } - - async getPage(page: number): Promise { - const res = await this.client.requestHandler.request(`/skyblock/auctions?page=${page}`, this.options); - return { - info: new AuctionInfo(res.data), - auctions: res.data.auctions.map((a: any) => new Auction(a)) - }; - } - - private parseOptions(options: any): AuctionRequestOptions { - return { - includeItemBytes: options?.includeItemBytes ?? false, - noCache: options?.noCache ?? false - }; - } -} - -export default getSkyblockAuctions; diff --git a/src/API/getSkyblockAuctionsByPlayer.test.ts b/src/API/getSkyblockAuctionsByPlayer.test.ts deleted file mode 100644 index a7a396fbc..000000000 --- a/src/API/getSkyblockAuctionsByPlayer.test.ts +++ /dev/null @@ -1,250 +0,0 @@ -import Auction from '../Structures/SkyBlock/Auctions/Auction.js'; -import Bid from '../Structures/SkyBlock/Auctions/Bid.js'; -import Client from '../Client.js'; -import ItemBytes from '../Structures/ItemBytes.js'; -import RequestData from '../Private/RequestData.js'; -import { expect, expectTypeOf, test } from 'vitest'; -import type { Rarity } from '../Types/Skyblock.js'; - -test('getSkyblockAuctionsByPlayer (raw)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - const auctions = await client.getSkyblockAuctions(1); - if (undefined === auctions.auctions[0]) return; - if (!auctions.auctions[0].auctioneerUuid) throw new Error("Something wen't wrong while fetching auctions"); - const data = await client.getSkyblockAuctionsByPlayer(auctions.auctions[0].auctioneerUuid, { raw: true }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(RequestData); - expectTypeOf(data).toEqualTypeOf(); - client.destroy(); -}); - -test('getSkyblockAuctionsByPlayer (No Input)', () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - expect(() => client.getSkyblockAuctionsByPlayer()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); - client.destroy(); -}); - -test('getSkyblockAuctionsByPlayer', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - const auctions = await client.getSkyblockAuctions(1); - if (undefined === auctions.auctions[0]) return; - if (!auctions.auctions[0].auctioneerUuid) throw new Error("Something wen't wrong while fetching auctions"); - let data = await client.getSkyblockAuctionsByPlayer(auctions.auctions[0].auctioneerUuid); - expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf(); - data = data as Auction[]; - data.forEach((auction: Auction) => { - expect(auction).toBeDefined(); - expect(auction).toBeInstanceOf(Auction); - expectTypeOf(auction).toEqualTypeOf(); - - expect(auction.auctionId).toBeDefined(); - expectTypeOf(auction.auctionId).toEqualTypeOf(); - - expect(auction.auctioneerUuid).toBeDefined(); - expectTypeOf(auction.auctioneerUuid).toEqualTypeOf(); - - expect(auction.auctioneerProfile).toBeDefined(); - expectTypeOf(auction.auctioneerProfile).toEqualTypeOf(); - - expect(auction.bin).toBeDefined(); - expectTypeOf(auction.bin).toEqualTypeOf(); - - expect(auction.itemBytes).toBeDefined(); - expectTypeOf(auction.itemBytes).toEqualTypeOf(); - expect(auction.itemBytes).toBeDefined(); - expectTypeOf(auction.itemBytes).toEqualTypeOf(); - if (auction.itemBytes) { - expect(auction.itemBytes).toBeDefined(); - expectTypeOf(auction.itemBytes).toEqualTypeOf(); - expect(auction.itemBytes.bytesBuffer).toBeDefined(); - expectTypeOf(auction.itemBytes.bytesBuffer).toEqualTypeOf(); - expect(auction.itemBytes.base64).toBeDefined(); - expectTypeOf(auction.itemBytes.base64).toEqualTypeOf<() => string>(); - expect(auction.itemBytes.base64()).toBeDefined(); - expectTypeOf(auction.itemBytes.base64()).toEqualTypeOf(); - } - expect(auction.coop).toBeDefined(); - expectTypeOf(auction.coop).toEqualTypeOf(); - - expect(auction.auctionStartTimestamp).toBeDefined(); - expect(auction.auctionStartTimestamp).toBeGreaterThanOrEqual(0); - expectTypeOf(auction.auctionStartTimestamp).toEqualTypeOf(); - - expect(auction.auctionStart).toBeDefined(); - expectTypeOf(auction.auctionStart).toEqualTypeOf(); - - expect(auction.auctionEndTimestamp).toBeDefined(); - expectTypeOf(auction.auctionEndTimestamp).toEqualTypeOf(); - - expect(auction.auctionEnd).toBeDefined(); - expectTypeOf(auction.auctionEnd).toEqualTypeOf(); - - expect(auction.item).toBeDefined(); - expectTypeOf(auction.item).toEqualTypeOf(); - - expect(auction.itemLore).toBeDefined(); - expectTypeOf(auction.itemLore).toEqualTypeOf(); - - expect(auction.itemLoreRaw).toBeDefined(); - expectTypeOf(auction.itemLoreRaw).toEqualTypeOf(); - - expect(auction.rarity).toBeDefined(); - expectTypeOf(auction.rarity).toEqualTypeOf(); - - expect(auction.startingBid).toBeDefined(); - expectTypeOf(auction.startingBid).toEqualTypeOf(); - - expect(auction.highestBid).toBeDefined(); - expectTypeOf(auction.highestBid).toEqualTypeOf(); - - expect(auction.bids).toBeDefined(); - expectTypeOf(auction.bids).toEqualTypeOf(); - auction.bids.forEach((bid: Bid) => { - expect(bid).toBeDefined(); - expect(bid).toBeInstanceOf(Bid); - expectTypeOf(bid).toEqualTypeOf(); - expect(bid.auctionId).toBeDefined(); - expectTypeOf(bid.auctionId).toEqualTypeOf(); - expect(bid.profileId).toBeDefined(); - expectTypeOf(bid.profileId).toEqualTypeOf(); - expect(bid.amount).toBeDefined(); - expect(bid.amount).toBeGreaterThanOrEqual(0); - expectTypeOf(bid.amount).toEqualTypeOf(); - expect(bid.timestamp).toBeDefined(); - expectTypeOf(bid.timestamp).toEqualTypeOf(); - expect(bid.at).toBeDefined(); - expectTypeOf(bid.at).toEqualTypeOf(); - expect(bid.bidder).toBeDefined(); - expectTypeOf(bid.bidder).toEqualTypeOf(); - expect(bid.toString()).toBeDefined(); - expect(bid.toString()).toBe(`${bid.bidder} bid ${bid.amount} coins`); - expectTypeOf(bid.toString()).toEqualTypeOf(); - }); - - expect(auction.claimed).toBeDefined(); - expectTypeOf(auction.claimed).toEqualTypeOf(); - - expect(auction.claimedBidders).toBeDefined(); - expectTypeOf(auction.claimedBidders).toEqualTypeOf(); - - expect(auction.toString()).toBeDefined(); - expect(auction.toString()).toEqual(auction.item); - expectTypeOf(auction.toString()).toEqualTypeOf(); - }); - - client.destroy(); -}); - -test('getSkyblockAuctionsByPlayer (Item Bytes)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - const auctions = await client.getSkyblockAuctions(1); - if (undefined === auctions.auctions[0]) return; - if (!auctions.auctions[0].auctioneerUuid) throw new Error("Something wen't wrong while fetching auctions"); - let data = await client.getSkyblockAuctionsByPlayer(auctions.auctions[0].auctioneerUuid, { includeItemBytes: true }); - expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf(); - data = data as Auction[]; - data.forEach((auction: Auction) => { - expect(auction).toBeDefined(); - expect(auction).toBeInstanceOf(Auction); - expectTypeOf(auction).toEqualTypeOf(); - - expect(auction.auctionId).toBeDefined(); - expectTypeOf(auction.auctionId).toEqualTypeOf(); - - expect(auction.auctioneerUuid).toBeDefined(); - expectTypeOf(auction.auctioneerUuid).toEqualTypeOf(); - - expect(auction.auctioneerProfile).toBeDefined(); - expectTypeOf(auction.auctioneerProfile).toEqualTypeOf(); - - expect(auction.bin).toBeDefined(); - expectTypeOf(auction.bin).toEqualTypeOf(); - - expect(auction.itemBytes).toBeDefined(); - expectTypeOf(auction.itemBytes).toEqualTypeOf(); - if (auction.itemBytes) { - expect(auction.itemBytes).toBeDefined(); - expectTypeOf(auction.itemBytes).toEqualTypeOf(); - expect(auction.itemBytes.bytesBuffer).toBeDefined(); - expectTypeOf(auction.itemBytes.bytesBuffer).toEqualTypeOf(); - expect(auction.itemBytes.base64).toBeDefined(); - expectTypeOf(auction.itemBytes.base64).toEqualTypeOf<() => string>(); - expect(auction.itemBytes.base64()).toBeDefined(); - expectTypeOf(auction.itemBytes.base64()).toEqualTypeOf(); - } - - expect(auction.coop).toBeDefined(); - expectTypeOf(auction.coop).toEqualTypeOf(); - - expect(auction.auctionStartTimestamp).toBeDefined(); - expect(auction.auctionStartTimestamp).toBeGreaterThanOrEqual(0); - expectTypeOf(auction.auctionStartTimestamp).toEqualTypeOf(); - - expect(auction.auctionStart).toBeDefined(); - expectTypeOf(auction.auctionStart).toEqualTypeOf(); - - expect(auction.auctionEndTimestamp).toBeDefined(); - expectTypeOf(auction.auctionEndTimestamp).toEqualTypeOf(); - - expect(auction.auctionEnd).toBeDefined(); - expectTypeOf(auction.auctionEnd).toEqualTypeOf(); - - expect(auction.item).toBeDefined(); - expectTypeOf(auction.item).toEqualTypeOf(); - - expect(auction.itemLore).toBeDefined(); - expectTypeOf(auction.itemLore).toEqualTypeOf(); - - expect(auction.itemLoreRaw).toBeDefined(); - expectTypeOf(auction.itemLoreRaw).toEqualTypeOf(); - - expect(auction.rarity).toBeDefined(); - expectTypeOf(auction.rarity).toEqualTypeOf(); - - expect(auction.startingBid).toBeDefined(); - expectTypeOf(auction.startingBid).toEqualTypeOf(); - - expect(auction.highestBid).toBeDefined(); - expectTypeOf(auction.highestBid).toEqualTypeOf(); - - expect(auction.bids).toBeDefined(); - expectTypeOf(auction.bids).toEqualTypeOf(); - auction.bids.forEach((bid: Bid) => { - expect(bid).toBeDefined(); - expect(bid).toBeInstanceOf(Bid); - expectTypeOf(bid).toEqualTypeOf(); - expect(bid.auctionId).toBeDefined(); - expectTypeOf(bid.auctionId).toEqualTypeOf(); - expect(bid.profileId).toBeDefined(); - expectTypeOf(bid.profileId).toEqualTypeOf(); - expect(bid.amount).toBeDefined(); - expect(bid.amount).toBeGreaterThanOrEqual(0); - expectTypeOf(bid.amount).toEqualTypeOf(); - expect(bid.timestamp).toBeDefined(); - expectTypeOf(bid.timestamp).toEqualTypeOf(); - expect(bid.at).toBeDefined(); - expectTypeOf(bid.at).toEqualTypeOf(); - expect(bid.bidder).toBeDefined(); - expectTypeOf(bid.bidder).toEqualTypeOf(); - expect(bid.toString()).toBeDefined(); - expect(bid.toString()).toBe(`${bid.bidder} bid ${bid.amount} coins`); - expectTypeOf(bid.toString()).toEqualTypeOf(); - }); - - expect(auction.claimed).toBeDefined(); - expectTypeOf(auction.claimed).toEqualTypeOf(); - - expect(auction.claimedBidders).toBeDefined(); - expectTypeOf(auction.claimedBidders).toEqualTypeOf(); - - expect(auction.toString()).toBeDefined(); - expect(auction.toString()).toEqual(auction.item); - expectTypeOf(auction.toString()).toEqualTypeOf(); - }); - - client.destroy(); -}); diff --git a/src/API/getSkyblockAuctionsByPlayer.ts b/src/API/getSkyblockAuctionsByPlayer.ts deleted file mode 100644 index b6816d1f0..000000000 --- a/src/API/getSkyblockAuctionsByPlayer.ts +++ /dev/null @@ -1,23 +0,0 @@ -import Auction from '../Structures/SkyBlock/Auctions/Auction.js'; -import Client from '../Client.js'; -import Endpoint from '../Private/Endpoint.js'; -import RequestData from '../Private/RequestData.js'; -import type { AuctionRequestOptions } from '../Types/API.js'; - -class getSkyblockActionsByPlayer extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - - override async execute(query: string, options?: AuctionRequestOptions): Promise { - if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); - query = await this.client.requestHandler.toUUID(query); - const res = await this.client.requestHandler.request(`/skyblock/auction?player=${query}`, options); - if (res.options.raw) return res; - return res.data.auctions.map((a: any) => new Auction(a, options?.includeItemBytes ?? false)); - } -} - -export default getSkyblockActionsByPlayer; diff --git a/src/API/getSkyblockBazaar.test.ts b/src/API/getSkyblockBazaar.test.ts deleted file mode 100644 index 554843a50..000000000 --- a/src/API/getSkyblockBazaar.test.ts +++ /dev/null @@ -1,51 +0,0 @@ -import Client from '../Client.js'; -import Order from '../Structures/SkyBlock/Bazaar/Order.js'; -import Product from '../Structures/SkyBlock/Bazaar/Product.js'; -import RequestData from '../Private/RequestData.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('getSkyblockBazarr (raw)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - const data = await client.getSkyblockBazaar({ raw: true }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(RequestData); - expectTypeOf(data).toEqualTypeOf(); - client.destroy(); -}); -test('getSkyblockBazarr', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getSkyblockBazaar(); - expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf(); - data = data as Product[]; - data.forEach((product: Product) => { - expect(product).toBeDefined(); - expect(product).toBeInstanceOf(Product); - expectTypeOf(product).toEqualTypeOf(); - expect(product.productId).toBeDefined(); - expectTypeOf(product.productId).toEqualTypeOf(); - expect(product.sellSummary).toBeDefined(); - expectTypeOf(product.sellSummary).toEqualTypeOf(); - product.sellSummary.forEach((sell: Order) => { - expect(sell).toBeDefined(); - expect(sell).toBeInstanceOf(Order); - expectTypeOf(sell).toEqualTypeOf(); - expect(sell.amount).toBeDefined(); - expectTypeOf(sell.amount).toEqualTypeOf(); - expect(sell.amount).toBeGreaterThanOrEqual(0); - expect(sell.pricePerUnit).toBeDefined(); - expectTypeOf(sell.pricePerUnit).toEqualTypeOf(); - expect(sell.pricePerUnit).toBeGreaterThanOrEqual(0); - expect(sell.totalPrice).toBeDefined(); - expectTypeOf(sell.totalPrice).toEqualTypeOf(); - expect(sell.totalPrice).toBeGreaterThanOrEqual(0); - expect(sell.orders).toBeDefined(); - expectTypeOf(sell.orders).toEqualTypeOf(); - expect(sell.orders).toBeGreaterThanOrEqual(0); - expect(sell.toString()).toBeDefined(); - expect(sell.toString()).toEqual(sell.totalPrice); - expectTypeOf(sell.toString()).toEqualTypeOf(); - }); - }); - client.destroy(); -}); diff --git a/src/API/getSkyblockBingo.test.ts b/src/API/getSkyblockBingo.test.ts deleted file mode 100644 index 31ed08de3..000000000 --- a/src/API/getSkyblockBingo.test.ts +++ /dev/null @@ -1,43 +0,0 @@ -import Bingo from '../Structures/SkyBlock/Static/Bingo.js'; -import BingoData from '../Structures/SkyBlock/Static/BingoData.js'; -import Client from '../Client.js'; -import RequestData from '../Private/RequestData.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('getSkyblockBingo (raw)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - const data = await client.getSkyblockBingo({ raw: true }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(RequestData); - expectTypeOf(data).toEqualTypeOf(); - client.destroy(); -}); - -test('getSkyblockBingo', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getSkyblockBingo(); - expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf(); - data = data as BingoData; - expect(data.lastUpdatedTimestamp).toBeDefined(); - expectTypeOf(data.lastUpdatedTimestamp).toEqualTypeOf(); - expect(data.lastUpdatedAt).toBeDefined(); - expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); - expect(data.id).toBeDefined(); - expectTypeOf(data.id).toEqualTypeOf(); - expect(data.goals).toBeDefined(); - expectTypeOf(data.goals).toEqualTypeOf(); - if (data.goals) { - data.goals.forEach((goal: Bingo) => { - expect(goal).toBeDefined(); - expectTypeOf(goal).toEqualTypeOf(); - expect(goal).toBeInstanceOf(Bingo); - expect(goal.toString()).toBeDefined(); - expect(goal.toString()).toBe(goal.id); - expectTypeOf(goal.toString()).toEqualTypeOf(); - }); - } - expect(data.getGoal(1, 1)).toBeDefined(); - expectTypeOf(data.getGoal(1, 1)).toEqualTypeOf(); - client.destroy(); -}); diff --git a/src/API/getSkyblockGarden.test.ts b/src/API/getSkyblockGarden.test.ts deleted file mode 100644 index 50647469b..000000000 --- a/src/API/getSkyblockGarden.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -import Client from '../Client.js'; -import RequestData from '../Private/RequestData.js'; -import SkyblockGarden from '../Structures/SkyBlock/SkyblockGarden.js'; -import { expect, expectTypeOf, test } from 'vitest'; -import type { - SkillLevel, - SkyblockGardenComposter, - SkyblockGardenCropMilestones, - SkyblockGardenVisitor, - SkyblockGarenCrops -} from '../Types/Skyblock.js'; - -test('getSkyblockGarden (no input)', () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - expect(() => client.getSkyblockGarden()).rejects.toThrowError(client.errors.NO_UUID); - client.destroy(); -}); - -test('getSkyblockGarden (raw)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - const data = await client.getSkyblockGarden('805c9751-0ff1-4cb6-8e9c-1067bf3bc601', { raw: true }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(RequestData); - expectTypeOf(data).toEqualTypeOf(); - client.destroy(); -}); - -test('getSkyblockGarden', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getSkyblockGarden('805c9751-0ff1-4cb6-8e9c-1067bf3bc601'); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(SkyblockGarden); - expectTypeOf(data).toEqualTypeOf(); - data = data as SkyblockGarden; - expect(data.level).toBeDefined(); - expectTypeOf(data.level).toEqualTypeOf(); - expect(data.barnSkin).toBeDefined(); - expectTypeOf(data.barnSkin).toEqualTypeOf(); - expect(data.unlockedPlots).toBeDefined(); - expectTypeOf(data.unlockedPlots).toEqualTypeOf(); - expect(data.visitors).toBeDefined(); - expectTypeOf(data.visitors).toEqualTypeOf(); - expect(data.cropMilestones).toBeDefined(); - expectTypeOf(data.cropMilestones).toEqualTypeOf(); - expect(data.composter).toBeDefined(); - expectTypeOf(data.composter).toEqualTypeOf(); - expect(data.cropUpgrades).toBeDefined(); - expectTypeOf(data.cropUpgrades).toEqualTypeOf(); - - client.destroy(); -}); diff --git a/src/API/getSkyblockGovernment.test.ts b/src/API/getSkyblockGovernment.test.ts deleted file mode 100644 index 08c815fcf..000000000 --- a/src/API/getSkyblockGovernment.test.ts +++ /dev/null @@ -1,62 +0,0 @@ -import Candidate from '../Structures/SkyBlock/Static/Candidate.js'; -import Client from '../Client.js'; -import GovernmentData from '../Structures/SkyBlock/Static/Government.js'; -import Perk from '../Structures/SkyBlock/Static/Perk.js'; -import RequestData from '../Private/RequestData.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('getSkyblockGovernment (raw)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - const data = await client.getSkyblockGovernment({ raw: true }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(RequestData); - expectTypeOf(data).toEqualTypeOf(); - client.destroy(); -}); - -test('getSkyblockGovernment', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getSkyblockGovernment(); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(GovernmentData); - expectTypeOf(data).toEqualTypeOf(); - data = data as GovernmentData; - expect(data.lastUpdatedTimestamp).toBeDefined(); - expect(data.lastUpdatedTimestamp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.lastUpdatedTimestamp).toEqualTypeOf(); - expect(data.lastUpdatedAt).toBeDefined(); - expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); - expect(data.lastElectionResults).toBeDefined(); - expectTypeOf(data.lastElectionResults).toEqualTypeOf>(); - data.lastElectionResults.forEach((candidate: Candidate) => { - expect(candidate).toBeDefined(); - expect(candidate).toBeInstanceOf(Candidate); - expectTypeOf(candidate).toEqualTypeOf(); - expect(candidate.name).toBeDefined(); - expectTypeOf(candidate.name).toEqualTypeOf(); - expect(candidate.keyBenefit).toBeDefined(); - expectTypeOf(candidate.keyBenefit).toEqualTypeOf(); - expect(candidate.perks).toBeDefined(); - expectTypeOf(candidate.perks).toEqualTypeOf(); - expect(candidate.isMayor).toBeDefined(); - expectTypeOf(candidate.isMayor).toEqualTypeOf(); - expect(candidate.votesReceived).toBeDefined(); - expectTypeOf(candidate.votesReceived).toEqualTypeOf(); - expect(candidate.toString()).toBeDefined(); - expect(candidate.toString()).toBe(candidate.name); - expectTypeOf(candidate.toString()).toEqualTypeOf(); - }); - expect(data.mayor).toBeDefined(); - expectTypeOf(data.mayor).toEqualTypeOf(); - expect(data.runningYear).toBeDefined(); - expect(data.runningYear).toBeGreaterThanOrEqual(0); - expectTypeOf(data.runningYear).toEqualTypeOf(); - expect(data.currentElectionResults).toBeDefined(); - expectTypeOf(data.currentElectionResults).toEqualTypeOf | null>(); - expect(data.currentElectionFor).toBeDefined(); - expectTypeOf(data.currentElectionFor).toEqualTypeOf(); - expect(data.toString()).toBeDefined(); - expect(data.toString()).toBe(data.mayor?.name || ''); - expectTypeOf(data.toString()).toEqualTypeOf(); - client.destroy(); -}); diff --git a/src/API/getSkyblockItems.test.ts b/src/API/getSkyblockItems.test.ts deleted file mode 100644 index d51c88fe0..000000000 --- a/src/API/getSkyblockItems.test.ts +++ /dev/null @@ -1,161 +0,0 @@ -import Client from '../Client.js'; -import RequestData from '../Private/RequestData.js'; -import SkyblockItem from '../Structures/SkyBlock/SkyblockItem.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('getSkyblockItems (raw)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - const data = await client.getSkyblockItems({ raw: true }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(RequestData); - expectTypeOf(data).toEqualTypeOf(); - client.destroy(); -}); - -test('getSkyblockItems', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getSkyblockItems(); - expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf(); - data = data as SkyblockItem[]; - data.forEach((item: SkyblockItem) => { - expect(item.durability).toBeDefined(); - expectTypeOf(item.durability).toEqualTypeOf(); - - expect(item.museumData).toBeDefined(); - expectTypeOf(item.museumData).toEqualTypeOf | undefined>(); - - expect(item.hasUuid).toBeDefined(); - expectTypeOf(item.hasUuid).toEqualTypeOf(); - - expect(item.gemstoneSlots).toBeDefined(); - expectTypeOf(item.gemstoneSlots).toEqualTypeOf[] | undefined>(); - - expect(item.glowing).toBeDefined(); - expectTypeOf(item.glowing).toEqualTypeOf(); - - expect(item.canAuction).toBeDefined(); - expectTypeOf(item.canAuction).toEqualTypeOf(); - - expect(item.canTrade).toBeDefined(); - expectTypeOf(item.canTrade).toEqualTypeOf(); - - expect(item.requirements).toBeDefined(); - expectTypeOf(item.requirements).toEqualTypeOf[] | undefined>(); - - expect(item.canPlace).toBeDefined(); - expectTypeOf(item.canPlace).toEqualTypeOf(); - - expect(item.museum).toBeDefined(); - expectTypeOf(item.museum).toEqualTypeOf(); - - expect(item.generator).toBeDefined(); - expectTypeOf(item.generator).toEqualTypeOf(); - - expect(item.generatorTier).toBeDefined(); - expectTypeOf(item.generatorTier).toEqualTypeOf(); - - expect(item.furniture).toBeDefined(); - expectTypeOf(item.furniture).toEqualTypeOf(); - - expect(item.itemSpecific).toBeDefined(); - expectTypeOf(item.itemSpecific).toEqualTypeOf | undefined>(); - - expect(item.description).toBeDefined(); - expectTypeOf(item.description).toEqualTypeOf(); - - expect(item.upgradeCosts).toBeDefined(); - expectTypeOf(item.upgradeCosts).toEqualTypeOf>> | undefined>(); - - expect(item.gearScore).toBeDefined(); - expectTypeOf(item.gearScore).toEqualTypeOf(); - - expect(item.dungeonItem).toBeDefined(); - expectTypeOf(item.dungeonItem).toEqualTypeOf(); - - expect(item.dungeonItemConversionCost).toBeDefined(); - expectTypeOf(item.dungeonItemConversionCost).toEqualTypeOf | undefined>(); - - expect(item.catacombsRequirements).toBeDefined(); - expectTypeOf(item.catacombsRequirements).toEqualTypeOf[] | undefined>(); - - expect(item.canHaveAttributes).toBeDefined(); - expectTypeOf(item.canHaveAttributes).toEqualTypeOf(); - - expect(item.salvageableFromRecipe).toBeDefined(); - expectTypeOf(item.salvageableFromRecipe).toEqualTypeOf(); - - expect(item.canRecombobulate).toBeDefined(); - expectTypeOf(item.canRecombobulate).toEqualTypeOf(); - - expect(item.enchantments).toBeDefined(); - expectTypeOf(item.enchantments).toEqualTypeOf | undefined>(); - - expect(item.riftTransferrable).toBeDefined(); - expectTypeOf(item.riftTransferrable).toEqualTypeOf(); - - expect(item.origin).toBeDefined(); - expectTypeOf(item.origin).toEqualTypeOf(); - - expect(item.doubleTapToDrop).toBeDefined(); - expectTypeOf(item.doubleTapToDrop).toEqualTypeOf(); - - expect(item.hideFromViewRecipeCommand).toBeDefined(); - expectTypeOf(item.hideFromViewRecipeCommand).toEqualTypeOf(); - - expect(item.swordType).toBeDefined(); - expectTypeOf(item.swordType).toEqualTypeOf(); - - expect(item.abilityDamageScaling).toBeDefined(); - expectTypeOf(item.abilityDamageScaling).toEqualTypeOf(); - - expect(item.tieredStats).toBeDefined(); - expectTypeOf(item.tieredStats).toEqualTypeOf | undefined>(); - - expect(item.motesSellPrice).toBeDefined(); - expectTypeOf(item.motesSellPrice).toEqualTypeOf(); - - expect(item.crystal).toBeDefined(); - expectTypeOf(item.crystal).toEqualTypeOf(); - - expect(item.canBurnInFurnace).toBeDefined(); - expectTypeOf(item.canBurnInFurnace).toEqualTypeOf(); - - expect(item.salvage).toBeDefined(); - expectTypeOf(item.salvage).toEqualTypeOf | undefined>(); - - expect(item.serializable).toBeDefined(); - expectTypeOf(item.serializable).toEqualTypeOf(); - - expect(item.canInteract).toBeDefined(); - expectTypeOf(item.canInteract).toEqualTypeOf(); - - expect(item.canInteractRightClick).toBeDefined(); - expectTypeOf(item.canInteractRightClick).toEqualTypeOf(); - - expect(item.privateIsland).toBeDefined(); - expectTypeOf(item.privateIsland).toEqualTypeOf(); - - expect(item.canHavePowerScroll).toBeDefined(); - expectTypeOf(item.canHavePowerScroll).toEqualTypeOf(); - - expect(item.canInteractEntity).toBeDefined(); - expectTypeOf(item.canInteractEntity).toEqualTypeOf(); - - expect(item.miningFortune).toBeDefined(); - expectTypeOf(item.miningFortune).toEqualTypeOf(); - - expect(item.recipes).toBeDefined(); - expectTypeOf(item.recipes).toEqualTypeOf[] | undefined>(); - - expect(item.cannotReforge).toBeDefined(); - expectTypeOf(item.cannotReforge).toEqualTypeOf(); - - expect(item.loseMotesValueOnTransfer).toBeDefined(); - expectTypeOf(item.loseMotesValueOnTransfer).toEqualTypeOf(); - - expect(item.prestige).toBeDefined(); - expectTypeOf(item.prestige).toEqualTypeOf | undefined>(); - }); - client.destroy(); -}); diff --git a/src/API/getSkyblockMember.test.ts b/src/API/getSkyblockMember.test.ts deleted file mode 100644 index 51d1589bf..000000000 --- a/src/API/getSkyblockMember.test.ts +++ /dev/null @@ -1,657 +0,0 @@ -import Client from '../Client.js'; -import RequestData from '../Private/RequestData.js'; -import SkyblockGarden from '../Structures/SkyBlock/SkyblockGarden.js'; -import SkyblockGemstone from '../Structures/SkyBlock/SkyblockGemstone.js'; -import SkyblockInventoryItem from '../Structures/SkyBlock/SkyblockInventoryItem.js'; -import SkyblockMember from '../Structures/SkyBlock/SkyblockMember.js'; -import SkyblockMemberStats from '../Structures/SkyBlock/SkyblockMemberStats.js'; -import SkyblockMuseum from '../Structures/SkyBlock/SkyblockMuseum.js'; -import SkyblockPet from '../Structures/SkyBlock/SkyblockPet.js'; -import { expect, expectTypeOf, test } from 'vitest'; -import type { - Armor, - ChocolateFactoryData, - CrimsonIsle, - Dungeons, - Equipment, - HOTM, - JacobData, - Rarity, - Skills, - Slayer -} from '../Types/Skyblock.js'; -import type { NetworthResult } from 'skyhelper-networth'; - -test('getSkyblockMember (raw)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - const data = await client.getSkyblockMember('14727faefbdc4aff848cd2713eb9939e', { raw: true }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(RequestData); - expectTypeOf(data).toEqualTypeOf | RequestData>(); - client.destroy(); -}); - -test('getSkyblockMember (no input)', () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - expect(() => client.getSkyblockMember()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); - client.destroy(); -}); - -test('getSkyblockMember (no profiles)', () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - expect(() => client.getSkyblockMember('b45add7b081443909fb00aa9a3e15eb0')).rejects.toThrowError( - client.errors.NO_SKYBLOCK_PROFILES - ); - client.destroy(); -}); - -test('getSkyblockMember (museum)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getSkyblockMember('add71246c46e455c8345c129ea6f146c', { museum: true }); - expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf | RequestData>(); - data = data as Map; - data.forEach(async (member: SkyblockMember) => { - expect(member).toBeDefined(); - expect(member).toBeInstanceOf(SkyblockMember); - expectTypeOf(member).toEqualTypeOf(); - expect(member.uuid).toBeDefined(); - expectTypeOf(member.uuid).toEqualTypeOf(); - expect(member.gameMode).toBeDefined(); - expectTypeOf(member.gameMode).toEqualTypeOf(); - expect(member.selected).toBeDefined(); - expectTypeOf(member.selected).toEqualTypeOf(); - expect(member.garden).toBeDefined(); - expect(member.garden).toBeNull(); - expectTypeOf(member.garden).toEqualTypeOf(); - expect(member.museum).toBeDefined(); - expectTypeOf(member.museum).toEqualTypeOf(); - expect(member.profileName).toBeDefined(); - expectTypeOf(member.profileName).toEqualTypeOf(); - expect(member.profileId).toBeDefined(); - expectTypeOf(member.profileId).toEqualTypeOf(); - expect(member.firstJoinTimestamp).toBeDefined(); - expectTypeOf(member.firstJoinTimestamp).toEqualTypeOf(); - expect(member.firstJoinAt).toBeDefined(); - expectTypeOf(member.firstJoinAt).toEqualTypeOf(); - expect(member.experience).toBeDefined(); - expect(member.experience).toBeGreaterThanOrEqual(0); - expectTypeOf(member.experience).toEqualTypeOf(); - expect(member.level).toBeDefined(); - expectTypeOf(member.level).toEqualTypeOf(); - expect(member.hotm).toBeDefined(); - expectTypeOf(member.hotm).toEqualTypeOf(); - expect(member.highestMagicalPower).toBeDefined(); - expectTypeOf(member.highestMagicalPower).toEqualTypeOf(); - expect(member.fairySouls).toBeDefined(); - expectTypeOf(member.fairySouls).toEqualTypeOf(); - expect(member.fairyExchanges).toBeDefined(); - expectTypeOf(member.fairyExchanges).toEqualTypeOf(); - expect(member.skills).toBeDefined(); - expectTypeOf(member.skills).toEqualTypeOf(); - expect(member.bestiary).toBeDefined(); - expectTypeOf(member.bestiary).toEqualTypeOf(); - expect(member.slayer).toBeDefined(); - expectTypeOf(member.slayer).toEqualTypeOf(); - expect(member.crimsonIsle).toBeDefined(); - expectTypeOf(member.crimsonIsle).toEqualTypeOf(); - expect(member.dungeons).toBeDefined(); - expectTypeOf(member.dungeons).toEqualTypeOf(); - expect(member.collections).toBeDefined(); - expectTypeOf(member.collections).toEqualTypeOf>(); - expect(member.purse).toBeDefined(); - expectTypeOf(member.purse).toEqualTypeOf(); - expect(member.stats).toBeDefined(); - expectTypeOf(member.stats).toEqualTypeOf(); - expect(member.pets).toBeDefined(); - expectTypeOf(member.pets).toEqualTypeOf(); - member.pets.forEach((pet: SkyblockPet) => { - expect(pet).toBeDefined(); - expect(pet).toBeInstanceOf(SkyblockPet); - expectTypeOf(pet).toEqualTypeOf(); - expect(pet.uuid).toBeDefined(); - expectTypeOf(pet.uuid).toEqualTypeOf(); - expect(pet.name).toBeDefined(); - expectTypeOf(pet.name).toEqualTypeOf(); - expect(pet.xp).toBeDefined(); - expect(pet.xp).toBeGreaterThanOrEqual(0); - expectTypeOf(pet.xp).toEqualTypeOf(); - expect(pet.active).toBeDefined(); - expectTypeOf(pet.active).toEqualTypeOf(); - expect(pet.rarity).toBeDefined(); - expectTypeOf(pet.rarity).toEqualTypeOf(); - expect(pet.petScore).toBeDefined(); - expect(pet.petScore).toBeGreaterThanOrEqual(0); - expectTypeOf(pet.petScore).toEqualTypeOf(); - expect(pet.heldItem).toBeDefined(); - expectTypeOf(pet.heldItem).toEqualTypeOf(); - expect(pet.candyUsed).toBeDefined(); - expect(pet.candyUsed).toBeGreaterThanOrEqual(0); - expectTypeOf(pet.candyUsed).toEqualTypeOf(); - expect(pet.skin).toBeDefined(); - expectTypeOf(pet.skin).toEqualTypeOf(); - expect(pet.toString()).toBeDefined(); - expect(pet.toString()).toBe(pet.name); - expectTypeOf(pet.toString()).toEqualTypeOf(); - }); - expect(member.jacob).toBeDefined(); - expectTypeOf(member.jacob).toEqualTypeOf(); - expect(member.chocolate).toBeDefined(); - expectTypeOf(member.chocolate).toEqualTypeOf(); - expect(member.getArmor()).toBeDefined(); - expectTypeOf(member.getArmor).toEqualTypeOf<() => Promise>(); - expectTypeOf(member.getArmor()).toEqualTypeOf>(); - expect(member.getWardrobe()).toBeDefined(); - expectTypeOf(member.getWardrobe).toEqualTypeOf<() => Promise>(); - expectTypeOf(member.getWardrobe()).toEqualTypeOf>(); - expect(member.getEnderChest()).toBeDefined(); - expectTypeOf(member.getEnderChest).toEqualTypeOf<() => Promise>(); - expectTypeOf(member.getEnderChest()).toEqualTypeOf>(); - expect(member.getInventory()).toBeDefined(); - expectTypeOf(member.getInventory).toEqualTypeOf<() => Promise>(); - expectTypeOf(member.getInventory()).toEqualTypeOf>(); - const inv = await member.getInventory(); - inv.forEach((item: SkyblockInventoryItem) => { - expect(item.itemId).toBeDefined(); - expect(item.itemId).toBeGreaterThanOrEqual(0); - expectTypeOf(item.itemId).toEqualTypeOf(); - expect(item.count).toBeDefined(); - expect(item.count).toBeGreaterThanOrEqual(0); - expectTypeOf(item.count).toEqualTypeOf(); - expect(item.name).toBeDefined(); - expectTypeOf(item.name).toEqualTypeOf(); - expect(item.lore).toBeDefined(); - expectTypeOf(item.lore).toEqualTypeOf(); - expect(item.loreArray).toBeDefined(); - expectTypeOf(item.loreArray).toEqualTypeOf(); - expect(item.loreForEmbed).toBeDefined(); - expectTypeOf(item.loreForEmbed).toEqualTypeOf(); - expect(item.color).toBeDefined(); - expectTypeOf(item.color).toEqualTypeOf(); - expect(item.enchantments).toBeDefined(); - expectTypeOf(item.enchantments).toEqualTypeOf>(); - expect(item.reforge).toBeDefined(); - expectTypeOf(item.reforge).toEqualTypeOf(); - expect(item.gemstones).toBeDefined(); - expectTypeOf(item.gemstones).toEqualTypeOf(); - expect(item.damage).toBeDefined(); - expect(item.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(item.damage).toEqualTypeOf(); - expect(item.rarity).toBeDefined(); - expectTypeOf(item.rarity).toEqualTypeOf(); - expect(item.dungeonStars).toBeDefined(); - expect(item.dungeonStars).toBeGreaterThanOrEqual(0); - expectTypeOf(item.dungeonStars).toEqualTypeOf(); - expect(item.gearScore).toBeDefined(); - expect(item.gearScore).toBeGreaterThanOrEqual(0); - expectTypeOf(item.gearScore).toEqualTypeOf(); - expect(item.uuid).toBeDefined(); - expectTypeOf(item.uuid).toEqualTypeOf(); - expect(item.soulbound).toBeDefined(); - expectTypeOf(item.soulbound).toEqualTypeOf(); - expect(item.artOfWar).toBeDefined(); - expect(item.artOfWar).toBeGreaterThanOrEqual(0); - expectTypeOf(item.artOfWar).toEqualTypeOf(); - expect(item.rune).toBeDefined(); - expectTypeOf(item.rune).toEqualTypeOf(); - expect(item.hotPotatoBooks).toBeDefined(); - expect(item.hotPotatoBooks).toBeGreaterThanOrEqual(0); - expectTypeOf(item.hotPotatoBooks).toEqualTypeOf(); - expect(item.recombobulated).toBeDefined(); - expectTypeOf(item.recombobulated).toEqualTypeOf(); - expect(item.attributes).toBeDefined(); - expectTypeOf(item.attributes).toEqualTypeOf(); - expect(item.hecatomb).toBeDefined(); - expect(item.hecatomb).toBeGreaterThanOrEqual(0); - expectTypeOf(item.hecatomb).toEqualTypeOf(); - expect(item.champion).toBeDefined(); - expect(item.champion).toBeGreaterThanOrEqual(0); - expectTypeOf(item.champion).toEqualTypeOf(); - expect(item.cultivating).toBeDefined(); - expect(item.cultivating).toBeGreaterThanOrEqual(0); - expectTypeOf(item.cultivating).toEqualTypeOf(); - expect(item.expertise).toBeDefined(); - expect(item.expertise).toBeGreaterThanOrEqual(0); - expectTypeOf(item.expertise).toEqualTypeOf(); - expect(item.compact).toBeDefined(); - expect(item.compact).toBeGreaterThanOrEqual(0); - expectTypeOf(item.compact).toEqualTypeOf(); - expect(item.blocksWalked).toBeDefined(); - expect(item.blocksWalked).toBeGreaterThanOrEqual(0); - expectTypeOf(item.blocksWalked).toEqualTypeOf(); - expect(item.toString()).toBeDefined(); - expect(item.toString()).toBe(item.name); - expectTypeOf(item.toString()).toEqualTypeOf(); - }); - expect(member.getPetScore()).toBeDefined(); - expectTypeOf(member.getPetScore).toEqualTypeOf<() => number>(); - expect(member.getPetScore()).toBeGreaterThanOrEqual(0); - expectTypeOf(member.getPetScore()).toEqualTypeOf(); - expect(member.getEquipment()).toBeDefined(); - expectTypeOf(member.getEquipment).toEqualTypeOf<() => Promise>(); - expectTypeOf(member.getEquipment()).toEqualTypeOf>(); - expect(member.getPersonalVault()).toBeDefined(); - expectTypeOf(member.getPersonalVault).toEqualTypeOf<() => Promise>(); - expectTypeOf(member.getPersonalVault()).toEqualTypeOf>(); - expect(member.getNetworth()).toBeDefined(); - expectTypeOf(member.getNetworth).toEqualTypeOf<() => Promise>(); - expectTypeOf(member.getNetworth()).toEqualTypeOf>(); - expect(member.getFarmingWeight()).toBeDefined(); - expectTypeOf(member.getFarmingWeight).toEqualTypeOf<() => number>(); - expect(member.getFarmingWeight()).toBeGreaterThanOrEqual(0); - expectTypeOf(member.getFarmingWeight()).toEqualTypeOf(); - expect(member.getFarmingWeight()).toBeGreaterThanOrEqual(0); - expect(member.toString()).toBeDefined(); - expect(member.toString()).toBe(member.uuid); - expectTypeOf(member.toString()).toEqualTypeOf(); - }); - client.destroy(); -}); - -test('getSkyblockMember (garden)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getSkyblockMember('add71246c46e455c8345c129ea6f146c', { garden: true }); - expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf | RequestData>(); - data = data as Map; - data.forEach(async (member: SkyblockMember) => { - expect(member).toBeDefined(); - expect(member).toBeInstanceOf(SkyblockMember); - expectTypeOf(member).toEqualTypeOf(); - expect(member.uuid).toBeDefined(); - expectTypeOf(member.uuid).toEqualTypeOf(); - expect(member.gameMode).toBeDefined(); - expectTypeOf(member.gameMode).toEqualTypeOf(); - expect(member.selected).toBeDefined(); - expectTypeOf(member.selected).toEqualTypeOf(); - expect(member.garden).toBeDefined(); - expectTypeOf(member.garden).toEqualTypeOf(); - expect(member.museum).toBeDefined(); - expect(member.museum).toBeNull(); - expectTypeOf(member.museum).toEqualTypeOf(); - expect(member.profileName).toBeDefined(); - expectTypeOf(member.profileName).toEqualTypeOf(); - expect(member.profileId).toBeDefined(); - expectTypeOf(member.profileId).toEqualTypeOf(); - expect(member.firstJoinTimestamp).toBeDefined(); - expectTypeOf(member.firstJoinTimestamp).toEqualTypeOf(); - expect(member.firstJoinAt).toBeDefined(); - expectTypeOf(member.firstJoinAt).toEqualTypeOf(); - expect(member.experience).toBeDefined(); - expect(member.experience).toBeGreaterThanOrEqual(0); - expectTypeOf(member.experience).toEqualTypeOf(); - expect(member.level).toBeDefined(); - expectTypeOf(member.level).toEqualTypeOf(); - expect(member.hotm).toBeDefined(); - expectTypeOf(member.hotm).toEqualTypeOf(); - expect(member.highestMagicalPower).toBeDefined(); - expectTypeOf(member.highestMagicalPower).toEqualTypeOf(); - expect(member.fairySouls).toBeDefined(); - expectTypeOf(member.fairySouls).toEqualTypeOf(); - expect(member.fairyExchanges).toBeDefined(); - expectTypeOf(member.fairyExchanges).toEqualTypeOf(); - expect(member.skills).toBeDefined(); - expectTypeOf(member.skills).toEqualTypeOf(); - expect(member.bestiary).toBeDefined(); - expectTypeOf(member.bestiary).toEqualTypeOf(); - expect(member.slayer).toBeDefined(); - expectTypeOf(member.slayer).toEqualTypeOf(); - expect(member.crimsonIsle).toBeDefined(); - expectTypeOf(member.crimsonIsle).toEqualTypeOf(); - expect(member.dungeons).toBeDefined(); - expectTypeOf(member.dungeons).toEqualTypeOf(); - expect(member.collections).toBeDefined(); - expectTypeOf(member.collections).toEqualTypeOf>(); - expect(member.purse).toBeDefined(); - expectTypeOf(member.purse).toEqualTypeOf(); - expect(member.stats).toBeDefined(); - expectTypeOf(member.stats).toEqualTypeOf(); - expect(member.pets).toBeDefined(); - expectTypeOf(member.pets).toEqualTypeOf(); - member.pets.forEach((pet: SkyblockPet) => { - expect(pet).toBeDefined(); - expect(pet).toBeInstanceOf(SkyblockPet); - expectTypeOf(pet).toEqualTypeOf(); - expect(pet.uuid).toBeDefined(); - expectTypeOf(pet.uuid).toEqualTypeOf(); - expect(pet.name).toBeDefined(); - expectTypeOf(pet.name).toEqualTypeOf(); - expect(pet.xp).toBeDefined(); - expect(pet.xp).toBeGreaterThanOrEqual(0); - expectTypeOf(pet.xp).toEqualTypeOf(); - expect(pet.active).toBeDefined(); - expectTypeOf(pet.active).toEqualTypeOf(); - expect(pet.rarity).toBeDefined(); - expectTypeOf(pet.rarity).toEqualTypeOf(); - expect(pet.petScore).toBeDefined(); - expect(pet.petScore).toBeGreaterThanOrEqual(0); - expectTypeOf(pet.petScore).toEqualTypeOf(); - expect(pet.heldItem).toBeDefined(); - expectTypeOf(pet.heldItem).toEqualTypeOf(); - expect(pet.candyUsed).toBeDefined(); - expect(pet.candyUsed).toBeGreaterThanOrEqual(0); - expectTypeOf(pet.candyUsed).toEqualTypeOf(); - expect(pet.skin).toBeDefined(); - expectTypeOf(pet.skin).toEqualTypeOf(); - expect(pet.toString()).toBeDefined(); - expect(pet.toString()).toBe(pet.name); - expectTypeOf(pet.toString()).toEqualTypeOf(); - }); - expect(member.jacob).toBeDefined(); - expectTypeOf(member.jacob).toEqualTypeOf(); - expect(member.chocolate).toBeDefined(); - expectTypeOf(member.chocolate).toEqualTypeOf(); - expect(member.getArmor()).toBeDefined(); - expectTypeOf(member.getArmor).toEqualTypeOf<() => Promise>(); - expectTypeOf(member.getArmor()).toEqualTypeOf>(); - expect(member.getWardrobe()).toBeDefined(); - expectTypeOf(member.getWardrobe).toEqualTypeOf<() => Promise>(); - expectTypeOf(member.getWardrobe()).toEqualTypeOf>(); - expect(member.getEnderChest()).toBeDefined(); - expectTypeOf(member.getEnderChest).toEqualTypeOf<() => Promise>(); - expectTypeOf(member.getEnderChest()).toEqualTypeOf>(); - expect(member.getInventory()).toBeDefined(); - expectTypeOf(member.getInventory).toEqualTypeOf<() => Promise>(); - expectTypeOf(member.getInventory()).toEqualTypeOf>(); - const inv = await member.getInventory(); - inv.forEach((item: SkyblockInventoryItem) => { - expect(item.itemId).toBeDefined(); - expect(item.itemId).toBeGreaterThanOrEqual(0); - expectTypeOf(item.itemId).toEqualTypeOf(); - expect(item.count).toBeDefined(); - expect(item.count).toBeGreaterThanOrEqual(0); - expectTypeOf(item.count).toEqualTypeOf(); - expect(item.name).toBeDefined(); - expectTypeOf(item.name).toEqualTypeOf(); - expect(item.lore).toBeDefined(); - expectTypeOf(item.lore).toEqualTypeOf(); - expect(item.loreArray).toBeDefined(); - expectTypeOf(item.loreArray).toEqualTypeOf(); - expect(item.loreForEmbed).toBeDefined(); - expectTypeOf(item.loreForEmbed).toEqualTypeOf(); - expect(item.color).toBeDefined(); - expectTypeOf(item.color).toEqualTypeOf(); - expect(item.enchantments).toBeDefined(); - expectTypeOf(item.enchantments).toEqualTypeOf>(); - expect(item.reforge).toBeDefined(); - expectTypeOf(item.reforge).toEqualTypeOf(); - expect(item.gemstones).toBeDefined(); - expectTypeOf(item.gemstones).toEqualTypeOf(); - expect(item.damage).toBeDefined(); - expect(item.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(item.damage).toEqualTypeOf(); - expect(item.rarity).toBeDefined(); - expectTypeOf(item.rarity).toEqualTypeOf(); - expect(item.dungeonStars).toBeDefined(); - expect(item.dungeonStars).toBeGreaterThanOrEqual(0); - expectTypeOf(item.dungeonStars).toEqualTypeOf(); - expect(item.gearScore).toBeDefined(); - expect(item.gearScore).toBeGreaterThanOrEqual(0); - expectTypeOf(item.gearScore).toEqualTypeOf(); - expect(item.uuid).toBeDefined(); - expectTypeOf(item.uuid).toEqualTypeOf(); - expect(item.soulbound).toBeDefined(); - expectTypeOf(item.soulbound).toEqualTypeOf(); - expect(item.artOfWar).toBeDefined(); - expect(item.artOfWar).toBeGreaterThanOrEqual(0); - expectTypeOf(item.artOfWar).toEqualTypeOf(); - expect(item.rune).toBeDefined(); - expectTypeOf(item.rune).toEqualTypeOf(); - expect(item.hotPotatoBooks).toBeDefined(); - expect(item.hotPotatoBooks).toBeGreaterThanOrEqual(0); - expectTypeOf(item.hotPotatoBooks).toEqualTypeOf(); - expect(item.recombobulated).toBeDefined(); - expectTypeOf(item.recombobulated).toEqualTypeOf(); - expect(item.attributes).toBeDefined(); - expectTypeOf(item.attributes).toEqualTypeOf(); - expect(item.hecatomb).toBeDefined(); - expect(item.hecatomb).toBeGreaterThanOrEqual(0); - expectTypeOf(item.hecatomb).toEqualTypeOf(); - expect(item.champion).toBeDefined(); - expect(item.champion).toBeGreaterThanOrEqual(0); - expectTypeOf(item.champion).toEqualTypeOf(); - expect(item.cultivating).toBeDefined(); - expect(item.cultivating).toBeGreaterThanOrEqual(0); - expectTypeOf(item.cultivating).toEqualTypeOf(); - expect(item.expertise).toBeDefined(); - expect(item.expertise).toBeGreaterThanOrEqual(0); - expectTypeOf(item.expertise).toEqualTypeOf(); - expect(item.compact).toBeDefined(); - expect(item.compact).toBeGreaterThanOrEqual(0); - expectTypeOf(item.compact).toEqualTypeOf(); - expect(item.blocksWalked).toBeDefined(); - expect(item.blocksWalked).toBeGreaterThanOrEqual(0); - expectTypeOf(item.blocksWalked).toEqualTypeOf(); - expect(item.toString()).toBeDefined(); - expect(item.toString()).toBe(item.name); - expectTypeOf(item.toString()).toEqualTypeOf(); - }); - expect(member.getPetScore()).toBeDefined(); - expectTypeOf(member.getPetScore).toEqualTypeOf<() => number>(); - expect(member.getPetScore()).toBeGreaterThanOrEqual(0); - expectTypeOf(member.getPetScore()).toEqualTypeOf(); - expect(member.getEquipment()).toBeDefined(); - expectTypeOf(member.getEquipment).toEqualTypeOf<() => Promise>(); - expectTypeOf(member.getEquipment()).toEqualTypeOf>(); - expect(member.getPersonalVault()).toBeDefined(); - expectTypeOf(member.getPersonalVault).toEqualTypeOf<() => Promise>(); - expectTypeOf(member.getPersonalVault()).toEqualTypeOf>(); - expect(member.getNetworth()).toBeDefined(); - expectTypeOf(member.getNetworth).toEqualTypeOf<() => Promise>(); - expectTypeOf(member.getNetworth()).toEqualTypeOf>(); - expect(member.getFarmingWeight()).toBeDefined(); - expectTypeOf(member.getFarmingWeight).toEqualTypeOf<() => number>(); - expect(member.getFarmingWeight()).toBeGreaterThanOrEqual(0); - expectTypeOf(member.getFarmingWeight()).toEqualTypeOf(); - expect(member.getFarmingWeight()).toBeGreaterThanOrEqual(0); - expect(member.toString()).toBeDefined(); - expect(member.toString()).toBe(member.uuid); - expectTypeOf(member.toString()).toEqualTypeOf(); - }); - client.destroy(); -}); -test('getSkyblockMember', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getSkyblockMember('14727faefbdc4aff848cd2713eb9939e'); - expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf | RequestData>(); - data = data as Map; - data.forEach(async (member: SkyblockMember) => { - expect(member).toBeDefined(); - expect(member).toBeInstanceOf(SkyblockMember); - expectTypeOf(member).toEqualTypeOf(); - expect(member.uuid).toBeDefined(); - expectTypeOf(member.uuid).toEqualTypeOf(); - expect(member.gameMode).toBeDefined(); - expectTypeOf(member.gameMode).toEqualTypeOf(); - expect(member.selected).toBeDefined(); - expectTypeOf(member.selected).toEqualTypeOf(); - expect(member.garden).toBeDefined(); - expect(member.garden).toBeNull(); - expectTypeOf(member.garden).toEqualTypeOf(); - expect(member.museum).toBeDefined(); - expect(member.museum).toBeNull(); - expectTypeOf(member.museum).toEqualTypeOf(); - expect(member.profileName).toBeDefined(); - expectTypeOf(member.profileName).toEqualTypeOf(); - expect(member.profileId).toBeDefined(); - expectTypeOf(member.profileId).toEqualTypeOf(); - expect(member.firstJoinTimestamp).toBeDefined(); - expectTypeOf(member.firstJoinTimestamp).toEqualTypeOf(); - expect(member.firstJoinAt).toBeDefined(); - expectTypeOf(member.firstJoinAt).toEqualTypeOf(); - expect(member.experience).toBeDefined(); - expect(member.experience).toBeGreaterThanOrEqual(0); - expectTypeOf(member.experience).toEqualTypeOf(); - expect(member.level).toBeDefined(); - expectTypeOf(member.level).toEqualTypeOf(); - expect(member.hotm).toBeDefined(); - expectTypeOf(member.hotm).toEqualTypeOf(); - expect(member.highestMagicalPower).toBeDefined(); - expectTypeOf(member.highestMagicalPower).toEqualTypeOf(); - expect(member.fairySouls).toBeDefined(); - expectTypeOf(member.fairySouls).toEqualTypeOf(); - expect(member.fairyExchanges).toBeDefined(); - expectTypeOf(member.fairyExchanges).toEqualTypeOf(); - expect(member.skills).toBeDefined(); - expectTypeOf(member.skills).toEqualTypeOf(); - expect(member.bestiary).toBeDefined(); - expectTypeOf(member.bestiary).toEqualTypeOf(); - expect(member.slayer).toBeDefined(); - expectTypeOf(member.slayer).toEqualTypeOf(); - expect(member.crimsonIsle).toBeDefined(); - expectTypeOf(member.crimsonIsle).toEqualTypeOf(); - expect(member.dungeons).toBeDefined(); - expectTypeOf(member.dungeons).toEqualTypeOf(); - expect(member.collections).toBeDefined(); - expectTypeOf(member.collections).toEqualTypeOf>(); - expect(member.purse).toBeDefined(); - expectTypeOf(member.purse).toEqualTypeOf(); - expect(member.stats).toBeDefined(); - expectTypeOf(member.stats).toEqualTypeOf(); - expect(member.pets).toBeDefined(); - expectTypeOf(member.pets).toEqualTypeOf(); - member.pets.forEach((pet: SkyblockPet) => { - expect(pet).toBeDefined(); - expect(pet).toBeInstanceOf(SkyblockPet); - expectTypeOf(pet).toEqualTypeOf(); - expect(pet.uuid).toBeDefined(); - expectTypeOf(pet.uuid).toEqualTypeOf(); - expect(pet.name).toBeDefined(); - expectTypeOf(pet.name).toEqualTypeOf(); - expect(pet.xp).toBeDefined(); - expect(pet.xp).toBeGreaterThanOrEqual(0); - expectTypeOf(pet.xp).toEqualTypeOf(); - expect(pet.active).toBeDefined(); - expectTypeOf(pet.active).toEqualTypeOf(); - expect(pet.rarity).toBeDefined(); - expectTypeOf(pet.rarity).toEqualTypeOf(); - expect(pet.petScore).toBeDefined(); - expect(pet.petScore).toBeGreaterThanOrEqual(0); - expectTypeOf(pet.petScore).toEqualTypeOf(); - expect(pet.heldItem).toBeDefined(); - expectTypeOf(pet.heldItem).toEqualTypeOf(); - expect(pet.candyUsed).toBeDefined(); - expect(pet.candyUsed).toBeGreaterThanOrEqual(0); - expectTypeOf(pet.candyUsed).toEqualTypeOf(); - expect(pet.skin).toBeDefined(); - expectTypeOf(pet.skin).toEqualTypeOf(); - expect(pet.toString()).toBeDefined(); - expect(pet.toString()).toBe(pet.name); - expectTypeOf(pet.toString()).toEqualTypeOf(); - }); - expect(member.jacob).toBeDefined(); - expectTypeOf(member.jacob).toEqualTypeOf(); - expect(member.chocolate).toBeDefined(); - expectTypeOf(member.chocolate).toEqualTypeOf(); - expect(member.getArmor()).toBeDefined(); - expectTypeOf(member.getArmor).toEqualTypeOf<() => Promise>(); - expectTypeOf(member.getArmor()).toEqualTypeOf>(); - expect(member.getWardrobe()).toBeDefined(); - expectTypeOf(member.getWardrobe).toEqualTypeOf<() => Promise>(); - expectTypeOf(member.getWardrobe()).toEqualTypeOf>(); - expect(member.getEnderChest()).toBeDefined(); - expectTypeOf(member.getEnderChest).toEqualTypeOf<() => Promise>(); - expectTypeOf(member.getEnderChest()).toEqualTypeOf>(); - expect(member.getInventory()).toBeDefined(); - expectTypeOf(member.getInventory).toEqualTypeOf<() => Promise>(); - expectTypeOf(member.getInventory()).toEqualTypeOf>(); - const inv = await member.getInventory(); - inv.forEach((item: SkyblockInventoryItem) => { - expect(item.itemId).toBeDefined(); - expect(item.itemId).toBeGreaterThanOrEqual(0); - expectTypeOf(item.itemId).toEqualTypeOf(); - expect(item.count).toBeDefined(); - expect(item.count).toBeGreaterThanOrEqual(0); - expectTypeOf(item.count).toEqualTypeOf(); - expect(item.name).toBeDefined(); - expectTypeOf(item.name).toEqualTypeOf(); - expect(item.lore).toBeDefined(); - expectTypeOf(item.lore).toEqualTypeOf(); - expect(item.loreArray).toBeDefined(); - expectTypeOf(item.loreArray).toEqualTypeOf(); - expect(item.loreForEmbed).toBeDefined(); - expectTypeOf(item.loreForEmbed).toEqualTypeOf(); - expect(item.color).toBeDefined(); - expectTypeOf(item.color).toEqualTypeOf(); - expect(item.enchantments).toBeDefined(); - expectTypeOf(item.enchantments).toEqualTypeOf>(); - expect(item.reforge).toBeDefined(); - expectTypeOf(item.reforge).toEqualTypeOf(); - expect(item.gemstones).toBeDefined(); - expectTypeOf(item.gemstones).toEqualTypeOf(); - expect(item.damage).toBeDefined(); - expect(item.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(item.damage).toEqualTypeOf(); - expect(item.rarity).toBeDefined(); - expectTypeOf(item.rarity).toEqualTypeOf(); - expect(item.dungeonStars).toBeDefined(); - expect(item.dungeonStars).toBeGreaterThanOrEqual(0); - expectTypeOf(item.dungeonStars).toEqualTypeOf(); - expect(item.gearScore).toBeDefined(); - expect(item.gearScore).toBeGreaterThanOrEqual(0); - expectTypeOf(item.gearScore).toEqualTypeOf(); - expect(item.uuid).toBeDefined(); - expectTypeOf(item.uuid).toEqualTypeOf(); - expect(item.soulbound).toBeDefined(); - expectTypeOf(item.soulbound).toEqualTypeOf(); - expect(item.artOfWar).toBeDefined(); - expect(item.artOfWar).toBeGreaterThanOrEqual(0); - expectTypeOf(item.artOfWar).toEqualTypeOf(); - expect(item.rune).toBeDefined(); - expectTypeOf(item.rune).toEqualTypeOf(); - expect(item.hotPotatoBooks).toBeDefined(); - expect(item.hotPotatoBooks).toBeGreaterThanOrEqual(0); - expectTypeOf(item.hotPotatoBooks).toEqualTypeOf(); - expect(item.recombobulated).toBeDefined(); - expectTypeOf(item.recombobulated).toEqualTypeOf(); - expect(item.attributes).toBeDefined(); - expectTypeOf(item.attributes).toEqualTypeOf(); - expect(item.hecatomb).toBeDefined(); - expect(item.hecatomb).toBeGreaterThanOrEqual(0); - expectTypeOf(item.hecatomb).toEqualTypeOf(); - expect(item.champion).toBeDefined(); - expect(item.champion).toBeGreaterThanOrEqual(0); - expectTypeOf(item.champion).toEqualTypeOf(); - expect(item.cultivating).toBeDefined(); - expect(item.cultivating).toBeGreaterThanOrEqual(0); - expectTypeOf(item.cultivating).toEqualTypeOf(); - expect(item.expertise).toBeDefined(); - expect(item.expertise).toBeGreaterThanOrEqual(0); - expectTypeOf(item.expertise).toEqualTypeOf(); - expect(item.compact).toBeDefined(); - expect(item.compact).toBeGreaterThanOrEqual(0); - expectTypeOf(item.compact).toEqualTypeOf(); - expect(item.blocksWalked).toBeDefined(); - expect(item.blocksWalked).toBeGreaterThanOrEqual(0); - expectTypeOf(item.blocksWalked).toEqualTypeOf(); - expect(item.toString()).toBeDefined(); - expect(item.toString()).toBe(item.name); - expectTypeOf(item.toString()).toEqualTypeOf(); - }); - expect(member.getPetScore()).toBeDefined(); - expectTypeOf(member.getPetScore).toEqualTypeOf<() => number>(); - expect(member.getPetScore()).toBeGreaterThanOrEqual(0); - expectTypeOf(member.getPetScore()).toEqualTypeOf(); - expect(member.getEquipment()).toBeDefined(); - expectTypeOf(member.getEquipment).toEqualTypeOf<() => Promise>(); - expectTypeOf(member.getEquipment()).toEqualTypeOf>(); - expect(member.getPersonalVault()).toBeDefined(); - expectTypeOf(member.getPersonalVault).toEqualTypeOf<() => Promise>(); - expectTypeOf(member.getPersonalVault()).toEqualTypeOf>(); - expect(member.getNetworth()).toBeDefined(); - expectTypeOf(member.getNetworth).toEqualTypeOf<() => Promise>(); - expectTypeOf(member.getNetworth()).toEqualTypeOf>(); - expect(member.getFarmingWeight()).toBeDefined(); - expectTypeOf(member.getFarmingWeight).toEqualTypeOf<() => number>(); - expect(member.getFarmingWeight()).toBeGreaterThanOrEqual(0); - expectTypeOf(member.getFarmingWeight()).toEqualTypeOf(); - expect(member.getFarmingWeight()).toBeGreaterThanOrEqual(0); - expect(member.toString()).toBeDefined(); - expect(member.toString()).toBe(member.uuid); - expectTypeOf(member.toString()).toEqualTypeOf(); - }); - client.destroy(); -}); diff --git a/src/API/getSkyblockMember.ts b/src/API/getSkyblockMember.ts deleted file mode 100644 index 9a7d214b6..000000000 --- a/src/API/getSkyblockMember.ts +++ /dev/null @@ -1,45 +0,0 @@ -import Client from '../Client.js'; -import Endpoint from '../Private/Endpoint.js'; -import RequestData from '../Private/RequestData.js'; -import SkyblockMember from '../Structures/SkyBlock/SkyblockMember.js'; -import type { SkyblockRequestOptions } from '../Types/API.js'; - -class getSkyblockMember extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - - override async execute( - query: string, - options?: SkyblockRequestOptions - ): Promise | RequestData> { - if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); - query = await this.client.requestHandler.toUUID(query); - const res = await this.client.requestHandler.request(`/skyblock/profiles?uuid=${query}`, options); - if (res.options.raw) return res; - if (!res.data.profiles || !res.data.profiles.length) throw new Error(this.client.errors.NO_SKYBLOCK_PROFILES); - const memberByProfileName = new Map(); - for (const profile of res.data.profiles) { - memberByProfileName.set( - profile.cute_name, - new SkyblockMember({ - uuid: query, - profileId: profile.profile_id, - garden: options?.garden ? await this.client.getSkyblockGarden(profile.profile_id) : null, - museum: options?.museum ? await this.client.getSkyblockMuseum(query, profile.profile_id) : null, - profileName: profile.cute_name, - gameMode: profile.game_mode || null, - m: profile.members[query], - banking: profile.banking, - communityUpgrades: profile.community_upgrades, - selected: profile.selected - }) - ); - } - return memberByProfileName; - } -} - -export default getSkyblockMember; diff --git a/src/API/getSkyblockMuseum.test.ts b/src/API/getSkyblockMuseum.test.ts deleted file mode 100644 index 98456d2ff..000000000 --- a/src/API/getSkyblockMuseum.test.ts +++ /dev/null @@ -1,96 +0,0 @@ -import Client from '../Client.js'; -import RequestData from '../Private/RequestData.js'; -import SkyblockInventoryItem from '../Structures/SkyBlock/SkyblockInventoryItem.js'; -import SkyblockMuseum from '../Structures/SkyBlock/SkyblockMuseum.js'; -import SkyblockMuseumItem from '../Structures/SkyBlock/SkyblockMuseumItem.js'; -import SkyblockProfile from '../Structures/SkyBlock/SkyblockProfile.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('getSkyblockMuseum (no input)', () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - expect(() => client.getSkyblockMuseum()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); - client.destroy(); -}); - -test('getSkyblockMuseum (raw)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - const profiles = (await client.getSkyblockProfiles('63fe6f4c4b0643b2abd02d15dc303e41')) as SkyblockProfile[]; - const profile = profiles.find((profile: SkyblockProfile) => true === profile.selected) || null; - if (null === profile) throw new Error("Something wen't wrong while fetching profiles"); - const data = await client.getSkyblockMuseum('63fe6f4c4b0643b2abd02d15dc303e41', profile.profileId, { raw: true }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(RequestData); - expectTypeOf(data).toEqualTypeOf(); - client.destroy(); -}); - -test('getSkyblockMuseum', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - const profiles = (await client.getSkyblockProfiles('63fe6f4c4b0643b2abd02d15dc303e41')) as SkyblockProfile[]; - const profile = profiles.find((profile: SkyblockProfile) => true === profile.selected) || null; - if (null === profile) throw new Error("Something wen't wrong while fetching profiles"); - let data = await client.getSkyblockMuseum('63fe6f4c4b0643b2abd02d15dc303e41', profile.profileId); - expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf(); - data = data as SkyblockMuseum; - - expect(data.getItems()).toBeDefined(); - expectTypeOf(data.getItems).toEqualTypeOf<() => Promise>(); - expectTypeOf(data.getItems()).toEqualTypeOf>(); - - const items = await data.getItems(); - expect(items).toBeDefined(); - expectTypeOf(items).toEqualTypeOf(); - items.forEach((item: SkyblockMuseumItem) => { - expect(item).toBeDefined(); - expect(item).toBeInstanceOf(SkyblockMuseumItem); - expectTypeOf(item).toEqualTypeOf(); - - expect(item.name).toBeDefined(); - expectTypeOf(item.name).toEqualTypeOf(); - - expect(item.donated).toBeDefined(); - expectTypeOf(item.donated).toEqualTypeOf(); - - expect(item.featuredSlot).toBeDefined(); - expectTypeOf(item.featuredSlot).toEqualTypeOf(); - - expect(item.borrowing).toBeDefined(); - expectTypeOf(item.borrowing).toEqualTypeOf(); - - expect(item.items).toBeDefined(); - expectTypeOf(item.items).toEqualTypeOf(); - }); - - expect(data.getSpecial()).toBeDefined(); - expectTypeOf(data.getSpecial).toEqualTypeOf<() => Promise>(); - expectTypeOf(data.getSpecial()).toEqualTypeOf>(); - - const special = await data.getSpecial(); - expect(special).toBeDefined(); - expectTypeOf(special).toEqualTypeOf(); - special.forEach((item: SkyblockMuseumItem) => { - expect(item).toBeDefined(); - expect(item).toBeInstanceOf(SkyblockMuseumItem); - expectTypeOf(item).toEqualTypeOf(); - - expect(item.name).toBeDefined(); - expectTypeOf(item.name).toEqualTypeOf(); - - expect(item.donated).toBeDefined(); - expectTypeOf(item.donated).toEqualTypeOf(); - - expect(item.featuredSlot).toBeDefined(); - expectTypeOf(item.featuredSlot).toEqualTypeOf(); - - expect(item.borrowing).toBeDefined(); - expectTypeOf(item.borrowing).toEqualTypeOf(); - - expect(item.items).toBeDefined(); - expectTypeOf(item.items).toEqualTypeOf(); - }); - - client.destroy(); -}); diff --git a/src/API/getSkyblockMuseum.ts b/src/API/getSkyblockMuseum.ts deleted file mode 100644 index 1e06473ad..000000000 --- a/src/API/getSkyblockMuseum.ts +++ /dev/null @@ -1,30 +0,0 @@ -import Client from '../Client.js'; -import Endpoint from '../Private/Endpoint.js'; -import RequestData from '../Private/RequestData.js'; -import SkyblockMuseum from '../Structures/SkyBlock/SkyblockMuseum.js'; -import type { RequestOptions } from '../Types/Requests.js'; - -class getSkyblockMuseum extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - - override async execute( - query: string, - profileId: string, - options?: RequestOptions - ): Promise { - if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); - query = await this.client.requestHandler.toUUID(query); - const res = await this.client.requestHandler.request( - `/skyblock/museum?uuid=${query}&profile=${profileId}`, - options - ); - if (res.options.raw) return res; - return new SkyblockMuseum({ uuid: query, m: res.data, profileId: profileId }); - } -} - -export default getSkyblockMuseum; diff --git a/src/API/getSkyblockProfiles.test.ts b/src/API/getSkyblockProfiles.test.ts deleted file mode 100644 index a6a1bd2b5..000000000 --- a/src/API/getSkyblockProfiles.test.ts +++ /dev/null @@ -1,159 +0,0 @@ -import Client from '../Client.js'; -import RequestData from '../Private/RequestData.js'; -import SkyblockMember from '../Structures/SkyBlock/SkyblockMember.js'; -import SkyblockProfile from '../Structures/SkyBlock/SkyblockProfile.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('getSkyblockProfiles (raw)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - const data = await client.getSkyblockProfiles('14727faefbdc4aff848cd2713eb9939e', { raw: true }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(RequestData); - expectTypeOf(data).toEqualTypeOf(); - client.destroy(); -}); - -test('getSkyblockProfiles (no input)', () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - expect(() => client.getSkyblockProfiles()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); - client.destroy(); -}); - -test('getSkyblockProfiles (no profiles)', () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - expect(() => client.getSkyblockProfiles('b45add7b081443909fb00aa9a3e15eb0')).rejects.toThrowError( - client.errors.NO_SKYBLOCK_PROFILES - ); - client.destroy(); -}); - -test('getSkyblockProfiles', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getSkyblockProfiles('14727faefbdc4aff848cd2713eb9939e'); - expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf(); - data = data as SkyblockProfile[]; - - data.forEach((profile: SkyblockProfile) => { - expect(profile).toBeDefined(); - expectTypeOf(profile).toEqualTypeOf(); - - expect(profile.profileId).toBeDefined(); - expectTypeOf(profile.profileId).toEqualTypeOf(); - - expect(profile.profileName).toBeDefined(); - expectTypeOf(profile.profileName).toEqualTypeOf(); - - expect(profile.gameMode).toBeDefined(); - expectTypeOf(profile.gameMode).toEqualTypeOf(); - - expect(profile.banking).toBeDefined(); - expectTypeOf(profile.banking).toEqualTypeOf(); - - expect(profile.communityUpgrades).toBeDefined(); - expectTypeOf(profile.communityUpgrades).toEqualTypeOf(); - - expect(profile.selected).toBeDefined(); - expectTypeOf(profile.selected).toEqualTypeOf(); - - expect(profile.members).toBeDefined(); - expectTypeOf(profile.members).toEqualTypeOf(); - - expect(profile.me).toBeDefined(); - expectTypeOf(profile.me).toEqualTypeOf(); - - expect(profile.toString()).toBeDefined(); - expectTypeOf(profile.toString()).toEqualTypeOf(); - expect(profile.toString()).toBe(profile.profileName); - }); - - client.destroy(); -}); - -test('getSkyblockProfiles (garden)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getSkyblockProfiles('add71246c46e455c8345c129ea6f146c', { garden: true }); - expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf(); - data = data as SkyblockProfile[]; - - data.forEach((profile: SkyblockProfile) => { - expect(profile).toBeDefined(); - expectTypeOf(profile).toEqualTypeOf(); - - expect(profile.profileId).toBeDefined(); - expectTypeOf(profile.profileId).toEqualTypeOf(); - - expect(profile.profileName).toBeDefined(); - expectTypeOf(profile.profileName).toEqualTypeOf(); - - expect(profile.gameMode).toBeDefined(); - expectTypeOf(profile.gameMode).toEqualTypeOf(); - - expect(profile.banking).toBeDefined(); - expectTypeOf(profile.banking).toEqualTypeOf(); - - expect(profile.communityUpgrades).toBeDefined(); - expectTypeOf(profile.communityUpgrades).toEqualTypeOf(); - - expect(profile.selected).toBeDefined(); - expectTypeOf(profile.selected).toEqualTypeOf(); - - expect(profile.members).toBeDefined(); - expectTypeOf(profile.members).toEqualTypeOf(); - - expect(profile.me).toBeDefined(); - expectTypeOf(profile.me).toEqualTypeOf(); - - expect(profile.toString()).toBeDefined(); - expectTypeOf(profile.toString()).toEqualTypeOf(); - expect(profile.toString()).toBe(profile.profileName); - }); - - client.destroy(); -}); - -test('getSkyblockProfiles (museum)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getSkyblockProfiles('63fe6f4c4b0643b2abd02d15dc303e41', { museum: true }); - expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf(); - data = data as SkyblockProfile[]; - - data.forEach((profile: SkyblockProfile) => { - expect(profile).toBeDefined(); - expectTypeOf(profile).toEqualTypeOf(); - - expect(profile.profileId).toBeDefined(); - expectTypeOf(profile.profileId).toEqualTypeOf(); - - expect(profile.profileName).toBeDefined(); - expectTypeOf(profile.profileName).toEqualTypeOf(); - - expect(profile.gameMode).toBeDefined(); - expectTypeOf(profile.gameMode).toEqualTypeOf(); - - expect(profile.banking).toBeDefined(); - expectTypeOf(profile.banking).toEqualTypeOf(); - - expect(profile.communityUpgrades).toBeDefined(); - expectTypeOf(profile.communityUpgrades).toEqualTypeOf(); - - expect(profile.selected).toBeDefined(); - expectTypeOf(profile.selected).toEqualTypeOf(); - - expect(profile.members).toBeDefined(); - expectTypeOf(profile.members).toEqualTypeOf(); - - expect(profile.me).toBeDefined(); - expectTypeOf(profile.me).toEqualTypeOf(); - - expect(profile.toString()).toBeDefined(); - expectTypeOf(profile.toString()).toEqualTypeOf(); - expect(profile.toString()).toBe(profile.profileName); - }); - - client.destroy(); -}); diff --git a/src/API/getSkyblockProfiles.ts b/src/API/getSkyblockProfiles.ts deleted file mode 100644 index bea5a7eb3..000000000 --- a/src/API/getSkyblockProfiles.ts +++ /dev/null @@ -1,40 +0,0 @@ -import Client from '../Client.js'; -import Endpoint from '../Private/Endpoint.js'; -import RequestData from '../Private/RequestData.js'; -import SkyblockProfile from '../Structures/SkyBlock/SkyblockProfile.js'; -import type { SkyblockRequestOptions } from '../Types/API.js'; - -class getSkyblockProfiles extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - - override async execute(query: string, options?: SkyblockRequestOptions): Promise { - if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); - query = await this.client.requestHandler.toUUID(query); - const res = await this.client.requestHandler.request(`/skyblock/profiles?uuid=${query}`, options); - if (res.options.raw) return res; - if (!res.data.profiles || !res.data.profiles.length) throw new Error(this.client.errors.NO_SKYBLOCK_PROFILES); - const profiles = []; - for (let i = 0; i < res.data.profiles.length; i++) { - profiles.push({ - uuid: query, - profileId: res.data.profiles[i].profile_id, - profileName: res.data.profiles[i].cute_name, - gameMode: res.data.profiles[i].game_mode || null, - m: res.data.profiles[i].members[query], - banking: res.data.profiles[i].banking, - communityUpgrades: res.data.profiles[i].community_upgrades, - selected: res.data.profiles[i].selected, - members: res.data.profiles[i].members, - garden: options?.garden ? await this.client.getSkyblockGarden(res.data.profiles[i].profile_id) : null, - museum: options?.garden ? await this.client.getSkyblockMuseum(query, res.data.profiles[i].profile_id) : null - }); - } - return profiles.map((p) => new SkyblockProfile(p)); - } -} - -export default getSkyblockProfiles; diff --git a/src/API/index.ts b/src/API/index.ts index 2f0b41351..efe40941f 100644 --- a/src/API/index.ts +++ b/src/API/index.ts @@ -1,3 +1,5 @@ +/* v8 ignore next 400 */ + import getAchievements from './getAchievements.js'; import getActiveHouses from './getActiveHouses.js'; import getBoosters from './getBoosters.js'; @@ -11,21 +13,24 @@ import getPlayer from './getPlayer.js'; import getPlayerHouses from './getPlayerHouses.js'; import getQuests from './getQuests.js'; import getRecentGames from './getRecentGames.js'; -import getSkyblockAuction from './getSkyblockAuction.js'; -import getSkyblockAuctions from './getSkyblockAuctions.js'; -import getSkyblockAuctionsByPlayer from './getSkyblockAuctionsByPlayer.js'; -import getSkyblockBazaar from './getSkyblockBazaar.js'; -import getSkyblockBingo from './getSkyblockBingo.js'; -import getSkyblockFireSales from './getSkyblockFireSales.js'; -import getSkyblockGarden from './getSkyblockGarden.js'; -import getSkyblockGovernment from './getSkyblockGovernment.js'; -import getSkyblockItems from './getSkyblockItems.js'; -import getSkyblockMember from './getSkyblockMember.js'; -import getSkyblockMuseum from './getSkyblockMuseum.js'; -import getSkyblockNews from './getSkyblockNews.js'; -import getSkyblockProfiles from './getSkyblockProfiles.js'; +import getSkyBlockAuction from './getSkyBlockAuction.js'; +import getSkyBlockAuctions from './getSkyBlockAuctions.js'; +import getSkyBlockBazaar from './getSkyBlockBazaar.js'; +import getSkyBlockBingo from './getSkyBlockBingo.js'; +import getSkyBlockCollections from './getSkyBlockCollections.js'; +import getSkyBlockElection from './getSkyBlockElection.js'; +import getSkyBlockEndedAuctions from './getSkyBlockEndedAuctions.js'; +import getSkyBlockFireSales from './getSkyBlockFireSales.js'; +import getSkyBlockGarden from './getSkyBlockGarden.js'; +import getSkyBlockItems from './getSkyBlockItems.js'; +import getSkyBlockMuseum from './getSkyBlockMuseum.js'; +import getSkyBlockNews from './getSkyBlockNews.js'; +import getSkyBlockProfile from './getSkyBlockProfile.js'; +import getSkyBlockProfiles from './getSkyBlockProfiles.js'; +import getSkyBlockSkills from './getSkyBlockSkills.js'; import getStatus from './getStatus.js'; import getWatchdogStats from './getWatchdogStats.js'; + export default { getAchievements, getActiveHouses, @@ -40,19 +45,21 @@ export default { getPlayerHouses, getQuests, getRecentGames, - getSkyblockAuction, - getSkyblockAuctions, - getSkyblockAuctionsByPlayer, - getSkyblockBazaar, - getSkyblockBingo, - getSkyblockFireSales, - getSkyblockGarden, - getSkyblockGovernment, - getSkyblockMember, - getSkyblockMuseum, - getSkyblockNews, - getSkyblockProfiles, - getSkyblockItems, + getSkyBlockAuction, + getSkyBlockAuctions, + getSkyBlockBazaar, + getSkyBlockBingo, + getSkyBlockCollections, + getSkyBlockElection, + getSkyBlockEndedAuctions, + getSkyBlockFireSales, + getSkyBlockGarden, + getSkyBlockItems, + getSkyBlockMuseum, + getSkyBlockNews, + getSkyBlockProfile, + getSkyBlockProfiles, + getSkyBlockSkills, getStatus, getWatchdogStats }; diff --git a/src/Client.ts b/src/Client.ts index 9ba2384db..6af9384ef 100644 --- a/src/Client.ts +++ b/src/Client.ts @@ -1,45 +1,47 @@ import API from './API/index.js'; import Achievements from './Structures/Static/Achievements/Achievements.js'; -import Auction from './Structures/SkyBlock/Auctions/Auction.js'; -import BingoData from './Structures/SkyBlock/Static/BingoData.js'; import Booster from './Structures/Boosters/Booster.js'; import CacheHandler from './Private/CacheHandler.js'; import Challenges from './Structures/Static/Challenges.js'; import Errors from './Errors.js'; -import FireSale from './Structures/SkyBlock/Static/FireSale.js'; import Functions from './Private/Functions.js'; import GameCounts from './Structures/GameCounts.js'; -import GovernmentData from './Structures/SkyBlock/Static/Government.js'; import Guild from './Structures/Guild/Guild.js'; import GuildAchievements from './Structures/Static/Achievements/GuildAchievements.js'; import House from './Structures/House.js'; import Leaderboard from './Structures/Leaderboard.js'; import Player from './Structures/Player/Player.js'; -import Product from './Structures/SkyBlock/Bazaar/Product.js'; import Quests from './Structures/Static/Quests.js'; import RateLimit from './Private/RateLimit.js'; import RecentGame from './Structures/RecentGame.js'; import RequestData from './Private/RequestData.js'; import RequestHandler from './Private/RequestHandler.js'; -import SkyblockGarden from './Structures/SkyBlock/SkyblockGarden.js'; -import SkyblockItem from './Structures/SkyBlock/SkyblockItem.js'; -import SkyblockMember from './Structures/SkyBlock/SkyblockMember.js'; -import SkyblockMuseum from './Structures/SkyBlock/SkyblockMuseum.js'; -import SkyblockNews from './Structures/SkyBlock/News/SkyblockNews.js'; -import SkyblockProfile from './Structures/SkyBlock/SkyblockProfile.js'; import Status from './Structures/Status.js'; import Updater from './Private/Updater.js'; import WatchdogStats from './Structures/WatchdogStats.js'; +import type SkyBlockBazaar from './Structures/SkyBlock/Bazaar/SkyBlockBazaar.js'; +import type SkyBlockBingo from './Structures/SkyBlock/Bingo/SkyBlockBingo.js'; +import type SkyBlockCollections from './Structures/SkyBlock/Collections/SkyBlockCollections.js'; +import type SkyBlockElectionData from './Structures/SkyBlock/Election/SkyBlockElectionData.js'; +import type SkyBlockFireSale from './Structures/SkyBlock/FireSale/SkyBlockFireSale.js'; +import type SkyBlockGarden from './Structures/SkyBlock/Garden/SkyBlockGarden.js'; +import type SkyBlockItem from './Structures/SkyBlock/SkyBlockItem.js'; +import type SkyBlockMuseum from './Structures/SkyBlock/Museum/SkyBlockMuseum.js'; +import type SkyBlockNews from './Structures/SkyBlock/News/SkyBlockNews.js'; +import type SkyBlockProfile from './Structures/SkyBlock/Profile/SkyBlockProfile.js'; +import type SkyBlockSkills from './Structures/SkyBlock/Skills/SkyBlockSkills.js'; import type { AuctionFetchOptions, AuctionRequestOptions, GuildFetchOptions, PlayerRequestOptions, - SkyblockAuctionsResult, - SkyblockRequestOptions + SkyBlockAuctionResult, + SkyBlockAuctionsResult, + SkyBlockRequestOptions } from './Types/API.js'; import type { ClientOptions } from './Types/Client.js'; import type { RequestOptions } from './Types/Requests.js'; +import type { SkyBlockProfileName } from './Types/SkyBlock.js'; const clients: Client[] = []; @@ -170,69 +172,76 @@ class Client { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } - public getSkyblockAuction( + public getSkyBlockAuction( type: AuctionFetchOptions, query: string, options?: AuctionRequestOptions - ): Promise { + ): Promise { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } - public getSkyblockAuctions(query: number | '*', options?: AuctionRequestOptions): Promise { + public getSkyBlockAuctions( + query: number | '*', + options?: AuctionRequestOptions + ): Promise { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } - public getSkyblockAuctionsByPlayer(query: string, options?: AuctionRequestOptions): Promise { + public getSkyBlockBazaar(options?: RequestOptions): Promise { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } - public getSkyblockBazaar(options?: RequestOptions): Promise { + public getSkyBlockBingo(options?: RequestOptions): Promise { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } - public getSkyblockBingo(options?: RequestOptions): Promise { + public getSkyBlockCollections(options?: RequestOptions): Promise { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } - public getSkyblockFireSales(options?: RequestOptions): Promise { + public getSkyBlockElection(options?: RequestOptions): Promise { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } - public getSkyblockGarden(profileId: string, options?: RequestOptions): Promise { + public getSkyBlockEndedAuctions(options?: AuctionRequestOptions): Promise { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } - public getSkyblockGovernment(options?: RequestOptions): Promise { + public getSkyBlockFireSales(options?: RequestOptions): Promise { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } - public getSkyblockMember( - query: string, - options?: SkyblockRequestOptions - ): Promise | RequestData> { + public getSkyBlockGarden(profileId: string, options?: RequestOptions): Promise { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } - public getSkyblockMuseum( - query: string, - profileId: string, - options?: RequestOptions - ): Promise { + public getSkyBlockItems(options?: RequestOptions): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getSkyBlockMuseum(profileId: string, options?: RequestOptions): Promise { + throw new Error(this.errors.ENDPOINT_NOT_LOADED); + } + + public getSkyBlockNews(options?: RequestOptions): Promise { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } - public getSkyblockNews(options?: RequestOptions): Promise { + public getSkyBlockProfile( + profileId: string, + options?: SkyBlockRequestOptions + ): Promise { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } - public getSkyblockProfiles( + public getSkyBlockProfiles( query: string, - options?: SkyblockRequestOptions - ): Promise { + options?: SkyBlockRequestOptions + ): Promise | RequestData> { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } - public getSkyblockItems(options?: RequestOptions): Promise { + public getSkyBlockSkills(options?: RequestOptions): Promise { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } diff --git a/src/Errors.ts b/src/Errors.ts index f8d999277..57ffeb295 100644 --- a/src/Errors.ts +++ b/src/Errors.ts @@ -32,9 +32,9 @@ class Errors { "[Hypixel-API-Reborn] The rate limitations on your API Key has been exceeded. There might be an outage (Check Hypixel's status page), or you simply did too many requests in a short time. Hint: Enable rate limit options! They can help you avoid this error! For help join our Discord Server https://discord.gg/NSEBNMM"; RECENT_REQUEST: string = '[Hypixel-API-Reborn] You have requested that player recently. Try turning on cache. For help join our Discord Server https://discord.gg/NSEBNMM'; - NO_SKYBLOCK_PROFILES: string = '[Hypixel-API-Reborn] The player has no skyblock profiles.'; + NO_SKYBLOCK_PROFILES: string = '[Hypixel-API-Reborn] The player has no SkyBlock profiles.'; BAD_AUCTION_FILTER: string = - '[Hypixel-API-Reborn] Unexpected filter for Client#getSkyblockAuction. Expected one of "PLAYER", "AUCTION", "PROFILE", but got something else.'; + '[Hypixel-API-Reborn] Unexpected filter for Client#getSkyBlockAuction. Expected one of "PROFILE", "PLAYER", "AUCTION_ID", but got something else.'; NOT_IMPLEMENTED: string = '[Hypixel-API-Reborn] Endpoint execute method is not implemented yet! Please report this https://discord.gg/NSEBNMM'; RATE_LIMIT_INIT_ERROR: string = diff --git a/src/Structures/Guild/GuildMember.ts b/src/Structures/Guild/GuildMember.ts index 565b69cff..dc3437e50 100644 --- a/src/Structures/Guild/GuildMember.ts +++ b/src/Structures/Guild/GuildMember.ts @@ -1,8 +1,9 @@ import { parseHistory } from '../../Utils/Guild.js'; import type { ExpHistory } from '../../Types/Guild.js'; +import type { UUID } from '../../Types/Global.js'; class GuildMember { - uuid: string; + uuid: UUID; joinedAtTimestamp: number | null; joinedAt: Date | null; questParticipation: number; diff --git a/src/Structures/House.ts b/src/Structures/House.ts index e3b6652c4..0854de3d8 100644 --- a/src/Structures/House.ts +++ b/src/Structures/House.ts @@ -1,6 +1,8 @@ +import type { UUID } from '../Types/Global.js'; + class House { name: string; - uuid: string; + uuid: UUID; owner: string; createdAtTimestamp: number | null; createdAt: Date | null; diff --git a/src/Structures/MiniGames/Pit/Pit.ts b/src/Structures/MiniGames/Pit/Pit.ts index 9a6783272..09310ac65 100644 --- a/src/Structures/MiniGames/Pit/Pit.ts +++ b/src/Structures/MiniGames/Pit/Pit.ts @@ -1,6 +1,6 @@ import Divide from '../../../Utils/Divide.js'; import PitInventoryItem from './PitInventoryItem.js'; -import { decode } from '../../../Utils/SkyblockUtils.js'; +import { decode } from '../../../Utils/SkyBlockUtils.js'; import { pit } from '../../../Utils/Constants.js'; import type { PitArmor } from '../../../Types/Player.js'; diff --git a/src/Structures/Player/Player.test.ts b/src/Structures/Player/Player.test.ts index 409984254..25ac69db1 100644 --- a/src/Structures/Player/Player.test.ts +++ b/src/Structures/Player/Player.test.ts @@ -89,8 +89,8 @@ test('Player', () => { expect(data.karma).toBeDefined(); expect(data.karma).toBeGreaterThanOrEqual(0); expectTypeOf(data.karma).toEqualTypeOf(); - expect(data.freeSkyblockCookie).toBeDefined(); - expectTypeOf(data.freeSkyblockCookie).toEqualTypeOf(); + expect(data.freeSkyBlockCookie).toBeDefined(); + expectTypeOf(data.freeSkyBlockCookie).toEqualTypeOf(); expect(data.tourney).toBeDefined(); expectTypeOf(data.tourney).toEqualTypeOf(); expect(data.rewards).toBeDefined(); diff --git a/src/Structures/Player/Player.ts b/src/Structures/Player/Player.ts index fed5ef031..a939a6ecb 100644 --- a/src/Structures/Player/Player.ts +++ b/src/Structures/Player/Player.ts @@ -43,9 +43,10 @@ import type { PlayerStats, ScorpiusBribe } from '../../Types/Player.js'; +import type { UUID } from '../../Types/Global.js'; class Player { - uuid: string; + uuid: UUID; nickname: string; rank: PlayerRank; mvpPlusColor: Color | null; @@ -63,7 +64,7 @@ class Player { level: LevelProgress; seasonal: Seasonal; karma: number; - freeSkyblockCookie: number | null; + freeSkyBlockCookie: number | null; tourney: Tourney; rewards: Rewards; challenges: object; @@ -98,7 +99,7 @@ class Player { this.level = playerLevelProgress(this.exp); this.seasonal = new Seasonal(data?.seasonal || {}); this.karma = data?.karma || 0; - this.freeSkyblockCookie = data?.skyblock_free_cookie || null; + this.freeSkyBlockCookie = data?.skyblock_free_cookie || null; this.tourney = new Tourney(data?.tourney || {}); this.rewards = new Rewards(data); this.challenges = data?.challenges || {}; diff --git a/src/Structures/SkyBlock/Auctions/Auction.ts b/src/Structures/SkyBlock/Auctions/Auction.ts deleted file mode 100644 index e1f7b5af7..000000000 --- a/src/Structures/SkyBlock/Auctions/Auction.ts +++ /dev/null @@ -1,43 +0,0 @@ -import BaseAuction from './BaseAuction.js'; -import Bid from './Bid.js'; -import type { Rarity } from '../../../Types/Skyblock.js'; - -class Auction extends BaseAuction { - coop: string[]; - auctionStartTimestamp: number; - auctionStart: Date; - auctionEndTimestamp: number | null; - auctionEnd: Date | null; - item: string; - itemLore: string; - itemLoreRaw: string; - rarity: Rarity; - startingBid: number; - highestBid: number; - bids: Bid[]; - claimed: boolean; - claimedBidders: string[]; - constructor(data: Record, includeItemBytes: boolean = false) { - super(data, includeItemBytes); - this.coop = data.coop || []; - this.auctionStartTimestamp = data.start; - this.auctionStart = new Date(this.auctionStartTimestamp); - this.auctionEndTimestamp = data.end || null; - this.auctionEnd = this.auctionEndTimestamp ? new Date(this.auctionEndTimestamp) : null; - this.item = data.item_name || null; - this.itemLore = data.item_lore ? data.item_lore.replace(/§([1-9]|[a-l])|§/gm, '') : null; - this.itemLoreRaw = data.item_lore || null; - this.rarity = data.tier || null; - this.startingBid = data.starting_bid || 0; - this.highestBid = this.bin ? data.starting_bid : data.highest_bid_amount || 0; - this.bids = data.bids.length ? data.bids.map((b: any) => new Bid(b)) : []; - this.claimed = data.claimed || false; - this.claimedBidders = this.claimed ? data.claimed_bidders : []; - } - - override toString(): string { - return this.item; - } -} - -export default Auction; diff --git a/src/Structures/SkyBlock/Auctions/AuctionInfo.ts b/src/Structures/SkyBlock/Auctions/AuctionInfo.ts deleted file mode 100644 index a133f1785..000000000 --- a/src/Structures/SkyBlock/Auctions/AuctionInfo.ts +++ /dev/null @@ -1,16 +0,0 @@ -class AuctionInfo { - page: number; - totalPages: number; - totalAuctions: number; - lastUpdatedTimestamp: number; - lastUpdatedAt: Date; - constructor(data: Record) { - this.page = parseInt(data.page, 10); - this.totalPages = parseInt(data.totalPages, 10); - this.totalAuctions = parseInt(data.totalAuctions, 10); - this.lastUpdatedTimestamp = data.lastUpdated; - this.lastUpdatedAt = new Date(this.lastUpdatedTimestamp); - } -} - -export default AuctionInfo; diff --git a/src/Structures/SkyBlock/Auctions/BaseAuction.test.ts b/src/Structures/SkyBlock/Auctions/BaseAuction.test.ts deleted file mode 100644 index 0a5d88457..000000000 --- a/src/Structures/SkyBlock/Auctions/BaseAuction.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -import BaseAuction from './BaseAuction.js'; -import ItemBytes from '../../ItemBytes.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('BaseAuction', () => { - const data = new BaseAuction({ stats: 'meow' }, false); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(BaseAuction); - expectTypeOf(data).toEqualTypeOf(); - expect(data.auctionId).toBeDefined(); - expectTypeOf(data.auctionId).toEqualTypeOf(); - expect(data.auctioneerUuid).toBeDefined(); - expectTypeOf(data.auctioneerUuid).toEqualTypeOf(); - expect(data.auctioneerProfile).toBeDefined(); - expectTypeOf(data.auctioneerProfile).toEqualTypeOf(); - expect(data.bin).toBeDefined(); - expectTypeOf(data.bin).toEqualTypeOf(); - expect(data.itemBytes).toBeDefined(); - expectTypeOf(data.itemBytes).toEqualTypeOf(); - expect(data.toString()).toBeDefined(); - expectTypeOf(data.toString()).toEqualTypeOf(); -}); diff --git a/src/Structures/SkyBlock/Auctions/BaseAuction.ts b/src/Structures/SkyBlock/Auctions/BaseAuction.ts deleted file mode 100644 index edbfa30ea..000000000 --- a/src/Structures/SkyBlock/Auctions/BaseAuction.ts +++ /dev/null @@ -1,22 +0,0 @@ -import ItemBytes from '../../ItemBytes.js'; - -class BaseAuction { - auctionId: string | null; - auctioneerUuid: string | null; - auctioneerProfile: string | null; - bin: boolean; - itemBytes: ItemBytes | null; - constructor(data: Record, includeItemBytes: boolean) { - this.auctionId = data.uuid || data.auction_id || null; - this.auctioneerUuid = data.auctioneer || data.seller || null; - this.auctioneerProfile = data.profile_id || data.seller_profile || null; - this.bin = data.bin || false; - this.itemBytes = includeItemBytes ? new ItemBytes(data.item_bytes) : null; - } - - toString(): string | null { - return this.auctionId; - } -} - -export default BaseAuction; diff --git a/src/Structures/SkyBlock/Auctions/Bid.ts b/src/Structures/SkyBlock/Auctions/Bid.ts deleted file mode 100644 index 8bfaae1f6..000000000 --- a/src/Structures/SkyBlock/Auctions/Bid.ts +++ /dev/null @@ -1,22 +0,0 @@ -class Bid { - auctionId: string; - profileId: string; - amount: number; - timestamp: number; - at: Date; - bidder: string; - constructor(data: Record) { - this.auctionId = data.auction_id; - this.profileId = data.profile_id; - this.amount = data.amount; - this.timestamp = data.timestamp; - this.at = new Date(this.timestamp); - this.bidder = data.bidder; - } - - toString(): string { - return `${this.bidder} bid ${this.amount} coins`; - } -} - -export default Bid; diff --git a/src/Structures/SkyBlock/Auctions/SkyBlockAuction.test.ts b/src/Structures/SkyBlock/Auctions/SkyBlockAuction.test.ts new file mode 100644 index 000000000..6e4284428 --- /dev/null +++ b/src/Structures/SkyBlock/Auctions/SkyBlockAuction.test.ts @@ -0,0 +1,48 @@ +import SkyBlockAuction from './SkyBlockAuction.js'; +import SkyBlockAuctionBid from './SkyBlockAuctionBid.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { Rarity } from '../../../Types/SkyBlock.js'; +import type { UUID } from '../../../Types/Global.js'; + +test('SkyBlockAuction', () => { + const data = new SkyBlockAuction({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockAuction); + expectTypeOf(data).toEqualTypeOf(); + expect(data.coop).toBeDefined(); + expectTypeOf(data.coop).toEqualTypeOf(); + expect(data.auctionStartTimestamp).toBeDefined(); + expectTypeOf(data.auctionStartTimestamp).toEqualTypeOf(); + expect(data.auctionStartAt).toBeDefined(); + expectTypeOf(data.auctionStartAt).toEqualTypeOf(); + expect(data.auctionEndTimestamp).toBeDefined(); + expectTypeOf(data.auctionEndTimestamp).toEqualTypeOf(); + expect(data.auctionEndAt).toBeDefined(); + expectTypeOf(data.auctionEndAt).toEqualTypeOf(); + expect(data.item).toBeDefined(); + expectTypeOf(data.item).toEqualTypeOf(); + expect(data.itemLore).toBeDefined(); + expectTypeOf(data.itemLore).toEqualTypeOf(); + expect(data.rarity).toBeDefined(); + expectTypeOf(data.rarity).toEqualTypeOf(); + expect(data.startingBid).toBeDefined(); + expectTypeOf(data.startingBid).toEqualTypeOf(); + expect(data.highestBid).toBeDefined(); + expectTypeOf(data.highestBid).toEqualTypeOf(); + expect(data.bids).toBeDefined(); + expectTypeOf(data.bids).toEqualTypeOf(); + data.bids.forEach((bid: SkyBlockAuctionBid) => { + expect(bid).toBeDefined(); + expect(bid).toBeInstanceOf(SkyBlockAuctionBid); + expectTypeOf(bid).toEqualTypeOf(); + }); + expect(data.claimed).toBeDefined(); + expectTypeOf(data.claimed).toEqualTypeOf(); + expect(data.claimedBidders).toBeDefined(); + expectTypeOf(data.claimedBidders).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.item); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Auctions/SkyBlockAuction.ts b/src/Structures/SkyBlock/Auctions/SkyBlockAuction.ts new file mode 100644 index 000000000..99b0c8f11 --- /dev/null +++ b/src/Structures/SkyBlock/Auctions/SkyBlockAuction.ts @@ -0,0 +1,42 @@ +import SkyBlockAuctionBid from './SkyBlockAuctionBid.js'; +import SkyBlockBaseAuction from './SkyBlockBaseAuction.js'; +import type { Rarity } from '../../../Types/SkyBlock.js'; +import type { UUID } from '../../../Types/Global.js'; + +class SkyBlockAuction extends SkyBlockBaseAuction { + coop: UUID[]; + auctionStartTimestamp: number; + auctionStartAt: Date; + auctionEndTimestamp: number | null; + auctionEndAt: Date | null; + item: string; + itemLore: string; + rarity: Rarity | 'UNKNOWN'; + startingBid: number; + highestBid: number; + bids: SkyBlockAuctionBid[]; + claimed: boolean; + claimedBidders: string[]; + constructor(data: Record, includeItemBytes: boolean = false) { + super(data, includeItemBytes); + this.coop = data?.coop || []; + this.auctionStartTimestamp = data?.start || 0; + this.auctionStartAt = new Date(this.auctionStartTimestamp); + this.auctionEndTimestamp = data.end || null; + this.auctionEndAt = this.auctionEndTimestamp ? new Date(this.auctionEndTimestamp) : null; + this.item = data?.item_name || 'UNKNOWN'; + this.itemLore = data?.item_lore || 'UNKNOWN'; + this.rarity = data?.tier || 'UNKNOWN'; + this.startingBid = data?.starting_bid || 0; + this.highestBid = this.bin ? data.starting_bid : data.highest_bid_amount || 0; + this.bids = (data?.bids || []).map((bid: any) => new SkyBlockAuctionBid(bid)); + this.claimed = data.claimed || false; + this.claimedBidders = this.claimed ? data.claimed_bidders : []; + } + + override toString(): string { + return this.item; + } +} + +export default SkyBlockAuction; diff --git a/src/Structures/SkyBlock/Auctions/SkyBlockAuctionBid.test.ts b/src/Structures/SkyBlock/Auctions/SkyBlockAuctionBid.test.ts new file mode 100644 index 000000000..3fe6ee30d --- /dev/null +++ b/src/Structures/SkyBlock/Auctions/SkyBlockAuctionBid.test.ts @@ -0,0 +1,26 @@ +import SkyBlockAuctionBid from './SkyBlockAuctionBid.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { UUID } from '../../../Types/Global.js'; + +test('SkyBlockAuctionBid', () => { + const data = new SkyBlockAuctionBid({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockAuctionBid); + expectTypeOf(data).toEqualTypeOf(); + expect(data.auctionId).toBeDefined(); + expectTypeOf(data.auctionId).toEqualTypeOf(); + expect(data.profileId).toBeDefined(); + expectTypeOf(data.profileId).toEqualTypeOf(); + expect(data.amount).toBeDefined(); + expectTypeOf(data.amount).toEqualTypeOf(); + expect(data.timestamp).toBeDefined(); + expectTypeOf(data.timestamp).toEqualTypeOf(); + expect(data.at).toBeDefined(); + expectTypeOf(data.at).toEqualTypeOf(); + expect(data.bidder).toBeDefined(); + expectTypeOf(data.bidder).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Auctions/SkyBlockAuctionBid.ts b/src/Structures/SkyBlock/Auctions/SkyBlockAuctionBid.ts new file mode 100644 index 000000000..bae501858 --- /dev/null +++ b/src/Structures/SkyBlock/Auctions/SkyBlockAuctionBid.ts @@ -0,0 +1,24 @@ +import type { UUID } from '../../../Types/Global.js'; + +class SkyBlockAuctionBid { + auctionId: UUID | 'UNKNOWN'; + profileId: UUID | 'UNKNOWN'; + amount: number; + timestamp: number; + at: Date; + bidder: string; + constructor(data: Record) { + this.auctionId = data?.auction_id || 'UNKNOWN'; + this.profileId = data?.profile_id || 'UNKNOWN'; + this.amount = data?.amount || 0; + this.timestamp = data?.timestamp || 0; + this.at = new Date(this.timestamp); + this.bidder = data?.bidder || 'UNKNOWN'; + } + + toString(): number { + return this.amount; + } +} + +export default SkyBlockAuctionBid; diff --git a/src/Structures/SkyBlock/Auctions/SkyBlockAuctionInfo.test.ts b/src/Structures/SkyBlock/Auctions/SkyBlockAuctionInfo.test.ts new file mode 100644 index 000000000..a0c5b9dd3 --- /dev/null +++ b/src/Structures/SkyBlock/Auctions/SkyBlockAuctionInfo.test.ts @@ -0,0 +1,15 @@ +import SkyBlockAuctionsInfo from './SkyBlockAuctionInfo.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockAuctionsInfo', () => { + const data = new SkyBlockAuctionsInfo({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockAuctionsInfo); + expectTypeOf(data).toEqualTypeOf(); + expect(data.page).toBeDefined(); + expectTypeOf(data.page).toEqualTypeOf(); + expect(data.totalPages).toBeDefined(); + expectTypeOf(data.totalPages).toEqualTypeOf(); + expect(data.totalAuctions).toBeDefined(); + expectTypeOf(data.totalAuctions).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Auctions/SkyBlockAuctionInfo.ts b/src/Structures/SkyBlock/Auctions/SkyBlockAuctionInfo.ts new file mode 100644 index 000000000..68ac01ee8 --- /dev/null +++ b/src/Structures/SkyBlock/Auctions/SkyBlockAuctionInfo.ts @@ -0,0 +1,15 @@ +import SkyBlockBaseAuctionInfo from './SkyBlockBaseAuctionInfo.js'; + +class SkyBlockAuctionInfo extends SkyBlockBaseAuctionInfo { + page: number; + totalPages: number; + totalAuctions: number; + constructor(data: Record) { + super(data); + this.page = data?.page || 0; + this.totalPages = data?.totalPages || 0; + this.totalAuctions = data?.totalAuctions || 0; + } +} + +export default SkyBlockAuctionInfo; diff --git a/src/Structures/SkyBlock/Auctions/SkyBlockBaseAuction.test.ts b/src/Structures/SkyBlock/Auctions/SkyBlockBaseAuction.test.ts new file mode 100644 index 000000000..3a3971fe9 --- /dev/null +++ b/src/Structures/SkyBlock/Auctions/SkyBlockBaseAuction.test.ts @@ -0,0 +1,45 @@ +import ItemBytes from '../../ItemBytes.js'; +import SkyBlockBaseAuction from './SkyBlockBaseAuction.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockBaseAuction (ItemBytes False)', () => { + const data = new SkyBlockBaseAuction({ stats: 'meow' }, false); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockBaseAuction); + expectTypeOf(data).toEqualTypeOf(); + expect(data.auctionId).toBeDefined(); + expectTypeOf(data.auctionId).toEqualTypeOf(); + expect(data.auctioneerUuid).toBeDefined(); + expectTypeOf(data.auctioneerUuid).toEqualTypeOf(); + expect(data.auctioneerProfile).toBeDefined(); + expectTypeOf(data.auctioneerProfile).toEqualTypeOf(); + expect(data.bin).toBeDefined(); + expectTypeOf(data.bin).toEqualTypeOf(); + expect(data.itemBytes).toBeDefined(); + expectTypeOf(data.itemBytes).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string>(); + expect(data.toString()).toBeDefined(); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); + +test('SkyBlockBaseAuction (ItemBytes True)', () => { + const data = new SkyBlockBaseAuction({ stats: 'meow' }, true); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockBaseAuction); + expectTypeOf(data).toEqualTypeOf(); + expect(data.auctionId).toBeDefined(); + expectTypeOf(data.auctionId).toEqualTypeOf(); + expect(data.auctioneerUuid).toBeDefined(); + expectTypeOf(data.auctioneerUuid).toEqualTypeOf(); + expect(data.auctioneerProfile).toBeDefined(); + expectTypeOf(data.auctioneerProfile).toEqualTypeOf(); + expect(data.bin).toBeDefined(); + expectTypeOf(data.bin).toEqualTypeOf(); + expect(data.itemBytes).toBeDefined(); + expectTypeOf(data.itemBytes).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string>(); + expect(data.toString()).toBeDefined(); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Auctions/SkyBlockBaseAuction.ts b/src/Structures/SkyBlock/Auctions/SkyBlockBaseAuction.ts new file mode 100644 index 000000000..d33a292ad --- /dev/null +++ b/src/Structures/SkyBlock/Auctions/SkyBlockBaseAuction.ts @@ -0,0 +1,22 @@ +import ItemBytes from '../../ItemBytes.js'; + +class SkyBlockBaseAuction { + auctionId: string; + auctioneerUuid: string; + auctioneerProfile: string; + bin: boolean; + itemBytes: ItemBytes | null; + constructor(data: Record, includeItemBytes: boolean) { + this.auctionId = data.uuid || data.auction_id || 'UNKNOWN'; + this.auctioneerUuid = data.auctioneer || data.seller || 'UNKNOWN'; + this.auctioneerProfile = data.profile_id || data.seller_profile || 'UNKNOWN'; + this.bin = data?.bin || false; + this.itemBytes = includeItemBytes ? new ItemBytes(data.item_bytes || 'UNKNOWN') : null; + } + + toString(): string { + return this.auctionId; + } +} + +export default SkyBlockBaseAuction; diff --git a/src/Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.test.ts b/src/Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.test.ts new file mode 100644 index 000000000..304609429 --- /dev/null +++ b/src/Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.test.ts @@ -0,0 +1,13 @@ +import SkyBlockBaseAuctionInfo from './SkyBlockBaseAuctionInfo.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockBaseAuctionInfo', () => { + const data = new SkyBlockBaseAuctionInfo({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockBaseAuctionInfo); + expectTypeOf(data).toEqualTypeOf(); + expect(data.lastUpdatedTimestamp).toBeDefined(); + expectTypeOf(data.lastUpdatedTimestamp).toEqualTypeOf(); + expect(data.lastUpdatedAt).toBeDefined(); + expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.ts b/src/Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.ts new file mode 100644 index 000000000..bb71ec3d1 --- /dev/null +++ b/src/Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.ts @@ -0,0 +1,10 @@ +class SkyBlockBaseAuctionInfo { + lastUpdatedTimestamp: number; + lastUpdatedAt: Date; + constructor(data: Record) { + this.lastUpdatedTimestamp = data?.lastUpdated || 0; + this.lastUpdatedAt = new Date(this.lastUpdatedTimestamp); + } +} + +export default SkyBlockBaseAuctionInfo; diff --git a/src/Structures/SkyBlock/Bazaar/Order.test.ts b/src/Structures/SkyBlock/Bazaar/Order.test.ts deleted file mode 100644 index 87884a135..000000000 --- a/src/Structures/SkyBlock/Bazaar/Order.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import Order from './Order.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('Order', () => { - const data = new Order({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(Order); - expectTypeOf(data).toEqualTypeOf(); - expect(data.amount).toBeDefined(); - expect(data.amount).toBeGreaterThanOrEqual(0); - expectTypeOf(data.amount).toEqualTypeOf(); - expect(data.pricePerUnit).toBeDefined(); - expect(data.pricePerUnit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.pricePerUnit).toEqualTypeOf(); - expect(data.totalPrice).toBeDefined(); - expect(data.totalPrice).toBeGreaterThanOrEqual(0); - expectTypeOf(data.totalPrice).toEqualTypeOf(); - expect(data.orders).toBeDefined(); - expect(data.orders).toBeGreaterThanOrEqual(0); - expectTypeOf(data.orders).toEqualTypeOf(); - expect(data.toString()).toBeDefined(); - expectTypeOf(data.toString()).toEqualTypeOf(); - expect(data.toString()).toBe(data.totalPrice); -}); diff --git a/src/Structures/SkyBlock/Bazaar/Order.ts b/src/Structures/SkyBlock/Bazaar/Order.ts deleted file mode 100644 index 00dcf54f4..000000000 --- a/src/Structures/SkyBlock/Bazaar/Order.ts +++ /dev/null @@ -1,18 +0,0 @@ -class Order { - amount: number; - pricePerUnit: number; - totalPrice: number; - orders: number; - constructor(data: Record) { - this.amount = data.amount || 0; - this.pricePerUnit = data.pricePerUnit || 0; - this.totalPrice = Math.round(this.amount * this.pricePerUnit * 10) / 10; - this.orders = data.orders || 0; - } - - toString(): number { - return this.totalPrice; - } -} - -export default Order; diff --git a/src/Structures/SkyBlock/Bazaar/Product.test.ts b/src/Structures/SkyBlock/Bazaar/Product.test.ts deleted file mode 100644 index 34196588d..000000000 --- a/src/Structures/SkyBlock/Bazaar/Product.test.ts +++ /dev/null @@ -1,50 +0,0 @@ -import Product from './Product.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('Product', () => { - const data = new Product({ - /* eslint-disable camelcase */ - product_id: 'INK_SACK:3', - sell_summary: [ - { amount: 133865, pricePerUnit: 1.4, orders: 2 }, - { amount: 816353, pricePerUnit: 1.3, orders: 12 }, - { amount: 71680, pricePerUnit: 1.1, orders: 3 } - ], - buy_summary: [ - { amount: 46654, pricePerUnit: 4, orders: 1 }, - { amount: 71680, pricePerUnit: 5.5, orders: 1 }, - { amount: 20657, pricePerUnit: 6.9, orders: 2 }, - { amount: 30618, pricePerUnit: 7, orders: 2 }, - { amount: 53616, pricePerUnit: 7.6, orders: 1 }, - { amount: 249908, pricePerUnit: 7.7, orders: 4 }, - { amount: 203944, pricePerUnit: 7.8, orders: 12 }, - { amount: 36816, pricePerUnit: 7.9, orders: 1 }, - { amount: 92527, pricePerUnit: 8, orders: 5 }, - { amount: 53129, pricePerUnit: 8.3, orders: 2 }, - { amount: 11165, pricePerUnit: 8.4, orders: 1 }, - { amount: 184653, pricePerUnit: 8.5, orders: 4 }, - { amount: 22548, pricePerUnit: 8.6, orders: 1 }, - { amount: 949628, pricePerUnit: 8.7, orders: 14 }, - { amount: 81014, pricePerUnit: 8.8, orders: 2 }, - { amount: 13239, pricePerUnit: 8.9, orders: 2 }, - { amount: 351416, pricePerUnit: 9.7, orders: 6 }, - { amount: 779336, pricePerUnit: 9.8, orders: 12 } - ], - quick_status: { - productId: 'INK_SACK:3', - sellPrice: 1.4, - sellVolume: 1421724, - sellMovingWeek: 85720502, - sellOrders: 24, - buyPrice: 5.204576555316532, - buyVolume: 6646255, - buyMovingWeek: 39972807, - buyOrders: 152 - } - /* eslint-enable camelcase */ - }); - - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(Product); - expectTypeOf(data).toEqualTypeOf(); -}); diff --git a/src/Structures/SkyBlock/Bazaar/Product.ts b/src/Structures/SkyBlock/Bazaar/Product.ts deleted file mode 100644 index 02ee5743b..000000000 --- a/src/Structures/SkyBlock/Bazaar/Product.ts +++ /dev/null @@ -1,26 +0,0 @@ -import Order from './Order.js'; -import type { ProductStatus } from '../../../Types/Skyblock.js'; - -class Product { - productId: string; - sellSummary: Order[]; - buySummary: Order[]; - status: ProductStatus; - constructor(data: Record) { - this.productId = data.product_id; - this.sellSummary = data.sell_summary.map((sellOrder: Record) => new Order(sellOrder)); - this.buySummary = data.buy_summary.map((buyOrder: Record) => new Order(buyOrder)); - this.status = { - sellPrice: Math.round(data.quick_status.sellPrice * 100) / 100, - buyPrice: Math.round(data.quick_status.buyPrice * 100) / 100, - sellVolume: data.quick_status.sellVolume, - buyVolume: data.quick_status.buyVolume, - sellMovingWeek: data.quick_status.sellMovingWeek, - buyMovingWeek: data.quick_status.buyMovingWeek, - sellOrders: data.quick_status.sellOrders, - buyOrders: data.quick_status.buyOrders - }; - } -} - -export default Product; diff --git a/src/Structures/SkyBlock/Bazaar/SkyBlockBazaar.test.ts b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaar.test.ts new file mode 100644 index 000000000..ff1d7ef5f --- /dev/null +++ b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaar.test.ts @@ -0,0 +1,26 @@ +import SkyBlockBazaar from './SkyBlockBazaar.js'; +import SkyBlockBazaarProduct from './SkyBlockBazaarProduct.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { BazaarProduct } from '../../../Types/SkyBlock.js'; + +test('SkyBlockBazaar', () => { + const data = new SkyBlockBazaar({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockBazaar); + expectTypeOf(data).toEqualTypeOf(); + expect(data.lastUpdated).toBeDefined(); + expectTypeOf(data.lastUpdated).toEqualTypeOf(); + expect(data.lastUpdatedAt).toBeDefined(); + expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); + expect(data.products).toBeDefined(); + expectTypeOf(data.products).toEqualTypeOf(); + data.products.forEach((product) => { + expect(product).toBeDefined(); + expect(product).toBeInstanceOf(SkyBlockBazaarProduct); + expectTypeOf(product).toEqualTypeOf(); + expect(product.toString).toBeDefined(); + expectTypeOf(product.toString).toEqualTypeOf<() => BazaarProduct | 'UNKNOWN'>(); + expect(product.toString()).toBeDefined(); + expectTypeOf(product.toString()).toEqualTypeOf(); + }); +}); diff --git a/src/Structures/SkyBlock/Bazaar/SkyBlockBazaar.ts b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaar.ts new file mode 100644 index 000000000..d7bb6334a --- /dev/null +++ b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaar.ts @@ -0,0 +1,15 @@ +import SkyBlockBazaarProduct from './SkyBlockBazaarProduct.js'; + +class SkyBlockBazaar { + lastUpdated: number; + lastUpdatedAt: Date; + products: SkyBlockBazaarProduct[]; + constructor(data: Record) { + this.lastUpdated = data?.lastUpdated || 0; + this.lastUpdatedAt = new Date(this.lastUpdated); + const products = data?.products || {}; + this.products = Object.keys(products).map((product) => new SkyBlockBazaarProduct(products[product])); + } +} + +export default SkyBlockBazaar; diff --git a/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarProduct.test.ts b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarProduct.test.ts new file mode 100644 index 000000000..b143f58bc --- /dev/null +++ b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarProduct.test.ts @@ -0,0 +1,24 @@ +import SkyBlockBazaarProduct from './SkyBlockBazaarProduct.js'; +import SkyBlockBazaarProductOrder from './SkyBlockBazaarProductOrder.js'; +import SkyBlockBazaarQuickStatus from './SkyBlockBazaarQuickStatus.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { BazaarProduct } from '../../../Types/SkyBlock.js'; + +test('SkyBlockBazaarProduct', () => { + const data = new SkyBlockBazaarProduct({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockBazaarProduct); + expectTypeOf(data).toEqualTypeOf(); + expect(data.productId).toBeDefined(); + expectTypeOf(data.productId).toEqualTypeOf(); + expect(data.sellSummary).toBeDefined(); + expectTypeOf(data.sellSummary).toEqualTypeOf(); + expect(data.buySummary).toBeDefined(); + expectTypeOf(data.buySummary).toEqualTypeOf(); + expect(data.quickStatus).toBeDefined(); + expectTypeOf(data.quickStatus).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => BazaarProduct | 'UNKNOWN'>(); + expect(data.toString()).toBeDefined(); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarProduct.ts b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarProduct.ts new file mode 100644 index 000000000..23a33d41b --- /dev/null +++ b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarProduct.ts @@ -0,0 +1,26 @@ +import SkyBlockBazaarProductOrder from './SkyBlockBazaarProductOrder.js'; +import SkyBlockBazaarQuickStatus from './SkyBlockBazaarQuickStatus.js'; +import type { BazaarProduct } from '../../../Types/SkyBlock.js'; + +class SkyBlockBazaarProduct { + productId: BazaarProduct | 'UNKNOWN'; + sellSummary: SkyBlockBazaarProductOrder[]; + buySummary: SkyBlockBazaarProductOrder[]; + quickStatus: SkyBlockBazaarQuickStatus; + constructor(data: Record) { + this.productId = data?.product_id || 'UNKNOWN'; + this.sellSummary = (data?.sell_summary || []).map( + (summary: Record) => new SkyBlockBazaarProductOrder(summary) + ); + this.buySummary = (data?.buy_summary || []).map( + (summary: Record) => new SkyBlockBazaarProductOrder(summary) + ); + this.quickStatus = new SkyBlockBazaarQuickStatus(data?.quick_status || {}); + } + + toString(): BazaarProduct | 'UNKNOWN' { + return this.productId; + } +} + +export default SkyBlockBazaarProduct; diff --git a/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarProductOrder.test.ts b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarProductOrder.test.ts new file mode 100644 index 000000000..1b40282dd --- /dev/null +++ b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarProductOrder.test.ts @@ -0,0 +1,19 @@ +import SkyBlockBazaarProductOrder from './SkyBlockBazaarProductOrder.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockBazaarProductOrder', () => { + const data = new SkyBlockBazaarProductOrder({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockBazaarProductOrder); + expectTypeOf(data).toEqualTypeOf(); + expect(data.amount).toBeDefined(); + expectTypeOf(data.amount).toEqualTypeOf(); + expect(data.pricePerUnit).toBeDefined(); + expectTypeOf(data.pricePerUnit).toEqualTypeOf(); + expect(data.orders).toBeDefined(); + expectTypeOf(data.orders).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarProductOrder.ts b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarProductOrder.ts new file mode 100644 index 000000000..0ed3b01be --- /dev/null +++ b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarProductOrder.ts @@ -0,0 +1,16 @@ +class SkyBlockBazaarProductOrder { + amount: number; + pricePerUnit: number; + orders: number; + constructor(data: Record) { + this.amount = data?.amount || 0; + this.pricePerUnit = data?.pricePerUnit || 0; + this.orders = data?.orders || 0; + } + + toString(): number { + return this.amount; + } +} + +export default SkyBlockBazaarProductOrder; diff --git a/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarQuickStatus.test.ts b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarQuickStatus.test.ts new file mode 100644 index 000000000..94751729b --- /dev/null +++ b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarQuickStatus.test.ts @@ -0,0 +1,32 @@ +import SkyBlockBazaarQuickStatus from './SkyBlockBazaarQuickStatus.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { BazaarProduct } from '../../../Types/SkyBlock.js'; + +test('SkyBlockBazaarQuickStatus', () => { + const data = new SkyBlockBazaarQuickStatus({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockBazaarQuickStatus); + expectTypeOf(data).toEqualTypeOf(); + expect(data.productId).toBeDefined(); + expectTypeOf(data.productId).toEqualTypeOf(); + expect(data.sellPrice).toBeDefined(); + expectTypeOf(data.sellPrice).toEqualTypeOf(); + expect(data.sellVolume).toBeDefined(); + expectTypeOf(data.sellVolume).toEqualTypeOf(); + expect(data.sellMovingWeek).toBeDefined(); + expectTypeOf(data.sellMovingWeek).toEqualTypeOf(); + expect(data.sellOrders).toBeDefined(); + expectTypeOf(data.sellOrders).toEqualTypeOf(); + expect(data.buyPrice).toBeDefined(); + expectTypeOf(data.buyPrice).toEqualTypeOf(); + expect(data.buyVolume).toBeDefined(); + expectTypeOf(data.buyVolume).toEqualTypeOf(); + expect(data.buyMovingWeek).toBeDefined(); + expectTypeOf(data.buyMovingWeek).toEqualTypeOf(); + expect(data.buyOrders).toBeDefined(); + expectTypeOf(data.buyOrders).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => BazaarProduct | 'UNKNOWN'>(); + expect(data.toString()).toBeDefined(); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarQuickStatus.ts b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarQuickStatus.ts new file mode 100644 index 000000000..afa8ae384 --- /dev/null +++ b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarQuickStatus.ts @@ -0,0 +1,30 @@ +import type { BazaarProduct } from '../../../Types/SkyBlock.js'; + +class SkyBlockBazaarQuickStatus { + productId: BazaarProduct | 'UNKNOWN'; + sellPrice: number; + sellVolume: number; + sellMovingWeek: number; + sellOrders: number; + buyPrice: number; + buyVolume: number; + buyMovingWeek: number; + buyOrders: number; + constructor(data: Record) { + this.productId = data?.productId || 'UNKNOWN'; + this.sellPrice = data?.sellPrice || 0; + this.sellVolume = data?.sellVolume || 0; + this.sellMovingWeek = data?.sellMovingWeek || 0; + this.sellOrders = data?.sellOrders || 0; + this.buyPrice = data?.buyPrice || 0; + this.buyVolume = data?.buyVolume || 0; + this.buyMovingWeek = data?.buyMovingWeek || 0; + this.buyOrders = data?.buyOrders || 0; + } + + toString(): BazaarProduct | 'UNKNOWN' { + return this.productId; + } +} + +export default SkyBlockBazaarQuickStatus; diff --git a/src/Structures/SkyBlock/Bingo/SkyBlockBingo.test.ts b/src/Structures/SkyBlock/Bingo/SkyBlockBingo.test.ts new file mode 100644 index 000000000..cd272fd0b --- /dev/null +++ b/src/Structures/SkyBlock/Bingo/SkyBlockBingo.test.ts @@ -0,0 +1,34 @@ +import SkyBlockBingo from './SkyBlockBingo.js'; +import SkyBlockBingoGoal from './SkyBlockBingoGoal.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockBingo', () => { + const data = new SkyBlockBingo({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockBingo); + expectTypeOf(data).toEqualTypeOf(); + + expect(data.lastUpdatedTimestamp).toBeDefined(); + expectTypeOf(data.lastUpdatedTimestamp).toEqualTypeOf(); + expect(data.lastUpdatedAt).toBeDefined(); + expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); + expect(data.id).toBeDefined(); + expectTypeOf(data.id).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.start).toBeDefined(); + expectTypeOf(data.start).toEqualTypeOf(); + expect(data.startAt).toBeDefined(); + expectTypeOf(data.startAt).toEqualTypeOf(); + expect(data.end).toBeDefined(); + expectTypeOf(data.end).toEqualTypeOf(); + expect(data.endAt).toBeDefined(); + expectTypeOf(data.endAt).toEqualTypeOf(); + expect(data.goals).toBeDefined(); + expectTypeOf(data.goals).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number | null>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.id); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Bingo/SkyBlockBingo.ts b/src/Structures/SkyBlock/Bingo/SkyBlockBingo.ts new file mode 100644 index 000000000..bb390a130 --- /dev/null +++ b/src/Structures/SkyBlock/Bingo/SkyBlockBingo.ts @@ -0,0 +1,30 @@ +import SkyBlockBingoGoal from './SkyBlockBingoGoal.js'; + +class SkyBlockBingo { + lastUpdatedTimestamp: number; + lastUpdatedAt: Date; + id: number | null; + name: string; + start: number; + startAt: Date; + end: number; + endAt: Date; + goals: SkyBlockBingoGoal[] | null; + constructor(data: Record) { + this.lastUpdatedTimestamp = data?.lastUpdated || 0; + this.lastUpdatedAt = new Date(this.lastUpdatedTimestamp); + this.id = data?.id || null; + this.name = data?.name || 'UNKNOWN'; + this.start = data?.start || 0; + this.startAt = new Date(this.start); + this.end = data?.end || 0; + this.endAt = new Date(this.end); + this.goals = Array.isArray(data.goals) ? data.goals.map((goal, index) => new SkyBlockBingoGoal(goal, index)) : null; + } + + toString(): number | null { + return this.id; + } +} + +export default SkyBlockBingo; diff --git a/src/Structures/SkyBlock/Bingo/SkyBlockBingoGoal.test.ts b/src/Structures/SkyBlock/Bingo/SkyBlockBingoGoal.test.ts new file mode 100644 index 000000000..e9662d5db --- /dev/null +++ b/src/Structures/SkyBlock/Bingo/SkyBlockBingoGoal.test.ts @@ -0,0 +1,33 @@ +import SkyBlockBingoGoal from './SkyBlockBingoGoal.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { SkyBlockBingoGoalType } from '../../../Types/SkyBlock.js'; + +test('SkyBlockBingoGoal', () => { + const data = new SkyBlockBingoGoal({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockBingoGoal); + expectTypeOf(data).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.id).toBeDefined(); + expectTypeOf(data.id).toEqualTypeOf(); + expect(data.row).toBeDefined(); + expectTypeOf(data.row).toEqualTypeOf(); + expect(data.column).toBeDefined(); + expectTypeOf(data.column).toEqualTypeOf(); + expect(data.lore).toBeDefined(); + expectTypeOf(data.lore).toEqualTypeOf(); + expect(data.progress).toBeDefined(); + expectTypeOf(data.progress).toEqualTypeOf(); + expect(data.tiers).toBeDefined(); + expectTypeOf(data.tiers).toEqualTypeOf(); + expect(data.requiredAmount).toBeDefined(); + expectTypeOf(data.requiredAmount).toEqualTypeOf(); + expect(data.type).toBeDefined(); + expectTypeOf(data.type).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.id); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Bingo/SkyBlockBingoGoal.ts b/src/Structures/SkyBlock/Bingo/SkyBlockBingoGoal.ts new file mode 100644 index 000000000..d8aac7fa0 --- /dev/null +++ b/src/Structures/SkyBlock/Bingo/SkyBlockBingoGoal.ts @@ -0,0 +1,37 @@ +import type { SkyBlockBingoGoalType } from '../../../Types/SkyBlock.js'; + +function parsePosition(position: number): [number, number] { + const x = (position % 5) + 1; + const y = Math.floor(position / 5) + 1; + return [x, y]; +} + +class SkyBlockBingoGoal { + name: string; + id: string; + row: number | null; + column: number | null; + lore: string; + progress: number; + tiers: number[]; + requiredAmount: number | null; + type: SkyBlockBingoGoalType; + constructor(data: Record, position: number = 0) { + this.id = data?.id || 'UNKNOWN'; + this.name = data?.name || 'UNKNOWN'; + const [row, column] = parsePosition(position); + this.row = row; + this.column = column; + this.lore = data?.lore || 'UNKNOWN'; + this.progress = data?.progress || 0; + this.tiers = Array.isArray(data.tiers) ? data.tiers.map((x) => parseInt(x, 10) || 0) : []; + this.requiredAmount = parseInt(data.requiredAmount, 10) ?? null; + this.type = this.tiers ? 'TIERED' : this.requiredAmount ? 'ONE_TIER' : 'ONE_TIME'; + } + + toString(): string { + return this.id; + } +} + +export default SkyBlockBingoGoal; diff --git a/src/Structures/SkyBlock/Collections/SkyBlockCollection.test.ts b/src/Structures/SkyBlock/Collections/SkyBlockCollection.test.ts new file mode 100644 index 000000000..6317b0b66 --- /dev/null +++ b/src/Structures/SkyBlock/Collections/SkyBlockCollection.test.ts @@ -0,0 +1,23 @@ +import SkyBlockCollection from './SkyBlockCollection.js'; +import SkyBlockCollectionTier from './SkyBlockCollectionTier.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockCollection', () => { + const data = new SkyBlockCollection({ stats: 'meow' }, 'a'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockCollection); + expectTypeOf(data).toEqualTypeOf(); + expect(data.id).toBeDefined(); + expectTypeOf(data.id).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.maxTiers).toBeDefined(); + expectTypeOf(data.maxTiers).toEqualTypeOf(); + expect(data.tiers).toBeDefined(); + expectTypeOf(data.tiers).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.id); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Collections/SkyBlockCollection.ts b/src/Structures/SkyBlock/Collections/SkyBlockCollection.ts new file mode 100644 index 000000000..2072ae859 --- /dev/null +++ b/src/Structures/SkyBlock/Collections/SkyBlockCollection.ts @@ -0,0 +1,20 @@ +import SkyBlockCollectionTier from './SkyBlockCollectionTier.js'; + +class SkyBlockCollection { + id: string; + name: string; + maxTiers: number; + tiers: SkyBlockCollectionTier[]; + constructor(data: Record, id: string) { + this.id = id; + this.name = data?.name || 'UNKNOWN'; + this.maxTiers = data?.maxTiers || 0; + this.tiers = (data?.tiers || []).map((tier: Record) => new SkyBlockCollectionTier(tier)); + } + + toString(): string { + return this.id; + } +} + +export default SkyBlockCollection; diff --git a/src/Structures/SkyBlock/Collections/SkyBlockCollectionTier.test.ts b/src/Structures/SkyBlock/Collections/SkyBlockCollectionTier.test.ts new file mode 100644 index 000000000..4caf0784e --- /dev/null +++ b/src/Structures/SkyBlock/Collections/SkyBlockCollectionTier.test.ts @@ -0,0 +1,16 @@ +import SkyBlockCollectionTier from './SkyBlockCollectionTier.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockCollectionTier', () => { + const data = new SkyBlockCollectionTier({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockCollectionTier); + expectTypeOf(data).toEqualTypeOf(); + + expect(data.tier).toBeDefined(); + expectTypeOf(data.tier).toEqualTypeOf(); + expect(data.amountRequired).toBeDefined(); + expectTypeOf(data.amountRequired).toEqualTypeOf(); + expect(data.unlocks).toBeDefined(); + expectTypeOf(data.unlocks).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Collections/SkyBlockCollectionTier.ts b/src/Structures/SkyBlock/Collections/SkyBlockCollectionTier.ts new file mode 100644 index 000000000..d0eda1e87 --- /dev/null +++ b/src/Structures/SkyBlock/Collections/SkyBlockCollectionTier.ts @@ -0,0 +1,12 @@ +class SkyBlockCollectionTier { + tier: number; + amountRequired: number; + unlocks: string[]; + constructor(data: Record) { + this.tier = data?.tier || 0; + this.amountRequired = data?.amountRequired || 0; + this.unlocks = data?.unlocks || []; + } +} + +export default SkyBlockCollectionTier; diff --git a/src/Structures/SkyBlock/Collections/SkyBlockCollections.test.ts b/src/Structures/SkyBlock/Collections/SkyBlockCollections.test.ts new file mode 100644 index 000000000..f7fefa64d --- /dev/null +++ b/src/Structures/SkyBlock/Collections/SkyBlockCollections.test.ts @@ -0,0 +1,35 @@ +import SkyBlockCollection from './SkyBlockCollection.js'; +import SkyBlockCollections from './SkyBlockCollections.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockCollections', () => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + const data = new SkyBlockCollections(); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockCollections); + expectTypeOf(data).toEqualTypeOf(); + expect(data.lastUpdated).toBeDefined(); + expectTypeOf(data.lastUpdated).toEqualTypeOf(); + expect(data.lastUpdatedAt).toBeDefined(); + expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); + expect(data.version).toBeDefined(); + expectTypeOf(data.version).toEqualTypeOf(); + expect(data.farming).toBeDefined(); + expectTypeOf(data.farming).toEqualTypeOf(); + expect(data.mining).toBeDefined(); + expectTypeOf(data.mining).toEqualTypeOf(); + expect(data.combat).toBeDefined(); + expectTypeOf(data.combat).toEqualTypeOf(); + expect(data.foraging).toBeDefined(); + expectTypeOf(data.foraging).toEqualTypeOf(); + expect(data.fishing).toBeDefined(); + expectTypeOf(data.fishing).toEqualTypeOf(); + expect(data.rift).toBeDefined(); + expectTypeOf(data.rift).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.version); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Collections/SkyBlockCollections.ts b/src/Structures/SkyBlock/Collections/SkyBlockCollections.ts new file mode 100644 index 000000000..acc914ee4 --- /dev/null +++ b/src/Structures/SkyBlock/Collections/SkyBlockCollections.ts @@ -0,0 +1,48 @@ +import SkyBlockCollection from './SkyBlockCollection.js'; + +class SkyBlockCollections { + lastUpdated: number; + lastUpdatedAt: Date; + version: string; + farming: SkyBlockCollection[]; + mining: SkyBlockCollection[]; + combat: SkyBlockCollection[]; + foraging: SkyBlockCollection[]; + fishing: SkyBlockCollection[]; + rift: SkyBlockCollection[]; + constructor(data: Record) { + this.lastUpdated = data?.lastUpdated || 0; + this.lastUpdatedAt = new Date(this.lastUpdated); + this.version = data?.version || 'UNKNOWN'; + const farmingCollections = data?.collections?.FARMING?.items || {}; + this.farming = Object.keys(farmingCollections).map( + (collection) => new SkyBlockCollection(farmingCollections?.[collection], collection) + ); + const miningCollections = data?.collections?.MINING?.items || {}; + this.mining = Object.keys(miningCollections).map( + (collection) => new SkyBlockCollection(miningCollections?.[collection], collection) + ); + const combatCollections = data?.collections?.COMBAT?.items || {}; + this.combat = Object.keys(combatCollections).map( + (collection) => new SkyBlockCollection(combatCollections?.[collection], collection) + ); + const foragingCollections = data?.collections?.FORAGING?.items || {}; + this.foraging = Object.keys(foragingCollections).map( + (collection) => new SkyBlockCollection(foragingCollections?.[collection], collection) + ); + const fishingCollections = data?.collections?.FISHING?.items || {}; + this.fishing = Object.keys(fishingCollections).map( + (collection) => new SkyBlockCollection(fishingCollections?.[collection], collection) + ); + const riftCollections = data?.collections?.RIFT?.items || {}; + this.rift = Object.keys(riftCollections).map( + (collection) => new SkyBlockCollection(riftCollections?.[collection], collection) + ); + } + + toString(): string { + return this.version; + } +} + +export default SkyBlockCollections; diff --git a/src/Structures/SkyBlock/Election/SkyBlockElection.test.ts b/src/Structures/SkyBlock/Election/SkyBlockElection.test.ts new file mode 100644 index 000000000..0443b79a8 --- /dev/null +++ b/src/Structures/SkyBlock/Election/SkyBlockElection.test.ts @@ -0,0 +1,24 @@ +import SkyBlockElection from './SkyBlockElection.js'; +import SkyBlockElectionCandidate from './SkyBlockElectionCandidate.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockElection', () => { + const data = new SkyBlockElection({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockElection); + expectTypeOf(data).toEqualTypeOf(); + expect(data.year).toBeDefined(); + expectTypeOf(data.year).toEqualTypeOf(); + expect(data.candidates).toBeDefined(); + expectTypeOf(data.candidates).toEqualTypeOf(); + data.candidates.forEach((candidate) => { + expect(candidate).toBeDefined(); + expect(candidate).toBeInstanceOf(SkyBlockElectionCandidate); + expectTypeOf(candidate).toEqualTypeOf(); + }); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.year); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Election/SkyBlockElection.ts b/src/Structures/SkyBlock/Election/SkyBlockElection.ts new file mode 100644 index 000000000..6ff1ec0db --- /dev/null +++ b/src/Structures/SkyBlock/Election/SkyBlockElection.ts @@ -0,0 +1,18 @@ +import SkyBlockElectionCandidate from './SkyBlockElectionCandidate.js'; + +class SkyBlockElection { + year: number; + candidates: SkyBlockElectionCandidate[]; + constructor(data: Record) { + this.year = data?.year || 0; + this.candidates = (data?.candidates || []) + .map((candidate: Record) => new SkyBlockElectionCandidate(candidate)) + .sort((a: SkyBlockElectionCandidate, b: SkyBlockElectionCandidate) => a.votesReceived - b.votesReceived); + } + + toString(): number { + return this.year; + } +} + +export default SkyBlockElection; diff --git a/src/Structures/SkyBlock/Election/SkyBlockElectionCandidate.test.ts b/src/Structures/SkyBlock/Election/SkyBlockElectionCandidate.test.ts new file mode 100644 index 000000000..1b46b4f6b --- /dev/null +++ b/src/Structures/SkyBlock/Election/SkyBlockElectionCandidate.test.ts @@ -0,0 +1,24 @@ +import SkyBlockElectionCandidate from './SkyBlockElectionCandidate.js'; +import SkyBlockElectionCandidatePerk from './SkyBlockElectionCandidatePerk.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { SkyBlockCandidateKeyBenefit, SkyBlockMayor } from '../../../Types/SkyBlock.js'; + +test('SkyBlockElectionCandidate', () => { + const data = new SkyBlockElectionCandidate({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockElectionCandidate); + expectTypeOf(data).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.keyBenefit).toBeDefined(); + expectTypeOf(data.keyBenefit).toEqualTypeOf(); + expect(data.perks).toBeDefined(); + expectTypeOf(data.perks).toEqualTypeOf(); + expect(data.votesReceived).toBeDefined(); + expectTypeOf(data.votesReceived).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => SkyBlockMayor | 'UNKNOWN'>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.name); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Election/SkyBlockElectionCandidate.ts b/src/Structures/SkyBlock/Election/SkyBlockElectionCandidate.ts new file mode 100644 index 000000000..d552ebe13 --- /dev/null +++ b/src/Structures/SkyBlock/Election/SkyBlockElectionCandidate.ts @@ -0,0 +1,21 @@ +import SkyBlockElectionCandidatePerk from './SkyBlockElectionCandidatePerk.js'; +import type { SkyBlockCandidateKeyBenefit, SkyBlockMayor } from '../../../Types/SkyBlock.js'; + +class SkyBlockElectronCandidate { + name: SkyBlockMayor | 'UNKNOWN'; + keyBenefit: SkyBlockCandidateKeyBenefit | 'UNKNOWN'; + perks: SkyBlockElectionCandidatePerk[]; + votesReceived: number; + constructor(data: Record) { + this.name = data?.name || 'UNKNOWN'; + this.keyBenefit = data?.key || 'UNKNOWN'; + this.perks = (data?.perks || []).map((perk: Record) => new SkyBlockElectionCandidatePerk(perk)); + this.votesReceived = data?.votes || 0; + } + + toString(): SkyBlockMayor | 'UNKNOWN' { + return this.name; + } +} + +export default SkyBlockElectronCandidate; diff --git a/src/Structures/SkyBlock/Election/SkyBlockElectionCandidatePerk.test.ts b/src/Structures/SkyBlock/Election/SkyBlockElectionCandidatePerk.test.ts new file mode 100644 index 000000000..d5b771111 --- /dev/null +++ b/src/Structures/SkyBlock/Election/SkyBlockElectionCandidatePerk.test.ts @@ -0,0 +1,20 @@ +import SkyBlockElectionCandidatePerk from './SkyBlockElectionCandidatePerk.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockElectionCandidatePerk', () => { + const data = new SkyBlockElectionCandidatePerk({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockElectionCandidatePerk); + expectTypeOf(data).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.description).toBeDefined(); + expectTypeOf(data.description).toEqualTypeOf(); + expect(data.minister).toBeDefined(); + expectTypeOf(data.minister).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.name); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Election/SkyBlockElectionCandidatePerk.ts b/src/Structures/SkyBlock/Election/SkyBlockElectionCandidatePerk.ts new file mode 100644 index 000000000..e7fc98467 --- /dev/null +++ b/src/Structures/SkyBlock/Election/SkyBlockElectionCandidatePerk.ts @@ -0,0 +1,16 @@ +class SkyBlockElectionCandidatePerk { + name: string; + description: string; + minister: boolean; + constructor(data: Record) { + this.name = data?.name || 'UNKNOWN'; + this.description = data?.description || 'UNKNOWN'; + this.minister = data?.minister || false; + } + + toString(): string { + return this.name; + } +} + +export default SkyBlockElectionCandidatePerk; diff --git a/src/Structures/SkyBlock/Election/SkyBlockElectionData.test.ts b/src/Structures/SkyBlock/Election/SkyBlockElectionData.test.ts new file mode 100644 index 000000000..d8e7dd77b --- /dev/null +++ b/src/Structures/SkyBlock/Election/SkyBlockElectionData.test.ts @@ -0,0 +1,18 @@ +import SkyBlockElection from './SkyBlockElection.js'; +import SkyBlockElectionData from './SkyBlockElectionData.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockElectionData', () => { + const data = new SkyBlockElectionData({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockElectionData); + expectTypeOf(data).toEqualTypeOf(); + expect(data.lastUpdatedTimestamp).toBeDefined(); + expectTypeOf(data.lastUpdatedTimestamp).toEqualTypeOf(); + expect(data.lastUpdatedAt).toBeDefined(); + expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); + expect(data.lastElectionResults).toBeDefined(); + expectTypeOf(data.lastElectionResults).toEqualTypeOf(); + expect(data.currentElection).toBeDefined(); + expectTypeOf(data.currentElection).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Election/SkyBlockElectionData.ts b/src/Structures/SkyBlock/Election/SkyBlockElectionData.ts new file mode 100644 index 000000000..468c6a4dd --- /dev/null +++ b/src/Structures/SkyBlock/Election/SkyBlockElectionData.ts @@ -0,0 +1,16 @@ +import SkyBlockElection from './SkyBlockElection.js'; + +class SkyBlockElectionData { + lastUpdatedTimestamp: number; + lastUpdatedAt: Date; + lastElectionResults: SkyBlockElection; + currentElection: SkyBlockElection | null; + constructor(data: Record) { + this.lastUpdatedTimestamp = data?.lastUpdated || 0; + this.lastUpdatedAt = new Date(this.lastUpdatedTimestamp); + this.lastElectionResults = new SkyBlockElection(data?.mayor?.election || {}); + this.currentElection = data?.current ? new SkyBlockElection(data?.current || {}) : null; + } +} + +export default SkyBlockElectionData; diff --git a/src/Structures/SkyBlock/FireSale/SkyBlockFireSale.test.ts b/src/Structures/SkyBlock/FireSale/SkyBlockFireSale.test.ts new file mode 100644 index 000000000..e18a7078a --- /dev/null +++ b/src/Structures/SkyBlock/FireSale/SkyBlockFireSale.test.ts @@ -0,0 +1,33 @@ +import SkyBlockFireSale from './SkyBlockFireSale.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockFireSale', () => { + const data = new SkyBlockFireSale({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockFireSale); + expectTypeOf(data).toEqualTypeOf(); + expect(data.itemId).toBeDefined(); + expectTypeOf(data.itemId).toEqualTypeOf(); + expect(data.startTimestamp).toBeDefined(); + expectTypeOf(data.startTimestamp).toEqualTypeOf(); + expect(data.startAt).toBeDefined(); + expectTypeOf(data.startAt).toEqualTypeOf(); + expect(data.endTimestamp).toBeDefined(); + expectTypeOf(data.endTimestamp).toEqualTypeOf(); + expect(data.endAt).toBeDefined(); + expectTypeOf(data.endAt).toEqualTypeOf(); + expect(data.amount).toBeDefined(); + expectTypeOf(data.amount).toEqualTypeOf(); + expect(data.price).toBeDefined(); + expectTypeOf(data.price).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.itemId); + expectTypeOf(data.toString()).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.itemId); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Static/FireSale.ts b/src/Structures/SkyBlock/FireSale/SkyBlockFireSale.ts similarity index 56% rename from src/Structures/SkyBlock/Static/FireSale.ts rename to src/Structures/SkyBlock/FireSale/SkyBlockFireSale.ts index acf474880..f3c420d6e 100644 --- a/src/Structures/SkyBlock/Static/FireSale.ts +++ b/src/Structures/SkyBlock/FireSale/SkyBlockFireSale.ts @@ -1,4 +1,4 @@ -class FireSale { +class SkyBlockFireSale { itemId: string; startTimestamp: number; startAt: Date; @@ -7,13 +7,13 @@ class FireSale { amount: number; price: number; constructor(data: Record) { - this.itemId = data.item_id; - this.startTimestamp = parseInt(data.start, 10); + this.itemId = data.item_id || 'UNKNOWN'; + this.startTimestamp = data.start || 0; this.startAt = new Date(this.startTimestamp); - this.endTimestamp = parseInt(data.end, 10); + this.endTimestamp = data.end || 0; this.endAt = new Date(this.endTimestamp); - this.amount = data.amount; - this.price = data.price; + this.amount = data.amount || 0; + this.price = data.price || 0; } toString(): string { @@ -21,4 +21,4 @@ class FireSale { } } -export default FireSale; +export default SkyBlockFireSale; diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGarden.test.ts b/src/Structures/SkyBlock/Garden/SkyBlockGarden.test.ts new file mode 100644 index 000000000..b99a390be --- /dev/null +++ b/src/Structures/SkyBlock/Garden/SkyBlockGarden.test.ts @@ -0,0 +1,46 @@ +import SkyBlockGarden from './SkyBlockGarden.js'; +import SkyBlockGardenActiveVisitor from './SkyBlockGardenActiveVisitor.js'; +import SkyBlockGardenComposter from './SkyBlockGardenComposter.js'; +import SkyBlockGardenCropMilestones from './SkyBlockGardenCropMilestones.js'; +import SkyBlockGardenCropsUpgrades from './SkyBlockGardenCropsUpgrades.js'; +import SkyBlockGardenVisitors from './SkyBlockGardenVisitors.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { BarnPlot, BarnSkin, SkillLevelData } from '../../../Types/SkyBlock.js'; + +test('SkyBlockGarden', () => { + const data = new SkyBlockGarden({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockGarden); + expectTypeOf(data).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.barnSkin).toBeDefined(); + expectTypeOf(data.barnSkin).toEqualTypeOf(); + expect(data.unlockedBarnSkins).toBeDefined(); + expectTypeOf(data.unlockedBarnSkins).toEqualTypeOf(); + data.unlockedBarnSkins.forEach((unlockedSkin) => { + expect(unlockedSkin).toBeDefined(); + expectTypeOf(unlockedSkin).toEqualTypeOf(); + }); + expect(data.unlockedPlots).toBeDefined(); + expectTypeOf(data.unlockedPlots).toEqualTypeOf(); + data.unlockedPlots.forEach((unlockedPlot) => { + expect(unlockedPlot).toBeDefined(); + expectTypeOf(unlockedPlot).toEqualTypeOf(); + }); + expect(data.visitors).toBeDefined(); + expectTypeOf(data.visitors).toEqualTypeOf(); + expect(data.currentVisitors).toBeDefined(); + expectTypeOf(data.currentVisitors).toEqualTypeOf(); + expect(data.cropMilestones).toBeDefined(); + expectTypeOf(data.cropMilestones).toEqualTypeOf(); + expect(data.composter).toBeDefined(); + expectTypeOf(data.composter).toEqualTypeOf(); + expect(data.cropUpgrades).toBeDefined(); + expectTypeOf(data.cropUpgrades).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.level.level); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGarden.ts b/src/Structures/SkyBlock/Garden/SkyBlockGarden.ts new file mode 100644 index 000000000..b4dd419cc --- /dev/null +++ b/src/Structures/SkyBlock/Garden/SkyBlockGarden.ts @@ -0,0 +1,38 @@ +import SkyBlockGardenActiveVisitor from './SkyBlockGardenActiveVisitor.js'; +import SkyBlockGardenComposter from './SkyBlockGardenComposter.js'; +import SkyBlockGardenCropMilestones from './SkyBlockGardenCropMilestones.js'; +import SkyBlockGardenCropsUpgrades from './SkyBlockGardenCropsUpgrades.js'; +import SkyBlockGardenVisitors from './SkyBlockGardenVisitors.js'; +import { getLevelByXp } from '../../../Utils/SkyBlockUtils.js'; +import type { BarnPlot, BarnSkin, SkillLevelData } from '../../../Types/SkyBlock.js'; + +class SkyBlockGarden { + level: SkillLevelData; + barnSkin: BarnSkin; + unlockedBarnSkins: BarnSkin[]; + unlockedPlots: BarnPlot[]; + visitors: SkyBlockGardenVisitors; + currentVisitors: SkyBlockGardenActiveVisitor[]; + cropMilestones: SkyBlockGardenCropMilestones; + composter: SkyBlockGardenComposter; + cropUpgrades: SkyBlockGardenCropsUpgrades; + constructor(data: Record) { + this.level = getLevelByXp(data?.garden_experience, { type: 'garden' }); + this.barnSkin = data?.selected_barn_skin || 'UNKNOWN'; + this.unlockedBarnSkins = data?.unlocked_barn_skins || []; + this.unlockedPlots = data?.unlocked_plots_ids || []; + this.visitors = new SkyBlockGardenVisitors(data?.commission_data || {}); + this.currentVisitors = Object.keys(data?.active_commissions || {}).map( + (visitor) => new SkyBlockGardenActiveVisitor(data?.active_commissions?.[visitor], visitor) + ); + this.cropMilestones = new SkyBlockGardenCropMilestones(data?.resources_collected || {}); + this.composter = new SkyBlockGardenComposter(data?.composter_data || {}); + this.cropUpgrades = new SkyBlockGardenCropsUpgrades(data?.crop_upgrade_levels || {}); + } + + toString(): number { + return this.level.level; + } +} + +export default SkyBlockGarden; diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitor.test.ts b/src/Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitor.test.ts new file mode 100644 index 000000000..41c0b1665 --- /dev/null +++ b/src/Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitor.test.ts @@ -0,0 +1,24 @@ +import SkyBlockGardenActiveVisitor from './SkyBlockGardenActiveVisitor.js'; +import SkyBlockGardenActiveVisitorRequirement from './SkyBlockGardenActiveVisitorRequirement.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { VisitorStatus } from '../../../Types/SkyBlock.js'; + +test('SkyBlockGardenActiveVisitor', () => { + const data = new SkyBlockGardenActiveVisitor({ stats: 'meow' }, 'meow'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockGardenActiveVisitor); + expectTypeOf(data).toEqualTypeOf(); + expect(data.visitor).toBeDefined(); + expectTypeOf(data.visitor).toEqualTypeOf(); + expect(data.requirements).toBeDefined(); + expectTypeOf(data.requirements).toEqualTypeOf(); + expect(data.status).toBeDefined(); + expectTypeOf(data.status).toEqualTypeOf(); + expect(data.position).toBeDefined(); + expectTypeOf(data.position).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.visitor); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitor.ts b/src/Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitor.ts new file mode 100644 index 000000000..b373e5787 --- /dev/null +++ b/src/Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitor.ts @@ -0,0 +1,23 @@ +import SkyBlockGardenActiveVisitorRequirement from './SkyBlockGardenActiveVisitorRequirement.js'; +import type { VisitorStatus } from '../../../Types/SkyBlock.js'; + +class SkyBlockGardenActiveVisitor { + visitor: string; + requirements: SkyBlockGardenActiveVisitorRequirement[]; + status: VisitorStatus | 'UNKNOWN'; + position: number; + constructor(data: Record, name: string) { + this.visitor = name; + this.requirements = (data?.requirement || []).map( + (requirement: Record) => new SkyBlockGardenActiveVisitorRequirement(requirement) + ); + this.status = data?.status || 'UNKNOWN'; + this.position = data?.position || 1; + } + + toString(): string { + return this.visitor; + } +} + +export default SkyBlockGardenActiveVisitor; diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitorRequirement.test.ts b/src/Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitorRequirement.test.ts new file mode 100644 index 000000000..e01646fa8 --- /dev/null +++ b/src/Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitorRequirement.test.ts @@ -0,0 +1,22 @@ +import SkyBlockGardenActiveVisitorRequirement from './SkyBlockGardenActiveVisitorRequirement.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockGardenActiveVisitorRequirement', () => { + const data = new SkyBlockGardenActiveVisitorRequirement({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockGardenActiveVisitorRequirement); + expectTypeOf(data).toEqualTypeOf(); + expect(data.originalItem).toBeDefined(); + expectTypeOf(data.originalItem).toEqualTypeOf(); + expect(data.originalAmount).toBeDefined(); + expectTypeOf(data.originalAmount).toEqualTypeOf(); + expect(data.item).toBeDefined(); + expectTypeOf(data.item).toEqualTypeOf(); + expect(data.amount).toBeDefined(); + expectTypeOf(data.amount).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.amount); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitorRequirement.ts b/src/Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitorRequirement.ts new file mode 100644 index 000000000..352e9fad8 --- /dev/null +++ b/src/Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitorRequirement.ts @@ -0,0 +1,18 @@ +class SkyBlockGardenActiveVisitorRequirement { + originalItem: string; + originalAmount: number; + item: string; + amount: number; + constructor(data: Record) { + this.originalItem = data?.original_item || ''; + this.originalAmount = data?.original_amount || 0; + this.item = data?.item || ''; + this.amount = data?.amount || 0; + } + + toString(): number { + return this.amount; + } +} + +export default SkyBlockGardenActiveVisitorRequirement; diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGardenComposter.test.ts b/src/Structures/SkyBlock/Garden/SkyBlockGardenComposter.test.ts new file mode 100644 index 000000000..ca2382a29 --- /dev/null +++ b/src/Structures/SkyBlock/Garden/SkyBlockGardenComposter.test.ts @@ -0,0 +1,27 @@ +import SkyBlockGardenComposter from './SkyBlockGardenComposter.js'; +import SkyBlockGardenComposterUpgrades from './SkyBlockGardenComposterUpgrades.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockGardenComposter', () => { + const data = new SkyBlockGardenComposter({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockGardenComposter); + expectTypeOf(data).toEqualTypeOf(); + expect(data.organicMatter).toBeDefined(); + expectTypeOf(data.organicMatter).toEqualTypeOf(); + expect(data.fuelUnits).toBeDefined(); + expectTypeOf(data.fuelUnits).toEqualTypeOf(); + expect(data.compostUnits).toBeDefined(); + expectTypeOf(data.compostUnits).toEqualTypeOf(); + expect(data.compostItems).toBeDefined(); + expectTypeOf(data.compostItems).toEqualTypeOf(); + expect(data.conversionTicks).toBeDefined(); + expectTypeOf(data.conversionTicks).toEqualTypeOf(); + expect(data.upgrades).toBeDefined(); + expectTypeOf(data.upgrades).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.organicMatter); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGardenComposter.ts b/src/Structures/SkyBlock/Garden/SkyBlockGardenComposter.ts new file mode 100644 index 000000000..80d17c16e --- /dev/null +++ b/src/Structures/SkyBlock/Garden/SkyBlockGardenComposter.ts @@ -0,0 +1,24 @@ +import SkyBlockGardenComposterUpgrades from './SkyBlockGardenComposterUpgrades.js'; + +class SkyBlockGardenComposter { + organicMatter: number; + fuelUnits: number; + compostUnits: number; + compostItems: number; + conversionTicks: number; + upgrades: SkyBlockGardenComposterUpgrades; + constructor(data: Record) { + this.organicMatter = data?.organic_matter || 0; + this.fuelUnits = data?.fuel_units || 0; + this.compostUnits = data?.compost_units || 0; + this.compostItems = data?.compost_items || 0; + this.conversionTicks = data?.conversion_ticks || 0; + this.upgrades = new SkyBlockGardenComposterUpgrades(data?.upgrades || {}); + } + + toString(): number { + return this.organicMatter; + } +} + +export default SkyBlockGardenComposter; diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGardenComposterUpgrades.test.ts b/src/Structures/SkyBlock/Garden/SkyBlockGardenComposterUpgrades.test.ts new file mode 100644 index 000000000..c3b4e8710 --- /dev/null +++ b/src/Structures/SkyBlock/Garden/SkyBlockGardenComposterUpgrades.test.ts @@ -0,0 +1,19 @@ +import SkyBlockGardenComposterUpgrades from './SkyBlockGardenComposterUpgrades.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockGardenComposterUpgrades', () => { + const data = new SkyBlockGardenComposterUpgrades({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockGardenComposterUpgrades); + expectTypeOf(data).toEqualTypeOf(); + expect(data.speed).toBeDefined(); + expectTypeOf(data.speed).toEqualTypeOf(); + expect(data.multiDrop).toBeDefined(); + expectTypeOf(data.multiDrop).toEqualTypeOf(); + expect(data.fuelCap).toBeDefined(); + expectTypeOf(data.fuelCap).toEqualTypeOf(); + expect(data.organicMatterCap).toBeDefined(); + expectTypeOf(data.organicMatterCap).toEqualTypeOf(); + expect(data.costReduction).toBeDefined(); + expectTypeOf(data.costReduction).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGardenComposterUpgrades.ts b/src/Structures/SkyBlock/Garden/SkyBlockGardenComposterUpgrades.ts new file mode 100644 index 000000000..42dbf6e91 --- /dev/null +++ b/src/Structures/SkyBlock/Garden/SkyBlockGardenComposterUpgrades.ts @@ -0,0 +1,16 @@ +class SkyBlockGardenComposterUpgrades { + speed: number; + multiDrop: number; + fuelCap: number; + organicMatterCap: number; + costReduction: number; + constructor(data: Record) { + this.speed = data?.speed || 0; + this.multiDrop = data?.multi_drop || 0; + this.fuelCap = data?.fuel_cap || 0; + this.organicMatterCap = data?.organic_matter_cap || 0; + this.costReduction = data?.cost_reduction || 0; + } +} + +export default SkyBlockGardenComposterUpgrades; diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGardenCropMilestones.test.ts b/src/Structures/SkyBlock/Garden/SkyBlockGardenCropMilestones.test.ts new file mode 100644 index 000000000..8af82136e --- /dev/null +++ b/src/Structures/SkyBlock/Garden/SkyBlockGardenCropMilestones.test.ts @@ -0,0 +1,35 @@ +import SkyBlockGardenCropMilestones from './SkyBlockGardenCropMilestones.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { SkillLevelData } from '../../../Types/SkyBlock.js'; + +test('SkyBlockGardenCropMilestones', () => { + const data = new SkyBlockGardenCropMilestones({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockGardenCropMilestones); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wheat).toBeDefined(); + expectTypeOf(data.wheat).toEqualTypeOf(); + expect(data.carrot).toBeDefined(); + expectTypeOf(data.carrot).toEqualTypeOf(); + expect(data.sugarCane).toBeDefined(); + expectTypeOf(data.sugarCane).toEqualTypeOf(); + expect(data.potato).toBeDefined(); + expectTypeOf(data.potato).toEqualTypeOf(); + expect(data.pumpkin).toBeDefined(); + expectTypeOf(data.pumpkin).toEqualTypeOf(); + expect(data.melon).toBeDefined(); + expectTypeOf(data.melon).toEqualTypeOf(); + expect(data.cactus).toBeDefined(); + expectTypeOf(data.cactus).toEqualTypeOf(); + expect(data.cocoaBeans).toBeDefined(); + expectTypeOf(data.cocoaBeans).toEqualTypeOf(); + expect(data.mushroom).toBeDefined(); + expectTypeOf(data.mushroom).toEqualTypeOf(); + expect(data.netherWart).toBeDefined(); + expectTypeOf(data.netherWart).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.average); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGardenCropMilestones.ts b/src/Structures/SkyBlock/Garden/SkyBlockGardenCropMilestones.ts new file mode 100644 index 000000000..6b216c4b7 --- /dev/null +++ b/src/Structures/SkyBlock/Garden/SkyBlockGardenCropMilestones.ts @@ -0,0 +1,46 @@ +import { getLevelByXp } from '../../../Utils/SkyBlockUtils.js'; +import type { SkillLevelData } from '../../../Types/SkyBlock.js'; + +class SkyBlockGardenCropMilestones { + wheat: SkillLevelData; + carrot: SkillLevelData; + sugarCane: SkillLevelData; + potato: SkillLevelData; + pumpkin: SkillLevelData; + melon: SkillLevelData; + cactus: SkillLevelData; + cocoaBeans: SkillLevelData; + mushroom: SkillLevelData; + netherWart: SkillLevelData; + average: number; + constructor(data: Record) { + this.wheat = getLevelByXp(data?.WHEAT || 0, { type: 'wheat' }); + this.carrot = getLevelByXp(data?.CARROT_ITEM || 0, { type: 'carrot' }); + this.sugarCane = getLevelByXp(data?.SUGAR_CANE || 0, { type: 'sugarCane' }); + this.potato = getLevelByXp(data?.POTATO_ITEM || 0, { type: 'potato' }); + this.pumpkin = getLevelByXp(data?.PUMPKIN || 0, { type: 'pumpkin' }); + this.melon = getLevelByXp(data?.MELON || 0, { type: 'melon' }); + this.cactus = getLevelByXp(data?.CACTUS || 0, { type: 'cactus' }); + this.cocoaBeans = getLevelByXp(data?.['INK_SACK:3'] || 0, { type: 'cocoaBeans' }); + this.mushroom = getLevelByXp(data?.MUSHROOM_COLLECTION || 0, { type: 'mushroom' }); + this.netherWart = getLevelByXp(data?.NETHER_STALK || 0, { type: 'netherWart' }); + this.average = + (this.wheat.level + + this.carrot.level + + this.sugarCane.level + + this.potato.level + + this.pumpkin.level + + this.melon.level + + this.cactus.level + + this.cocoaBeans.level + + this.mushroom.level + + this.netherWart.level) / + 10; + } + + toString(): number { + return this.average; + } +} + +export default SkyBlockGardenCropMilestones; diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGardenCropsUpgrades.test.ts b/src/Structures/SkyBlock/Garden/SkyBlockGardenCropsUpgrades.test.ts new file mode 100644 index 000000000..39b817c1a --- /dev/null +++ b/src/Structures/SkyBlock/Garden/SkyBlockGardenCropsUpgrades.test.ts @@ -0,0 +1,34 @@ +import SkyBlockGardenCropsUpgrades from './SkyBlockGardenCropsUpgrades.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockGardenCropsUpgrades', () => { + const data = new SkyBlockGardenCropsUpgrades({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockGardenCropsUpgrades); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wheat).toBeDefined(); + expectTypeOf(data.wheat).toEqualTypeOf(); + expect(data.carrot).toBeDefined(); + expectTypeOf(data.carrot).toEqualTypeOf(); + expect(data.sugarCane).toBeDefined(); + expectTypeOf(data.sugarCane).toEqualTypeOf(); + expect(data.potato).toBeDefined(); + expectTypeOf(data.potato).toEqualTypeOf(); + expect(data.pumpkin).toBeDefined(); + expectTypeOf(data.pumpkin).toEqualTypeOf(); + expect(data.melon).toBeDefined(); + expectTypeOf(data.melon).toEqualTypeOf(); + expect(data.cactus).toBeDefined(); + expectTypeOf(data.cactus).toEqualTypeOf(); + expect(data.cocoaBeans).toBeDefined(); + expectTypeOf(data.cocoaBeans).toEqualTypeOf(); + expect(data.mushroom).toBeDefined(); + expectTypeOf(data.mushroom).toEqualTypeOf(); + expect(data.netherWart).toBeDefined(); + expectTypeOf(data.netherWart).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.average); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGardenCropsUpgrades.ts b/src/Structures/SkyBlock/Garden/SkyBlockGardenCropsUpgrades.ts new file mode 100644 index 000000000..0495764d2 --- /dev/null +++ b/src/Structures/SkyBlock/Garden/SkyBlockGardenCropsUpgrades.ts @@ -0,0 +1,43 @@ +class SkyBlockGardenCropsUpgrades { + wheat: number; + carrot: number; + sugarCane: number; + potato: number; + pumpkin: number; + melon: number; + cactus: number; + cocoaBeans: number; + mushroom: number; + netherWart: number; + average: number; + constructor(data: Record) { + this.wheat = data?.WHEAT || 0; + this.carrot = data?.CARROT_ITEM || 0; + this.sugarCane = data?.SUGAR_CANE || 0; + this.potato = data?.POTATO_ITEM || 0; + this.pumpkin = data?.PUMPKIN || 0; + this.melon = data?.MELON || 0; + this.cactus = data?.CACTUS || 0; + this.cocoaBeans = data?.['INK_SACK:3'] || 0; + this.mushroom = data?.MUSHROOM_COLLECTION || 0; + this.netherWart = data?.NETHER_STALK || 0; + this.average = + (this.wheat + + this.carrot + + this.sugarCane + + this.potato + + this.pumpkin + + this.melon + + this.cactus + + this.cocoaBeans + + this.mushroom + + this.netherWart) / + 10; + } + + toString(): number { + return this.average; + } +} + +export default SkyBlockGardenCropsUpgrades; diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGardenVisitors.test.ts b/src/Structures/SkyBlock/Garden/SkyBlockGardenVisitors.test.ts new file mode 100644 index 000000000..9ee897e16 --- /dev/null +++ b/src/Structures/SkyBlock/Garden/SkyBlockGardenVisitors.test.ts @@ -0,0 +1,17 @@ +import SkyBlockGardenVisitors from './SkyBlockGardenVisitors.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockGardenVisitors', () => { + const data = new SkyBlockGardenVisitors({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockGardenVisitors); + expectTypeOf(data).toEqualTypeOf(); + expect(data.visited).toBeDefined(); + expectTypeOf(data.visited).toEqualTypeOf>(); + expect(data.completed).toBeDefined(); + expectTypeOf(data.completed).toEqualTypeOf>(); + expect(data.totalCompleted).toBeDefined(); + expectTypeOf(data.totalCompleted).toEqualTypeOf(); + expect(data.uniqueNpcsServed).toBeDefined(); + expectTypeOf(data.uniqueNpcsServed).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGardenVisitors.ts b/src/Structures/SkyBlock/Garden/SkyBlockGardenVisitors.ts new file mode 100644 index 000000000..f599d6bff --- /dev/null +++ b/src/Structures/SkyBlock/Garden/SkyBlockGardenVisitors.ts @@ -0,0 +1,14 @@ +class SkyBlockGardenVisitors { + visited: Record; + completed: Record; + totalCompleted: number; + uniqueNpcsServed: number; + constructor(data: Record) { + this.visited = data?.visits || {}; + this.completed = data?.completed || {}; + this.totalCompleted = data?.total_completed || 0; + this.uniqueNpcsServed = data?.unique_npcs_served || 0; + } +} + +export default SkyBlockGardenVisitors; diff --git a/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.ts b/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.ts new file mode 100644 index 000000000..caa1f63d1 --- /dev/null +++ b/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.ts @@ -0,0 +1,202 @@ +import SkyBlockInventoryItemAttribute from './SkyBlockInventoryItemAttribute.js'; +import SkyBlockInventoryItemEnchantment from './SkyBlockInventoryItemEnchantment.js'; +import SkyBlockInventoryItemRune from './SkyBlockInventoryItemRune.js'; +import SkyBlockPotionEffect from '../Potion/SkyBlockPotionEffect.js'; +import type { Rarity } from '../../../Types/SkyBlock.js'; +import type { UUID } from '../../../Types/Global.js'; + +class SkyBlockInventoryItem { + minecraftItemId: number; + itemCount: number; + itemDamage: number; + unbreakable: boolean; + hideFlags: number | null; + lore: string[] | null; + name: string | 'UNKNOWN'; + color: number | null; + recombobulated: boolean; + statsBook: number | null; + runes: SkyBlockInventoryItemRune[] | null; + reforge: string | 'none'; + hasArtOfWar: boolean; + starCount: number; + enchantments: SkyBlockInventoryItemEnchantment[] | null; + uuid: UUID | null; + hotPotatoBookCount: number; + championCombatXP: number | null; + id: string; + hasDonatedItem: boolean; + transmissionTunerCount: number | null; + powerAbilityScroll: string | null; + hasEtherwarp: boolean; + isDungeonItem: boolean; + abilityScrolls: string[] | null; + dungeonSkillRequirement: number | null; + baseStatBoostPercentage: number | null; + itemTier: number | null; + manaDisintergratorCount: number | null; + skin: string | null; + blazetekkChannel: number | null; + capturedPlayer: string | null; + cakeOwner: string | null; + soulDurability: number | null; + initiatorPlayer: string | null; + isShiny: boolean; + attributes: SkyBlockInventoryItemAttribute[] | null; + jalapenoCount: number | null; + hecatombSRuns: number | null; + dungeonItemLevel: number | null; + originTag: string | null; + hasArtOfPeace: boolean; + secondRandomColor: number | null; + dyeItem: string | null; + raffleYear: number | null; + raffleWin: string | null; + edition: number | null; + recipientName: string | null; + recipientUUID: string | null; + bossTier: number | null; + divanPowerCoating: number | null; + year: number | null; + bossId: number | null; + spawnedFor: number | null; + emanKills: number | null; + isRiftTransferable: boolean; + coinsGained: number | null; + ranchersSpeed: number | null; + favoriteSentinalWarden: number | null; + potionLevel: number | null; + potion: number | null; + potionEffects: SkyBlockPotionEffect[] | null; + potionType: number | null; + isSplashPotion: boolean; + potionName: string | null; + isDungeonPotion: boolean; + gearScore: number; + rarity: Rarity; + raw: Record; + constructor(data: Record) { + this.minecraftItemId = data?.id || 0; + this.itemCount = data?.count || 1; + this.itemDamage = data?.Damage || 0; + this.unbreakable = Boolean(data?.tag?.Unbreakable || 1); + this.hideFlags = data?.tag?.HideFlags || null; + this.lore = data?.tag?.display?.Lore || null; + this.name = data?.tag?.display?.name || 'UNKNOWN'; + this.color = data?.tag?.display?.color || null; + this.recombobulated = Boolean(data?.tag?.ExtraAttributes?.rarity_upgrades || 0); + this.statsBook = data?.tag?.ExtraAttributes?.stats_book || null; + this.runes = data?.tag?.ExtraAttributes?.runes + ? Object.keys(data?.tag?.ExtraAttributes?.runes).map( + (rune) => new SkyBlockInventoryItemRune({ id: rune, tier: data?.tag?.ExtraAttributes?.runes?.[rune] }) + ) + : null; + this.reforge = data?.tag?.ExtraAttributes?.modifier || 'none'; + this.hasArtOfWar = Boolean(data?.tag?.ExtraAttributes?.art_of_war_count || 0); + this.starCount = data?.tag?.ExtraAttributes?.upgrade_level || 0; + this.enchantments = data?.tag?.ExtraAttributes?.enchantments + ? Object.keys(data?.tag?.ExtraAttributes?.enchantments).map( + (enchantment) => + new SkyBlockInventoryItemEnchantment({ + id: enchantment, + level: data?.tag?.ExtraAttributes?.enchantments?.[enchantment] + }) + ) + : null; + this.uuid = data?.tag?.ExtraAttributes?.uuid || null; + this.hotPotatoBookCount = data?.tag?.ExtraAttributes?.hot_potato_count || null; + this.championCombatXP = data?.tag?.ExtraAttributes?.champion_combat_xp || null; + this.id = data?.tag?.ExtraAttributes?.id || 'UNKNOWN'; + this.hasDonatedItem = Boolean(data?.tag?.ExtraAttributes?.donated_museum || 0); + this.transmissionTunerCount = data?.tag?.ExtraAttributes?.tuned_transmission || null; + this.powerAbilityScroll = data?.tag?.ExtraAttributes?.power_ability_scroll || null; + this.hasEtherwarp = Boolean(data?.tag?.ExtraAttributes?.ethermerge || 0); + this.isDungeonItem = Boolean(data?.tag?.ExtraAttributes?.dungeon_item || 0); + this.abilityScrolls = data?.tag?.ExtraAttributes?.ability_scroll || null; + this.dungeonSkillRequirement = data?.tag?.ExtraAttributes?.dungeon_skill_req || null; + this.baseStatBoostPercentage = data?.tag?.ExtraAttributes?.baseStatBoostPercentage || null; + this.itemTier = data?.tag?.ExtraAttributes?.item_tier || null; + this.manaDisintergratorCount = data?.tag?.ExtraAttributes?.mana_disintergrator_count || null; + this.skin = data?.tag?.ExtraAttributes?.skin || null; + this.blazetekkChannel = data?.tag?.ExtraAttributes?.blazetekk_channel || null; + this.capturedPlayer = data?.tag?.ExtraAttributes?.captured_player || null; + this.cakeOwner = data?.tag?.ExtraAttributes?.cake_owner || null; + this.soulDurability = data?.tag?.ExtraAttributes?.soul_durability || null; + this.initiatorPlayer = data?.tag?.ExtraAttributes?.initator_player || null; + this.isShiny = Boolean(data?.tag?.ExtraAttributes?.is_shiny || 0); + this.attributes = data?.tag?.ExtraAttributes?.attributes + ? Object.keys(data?.tag?.ExtraAttributes?.attributes).map( + (attribute) => + new SkyBlockInventoryItemAttribute({ + id: attribute, + level: data?.tag?.ExtraAttributes?.attributes[attribute] + }) + ) + : null; + this.jalapenoCount = data?.tag?.ExtraAttributes?.jalapeono_count || null; + this.hecatombSRuns = data?.tag?.ExtraAttributes?.hecatomb_s_runs || null; + this.dungeonItemLevel = data?.tag?.ExtraAttributes?.dungeon_item_level || null; + this.originTag = data?.tag?.ExtraAttributes?.originTag || null; + this.hasArtOfPeace = Boolean(data?.tag?.ExtraAttributes?.artOfPeaceApplied || 0); + this.secondRandomColor = data?.tag?.ExtraAttributes?.color || null; + this.dyeItem = data?.tag?.ExtraAttributes?.dye_item || null; + this.raffleYear = data?.tag?.ExtraAttributes?.raffle_year || null; + this.raffleWin = data?.tag?.ExtraAttributes?.raffle_win || null; + this.edition = data?.tag?.ExtraAttributes?.edition || null; + this.recipientName = data?.tag?.ExtraAttributes?.recipient_name || null; + this.recipientUUID = data?.tag?.ExtraAttributes?.recipient_id || null; + this.bossTier = data?.tag?.ExtraAttributes?.boss_tier || null; + this.divanPowerCoating = data?.tag?.ExtraAttributes?.divan_power_coating || null; + this.year = data?.tag?.ExtraAttributes?.year || null; + this.bossId = data?.tag?.ExtraAttributes?.bossId || null; + this.spawnedFor = data?.tag?.ExtraAttributes?.spawnedFor || null; + this.emanKills = data?.tag?.ExtraAttributes?.eman_kills || null; + this.isRiftTransferable = Boolean(data?.tag?.ExtraAttributes?.rift_transferred || 0); + this.coinsGained = data?.tag?.ExtraAttributes?.coins_gained || null; + this.ranchersSpeed = data?.tag?.ExtraAttributes?.ranchers_speed || null; + this.favoriteSentinalWarden = data?.tag?.ExtraAttributes?.favorite_sentinel_warden || null; + this.potionLevel = data?.tag?.ExtraAttributes?.potion_level || null; + this.potion = data?.tag?.ExtraAttributes?.potion || null; + this.potionEffects = data?.tag?.ExtraAttributes?.effects + ? data?.tag?.ExtraAttributes?.effects.map((effect: Record) => new SkyBlockPotionEffect(effect)) + : null; + this.potionType = data?.tag?.ExtraAttributes?.potion_type || null; + this.isSplashPotion = Boolean(data?.tag?.ExtraAttributes?.splash || 0); + this.potionName = data?.tag?.ExtraAttributes?.potion_name || null; + this.isDungeonPotion = Boolean(data?.tag?.ExtraAttributes?.dungeon_potion || 0); + this.gearScore = this.lore ? this.parseGearScore(this.lore) : 0; + this.rarity = this.lore ? this.parseRarity(this.lore[this.lore.length - 1] || '') : 'COMMON'; + this.raw = data; + } + + private parseRarity(str: string): Rarity { + const rarityArray = [ + 'COMMON', + 'UNCOMMON', + 'RARE', + 'EPIC', + 'LEGENDARY', + 'MYTHIC', + 'DIVINE', + 'SPECIAL', + 'VERY SPECIAL' + ]; + for (const rarity of rarityArray) { + if (str.includes(rarity)) return rarity as Rarity; + } + return 'COMMON'; + } + + private parseGearScore(lore: any): number { + for (const line of lore) { + if (line.match(/Gear Score: §[0-9a-f](\d+)/)) return Number(line.match(/Gear Score: §d(\d+)/)[1]); + } + return 0; + } + + toString(): string { + return this.name; + } +} + +export default SkyBlockInventoryItem; diff --git a/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItemAttribute.ts b/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItemAttribute.ts new file mode 100644 index 000000000..044612695 --- /dev/null +++ b/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItemAttribute.ts @@ -0,0 +1,14 @@ +class SkyBlockInventoryItemAttribute { + id: string | 'UNKNOWN'; + tier: number; + constructor(data: Record) { + this.id = data?.id || 'UNKNOWN'; + this.tier = data?.tier || 0; + } + + toString(): string | 'UNKNOWN' { + return this.id; + } +} + +export default SkyBlockInventoryItemAttribute; diff --git a/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItemEnchantment.ts b/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItemEnchantment.ts new file mode 100644 index 000000000..86ea93496 --- /dev/null +++ b/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItemEnchantment.ts @@ -0,0 +1,14 @@ +class SkyBlockInventoryItemEnchantment { + name: string | 'UNKNOWN'; + level: number; + constructor(data: Record) { + this.name = data?.id || 'UNKNOWN'; + this.level = data?.lvl || 0; + } + + toString(): string | 'UNKNOWN' { + return this.name; + } +} + +export default SkyBlockInventoryItemEnchantment; diff --git a/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItemRune.ts b/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItemRune.ts new file mode 100644 index 000000000..29a86ef7a --- /dev/null +++ b/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItemRune.ts @@ -0,0 +1,14 @@ +class SkyBlockInventoryItemRune { + runeId: string | 'UNKNOWN'; + tier: number; + constructor(data: Record) { + this.runeId = data?.id || 'UNKNOWN'; + this.tier = data?.tier || 0; + } + + toString(): string | 'UNKNOWN' { + return this.runeId; + } +} + +export default SkyBlockInventoryItemRune; diff --git a/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBag.test.ts b/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBag.test.ts new file mode 100644 index 000000000..48d16f8b7 --- /dev/null +++ b/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBag.test.ts @@ -0,0 +1,26 @@ +import SkyBlockMemberAccessoryBag from './SkyBlockMemberAccessoryBag.js'; +import SkyBlockMemberAccessoryBagTuning from './SkyBlockMemberAccessoryBagTuning.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { SkyBlockMemberPower } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberAccessoryBag', () => { + const data = new SkyBlockMemberAccessoryBag({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberAccessoryBag); + expectTypeOf(data).toEqualTypeOf(); + expect(data.selectedPower).toBeDefined(); + expectTypeOf(data.selectedPower).toEqualTypeOf(); + expect(data.unlockedPowers).toBeDefined(); + expectTypeOf(data.unlockedPowers).toEqualTypeOf(); + expect(data.bagUpgradesPurchased).toBeDefined(); + expectTypeOf(data.bagUpgradesPurchased).toEqualTypeOf(); + expect(data.highestMagicalPower).toBeDefined(); + expectTypeOf(data.highestMagicalPower).toEqualTypeOf(); + expect(data.tuning).toBeDefined(); + expectTypeOf(data.tuning).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => SkyBlockMemberPower | null>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.selectedPower); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBag.ts b/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBag.ts new file mode 100644 index 000000000..df1c60e08 --- /dev/null +++ b/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBag.ts @@ -0,0 +1,34 @@ +import SkyBlockMemberAccessoryBagTuning from './SkyBlockMemberAccessoryBagTuning.js'; +import type { SkyBlockMemberPower } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberAccessoryBag { + selectedPower: SkyBlockMemberPower | null; + unlockedPowers: SkyBlockMemberPower[]; + bagUpgradesPurchased: number; + highestMagicalPower: number; + tuning: SkyBlockMemberAccessoryBagTuning; + constructor(data: Record) { + this.selectedPower = data?.selected_power || null; + this.unlockedPowers = data?.unlocked_powers || [ + 'Fortuitous ', + 'Pretty', + 'Protected', + 'Simple', + 'Warrior', + 'Commando', + 'Disciplined', + 'Inspired', + 'Ominous ', + 'Prepared' + ]; + this.bagUpgradesPurchased = data?.bag_upgrades_purchased || 0; + this.highestMagicalPower = data?.highest_magical_power || 0; + this.tuning = new SkyBlockMemberAccessoryBagTuning(data?.tuning || {}); + } + + toString(): SkyBlockMemberPower | null { + return this.selectedPower; + } +} + +export default SkyBlockMemberAccessoryBag; diff --git a/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBagTuning.test.ts b/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBagTuning.test.ts new file mode 100644 index 000000000..d3b785fe3 --- /dev/null +++ b/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBagTuning.test.ts @@ -0,0 +1,33 @@ +import SkyBlockMemberAccessoryBagTuning from './SkyBlockMemberAccessoryBagTuning.js'; +import SkyBlockMemberAccessoryBagTuningSlot from './SkyBlockMemberAccessoryBagTuningSlot.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberAccessoryBagTuning', () => { + const data = new SkyBlockMemberAccessoryBagTuning({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberAccessoryBagTuning); + expectTypeOf(data).toEqualTypeOf(); + expect(data.highestUnlockedSlot).toBeDefined(); + expectTypeOf(data.highestUnlockedSlot).toEqualTypeOf(); + expect(data.slot1).toBeDefined(); + expectTypeOf(data.slot1).toEqualTypeOf(); + expect(data.slot2).toBeDefined(); + expectTypeOf(data.slot2).toEqualTypeOf(); + expect(data.slot3).toBeDefined(); + expectTypeOf(data.slot3).toEqualTypeOf(); + expect(data.slot4).toBeDefined(); + expectTypeOf(data.slot4).toEqualTypeOf(); + expect(data.slot5).toBeDefined(); + expectTypeOf(data.slot5).toEqualTypeOf(); + expect(data.slot6).toBeDefined(); + expectTypeOf(data.slot6).toEqualTypeOf(); + expect(data.slot7).toBeDefined(); + expectTypeOf(data.slot7).toEqualTypeOf(); + expect(data.slot8).toBeDefined(); + expectTypeOf(data.slot8).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.highestUnlockedSlot); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBagTuning.ts b/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBagTuning.ts new file mode 100644 index 000000000..475d525ab --- /dev/null +++ b/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBagTuning.ts @@ -0,0 +1,30 @@ +import SkyBlockMemberAccessoryBagTuningSlot from './SkyBlockMemberAccessoryBagTuningSlot.js'; + +class SkyBlockMemberAccessoryBagTuning { + highestUnlockedSlot: number; + slot1: SkyBlockMemberAccessoryBagTuningSlot; + slot2: SkyBlockMemberAccessoryBagTuningSlot; + slot3: SkyBlockMemberAccessoryBagTuningSlot; + slot4: SkyBlockMemberAccessoryBagTuningSlot; + slot5: SkyBlockMemberAccessoryBagTuningSlot; + slot6: SkyBlockMemberAccessoryBagTuningSlot; + slot7: SkyBlockMemberAccessoryBagTuningSlot; + slot8: SkyBlockMemberAccessoryBagTuningSlot; + constructor(data: Record) { + this.highestUnlockedSlot = data?.highest_unlocked_slot || 1; + this.slot1 = new SkyBlockMemberAccessoryBagTuningSlot(data?.slot_0 || {}, Boolean(data?.slot_0)); + this.slot2 = new SkyBlockMemberAccessoryBagTuningSlot(data?.slot_1 || {}, Boolean(data?.slot_1)); + this.slot3 = new SkyBlockMemberAccessoryBagTuningSlot(data?.slot_2 || {}, Boolean(data?.slot_2)); + this.slot4 = new SkyBlockMemberAccessoryBagTuningSlot(data?.slot_3 || {}, Boolean(data?.slot_3)); + this.slot5 = new SkyBlockMemberAccessoryBagTuningSlot(data?.slot_4 || {}, Boolean(data?.slot_4)); + this.slot6 = new SkyBlockMemberAccessoryBagTuningSlot(data?.slot_5 || {}, Boolean(data?.slot_5)); + this.slot7 = new SkyBlockMemberAccessoryBagTuningSlot(data?.slot_6 || {}, Boolean(data?.slot_6)); + this.slot8 = new SkyBlockMemberAccessoryBagTuningSlot(data?.slot_7 || {}, Boolean(data?.slot_7)); + } + + toString(): number { + return this.highestUnlockedSlot; + } +} + +export default SkyBlockMemberAccessoryBagTuning; diff --git a/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBagTuningSlot.test.ts b/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBagTuningSlot.test.ts new file mode 100644 index 000000000..5b3002489 --- /dev/null +++ b/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBagTuningSlot.test.ts @@ -0,0 +1,36 @@ +import SkyBlockMemberAccessoryBagTuningSlot from './SkyBlockMemberAccessoryBagTuningSlot.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberAccessoryBagTuningSlot', () => { + const data = new SkyBlockMemberAccessoryBagTuningSlot({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberAccessoryBagTuningSlot); + expectTypeOf(data).toEqualTypeOf(); + expect(data.unlocked).toBeDefined(); + expectTypeOf(data.unlocked).toEqualTypeOf(); + expect(data.purchasedTimestamp).toBeDefined(); + expectTypeOf(data.purchasedTimestamp).toEqualTypeOf(); + expect(data.purchasedDate).toBeDefined(); + expectTypeOf(data.purchasedDate).toEqualTypeOf(); + expect(data.health).toBeDefined(); + expectTypeOf(data.health).toEqualTypeOf(); + expect(data.defense).toBeDefined(); + expectTypeOf(data.defense).toEqualTypeOf(); + expect(data.walkSpeed).toBeDefined(); + expectTypeOf(data.walkSpeed).toEqualTypeOf(); + expect(data.strength).toBeDefined(); + expectTypeOf(data.strength).toEqualTypeOf(); + expect(data.criticalDamage).toBeDefined(); + expectTypeOf(data.criticalDamage).toEqualTypeOf(); + expect(data.criticalChance).toBeDefined(); + expectTypeOf(data.criticalChance).toEqualTypeOf(); + expect(data.attackSpeed).toBeDefined(); + expectTypeOf(data.attackSpeed).toEqualTypeOf(); + expect(data.intelligence).toBeDefined(); + expectTypeOf(data.intelligence).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => boolean>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.unlocked); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBagTuningSlot.ts b/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBagTuningSlot.ts new file mode 100644 index 000000000..8907eb233 --- /dev/null +++ b/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBagTuningSlot.ts @@ -0,0 +1,32 @@ +class SkyBlockMemberAccessoryBagTuningSlot { + unlocked: boolean; + purchasedTimestamp: number | null; + purchasedDate: Date | null; + health: number; + defense: number; + walkSpeed: number; + strength: number; + criticalDamage: number; + criticalChance: number; + attackSpeed: number; + intelligence: number; + constructor(data: Record, unlocked: boolean = false) { + this.unlocked = unlocked; + this.purchasedTimestamp = data?.purchase_ts || null; + this.purchasedDate = this.purchasedTimestamp ? new Date(this.purchasedTimestamp) : null; + this.health = data?.health || 0; + this.defense = data?.defense || 0; + this.walkSpeed = data?.walk_speed || 0; + this.strength = data?.strength || 0; + this.criticalDamage = data?.critical_damage || 0; + this.criticalChance = data?.critical_chance || 0; + this.attackSpeed = data?.attack_speed || 0; + this.intelligence = data?.intelligence || 0; + } + + toString(): boolean { + return this.unlocked; + } +} + +export default SkyBlockMemberAccessoryBagTuningSlot; diff --git a/src/Structures/SkyBlock/Member/Bestiary/SkyBlockMemberBestiary.test.ts b/src/Structures/SkyBlock/Member/Bestiary/SkyBlockMemberBestiary.test.ts new file mode 100644 index 000000000..01ff7d4ac --- /dev/null +++ b/src/Structures/SkyBlock/Member/Bestiary/SkyBlockMemberBestiary.test.ts @@ -0,0 +1,47 @@ +import SkyBlockMemberBestiary from './SkyBlockMemberBestiary.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { BestiaryCategory } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberBestiary', () => { + /* eslint-disable camelcase */ + const data = new SkyBlockMemberBestiary({ + kills: { + last_killed_mob: 'pest_cricket_1', + pest_fly_1: 16, + pest_rat_1: 17, + pest_cricket_1: 11, + pest_locust_1: 22, + pest_slug_1: 17, + pest_mite_1: 15, + pest_worm_1: 13, + pest_moth_1: 16, + pest_beetle_1: 11, + pest_mosquito_1: 17 + } + }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberBestiary); + expectTypeOf(data).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expectTypeOf(data.kills).toEqualTypeOf>(); + expect(data.deaths).toBeDefined(); + expectTypeOf(data.deaths).toEqualTypeOf>(); + expect(data.lastClaimedMilestone).toBeDefined(); + expectTypeOf(data.lastClaimedMilestone).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.maxLevel).toBeDefined(); + expectTypeOf(data.maxLevel).toEqualTypeOf(); + expect(data.familiesUnlocked).toBeDefined(); + expectTypeOf(data.familiesUnlocked).toEqualTypeOf(); + expect(data.familiesCompleted).toBeDefined(); + expectTypeOf(data.familiesCompleted).toEqualTypeOf(); + expect(data.totalFamilies).toBeDefined(); + expectTypeOf(data.totalFamilies).toEqualTypeOf(); + expect(data.familyTiers).toBeDefined(); + expectTypeOf(data.familyTiers).toEqualTypeOf(); + expect(data.maxFamilyTiers).toBeDefined(); + expectTypeOf(data.maxFamilyTiers).toEqualTypeOf(); + expect(data.categories).toBeDefined(); + expectTypeOf(data.categories).toEqualTypeOf>(); +}); diff --git a/src/Structures/SkyBlock/Member/Bestiary/SkyBlockMemberBestiary.ts b/src/Structures/SkyBlock/Member/Bestiary/SkyBlockMemberBestiary.ts new file mode 100644 index 000000000..f16317b5a --- /dev/null +++ b/src/Structures/SkyBlock/Member/Bestiary/SkyBlockMemberBestiary.ts @@ -0,0 +1,96 @@ +import { BestiaryBrackets, BestiaryMobs } from '../../../../Utils/Constants.js'; +import type { BestiaryCategory, BestiaryMob, BestiaryStats, RawBestiaryMob } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberBestiary { + kills: Record; + deaths: Record; + lastClaimedMilestone: number; + level: number; + maxLevel: number; + familiesUnlocked: number; + familiesCompleted: number; + totalFamilies: number; + familyTiers: number; + maxFamilyTiers: number; + categories: Record; + constructor(data: Record) { + this.kills = data?.kills || {}; + this.deaths = data?.deaths || {}; + this.lastClaimedMilestone = data?.milestone?.last_claimed_milestone || 0; + const parsed = this.getBestiary(); + this.level = parsed.level; + this.maxLevel = parsed.maxLevel; + this.familiesUnlocked = parsed.familiesUnlocked; + this.familiesCompleted = parsed.familiesCompleted; + this.totalFamilies = parsed.totalFamilies; + this.familyTiers = parsed.familyTiers; + this.maxFamilyTiers = parsed.maxFamilyTiers; + this.categories = parsed.categories; + } + + // Credit: https://github.com/SkyCryptWebsite/SkyCryptv2/blob/06d83b81f3c54c931511432259fbd4fe363e53d6/src/lib/server/stats/bestiary.ts + private getBestiaryMobs(mobList: RawBestiaryMob[]): BestiaryMob[] { + const output: BestiaryMob[] = []; + for (const mob of mobList) { + const mobBracket = BestiaryBrackets?.[mob.bracket] || []; + + const totalKills = mob.mobs.reduce((acc, mob) => acc + (this.kills[mob] || 0), 0); + const maxKills = mob.cap; + const nextTierKills = mobBracket.find((tier: number) => totalKills < tier && tier <= maxKills); + const tier = nextTierKills ? mobBracket.indexOf(nextTierKills) : mobBracket.indexOf(maxKills) + 1; + + output.push({ + name: mob.name, + kills: totalKills, + nextTierKills: nextTierKills ?? null, + maxKills: maxKills, + tier: tier, + maxTier: mobBracket.indexOf(maxKills) + 1 + }); + } + + return output; + } + + private getBestiary(): BestiaryStats { + const categories = {} as Record; + for (const [category, categoryData] of Object.entries(BestiaryMobs)) { + if ('Fishing' === categoryData.name) continue; + categories[category] = { + name: categoryData.name, + mobs: this.getBestiaryMobs(categoryData.mobs), + mobsUnlocked: 0, + mobsMaxed: 0 + }; + + categories[category].mobsUnlocked = categories[category].mobs.reduce( + (acc, mob) => acc + (0 < mob.kills ? 1 : 0), + 0 + ); + categories[category].mobsMaxed = categories[category].mobs.reduce( + (acc, mob) => acc + (mob.kills >= mob.maxKills ? 1 : 0), + 0 + ); + } + + const mobs = Object.values(categories).flatMap((category) => Object.values(category.mobs)); + const maxMilestone = mobs.map((mob) => mob.maxTier).reduce((acc, cur) => acc + cur, 0); + const milestone = mobs.map((mob) => mob.tier).reduce((acc, cur) => acc + cur, 0); + const familiesMaxed = mobs.filter((mob) => mob.tier === mob.maxTier).length; + const familiesUnlocked = mobs.filter((mob) => 0 < mob.kills).length; + const totalFamilies = mobs.length; + + return { + level: milestone / 10, + maxLevel: maxMilestone / 10, + familiesUnlocked: familiesUnlocked, + familiesCompleted: familiesMaxed, + totalFamilies: totalFamilies, + familyTiers: milestone, + maxFamilyTiers: maxMilestone, + categories: categories + }; + } +} + +export default SkyBlockMemberBestiary; diff --git a/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactory.test.ts b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactory.test.ts new file mode 100644 index 000000000..059a99112 --- /dev/null +++ b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactory.test.ts @@ -0,0 +1,50 @@ +import SkyBlockMemberChocolateFactory from './SkyBlockMemberChocolateFactory.js'; +import SkyBlockMemberChocolateFactoryEggs from './SkyBlockMemberChocolateFactoryEggs.js'; +import SkyBlockMemberChocolateFactoryEmployees from './SkyBlockMemberChocolateFactoryEmployees.js'; +import SkyBlockMemberChocolateFactoryHitmen from './SkyBlockMemberChocolateFactoryHitmen.js'; +import SkyBlockMemberChocolateFactoryTimeTower from './SkyBlockMemberChocolateFactoryTimeTower.js'; +import SkyBlockMemberChocolateFactoryUpgrades from './SkyBlockMemberChocolateFactoryUpgrades.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { SkyBlockArea } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberChocolateFactory', () => { + const data = new SkyBlockMemberChocolateFactory({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberChocolateFactory); + expectTypeOf(data).toEqualTypeOf(); + expect(data.employees).toBeDefined(); + expectTypeOf(data.employees).toEqualTypeOf(); + expect(data.timeTower).toBeDefined(); + expectTypeOf(data.timeTower).toEqualTypeOf(); + expect(data.upgrades).toBeDefined(); + expectTypeOf(data.upgrades).toEqualTypeOf(); + expect(data.hitman).toBeDefined(); + expectTypeOf(data.hitman).toEqualTypeOf(); + expect(data.currentChocolate).toBeDefined(); + expectTypeOf(data.currentChocolate).toEqualTypeOf(); + expect(data.chocolateSincePrestige).toBeDefined(); + expectTypeOf(data.chocolateSincePrestige).toEqualTypeOf(); + expect(data.totalChocolate).toBeDefined(); + expectTypeOf(data.totalChocolate).toEqualTypeOf(); + expect(data.barnCapacity).toBeDefined(); + expectTypeOf(data.barnCapacity).toEqualTypeOf(); + expect(data.prestige).toBeDefined(); + expectTypeOf(data.prestige).toEqualTypeOf(); + expect(data.lastViewedChocolateFactory).toBeDefined(); + expectTypeOf(data.lastViewedChocolateFactory).toEqualTypeOf(); + expect(data.lastViewedChocolateFactoryDate).toBeDefined(); + expectTypeOf(data.lastViewedChocolateFactoryDate).toEqualTypeOf(); + expect(data.supremeChocolateBars).toBeDefined(); + expectTypeOf(data.supremeChocolateBars).toEqualTypeOf(); + expect(data.eggs).toBeDefined(); + expectTypeOf(data.eggs).toEqualTypeOf(); + expect(data.foundRabbits).toBeDefined(); + expectTypeOf(data.foundRabbits).toEqualTypeOf>(); + expect(data.foundEggLocations).toBeDefined(); + expectTypeOf(data.foundEggLocations).toEqualTypeOf>(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.currentChocolate); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactory.ts b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactory.ts new file mode 100644 index 000000000..b60856a3f --- /dev/null +++ b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactory.ts @@ -0,0 +1,52 @@ +import SkyBlockMemberChocolateFactoryEggs from './SkyBlockMemberChocolateFactoryEggs.js'; +import SkyBlockMemberChocolateFactoryEmployees from './SkyBlockMemberChocolateFactoryEmployees.js'; +import SkyBlockMemberChocolateFactoryHitmen from './SkyBlockMemberChocolateFactoryHitmen.js'; +import SkyBlockMemberChocolateFactoryTimeTower from './SkyBlockMemberChocolateFactoryTimeTower.js'; +import SkyBlockMemberChocolateFactoryUpgrades from './SkyBlockMemberChocolateFactoryUpgrades.js'; +import type { SkyBlockArea } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberChocolateFactory { + employees: SkyBlockMemberChocolateFactoryEmployees; + timeTower: SkyBlockMemberChocolateFactoryTimeTower; + upgrades: SkyBlockMemberChocolateFactoryUpgrades; + hitman: SkyBlockMemberChocolateFactoryHitmen; + currentChocolate: number; + chocolateSincePrestige: number; + totalChocolate: number; + barnCapacity: number; + prestige: number; + lastViewedChocolateFactory: number; + lastViewedChocolateFactoryDate: Date; + supremeChocolateBars: number; + eggs: SkyBlockMemberChocolateFactoryEggs; + foundRabbits: Record; + foundEggLocations: Record; + constructor(data: Record) { + this.employees = new SkyBlockMemberChocolateFactoryEmployees(data?.employees || {}); + this.timeTower = new SkyBlockMemberChocolateFactoryTimeTower(data?.time_tower || {}); + this.upgrades = new SkyBlockMemberChocolateFactoryUpgrades(data || {}); + this.hitman = new SkyBlockMemberChocolateFactoryHitmen(data?.rabbit_hitmen || {}); + this.currentChocolate = data?.chocolate || 0; + this.chocolateSincePrestige = data?.chocolate_since_prestige || 0; + this.totalChocolate = data?.total_chocolate || 0; + this.barnCapacity = data?.rabbit_barn_capacity_level || 0; + this.prestige = data?.chocolate_level || 0; + this.lastViewedChocolateFactory = data?.last_viewed_chocolate_factory || 0; + this.lastViewedChocolateFactoryDate = new Date(this.lastViewedChocolateFactory); + this.supremeChocolateBars = data?.supreme_chocolate_bars || 0; + this.eggs = new SkyBlockMemberChocolateFactoryEggs(data?.rabbits?.collected_eggs || {}); + this.foundRabbits = Object.keys(data?.rabbits || {}) + .filter((key) => 'collected_eggs' !== key && 'collected_locations' !== key) + .reduce((obj: Record, key: string) => { + obj[key] = data.rabbits[key]; + return obj; + }, {}); + this.foundEggLocations = data?.rabbits?.collected_locations || {}; + } + + toString(): number { + return this.currentChocolate; + } +} + +export default SkyBlockMemberChocolateFactory; diff --git a/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryEggs.test.ts b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryEggs.test.ts new file mode 100644 index 000000000..1e4bafed3 --- /dev/null +++ b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryEggs.test.ts @@ -0,0 +1,21 @@ +import SkyBlockMemberChocolateFactoryEggs from './SkyBlockMemberChocolateFactoryEggs.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberChocolateFactoryEggs', () => { + const data = new SkyBlockMemberChocolateFactoryEggs({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberChocolateFactoryEggs); + expectTypeOf(data).toEqualTypeOf(); + expect(data.breakfast).toBeDefined(); + expectTypeOf(data.breakfast).toEqualTypeOf(); + expect(data.lunch).toBeDefined(); + expectTypeOf(data.lunch).toEqualTypeOf(); + expect(data.dinner).toBeDefined(); + expectTypeOf(data.dinner).toEqualTypeOf(); + expect(data.brunch).toBeDefined(); + expectTypeOf(data.brunch).toEqualTypeOf(); + expect(data.dejeuner).toBeDefined(); + expectTypeOf(data.dejeuner).toEqualTypeOf(); + expect(data.supper).toBeDefined(); + expectTypeOf(data.supper).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryEggs.ts b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryEggs.ts new file mode 100644 index 000000000..9179ec4d0 --- /dev/null +++ b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryEggs.ts @@ -0,0 +1,18 @@ +class SkyBlockMemberChocolateFactoryEggs { + breakfast: number; + lunch: number; + dinner: number; + brunch: number; + dejeuner: number; + supper: number; + constructor(data: Record) { + this.breakfast = data?.breakfast || 0; + this.lunch = data?.lunch || 0; + this.dinner = data?.dinner || 0; + this.brunch = data?.brunch || 0; + this.dejeuner = data?.dejeuner || 0; + this.supper = data?.supper || 0; + } +} + +export default SkyBlockMemberChocolateFactoryEggs; diff --git a/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryEmployees.test.ts b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryEmployees.test.ts new file mode 100644 index 000000000..0968aacef --- /dev/null +++ b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryEmployees.test.ts @@ -0,0 +1,23 @@ +import SkyBlockMemberChocolateFactoryEmployees from './SkyBlockMemberChocolateFactoryEmployees.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberChocolateFactoryEmployees', () => { + const data = new SkyBlockMemberChocolateFactoryEmployees({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberChocolateFactoryEmployees); + expectTypeOf(data).toEqualTypeOf(); + expect(data.bro).toBeDefined(); + expectTypeOf(data.bro).toEqualTypeOf(); + expect(data.cousin).toBeDefined(); + expectTypeOf(data.cousin).toEqualTypeOf(); + expect(data.sis).toBeDefined(); + expectTypeOf(data.sis).toEqualTypeOf(); + expect(data.father).toBeDefined(); + expectTypeOf(data.father).toEqualTypeOf(); + expect(data.grandma).toBeDefined(); + expectTypeOf(data.grandma).toEqualTypeOf(); + expect(data.dog).toBeDefined(); + expectTypeOf(data.dog).toEqualTypeOf(); + expect(data.uncle).toBeDefined(); + expectTypeOf(data.uncle).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryEmployees.ts b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryEmployees.ts new file mode 100644 index 000000000..d9c69584f --- /dev/null +++ b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryEmployees.ts @@ -0,0 +1,20 @@ +class SkyBlockMemberChocolateFactoryEmployees { + bro: number; + cousin: number; + sis: number; + father: number; + grandma: number; + dog: number; + uncle: number; + constructor(data: Record) { + this.bro = data?.rabbit_bro || 0; + this.cousin = data?.rabbit_cousin || 0; + this.father = data?.rabbit_father || 0; + this.grandma = data?.rabbit_grandma || 0; + this.sis = data?.rabbit_sis || 0; + this.dog = data?.rabbit_dog || 0; + this.uncle = data?.rabbit_uncle || 0; + } +} + +export default SkyBlockMemberChocolateFactoryEmployees; diff --git a/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryHitmen.test.ts b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryHitmen.test.ts new file mode 100644 index 000000000..e9857c62e --- /dev/null +++ b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryHitmen.test.ts @@ -0,0 +1,26 @@ +import SkyBlockMemberChocolateFactoryHitmen from './SkyBlockMemberChocolateFactoryHitmen.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberChocolateFactoryHitmen', () => { + const data = new SkyBlockMemberChocolateFactoryHitmen({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberChocolateFactoryHitmen); + expectTypeOf(data).toEqualTypeOf(); + expect(data.rabbitHitmenSlots).toBeDefined(); + expectTypeOf(data.rabbitHitmenSlots).toEqualTypeOf(); + expect(data.missedUncollectedEggs).toBeDefined(); + expectTypeOf(data.missedUncollectedEggs).toEqualTypeOf(); + expect(data.eggSlotCooldownMark).toBeDefined(); + expectTypeOf(data.eggSlotCooldownMark).toEqualTypeOf(); + expect(data.eggSlotCooldownMarkDate).toBeDefined(); + expectTypeOf(data.eggSlotCooldownMarkDate).toEqualTypeOf(); + expect(data.eggSlotCooldownExpire).toBeDefined(); + expectTypeOf(data.eggSlotCooldownExpire).toEqualTypeOf(); + expect(data.eggSlotCooldownExpireDate).toBeDefined(); + expectTypeOf(data.eggSlotCooldownExpireDate).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.rabbitHitmenSlots); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryHitmen.ts b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryHitmen.ts new file mode 100644 index 000000000..aa12dd44f --- /dev/null +++ b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryHitmen.ts @@ -0,0 +1,22 @@ +class SkyBlockMemberChocolateFactoryHitmen { + rabbitHitmenSlots: number; + missedUncollectedEggs: number; + eggSlotCooldownMark: number; + eggSlotCooldownMarkDate: Date; + eggSlotCooldownExpire: number; + eggSlotCooldownExpireDate: Date; + constructor(data: Record) { + this.rabbitHitmenSlots = data?.rabbit_hitmen_slots || 0; + this.missedUncollectedEggs = data?.missed_uncollected_eggs || 0; + this.eggSlotCooldownMark = data?.egg_slot_cooldown_mark || 0; + this.eggSlotCooldownMarkDate = new Date(this.eggSlotCooldownMark); + this.eggSlotCooldownExpire = this.eggSlotCooldownMark + (data?.egg_slot_cooldown_sum || 0); + this.eggSlotCooldownExpireDate = new Date(this.eggSlotCooldownExpire); + } + + toString(): number { + return this.rabbitHitmenSlots; + } +} + +export default SkyBlockMemberChocolateFactoryHitmen; diff --git a/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryTimeTower.test.ts b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryTimeTower.test.ts new file mode 100644 index 000000000..5248369e3 --- /dev/null +++ b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryTimeTower.test.ts @@ -0,0 +1,26 @@ +import SkyBlockMemberChocolateFactoryTimeTower from './SkyBlockMemberChocolateFactoryTimeTower.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberChocolateFactoryTimeTower', () => { + const data = new SkyBlockMemberChocolateFactoryTimeTower({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberChocolateFactoryTimeTower); + expectTypeOf(data).toEqualTypeOf(); + expect(data.charges).toBeDefined(); + expectTypeOf(data.charges).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.activationTime).toBeDefined(); + expectTypeOf(data.activationTime).toEqualTypeOf(); + expect(data.activationTimeDate).toBeDefined(); + expectTypeOf(data.activationTimeDate).toEqualTypeOf(); + expect(data.lastChargeTime).toBeDefined(); + expectTypeOf(data.lastChargeTime).toEqualTypeOf(); + expect(data.lastChargeTimeDate).toBeDefined(); + expectTypeOf(data.lastChargeTimeDate).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.level); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryTimeTower.ts b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryTimeTower.ts new file mode 100644 index 000000000..5c9544420 --- /dev/null +++ b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryTimeTower.ts @@ -0,0 +1,22 @@ +class SkyBlockMemberChocolateFactoryTimeTower { + charges: number; + level: number; + activationTime: number; + activationTimeDate: Date; + lastChargeTime: number; + lastChargeTimeDate: Date; + constructor(data: Record) { + this.charges = data?.charges || 0; + this.level = data?.level || 0; + this.activationTime = data?.activation_time || 0; + this.activationTimeDate = new Date(this.activationTime); + this.lastChargeTime = data?.last_charge_time || 0; + this.lastChargeTimeDate = new Date(this.lastChargeTime); + } + + toString(): number { + return this.level; + } +} + +export default SkyBlockMemberChocolateFactoryTimeTower; diff --git a/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryUpgrades.test.ts b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryUpgrades.test.ts new file mode 100644 index 000000000..cd06dc9bf --- /dev/null +++ b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryUpgrades.test.ts @@ -0,0 +1,15 @@ +import SkyBlockMemberChocolateFactoryUpgrades from './SkyBlockMemberChocolateFactoryUpgrades.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberChocolateFactoryUpgrades', () => { + const data = new SkyBlockMemberChocolateFactoryUpgrades({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberChocolateFactoryUpgrades); + expectTypeOf(data).toEqualTypeOf(); + expect(data.click).toBeDefined(); + expectTypeOf(data.click).toEqualTypeOf(); + expect(data.chocolateMultiplier).toBeDefined(); + expectTypeOf(data.chocolateMultiplier).toEqualTypeOf(); + expect(data.rabbitRarity).toBeDefined(); + expectTypeOf(data.rabbitRarity).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryUpgrades.ts b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryUpgrades.ts new file mode 100644 index 000000000..18a261739 --- /dev/null +++ b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryUpgrades.ts @@ -0,0 +1,12 @@ +class SkyBlockMemberChocolateFactoryUpgrades { + click: number; + chocolateMultiplier: number; + rabbitRarity: number; + constructor(data: Record) { + this.click = data?.click_upgrades || 0; + this.chocolateMultiplier = data?.chocolate_multiplier_upgrades || 0; + this.rabbitRarity = data?.rabbit_rarity_upgrades || 0; + } +} + +export default SkyBlockMemberChocolateFactoryUpgrades; diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsle.test.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsle.test.ts new file mode 100644 index 000000000..24ddc1e6d --- /dev/null +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsle.test.ts @@ -0,0 +1,38 @@ +import SkyBlockMemberCrimsonIsle from './SkyBlockMemberCrimsonIsle.js'; +import SkyBlockMemberCrimsonIsleAbiphone from './SkyBlockMemberCrimsonIsleAbiphone.js'; +import SkyBlockMemberCrimsonIsleDojo from './SkyBlockMemberCrimsonIsleDojo.js'; +import SkyBlockMemberCrimsonIsleKuudra from './SkyBlockMemberCrimsonIsleKuudra.js'; +import SkyBlockMemberCrimsonIsleMatriarch from './SkyBlockMemberCrimsonIsleMatriarch.js'; +import SkyBlockMemberCrimsonIsleTrophyFish from './SkyBlockMemberCrimsonIsleTrophyFish.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { CrimsonIsleBoss, CrimsonIsleFaction } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberCrimsonIsle', () => { + const data = new SkyBlockMemberCrimsonIsle({ stats: 'meow' }, { stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsle); + expectTypeOf(data).toEqualTypeOf(); + expect(data.dojo).toBeDefined(); + expectTypeOf(data.dojo).toEqualTypeOf(); + expect(data.kuudra).toBeDefined(); + expectTypeOf(data.kuudra).toEqualTypeOf(); + expect(data.matriarch).toBeDefined(); + expectTypeOf(data.matriarch).toEqualTypeOf(); + expect(data.abiphone).toBeDefined(); + expectTypeOf(data.abiphone).toEqualTypeOf(); + expect(data.faction).toBeDefined(); + expectTypeOf(data.faction).toEqualTypeOf(); + expect(data.magesReputation).toBeDefined(); + expectTypeOf(data.magesReputation).toEqualTypeOf(); + expect(data.barbariansReputation).toBeDefined(); + expectTypeOf(data.barbariansReputation).toEqualTypeOf(); + expect(data.lastMiniBossesKilled).toBeDefined(); + expectTypeOf(data.lastMiniBossesKilled).toEqualTypeOf(); + expect(data.trophyFishing).toBeDefined(); + expectTypeOf(data.trophyFishing).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => CrimsonIsleFaction | 'UNKNOWN'>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.faction); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsle.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsle.ts new file mode 100644 index 000000000..fa4c6db1f --- /dev/null +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsle.ts @@ -0,0 +1,38 @@ +import SkyBlockMemberCrimsonIsleAbiphone from './SkyBlockMemberCrimsonIsleAbiphone.js'; +import SkyBlockMemberCrimsonIsleDojo from './SkyBlockMemberCrimsonIsleDojo.js'; +import SkyBlockMemberCrimsonIsleKuudra from './SkyBlockMemberCrimsonIsleKuudra.js'; +import SkyBlockMemberCrimsonIsleMatriarch from './SkyBlockMemberCrimsonIsleMatriarch.js'; +import SkyBlockMemberCrimsonIsleTrophyFish from './SkyBlockMemberCrimsonIsleTrophyFish.js'; +import type { CrimsonIsleBoss, CrimsonIsleFaction } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberCrimsonIsle { + dojo: SkyBlockMemberCrimsonIsleDojo; + kuudra: SkyBlockMemberCrimsonIsleKuudra; + matriarch: SkyBlockMemberCrimsonIsleMatriarch; + abiphone: SkyBlockMemberCrimsonIsleAbiphone; + faction: CrimsonIsleFaction | 'UNKNOWN'; + magesReputation: number; + barbariansReputation: number; + lastMiniBossesKilled: CrimsonIsleBoss[]; + trophyFishing: SkyBlockMemberCrimsonIsleTrophyFish; + constructor(data: Record, trophyFish: Record) { + this.dojo = new SkyBlockMemberCrimsonIsleDojo(data?.dojo || {}); + this.kuudra = new SkyBlockMemberCrimsonIsleKuudra( + data?.kuudra_completed_tiers || {}, + data?.kuudra_party_finder || {} + ); + this.matriarch = new SkyBlockMemberCrimsonIsleMatriarch(data?.matriarch || {}); + this.abiphone = new SkyBlockMemberCrimsonIsleAbiphone(data?.abiphone || {}); + this.faction = data?.selected_faction || 'UNKNOWN'; + this.magesReputation = data?.mages_reputation || 0; + this.barbariansReputation = data?.barbarians_reputation || 0; + this.lastMiniBossesKilled = data?.last_minibosses_killed || []; + this.trophyFishing = new SkyBlockMemberCrimsonIsleTrophyFish(trophyFish); + } + + toString(): CrimsonIsleFaction | 'UNKNOWN' { + return this.faction; + } +} + +export default SkyBlockMemberCrimsonIsle; diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleAbiphone.test.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleAbiphone.test.ts new file mode 100644 index 000000000..f7af6dedc --- /dev/null +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleAbiphone.test.ts @@ -0,0 +1,33 @@ +import SkyBlockMemberCrimsonIsleAbiphone from './SkyBlockMemberCrimsonIsleAbiphone.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { + AbiphoneContact, + AbiphoneContactSort, + CrimsonIsleRingtone, + RawAbiphoneData +} from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberCrimsonIsleAbiphone', () => { + const data = new SkyBlockMemberCrimsonIsleAbiphone({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleAbiphone); + expectTypeOf(data).toEqualTypeOf(); + expect(data.contactData).toBeDefined(); + expectTypeOf(data.contactData).toEqualTypeOf>(); + expect(data.activeContacts).toBeDefined(); + expectTypeOf(data.activeContacts).toEqualTypeOf(); + expect(data.ringtone).toBeDefined(); + expectTypeOf(data.ringtone).toEqualTypeOf(); + expect(data.sort).toBeDefined(); + expectTypeOf(data.sort).toEqualTypeOf(); + expect(data.games).toBeDefined(); + expectTypeOf(data.games).toEqualTypeOf>(); + expect(data.operatorChip).toBeDefined(); + expectTypeOf(data.operatorChip).toEqualTypeOf>(); + expect(data.trioContactAddons).toBeDefined(); + expectTypeOf(data.trioContactAddons).toEqualTypeOf(); + expect(data.hasUsedSiriusPersonalPhoneNumberItem).toBeDefined(); + expectTypeOf(data.hasUsedSiriusPersonalPhoneNumberItem).toEqualTypeOf(); + expect(data.lastDyeCalledYear).toBeDefined(); + expectTypeOf(data.lastDyeCalledYear).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleAbiphone.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleAbiphone.ts new file mode 100644 index 000000000..f36d797ce --- /dev/null +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleAbiphone.ts @@ -0,0 +1,31 @@ +import type { + AbiphoneContact, + AbiphoneContactSort, + CrimsonIsleRingtone, + RawAbiphoneData +} from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberCrimsonIsleAbiphone { + contactData: Record; + activeContacts: AbiphoneContact[]; + ringtone: CrimsonIsleRingtone; + sort: AbiphoneContactSort | 'UNKNOWN'; + games: Record; + operatorChip: Record; + trioContactAddons: number; + hasUsedSiriusPersonalPhoneNumberItem: boolean; + lastDyeCalledYear: number; + constructor(data: Record) { + this.contactData = data?.contact_data || {}; + this.activeContacts = data?.active_contacts || []; + this.ringtone = data?.selected_ringtone || 'DEFAULT'; + this.sort = data?.selected_sort || 'UNKNOWN'; + this.games = data?.games || {}; + this.operatorChip = data?.operator_chip || {}; + this.trioContactAddons = data?.trio_contact_addons || 0; + this.hasUsedSiriusPersonalPhoneNumberItem = data?.has_used_sirius_personal_phone_number_item || false; + this.lastDyeCalledYear = data?.last_dye_called_year || 0; + } +} + +export default SkyBlockMemberCrimsonIsleAbiphone; diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojo.test.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojo.test.ts new file mode 100644 index 000000000..2f9733dbf --- /dev/null +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojo.test.ts @@ -0,0 +1,120 @@ +import SkyBlockMemberCrimsonIsleDojo from './SkyBlockMemberCrimsonIsleDojo.js'; +import SkyBlockMemberCrimsonIsleDojoMinigame from './SkyBlockMemberCrimsonIsleDojoMinigame.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { CrimsonIsleBelt } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberCrimsonIsleDojo', () => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + const data = new SkyBlockMemberCrimsonIsleDojo(); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleDojo); + expectTypeOf(data).toEqualTypeOf(); + expect(data.force).toBeDefined(); + expectTypeOf(data.force).toEqualTypeOf(); + expect(data.stamina).toBeDefined(); + expectTypeOf(data.stamina).toEqualTypeOf(); + expect(data.mastery).toBeDefined(); + expectTypeOf(data.mastery).toEqualTypeOf(); + expect(data.discipline).toBeDefined(); + expectTypeOf(data.discipline).toEqualTypeOf(); + expect(data.swiftness).toBeDefined(); + expectTypeOf(data.swiftness).toEqualTypeOf(); + expect(data.tenacity).toBeDefined(); + expectTypeOf(data.tenacity).toEqualTypeOf(); + expect(data.control).toBeDefined(); + expectTypeOf(data.control).toEqualTypeOf(); + expect(data.belt).toBeDefined(); + expectTypeOf(data.belt).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => CrimsonIsleBelt>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.belt); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); + +/* eslint-disable camelcase */ +test('SkyBlockMemberCrimsonIsleDojo getBelt (Black)', () => { + const data = new SkyBlockMemberCrimsonIsleDojo({ + dojo_points_mob_kb: 1000, + dojo_points_wall_jump: 1000, + dojo_points_archer: 1000, + dojo_points_sword_swap: 1000, + dojo_points_snake: 1000, + dojo_points_fireball: 1000, + dojo_points_lock_head: 1000 + }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleDojo); + expectTypeOf(data).toEqualTypeOf(); + expect(data.belt).toBeDefined(); + expect(data.belt).toBe('Black'); +}); + +test('SkyBlockMemberCrimsonIsleDojo getBelt (Brown)', () => { + const data = new SkyBlockMemberCrimsonIsleDojo({ + dojo_points_mob_kb: 1000, + dojo_points_wall_jump: 1000, + dojo_points_archer: 1000, + dojo_points_sword_swap: 1000, + dojo_points_snake: 1000, + dojo_points_fireball: 1000, + dojo_points_lock_head: 0 + }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleDojo); + expectTypeOf(data).toEqualTypeOf(); + expect(data.belt).toBeDefined(); + expect(data.belt).toBe('Brown'); +}); + +test('SkyBlockMemberCrimsonIsleDojo getBelt (Blue)', () => { + const data = new SkyBlockMemberCrimsonIsleDojo({ + dojo_points_mob_kb: 1000, + dojo_points_wall_jump: 1000, + dojo_points_archer: 1000, + dojo_points_sword_swap: 1000, + dojo_points_snake: 0, + dojo_points_fireball: 0, + dojo_points_lock_head: 0 + }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleDojo); + expectTypeOf(data).toEqualTypeOf(); + expect(data.belt).toBeDefined(); + expect(data.belt).toBe('Blue'); +}); + +test('SkyBlockMemberCrimsonIsleDojo getBelt (Green)', () => { + const data = new SkyBlockMemberCrimsonIsleDojo({ + dojo_points_mob_kb: 1000, + dojo_points_wall_jump: 1000, + dojo_points_archer: 0, + dojo_points_sword_swap: 0, + dojo_points_snake: 0, + dojo_points_fireball: 0, + dojo_points_lock_head: 0 + }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleDojo); + expectTypeOf(data).toEqualTypeOf(); + expect(data.belt).toBeDefined(); + expect(data.belt).toBe('Green'); +}); + +test('SkyBlockMemberCrimsonIsleDojo getBelt (Yellow)', () => { + const data = new SkyBlockMemberCrimsonIsleDojo({ + dojo_points_mob_kb: 1000, + dojo_points_wall_jump: 0, + dojo_points_archer: 0, + dojo_points_sword_swap: 0, + dojo_points_snake: 0, + dojo_points_fireball: 0, + dojo_points_lock_head: 0 + }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleDojo); + expectTypeOf(data).toEqualTypeOf(); + expect(data.belt).toBeDefined(); + expect(data.belt).toBe('Yellow'); +}); diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojo.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojo.ts new file mode 100644 index 000000000..f4f09fff8 --- /dev/null +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojo.ts @@ -0,0 +1,52 @@ +import SkyBlockMemberCrimsonIsleDojoMinigame from './SkyBlockMemberCrimsonIsleDojoMinigame.js'; +import type { CrimsonIsleBelt } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberCrimsonIsleDojo { + force: SkyBlockMemberCrimsonIsleDojoMinigame; + stamina: SkyBlockMemberCrimsonIsleDojoMinigame; + mastery: SkyBlockMemberCrimsonIsleDojoMinigame; + discipline: SkyBlockMemberCrimsonIsleDojoMinigame; + swiftness: SkyBlockMemberCrimsonIsleDojoMinigame; + tenacity: SkyBlockMemberCrimsonIsleDojoMinigame; + control: SkyBlockMemberCrimsonIsleDojoMinigame; + belt: CrimsonIsleBelt; + constructor(data: Record) { + this.force = new SkyBlockMemberCrimsonIsleDojoMinigame(data || {}, 'mob_kb'); + this.stamina = new SkyBlockMemberCrimsonIsleDojoMinigame(data || {}, 'wall_jump'); + this.mastery = new SkyBlockMemberCrimsonIsleDojoMinigame(data || {}, 'archer'); + this.discipline = new SkyBlockMemberCrimsonIsleDojoMinigame(data || {}, 'sword_swap'); + this.swiftness = new SkyBlockMemberCrimsonIsleDojoMinigame(data || {}, 'snake'); + this.tenacity = new SkyBlockMemberCrimsonIsleDojoMinigame(data || {}, 'fireball'); + this.control = new SkyBlockMemberCrimsonIsleDojoMinigame(data || {}, 'lock_head'); + this.belt = this.getBelt( + this.force.points + + this.stamina.points + + this.mastery.points + + this.discipline.points + + this.swiftness.points + + this.tenacity.points + + this.control.points + ); + } + + toString(): CrimsonIsleBelt { + return this.belt; + } + + private getBelt(points: number): CrimsonIsleBelt { + if (7000 <= points) { + return 'Black'; + } else if (6000 <= points) { + return 'Brown'; + } else if (4000 <= points) { + return 'Blue'; + } else if (2000 <= points) { + return 'Green'; + } else if (1000 <= points) { + return 'Yellow'; + } + return 'White'; + } +} + +export default SkyBlockMemberCrimsonIsleDojo; diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojoMinigame.test.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojoMinigame.test.ts new file mode 100644 index 000000000..e85e53016 --- /dev/null +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojoMinigame.test.ts @@ -0,0 +1,21 @@ +import SkyBlockMemberCrimsonIsleDojoMinigame from './SkyBlockMemberCrimsonIsleDojoMinigame.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { CrimsonIsleDojoRank } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberCrimsonIsleDojoMinigame', () => { + const data = new SkyBlockMemberCrimsonIsleDojoMinigame({ stats: 'meow' }, 'meow'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleDojoMinigame); + expectTypeOf(data).toEqualTypeOf(); + expect(data.points).toBeDefined(); + expectTypeOf(data.points).toEqualTypeOf(); + expect(data.time).toBeDefined(); + expectTypeOf(data.time).toEqualTypeOf(); + expect(data.rank).toBeDefined(); + expectTypeOf(data.rank).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => CrimsonIsleDojoRank>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.rank); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojoMinigame.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojoMinigame.ts new file mode 100644 index 000000000..578babbbf --- /dev/null +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojoMinigame.ts @@ -0,0 +1,33 @@ +import type { CrimsonIsleDojoRank } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberCrimsonIsleDojoMinigame { + points: number; + time: number; + rank: CrimsonIsleDojoRank; + constructor(data: Record, type: string) { + this.points = data?.[`dojo_points_${type}`] || 0; + this.time = data?.[`dojo_time_${type}`] || 0; + this.rank = this.getScore(this.points); + } + + toString(): CrimsonIsleDojoRank { + return this.rank; + } + + private getScore(points: number): CrimsonIsleDojoRank { + if (1000 <= points) { + return 'S'; + } else if (800 <= points) { + return 'A'; + } else if (600 <= points) { + return 'B'; + } else if (400 <= points) { + return 'C'; + } else if (200 <= points) { + return 'D'; + } + return 'F'; + } +} + +export default SkyBlockMemberCrimsonIsleDojoMinigame; diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleKuudra.test.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleKuudra.test.ts new file mode 100644 index 000000000..0c0a2e3de --- /dev/null +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleKuudra.test.ts @@ -0,0 +1,39 @@ +import SkyBlockMemberCrimsonIsleKuudra from './SkyBlockMemberCrimsonIsleKuudra.js'; +import SkyBlockMemberCrimsonIsleKuudraPartyFinder from './SkyBlockMemberCrimsonIsleKuudraPartyFinder.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberCrimsonIsleKuudra', () => { + const data = new SkyBlockMemberCrimsonIsleKuudra({ stats: 'meow' }, { stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleKuudra); + expectTypeOf(data).toEqualTypeOf(); + expect(data.basicCompletions).toBeDefined(); + expectTypeOf(data.basicCompletions).toEqualTypeOf(); + expect(data.highestWaveBasic).toBeDefined(); + expectTypeOf(data.highestWaveBasic).toEqualTypeOf(); + expect(data.hotCompletions).toBeDefined(); + expectTypeOf(data.hotCompletions).toEqualTypeOf(); + expect(data.highestWaveHot).toBeDefined(); + expectTypeOf(data.highestWaveHot).toEqualTypeOf(); + expect(data.burningCompletions).toBeDefined(); + expectTypeOf(data.burningCompletions).toEqualTypeOf(); + expect(data.highestWaveBurning).toBeDefined(); + expectTypeOf(data.highestWaveBurning).toEqualTypeOf(); + expect(data.fieryCompletions).toBeDefined(); + expectTypeOf(data.fieryCompletions).toEqualTypeOf(); + expect(data.highestWaveFiery).toBeDefined(); + expectTypeOf(data.highestWaveFiery).toEqualTypeOf(); + expect(data.infernalCompletions).toBeDefined(); + expectTypeOf(data.infernalCompletions).toEqualTypeOf(); + expect(data.highestWaveInfernal).toBeDefined(); + expectTypeOf(data.highestWaveInfernal).toEqualTypeOf(); + expect(data.partyFinderOptions).toBeDefined(); + expectTypeOf(data.partyFinderOptions).toEqualTypeOf(); + expect(data.totalCompletions).toBeDefined(); + expectTypeOf(data.totalCompletions).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.totalCompletions); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleKuudra.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleKuudra.ts new file mode 100644 index 000000000..5ae712ba4 --- /dev/null +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleKuudra.ts @@ -0,0 +1,41 @@ +import SkyBlockMemberCrimsonIsleKuudraPartyFinder from './SkyBlockMemberCrimsonIsleKuudraPartyFinder.js'; + +class SkyBlockMemberCrimsonIsleKuudra { + basicCompletions: number; + highestWaveBasic: number; + hotCompletions: number; + highestWaveHot: number; + burningCompletions: number; + highestWaveBurning: number; + fieryCompletions: number; + highestWaveFiery: number; + infernalCompletions: number; + highestWaveInfernal: number; + partyFinderOptions: SkyBlockMemberCrimsonIsleKuudraPartyFinder; + totalCompletions: number; + constructor(data: Record, partyFinderOptions: Record) { + this.basicCompletions = data?.none || 0; + this.highestWaveBasic = data?.highest_wave_none || 0; + this.hotCompletions = data?.hot || 0; + this.highestWaveHot = data?.highest_wave_hot || 0; + this.burningCompletions = data?.burning || 0; + this.highestWaveBurning = data?.highest_wave_burning || 0; + this.fieryCompletions = data?.fiery || 0; + this.highestWaveFiery = data?.highest_wave_fiery || 0; + this.infernalCompletions = data?.infernal || 0; + this.highestWaveInfernal = data?.highest_wave_infernal || 0; + this.partyFinderOptions = new SkyBlockMemberCrimsonIsleKuudraPartyFinder(partyFinderOptions || {}); + this.totalCompletions = + this.basicCompletions + + this.hotCompletions + + this.burningCompletions + + this.fieryCompletions + + this.infernalCompletions; + } + + toString(): number { + return this.totalCompletions; + } +} + +export default SkyBlockMemberCrimsonIsleKuudra; diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleKuudraPartyFinder.test.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleKuudraPartyFinder.test.ts new file mode 100644 index 000000000..e555471ac --- /dev/null +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleKuudraPartyFinder.test.ts @@ -0,0 +1,19 @@ +import SkyBlockMemberCrimsonIsleKuudraPartyFinder from './SkyBlockMemberCrimsonIsleKuudraPartyFinder.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { CrimsonIsleKuudraTier } from '../../../../Types/SkyBlock.js'; +import type { UserInput } from '../../../../Types/Global.js'; + +test('SkyBlockMemberCrimsonIsleKuudraPartyFinder', () => { + const data = new SkyBlockMemberCrimsonIsleKuudraPartyFinder({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleKuudraPartyFinder); + expectTypeOf(data).toEqualTypeOf(); + expect(data.searchTier).toBeDefined(); + expectTypeOf(data.searchTier).toEqualTypeOf(); + expect(data.groupBuildTier).toBeDefined(); + expectTypeOf(data.groupBuildTier).toEqualTypeOf(); + expect(data.groupBuildNote).toBeDefined(); + expectTypeOf(data.groupBuildNote).toEqualTypeOf(); + expect(data.groupBuildRequiredCombatLevel).toBeDefined(); + expectTypeOf(data.groupBuildRequiredCombatLevel).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleKuudraPartyFinder.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleKuudraPartyFinder.ts new file mode 100644 index 000000000..5bdaf90ea --- /dev/null +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleKuudraPartyFinder.ts @@ -0,0 +1,17 @@ +import type { CrimsonIsleKuudraTier } from '../../../../Types/SkyBlock.js'; +import type { UserInput } from '../../../../Types/Global.js'; + +class SkyBlockMemberCrimsonIsleKuudraPartyFinder { + searchTier: CrimsonIsleKuudraTier | 'UNKNOWN'; + groupBuildTier: CrimsonIsleKuudraTier | 'UNKNOWN'; + groupBuildNote: UserInput | null; + groupBuildRequiredCombatLevel: number | null; + constructor(data: Record) { + this.searchTier = data?.search_settings?.tier || 'UNKNOWN'; + this.groupBuildTier = data?.group_builder?.tier || 'UNKNOWN'; + this.groupBuildNote = data?.group_builder?.note || null; + this.groupBuildRequiredCombatLevel = data?.group_builder?.combat_level_required || null; + } +} + +export default SkyBlockMemberCrimsonIsleKuudraPartyFinder; diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleMatriarch.test.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleMatriarch.test.ts new file mode 100644 index 000000000..2fcee3f36 --- /dev/null +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleMatriarch.test.ts @@ -0,0 +1,20 @@ +import SkyBlockMemberCrimsonIsleMatriarch from './SkyBlockMemberCrimsonIsleMatriarch.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberCrimsonIsleMatriarch', () => { + const data = new SkyBlockMemberCrimsonIsleMatriarch({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleMatriarch); + expectTypeOf(data).toEqualTypeOf(); + expect(data.pearlsCollected).toBeDefined(); + expectTypeOf(data.pearlsCollected).toEqualTypeOf(); + expect(data.lastAttempt).toBeDefined(); + expectTypeOf(data.lastAttempt).toEqualTypeOf(); + expect(data.recentRefreshes).toBeDefined(); + expectTypeOf(data.recentRefreshes).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.pearlsCollected); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleMatriarch.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleMatriarch.ts new file mode 100644 index 000000000..f773db8d3 --- /dev/null +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleMatriarch.ts @@ -0,0 +1,16 @@ +class SkyBlockMemberCrimsonIsleMatriarch { + pearlsCollected: number; + lastAttempt: number; + recentRefreshes: number[]; + constructor(data: Record) { + this.pearlsCollected = data?.pearls_collected || 0; + this.lastAttempt = data?.last_attempt || 0; + this.recentRefreshes = data?.recent_refreshes || []; + } + + toString(): number { + return this.pearlsCollected; + } +} + +export default SkyBlockMemberCrimsonIsleMatriarch; diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish.test.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish.test.ts new file mode 100644 index 000000000..8947d3dd9 --- /dev/null +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish.test.ts @@ -0,0 +1,106 @@ +import SkyBlockMemberCrimsonIsleTrophyFish from './SkyBlockMemberCrimsonIsleTrophyFish.js'; +import SkyBlockMemberCrimsonIsleTrophyFishFish from './SkyBlockMemberCrimsonIsleTrophyFishFish.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { CrimsonIsleTrophyFishRank } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberCrimsonIsleTrophyFish', () => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + const data = new SkyBlockMemberCrimsonIsleTrophyFish(); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFish); + expectTypeOf(data).toEqualTypeOf(); + expect(data.rank).toBeDefined(); + expectTypeOf(data.rank).toEqualTypeOf(); + expect(data.gusher).toBeDefined(); + expectTypeOf(data.gusher).toEqualTypeOf(); + expect(data.blobfish).toBeDefined(); + expectTypeOf(data.blobfish).toEqualTypeOf(); + expect(data.lavaHorse).toBeDefined(); + expectTypeOf(data.lavaHorse).toEqualTypeOf(); + expect(data.goldenFish).toBeDefined(); + expectTypeOf(data.goldenFish).toEqualTypeOf(); + expect(data.volcanicStonefish).toBeDefined(); + expectTypeOf(data.volcanicStonefish).toEqualTypeOf(); + expect(data.slugfish).toBeDefined(); + expectTypeOf(data.slugfish).toEqualTypeOf(); + expect(data.vanille).toBeDefined(); + expectTypeOf(data.vanille).toEqualTypeOf(); + expect(data.obfuscatedFish1).toBeDefined(); + expectTypeOf(data.obfuscatedFish1).toEqualTypeOf(); + expect(data.obfuscatedFish2).toBeDefined(); + expectTypeOf(data.obfuscatedFish2).toEqualTypeOf(); + expect(data.obfuscatedFish3).toBeDefined(); + expectTypeOf(data.obfuscatedFish3).toEqualTypeOf(); + expect(data.sulphurSkitter).toBeDefined(); + expectTypeOf(data.sulphurSkitter).toEqualTypeOf(); + expect(data.skeletonFish).toBeDefined(); + expectTypeOf(data.skeletonFish).toEqualTypeOf(); + expect(data.manaRay).toBeDefined(); + expectTypeOf(data.manaRay).toEqualTypeOf(); + expect(data.flyfish).toBeDefined(); + expectTypeOf(data.flyfish).toEqualTypeOf(); + expect(data.steamingHotFlounder).toBeDefined(); + expectTypeOf(data.steamingHotFlounder).toEqualTypeOf(); + expect(data.soulFish).toBeDefined(); + expectTypeOf(data.soulFish).toEqualTypeOf(); + expect(data.karateFish).toBeDefined(); + expectTypeOf(data.karateFish).toEqualTypeOf(); + expect(data.moldfin).toBeDefined(); + expectTypeOf(data.moldfin).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => CrimsonIsleTrophyFishRank>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.rank); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); + +test('SkyBlockMemberCrimsonIsleTrophyFish getTrophyFishRank (Bronze)', () => { + const data = new SkyBlockMemberCrimsonIsleTrophyFish({ rewards: [1] }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFish); + expectTypeOf(data).toEqualTypeOf(); + expect(data.rank).toBeDefined(); + expectTypeOf(data.rank).toEqualTypeOf(); + expect(data.rank).toBe('Bronze'); +}); + +test('SkyBlockMemberCrimsonIsleTrophyFish getTrophyFishRank (Diamond)', () => { + const data = new SkyBlockMemberCrimsonIsleTrophyFish({ rewards: [1, 2, 3, 4] }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFish); + expectTypeOf(data).toEqualTypeOf(); + expect(data.rank).toBeDefined(); + expectTypeOf(data.rank).toEqualTypeOf(); + expect(data.rank).toBe('Diamond'); +}); + +test('SkyBlockMemberCrimsonIsleTrophyFish getTrophyFishRank (Gold)', () => { + const data = new SkyBlockMemberCrimsonIsleTrophyFish({ rewards: [1, 2, 3] }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFish); + expectTypeOf(data).toEqualTypeOf(); + expect(data.rank).toBeDefined(); + expectTypeOf(data.rank).toEqualTypeOf(); + expect(data.rank).toBe('Gold'); +}); + +test('SkyBlockMemberCrimsonIsleTrophyFish getTrophyFishRank (Silver)', () => { + const data = new SkyBlockMemberCrimsonIsleTrophyFish({ rewards: [1, 2] }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFish); + expectTypeOf(data).toEqualTypeOf(); + expect(data.rank).toBeDefined(); + expectTypeOf(data.rank).toEqualTypeOf(); + expect(data.rank).toBe('Silver'); +}); + +test('SkyBlockMemberCrimsonIsleTrophyFish getTrophyFishRank (Bronze)', () => { + const data = new SkyBlockMemberCrimsonIsleTrophyFish({ rewards: [1] }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFish); + expectTypeOf(data).toEqualTypeOf(); + expect(data.rank).toBeDefined(); + expectTypeOf(data.rank).toEqualTypeOf(); + expect(data.rank).toBe('Bronze'); +}); diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish.ts new file mode 100644 index 000000000..0b3f4d251 --- /dev/null +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish.ts @@ -0,0 +1,67 @@ +import SkyBlockMemberCrimsonIsleTrophyFishFish from './SkyBlockMemberCrimsonIsleTrophyFishFish.js'; +import type { CrimsonIsleTrophyFishRank } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberCrimsonIsleTrophyFish { + rank: CrimsonIsleTrophyFishRank; + gusher: SkyBlockMemberCrimsonIsleTrophyFishFish; + blobfish: SkyBlockMemberCrimsonIsleTrophyFishFish; + lavaHorse: SkyBlockMemberCrimsonIsleTrophyFishFish; + goldenFish: SkyBlockMemberCrimsonIsleTrophyFishFish; + volcanicStonefish: SkyBlockMemberCrimsonIsleTrophyFishFish; + slugfish: SkyBlockMemberCrimsonIsleTrophyFishFish; + vanille: SkyBlockMemberCrimsonIsleTrophyFishFish; + obfuscatedFish1: SkyBlockMemberCrimsonIsleTrophyFishFish; + obfuscatedFish2: SkyBlockMemberCrimsonIsleTrophyFishFish; + obfuscatedFish3: SkyBlockMemberCrimsonIsleTrophyFishFish; + sulphurSkitter: SkyBlockMemberCrimsonIsleTrophyFishFish; + skeletonFish: SkyBlockMemberCrimsonIsleTrophyFishFish; + manaRay: SkyBlockMemberCrimsonIsleTrophyFishFish; + flyfish: SkyBlockMemberCrimsonIsleTrophyFishFish; + steamingHotFlounder: SkyBlockMemberCrimsonIsleTrophyFishFish; + soulFish: SkyBlockMemberCrimsonIsleTrophyFishFish; + karateFish: SkyBlockMemberCrimsonIsleTrophyFishFish; + moldfin: SkyBlockMemberCrimsonIsleTrophyFishFish; + constructor(data: Record) { + const rewards = data?.rewards || [1]; + this.rank = this.getTrophyFishRank(rewards[rewards.length - 1]); + this.gusher = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'gusher'); + this.blobfish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'blobfish'); + this.lavaHorse = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'lava_horse'); + this.goldenFish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'golden_fish'); + this.volcanicStonefish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'volcanic_stonefish'); + this.slugfish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'slugfish'); + this.vanille = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'vanille'); + this.obfuscatedFish1 = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'obfuscated_fish_1'); + this.obfuscatedFish2 = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'obfuscated_fish_2'); + this.obfuscatedFish3 = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'obfuscated_fish_3'); + this.sulphurSkitter = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'sulphur_skitter'); + this.skeletonFish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'skeleton_fish'); + this.manaRay = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'mana_ray'); + this.flyfish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'flyfish'); + this.steamingHotFlounder = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'steaming_hot_flounder'); + this.soulFish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'soul_fish'); + this.karateFish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'karate_fish'); + this.moldfin = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'moldfin'); + } + + toString(): CrimsonIsleTrophyFishRank { + return this.rank; + } + + private getTrophyFishRank(level: number): CrimsonIsleTrophyFishRank { + switch (level) { + case 1: + return 'Bronze'; + case 2: + return 'Silver'; + case 3: + return 'Gold'; + case 4: + return 'Diamond'; + default: + return 'Bronze'; + } + } +} + +export default SkyBlockMemberCrimsonIsleTrophyFish; diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFishFish.test.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFishFish.test.ts new file mode 100644 index 000000000..859ea9906 --- /dev/null +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFishFish.test.ts @@ -0,0 +1,24 @@ +import SkyBlockMemberCrimsonIsleTrophyFishFish from './SkyBlockMemberCrimsonIsleTrophyFishFish.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberCrimsonIsleTrophyFishFish', () => { + const data = new SkyBlockMemberCrimsonIsleTrophyFishFish({ stats: 'meow' }, 'meow'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFishFish); + expectTypeOf(data).toEqualTypeOf(); + expect(data.bronze).toBeDefined(); + expectTypeOf(data.bronze).toEqualTypeOf(); + expect(data.silver).toBeDefined(); + expectTypeOf(data.silver).toEqualTypeOf(); + expect(data.gold).toBeDefined(); + expectTypeOf(data.gold).toEqualTypeOf(); + expect(data.diamond).toBeDefined(); + expectTypeOf(data.diamond).toEqualTypeOf(); + expect(data.total).toBeDefined(); + expectTypeOf(data.total).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.total); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFishFish.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFishFish.ts new file mode 100644 index 000000000..2f2d7e222 --- /dev/null +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFishFish.ts @@ -0,0 +1,20 @@ +class SkyBlockMemberCrimsonIsleTrophyFishFish { + bronze: number; + silver: number; + gold: number; + diamond: number; + total: number; + constructor(data: Record, fishName: string) { + this.bronze = data?.[`${fishName}_bronze`] || 0; + this.silver = data?.[`${fishName}_silver`] || 0; + this.gold = data?.[`${fishName}_gold`] || 0; + this.diamond = data?.[`${fishName}_diamond`] || 0; + this.total = this.bronze + this.silver + this.gold + this.diamond; + } + + toString(): number { + return this.total; + } +} + +export default SkyBlockMemberCrimsonIsleTrophyFishFish; diff --git a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeons.test.ts b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeons.test.ts new file mode 100644 index 000000000..750e714d6 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeons.test.ts @@ -0,0 +1,34 @@ +import SkyBlockMemberDungeons from './SkyBlockMemberDungeons.js'; +import SkyBlockMemberDungeonsClasses from './SkyBlockMemberDungeonsClasses.js'; +import SkyBlockMemberDungeonsMode from './SkyBlockMemberDungeonsMode.js'; +import SkyBlockMemberDungeonsTreasureRun from './SkyBlockMemberDungeonsTreasureRun.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { DungeonFloor, SkillLevelData } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberDungeons', () => { + const data = new SkyBlockMemberDungeons({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberDungeons); + expectTypeOf(data).toEqualTypeOf(); + expect(data.catacombs).toBeDefined(); + expectTypeOf(data.catacombs).toEqualTypeOf(); + expect(data.masterCatacombs).toBeDefined(); + expectTypeOf(data.masterCatacombs).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.classes).toBeDefined(); + expectTypeOf(data.classes).toEqualTypeOf(); + expect(data.unlockedJournals).toBeDefined(); + expectTypeOf(data.unlockedJournals).toEqualTypeOf(); + expect(data.treasures).toBeDefined(); + expectTypeOf(data.treasures).toEqualTypeOf(); + expect(data.lastDungeonRun).toBeDefined(); + expectTypeOf(data.lastDungeonRun).toEqualTypeOf(); + expect(data.secrets).toBeDefined(); + expectTypeOf(data.secrets).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.level.level); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeons.ts b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeons.ts new file mode 100644 index 000000000..8b5ed1bf8 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeons.ts @@ -0,0 +1,34 @@ +import SkyBlockMemberDungeonsClasses from './SkyBlockMemberDungeonsClasses.js'; +import SkyBlockMemberDungeonsMode from './SkyBlockMemberDungeonsMode.js'; +import SkyBlockMemberDungeonsTreasureRun from './SkyBlockMemberDungeonsTreasureRun.js'; +import { getLevelByXp } from '../../../../Utils/SkyBlockUtils.js'; +import type { DungeonFloor, SkillLevelData } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberDungeons { + catacombs: SkyBlockMemberDungeonsMode; + masterCatacombs: SkyBlockMemberDungeonsMode; + level: SkillLevelData; + classes: SkyBlockMemberDungeonsClasses; + unlockedJournals: string[]; + treasures: SkyBlockMemberDungeonsTreasureRun[]; + lastDungeonRun: DungeonFloor | 'UNKNOWN'; + secrets: number; + constructor(data: Record) { + this.catacombs = new SkyBlockMemberDungeonsMode(data?.dungeon_types || {}, 'catacombs'); + this.masterCatacombs = new SkyBlockMemberDungeonsMode(data?.dungeon_types || {}, 'master_catacombs'); + this.level = getLevelByXp(data?.dungeon_types?.catacombs?.experience || 0, { type: 'dungeoneering' }); + this.classes = new SkyBlockMemberDungeonsClasses(data || {}); + this.unlockedJournals = data?.dungeon_journal?.unlocked_journals || []; + this.treasures = (data?.treasures?.runs || []).map( + (run: Record) => new SkyBlockMemberDungeonsTreasureRun(run, data?.treasures?.chests) + ); + this.lastDungeonRun = data?.last_dungeon_run || 'UNKNOWN'; + this.secrets = data?.secrets || 0; + } + + toString(): number { + return this.level.level; + } +} + +export default SkyBlockMemberDungeons; diff --git a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsClasses.test.ts b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsClasses.test.ts new file mode 100644 index 000000000..541170ca0 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsClasses.test.ts @@ -0,0 +1,29 @@ +import SkyBlockMemberDungeonsClasses from './SkyBlockMemberDungeonsClasses.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { DungeonClass, SkillLevelData } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberDungeonsClasses', () => { + const data = new SkyBlockMemberDungeonsClasses({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberDungeonsClasses); + expectTypeOf(data).toEqualTypeOf(); + expect(data.selected).toBeDefined(); + expectTypeOf(data.selected).toEqualTypeOf(); + expect(data.healer).toBeDefined(); + expectTypeOf(data.healer).toEqualTypeOf(); + expect(data.berserk).toBeDefined(); + expectTypeOf(data.berserk).toEqualTypeOf(); + expect(data.mage).toBeDefined(); + expectTypeOf(data.mage).toEqualTypeOf(); + expect(data.archer).toBeDefined(); + expectTypeOf(data.archer).toEqualTypeOf(); + expect(data.tank).toBeDefined(); + expectTypeOf(data.tank).toEqualTypeOf(); + expect(data.average).toBeDefined(); + expectTypeOf(data.average).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => DungeonClass | 'UNKNOWN'>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.selected); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsClasses.ts b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsClasses.ts new file mode 100644 index 000000000..3f916aa7f --- /dev/null +++ b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsClasses.ts @@ -0,0 +1,27 @@ +import { getLevelByXp } from '../../../../Utils/SkyBlockUtils.js'; +import type { DungeonClass, SkillLevelData } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberDungeonsClasses { + selected: DungeonClass | 'UNKNOWN'; + healer: SkillLevelData; + berserk: SkillLevelData; + mage: SkillLevelData; + archer: SkillLevelData; + tank: SkillLevelData; + average: number; + constructor(data: Record) { + this.selected = data?.selected_dungeon_class || 'UNKNOWN'; + this.healer = getLevelByXp(data?.player_classes?.healer?.experience || 0, { type: 'dungeoneering' }); + this.berserk = getLevelByXp(data?.player_classes?.berserk?.experience || 0, { type: 'dungeoneering' }); + this.mage = getLevelByXp(data?.player_classes?.mage?.experience || 0, { type: 'dungeoneering' }); + this.archer = getLevelByXp(data?.player_classes?.archer?.experience || 0, { type: 'dungeoneering' }); + this.tank = getLevelByXp(data?.player_classes?.tank?.experience || 0, { type: 'dungeoneering' }); + this.average = (this.healer.level + this.berserk.level + this.mage.level + this.archer.level + this.tank.level) / 5; + } + + toString(): DungeonClass | 'UNKNOWN' { + return this.selected; + } +} + +export default SkyBlockMemberDungeonsClasses; diff --git a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsFloor.test.ts b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsFloor.test.ts new file mode 100644 index 000000000..322325b99 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsFloor.test.ts @@ -0,0 +1,43 @@ +import SkyBlockMemberDungeonsFloor from './SkyBlockMemberDungeonsFloor.js'; +import SkyBlockMemberDungeonsFloorRun from './SkyBlockMemberDungeonsFloorRun.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberDungeonsFloor', () => { + const data = new SkyBlockMemberDungeonsFloor({ stats: 'meow' }, '0'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberDungeonsFloor); + expectTypeOf(data).toEqualTypeOf(); + expect(data.timesPlayed).toBeDefined(); + expectTypeOf(data.timesPlayed).toEqualTypeOf(); + expect(data.bestRuns).toBeDefined(); + expectTypeOf(data.bestRuns).toEqualTypeOf(); + expect(data.bestScore).toBeDefined(); + expectTypeOf(data.bestScore).toEqualTypeOf(); + expect(data.mobsKilled).toBeDefined(); + expectTypeOf(data.mobsKilled).toEqualTypeOf(); + expect(data.mostMobsKilled).toBeDefined(); + expectTypeOf(data.mostMobsKilled).toEqualTypeOf(); + expect(data.mostDamageBerserk).toBeDefined(); + expectTypeOf(data.mostDamageBerserk).toEqualTypeOf(); + expect(data.mostDamageMage).toBeDefined(); + expectTypeOf(data.mostDamageMage).toEqualTypeOf(); + expect(data.mostDamageHealer).toBeDefined(); + expectTypeOf(data.mostDamageHealer).toEqualTypeOf(); + expect(data.mostDamageArcher).toBeDefined(); + expectTypeOf(data.mostDamageArcher).toEqualTypeOf(); + expect(data.mostDamageTank).toBeDefined(); + expectTypeOf(data.mostDamageTank).toEqualTypeOf(); + expect(data.mostHealing).toBeDefined(); + expectTypeOf(data.mostHealing).toEqualTypeOf(); + expect(data.watcherKills).toBeDefined(); + expectTypeOf(data.watcherKills).toEqualTypeOf(); + expect(data.fastestTimeS).toBeDefined(); + expectTypeOf(data.fastestTimeS).toEqualTypeOf(); + expect(data.fastestTimeSPlus).toBeDefined(); + expectTypeOf(data.fastestTimeSPlus).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.timesPlayed); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsFloor.ts b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsFloor.ts new file mode 100644 index 000000000..827e4713f --- /dev/null +++ b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsFloor.ts @@ -0,0 +1,42 @@ +import SkyBlockMemberDungeonsFloorRun from './SkyBlockMemberDungeonsFloorRun.js'; + +class SkyBlockMemberDungeonsFloor { + timesPlayed: number; + bestRuns: SkyBlockMemberDungeonsFloorRun[]; + bestScore: number; + mobsKilled: number; + mostMobsKilled: number; + mostDamageBerserk: number; + mostDamageMage: number; + mostDamageHealer: number; + mostDamageArcher: number; + mostDamageTank: number; + mostHealing: number; + watcherKills: number; + fastestTimeS: number; + fastestTimeSPlus: number; + constructor(data: Record, floorNumber: '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7') { + this.timesPlayed = data?.tier_completions?.[floorNumber] || 0; + this.bestRuns = (data?.best_runs?.[floorNumber] || []).map( + (run: Record) => new SkyBlockMemberDungeonsFloorRun(run) + ); + this.bestScore = data?.best_score?.[floorNumber] || 0; + this.mobsKilled = data?.mobs_killed?.[floorNumber] || 0; + this.mostMobsKilled = data?.most_mobs_killed?.[floorNumber] || 0; + this.mostDamageBerserk = data?.most_damage_berserk?.[floorNumber] || 0; + this.mostDamageMage = data?.most_damage_mage?.[floorNumber] || 0; + this.mostDamageHealer = data?.most_damage_healer?.[floorNumber] || 0; + this.mostDamageArcher = data?.most_damage_archer?.[floorNumber] || 0; + this.mostDamageTank = data?.most_damage_tank?.[floorNumber] || 0; + this.mostHealing = data?.most_healing?.[floorNumber] || 0; + this.watcherKills = data?.watcher_kills?.[floorNumber] || 0; + this.fastestTimeS = data?.fastest_time_s?.[floorNumber] || 0; + this.fastestTimeSPlus = data?.fastest_time_s_plus?.[floorNumber] || 0; + } + + toString(): number { + return this.timesPlayed; + } +} + +export default SkyBlockMemberDungeonsFloor; diff --git a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsFloorRun.test.ts b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsFloorRun.test.ts new file mode 100644 index 000000000..e3510d9a6 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsFloorRun.test.ts @@ -0,0 +1,46 @@ +import SkyBlockMemberDungeonsFloorRun from './SkyBlockMemberDungeonsFloorRun.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { DungeonClass } from '../../../../Types/SkyBlock.js'; +import type { UUID } from '../../../../Types/Global.js'; + +test('SkyBlockMemberDungeonsFloorRun', () => { + const data = new SkyBlockMemberDungeonsFloorRun({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberDungeonsFloorRun); + expectTypeOf(data).toEqualTypeOf(); + expect(data.timestamp).toBeDefined(); + expectTypeOf(data.timestamp).toEqualTypeOf(); + expect(data.explorationScore).toBeDefined(); + expectTypeOf(data.explorationScore).toEqualTypeOf(); + expect(data.speedScore).toBeDefined(); + expectTypeOf(data.speedScore).toEqualTypeOf(); + expect(data.skillScore).toBeDefined(); + expectTypeOf(data.skillScore).toEqualTypeOf(); + expect(data.bonusScore).toBeDefined(); + expectTypeOf(data.bonusScore).toEqualTypeOf(); + expect(data.score).toBeDefined(); + expectTypeOf(data.score).toEqualTypeOf(); + expect(data.selectedClass).toBeDefined(); + expectTypeOf(data.selectedClass).toEqualTypeOf(); + expect(data.teammates).toBeDefined(); + expectTypeOf(data.teammates).toEqualTypeOf(); + expect(data.elapsedTime).toBeDefined(); + expectTypeOf(data.elapsedTime).toEqualTypeOf(); + expect(data.damageDealt).toBeDefined(); + expectTypeOf(data.damageDealt).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.mobsKilled).toBeDefined(); + expectTypeOf(data.mobsKilled).toEqualTypeOf(); + expect(data.secretsFound).toBeDefined(); + expectTypeOf(data.secretsFound).toEqualTypeOf(); + expect(data.damageMitigated).toBeDefined(); + expectTypeOf(data.damageMitigated).toEqualTypeOf(); + expect(data.allyHealing).toBeDefined(); + expectTypeOf(data.allyHealing).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.score); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsFloorRun.ts b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsFloorRun.ts new file mode 100644 index 000000000..c0802972e --- /dev/null +++ b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsFloorRun.ts @@ -0,0 +1,43 @@ +import type { DungeonClass } from '../../../../Types/SkyBlock.js'; +import type { UUID } from '../../../../Types/Global.js'; + +class SkyBlockMemberDungeonsFloorRun { + timestamp: number; + explorationScore: number; + speedScore: number; + skillScore: number; + bonusScore: number; + score: number; + selectedClass: DungeonClass; + teammates: UUID[]; + elapsedTime: number; + damageDealt: number; + deaths: number; + mobsKilled: number; + secretsFound: number; + damageMitigated: number; + allyHealing: number; + constructor(data: Record) { + this.timestamp = data?.timestamp || 0; + this.explorationScore = data?.score_exploration || 0; + this.speedScore = data?.score_speed || 0; + this.skillScore = data?.score_skill || 0; + this.bonusScore = data?.score_bonus || 0; + this.score = this.explorationScore + this.speedScore + this.skillScore + this.bonusScore; + this.selectedClass = data?.dungeon_class || 'mage'; + this.teammates = data?.teammates || []; + this.elapsedTime = data?.elapsed_time || 0; + this.damageDealt = data?.damage_delt || 0; + this.deaths = data?.deaths || 0; + this.mobsKilled = data?.mobs_killed || 0; + this.secretsFound = data?.secrets_found || 0; + this.damageMitigated = data?.damage_mitigated || 0; + this.allyHealing = data?.ally_healing || 0; + } + + toString(): number { + return this.score; + } +} + +export default SkyBlockMemberDungeonsFloorRun; diff --git a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsMode.test.ts b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsMode.test.ts new file mode 100644 index 000000000..edb28f2db --- /dev/null +++ b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsMode.test.ts @@ -0,0 +1,33 @@ +import SkyBlockMemberDungeonsFloor from './SkyBlockMemberDungeonsFloor.js'; +import SkyBlockMemberDungeonsMode from './SkyBlockMemberDungeonsMode.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberDungeonsMode', () => { + const data = new SkyBlockMemberDungeonsMode({ stats: 'meow' }, 'catacombs'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberDungeonsMode); + expectTypeOf(data).toEqualTypeOf(); + expect(data.highestFloorCompleted).toBeDefined(); + expectTypeOf(data.highestFloorCompleted).toEqualTypeOf(); + expect(data.floor0).toBeDefined(); + expectTypeOf(data.floor0).toEqualTypeOf(); + expect(data.floor1).toBeDefined(); + expectTypeOf(data.floor1).toEqualTypeOf(); + expect(data.floor2).toBeDefined(); + expectTypeOf(data.floor2).toEqualTypeOf(); + expect(data.floor3).toBeDefined(); + expectTypeOf(data.floor3).toEqualTypeOf(); + expect(data.floor4).toBeDefined(); + expectTypeOf(data.floor4).toEqualTypeOf(); + expect(data.floor5).toBeDefined(); + expectTypeOf(data.floor5).toEqualTypeOf(); + expect(data.floor6).toBeDefined(); + expectTypeOf(data.floor6).toEqualTypeOf(); + expect(data.floor7).toBeDefined(); + expectTypeOf(data.floor7).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.highestFloorCompleted); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsMode.ts b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsMode.ts new file mode 100644 index 000000000..c5e6b7320 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsMode.ts @@ -0,0 +1,31 @@ +import SkyBlockMemberDungeonsFloor from './SkyBlockMemberDungeonsFloor.js'; +import type { DungeonGamemode } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberDungeonsMode { + highestFloorCompleted: number; + floor0: SkyBlockMemberDungeonsFloor | null; + floor1: SkyBlockMemberDungeonsFloor; + floor2: SkyBlockMemberDungeonsFloor; + floor3: SkyBlockMemberDungeonsFloor; + floor4: SkyBlockMemberDungeonsFloor; + floor5: SkyBlockMemberDungeonsFloor; + floor6: SkyBlockMemberDungeonsFloor; + floor7: SkyBlockMemberDungeonsFloor; + constructor(data: Record, type: DungeonGamemode) { + this.highestFloorCompleted = data?.[type]?.highest_tier_completed || 0; + this.floor0 = 'catacombs' === type ? new SkyBlockMemberDungeonsFloor(data?.[type] || {}, '0') : null; + this.floor1 = new SkyBlockMemberDungeonsFloor(data?.[type] || {}, '1'); + this.floor2 = new SkyBlockMemberDungeonsFloor(data?.[type] || {}, '2'); + this.floor3 = new SkyBlockMemberDungeonsFloor(data?.[type] || {}, '3'); + this.floor4 = new SkyBlockMemberDungeonsFloor(data?.[type] || {}, '4'); + this.floor5 = new SkyBlockMemberDungeonsFloor(data?.[type] || {}, '5'); + this.floor6 = new SkyBlockMemberDungeonsFloor(data?.[type] || {}, '6'); + this.floor7 = new SkyBlockMemberDungeonsFloor(data?.[type] || {}, '7'); + } + + toString(): number { + return this.highestFloorCompleted; + } +} + +export default SkyBlockMemberDungeonsMode; diff --git a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasureRun.test.ts b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasureRun.test.ts new file mode 100644 index 000000000..74485bb29 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasureRun.test.ts @@ -0,0 +1,33 @@ +import SkyBlockMemberDungeonsTreasureRun from './SkyBlockMemberDungeonsTreasureRun.js'; +import SkyBlockMemberDungeonsTreasuresChest from './SkyBlockMemberDungeonsTreasuresChest.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { DungeonGamemode } from '../../../../Types/SkyBlock.js'; +import type { UUID, UserInput } from '../../../../Types/Global.js'; + +test('SkyBlockMemberDungeonsTreasureRun', () => { + const data = new SkyBlockMemberDungeonsTreasureRun({ stats: 'meow' }, [{ stats: 'meow' }]); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberDungeonsTreasureRun); + expectTypeOf(data).toEqualTypeOf(); + expect(data.runId).toBeDefined(); + expectTypeOf(data.runId).toEqualTypeOf(); + expect(data.completionTimestamp).toBeDefined(); + expectTypeOf(data.completionTimestamp).toEqualTypeOf(); + expect(data.completionDate).toBeDefined(); + expectTypeOf(data.completionDate).toEqualTypeOf(); + expect(data.type).toBeDefined(); + expectTypeOf(data.type).toEqualTypeOf(); + expect(data.dungeonTier).toBeDefined(); + expectTypeOf(data.dungeonTier).toEqualTypeOf(); + expect(data.participants).toBeDefined(); + expectTypeOf(data.participants).toEqualTypeOf< + { playerUUID: UUID; displayName: UserInput; classMilestone: number }[] + >(); + expect(data.chests).toBeDefined(); + expectTypeOf(data.chests).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.runId); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasureRun.ts b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasureRun.ts new file mode 100644 index 000000000..54d6a5717 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasureRun.ts @@ -0,0 +1,30 @@ +import SkyBlockMemberDungeonsTreasuresChest from './SkyBlockMemberDungeonsTreasuresChest.js'; +import type { DungeonGamemode } from '../../../../Types/SkyBlock.js'; +import type { UUID, UserInput } from '../../../../Types/Global.js'; + +class SkyBlockMemberDungeonsTreasureRun { + runId: string; + completionTimestamp: number; + completionDate: Date; + type: DungeonGamemode; + dungeonTier: number; + participants: { playerUUID: UUID; displayName: UserInput; classMilestone: number }[]; + chests: SkyBlockMemberDungeonsTreasuresChest[]; + constructor(data: Record, chestData: Record[]) { + this.runId = data?.run_id || 'UNKNOWN'; + this.completionTimestamp = data?.completion_ts || 0; + this.completionDate = new Date(this.completionTimestamp); + this.type = data?.type || 'catacombs'; + this.dungeonTier = data?.dungeon_tier || 0; + this.participants = data?.participants || []; + this.chests = chestData + .filter((chest) => chest.run_id === this.runId) + .map((chest) => new SkyBlockMemberDungeonsTreasuresChest(chest)); + } + + toString(): string { + return this.runId; + } +} + +export default SkyBlockMemberDungeonsTreasureRun; diff --git a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasuresChest.test.ts b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasuresChest.test.ts new file mode 100644 index 000000000..8432f99c4 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasuresChest.test.ts @@ -0,0 +1,28 @@ +import SkyBlockMemberDungeonsTreasuresChest from './SkyBlockMemberDungeonsTreasuresChest.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { DungeonsTreasureType } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberDungeonsTreasuresChest', () => { + const data = new SkyBlockMemberDungeonsTreasuresChest({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberDungeonsTreasuresChest); + expectTypeOf(data).toEqualTypeOf(); + expect(data.runId).toBeDefined(); + expectTypeOf(data.runId).toEqualTypeOf(); + expect(data.chestId).toBeDefined(); + expectTypeOf(data.chestId).toEqualTypeOf(); + expect(data.chestType).toBeDefined(); + expectTypeOf(data.chestType).toEqualTypeOf(); + expect(data.rewards).toBeDefined(); + expectTypeOf(data.rewards).toEqualTypeOf(); + expect(data.rolledRNGMeter).toBeDefined(); + expectTypeOf(data.rolledRNGMeter).toEqualTypeOf(); + expect(data.quality).toBeDefined(); + expectTypeOf(data.quality).toEqualTypeOf(); + expect(data.shinyEligible).toBeDefined(); + expectTypeOf(data.shinyEligible).toEqualTypeOf(); + expect(data.paid).toBeDefined(); + expectTypeOf(data.paid).toEqualTypeOf(); + expect(data.rerolls).toBeDefined(); + expectTypeOf(data.rerolls).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasuresChest.ts b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasuresChest.ts new file mode 100644 index 000000000..f3025a4bf --- /dev/null +++ b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasuresChest.ts @@ -0,0 +1,30 @@ +import type { DungeonsTreasureType } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberDungeonsTreasuresChest { + runId: string; + chestId: string; + chestType: DungeonsTreasureType; + rewards: string[]; + rolledRNGMeter: boolean; + quality: number; + shinyEligible: boolean; + paid: boolean; + rerolls: boolean; + constructor(data: Record) { + this.runId = data?.run_id || 'UNKNOWN'; + this.chestId = data?.chest_id || 'UNKNOWN'; + this.chestType = data?.treasure_type || 0; + this.rewards = data?.rewards?.rewards || []; + this.rolledRNGMeter = data?.rewards?.rolled_rng_meter_randomly || false; + this.quality = data?.quality || 0; + this.shinyEligible = data?.shiny_eligible || false; + this.paid = data?.paid || false; + this.rerolls = 0 !== (data?.rerolls || 0); + } + + toString(): string { + return this.runId; + } +} + +export default SkyBlockMemberDungeonsTreasuresChest; diff --git a/src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmor.test.ts b/src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmor.test.ts new file mode 100644 index 000000000..aab265fd7 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmor.test.ts @@ -0,0 +1,9 @@ +import SkyBlockMemberInventoriesArmor from './SkyBlockMemberInventoriesArmor.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberInventoriesArmor', () => { + const data = new SkyBlockMemberInventoriesArmor({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberInventoriesArmor); + expectTypeOf(data).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmor.ts b/src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmor.ts new file mode 100644 index 000000000..e75aa12c2 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmor.ts @@ -0,0 +1,13 @@ +import SkyBlockMemberInventoriesArmorDecoded from './SkyBlockMemberInventoriesArmorDecoded.js'; +import SkyBlockMemberInventoriesBaseInventory from '../SkyBlockMemberInventoriesBaseInventory.js'; +import { decode } from '../../../../../Utils/SkyBlockUtils.js'; + +class SkyBlockMemberInventoriesArmor extends SkyBlockMemberInventoriesBaseInventory { + override async decodeData(): Promise { + if (this.base64 === undefined) return null; + const decoded = await decode(this.base64); + return new SkyBlockMemberInventoriesArmorDecoded(decoded); + } +} + +export default SkyBlockMemberInventoriesArmor; diff --git a/src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmorDecoded.test.ts b/src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmorDecoded.test.ts new file mode 100644 index 000000000..dd262a420 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmorDecoded.test.ts @@ -0,0 +1,9 @@ +import SkyBlockMemberInventoriesArmorDecoded from './SkyBlockMemberInventoriesArmorDecoded.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberInventoriesArmorDecoded', () => { + const data = new SkyBlockMemberInventoriesArmorDecoded({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberInventoriesArmorDecoded); + expectTypeOf(data).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmorDecoded.ts b/src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmorDecoded.ts new file mode 100644 index 000000000..9a9e3de19 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmorDecoded.ts @@ -0,0 +1,16 @@ +import SkyBlockInventoryItem from '../../../Inventory/SkyBlockInventoryItem.js'; + +class SkyBlockMemberInventoriesArmorDecoded { + helmet: SkyBlockInventoryItem | null; + chestplate: SkyBlockInventoryItem | null; + leggings: SkyBlockInventoryItem | null; + boots: SkyBlockInventoryItem | null; + constructor(data: Record) { + this.helmet = data[3]?.id ? new SkyBlockInventoryItem(data[3]) : null; + this.chestplate = data[2]?.id ? new SkyBlockInventoryItem(data[2]) : null; + this.leggings = data[1]?.id ? new SkyBlockInventoryItem(data[1]) : null; + this.boots = data[0]?.id ? new SkyBlockInventoryItem(data[0]) : null; + } +} + +export default SkyBlockMemberInventoriesArmorDecoded; diff --git a/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.test.ts b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.test.ts new file mode 100644 index 000000000..76b65e4b5 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.test.ts @@ -0,0 +1,31 @@ +import SkyBlockMemberInventoriesBackpack from './SkyBlockMemberInventoriesBackpack.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberInventoriesBackpack', () => { + /* eslint-disable quote-props */ + /* eslint-disable max-len */ + const data = new SkyBlockMemberInventoriesBackpack( + { + backpackIcons: { + '0': { + data: 'H4sIAAAAAAAA/0VUyW7jRhRsezKJ7UMmyDEnBsglEByLm0QHmAMliuZOkeIi8hI0yZbYFDdxlfQP+Y655Cvmw4LQQYAcHrpRr6q76lJPADyCO/wEALi7B/c4ufvzDnxcV33Z3T2BDx08fgCPEk6QmMNjO7H+fgJPu1Of5+ZYouYB3MsJ+IUiXyG7JOfPBwSpZ5ommedXdIinGxPHNJswTHy4Az+k1xpfUL6t6j6HHUqmH562TVWjpsOofQQPHbp0fYPaf+08gMcdPpbwHbn/S2OlRFAFvx+UkBN28LiGRzV3tXUdO4VLptGgKPNLuNxJZDCa7RtzpsS0ENa8ejh6oi8wHlq6F+nUVoOeYXW+w2PUK7DuF3mWjcN1QWXCjBPRKl2WjXxZnXLmNcD01ZL7iNF5Hs5Y1jkvhYFc2UoPGytN+7XRzQZa7ZStnUsnq18y1Wnb+sFufHth8/GmhN2wvmgUOrQrH2u7ImI5tRqt0Nme3TCytn11thgrEUPIs3ulOlacOw+gLgraZfCkZMOcbPLKp359cb29Xwj7lla6E800TkVJm0LX7TIuDkcNboOFb3XeiMzh1PZIdYIXJdQoOPi+sbHGeN+L2zy67NZZW2nCYeRa3TlEPut4Y0Nu+tzs8esy3q60ULS3fJIfljWEq8vSjG1r1uh4j/LCOAmVEtf18iVNOSzPN5s6oZuySCw2as5zKlDTs7TfGUF2cLhzZaxNq+woMxEZbTfrdLE+q6K2Y6jIgnC3zu0ZOZ728wWkV9VhK5dSsLb29dpL1df9KC2L2murmbo4mqquyBSt1VpOu4IecnkZL1hJTF8OpLqzzoEazqRNzxrHeolX/vCai6aa5QNG4v4i306IvZ5ziubCm8if3bMTUr5n6o0qp44keQuSVQ9BbHMLIWhE/aXHJQPl7ogDFKdwffM0nc5SzT91mikEWjIjfV5Ri5rbGIFajJhbsKu3S6FfDZm51XsWFor1+QF89GDeo7sEXZU59Mk8pu002vPYzDakkR2vuqOPhrOZ61nQyuXqGlFhHb15SriWF/K0D27BaBQ6OZ2kntnYuJ2YIDtdAmdzDQUjNbINZToxLeMRx5IyhEXehi6bRr6LTayYEW2/zxAX+ZDsDTP0yeFfLpWXUSHOk72Su4V3Sfz8GvoWNkv7mvju5MXOkWSTceHd5Kxeyrmh7Vxm2rd40rRyVmEo2fNYqAaN/p+rFWQdFV4WF2KRrNk+3FtD8uYxieRdwx1H6cWUJDNSXXDnpiBm4ZtLGzd5rgv8aPj6GL7ZWei7l+DGU6bvkobDzwMnuAaUO77nNIWYDTOXDByd1W8nSncsSi7J14P1+fPUFU/guwS3dQ6vj+AbrWrQwwR+BL9+/bLkiQgeiRF3KfH1CyS5CSLavOpaYkxxnBIxLIkIgZ8nfNLHKCFwSVyrviF2XdXAIyJ0VPZEV4GfJko7YYiASYI7XJUwJ3CHiva3dwtfv7x+/ZLbvL15AN8YsEDgxwnSUYL7gljB+FRPMzn9tLl0DeS7rsFR36H24b11wSd9I8iu/seKX6vbaR7A99F/mj/iKq8a8J2wEXlXc6bX+35S/EIeuJhkWPRMLiPymYFk8hwhlDwz7AIuuYSM0TyZOrTDBWo7WNTgE/fCvlAUQVK/MyTB6wDcg28FWEwhwQcA/gHPGZa2CwYAAA==' + } + }, + backpackContents: { + '0': { + data: 'H4sIAAAAAAAA/+1YyY7jxhmunhknPW0nYxhILrlwgixO2m2R1B4gQCRuYkskW+IikZdBkSwu4iouLVLvkDxBrkFf8hT9KDnlKYKU1D2JJ/AEPtqADiSr/q2++j7yL0FXALwGF+EVAOCLF+BF6F787QJ8wmR1Wv3pCrysoP8SvJ6FLuJj6Jc46l9X4MduWOYxbF+DV4usQJfYegW+fHwY6iVyiSojjk7ChwkqCVgRjw9ICxDBwCIN72EM3mIDDt4HKMU+l8+aFj+HYUmgGDkVct+Cl3gObvDt8WH0+JCJFVHB6FiN2AdhjAgvK4hT3nGxAuWwQODXT7EBKv6zVPkVYdcVUQbotzg33sO2POI8hcHUDVOfyLBfC50IVeWxWAGTnKhzogoQ+PQ5ss3R13iLvzxN499jrCMmu8lyQs3q2MZMucSzC/z08QHigS4ziiQp8iV4JWMWwBfY/B7T82qYsTdcUxVwUlVFiFGi8vJIP3jDTFayaEwW7zSRmXMaAC/Aj1iYQB+B4/gs0Vmis0Rnic4SnSU6S3SW6P9K9KyR/16jiyeNsBIodYJjALgAn+qpXSAYQTtGF99JvktwVICBKWEjon5W0UUeHhJsnfooS8FvcATGm5dfE2rtOKgsvTp+CjoR6REnL/gKxyVY/zB1MAhcoM3qApe3//HXvxBiWqE4Dn2M9vgOvAWf4/uXEmzCpE6Ia4r8HUbzc2zTjrUI9gTB/QNOhyT2/OJDfglWlwUOP0WNk96T/RMc85RHzMOP83zFcryucu/m4rdTfP4MvsefwVmiH5pE/bNE3zuJwH+73Z/f6/TyYzpdqVEdx8o+RQWuLbrgVzbl0oM+7d2MKY+66fbc/s0YjpybPjmyUdelIKTgBfgcbzlsUHyX5XUMsSD4yLq6K7IcFVWIytfgskJNVReoPP5lcXEJXquhn8Kj5cXfrWpzJ2VdqOyK/qHucIvpLpOKgTZbpAdVn6QITkp6sLFmcomycRqbmc4oC8NjBsrK6+2kSpOY0bYp42tuorXpVF1dVzunCA156zQlLc6WkSREOyGVqdysUVcbFC2zoO66S5k3hUUVXJMjVtE2Os2jydrO5kXSHw9ojWE2JtPfCSMjl0V3nnHslkP+ZkxB455d6lbn/sAPvKnZQD5V6IFnLsjNvig27JrlpH2ZceT9qBcUs32SK/ZoYK7oKFrDUouczsIkD1Kx7ghTcUV7yuF+H4wGo3aHKnQYW+ltFcP0rtNxhjXjd7a8Mp0gxVlFtiV3B3kZUXkuwFkhztWmwy60Qzu+lrKevHbIQNk0DTPeznaeYfJFTvKUZq3WSjVbD/RlN0Z65NCN7E8Ngb311BVN9ndh3A49M6Tv71ZZwfWcHrrtRJt6tUicktbb63K8mjbzShBYiXbmMecOaQ351U6b62mzaNW75bi3NHN9uLOHmqVN9nujpZ3OcGxU8n7RXVKJtnYWNbdZm/0wHKicplH7EkodumlIlfEOrln273qimx66Qm6H9TSRuo5Eqdyy0x3OE4fqMdrMSVWm2l3vHJmN1HEx6JaH9bw3QEFjULGxFdRmN3BsKp0jZnk9EWzHzZIomS3m27sJX1faPCeH7V7tClHTV0qq7h32mzDYifFMjlgv4tQumiYCGcbTnk5t0wVzGGzXXl+vHc+Ykqy9WcZq74+X4BMDxjW6+CfaZ77I3JJwTcVOdxXYm0kospkvaSYtHSJK0cyupPmkFO7nIjMJndntvZXEpaXHkRhOBjg3kTW/lYVVIgviXtJ0UmInPUVYBdJBb01t2SisTknskpQZsWTCiS+m09amrdwWDMXE6z7XEexuMDvOna1+UDQxXExO2A5w7dbmZkU5iaFaG56Cm9vYYkRfCaekkxrxcxxpbQLSxT6nPfmGp7UwZp2sbrXwA9sxHtfbn/YqJjhvNhks2vE3avQruO7HZvc2sNJlbScGueiuYjQ74tDvre00kDVubwliTxYkvO8gUoRlK2vTwNzysaXptMye9t4qax3zsTyYaxNfxlbSrMQ88KElGImMubJYPpIFY6u85+cJX2VtVoEl8KSp/i92fCXUPc4vn7k72EJciX727J+On2Kfnt4yH5+Oqm85v16Bn51Om+GEwF3Ow8cQUeJm+l37/mePDx4efNj132AjXxx/5BN8gfvmR1v+Z/yKk5nZO34lcuo3+/1LAP4NJDoB2xwWAAA=' + } + } + }, + '0' + ); + /* eslint-enable quote-props */ + /* eslint-enable max-len */ + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberInventoriesBackpack); + expectTypeOf(data).toEqualTypeOf(); + expect(data.backpackItemBase64).toBeDefined(); + expectTypeOf(data.backpackItemBase64).toEqualTypeOf(); + expect(data.backpackContentsBase64).toBeDefined(); + expectTypeOf(data.backpackContentsBase64).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.ts b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.ts new file mode 100644 index 000000000..974dffd71 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.ts @@ -0,0 +1,21 @@ +import SkyBlockMemberInventoriesBackpackDecoded from './SkyBlockMemberInventoriesBackpackDecoded.js'; +import { decode } from '../../../../../Utils/SkyBlockUtils.js'; + +class SkyBlockMemberInventoriesBackpack { + backpackItemBase64: string; + backpackContentsBase64: string; + constructor(data: Record, slot: string) { + this.backpackItemBase64 = data?.backpackIcons?.[slot]?.data; + this.backpackContentsBase64 = data?.backpackContents?.[slot]?.data; + } + + async decodeData(): Promise { + if (this.backpackItemBase64 === undefined) return null; + if (this.backpackContentsBase64 === undefined) return null; + const backpackIconDecoded = await decode(this.backpackItemBase64); + const backpackItemsDecoded = await decode(this.backpackContentsBase64); + return new SkyBlockMemberInventoriesBackpackDecoded({ backpackIconDecoded, backpackItemsDecoded }); + } +} + +export default SkyBlockMemberInventoriesBackpack; diff --git a/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpackDecoded.test.ts b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpackDecoded.test.ts new file mode 100644 index 000000000..1631dfa5b --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpackDecoded.test.ts @@ -0,0 +1,53 @@ +import SkyBlockMemberInventoriesBackpackDecoded from './SkyBlockMemberInventoriesBackpackDecoded.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberInventoriesBackpackDecoded', () => { + /* eslint-disable camelcase */ + const data = new SkyBlockMemberInventoriesBackpackDecoded({ + backpackIconDecoded: [ + { + id: 397, + Count: 1, + tag: { + HideFlags: 254, + display: { + Lore: [ + '§7A bag with §a18§7 slots which can be', + '§7placed in your Storage Menu to', + '§7store additional items.', + '', + '§9§lRARE' + ], + Name: '§9Medium Backpack' + }, + ExtraAttributes: { + id: 'MEDIUM_BACKPACK', + backpack_color: 'DEFAULT', + uuid: '1f8c145e-17b1-4a1d-beed-456a78d1ce0d', + timestamp: '8/5/22 12:41 AM' + } + }, + Damage: 3 + } + ], + backpackItemsDecoded: [ + { + id: 397, + Count: 3, + tag: { + HideFlags: 254, + display: { + Lore: ['§7§7A perfect side.', '', '§8§l* §8Co-op Soulbound §8§l*', '§f§lCOMMON'], + Name: '§fFrench Fries' + }, + ExtraAttributes: { id: 'FRENCH_FRIES' } + }, + Damage: 3 + } + ] + }); + /* eslint-enable camelcase */ + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberInventoriesBackpackDecoded); + expectTypeOf(data).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpackDecoded.ts b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpackDecoded.ts new file mode 100644 index 000000000..084d6b005 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpackDecoded.ts @@ -0,0 +1,18 @@ +import SkyBlockInventoryItem from '../../../Inventory/SkyBlockInventoryItem.js'; +import { writeFileSync } from 'fs'; + +class SkyBlockMemberInventoriesBackpackDecoded { + icon: SkyBlockInventoryItem; + items: SkyBlockInventoryItem[]; + constructor(data: Record) { + writeFileSync('fixed.json', JSON.stringify(data)); + this.icon = new SkyBlockInventoryItem(data?.backpackIconDecoded[0]); + this.items = []; + for (let i = 0; i < data?.backpackItemsDecoded.length; i++) { + if (!data?.backpackItemsDecoded[i]?.id) continue; + this.items.push(new SkyBlockInventoryItem(data?.backpackItemsDecoded[i])); + } + } +} + +export default SkyBlockMemberInventoriesBackpackDecoded; diff --git a/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpacks.test.ts b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpacks.test.ts new file mode 100644 index 000000000..d200bba1f --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpacks.test.ts @@ -0,0 +1,46 @@ +import SkyBlockMemberInventoriesBackpack from './SkyBlockMemberInventoriesBackpack.js'; +import SkyBlockMemberInventoriesBackpacks from './SkyBlockMemberInventoriesBackpacks.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberInventoriesBackpacks', () => { + const data = new SkyBlockMemberInventoriesBackpacks({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberInventoriesBackpacks); + expectTypeOf(data).toEqualTypeOf(); + expect(data.backpack1).toBeDefined(); + expectTypeOf(data.backpack1).toEqualTypeOf(); + expect(data.backpack2).toBeDefined(); + expectTypeOf(data.backpack2).toEqualTypeOf(); + expect(data.backpack3).toBeDefined(); + expectTypeOf(data.backpack3).toEqualTypeOf(); + expect(data.backpack4).toBeDefined(); + expectTypeOf(data.backpack4).toEqualTypeOf(); + expect(data.backpack5).toBeDefined(); + expectTypeOf(data.backpack5).toEqualTypeOf(); + expect(data.backpack6).toBeDefined(); + expectTypeOf(data.backpack6).toEqualTypeOf(); + expect(data.backpack7).toBeDefined(); + expectTypeOf(data.backpack7).toEqualTypeOf(); + expect(data.backpack8).toBeDefined(); + expectTypeOf(data.backpack8).toEqualTypeOf(); + expect(data.backpack9).toBeDefined(); + expectTypeOf(data.backpack9).toEqualTypeOf(); + expect(data.backpack10).toBeDefined(); + expectTypeOf(data.backpack10).toEqualTypeOf(); + expect(data.backpack11).toBeDefined(); + expectTypeOf(data.backpack11).toEqualTypeOf(); + expect(data.backpack12).toBeDefined(); + expectTypeOf(data.backpack12).toEqualTypeOf(); + expect(data.backpack13).toBeDefined(); + expectTypeOf(data.backpack13).toEqualTypeOf(); + expect(data.backpack14).toBeDefined(); + expectTypeOf(data.backpack14).toEqualTypeOf(); + expect(data.backpack15).toBeDefined(); + expectTypeOf(data.backpack15).toEqualTypeOf(); + expect(data.backpack16).toBeDefined(); + expectTypeOf(data.backpack16).toEqualTypeOf(); + expect(data.backpack17).toBeDefined(); + expectTypeOf(data.backpack17).toEqualTypeOf(); + expect(data.backpack18).toBeDefined(); + expectTypeOf(data.backpack18).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpacks.ts b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpacks.ts new file mode 100644 index 000000000..076a45c9a --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpacks.ts @@ -0,0 +1,98 @@ +import SkyBlockMemberInventoriesBackpack from './SkyBlockMemberInventoriesBackpack.js'; + +class SkyBlockMemberInventoriesBackpacks { + backpack1: SkyBlockMemberInventoriesBackpack | null; + backpack2: SkyBlockMemberInventoriesBackpack | null; + backpack3: SkyBlockMemberInventoriesBackpack | null; + backpack4: SkyBlockMemberInventoriesBackpack | null; + backpack5: SkyBlockMemberInventoriesBackpack | null; + backpack6: SkyBlockMemberInventoriesBackpack | null; + backpack7: SkyBlockMemberInventoriesBackpack | null; + backpack8: SkyBlockMemberInventoriesBackpack | null; + backpack9: SkyBlockMemberInventoriesBackpack | null; + backpack10: SkyBlockMemberInventoriesBackpack | null; + backpack11: SkyBlockMemberInventoriesBackpack | null; + backpack12: SkyBlockMemberInventoriesBackpack | null; + backpack13: SkyBlockMemberInventoriesBackpack | null; + backpack14: SkyBlockMemberInventoriesBackpack | null; + backpack15: SkyBlockMemberInventoriesBackpack | null; + backpack16: SkyBlockMemberInventoriesBackpack | null; + backpack17: SkyBlockMemberInventoriesBackpack | null; + backpack18: SkyBlockMemberInventoriesBackpack | null; + constructor(data: Record) { + this.backpack1 = + data?.backpackIcons?.['0']?.data === undefined || data?.backpackContents?.['0']?.data === undefined + ? new SkyBlockMemberInventoriesBackpack(data, '0') + : null; + this.backpack2 = + data?.backpackIcons?.['1']?.data === undefined || data?.backpackContents?.['1']?.data === undefined + ? new SkyBlockMemberInventoriesBackpack(data, '1') + : null; + this.backpack3 = + data?.backpackIcons?.['2']?.data === undefined || data?.backpackContents?.['2']?.data === undefined + ? new SkyBlockMemberInventoriesBackpack(data, '2') + : null; + this.backpack4 = + data?.backpackIcons?.['3']?.data === undefined || data?.backpackContents?.['3']?.data === undefined + ? new SkyBlockMemberInventoriesBackpack(data, '3') + : null; + this.backpack5 = + data?.backpackIcons?.['4']?.data === undefined || data?.backpackContents?.['4']?.data === undefined + ? new SkyBlockMemberInventoriesBackpack(data, '4') + : null; + this.backpack6 = + data?.backpackIcons?.['5']?.data === undefined || data?.backpackContents?.['5']?.data === undefined + ? new SkyBlockMemberInventoriesBackpack(data, '5') + : null; + this.backpack7 = + data?.backpackIcons?.['6']?.data === undefined || data?.backpackContents?.['6']?.data === undefined + ? new SkyBlockMemberInventoriesBackpack(data, '6') + : null; + this.backpack8 = + data?.backpackIcons?.['7']?.data === undefined || data?.backpackContents?.['7']?.data === undefined + ? new SkyBlockMemberInventoriesBackpack(data, '7') + : null; + this.backpack9 = + data?.backpackIcons?.['8']?.data === undefined || data?.backpackContents?.['8']?.data === undefined + ? new SkyBlockMemberInventoriesBackpack(data, '8') + : null; + this.backpack10 = + data?.backpackIcons?.['9']?.data === undefined || data?.backpackContents?.['9']?.data === undefined + ? new SkyBlockMemberInventoriesBackpack(data, '9') + : null; + this.backpack11 = + data?.backpackIcons?.['10']?.data === undefined || data?.backpackContents?.['10']?.data === undefined + ? new SkyBlockMemberInventoriesBackpack(data, '10') + : null; + this.backpack12 = + data?.backpackIcons?.['11']?.data === undefined || data?.backpackContents?.['11']?.data === undefined + ? new SkyBlockMemberInventoriesBackpack(data, '11') + : null; + this.backpack13 = + data?.backpackIcons?.['12']?.data === undefined || data?.backpackContents?.['12']?.data === undefined + ? new SkyBlockMemberInventoriesBackpack(data, '12') + : null; + this.backpack14 = + data?.backpackIcons?.['13']?.data === undefined || data?.backpackContents?.['13']?.data === undefined + ? new SkyBlockMemberInventoriesBackpack(data, '13') + : null; + this.backpack15 = + data?.backpackIcons?.['14']?.data === undefined || data?.backpackContents?.['14']?.data === undefined + ? new SkyBlockMemberInventoriesBackpack(data, '14') + : null; + this.backpack16 = + data?.backpackIcons?.['15']?.data === undefined || data?.backpackContents?.['15']?.data === undefined + ? new SkyBlockMemberInventoriesBackpack(data, '15') + : null; + this.backpack17 = + data?.backpackIcons?.['16']?.data === undefined || data?.backpackContents?.['16']?.data === undefined + ? new SkyBlockMemberInventoriesBackpack(data, '16') + : null; + this.backpack18 = + data?.backpackIcons?.['17']?.data === undefined || data?.backpackContents?.['17']?.data === undefined + ? new SkyBlockMemberInventoriesBackpack(data, '17') + : null; + } +} + +export default SkyBlockMemberInventoriesBackpacks; diff --git a/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBags.test.ts b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBags.test.ts new file mode 100644 index 000000000..e755e0f7f --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBags.test.ts @@ -0,0 +1,41 @@ +import SkyBlockMemberInventoriesBags from './SkyBlockMemberInventoriesBags.js'; +import SkyBlockMemberInventoriesBagsTalisman from './SkyBlockMemberInventoriesBagsTalisman.js'; +import SkyBlockMemberInventoriesInventory from '../Inventory/SkyBlockMemberInventoriesInventory.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberInventoriesBags', () => { + /* eslint-disable max-len */ + /* eslint-disable camelcase */ + const data = new SkyBlockMemberInventoriesBags({ + potion_bag: { + data: 'H4sIAAAAAAAA/+3aW28bRRQH8Fk7vjZtRaEVRUKaQkOpQpEb56Lw1OAkjSVyURJS3qyxd2yvsHet3XEub1DxwAMfIEhEqlQJ940PwAvyR/EHQZy9OF5fYtklCIH+Uq2kuzNnd+ac/Wk8mzRjKaYZacbYkwiLGLrW1FgsZzVNpaVZVIlKir2bazrKqu9ZyrDMjXJZlpTjdtA0llirFw1pKhZlyfWmLdwWdOY9jUXyelJjqbV6o2aUDWkzapLaMnS5WRMVh9r8mWYJ3XAaNXGWYjNfWbZM0tEYfR62WwvbTacqdf68Zp2c8UPLNEo8z9ut8qdPv8hk6N9jNtdurTy3hakcOl6cz2Y65y/5puFUDbPCDxpS6tTgcwo3S93arVpud3t7dyfJZnZEXbq9yyOvcUA35FS5P1iWZrc3TpUt1pSyjWJTSSfKZhveuUJNHsuaOw1JFvcPsTt1L2Sh4oYsKDdkiiVkaMqiLBbu558a1S/KbunBhBaUUfrWYdr9Z2mWqlu6N580hUl2I7gVddaQLL63e5h3R0hZ7P5HY3HHG5DWa2y6478zPHjGIiy+LuqiIp/dYNddDPfCxRCZvBgetFsiZ9WLQvFv9viXluUons/7tZBdHq6E7PwCVcJvPOjzwnB0qx5Uwi2KRZXw9U5/LXx4xSWmqIForwZul7xQhdNGoeiGuroAor0CGOw0nH325o9JEh5KImNIIpI4nEQtnMTo5En8iJjNWTWd70vHcJQwS5Lnj0agLAzTI/lppnPxAx/oMj6LH3tZHLrG9CjPaCwpzaobQNf68lrTC/Zl8KvzOtOX175O102ze6unSpo63WoY4QhSj9RfV+pnw6mfmYru5S1hH0vylH4WaXUlbe7nfmHJy/yjMN3L80tE9znfFHbdXYltWrZqmt3cp9utVcr9/tr+Rgju1VEXmCLjsV6W36n6oQrVbqir8xzr5Xm42wi8m5mpksvCjEeRUCQUCUVCkdD/bkJvvsWGRpw+j2lJRN9hGo8cni/JJ9ThmM7q/IVQNO/B1yB/FZXpraIW3VXUz2/4kaFEzVBndGhFmLrben5hqXPxkh/aTekup8rrsixNR47b8PiMDo67h7+175E8ocgFY9yiKrTbcdl6RMJ/evUPrKZuohJQCagEVAIqAZWASkAloBJQCagEVMK/UgnpcCXEJ6uEu/Shb+2L+7IiTekH7O7AL/rZfxjeEii5L9AuXvMtKWqqyr1uQYbfpzAHypZmhU70RaA0r+TNki2FI70gnYvv+WVTOll060gsZoJIH1CknG3Q7Iva5eu8IFZ2INZq5/w1dxvznLcz3wu3kJkLqpN9Qj+9pq/8pn4Kek2zmbng0veomfeOf2ASHoQnQdAkuCc7v/za9wcBdN8i9JJh7ByIzsWPPHhEejcyn+3OwX16PNfsUlXaZ4NTMNcXqmidcN0fjx9j6XIw6XZriZ65jb18rvvE3aVD602zIinNR9O9xUz0Hq1ZO1Qu/Y9XfPT7jr4eIx6x37/rf8RGb+0knaBoposQepWaLAV1NV2E0Ehijpvxtx5Cetw7nwkHkRB+YUwQYKpNroE/5UgEhaK5l/F+K/inw44xDY7BMTgGx+AYHINjcAyOwTE4BsfgGByDY3AMjsExOAbH4Bgcg2NwDI7BMTgGx+AYHINjcAyOwTE4BsfgGByDY3AMjsExOAbH4Bgcg2NwDI7BMTgGx+AYHINjcAyOwTE4BsfgGByDY3AMjsExOAbH4Bgcg2NwDI7BMTgGx+AYHINjcAyOwTE4BsfgGByDY3AMjsExOAbH4Bgcg2NwDI7BMTgGx+AYHINjcAyOwTE4BsfgGByDY3AMjsExOAbH4Bgcg2NwDI7BMTgGx+AYHINjcAyOwTE4Bsf+t46xvwDf3AnXzKkAAA==' + }, + talisman_bag: { + data: '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vFA79vF3eOXd7nCvMz7c/9pNXvZV88It+oAbv+nzwieP6V8oXxzv6kfO/ylfvvr/PNs69lbCV+znlO+722uPOfFOl57xjv845dze9L5f+ead37d7jRzwxdsfeZvb3fxWH3/25NmvOPttzLMf0fv7/3zck11n/fr7fflhD6ZffNxZnzj9rs9/7AtPvselFz559sW7fP217z3/34F7A7pL3DHab7/zgcc/vfsg+nsf/P7bP/K8t/AfVR//He3hxf1333v328i7n3vs2TT9mdkH3De+99Wf/GTrgv/nvlZ4nvPl+576xTt8/34H/vmfk+743iy5aSd7l/X8NX3B/c/76Ln4Pe/69XdqZ39o9O7PdD/7f95xs2O+fcsXffN1Xznrbv/8pQuX5fLh+8/2MODmT7yp+JLTn3jHX5zcVl7ykfcnj/rSU4/+WvXv/3T6aeXtXhT/4LsfuO+X73yLBfGun9yp+5nR295wpEdo7/3IO888e3Xry977pi8b73zBr8LsJhd+TDnxi9oTPpJd+pUffvXj37/s9rtLxwfeUT9fft6747+dBt37vNn63g/89kPPuWyU/s2569dd9Or7nPuUt57+iVs/mAmfr775qDF62VeC251zv79fvOBNl976G2++xV3+4TYX/u38+Udu9otXv/3M47908XePvc3d7kJ+5MKzzrz5p5+Qqy+92z0mH72rc9pLiqM+rTMX3ad1ofKZi395yX2Lxdse/Q8f/vYZ0Sse+k+nv+Rljz7pgqMD+94XfvBRX7jZO5949PPvddGrn3PuP1462v/gf/6V++lDnvz3z/she4enPOmtNyZefvLH/xp7A/2ht91i/9BzX/og/PnHX/Tqz0b/eOn90h88zjrj++373+OZZ77kdfZxX85ufus7zx7c+dpDV/e/s3pp9a0vB8C5xxylfObrv7zkpJ+ch3/xacCL4hNudhTz2L/qcRe7z27f7QQdkL55yjnfPun88/3Hv3z13JNPPPeS03/6qe9/KDhO+rbyPcl7xukh9OHhsa95xT/qwvPab/3O8PN/8/qfnQt+PH/wh8bCTZ/2nNP/5dY/Qk869cRXiZfc89wnHcU/68a7+4rAR8659H2/Qi/913uf+tyvnPvCVz3j6L9tH3fk+AdecNFD7oZM7vvg1x5tq0/+1CVfX7+ePO19/1Uc9ZMvXPTuR1uPf8zdlbfc+htnf+Gi8+7/vtP+5vzTPnn7HwvDG99rffP7vbJ/QvaWN+6//912stbPgb/41h9pLzj6b9/1xJ9+4/t/85Ff3fIl//cxNxYefPapx9+xPx/f7Ll/9df3f/BPfvr41970RS+m73LK8MYfOeMDP7zs4/llJ9319Kf3bom9lDDXJ7//VO0tt15/+mPvP/odxexfphF8zNEvv5d4annB7Jx49uib/d1ffys777+/cGr7dh899Snivc879V2feNZ3vnxP601PP/X5zs2Ur4c/fNnZp73n/u8UX3vv6GX/KP3bux9wxyeJ6P987qinnPerh7WsL9/kERffFnkP+flLnmie+c7wPhe93BLehDrtZxz70id1//W4c+TBx8C7Bo/5wB2iO3//Ld1LfnbZCU/W3q/d9QE//z8fP/bGb+h9/tnPedZtPptmLPPYk5/V/vZzU/j+Z5z+41tP3nFCcukvj36f9tBjuYLEe3d57VvZDRXdxxSJB9/zH15/73+XH/6v0IeXX7pH8t8nPc566mPv9UOkvp5zz18891n3+Owx1CvPecN7Hvexk9/85Mv+89xTT+Uec9Nf4Pcp3/qqF938Vf+1Jt7+iXfd/51vuM9t736/yf0uqJ71o5MfxTzu40995l3e+Ln019991r+ZR//6afd4ivKeX93qGPsNv2w9sJlVOBw0ltnpEYOlRke6VJ89QlNXZncRHAFsrCb5KIg4bcTxwJruN+pCFokibs34Me+qE2aP+t73kOuts8UGQM8hELuNA412netjbdIiwTZEEAgMIygAkeB1pPvKGNpHcSrj4+0syfOePpFNOMW9rSIqfjFlclgPsnJfBl1QsCp/EPOs486kPqL2RHGw2YQZwfI5ApFTEvFJZyBHLRiyWJenMFebyPMUUuNBuchHejDTscVwPRuybOlw3Va0R1QlhITZ3Fy0JEcbJhJelaY46fe7uLRAkG0r1qZOwTPTTmsM26xaCpNiP3NmlamPpnThrvWZXHYHQG5SzLaDorNsaHVEvVx0as6+nAQQjkakDgtEUm5aICiXEt2RWzk+gYhkWPPJJUnsKBLUfGA+7Wk9VV/2l7ELFOtVHu9qDqVb/rAsZwMVrDoZse2J9LAf98Kk67FCn9p61JICoGyn9CwwY6HxHNVDrwubO22fdBaCElZ7WV+kcIgsyc5gKncQPx6h0Hopaji/ghMSBmEH1yxQ20rIEDbHKMx1fYBT8o2drUTU6sZC3yoIek+n1ki3equQR8fGYCzykgnLCrbmNL7V0kGNWnOd5boyKWC1XJjTud3Xu/5SmMg5C2zIGaE6XWVIuya1ctetxMTUcLUcr1FhzeF7ONdCQ0CcVTLj5xNMkydJv0sOLbyoFKwM0x2poHO3l8YtpJ9nnaWzyZaV1Hfz+mPrDAdVwKRpxGZgLlYUORK2w8EYX6s5nfurMksYkqdVN6vGm369hhvMHY/H6HDUBTcgvGSAYYJNeJZVlb1t7DE9UwC+tenpTtkPiQXiJlG5SKbZhDP3g97wz9NJhaS4ke4JkJq2QlejkzqvaW9hVGxlahJiTIVDXVRFM0CFl0CTGYL/X3nv8vu61qYJ7VKjporqoqq+quKrphq0JbpUFPmi+H6RkMCOL3F8i++xhXTka3x3bCd24llBq9Vi0EJCSAxAYoDUI8SIERNUE0YwQUioRy2QuPwXLGfv853z7b3PdR+6juijk71/P29n2VlJ3mc9633f51HLoFrtEL6jw4yLm/oWH2rV97Ra55zVDvVnXWgJKHntI85TF4Nca14i2y8jPG2pHsGqG7sI4Big+56WB9wF9T3joa9Nx41QrlZNYI7QoKwQFRxXS/Wpc3njP79/oeXvfNQhhoCjf/ZiyCTztnmOt1XfdA7Ht2NXT2nyvnzyA2nV9t5E6bDm9P76n+DvrPCg104y2UW3sGhfPntp+zYHIfedhmrRhPVqbbc+4WVm9N3lMj+Omf/hKq4HOPVfjG9P9X3Mix9a4/93jisSnRTHOkhfK+sPoQTDInwLkSi9xdKE3FI4Hm0JhIohCEexMP5Q9uIf/o//7j/+yTafkYQk0hALtyQaplsUI7PV4C7bUgidRShNUBGKfi4aoVNllzZ5kzP3+jTmC9mTDXSS+iqr4fsUGl16UDX6Ol/1VA3o6njA8GHApqNLpBHVl16nX/0agq/UXTk8PXRjW8LpvufY0bBkqWfu5CYnlGvQookoZZO1IaumJqtUMjcKejwV6rLpbRzhEdZbzAtJqZwUQfpJwEeG3aHn6VrIPWZLRv4cZqhBu6nYkJyAydWGk5GbndWX66hGKF4V5ibvn1JPkROvTVSh0UbLU4UEP1QDHYvhyrH5skluperKQSXSR7SWi4LBFGe8XvNCpRREGyoBGu60x9s0216ujswMDbvUSabO0I2yzpxzqor9AbmiJqlUEhy5fChs9vPOc2vLVR/HgR3ppDKrhIuuKqeZVcFXQpagtHbah3KBt96Sh0pzsDuslRa/DUiCx5Rr6BtZvQ+SA8Xv0zlqnN0inB03vm4KX6+yCyMxQk9DsGzsFijkxv0GpuBc3WdzE56eCzZ4ZyLN+jS4pEg/05FLWfpCRl0DlQsiM93egR/PAsR+mkH0833nO/h1cp26ZyX8+rxunjt+PqRHtGjMJWEOG+dgPpIIa22uhm4PQbKKYM+Iu3kSvV1cjEkWCi16iuomErybbGu0NjTqTt23ETzjeSuf8kkTghsc59S5gM/XEF8uuVU8SdtGLoxWV/l0LX0wzY2azXFAwmMGX1TUai/+gZAAru1T0dM2PKRtrO6pTkVPy2n8vTef+Xmtn9RKddG+WVyvUD31qXmrsd1qsL2ab6/qQRWqrabiNvgiig7sL2ypfrvsxbSK60UgqsfFz7nkhcL90sf09XV6zgKQttZE/xE0xsNfjFmzL+iqmeovbrEajQevfmcDzOUF0wHKqghALZuf/dKsdPD8gEsKTTSLv4mSl3/5zS8BkggFiPIAZH5DQuNPv/YPHvicds1XDdF/Af5NKQDStb96W6zVMlk3vAXoVr+N83vzMm9Vu+j5qzd/ewW06t/7rF3iPRjypf73I10k/nB/cFR1Ve372EocQ5IwRuhtSoXwFkNpdBsCbrJNaBwnMTyL4+xDJ4n/6Pzf/Ac/Wf1LhhIhFVP0NqZTfIvGqwVsEq7tZwiSJGQGgzX2Z2KSwYxU2lFMAAleQZhVrszl3lBT3tIHqruGO9vEd37vdJ2Zbxwhu+aad/Xb097KSQvtPNxHUugY73wTgW5iiPH5fG/L0312h3AxkZ52HsFccn5Aj4fa88SRnMPHVb6EO/dytCLHsHclxLqFDLm4rPZD4EHNRnHN88k38fpCKEuSaC0e3tm6KFyf3dCSuJoYlDfk7F5gOWSshkKQB1+TrckZ4+g+M25j7k82TY2JA9YN19bD6Sy4Dz4H54Ewn7qY0TGf6GRJ1Nx+GrFuilyFchc71DyJvmL9hRAVbsew3jBfHF1QEdXH6klUQKB7QHPsZqwGkQT6IH1JGJeuPexlWxTgWCcv+CM/901h9qPks0/vqJ7NmHdRIjdH3qidIjZNds+mhPxwhRN5oOdbdrPcGV46LET5zV1FT4379A5Umgtyb1Zle+oce8Ol5BLCyGMm5GN2gw84n5AzJaNP6vwUaNaxfYYO7azgdVWHHqrT8/pZptuLe3yO80my3ZFnlSeIPd1B4JxKg9UDqxpme41q9V7unb35zHOrp/WhvB2s4lbD2UZQ8E3zbHq4oA7NIIX37lmNlCGopatNUZpOMVYcr/U+SRi/HoSC4XgMdxiOOpLD9TDRk7WLUedQeHnBDvBJtsYTrV20tu310K253TwKo42wpH1wCPtEaUQjnQWrim5P2r7EUtpUmB55oyvc2BhKVOZ7STE5uGavdewXWF3i5VuU+4q19HKVYPIXBtFEFdJsdpU7RDTbwQBDeuie2wCMWtRvb2rm1p8j8XFdE4vg5+XnnRhda18AJiFCoZZr0jioAaNDAQ7VGscDJhS8bIn8Zq0jYnN1McGqkS210n/6y7EEWFStz9G4CsyZg6kN/9Ds6geo+L0z6/5K5DXbIPhv2OC9c73rVlPWaFWpaC9rqUv0zjT1Szc7+OUM8TW0WH9ztL2uqrr2G4gR/vVH4hchGDb9fEc7ABn8x5CB4ASJgai9pUIC3WIUiW1pFNAIhIIinIypJEL+P3W0CwFgxGECbXEiXksmo2gbQXS4RcksiyGUSLKM+lzZJrzz3O6a3DVpPOOxfdRIOTouDOPR6axKj2KKpaMfE8qjiXb2BmG4Acv7i4ZcsrGu5nGkLzULkRR5ewRQz4a3IceQLrmrtHYwvX5ULLgekI1DxCewRkFMs2DJqKePUIIq9q3k9rbm2HsG2pglnN85BA7PMc6oKAnoQnVy+GV3XJTrQZCFM/x8PMPcM5n4BHVRNIKRJAxxHrJnh64H+XVTQbdSRtJoFzPhozkyNnJ6ShPy2Gv+4WrzzkUuBv8cDLsOx8UmtOPuRkcLYkHJRYHQBKLVI4ejkl1xA5pgGVvUx/YKCY1dmwdls1uSx12O70QqUuzc7tvBuRx0Dd7YfnWN6Gae9l2CuGftfrGud8xXvClVZjjsg9rrynHcaLklu3pUNimFEf5oXTdCnAFWhIxamj4LHn+iSz/Baevp3GJG3mDYD+jMC6rm+PYYuExlXs8aXAG4gi/eviHJZFhEG9r04iaSMdTbXRRcvl/KTsf0m3Pf78IEZ8YL7jwKHKYNi2iYS8TfihtqavMetns+KGvl2JW5KfSTWat6mmt1YRKurYuEzjRNI2pc3T6zpSxuyezykhtTnE0VzmOHUbOFhmQlZmZvZG1GiMm1JYwiVJ8XWDkHJ9hQWVSAtLPcW6Qh0F169r3QbXqNRx2UICxruRKyrUSQsQluRmKwhzsr9baCSMnpfLSM0cdOjxE5txJ9Bvf6vXQw3ncsl9VTtaWH/s01NEjAmY3OxbPO5QVY4gPIYDAQMsFS2180ZNWGqFC18ZHvEHtFQ1GAwrMGhWL984aLVdHQXu0dYnjtVtDFtU5IXTUwAF0RioA7Vtra1YwACgPonG7H4G8H121AZUQHCRoh18RjqTU+WCeajWozD42TfgBc/FDf1H/rm3xT3aIGYTP9bPz4e+DQ+7E+G0L+wJUUhRE/gSIJlUBUiiVbCkbJLRam5DaEaWybxmiWJCDQ0PSHxOMnRZEsRqCQRNEtjq2bYRkEb9cC0C2UQqvyRRJRyOc2HY+k3hKper9t9vPtKfh3/JlYxlFgNSs80Qfa8DrLKgRVP9VZtzNTWsV1MwjbfneS0NI/UvcLVCJ3GXL0gu73bTTh9+smxSU48uTbXhkfTuKXJ0UernAn7ESONaT+tJfwyvPvDHm37rlt5jrJagq2gY3nAUMuGERxw97owQoeO17i9Dp4/eYJFkN1YSdjeuSeIbv4cfFgw+DMqojladltYWYyoijToO/TJb3t1Em4cQWalh51yViKlgBbD5KmPR450glhr6Qnv7ZJdNfs4YMZXbrDcwDkybzdoOeBy20DUfW8TevnMHReCtE1iO7Koz/fyKgpML0fcgg6jpb2PKpH8L988zBx/7y7GBvdc/NqIDg37WqroojrtYohzWj7hw0jRHWHhWS3kZjNnpXOSB4BlrFU0z6Umd0yaYOWKmJAhD3PuOTZkJ5h2iwTenzubG58zMcq5rGOKaf6tmHrwMjsgLkVMFPdhNGyQkS6Ippxoo/8UTLtRAhbWFc9FxWYZzb056Iuyd21Rpf6MbJGQnjofBibCQWB3R2MIpIYY8lFWSjIY+vbi33rIJ/JS0FiO0srJKKMn9fqTvVp40bTYeLw8c4r/eUO5QLPFkFli/2ywQWZPdUb+1FIEbRX3PMeI87pldIOtgaV/oU0WQ/JxyxISIza0EmV8l0ppLvyat1HEDL3Dp8WZeEWU6qdH+CWbsyeddMz9hWK/LNvQRFM5aTn2selc/zzm1HkWKj26iBtruZCD11cXblfdm0ViLIgCru536hPzTZg9dsrMZ30zAK6jP2s0zGBt2pXONDqmg3Q8d3mn20smmgga8pF9/inKkoPdXWS4NYGBbcGaDIHzSqSCOajlBbdTgq/EeqA83Ft9Uv9cl7eV1oGZzMPAKIC1P3g3l8bZVMgul8i4BKJ9e1LJaYvEej7OXh/237XZ7cA/Hg8+jNwSLivIfXtPqy7YW00+5Fw9PuCYzsm/8WeUXRT4q1foxGepnCW4ck2QzJoi2EvAwmK3mbEKhUeYzj8kaHqf/w//b3/6ieToo3IJIZhBNqmaEICJoPEWzqOoy0VIyQRQ1lGxJ9bKCBM7EjZxpWvlINHFLWKTosqP2TjMMoifbgvaexRu/upukoappWbbC8ieRLbE21wi2wk++EWjGOP7nPStaG9igfUgVUm0Ypoqrhd7yJMu4tsuoGVEapfM9pIP6CGaeZbUs4DbHDzs/KSwC4u02DfjDlWi343INltPHi+nbKPB3VNb7MaJg8MPslFKIztmI+zDEctZN0nOOYPNJaowoXN84sLos9p4g/k/Xak0h0atk+wDpwwd/C0PYjpxRWJbWf1yyAeXFJPzKNi1WwnA7DCapO/5YGy+G555/ga2eWp4HjLJGaq5EDtwByQ5353ggj50Nga+4ibgDpGDZlG2EhCHcpNBdJJ6MNNDCXv4F1+cIg55fyeCu9BkB/Q1rkkm9NCAQTDLYkc4fOe7KUxuO1rXrpwJsM1ma9YkQl7t3HntONdPfozALlr2nPnDrllVUW0chgFm0Pe7m6JbA+JFd8Xv9oLQe9xHNae6sC8jMdCOda2U/iKax4bZlC44M4/kGnOGV52CY7hLcgL2cxJHPmKdjfrtNzTq5Q9Z0QXRVzY73txOC5eaSJyeGSFp1zXu+AkboQQgMae6NRLcmwee+Rc4+Bz49SXMx5a9/RZzfrhgELuXWYJ0tyICd1MjZVR/FFhfB+9kwmLOtNIPIRjyQ8UwjeP/pZlh/KYz2hQmBiDXaLHESt38G7RiGGTOpTvWI8gbR/+d7WB2fGiLuraF/AAEfX/v21gjYqrC7uaoD7XRH5QHqtANAtt7Rq21RnwMFyzq4fOAU5mX6CglHDAc8oVTdbkP3gA3qY+fMRAAF8BKOPgYE31rW1gf+vVAayulfcrF1kVkoqxWKP4rXvLgXXDWzEPx9v4eRTj3wSHtBTwlmEI42qrdF31yr7cwTceROwfGNX/TOPtA2+azF7+QtF1eU10WI5mHRjuq+Q7hiMYSsXEFgXr/i1G4SC4Qgj6EruDQxjJKPjDCP8Pjv+b/ElDU/87I/wnE00rc/ugg+C6im2AH+ZwSF5lEa9s1Gowu6oNAlJnpuBUcGitofi76/PX38e3wgq/KzpHCLVDqO8E6B//Vv3r4BAzxHmYdnV3KcY117Xvmms4/lCNkD9hzP2B4XUFrAgt+wtw7RNjfQXBCESSKJElWzTMsi3gKasJICCEIQGHaRhmeBZ+uK34D8Z/9O+//fob9OazPKRSAl4zUTANg08JufqRZFi8hTOKpiKSRFKK+EwIVpwATVN9mnu4Em8Nbp49s6Ts/sgpYEHLa7h1nceDBZt8YQdaITikoSDKjbOFC6LFy928H4e4vGJXHknSjps2IZ15KU2axKhotyds0ZVgDFZBemVH60Ez0Lp7iM7wNVncw3XfHI44W8BGsuliisHQJZIfzrW7hvZ5QV2kYpI77MwefLq1U8Lhfb7fN9Y+UWamIcjD/dYxPrlL2w00T8w5W2j34rrn4nZDu0GgHHpp7cq8Oli/d6hjnOGy4Cf3wmI1twwhCGfAwJJ1yK2yIizrRvFcQtDJHvKvk3rhAC24qFclY0/N3m4pa2m7QMnwjdhq6clqxFLbO9z+uexM7MkniACgsI6YWDrPg/loHpszgNoLkpOpWaQX293Bscyj3J0zAmcIg3wQEf+mbeRGa8+WY7oHXe4B8Id4jkZrnSM1koS3iRUYb4KM2XM1ItB3sU1k2um5i6TOO+E8iN3ED7vHcXFcOcOU640TLgoTwVY4Vj41ZrnDuZrVjnsmyEbJl3e2rUiQwzNaTVEBDD6i0aEnHmcEJo7M3dXN3R18/ggrDqzdbSckUoycdo3XD9JG4RVlZHzRKPJ0oisTpptuFmwcnooogQDnu9wRtK+YoJyjxStQFsd2YYcXZDWZeAKIaqtYYBnUsOleSbzzk3JCvmqlAs6k02zyfu+KmgAj0wPzdFyXeE6Lwqq67DUWfIA81ea/pynImiXR7QoHhBD/FjX4x6porq42g6LbBIAQqqVbAthaVM8HMMZj6ziBzT++y3E2OB+v/qoI3whFJP7M/cwXtvZtN9e4oFS5CtOatWVPxdalh24LuYpIqF/GYG7Y0rfXzu0L5i/M4iM8FKwQXrqF2oAHYkCrQYjqOcsPcZ5919H9dcWpnwWd+xNwiC0ub9khLNofS+R+wUriF6zJSNrHO4thTGIYQBLAoFJqi9EQvqUhwOogGoMQLAaR/adTz8UQAoNwMHi81pajFIxvQxqit2FKUzCBZasV4meChvPMd2y+SyLfn/XbrkivNy+jGwcTODE7Pjdg9Vzs4Ewsx9y5BOTiitjxOuzSbLOIY9U7hg/HJI9wFDek4u5W7UgmWwwu0ZXbrXeGls6z4Zj6MB42XP9EMf92QEfI2D9h4YogmWrKRT2FjjRI+HGJ4HZvUCVOxhWr7CBN2T1vXpkeH5fuIF6MU1utEouMHppn506QyBIxth4kaqYZGCnszzTArgoKZt+ARYJEH3b0aDcq0htLf1p0SjEJ2e2rW33tfG7QWnsJ98sUmb3R0ufpfNm1BivbgrgMgajZRJzjoycbM+R37jmQRzQOceI5XLXwMGmmII6tYyi+6nA7+mrs0Zqz6fl+3R34h1axgeCWWpIXOBdLiSCgR8MiTWjvMPs8nJVLvKc2Mj/5eElB4n5SYgDYpKeiT/h6QdKmu3OIoh5tQyAUosVgeC+fSmZ2240DVugJP1j1c8zlex8aF6xAKaFz3PLwePbEopTMlSIKsx6GQ9416GTE2dnJFEfvw9hmLpbfq2K8RFfqKuUWoqojjhGRm0dRRV8wuw5JzYv9sJhtR5xIfjBHfRBxNyiX8RiInUmEMZ5unM3xzFr8zNZqgd591pJlXdrQWCAcrnNqLc7RLKTQHzaPDUrQ7aBM/nTyLDmf6vI2TKFNE8ipnoqDJJpctuGwHCviYwjHNKoh8Nm0o9PuKMkKeodnF8nkx05Xf4h6LneZX+q33wwaIEiylcqpgKmu0nw8BP4GQAOC6cLPGgICYmOW627ZdzhJ4WkTPM/Lz7uoW0PUlxHjy0mq4eE11xSI6lP3zAqAwsNvhNwva8BbVWgFTo3Ly1VFV/f8x1p2GIj+Oj9LwAGux71K8VDtB4DFv/TmL7+qWdBWkvLWBcSva9++yzW92qpfdoTF+JJnB7H7lav6tYTu5zHCFRV+47LgWzg0PxQVNEk82F+4kiXp2heAbJjqr1EhImAMpmloC0chusVwItmGMIxskRSBYhyBMxImP8o3/fIf/WTF1wQZUiRJ4YBPIMgWXZNedJRiWwiGYyhFcZKIPldnHZD2nuVAwJNxTzw9sH3S7h4cBSXKleGUpN6UmnlgISQORpdpaMtegpN8enh4hcuUYttFy8XCSLsYRBPnfUsfKyc60QFLGc9pUqTjrZ52J4ng2A3knttYM3EvcQ9OEZBw2dKea3QqIV2udBYdT3hziRbaoBbzOGNohM1nma/BSkRDZ/7GVMcN1rB0LqbPS83kOkxh2HnPHpJ8RK3mAMIiKbHy2WE6bs+xjp+chIXaU33jnev9VXs27uRSpLOXWkx4uEqPT6QazeMVm8mn1/hxYihyI2GzUa+xl6umiNg1/EmwstOAFPR5Q3YhZ85jXIskZJ9wlo4qA6YEuhCoZkgE2tFI/xg5HsaruwAdLUS2QoM4NVy4d8fhHCHZjm8SyUZTtx8bhCAuPj8NguQnrLibTEMe7w+U3O2dy+iRDmKTYM1qWbR7yk7F7oxrJ37jJm3d7RqJdvZIJ40XnBq4eDg2qaNkVwaF8xnvFEetJ7GiqZ18RIyNlWo6WMJHnKbZtj+R3TFNDQu8O1zYeSf6Il1D2mT3Cb9k16vL3FF67s2mm3a4ix/B6vOgw5Ht0n15m2nfZGCHY0UjEEx9lsruPvYlYXkHs70Ggr5XdNIlYC246AuGo4SfeshiSi1axGyk9/bmNFwu8o6M49049URMG2f95lxgzIbnGnwBmcuI2IE5kbYT7w53l3US0mvxfOSPPHbpvi+9WBxctRkMRPxvq1rAVxqhiUENEOOloweW1rAu+k9VdBZ1ieGgvCABp+Lf4d5hJyL9jFwNitDjLf1ZO3jQhW9rzYoGmsgjvs08NURCfEAeAu4Cr4VugHZUAGUfq8Y6wAWAHtUjsFfHc7MKyrVoOwaIwc8BF4PnrO7n/PLDPAdXU6h91zTFuEbs8Z3ixrvmHOjtQbfVt/zj+r3adH48bvwBOCR/Rmn078mfLItOQziJKJTYkiFObzECJ7YUkaFbNKMoOokwCoGRD9HizZ9L/+zHocUnZ/fta7cvucfv+6WS16hvbyDKty9V+3VO10JDq0rr9La+Ae/qRPA//+wSkD8Gh74c9kcXnVsyr/C2/gmGBoVwmBCAK0UQDrAYS8h3W21JhkdwDNMhgXyowvVR7cfnbPWhcRphCAlt0xAiAGtLwbubxdkWSRCcRBCIij7b88ThS/+QnTe+c6gu4xxvgjmDMFJj9M1EHOyH+LgRF1T3BXJg573cEJzLz1S2XIXkEW+qZIcDfEPvSixUunN+3lB/PlrkhvNOt4zw8UeoLvce0PK+7Y4VKVuQdyeerXqd7soN7YITwRn4nQbx1A36QZHbsKEnO+TO1/MSGpDWVOHd1257CwB6aaBlrWDCc2EwDbAf9chvCDWt4VrFSTabNqrg5IfUdNtMTKpKfxbJEYM33VWs1HuRP8rjud2IHABzmCxhk5rEJhgTk3ANG5PmTeFe6wo58m1N43VcIf1+gedqZ4rH2DtMbmzdspaisaNU74hBKBOZHLqYhfigshLkjnQ8ndEpfo/pgSVHWOOl7NbHkHn18WEizjsHu2FxZ+7D9Aa3AGp5qbuwA8byvsrL7f1813E1elYbMWOzMWTacM7Ntjhe5Dt+wDZyWzcWoEamm11M6/YISIRXGGVkBTFVkEsY2AXDE7MrBgqto0ZyV6axlPcNy7S7Po/nPu5OESvEWH3pu/PIk5WVG8bFdx2O5KJQH4hzK8R+QHlV44ZX5yhTyZj5J+Zs8sfzIUihPZnYfekqNRFRTWNOBlnc6AclXLHpSR4u9InaeHSX2IjQnQyfKtmMEUcTM3ryaE2eQ1W8AEjoLMopLELtjp3VC3Gqi3t3Ma6d+NxXrH7fu5o9LDdnikr9vFn6/VF1ZHG3uTSHa/d9az+0pQLMzXnqnAR/c9E5wCDAZDRPK4K1eWdZMUZ9+GWMrQxF5QzYXwCz8aTHd2gAX+2DO0Ue9bNmbT7i42pZYWrjP14ZuVJ9qNy6/lhrPrQasFZELbVm3R7VV2ct2wDMLp4Bs0MAHi+BZyB+YyCqB5gst4r1f03r+J9j7cdvv7J+epYVcRHWb5s0AX9eh25akfVF89JbOrRh/aJ+4/167Ybbq+WJA5CfrmCzDrAP27dR+nbMu7lds1uXbkUlwBTB5eJ07YkKX8LBh/B6fb5Vw7F6jQH44/AEp62KWu9vYXVEIaN7USfgDj4z2fiH4NDrNn8Mkn2bwcrvWQf99MXJWdNaFv8O9f5VjgFv+seQF1FZSmJ0sqUQAtliMR1uozhLX4WPGZKiMJ3GH0De47/8y/yT6ccfVe5IwSkKcG+L02AtgxIoDuhnEm0hNArpFE0BKQ4/E/LirGjZ43K6n91bOvFXOdrkcA2fhwxxzbYLw9l+thXZdnvcty8UdKTyjDuf3bo952e39Di/hJMDoIbHQhegZyMoTpU9oH4QGHdiUYoKoIONeIRrDcJ4xVMGYlG+3bm5oJjP8bk/Gw+tjrKY45JOrGBjtq3erabi5Nxct+uLEZ+oJybWZw8iW/wRT20gs3yNWBkzurOKGnEcWuTp0GIPEenpJDBHjOKEYjqX1M2uTZ4NorYmxzFl7HvNFPl+f8zD1pSvTWngg+RAF/6MDFJXqCXKDG2qFuRIbGw1cpNN/xjPjbeDmw0qNRv+INF7auChE8xDisAbFMTrG9uR7x5REk0w5ZZy1STslNJBz455LsZlF04xwQqGRQUVwof7jRCMByQ6TftUJzfTglTtzkrjDjVkAqMCpD2bYi3dByNvOZ2sKUeRyRNmiCemaE986kGCWh0Rwi5PjlPe9JgXHuOGUZdTPS74PKiHuucE22S5YkMrAVfJj36we5Q7Ftci4mR4oeWMzilY9Ttr9GOZzPzM6U5Br9E29gjnE3xTkTI6y0RrYmiQVHn/ZC4oczW1UcfEnSRTl85hpMBUlaowzBO+tPYu4KOKvYgUG+86DxldX22J20m8t3e7y6OLjC1IbN2rRStPFZ/JEXMIiq5uVNybQrmJspmg3eBZSvMTHWo2xvehFGDQk6QfF+l+nc8P3XiM8fcqmgfUc/FX0clZs2PsW3p/K61caaeBrjRLtSVIA+EfhHtslX/XlrUHi5k1Lq++I7u1t2qa9z38uva1/pxh79UAsCQ5gLyHZjuAfgK44y7zC/obB3tlswAFVRfpqXpuHZR5oy0qWAIAurqs/WcS7q/ZreWV9Xrq9uXxQzJb70opTis+gUD9tmia+6tIPbyERTve3lOlN38ETnrZf61OXsXwZWU8+pK4Xzc1f107H++HohkB15HGej3tV+/VI9+GL2sW6M9XbzGAK+R7EjasvOy2blOu10vD5PMQaiWx6w3+aBIrSOanMIdGI5IOkS1BrlYrKZyuUg/pNkrTGIeREKLQD7c8/+r/+Z//r5+stzeEYiKJiGTNi4E/IowEhA9DtxRJESSBRTSefG5RY3I77C0p8qanHiVL+qTx6DDVPD71yOw1mn3aNYkYyMEGjZ2ZkcVzJWfQtS93zwgqH3OwHCgQG7Hh/lCR6HAou72jkWyrXcnWEXePAddViW/jIBemQb/kJ/EoEoOkt7ZxyBQbwk54kUaduusUqzG1zYVMark81AKGePhhj0knCcmQ7FTfvAmZ60fDxbPX7xL9dqfP6HwTzZQQ8OSimdpy3FFw2cH43nOUWIbQ5oDQONvK+3u3bBBs55tVmbNR3HgsuTwXopQZ+8wT94l3JegZ1LZXl/11JJoMZi2YkK1sTs8t6vA7K/cD3SprejgPHnzI5cPMQNTzkM27xUoSyTr7pHpa9IxMJbtcDhGxIeynt4g+XLWbYSzwJqFvo2zENxZvURx58Cen5zmTvldkP/K06Ypg5YlfMT5pbnQtUXHlZ+Ijy2rqzD6xBzYGnYyo/cRd0AJuq3lf7nIMROxmuj2ydNPmURC34ua2qZtYyRxTpbqHRmXIUb7g+zI+TWCFiC0al1DE0evasCweB6yi2PO9PXg1WqY5OlBo5rSljrVc6rtHpAtPd38grB0CO6ceOhzgsqCy/b6+GdTxvMS+MffXK+1rsAC+dSlAfMCHdGZDdt0uH3IW98arvNiidtYPyDAh0imkz7Zi8BAeAOjztL1LDvZ8zvddiBLUoJAZyzBnWlPiW99s5vns3QY7J7jAmBLIFZ3vZ1gM4inzVF9Uy3h+m/qRvzCAejCYaqvrlh+0UhF9tSBZhEYVJXiNt7qdNNq3b3kqplM7lkCB5zHPn3ejlrF6l+EaBzDmVdQZ1JpnFtqqhrRSKdEH9wheu71qSkhzYDMLwCUE4G4ReM6qeDQDbEZ87wjoGKBsiPoIOP97N2r9pkhxug+HtpgAS1pZzMcixf/Oq4gS8JtvFCZea/c28P/+X/zjFaair1dpfCVP/BefkieONsRHTmLfQ6P48zYDf+Pl/iCd4i8VKBhTk1xG+UJlLPk3NPpCLM0yFErWdmJqixFUtAWYlW2hGEczNKRpNMU/QKn/5H/97/7T//onU0VCMIqOsbVcBAHMCCLQbUSk6TZOQihJV8EkKP5MlKoPvOugxu1hJdbt5Pk384lclWO0maSEB9z/uRFDTcRcZHe0IN+/7vnTHGYFF9n16Di+hKT6sVKqEoc5GXKkMOUoNQw75/4YWfH8NBV6jwvuhjoit/x+Kq2aiNR5x8VxuVPjOyw9l8BvLnBc82fpbHQYlxtHwfT2RsgcwnS34wmskncxIekeJi/MwCrTpcQEbiw2LGLjvS4lsuKQOwTtuXiRFahH3Tmz+51eb4QEW5TJrHkiuzQW7smhdw8ZWJPBSjxzH5vKqgZuObv8TMSLTi3sidUdUTbacTyRG2sqyHQKSmp6TkujnGM1OphgnPhgBRxbOEeMOcsV/7DcE0tqBVK2gkJIqsw22L1Pyrrt6UVQ5rNRzgoeGpjqQFVzivMQh5OMXaTqNPb7iEyg7KikaN+YMRrt7t2BZbQIRU+WONFY6CgcdEZAmB8Z+MkIuwkpTIo87zcuUnfIseAx5Fbu7s+Qi8kOSnWXHZqkMjLI0ZniAfNSjGPe0p/kJmwqVfIMcpNE4ukZU32ed4fwWDctceUHCTPoa+9OqKfSJ2NhH+olhvFDlQwYTEKHiQra3rPp/JwwNHkXzq2C7eh4RzK7eYEi38ylvhiUx30XXi/LLDyfZ2T0muyEE6F0P8+IseGaE3bNefCZLUVHdiICFoZiqvf0gzmS7XAYpREhKLSz/PJ8LIRJvYt0mi18p2pjTtXtRv1+m4HzWo6hrv0VtgHp38KMdM6HtbIutOUCr2pBuuigun2s/eZYgkiOqOLLvWTWvr2E47Q6T/oe9LNmRb5noOsmoL9cnoF4zHXPh307AegTVFojFP7Cr6odeADYj/qyKnCeAKWQoATncm4DEB9RvdWdMslX2f5V1+/Xbdb/XBvBfmhLMvRNLclCODQvOgV+tvNV4H5o199fPpkAq9T7mA8dYGhcOoJA+jo1fOUFIzEckrT97EzWH63UCtzFZ6QI/0BgzE+LJxFRAtEwmmyzEIa2GITQ2yiKqW0W02RKogC8PhJP+qt/+r/89U+2qUdDq2QfjQOCtZqHUUiyjVAEsLwMiugUJVIa+dzqw9Niosy5e2zmk6PG4u3mLlZP39OOLYf9wT8DNLC0Ga3hPILFyuncI9yy0j6tGGG+JPvocaTzpb5QqdJWI58ZgPl5ln6QIWpICXwvjR53GQ7yuahEZdoPR7bHThdzmZIKB6uC2+lqPe1JH5W0oCzTjm7js3ISsd952lUO8fnCD9RinVTpkt8P13yPPuGTh8AYvBO5mGuu1UVRph06Rr1McPUInS7F7QRWTACX2JBIE/RwJFPW3LCHW3pK7hS1mGOjpBzXEf6yUfLpSRQpJk+ng4vQcmegppb42jM87m7RsNElgNkPNH00F1aqL9VmA3DJpI6l+dg0V+aAtUjCtgCWpKf2sMRSS7LKxG1+HMylADHMouPOrMv0OQ3nWiM4n3btopJU8WIcL6oXEk+BKyFFuCViG4RP+uzWkqKiEW0hWQYltOfslpOvkBPSw7zKCkIaKGcPkgLq7Mt+MRwEgI9GsydhW/TvKJrZ99MuHu/lrs3cvAv6zYaEy2R2yr2hw/BM3HjzaqKXXYwI4ck+YDojO6mT3eLDTk3LMxO3AnkdmaMVH68qcgtUhIV3yHm/i4Ryd9iRqU7tmEBTBx2DN9KMYL3Y4timWFCzes5NVJTD8VHjRtmUpXy/n09obFyRS1hfd0Kqs5v90419fGRGrkoecCNNTzQ77LhHYT6OZA4m33YMnTmOp957ZkayiaIRafb7noSgaPx+gn7v8liL81Dt6vEt4kn/ghknr0J9Eqx6bg7gql7rZl4CfQDSglUAqZRQnWMAYTqWAYB81T4WmuhA6iIhANZxlfMfANYBsVrlZFUUwBwgserfiJvM31l9lUnrBljT5Z1AbbwhwfEVtey13Wzd1YvXSJsO79JPK29ruuiV26qKun4pz65oNndDu8LPilbiWq3+3kjmr95+Ofw66K/HSAoQXV5X794h4PurrEP86atW5vXr65bQX+E0+SsYIl/CuV/zniG/PvxnQd8v1kL7uuuStyJ47NeOsu+NfOBotD71iwt4rHMyviH+D/R9EzWr6Dr3hQgee5O37K+YHImEGIFGW5ICdA5LU2xL03i2RdNVJArGySQKP4RDoz78yKKZj+EwxWIIypK1uy+Dt2iU0Fs6IqBtmhBIQgAmmVHZ51o7Tz5rENdshA9dCqcBWGmyIaXg/nXCZ6efTbs6YlNvTHTE82jMZZ3fUV0OnZ0gmYvLqfTuu+xQ2+KI7Dbj0by2GNw9eM8meqx0dlVS98jjQShIg19qrZ5RlpLZ4Hy9XcVAUYQaTKeckt211haFVmOAdDcGKyvXHtkIXcReAk9eqsPRs3a4I1+YPnRvyn7TN4r1uM2SwZYlpk20iA9deijcvZGmbId7KT4+7kXYyMM94DQUJ+gjVeE+AkKGl/VXJXtigcmSUwQdSFvDA2SvlIEJe2xTOj1e6XU6b7zbvT75SfK0443DT0s2hP1p4RxhOmkodnnyGa0rTQWxcSMuXkbkJcRWUDTkiD9RT+lpbFy0y/bSefO8+iKpNSUL60KtB7to2pi+QfrCHZXa5l4n461GyqtiYiF59UoSuUmLWT/ud3mMCteUIamkCc+RB+QM7a4FZYt3voSuyXNH9Bfewe9K0S645HocMbOXY48eupFIFpOqiP14Ps7FvWwxB3bswlXdtGcfz2axladjtReaKxT8WIYdT52OcgE9NgkmNXpTCDhx14Tr7GpW7/TeHZ2QZnYcrkIHvL5hakDgp5wZoZzcTDd2dvQMWWaEOF0S2VNEt+Vm/3qA9ucFb3fL5TCcjiHmbbyMTw3ZHqFIPiisUnTGsTVPAGcF86HQguAUQX/dePHRpfsaP50QLCyswt7pRF79kGL88rJonI+pz29mcqoorYrsMIDA1TxsNWQDjI5ttEYrArsG8OE8/MZBv0PSo/cb4ZkcavznDYfqQ+cA/DcABpGXOVrjL3nulzz60gMu3XJtJleXVb7jZeMMBav277I2YjuIury62QCDuyC6ty4d+EXnvr+G4O+8+f0Vwr6uRfsOhPyVil27W3jr3gJK86q6zAC7eVf29wKjcFVff/OVzOCcgui+eid/Wa//UhlcIenPXxyMErrhAhAPELoVsk7vBn+VVIbZ+6GouWhXmcLXGSKghbcvz/PC4fP42QpS78f6iaszfvek24ytfyG/7J5fwPX+yMfVnhGEIREKb8kMibYYkoZbKozILYSkJI7jaExC2AfANfzT/+GLnyxRhkAIDqEotI3wKN6idAx4ZIyjWwTBYBhgWUZGn6tFxREcrVFox0CaYW0YhZL7g8QfFTgT9s4mhtc2rYIGU1sjGMdYnXmaZPQ8wmx/zTjxMDfnDl7gWLvCxX4fA2g4lInZQzh8cSwBtireW+xAnIqCMgaqmW7k7TpkRwmFx+aoGKlTigEIPVOMQixhkt5iRZMEEyfDk5qDej6I6SmoJmz/mC2ujKwA2c34c1d3C1tAGpvqEJ8hajvj0Wl8RD1uYjFd0AQylSW1o+vWDcfZSocNEiy4aqaaMwnmzmP1AdH5c0fX3Nzc+D26ewC+QUfuPgkFszszcN6xdEre9HbJ4MItmf5wdh1sP9AwfUs22PnMeEc+0FnxwNxKaJ4TGDoUG+fQ9uoxumTXpr8gXI1yrsHum6d/acl60DoEa3R9F5gtQQyGhJenLLnfqLY8wUFQICeuivxTrd81q/LOO7By8PoOGvfxjdxw7eFAz5unORv3qDVhi6aLzY7S1U3rDUfdb4M8h9j+ftiEGOMZFicNtDnSiABlVzQbFgv19zD/9KL+fkoCG1ZdSQyxvoGz3ZN59pOdbww8ncudWW7Gw9CQUkLSBA7+3B3zu1E/zc0C+Ue03lNGwo8oMTwDFcLPYnxX1CmZO0PVWdY5IBC8w7pRJvS8nYozBziDnddD7RJKSJkRp58vxNHmBDlCcyVr6WfF0QcakZzJp8mG9VrIhDaVYxyMDof2ES/urBFHDv3+KFy+pv7xf39Louz5UvLgDBB8v7U3ANVFwNdss9Q9YwkAZ/FXYfKVxy1a7i9BrYs85i/G8zuAi42apI5EwQAPPEa7n/dWZMnAq+qH9irACHLfXs2ghQYAPbQWpGjL2kkXYxriP9biFHXxYb/hAZiZuYbwiNq4+VrkAfgd4HLGrNoGpv8NbEX+/pt/Y62Cv7dpPAA0+lCYCn2PYt9M6/76n+Dg2UW89iqs1iKA5r39DYr3ZRtbGMfpOHbDc013kWuarvugt+3vf21T9O07NHrtVV7eEUMUEMP//L9dr4N+4n4/wRP//sc8cYXaf1sNH2+xd+eMfwmu+4sPmCNMka9iy19zRnSDgiu//cRVv7Pv4o9fs1LzJ2n/FUp/Cc2/+27y0qjrqk9g8m+9+Z3xywEBX/y9S5HdVg/SuA6LZk3SvQPd3zYdjWd1Xf7KgztJUhhOE0AOQ2SLQS8lFirbQliI4lgYYikN/603vzus79t77vnmzX//Cax988sPsBZ8ctI2XlnzKmTzPbos/var65G537omvBVxWNfPt8na9pC+Ha9pDJYW8avpcQTLpzf/Cjj1WsTV/fq+oeXDVGvctVlxAXD7XqyFAFOr8CKvcQxY+3w0v38Kzjilw9i1Yf2WezVbDG9JCII+Mdm//eYX1/enfpG8O/UL6M2/9usWC5WxbN784sArKv8VIY9CFIZjDN+m8bs+i3gbxgm6hSkoRuGYphAarCt+eeJNS9cY5QvuNZr5BbO3JZf/rU9dFHvzdwNdZSX+C0tXOAlcc3/gLfukMDb/22/+6KPzYfjNH72/y9889eOh0Td/8sHQX76cTwwLvflDyzm9zmFc/wvwAbOtTw2KvPnTDycJvCUiWBN+8nT4zZ98ePo3Dk2B+f/aLXz7iyPf/OLrJ3/5yj4+kXjzxx/MwjfeAP7mlx+c+tVLewnufPTGrp+uT41Ev/njr9/dl8N8sOb9z/7P3zr/h5/owfkX6nv4wyYWevP7v/70f/DlRNIoQcmY2sIkjW8x8MXcRnCWguX/mpjAASGhqG/5cn783lz+4W++Nz+3//5fPTwo9bo4AwA=' + }, + fishing_bag: { + data: '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' + }, + sacks_bag: { + data: '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' + }, + quiver: { + data: 'H4sIAAAAAAAA/+3WzW7TQBAH8EmatomFaEVPSIC2El8SULUSafm44CapciAJcoUQJ7S1J7Ylx668m5a+AS/B2e/hR+FBEGMHBBUVhV64/H2I4t2d8f5/p3GIOtSIHSJ60qRmHDRWGrTcy+apvePQktVhh1qc+hFVzxJ1hnHAB4kOjbx+dWg1iM1xos/k1Oss57asrtJ6Wez19UyH/EKVhf+oK6u3y2L3jTYmPpHFPk85Naw8Dua+jbOUdqVkGFuj4jCVPlKmu/fkdy+bKqvzkO0DUy1++fzpR7Vsbknjm2Xx7NBqKdVBwIE6jThVJsrsZnWP52WReK43UK7nTd61qTXWM6YN2XDzWZabKJcSN8+zU3JobfDR5tq1No+P5pZNuwKhddcbTbzDoTfof6i7EDVpZZGPqv/n1F5BDWpQgxrUoAY1qEENalCDGtSgBjWoQQ1qUIMa1KAGNahBDWpQgxrUoAY1qEENalCDGtSg9v/U/kqq9ZvUzp8D3SiLqQTqTUajyfh8pOuydZDEqb0kzTIiIAIiIAIiIMK/RXh5xYHAuXAg2Ph1INiX/v7ZJt2Vg/U9jYr0CSstx7m7XU8CfqRTn5XN6Ja8HVUV1ZvSaWYjzr+PCVt0X3brfmzU/Lg6IZ98WnVYnDCPFWu5/8OfXQLWQhRWB3cWY0fCxqigvvJVh4w12VjkuoT+2v7k7bj3/qLhQp5v1qQw2WIwAAA=' + } + }); + /* eslint-enable max-len */ + /* eslint-enable camelcase */ + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberInventoriesBags); + expectTypeOf(data).toEqualTypeOf(); + expect(data.potion).toBeDefined(); + expectTypeOf(data.potion).toEqualTypeOf(); + expect(data.talisman).toBeDefined(); + expectTypeOf(data.talisman).toEqualTypeOf(); + expect(data.fishing).toBeDefined(); + expectTypeOf(data.fishing).toEqualTypeOf(); + expect(data.sacks).toBeDefined(); + expectTypeOf(data.sacks).toEqualTypeOf(); + expect(data.quiver).toBeDefined(); + expectTypeOf(data.quiver).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBags.ts b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBags.ts new file mode 100644 index 000000000..f08ab1e0c --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBags.ts @@ -0,0 +1,19 @@ +import SkyBlockMemberInventoriesBagsTalisman from './SkyBlockMemberInventoriesBagsTalisman.js'; +import SkyBlockMemberInventoriesInventory from '../Inventory/SkyBlockMemberInventoriesInventory.js'; + +class SkyBlockMemberInventoriesBags { + potion: SkyBlockMemberInventoriesInventory; + talisman: SkyBlockMemberInventoriesBagsTalisman; + fishing: SkyBlockMemberInventoriesInventory; + sacks: SkyBlockMemberInventoriesInventory; + quiver: SkyBlockMemberInventoriesInventory; + constructor(data: Record) { + this.potion = new SkyBlockMemberInventoriesInventory(data?.potion_bag || {}); + this.talisman = new SkyBlockMemberInventoriesBagsTalisman(data?.talisman_bag || {}); + this.fishing = new SkyBlockMemberInventoriesInventory(data?.fishing_bag || {}); + this.sacks = new SkyBlockMemberInventoriesInventory(data?.sacks_bag || {}); + this.quiver = new SkyBlockMemberInventoriesInventory(data?.quiver || {}); + } +} + +export default SkyBlockMemberInventoriesBags; diff --git a/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalisman.test.ts b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalisman.test.ts new file mode 100644 index 000000000..c39076232 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalisman.test.ts @@ -0,0 +1,19 @@ +import SkyBlockMemberInventoriesBagsTalisman from './SkyBlockMemberInventoriesBagsTalisman.js'; +import SkyBlockMemberInventoriesBagsTalismanDecoded from './SkyBlockMemberInventoriesBagsTalismanDecoded.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberInventoriesBagsTalisman', () => { + const data = new SkyBlockMemberInventoriesBagsTalisman({ + // eslint-disable-next-line max-len + data: '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vFA79vF3eOXd7nCvMz7c/9pNXvZV88It+oAbv+nzwieP6V8oXxzv6kfO/ylfvvr/PNs69lbCV+znlO+722uPOfFOl57xjv845dze9L5f+ead37d7jRzwxdsfeZvb3fxWH3/25NmvOPttzLMf0fv7/3zck11n/fr7fflhD6ZffNxZnzj9rs9/7AtPvselFz559sW7fP217z3/34F7A7pL3DHab7/zgcc/vfsg+nsf/P7bP/K8t/AfVR//He3hxf1333v328i7n3vs2TT9mdkH3De+99Wf/GTrgv/nvlZ4nvPl+576xTt8/34H/vmfk+743iy5aSd7l/X8NX3B/c/76Ln4Pe/69XdqZ39o9O7PdD/7f95xs2O+fcsXffN1Xznrbv/8pQuX5fLh+8/2MODmT7yp+JLTn3jHX5zcVl7ykfcnj/rSU4/+WvXv/3T6aeXtXhT/4LsfuO+X73yLBfGun9yp+5nR295wpEdo7/3IO888e3Xry977pi8b73zBr8LsJhd+TDnxi9oTPpJd+pUffvXj37/s9rtLxwfeUT9fft6747+dBt37vNn63g/89kPPuWyU/s2569dd9Or7nPuUt57+iVs/mAmfr775qDF62VeC251zv79fvOBNl976G2++xV3+4TYX/u38+Udu9otXv/3M47908XePvc3d7kJ+5MKzzrz5p5+Qqy+92z0mH72rc9pLiqM+rTMX3ad1ofKZi395yX2Lxdse/Q8f/vYZ0Sse+k+nv+Rljz7pgqMD+94XfvBRX7jZO5949PPvddGrn3PuP1462v/gf/6V++lDnvz3z/she4enPOmtNyZefvLH/xp7A/2ht91i/9BzX/og/PnHX/Tqz0b/eOn90h88zjrj++373+OZZ77kdfZxX85ufus7zx7c+dpDV/e/s3pp9a0vB8C5xxylfObrv7zkpJ+ch3/xacCL4hNudhTz2L/qcRe7z27f7QQdkL55yjnfPun88/3Hv3z13JNPPPeS03/6qe9/KDhO+rbyPcl7xukh9OHhsa95xT/qwvPab/3O8PN/8/qfnQt+PH/wh8bCTZ/2nNP/5dY/Qk869cRXiZfc89wnHcU/68a7+4rAR8659H2/Qi/913uf+tyvnPvCVz3j6L9tH3fk+AdecNFD7oZM7vvg1x5tq0/+1CVfX7+ePO19/1Uc9ZMvXPTuR1uPf8zdlbfc+htnf+Gi8+7/vtP+5vzTPnn7HwvDG99rffP7vbJ/QvaWN+6//912stbPgb/41h9pLzj6b9/1xJ9+4/t/85Ff3fIl//cxNxYefPapx9+xPx/f7Ll/9df3f/BPfvr41970RS+m73LK8MYfOeMDP7zs4/llJ9319Kf3bom9lDDXJ7//VO0tt15/+mPvP/odxexfphF8zNEvv5d4annB7Jx49uib/d1ffys777+/cGr7dh899Snivc879V2feNZ3vnxP601PP/X5zs2Ur4c/fNnZp73n/u8UX3vv6GX/KP3bux9wxyeJ6P987qinnPerh7WsL9/kERffFnkP+flLnmie+c7wPhe93BLehDrtZxz70id1//W4c+TBx8C7Bo/5wB2iO3//Ld1LfnbZCU/W3q/d9QE//z8fP/bGb+h9/tnPedZtPptmLPPYk5/V/vZzU/j+Z5z+41tP3nFCcukvj36f9tBjuYLEe3d57VvZDRXdxxSJB9/zH15/73+XH/6v0IeXX7pH8t8nPc566mPv9UOkvp5zz18891n3+Owx1CvPecN7Hvexk9/85Mv+89xTT+Uec9Nf4Pcp3/qqF938Vf+1Jt7+iXfd/51vuM9t736/yf0uqJ71o5MfxTzu40995l3e+Ln019991r+ZR//6afd4ivKeX93qGPsNv2w9sJlVOBw0ltnpEYOlRke6VJ89QlNXZncRHAFsrCb5KIg4bcTxwJruN+pCFokibs34Me+qE2aP+t73kOuts8UGQM8hELuNA412netjbdIiwTZEEAgMIygAkeB1pPvKGNpHcSrj4+0syfOePpFNOMW9rSIqfjFlclgPsnJfBl1QsCp/EPOs486kPqL2RHGw2YQZwfI5ApFTEvFJZyBHLRiyWJenMFebyPMUUuNBuchHejDTscVwPRuybOlw3Va0R1QlhITZ3Fy0JEcbJhJelaY46fe7uLRAkG0r1qZOwTPTTmsM26xaCpNiP3NmlamPpnThrvWZXHYHQG5SzLaDorNsaHVEvVx0as6+nAQQjkakDgtEUm5aICiXEt2RWzk+gYhkWPPJJUnsKBLUfGA+7Wk9VV/2l7ELFOtVHu9qDqVb/rAsZwMVrDoZse2J9LAf98Kk67FCn9p61JICoGyn9CwwY6HxHNVDrwubO22fdBaCElZ7WV+kcIgsyc5gKncQPx6h0Hopaji/ghMSBmEH1yxQ20rIEDbHKMx1fYBT8o2drUTU6sZC3yoIek+n1ki3equQR8fGYCzykgnLCrbmNL7V0kGNWnOd5boyKWC1XJjTud3Xu/5SmMg5C2zIGaE6XWVIuya1ctetxMTUcLUcr1FhzeF7ONdCQ0CcVTLj5xNMkydJv0sOLbyoFKwM0x2poHO3l8YtpJ9nnaWzyZaV1Hfz+mPrDAdVwKRpxGZgLlYUORK2w8EYX6s5nfurMksYkqdVN6vGm369hhvMHY/H6HDUBTcgvGSAYYJNeJZVlb1t7DE9UwC+tenpTtkPiQXiJlG5SKbZhDP3g97wz9NJhaS4ke4JkJq2QlejkzqvaW9hVGxlahJiTIVDXVRFM0CFl0CTGYL/X3nv8vu61qYJ7VKjporqoqq+quKrphq0JbpUFPmi+H6RkMCOL3F8i++xhXTka3x3bCd24llBq9Vi0EJCSAxAYoDUI8SIERNUE0YwQUioRy2QuPwXLGfv853z7b3PdR+6juijk71/P29n2VlJ3mc9633f51HLoFrtEL6jw4yLm/oWH2rV97Ra55zVDvVnXWgJKHntI85TF4Nca14i2y8jPG2pHsGqG7sI4Big+56WB9wF9T3joa9Nx41QrlZNYI7QoKwQFRxXS/Wpc3njP79/oeXvfNQhhoCjf/ZiyCTztnmOt1XfdA7Ht2NXT2nyvnzyA2nV9t5E6bDm9P76n+DvrPCg104y2UW3sGhfPntp+zYHIfedhmrRhPVqbbc+4WVm9N3lMj+Omf/hKq4HOPVfjG9P9X3Mix9a4/93jisSnRTHOkhfK+sPoQTDInwLkSi9xdKE3FI4Hm0JhIohCEexMP5Q9uIf/o//7j/+yTafkYQk0hALtyQaplsUI7PV4C7bUgidRShNUBGKfi4aoVNllzZ5kzP3+jTmC9mTDXSS+iqr4fsUGl16UDX6Ol/1VA3o6njA8GHApqNLpBHVl16nX/0agq/UXTk8PXRjW8LpvufY0bBkqWfu5CYnlGvQookoZZO1IaumJqtUMjcKejwV6rLpbRzhEdZbzAtJqZwUQfpJwEeG3aHn6VrIPWZLRv4cZqhBu6nYkJyAydWGk5GbndWX66hGKF4V5ibvn1JPkROvTVSh0UbLU4UEP1QDHYvhyrH5skluperKQSXSR7SWi4LBFGe8XvNCpRREGyoBGu60x9s0216ujswMDbvUSabO0I2yzpxzqor9AbmiJqlUEhy5fChs9vPOc2vLVR/HgR3ppDKrhIuuKqeZVcFXQpagtHbah3KBt96Sh0pzsDuslRa/DUiCx5Rr6BtZvQ+SA8Xv0zlqnN0inB03vm4KX6+yCyMxQk9DsGzsFijkxv0GpuBc3WdzE56eCzZ4ZyLN+jS4pEg/05FLWfpCRl0DlQsiM93egR/PAsR+mkH0833nO/h1cp26ZyX8+rxunjt+PqRHtGjMJWEOG+dgPpIIa22uhm4PQbKKYM+Iu3kSvV1cjEkWCi16iuomErybbGu0NjTqTt23ETzjeSuf8kkTghsc59S5gM/XEF8uuVU8SdtGLoxWV/l0LX0wzY2azXFAwmMGX1TUai/+gZAAru1T0dM2PKRtrO6pTkVPy2n8vTef+Xmtn9RKddG+WVyvUD31qXmrsd1qsL2ab6/qQRWqrabiNvgiig7sL2ypfrvsxbSK60UgqsfFz7nkhcL90sf09XV6zgKQttZE/xE0xsNfjFmzL+iqmeovbrEajQevfmcDzOUF0wHKqghALZuf/dKsdPD8gEsKTTSLv4mSl3/5zS8BkggFiPIAZH5DQuNPv/YPHvicds1XDdF/Af5NKQDStb96W6zVMlk3vAXoVr+N83vzMm9Vu+j5qzd/ewW06t/7rF3iPRjypf73I10k/nB/cFR1Ve372EocQ5IwRuhtSoXwFkNpdBsCbrJNaBwnMTyL4+xDJ4n/6Pzf/Ac/Wf1LhhIhFVP0NqZTfIvGqwVsEq7tZwiSJGQGgzX2Z2KSwYxU2lFMAAleQZhVrszl3lBT3tIHqruGO9vEd37vdJ2Zbxwhu+aad/Xb097KSQvtPNxHUugY73wTgW5iiPH5fG/L0312h3AxkZ52HsFccn5Aj4fa88SRnMPHVb6EO/dytCLHsHclxLqFDLm4rPZD4EHNRnHN88k38fpCKEuSaC0e3tm6KFyf3dCSuJoYlDfk7F5gOWSshkKQB1+TrckZ4+g+M25j7k82TY2JA9YN19bD6Sy4Dz4H54Ewn7qY0TGf6GRJ1Nx+GrFuilyFchc71DyJvmL9hRAVbsew3jBfHF1QEdXH6klUQKB7QHPsZqwGkQT6IH1JGJeuPexlWxTgWCcv+CM/901h9qPks0/vqJ7NmHdRIjdH3qidIjZNds+mhPxwhRN5oOdbdrPcGV46LET5zV1FT4379A5Umgtyb1Zle+oce8Ol5BLCyGMm5GN2gw84n5AzJaNP6vwUaNaxfYYO7azgdVWHHqrT8/pZptuLe3yO80my3ZFnlSeIPd1B4JxKg9UDqxpme41q9V7unb35zHOrp/WhvB2s4lbD2UZQ8E3zbHq4oA7NIIX37lmNlCGopatNUZpOMVYcr/U+SRi/HoSC4XgMdxiOOpLD9TDRk7WLUedQeHnBDvBJtsYTrV20tu310K253TwKo42wpH1wCPtEaUQjnQWrim5P2r7EUtpUmB55oyvc2BhKVOZ7STE5uGavdewXWF3i5VuU+4q19HKVYPIXBtFEFdJsdpU7RDTbwQBDeuie2wCMWtRvb2rm1p8j8XFdE4vg5+XnnRhda18AJiFCoZZr0jioAaNDAQ7VGscDJhS8bIn8Zq0jYnN1McGqkS210n/6y7EEWFStz9G4CsyZg6kN/9Ds6geo+L0z6/5K5DXbIPhv2OC9c73rVlPWaFWpaC9rqUv0zjT1Szc7+OUM8TW0WH9ztL2uqrr2G4gR/vVH4hchGDb9fEc7ABn8x5CB4ASJgai9pUIC3WIUiW1pFNAIhIIinIypJEL+P3W0CwFgxGECbXEiXksmo2gbQXS4RcksiyGUSLKM+lzZJrzz3O6a3DVpPOOxfdRIOTouDOPR6axKj2KKpaMfE8qjiXb2BmG4Acv7i4ZcsrGu5nGkLzULkRR5ewRQz4a3IceQLrmrtHYwvX5ULLgekI1DxCewRkFMs2DJqKePUIIq9q3k9rbm2HsG2pglnN85BA7PMc6oKAnoQnVy+GV3XJTrQZCFM/x8PMPcM5n4BHVRNIKRJAxxHrJnh64H+XVTQbdSRtJoFzPhozkyNnJ6ShPy2Gv+4WrzzkUuBv8cDLsOx8UmtOPuRkcLYkHJRYHQBKLVI4ejkl1xA5pgGVvUx/YKCY1dmwdls1uSx12O70QqUuzc7tvBuRx0Dd7YfnWN6Gae9l2CuGftfrGud8xXvClVZjjsg9rrynHcaLklu3pUNimFEf5oXTdCnAFWhIxamj4LHn+iSz/Baevp3GJG3mDYD+jMC6rm+PYYuExlXs8aXAG4gi/eviHJZFhEG9r04iaSMdTbXRRcvl/KTsf0m3Pf78IEZ8YL7jwKHKYNi2iYS8TfihtqavMetns+KGvl2JW5KfSTWat6mmt1YRKurYuEzjRNI2pc3T6zpSxuyezykhtTnE0VzmOHUbOFhmQlZmZvZG1GiMm1JYwiVJ8XWDkHJ9hQWVSAtLPcW6Qh0F169r3QbXqNRx2UICxruRKyrUSQsQluRmKwhzsr9baCSMnpfLSM0cdOjxE5txJ9Bvf6vXQw3ncsl9VTtaWH/s01NEjAmY3OxbPO5QVY4gPIYDAQMsFS2180ZNWGqFC18ZHvEHtFQ1GAwrMGhWL984aLVdHQXu0dYnjtVtDFtU5IXTUwAF0RioA7Vtra1YwACgPonG7H4G8H121AZUQHCRoh18RjqTU+WCeajWozD42TfgBc/FDf1H/rm3xT3aIGYTP9bPz4e+DQ+7E+G0L+wJUUhRE/gSIJlUBUiiVbCkbJLRam5DaEaWybxmiWJCDQ0PSHxOMnRZEsRqCQRNEtjq2bYRkEb9cC0C2UQqvyRRJRyOc2HY+k3hKper9t9vPtKfh3/JlYxlFgNSs80Qfa8DrLKgRVP9VZtzNTWsV1MwjbfneS0NI/UvcLVCJ3GXL0gu73bTTh9+smxSU48uTbXhkfTuKXJ0UernAn7ESONaT+tJfwyvPvDHm37rlt5jrJagq2gY3nAUMuGERxw97owQoeO17i9Dp4/eYJFkN1YSdjeuSeIbv4cfFgw+DMqojladltYWYyoijToO/TJb3t1Em4cQWalh51yViKlgBbD5KmPR450glhr6Qnv7ZJdNfs4YMZXbrDcwDkybzdoOeBy20DUfW8TevnMHReCtE1iO7Koz/fyKgpML0fcgg6jpb2PKpH8L988zBx/7y7GBvdc/NqIDg37WqroojrtYohzWj7hw0jRHWHhWS3kZjNnpXOSB4BlrFU0z6Umd0yaYOWKmJAhD3PuOTZkJ5h2iwTenzubG58zMcq5rGOKaf6tmHrwMjsgLkVMFPdhNGyQkS6Ippxoo/8UTLtRAhbWFc9FxWYZzb056Iuyd21Rpf6MbJGQnjofBibCQWB3R2MIpIYY8lFWSjIY+vbi33rIJ/JS0FiO0srJKKMn9fqTvVp40bTYeLw8c4r/eUO5QLPFkFli/2ywQWZPdUb+1FIEbRX3PMeI87pldIOtgaV/oU0WQ/JxyxISIza0EmV8l0ppLvyat1HEDL3Dp8WZeEWU6qdH+CWbsyeddMz9hWK/LNvQRFM5aTn2selc/zzm1HkWKj26iBtruZCD11cXblfdm0ViLIgCru536hPzTZg9dsrMZ30zAK6jP2s0zGBt2pXONDqmg3Q8d3mn20smmgga8pF9/inKkoPdXWS4NYGBbcGaDIHzSqSCOajlBbdTgq/EeqA83Ft9Uv9cl7eV1oGZzMPAKIC1P3g3l8bZVMgul8i4BKJ9e1LJaYvEej7OXh/237XZ7cA/Hg8+jNwSLivIfXtPqy7YW00+5Fw9PuCYzsm/8WeUXRT4q1foxGepnCW4ck2QzJoi2EvAwmK3mbEKhUeYzj8kaHqf/w//b3/6ieToo3IJIZhBNqmaEICJoPEWzqOoy0VIyQRQ1lGxJ9bKCBM7EjZxpWvlINHFLWKTosqP2TjMMoifbgvaexRu/upukoappWbbC8ieRLbE21wi2wk++EWjGOP7nPStaG9igfUgVUm0Ypoqrhd7yJMu4tsuoGVEapfM9pIP6CGaeZbUs4DbHDzs/KSwC4u02DfjDlWi343INltPHi+nbKPB3VNb7MaJg8MPslFKIztmI+zDEctZN0nOOYPNJaowoXN84sLos9p4g/k/Xak0h0atk+wDpwwd/C0PYjpxRWJbWf1yyAeXFJPzKNi1WwnA7DCapO/5YGy+G555/ga2eWp4HjLJGaq5EDtwByQ5353ggj50Nga+4ibgDpGDZlG2EhCHcpNBdJJ6MNNDCXv4F1+cIg55fyeCu9BkB/Q1rkkm9NCAQTDLYkc4fOe7KUxuO1rXrpwJsM1ma9YkQl7t3HntONdPfozALlr2nPnDrllVUW0chgFm0Pe7m6JbA+JFd8Xv9oLQe9xHNae6sC8jMdCOda2U/iKax4bZlC44M4/kGnOGV52CY7hLcgL2cxJHPmKdjfrtNzTq5Q9Z0QXRVzY73txOC5eaSJyeGSFp1zXu+AkboQQgMae6NRLcmwee+Rc4+Bz49SXMx5a9/RZzfrhgELuXWYJ0tyICd1MjZVR/FFhfB+9kwmLOtNIPIRjyQ8UwjeP/pZlh/KYz2hQmBiDXaLHESt38G7RiGGTOpTvWI8gbR/+d7WB2fGiLuraF/AAEfX/v21gjYqrC7uaoD7XRH5QHqtANAtt7Rq21RnwMFyzq4fOAU5mX6CglHDAc8oVTdbkP3gA3qY+fMRAAF8BKOPgYE31rW1gf+vVAayulfcrF1kVkoqxWKP4rXvLgXXDWzEPx9v4eRTj3wSHtBTwlmEI42qrdF31yr7cwTceROwfGNX/TOPtA2+azF7+QtF1eU10WI5mHRjuq+Q7hiMYSsXEFgXr/i1G4SC4Qgj6EruDQxjJKPjDCP8Pjv+b/ElDU/87I/wnE00rc/ugg+C6im2AH+ZwSF5lEa9s1Gowu6oNAlJnpuBUcGitofi76/PX38e3wgq/KzpHCLVDqO8E6B//Vv3r4BAzxHmYdnV3KcY117Xvmms4/lCNkD9hzP2B4XUFrAgt+wtw7RNjfQXBCESSKJElWzTMsi3gKasJICCEIQGHaRhmeBZ+uK34D8Z/9O+//fob9OazPKRSAl4zUTANg08JufqRZFi8hTOKpiKSRFKK+EwIVpwATVN9mnu4Em8Nbp49s6Ts/sgpYEHLa7h1nceDBZt8YQdaITikoSDKjbOFC6LFy928H4e4vGJXHknSjps2IZ15KU2axKhotyds0ZVgDFZBemVH60Ez0Lp7iM7wNVncw3XfHI44W8BGsuliisHQJZIfzrW7hvZ5QV2kYpI77MwefLq1U8Lhfb7fN9Y+UWamIcjD/dYxPrlL2w00T8w5W2j34rrn4nZDu0GgHHpp7cq8Oli/d6hjnOGy4Cf3wmI1twwhCGfAwJJ1yK2yIizrRvFcQtDJHvKvk3rhAC24qFclY0/N3m4pa2m7QMnwjdhq6clqxFLbO9z+uexM7MkniACgsI6YWDrPg/loHpszgNoLkpOpWaQX293Bscyj3J0zAmcIg3wQEf+mbeRGa8+WY7oHXe4B8Id4jkZrnSM1koS3iRUYb4KM2XM1ItB3sU1k2um5i6TOO+E8iN3ED7vHcXFcOcOU640TLgoTwVY4Vj41ZrnDuZrVjnsmyEbJl3e2rUiQwzNaTVEBDD6i0aEnHmcEJo7M3dXN3R18/ggrDqzdbSckUoycdo3XD9JG4RVlZHzRKPJ0oisTpptuFmwcnooogQDnu9wRtK+YoJyjxStQFsd2YYcXZDWZeAKIaqtYYBnUsOleSbzzk3JCvmqlAs6k02zyfu+KmgAj0wPzdFyXeE6Lwqq67DUWfIA81ea/pynImiXR7QoHhBD/FjX4x6porq42g6LbBIAQqqVbAthaVM8HMMZj6ziBzT++y3E2OB+v/qoI3whFJP7M/cwXtvZtN9e4oFS5CtOatWVPxdalh24LuYpIqF/GYG7Y0rfXzu0L5i/M4iM8FKwQXrqF2oAHYkCrQYjqOcsPcZ5919H9dcWpnwWd+xNwiC0ub9khLNofS+R+wUriF6zJSNrHO4thTGIYQBLAoFJqi9EQvqUhwOogGoMQLAaR/adTz8UQAoNwMHi81pajFIxvQxqit2FKUzCBZasV4meChvPMd2y+SyLfn/XbrkivNy+jGwcTODE7Pjdg9Vzs4Ewsx9y5BOTiitjxOuzSbLOIY9U7hg/HJI9wFDek4u5W7UgmWwwu0ZXbrXeGls6z4Zj6MB42XP9EMf92QEfI2D9h4YogmWrKRT2FjjRI+HGJ4HZvUCVOxhWr7CBN2T1vXpkeH5fuIF6MU1utEouMHppn506QyBIxth4kaqYZGCnszzTArgoKZt+ARYJEH3b0aDcq0htLf1p0SjEJ2e2rW33tfG7QWnsJ98sUmb3R0ufpfNm1BivbgrgMgajZRJzjoycbM+R37jmQRzQOceI5XLXwMGmmII6tYyi+6nA7+mrs0Zqz6fl+3R34h1axgeCWWpIXOBdLiSCgR8MiTWjvMPs8nJVLvKc2Mj/5eElB4n5SYgDYpKeiT/h6QdKmu3OIoh5tQyAUosVgeC+fSmZ2240DVugJP1j1c8zlex8aF6xAKaFz3PLwePbEopTMlSIKsx6GQ9416GTE2dnJFEfvw9hmLpbfq2K8RFfqKuUWoqojjhGRm0dRRV8wuw5JzYv9sJhtR5xIfjBHfRBxNyiX8RiInUmEMZ5unM3xzFr8zNZqgd591pJlXdrQWCAcrnNqLc7RLKTQHzaPDUrQ7aBM/nTyLDmf6vI2TKFNE8ipnoqDJJpctuGwHCviYwjHNKoh8Nm0o9PuKMkKeodnF8nkx05Xf4h6LneZX+q33wwaIEiylcqpgKmu0nw8BP4GQAOC6cLPGgICYmOW627ZdzhJ4WkTPM/Lz7uoW0PUlxHjy0mq4eE11xSI6lP3zAqAwsNvhNwva8BbVWgFTo3Ly1VFV/f8x1p2GIj+Oj9LwAGux71K8VDtB4DFv/TmL7+qWdBWkvLWBcSva9++yzW92qpfdoTF+JJnB7H7lav6tYTu5zHCFRV+47LgWzg0PxQVNEk82F+4kiXp2heAbJjqr1EhImAMpmloC0chusVwItmGMIxskRSBYhyBMxImP8o3/fIf/WTF1wQZUiRJ4YBPIMgWXZNedJRiWwiGYyhFcZKIPldnHZD2nuVAwJNxTzw9sH3S7h4cBSXKleGUpN6UmnlgISQORpdpaMtegpN8enh4hcuUYttFy8XCSLsYRBPnfUsfKyc60QFLGc9pUqTjrZ52J4ng2A3knttYM3EvcQ9OEZBw2dKea3QqIV2udBYdT3hziRbaoBbzOGNohM1nma/BSkRDZ/7GVMcN1rB0LqbPS83kOkxh2HnPHpJ8RK3mAMIiKbHy2WE6bs+xjp+chIXaU33jnev9VXs27uRSpLOXWkx4uEqPT6QazeMVm8mn1/hxYihyI2GzUa+xl6umiNg1/EmwstOAFPR5Q3YhZ85jXIskZJ9wlo4qA6YEuhCoZkgE2tFI/xg5HsaruwAdLUS2QoM4NVy4d8fhHCHZjm8SyUZTtx8bhCAuPj8NguQnrLibTEMe7w+U3O2dy+iRDmKTYM1qWbR7yk7F7oxrJ37jJm3d7RqJdvZIJ40XnBq4eDg2qaNkVwaF8xnvFEetJ7GiqZ18RIyNlWo6WMJHnKbZtj+R3TFNDQu8O1zYeSf6Il1D2mT3Cb9k16vL3FF67s2mm3a4ix/B6vOgw5Ht0n15m2nfZGCHY0UjEEx9lsruPvYlYXkHs70Ggr5XdNIlYC246AuGo4SfeshiSi1axGyk9/bmNFwu8o6M49049URMG2f95lxgzIbnGnwBmcuI2IE5kbYT7w53l3US0mvxfOSPPHbpvi+9WBxctRkMRPxvq1rAVxqhiUENEOOloweW1rAu+k9VdBZ1ieGgvCABp+Lf4d5hJyL9jFwNitDjLf1ZO3jQhW9rzYoGmsgjvs08NURCfEAeAu4Cr4VugHZUAGUfq8Y6wAWAHtUjsFfHc7MKyrVoOwaIwc8BF4PnrO7n/PLDPAdXU6h91zTFuEbs8Z3ixrvmHOjtQbfVt/zj+r3adH48bvwBOCR/Rmn078mfLItOQziJKJTYkiFObzECJ7YUkaFbNKMoOokwCoGRD9HizZ9L/+zHocUnZ/fta7cvucfv+6WS16hvbyDKty9V+3VO10JDq0rr9La+Ae/qRPA//+wSkD8Gh74c9kcXnVsyr/C2/gmGBoVwmBCAK0UQDrAYS8h3W21JhkdwDNMhgXyowvVR7cfnbPWhcRphCAlt0xAiAGtLwbubxdkWSRCcRBCIij7b88ThS/+QnTe+c6gu4xxvgjmDMFJj9M1EHOyH+LgRF1T3BXJg573cEJzLz1S2XIXkEW+qZIcDfEPvSixUunN+3lB/PlrkhvNOt4zw8UeoLvce0PK+7Y4VKVuQdyeerXqd7soN7YITwRn4nQbx1A36QZHbsKEnO+TO1/MSGpDWVOHd1257CwB6aaBlrWDCc2EwDbAf9chvCDWt4VrFSTabNqrg5IfUdNtMTKpKfxbJEYM33VWs1HuRP8rjud2IHABzmCxhk5rEJhgTk3ANG5PmTeFe6wo58m1N43VcIf1+gedqZ4rH2DtMbmzdspaisaNU74hBKBOZHLqYhfigshLkjnQ8ndEpfo/pgSVHWOOl7NbHkHn18WEizjsHu2FxZ+7D9Aa3AGp5qbuwA8byvsrL7f1813E1elYbMWOzMWTacM7Ntjhe5Dt+wDZyWzcWoEamm11M6/YISIRXGGVkBTFVkEsY2AXDE7MrBgqto0ZyV6axlPcNy7S7Po/nPu5OESvEWH3pu/PIk5WVG8bFdx2O5KJQH4hzK8R+QHlV44ZX5yhTyZj5J+Zs8sfzIUihPZnYfekqNRFRTWNOBlnc6AclXLHpSR4u9InaeHSX2IjQnQyfKtmMEUcTM3ryaE2eQ1W8AEjoLMopLELtjp3VC3Gqi3t3Ma6d+NxXrH7fu5o9LDdnikr9vFn6/VF1ZHG3uTSHa/d9az+0pQLMzXnqnAR/c9E5wCDAZDRPK4K1eWdZMUZ9+GWMrQxF5QzYXwCz8aTHd2gAX+2DO0Ue9bNmbT7i42pZYWrjP14ZuVJ9qNy6/lhrPrQasFZELbVm3R7VV2ct2wDMLp4Bs0MAHi+BZyB+YyCqB5gst4r1f03r+J9j7cdvv7J+epYVcRHWb5s0AX9eh25akfVF89JbOrRh/aJ+4/167Ybbq+WJA5CfrmCzDrAP27dR+nbMu7lds1uXbkUlwBTB5eJ07YkKX8LBh/B6fb5Vw7F6jQH44/AEp62KWu9vYXVEIaN7USfgDj4z2fiH4NDrNn8Mkn2bwcrvWQf99MXJWdNaFv8O9f5VjgFv+seQF1FZSmJ0sqUQAtliMR1uozhLX4WPGZKiMJ3GH0De47/8y/yT6ccfVe5IwSkKcG+L02AtgxIoDuhnEm0hNArpFE0BKQ4/E/LirGjZ43K6n91bOvFXOdrkcA2fhwxxzbYLw9l+thXZdnvcty8UdKTyjDuf3bo952e39Di/hJMDoIbHQhegZyMoTpU9oH4QGHdiUYoKoIONeIRrDcJ4xVMGYlG+3bm5oJjP8bk/Gw+tjrKY45JOrGBjtq3erabi5Nxct+uLEZ+oJybWZw8iW/wRT20gs3yNWBkzurOKGnEcWuTp0GIPEenpJDBHjOKEYjqX1M2uTZ4NorYmxzFl7HvNFPl+f8zD1pSvTWngg+RAF/6MDFJXqCXKDG2qFuRIbGw1cpNN/xjPjbeDmw0qNRv+INF7auChE8xDisAbFMTrG9uR7x5REk0w5ZZy1STslNJBz455LsZlF04xwQqGRQUVwof7jRCMByQ6TftUJzfTglTtzkrjDjVkAqMCpD2bYi3dByNvOZ2sKUeRyRNmiCemaE986kGCWh0Rwi5PjlPe9JgXHuOGUZdTPS74PKiHuucE22S5YkMrAVfJj36we5Q7Ftci4mR4oeWMzilY9Ttr9GOZzPzM6U5Br9E29gjnE3xTkTI6y0RrYmiQVHn/ZC4oczW1UcfEnSRTl85hpMBUlaowzBO+tPYu4KOKvYgUG+86DxldX22J20m8t3e7y6OLjC1IbN2rRStPFZ/JEXMIiq5uVNybQrmJspmg3eBZSvMTHWo2xvehFGDQk6QfF+l+nc8P3XiM8fcqmgfUc/FX0clZs2PsW3p/K61caaeBrjRLtSVIA+EfhHtslX/XlrUHi5k1Lq++I7u1t2qa9z38uva1/pxh79UAsCQ5gLyHZjuAfgK44y7zC/obB3tlswAFVRfpqXpuHZR5oy0qWAIAurqs/WcS7q/ZreWV9Xrq9uXxQzJb70opTis+gUD9tmia+6tIPbyERTve3lOlN38ETnrZf61OXsXwZWU8+pK4Xzc1f107H++HohkB15HGej3tV+/VI9+GL2sW6M9XbzGAK+R7EjasvOy2blOu10vD5PMQaiWx6w3+aBIrSOanMIdGI5IOkS1BrlYrKZyuUg/pNkrTGIeREKLQD7c8/+r/+Z//r5+stzeEYiKJiGTNi4E/IowEhA9DtxRJESSBRTSefG5RY3I77C0p8qanHiVL+qTx6DDVPD71yOw1mn3aNYkYyMEGjZ2ZkcVzJWfQtS93zwgqH3OwHCgQG7Hh/lCR6HAou72jkWyrXcnWEXePAddViW/jIBemQb/kJ/EoEoOkt7ZxyBQbwk54kUaduusUqzG1zYVMark81AKGePhhj0knCcmQ7FTfvAmZ60fDxbPX7xL9dqfP6HwTzZQQ8OSimdpy3FFw2cH43nOUWIbQ5oDQONvK+3u3bBBs55tVmbNR3HgsuTwXopQZ+8wT94l3JegZ1LZXl/11JJoMZi2YkK1sTs8t6vA7K/cD3SprejgPHnzI5cPMQNTzkM27xUoSyTr7pHpa9IxMJbtcDhGxIeynt4g+XLWbYSzwJqFvo2zENxZvURx58Cen5zmTvldkP/K06Ypg5YlfMT5pbnQtUXHlZ+Ijy2rqzD6xBzYGnYyo/cRd0AJuq3lf7nIMROxmuj2ydNPmURC34ua2qZtYyRxTpbqHRmXIUb7g+zI+TWCFiC0al1DE0evasCweB6yi2PO9PXg1WqY5OlBo5rSljrVc6rtHpAtPd38grB0CO6ceOhzgsqCy/b6+GdTxvMS+MffXK+1rsAC+dSlAfMCHdGZDdt0uH3IW98arvNiidtYPyDAh0imkz7Zi8BAeAOjztL1LDvZ8zvddiBLUoJAZyzBnWlPiW99s5vns3QY7J7jAmBLIFZ3vZ1gM4inzVF9Uy3h+m/qRvzCAejCYaqvrlh+0UhF9tSBZhEYVJXiNt7qdNNq3b3kqplM7lkCB5zHPn3ejlrF6l+EaBzDmVdQZ1JpnFtqqhrRSKdEH9wheu71qSkhzYDMLwCUE4G4ReM6qeDQDbEZ87wjoGKBsiPoIOP97N2r9pkhxug+HtpgAS1pZzMcixf/Oq4gS8JtvFCZea/c28P/+X/zjFaair1dpfCVP/BefkieONsRHTmLfQ6P48zYDf+Pl/iCd4i8VKBhTk1xG+UJlLPk3NPpCLM0yFErWdmJqixFUtAWYlW2hGEczNKRpNMU/QKn/5H/97/7T//onU0VCMIqOsbVcBAHMCCLQbUSk6TZOQihJV8EkKP5MlKoPvOugxu1hJdbt5Pk384lclWO0maSEB9z/uRFDTcRcZHe0IN+/7vnTHGYFF9n16Di+hKT6sVKqEoc5GXKkMOUoNQw75/4YWfH8NBV6jwvuhjoit/x+Kq2aiNR5x8VxuVPjOyw9l8BvLnBc82fpbHQYlxtHwfT2RsgcwnS34wmskncxIekeJi/MwCrTpcQEbiw2LGLjvS4lsuKQOwTtuXiRFahH3Tmz+51eb4QEW5TJrHkiuzQW7smhdw8ZWJPBSjxzH5vKqgZuObv8TMSLTi3sidUdUTbacTyRG2sqyHQKSmp6TkujnGM1OphgnPhgBRxbOEeMOcsV/7DcE0tqBVK2gkJIqsw22L1Pyrrt6UVQ5rNRzgoeGpjqQFVzivMQh5OMXaTqNPb7iEyg7KikaN+YMRrt7t2BZbQIRU+WONFY6CgcdEZAmB8Z+MkIuwkpTIo87zcuUnfIseAx5Fbu7s+Qi8kOSnWXHZqkMjLI0ZniAfNSjGPe0p/kJmwqVfIMcpNE4ukZU32ed4fwWDctceUHCTPoa+9OqKfSJ2NhH+olhvFDlQwYTEKHiQra3rPp/JwwNHkXzq2C7eh4RzK7eYEi38ylvhiUx30XXi/LLDyfZ2T0muyEE6F0P8+IseGaE3bNefCZLUVHdiICFoZiqvf0gzmS7XAYpREhKLSz/PJ8LIRJvYt0mi18p2pjTtXtRv1+m4HzWo6hrv0VtgHp38KMdM6HtbIutOUCr2pBuuigun2s/eZYgkiOqOLLvWTWvr2E47Q6T/oe9LNmRb5noOsmoL9cnoF4zHXPh307AegTVFojFP7Cr6odeADYj/qyKnCeAKWQoATncm4DEB9RvdWdMslX2f5V1+/Xbdb/XBvBfmhLMvRNLclCODQvOgV+tvNV4H5o199fPpkAq9T7mA8dYGhcOoJA+jo1fOUFIzEckrT97EzWH63UCtzFZ6QI/0BgzE+LJxFRAtEwmmyzEIa2GITQ2yiKqW0W02RKogC8PhJP+qt/+r/89U+2qUdDq2QfjQOCtZqHUUiyjVAEsLwMiugUJVIa+dzqw9Niosy5e2zmk6PG4u3mLlZP39OOLYf9wT8DNLC0Ga3hPILFyuncI9yy0j6tGGG+JPvocaTzpb5QqdJWI58ZgPl5ln6QIWpICXwvjR53GQ7yuahEZdoPR7bHThdzmZIKB6uC2+lqPe1JH5W0oCzTjm7js3ISsd952lUO8fnCD9RinVTpkt8P13yPPuGTh8AYvBO5mGuu1UVRph06Rr1McPUInS7F7QRWTACX2JBIE/RwJFPW3LCHW3pK7hS1mGOjpBzXEf6yUfLpSRQpJk+ng4vQcmegppb42jM87m7RsNElgNkPNH00F1aqL9VmA3DJpI6l+dg0V+aAtUjCtgCWpKf2sMRSS7LKxG1+HMylADHMouPOrMv0OQ3nWiM4n3btopJU8WIcL6oXEk+BKyFFuCViG4RP+uzWkqKiEW0hWQYltOfslpOvkBPSw7zKCkIaKGcPkgLq7Mt+MRwEgI9GsydhW/TvKJrZ99MuHu/lrs3cvAv6zYaEy2R2yr2hw/BM3HjzaqKXXYwI4ck+YDojO6mT3eLDTk3LMxO3AnkdmaMVH68qcgtUhIV3yHm/i4Ryd9iRqU7tmEBTBx2DN9KMYL3Y4timWFCzes5NVJTD8VHjRtmUpXy/n09obFyRS1hfd0Kqs5v90419fGRGrkoecCNNTzQ77LhHYT6OZA4m33YMnTmOp957ZkayiaIRafb7noSgaPx+gn7v8liL81Dt6vEt4kn/ghknr0J9Eqx6bg7gql7rZl4CfQDSglUAqZRQnWMAYTqWAYB81T4WmuhA6iIhANZxlfMfANYBsVrlZFUUwBwgserfiJvM31l9lUnrBljT5Z1AbbwhwfEVtey13Wzd1YvXSJsO79JPK29ruuiV26qKun4pz65oNndDu8LPilbiWq3+3kjmr95+Ofw66K/HSAoQXV5X794h4PurrEP86atW5vXr65bQX+E0+SsYIl/CuV/zniG/PvxnQd8v1kL7uuuStyJ47NeOsu+NfOBotD71iwt4rHMyviH+D/R9EzWr6Dr3hQgee5O37K+YHImEGIFGW5ICdA5LU2xL03i2RdNVJArGySQKP4RDoz78yKKZj+EwxWIIypK1uy+Dt2iU0Fs6IqBtmhBIQgAmmVHZ51o7Tz5rENdshA9dCqcBWGmyIaXg/nXCZ6efTbs6YlNvTHTE82jMZZ3fUV0OnZ0gmYvLqfTuu+xQ2+KI7Dbj0by2GNw9eM8meqx0dlVS98jjQShIg19qrZ5RlpLZ4Hy9XcVAUYQaTKeckt211haFVmOAdDcGKyvXHtkIXcReAk9eqsPRs3a4I1+YPnRvyn7TN4r1uM2SwZYlpk20iA9deijcvZGmbId7KT4+7kXYyMM94DQUJ+gjVeE+AkKGl/VXJXtigcmSUwQdSFvDA2SvlIEJe2xTOj1e6XU6b7zbvT75SfK0443DT0s2hP1p4RxhOmkodnnyGa0rTQWxcSMuXkbkJcRWUDTkiD9RT+lpbFy0y/bSefO8+iKpNSUL60KtB7to2pi+QfrCHZXa5l4n461GyqtiYiF59UoSuUmLWT/ud3mMCteUIamkCc+RB+QM7a4FZYt3voSuyXNH9Bfewe9K0S645HocMbOXY48eupFIFpOqiP14Ps7FvWwxB3bswlXdtGcfz2axladjtReaKxT8WIYdT52OcgE9NgkmNXpTCDhx14Tr7GpW7/TeHZ2QZnYcrkIHvL5hakDgp5wZoZzcTDd2dvQMWWaEOF0S2VNEt+Vm/3qA9ucFb3fL5TCcjiHmbbyMTw3ZHqFIPiisUnTGsTVPAGcF86HQguAUQX/dePHRpfsaP50QLCyswt7pRF79kGL88rJonI+pz29mcqoorYrsMIDA1TxsNWQDjI5ttEYrArsG8OE8/MZBv0PSo/cb4ZkcavznDYfqQ+cA/DcABpGXOVrjL3nulzz60gMu3XJtJleXVb7jZeMMBav277I2YjuIury62QCDuyC6ty4d+EXnvr+G4O+8+f0Vwr6uRfsOhPyVil27W3jr3gJK86q6zAC7eVf29wKjcFVff/OVzOCcgui+eid/Wa//UhlcIenPXxyMErrhAhAPELoVsk7vBn+VVIbZ+6GouWhXmcLXGSKghbcvz/PC4fP42QpS78f6iaszfvek24ytfyG/7J5fwPX+yMfVnhGEIREKb8kMibYYkoZbKozILYSkJI7jaExC2AfANfzT/+GLnyxRhkAIDqEotI3wKN6idAx4ZIyjWwTBYBhgWUZGn6tFxREcrVFox0CaYW0YhZL7g8QfFTgT9s4mhtc2rYIGU1sjGMdYnXmaZPQ8wmx/zTjxMDfnDl7gWLvCxX4fA2g4lInZQzh8cSwBtireW+xAnIqCMgaqmW7k7TpkRwmFx+aoGKlTigEIPVOMQixhkt5iRZMEEyfDk5qDej6I6SmoJmz/mC2ujKwA2c34c1d3C1tAGpvqEJ8hajvj0Wl8RD1uYjFd0AQylSW1o+vWDcfZSocNEiy4aqaaMwnmzmP1AdH5c0fX3Nzc+D26ewC+QUfuPgkFszszcN6xdEre9HbJ4MItmf5wdh1sP9AwfUs22PnMeEc+0FnxwNxKaJ4TGDoUG+fQ9uoxumTXpr8gXI1yrsHum6d/acl60DoEa3R9F5gtQQyGhJenLLnfqLY8wUFQICeuivxTrd81q/LOO7By8PoOGvfxjdxw7eFAz5unORv3qDVhi6aLzY7S1U3rDUfdb4M8h9j+ftiEGOMZFicNtDnSiABlVzQbFgv19zD/9KL+fkoCG1ZdSQyxvoGz3ZN59pOdbww8ncudWW7Gw9CQUkLSBA7+3B3zu1E/zc0C+Ue03lNGwo8oMTwDFcLPYnxX1CmZO0PVWdY5IBC8w7pRJvS8nYozBziDnddD7RJKSJkRp58vxNHmBDlCcyVr6WfF0QcakZzJp8mG9VrIhDaVYxyMDof2ES/urBFHDv3+KFy+pv7xf39Louz5UvLgDBB8v7U3ANVFwNdss9Q9YwkAZ/FXYfKVxy1a7i9BrYs85i/G8zuAi42apI5EwQAPPEa7n/dWZMnAq+qH9irACHLfXs2ghQYAPbQWpGjL2kkXYxriP9biFHXxYb/hAZiZuYbwiNq4+VrkAfgd4HLGrNoGpv8NbEX+/pt/Y62Cv7dpPAA0+lCYCn2PYt9M6/76n+Dg2UW89iqs1iKA5r39DYr3ZRtbGMfpOHbDc013kWuarvugt+3vf21T9O07NHrtVV7eEUMUEMP//L9dr4N+4n4/wRP//sc8cYXaf1sNH2+xd+eMfwmu+4sPmCNMka9iy19zRnSDgiu//cRVv7Pv4o9fs1LzJ2n/FUp/Cc2/+27y0qjrqk9g8m+9+Z3xywEBX/y9S5HdVg/SuA6LZk3SvQPd3zYdjWd1Xf7KgztJUhhOE0AOQ2SLQS8lFirbQliI4lgYYikN/603vzus79t77vnmzX//Cax988sPsBZ8ctI2XlnzKmTzPbos/var65G537omvBVxWNfPt8na9pC+Ha9pDJYW8avpcQTLpzf/Cjj1WsTV/fq+oeXDVGvctVlxAXD7XqyFAFOr8CKvcQxY+3w0v38Kzjilw9i1Yf2WezVbDG9JCII+Mdm//eYX1/enfpG8O/UL6M2/9usWC5WxbN784sArKv8VIY9CFIZjDN+m8bs+i3gbxgm6hSkoRuGYphAarCt+eeJNS9cY5QvuNZr5BbO3JZf/rU9dFHvzdwNdZSX+C0tXOAlcc3/gLfukMDb/22/+6KPzYfjNH72/y9889eOh0Td/8sHQX76cTwwLvflDyzm9zmFc/wvwAbOtTw2KvPnTDycJvCUiWBN+8nT4zZ98ePo3Dk2B+f/aLXz7iyPf/OLrJ3/5yj4+kXjzxx/MwjfeAP7mlx+c+tVLewnufPTGrp+uT41Ev/njr9/dl8N8sOb9z/7P3zr/h5/owfkX6nv4wyYWevP7v/70f/DlRNIoQcmY2sIkjW8x8MXcRnCWguX/mpjAASGhqG/5cn783lz+4W++Nz+3//5fPTwo9bo4AwA=' + }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberInventoriesBagsTalisman); + expectTypeOf(data).toEqualTypeOf(); + expect(data.base64).toBeDefined(); + expectTypeOf(data.base64).toEqualTypeOf(); + expect(data.decodeData).toBeDefined(); + expectTypeOf(data.decodeData).toEqualTypeOf<() => Promise>(); + expect(data.decodeData()).toBeDefined(); + expectTypeOf(data.decodeData()).toEqualTypeOf>(); +}); diff --git a/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalisman.ts b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalisman.ts new file mode 100644 index 000000000..7df1f6a18 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalisman.ts @@ -0,0 +1,13 @@ +import SkyBlockMemberInventoriesBagsTalismanDecoded from './SkyBlockMemberInventoriesBagsTalismanDecoded.js'; +import SkyBlockMemberInventoriesBaseInventory from '../SkyBlockMemberInventoriesBaseInventory.js'; +import { decode } from '../../../../../Utils/SkyBlockUtils.js'; + +class SkyBlockMemberInventoriesBagsTalisman extends SkyBlockMemberInventoriesBaseInventory { + override async decodeData(): Promise { + if (this.base64 === undefined) return null; + const decoded = await decode(this.base64); + return new SkyBlockMemberInventoriesBagsTalismanDecoded(decoded); + } +} + +export default SkyBlockMemberInventoriesBagsTalisman; diff --git a/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalismanDecoded.test.ts b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalismanDecoded.test.ts new file mode 100644 index 000000000..d6fb3ee32 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalismanDecoded.test.ts @@ -0,0 +1,40 @@ +import SkyBlockMemberInventoriesBagsTalismanDecoded from './SkyBlockMemberInventoriesBagsTalismanDecoded.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberInventoriesBagsTalismanDecoded', () => { + /* eslint-disable camelcase */ + const data = new SkyBlockMemberInventoriesBagsTalismanDecoded([ + { + id: 397, + Count: 1, + tag: { + HideFlags: 254, + display: { + Lore: [ + '§7Costs §31⸎ Soulflow §7per 5s in combat:', + '§3⁍ §7Gain §c+20⫽ Ferocity', + '', + '§7Enabled: §cOff', + '§eRight-click to toggle!', + '', + '§a§l§ka§r §a§lUNCOMMON ACCESSORY §a§l§ka' + ], + Name: '§aHandy Blood Chalice' + }, + ExtraAttributes: { + rarity_upgrades: 1, + id: 'HANDY_BLOOD_CHALICE', + uuid: 'dbb97f4b-9dd8-45fc-aca5-ff87d4ce3b2f', + timestamp: [386, -1213683552] + } + }, + Damage: 3 + } + ]); + /* eslint-enable camelcase */ + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberInventoriesBagsTalismanDecoded); + expectTypeOf(data).toEqualTypeOf(); + expect(data.magicalPower).toBeDefined(); + expectTypeOf(data.magicalPower).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalismanDecoded.ts b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalismanDecoded.ts new file mode 100644 index 000000000..aafc64315 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalismanDecoded.ts @@ -0,0 +1,25 @@ +import SkyBlockMemberInventoriesInventoryDecoded from '../Inventory/SkyBlockMemberInventoriesInventoryDecoded.js'; +import { magicalPowerValues } from '../../../../../Utils/Constants.js'; +import type { Rarity } from '../../../../../Types/SkyBlock.js'; + +class SkyBlockMemberInventoriesBagsTalismanDecoded extends SkyBlockMemberInventoriesInventoryDecoded { + magicalPower: number; + constructor(data: any[]) { + super(data); + this.magicalPower = this.getMagicalPower(); + } + + private getMagicalPowerItem(rarity: Rarity, id: string = 'UNKNOWN') { + if ('HEGEMONY_ARTIFACT' === id) return 2 * (magicalPowerValues?.[rarity] || 0); + if ('RIFT_PRISM' === id) return 11; + return magicalPowerValues?.[rarity] || 0; + } + + private getMagicalPower() { + let magicalPower = 0; + this.items.forEach((item) => (magicalPower += this.getMagicalPowerItem(item.rarity, item.id))); + return magicalPower; + } +} + +export default SkyBlockMemberInventoriesBagsTalismanDecoded; diff --git a/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipment.test.ts b/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipment.test.ts new file mode 100644 index 000000000..e32bd56f0 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipment.test.ts @@ -0,0 +1,19 @@ +import SkyBlockMemberInventoriesEquipment from './SkyBlockMemberInventoriesEquipment.js'; +import SkyBlockMemberInventoriesEquipmentDecoded from './SkyBlockMemberInventoriesEquipmentDecoded.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberInventoriesEquipment', () => { + const data = new SkyBlockMemberInventoriesEquipment({ + // eslint-disable-next-line max-len + data: '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' + }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberInventoriesEquipment); + expectTypeOf(data).toEqualTypeOf(); + expect(data.base64).toBeDefined(); + expectTypeOf(data.base64).toEqualTypeOf(); + expect(data.decodeData).toBeDefined(); + expectTypeOf(data.decodeData).toEqualTypeOf<() => Promise>(); + expect(data.decodeData()).toBeDefined(); + expectTypeOf(data.decodeData()).toEqualTypeOf>(); +}); diff --git a/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipment.ts b/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipment.ts new file mode 100644 index 000000000..5b128ac1d --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipment.ts @@ -0,0 +1,13 @@ +import SkyBlockMemberInventoriesBaseInventory from '../SkyBlockMemberInventoriesBaseInventory.js'; +import SkyBlockMemberInventoriesEquipmentDecoded from './SkyBlockMemberInventoriesEquipmentDecoded.js'; +import { decode } from '../../../../../Utils/SkyBlockUtils.js'; + +class SkyBlockMemberInventoriesEquipment extends SkyBlockMemberInventoriesBaseInventory { + override async decodeData(): Promise { + if (this.base64 === undefined) return null; + const decoded = await decode(this.base64); + return new SkyBlockMemberInventoriesEquipmentDecoded(decoded); + } +} + +export default SkyBlockMemberInventoriesEquipment; diff --git a/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipmentDecoded.test.ts b/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipmentDecoded.test.ts new file mode 100644 index 000000000..6c0644d06 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipmentDecoded.test.ts @@ -0,0 +1,179 @@ +import SkyBlockInventoryItem from '../../../Inventory/SkyBlockInventoryItem.js'; +import SkyBlockMemberInventoriesEquipmentDecoded from './SkyBlockMemberInventoriesEquipmentDecoded.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberInventoriesEquipmentDecoded', () => { + /* eslint-disable camelcase */ + const data = new SkyBlockMemberInventoriesEquipmentDecoded([ + { + id: 397, + Count: 1, + tag: { + ench: [], + HideFlags: 254, + display: { + Lore: [ + '§7Strength: §c+20', + '§7Crit Chance: §c+2% §9(+2%)', + '§7Crit Damage: §c+4% §9(+4%)', + '§7Health: §a+30', + '§7Defense: §a+20', + '§7Vitality: §a+4', + '', + '§9Quantum V', + '§7Grants §4+4♨ Vitality §7on weekdays and', + '§7§3+2☯ §7of a random §3Wisdom §7stat on', + '§7weekends.', + '', + '§bDominance IX', + '§7Gain §c+13.5% §7damage when at full', + '§7health.', + '§bMana Pool VIII', + '§7Grants §b+160✎ Intelligence§7.', + '', + '§8Tiered Bonus: Molten Core (1/4)', + '§7Gain §a5% §7damage resistance while', + '§7fighting §6Kuudra§7.', + '', + '§6§l§ka§r §6§lLEGENDARY NECKLACE §6§l§ka' + ], + Name: '§6Menacing Molten Necklace' + }, + ExtraAttributes: { + rarity_upgrades: 1, + modifier: 'menacing', + attributes: { dominance: 9, mana_pool: 8 }, + id: 'MOLTEN_NECKLACE', + boss_tier: 2, + enchantments: { quantum: 5 }, + uuid: 'c17f0a31-21ed-4a3c-9501-792fa2d67543', + timestamp: [389, 817821856] + } + }, + Damage: 3 + }, + { + id: 397, + Count: 1, + tag: { + ench: [], + HideFlags: 254, + display: { + Lore: [ + '§7Strength: §c+164', + '§7Crit Chance: §c+3.62% §9(+2%)', + '§7Crit Damage: §c+32.8% §9(+5%)', + '§7Health: §a+124.64', + '§7Speed: §a+32.8', + '§7True Defense: §a+3.62', + '', + '§9Cayenne V§9, §9Prosperity V', + '', + '§7On teleport: Your next melee hit', + '§7within §a5s §7deals §c10% §7more damage.', + '', + '§d§l§ka§r §d§lMYTHIC DUNGEON CLOAK §d§l§ka' + ], + Name: '§d⚚ Menacing Shadow Assassin Cloak §6✪✪✪✪✪§c➎' + }, + ExtraAttributes: { + rarity_upgrades: 1, + modifier: 'menacing', + upgrade_level: 10, + id: 'STARRED_SHADOW_ASSASSIN_CLOAK', + enchantments: { prosperity: 5, cayenne: 5 }, + uuid: '019f544f-d5cc-45cd-9e01-a3074d3bf7d7', + timestamp: [394, -1973901920] + } + }, + Damage: 3 + }, + { + id: 397, + Count: 1, + tag: { + HideFlags: 254, + display: { + Lore: [ + '§7Crit Chance: §c+2% §9(+2%)', + '§7Crit Damage: §c+4% §9(+4%)', + '§7Defense: §a+70', + '', + '§bDominance VIII', + '§7Gain §c+12% §7damage when at full health.', + '§bMana Pool VII', + '§7Grants §b+140✎ Intelligence§7.', + '', + '§6Ability: Consolidated ', + '§7§7Increases all explosion damage dealt by §a25%§7.', + '', + '§6§l§ka§r §6§lLEGENDARY BELT §6§l§ka' + ], + Name: '§6Menacing Implosion Belt' + }, + ExtraAttributes: { + rarity_upgrades: 1, + modifier: 'menacing', + attributes: { dominance: 8, mana_pool: 7 }, + id: 'IMPLOSION_BELT', + uuid: 'd485698e-9f43-4147-8569-02a5c81c5dd9', + timestamp: [394, -1847901920] + } + }, + Damage: 3 + }, + { + id: 397, + Count: 1, + tag: { + HideFlags: 254, + display: { + Lore: [ + '§7Strength: §c+15', + '§7Crit Chance: §c+2% §9(+2%)', + '§7Crit Damage: §c+4% §9(+4%)', + '§7Health: §a+20', + '§7Defense: §a+10', + '', + '§bDominance VIII', + '§7Gain §c+12% §7damage when at full health.', + '§bMana Pool VII', + '§7Grants §b+140✎ Intelligence§7.', + '', + '§6Ability: Contaminate', + '§7Killing an enemy causes an explosion', + '§7dealing §a10% §7of their total §c❤ Health', + '§c§7as damage to all enemies within §a2', + '§ablocks§7. Enemies in the blast radius', + '§7will also be §6contaminated §7causing', + '§7them to explode on death.', + '', + '§6§l§ka§r §6§lLEGENDARY GLOVES §6§l§ka' + ], + Name: '§6Menacing Gauntlet of Contagion' + }, + ExtraAttributes: { + rarity_upgrades: 1, + modifier: 'menacing', + attributes: { dominance: 8, mana_pool: 7 }, + id: 'GAUNTLET_OF_CONTAGION', + uuid: 'd588304d-b0da-4fb8-bb07-0284b302ee13', + timestamp: [394, -600921920] + } + }, + Damage: 3 + } + ]); + /* eslint-enable camelcase */ + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberInventoriesEquipmentDecoded); + expectTypeOf(data).toEqualTypeOf(); + expect(data.gauntlet).toBeDefined(); + expectTypeOf(data.gauntlet).toEqualTypeOf(); + expect(data.belt).toBeDefined(); + expectTypeOf(data.belt).toEqualTypeOf(); + expect(data.cloak).toBeDefined(); + expectTypeOf(data.cloak).toEqualTypeOf(); + expect(data.necklace).toBeDefined(); + expectTypeOf(data.necklace).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipmentDecoded.ts b/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipmentDecoded.ts new file mode 100644 index 000000000..9c36bc841 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipmentDecoded.ts @@ -0,0 +1,16 @@ +import SkyBlockInventoryItem from '../../../Inventory/SkyBlockInventoryItem.js'; + +class SkyBlockMemberInventoriesEquipmentDecoded { + gauntlet: SkyBlockInventoryItem | null; + belt: SkyBlockInventoryItem | null; + cloak: SkyBlockInventoryItem | null; + necklace: SkyBlockInventoryItem | null; + constructor(data: any[]) { + this.gauntlet = data[3]?.id ? new SkyBlockInventoryItem(data[3]) : null; + this.belt = data[2]?.id ? new SkyBlockInventoryItem(data[2]) : null; + this.cloak = data[1]?.id ? new SkyBlockInventoryItem(data[1]) : null; + this.necklace = data[0]?.id ? new SkyBlockInventoryItem(data[0]) : null; + } +} + +export default SkyBlockMemberInventoriesEquipmentDecoded; diff --git a/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventory.test.ts b/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventory.test.ts new file mode 100644 index 000000000..24ded2a1e --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventory.test.ts @@ -0,0 +1,19 @@ +import SkyBlockMemberInventoriesInventory from './SkyBlockMemberInventoriesInventory.js'; +import SkyBlockMemberInventoriesInventoryDecoded from './SkyBlockMemberInventoriesInventoryDecoded.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberInventoriesInventory', () => { + const data = new SkyBlockMemberInventoriesInventory({ + // eslint-disable-next-line max-len + data: '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' + }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberInventoriesInventory); + expectTypeOf(data).toEqualTypeOf(); + expect(data.base64).toBeDefined(); + expectTypeOf(data.base64).toEqualTypeOf(); + expect(data.decodeData).toBeDefined(); + expectTypeOf(data.decodeData).toEqualTypeOf<() => Promise>(); + expect(data.decodeData()).toBeDefined(); + expectTypeOf(data.decodeData()).toEqualTypeOf>(); +}); diff --git a/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventory.ts b/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventory.ts new file mode 100644 index 000000000..6a3b217dd --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventory.ts @@ -0,0 +1,13 @@ +import SkyBlockMemberInventoriesBaseInventory from '../SkyBlockMemberInventoriesBaseInventory.js'; +import SkyBlockMemberInventoriesInventoryDecoded from './SkyBlockMemberInventoriesInventoryDecoded.js'; +import { decode } from '../../../../../Utils/SkyBlockUtils.js'; + +class SkyBlockMemberInventoriesInventory extends SkyBlockMemberInventoriesBaseInventory { + override async decodeData(): Promise { + if (this.base64 === undefined) return null; + const decoded = await decode(this.base64); + return new SkyBlockMemberInventoriesInventoryDecoded(decoded); + } +} + +export default SkyBlockMemberInventoriesInventory; diff --git a/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventoryDecoded.test.ts b/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventoryDecoded.test.ts new file mode 100644 index 000000000..3eedd9540 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventoryDecoded.test.ts @@ -0,0 +1,87 @@ +import SkyBlockInventoryItem from '../../../Inventory/SkyBlockInventoryItem.js'; +import SkyBlockMemberInventoriesInventoryDecoded from './SkyBlockMemberInventoriesInventoryDecoded.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberInventoriesInventoryDecoded', () => { + /* eslint-disable camelcase */ + const data = new SkyBlockMemberInventoriesInventoryDecoded([ + { + id: 272, + Count: 1, + tag: { + ench: [], + Unbreakable: 1, + HideFlags: 254, + display: { + Lore: [ + '§7Gear Score: §d5000', + '§7Damage: §c+3,496.48 §e(+30)', + '§7Strength: §c+2,328.8 §e(+30) §6[+5] §9(+220)', + '§7Crit Damage: §c+1,010.24% §d(+24%)', + '§7Magic Find: §a+10.86', + '§7Swing Range: §a+2.12', + ' §6[§8⚔§6] §6[§8⚔§6]', + '', + '§d§l§d§lChimera V§9, §9Champion X§9, §9Cleave VI', + '§9Critical VII§9, §9Cubism V§9, §9Divine Gift III', + '§9Dragon Hunter V§9, §9Ender Slayer VII§9, §9Execute VI', + '§9Experience IV§9, §9Fire Aspect III§9, §9Giant Killer VII', + '§9Impaling III§9, §9Lethality VI§9, §9Looting IV', + '§9Luck VII§9, §9Scavenger V§9, §9Sharpness VII', + '§9Smoldering III§9, §9Syphon V§9, §9Tabasco III', + '§9Thunderlord VII§9, §9Triple-Strike V§9, §9Vampirism VI', + '§9Venomous VI', + '', + '§c◆ Blood Rune III', + '', + '§7§7§oThat thing was too big to be called a', + '§7§osword, it was more like a large hunk', + '§7§oof stone.', + '', + '§fKills: §6403,954', + '', + '§9Withered Bonus', + '§7Grants §a+1 §c❁ Strength §7per', + '§7§cCatacombs §7level.', + '', + '§8§l* §8Co-op Soulbound §8§l*', + '§d§l§ka§r §d§lMYTHIC DUNGEON LONGSWORD §d§l§ka' + ], + Name: '§dWithered Dark Claymore §6✪✪✪✪✪§c➎' + }, + ExtraAttributes: { + rarity_upgrades: 1, + stats_book: 403954, + runes: { BLOOD_2: 3 }, + modifier: 'withered', + art_of_war_count: 1, + upgrade_level: 10, + enchantments: { + impaling: 3, + champion: 10 + }, + uuid: '89dd6816-0a32-4dcf-808b-ba558c793c91', + hot_potato_count: 15, + gems: { + COMBAT_0: 'PERFECT', + unlocked_slots: ['COMBAT_0', 'COMBAT_1'], + COMBAT_1_gem: 'ONYX', + COMBAT_0_gem: 'ONYX', + COMBAT_1: 'PERFECT' + }, + champion_combat_xp: 263299217.60781735, + id: 'DARK_CLAYMORE', + donated_museum: 1, + timestamp: [389, -126385440] + } + }, + Damage: 0 + } + ]); + /* eslint-enable camelcase */ + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberInventoriesInventoryDecoded); + expectTypeOf(data).toEqualTypeOf(); + expect(data.items).toBeDefined(); + expectTypeOf(data.items).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventoryDecoded.ts b/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventoryDecoded.ts new file mode 100644 index 000000000..43edaf6aa --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventoryDecoded.ts @@ -0,0 +1,15 @@ +import SkyBlockInventoryItem from '../../../Inventory/SkyBlockInventoryItem.js'; + +class SkyBlockMemberInventoriesInventoryDecoded { + items: SkyBlockInventoryItem[]; + constructor(data: any[]) { + this.items = []; + + for (let i = 0; i < data.length; i++) { + if (!data[i]?.id) continue; + this.items.push(new SkyBlockInventoryItem(data[i])); + } + } +} + +export default SkyBlockMemberInventoriesInventoryDecoded; diff --git a/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.test.ts b/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.test.ts new file mode 100644 index 000000000..c32a94fde --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.test.ts @@ -0,0 +1,30 @@ +import SkyBlockMemberInventories from './SkyBlockMemberInventories.js'; +import SkyBlockMemberInventoriesArmor from './Armor/SkyBlockMemberInventoriesArmor.js'; +import SkyBlockMemberInventoriesBackpacks from './Backpacks/SkyBlockMemberInventoriesBackpacks.js'; +import SkyBlockMemberInventoriesBags from './Bags/SkyBlockMemberInventoriesBags.js'; +import SkyBlockMemberInventoriesEquipment from './Equipment/SkyBlockMemberInventoriesEquipment.js'; +import SkyBlockMemberInventoriesInventory from './Inventory/SkyBlockMemberInventoriesInventory.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberInventories', () => { + const data = new SkyBlockMemberInventories({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberInventories); + expectTypeOf(data).toEqualTypeOf(); + expect(data.inventory).toBeDefined(); + expectTypeOf(data.inventory).toEqualTypeOf(); + expect(data.armor).toBeDefined(); + expectTypeOf(data.armor).toEqualTypeOf(); + expect(data.equipment).toBeDefined(); + expectTypeOf(data.equipment).toEqualTypeOf(); + expect(data.backpacks).toBeDefined(); + expectTypeOf(data.backpacks).toEqualTypeOf(); + expect(data.enderChest).toBeDefined(); + expectTypeOf(data.enderChest).toEqualTypeOf(); + expect(data.bags).toBeDefined(); + expectTypeOf(data.bags).toEqualTypeOf(); + expect(data.personalVault).toBeDefined(); + expectTypeOf(data.personalVault).toEqualTypeOf(); + expect(data.wardrobe).toBeDefined(); + expectTypeOf(data.wardrobe).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.ts b/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.ts new file mode 100644 index 000000000..98f3faeaf --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.ts @@ -0,0 +1,31 @@ +import SkyBlockMemberInventoriesArmor from './Armor/SkyBlockMemberInventoriesArmor.js'; +import SkyBlockMemberInventoriesBackpacks from './Backpacks/SkyBlockMemberInventoriesBackpacks.js'; +import SkyBlockMemberInventoriesBags from './Bags/SkyBlockMemberInventoriesBags.js'; +import SkyBlockMemberInventoriesEquipment from './Equipment/SkyBlockMemberInventoriesEquipment.js'; +import SkyBlockMemberInventoriesInventory from './Inventory/SkyBlockMemberInventoriesInventory.js'; + +class SkyBlockMemberInventories { + inventory: SkyBlockMemberInventoriesInventory; + armor: SkyBlockMemberInventoriesArmor; + equipment: SkyBlockMemberInventoriesEquipment; + backpacks: SkyBlockMemberInventoriesBackpacks; + enderChest: SkyBlockMemberInventoriesInventory; + bags: SkyBlockMemberInventoriesBags; + personalVault: SkyBlockMemberInventoriesInventory; + wardrobe: SkyBlockMemberInventoriesInventory; + constructor(data: Record) { + this.inventory = new SkyBlockMemberInventoriesInventory(data?.inv_contents || {}); + this.armor = new SkyBlockMemberInventoriesArmor(data?.inv_armor || {}); + this.equipment = new SkyBlockMemberInventoriesEquipment(data?.equipment_contents || {}); + this.backpacks = new SkyBlockMemberInventoriesBackpacks({ + backpackIcons: data?.backpack_icons || {}, + backpackContents: data?.backpack_contents || {} + }); + this.enderChest = new SkyBlockMemberInventoriesInventory(data?.ender_chest_contents || {}); + this.bags = new SkyBlockMemberInventoriesBags(data?.bag_contents || {}); + this.personalVault = new SkyBlockMemberInventoriesInventory(data?.personal_vault_contents || {}); + this.wardrobe = new SkyBlockMemberInventoriesInventory({ ...(data?.wardrobe_contents || {}) }); + } +} + +export default SkyBlockMemberInventories; diff --git a/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventoriesBaseInventory.test.ts b/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventoriesBaseInventory.test.ts new file mode 100644 index 000000000..4a823b6ec --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventoriesBaseInventory.test.ts @@ -0,0 +1,13 @@ +import SkyBlockMemberInventoriesBaseInventory from './SkyBlockMemberInventoriesBaseInventory.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberInventoriesBaseInventory', () => { + const data = new SkyBlockMemberInventoriesBaseInventory({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberInventoriesBaseInventory); + expectTypeOf(data).toEqualTypeOf(); + expect(data.base64).toBeDefined(); + expectTypeOf(data.base64).toEqualTypeOf(); + expect(data.decodeData).toBeDefined(); + expectTypeOf(data.decodeData).toEqualTypeOf<() => Promise | any>(); +}); diff --git a/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventoriesBaseInventory.ts b/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventoriesBaseInventory.ts new file mode 100644 index 000000000..11856eacf --- /dev/null +++ b/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventoriesBaseInventory.ts @@ -0,0 +1,12 @@ +class SkyBlockMemberInventoriesBaseInventory { + base64: string | null; + constructor(data: Record) { + this.base64 = data?.data || null; + } + + decodeData(): Promise | any { + throw new Error("Something went wrong. You shouldn't be seeing this"); + } +} + +export default SkyBlockMemberInventoriesBaseInventory; diff --git a/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContest.test.ts b/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContest.test.ts new file mode 100644 index 000000000..3191c3b6c --- /dev/null +++ b/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContest.test.ts @@ -0,0 +1,17 @@ +import SkyBlockMemberJacobContest from './SkyBlockMemberJacobContest.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberJacobContest', () => { + const data = new SkyBlockMemberJacobContest({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberJacobContest); + expectTypeOf(data).toEqualTypeOf(); + expect(data.collected).toBeDefined(); + expectTypeOf(data.collected).toEqualTypeOf(); + expect(data.claimedRewards).toBeDefined(); + expectTypeOf(data.claimedRewards).toEqualTypeOf(); + expect(data.claimedPosition).toBeDefined(); + expectTypeOf(data.claimedPosition).toEqualTypeOf(); + expect(data.claimedParticipants).toBeDefined(); + expectTypeOf(data.claimedParticipants).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContest.ts b/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContest.ts new file mode 100644 index 000000000..dec551d96 --- /dev/null +++ b/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContest.ts @@ -0,0 +1,14 @@ +class SkyBlockMemberJacobContest { + collected: number | null; + claimedRewards: boolean | null; + claimedPosition: number | null; + claimedParticipants: number | null; + constructor(data: Record) { + this.collected = data?.collected || null; + this.claimedRewards = data?.claimed_rewards || null; + this.claimedPosition = data?.claimed_position || null; + this.claimedParticipants = data?.claimed_participants || null; + } +} + +export default SkyBlockMemberJacobContest; diff --git a/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContests.test.ts b/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContests.test.ts new file mode 100644 index 000000000..efbb58c39 --- /dev/null +++ b/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContests.test.ts @@ -0,0 +1,24 @@ +import SkyBlockMemberJacobContest from './SkyBlockMemberJacobContest.js'; +import SkyBlockMemberJacobContests from './SkyBlockMemberJacobContests.js'; +import SkyBlockMemberJacobContestsMedals from './SkyBlockMemberJacobContestsMedals.js'; +import SkyBlockMemberJacobContestsPerks from './SkyBlockMemberJacobContestsPerks.js'; +import SkyBlockMemberJacobContestsUniqueBrackets from './SkyBlockMemberJacobContestsUniqueBrackets.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { JacobCrops } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberJacobContests', () => { + const data = new SkyBlockMemberJacobContests({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberJacobContests); + expectTypeOf(data).toEqualTypeOf(); + expect(data.perks).toBeDefined(); + expectTypeOf(data.perks).toEqualTypeOf(); + expect(data.medals).toBeDefined(); + expectTypeOf(data.medals).toEqualTypeOf(); + expect(data.uniqueBrackets).toBeDefined(); + expectTypeOf(data.uniqueBrackets).toEqualTypeOf(); + expect(data.personalBests).toBeDefined(); + expectTypeOf(data.personalBests).toEqualTypeOf>(); + expect(data.contests).toBeDefined(); + expectTypeOf(data.contests).toEqualTypeOf>(); +}); diff --git a/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContests.ts b/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContests.ts new file mode 100644 index 000000000..2fdea5176 --- /dev/null +++ b/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContests.ts @@ -0,0 +1,26 @@ +import SkyBlockMemberJacobContestsMedals from './SkyBlockMemberJacobContestsMedals.js'; +import SkyBlockMemberJacobContestsPerks from './SkyBlockMemberJacobContestsPerks.js'; +import SkyBlockMemberJacobContestsUniqueBrackets from './SkyBlockMemberJacobContestsUniqueBrackets.js'; +import type SkyBlockMemberJacobContest from './SkyBlockMemberJacobContest.js'; +import type { JacobCrops } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberJacobContests { + perks: SkyBlockMemberJacobContestsPerks; + medals: SkyBlockMemberJacobContestsMedals; + uniqueBrackets: SkyBlockMemberJacobContestsUniqueBrackets; + personalBests: Record; + contests: Record; + constructor(data: Record) { + this.perks = new SkyBlockMemberJacobContestsPerks(data?.perks || {}); + this.medals = new SkyBlockMemberJacobContestsMedals(data?.medals_inv || {}); + this.uniqueBrackets = new SkyBlockMemberJacobContestsUniqueBrackets(data?.unique_brackets || {}); + this.personalBests = data?.personal_bests || {}; + const contests = data?.contests || {}; + this.contests = Object.keys(contests).reduce((obj: Record, key: string) => { + obj[key] = contests[key]; + return obj; + }, {}); + } +} + +export default SkyBlockMemberJacobContests; diff --git a/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsMedals.test.ts b/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsMedals.test.ts new file mode 100644 index 000000000..ee10c0ff0 --- /dev/null +++ b/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsMedals.test.ts @@ -0,0 +1,15 @@ +import SkyBlockMemberJacobContestsMedals from './SkyBlockMemberJacobContestsMedals.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberJacobContestsMedals', () => { + const data = new SkyBlockMemberJacobContestsMedals({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberJacobContestsMedals); + expectTypeOf(data).toEqualTypeOf(); + expect(data.bronze).toBeDefined(); + expectTypeOf(data.bronze).toEqualTypeOf(); + expect(data.silver).toBeDefined(); + expectTypeOf(data.silver).toEqualTypeOf(); + expect(data.gold).toBeDefined(); + expectTypeOf(data.gold).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsMedals.ts b/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsMedals.ts new file mode 100644 index 000000000..fe28154bc --- /dev/null +++ b/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsMedals.ts @@ -0,0 +1,12 @@ +class SkyBlockMemberJacobContestsMedals { + bronze: number; + silver: number; + gold: number; + constructor(data: Record) { + this.bronze = data?.bronze || 0; + this.silver = data?.silver || 0; + this.gold = data?.gold || 0; + } +} + +export default SkyBlockMemberJacobContestsMedals; diff --git a/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsPerks.test.ts b/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsPerks.test.ts new file mode 100644 index 000000000..2e3ae0363 --- /dev/null +++ b/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsPerks.test.ts @@ -0,0 +1,15 @@ +import SkyBlockMemberJacobContestsPerks from './SkyBlockMemberJacobContestsPerks.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberJacobContestsPerks', () => { + const data = new SkyBlockMemberJacobContestsPerks({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberJacobContestsPerks); + expectTypeOf(data).toEqualTypeOf(); + expect(data.doubleDrops).toBeDefined(); + expectTypeOf(data.doubleDrops).toEqualTypeOf(); + expect(data.farmingLevelCap).toBeDefined(); + expectTypeOf(data.farmingLevelCap).toEqualTypeOf(); + expect(data.personalBests).toBeDefined(); + expectTypeOf(data.personalBests).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsPerks.ts b/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsPerks.ts new file mode 100644 index 000000000..7895c8b98 --- /dev/null +++ b/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsPerks.ts @@ -0,0 +1,12 @@ +class SkyBlockMemberJacobContestsPerks { + doubleDrops: number; + farmingLevelCap: number; + personalBests: boolean; + constructor(data: Record) { + this.doubleDrops = data?.double_drops || 0; + this.farmingLevelCap = data?.farming_level_cap || 0; + this.personalBests = data?.personal_bests || false; + } +} + +export default SkyBlockMemberJacobContestsPerks; diff --git a/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsUniqueBrackets.test.ts b/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsUniqueBrackets.test.ts new file mode 100644 index 000000000..c416deed1 --- /dev/null +++ b/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsUniqueBrackets.test.ts @@ -0,0 +1,20 @@ +import SkyBlockMemberJacobContestsUniqueBrackets from './SkyBlockMemberJacobContestsUniqueBrackets.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { JacobCrops } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberJacobContestsUniqueBrackets', () => { + const data = new SkyBlockMemberJacobContestsUniqueBrackets({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberJacobContestsUniqueBrackets); + expectTypeOf(data).toEqualTypeOf(); + expect(data.bronze).toBeDefined(); + expectTypeOf(data.bronze).toEqualTypeOf(); + expect(data.silver).toBeDefined(); + expectTypeOf(data.silver).toEqualTypeOf(); + expect(data.gold).toBeDefined(); + expectTypeOf(data.gold).toEqualTypeOf(); + expect(data.platinum).toBeDefined(); + expectTypeOf(data.platinum).toEqualTypeOf(); + expect(data.diamond).toBeDefined(); + expectTypeOf(data.diamond).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsUniqueBrackets.ts b/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsUniqueBrackets.ts new file mode 100644 index 000000000..52b4134f1 --- /dev/null +++ b/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsUniqueBrackets.ts @@ -0,0 +1,18 @@ +import type { JacobCrops } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberJacobContestsUniqueBrackets { + bronze: JacobCrops[]; + silver: JacobCrops[]; + gold: JacobCrops[]; + platinum: JacobCrops[]; + diamond: JacobCrops[]; + constructor(data: Record) { + this.bronze = data?.bronze || []; + this.silver = data?.silver || []; + this.gold = data?.gold || []; + this.platinum = data?.platinum || []; + this.diamond = data?.diamond || []; + } +} + +export default SkyBlockMemberJacobContestsUniqueBrackets; diff --git a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMining.test.ts b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMining.test.ts new file mode 100644 index 000000000..c4a029f25 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMining.test.ts @@ -0,0 +1,25 @@ +import SkyBlockMemberMining from './SkyBlockMemberMining.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockMemberMiningCrystal from './SkyBlockMemberMiningCrystal.js'; +import type SkyBlockMemberMiningHotm from './SkyBlockMemberMiningHotm.js'; +import type SkyBlockMemberMiningPowders from './SkyBlockMemberMiningPowders.js'; +import type { MiningCrystal, MiningPickaxeAbility, MiningSkyMallEffect } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberMining', () => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + const data = new SkyBlockMemberMining(); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberMining); + expectTypeOf(data).toEqualTypeOf(); + expect(data.powder).toBeDefined(); + expectTypeOf(data.powder).toEqualTypeOf(); + expect(data.crystals).toBeDefined(); + expectTypeOf(data.crystals).toEqualTypeOf>(); + expect(data.hotm).toBeDefined(); + expectTypeOf(data.hotm).toEqualTypeOf(); + expect(data.pickaxeAbility).toBeDefined(); + expectTypeOf(data.pickaxeAbility).toEqualTypeOf(); + expect(data.dailyEffect).toBeDefined(); + expectTypeOf(data.dailyEffect).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMining.ts b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMining.ts new file mode 100644 index 000000000..741b9b367 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMining.ts @@ -0,0 +1,27 @@ +import SkyBlockMemberMiningCrystal from './SkyBlockMemberMiningCrystal.js'; +import SkyBlockMemberMiningHotm from './SkyBlockMemberMiningHotm.js'; +import SkyBlockMemberMiningPowders from './SkyBlockMemberMiningPowders.js'; +import type { MiningCrystal, MiningPickaxeAbility, MiningSkyMallEffect } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberMining { + powder: SkyBlockMemberMiningPowders; + crystals: Record; + hotm: SkyBlockMemberMiningHotm; + pickaxeAbility: MiningPickaxeAbility | 'UNKNOWN'; + dailyEffect: MiningSkyMallEffect | 'UNKNOWN'; + constructor(data: Record) { + this.powder = new SkyBlockMemberMiningPowders(data || {}); + this.crystals = Object.keys(data?.crystals || {}).reduce( + (obj: Record, key: string) => { + obj[key.split('_crystal')[0] || 'jade'] = new SkyBlockMemberMiningCrystal(data?.crystals?.[key]); + return obj; + }, + {} + ); + this.hotm = new SkyBlockMemberMiningHotm(data || {}); + this.pickaxeAbility = data?.selected_pickaxe_ability || 'UNKNOWN'; + this.dailyEffect = data?.current_daily_effect || 'UNKNOWN'; + } +} + +export default SkyBlockMemberMining; diff --git a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningCrystal.test.ts b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningCrystal.test.ts new file mode 100644 index 000000000..4338c5090 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningCrystal.test.ts @@ -0,0 +1,20 @@ +import SkyBlockMemberMiningCrystal from './SkyBlockMemberMiningCrystal.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberMiningCrystal', () => { + const data = new SkyBlockMemberMiningCrystal({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberMiningCrystal); + expectTypeOf(data).toEqualTypeOf(); + expect(data.found).toBeDefined(); + expectTypeOf(data.found).toEqualTypeOf(); + expect(data.totalFound).toBeDefined(); + expectTypeOf(data.totalFound).toEqualTypeOf(); + expect(data.totalPlaced).toBeDefined(); + expectTypeOf(data.totalPlaced).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => boolean>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.found); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningCrystal.ts b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningCrystal.ts new file mode 100644 index 000000000..455e38f64 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningCrystal.ts @@ -0,0 +1,16 @@ +class SkyBlockMemberMiningCrystal { + found: boolean; + totalFound: number; + totalPlaced: number; + constructor(data: Record) { + this.found = data.state ? 'FOUND' === data.state : false; + this.totalFound = data?.total_found || 0; + this.totalPlaced = data?.total_placed || 0; + } + + toString(): boolean { + return this.found; + } +} + +export default SkyBlockMemberMiningCrystal; diff --git a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotm.test.ts b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotm.test.ts new file mode 100644 index 000000000..5a82591d3 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotm.test.ts @@ -0,0 +1,24 @@ +import SkyBlockMemberMiningHotm from './SkyBlockMemberMiningHotm.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockMemberMiningHotmForge from './SkyBlockMemberMiningHotmForge.js'; +import type { SkillLevelData } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberMiningHotm', () => { + const data = new SkyBlockMemberMiningHotm({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberMiningHotm); + expectTypeOf(data).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.nodes).toBeDefined(); + expectTypeOf(data.nodes).toEqualTypeOf>(); + expect(data.tokensSpent).toBeDefined(); + expectTypeOf(data.tokensSpent).toEqualTypeOf(); + expect(data.forge).toBeDefined(); + expectTypeOf(data.forge).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.level.level); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotm.ts b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotm.ts new file mode 100644 index 000000000..14d91acec --- /dev/null +++ b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotm.ts @@ -0,0 +1,25 @@ +import SkyBlockMemberMiningHotmForge from './SkyBlockMemberMiningHotmForge.js'; +import { getLevelByXp } from '../../../../Utils/SkyBlockUtils.js'; +import type { SkillLevelData } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberMiningHotm { + level: SkillLevelData; + nodes: Record; + tokensSpent: number; + forge: SkyBlockMemberMiningHotmForge; + constructor(data: Record) { + this.level = getLevelByXp(data?.experience || 0, { type: 'hotm' }); + this.nodes = data?.nodes || {}; + this.tokensSpent = data?.tokens_spent || 0; + this.forge = new SkyBlockMemberMiningHotmForge( + data?.forge_processes?.forge_1 || {}, + Number(this.nodes?.forge_time) || 0 + ); + } + + toString(): number { + return this.level.level; + } +} + +export default SkyBlockMemberMiningHotm; diff --git a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForge.test.ts b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForge.test.ts new file mode 100644 index 000000000..5778a9db8 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForge.test.ts @@ -0,0 +1,26 @@ +import SkyBlockMemberMiningHotmForge from './SkyBlockMemberMiningHotmForge.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockMemberMiningHotmForgeItem from './SkyBlockMemberMiningHotmForgeItem.js'; + +test('SkyBlockMemberMiningHotmForge', () => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + const data = new SkyBlockMemberMiningHotmForge(); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberMiningHotmForge); + expectTypeOf(data).toEqualTypeOf(); + expect(data.slot1).toBeDefined(); + expectTypeOf(data.slot1).toEqualTypeOf(); + expect(data.slot2).toBeDefined(); + expectTypeOf(data.slot2).toEqualTypeOf(); + expect(data.slot3).toBeDefined(); + expectTypeOf(data.slot3).toEqualTypeOf(); + expect(data.slot4).toBeDefined(); + expectTypeOf(data.slot4).toEqualTypeOf(); + expect(data.slot5).toBeDefined(); + expectTypeOf(data.slot5).toEqualTypeOf(); + expect(data.slot6).toBeDefined(); + expectTypeOf(data.slot6).toEqualTypeOf(); + expect(data.slot7).toBeDefined(); + expectTypeOf(data.slot7).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForge.ts b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForge.ts new file mode 100644 index 000000000..45c172a0e --- /dev/null +++ b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForge.ts @@ -0,0 +1,22 @@ +import SkyBlockMemberMiningHotmForgeItem from './SkyBlockMemberMiningHotmForgeItem.js'; + +class SkyBlockMemberMiningHotmForge { + slot1: SkyBlockMemberMiningHotmForgeItem | null; + slot2: SkyBlockMemberMiningHotmForgeItem | null; + slot3: SkyBlockMemberMiningHotmForgeItem | null; + slot4: SkyBlockMemberMiningHotmForgeItem | null; + slot5: SkyBlockMemberMiningHotmForgeItem | null; + slot6: SkyBlockMemberMiningHotmForgeItem | null; + slot7: SkyBlockMemberMiningHotmForgeItem | null; + constructor(data: Record, quickForgeTime: number = 0) { + this.slot1 = data?.['1'] ? new SkyBlockMemberMiningHotmForgeItem(data?.['1'], quickForgeTime) : null; + this.slot2 = data?.['2'] ? new SkyBlockMemberMiningHotmForgeItem(data?.['2'], quickForgeTime) : null; + this.slot3 = data?.['3'] ? new SkyBlockMemberMiningHotmForgeItem(data?.['3'], quickForgeTime) : null; + this.slot4 = data?.['4'] ? new SkyBlockMemberMiningHotmForgeItem(data?.['4'], quickForgeTime) : null; + this.slot5 = data?.['5'] ? new SkyBlockMemberMiningHotmForgeItem(data?.['5'], quickForgeTime) : null; + this.slot6 = data?.['6'] ? new SkyBlockMemberMiningHotmForgeItem(data?.['6'], quickForgeTime) : null; + this.slot7 = data?.['7'] ? new SkyBlockMemberMiningHotmForgeItem(data?.['7'], quickForgeTime) : null; + } +} + +export default SkyBlockMemberMiningHotmForge; diff --git a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForgeItem.test.ts b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForgeItem.test.ts new file mode 100644 index 000000000..c390c4ca6 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForgeItem.test.ts @@ -0,0 +1,35 @@ +import SkyBlockMemberMiningHotmForgeItem from './SkyBlockMemberMiningHotmForgeItem.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { ForgeItemType, MiningForgeItemId, MiningForgeItemName } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberMiningHotmForgeItem', () => { + const data = new SkyBlockMemberMiningHotmForgeItem({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberMiningHotmForgeItem); + expectTypeOf(data).toEqualTypeOf(); + expect(data.type).toBeDefined(); + expectTypeOf(data.type).toEqualTypeOf(); + expect(data.id).toBeDefined(); + expectTypeOf(data.id).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.startTime).toBeDefined(); + expectTypeOf(data.startTime).toEqualTypeOf(); + expect(data.startTimeAt).toBeDefined(); + expectTypeOf(data.startTimeAt).toEqualTypeOf(); + expect(data.endTime).toBeDefined(); + expectTypeOf(data.endTime).toEqualTypeOf(); + expect(data.endTimeAt).toBeDefined(); + expectTypeOf(data.endTimeAt).toEqualTypeOf(); + expect(data.slot).toBeDefined(); + expectTypeOf(data.slot).toEqualTypeOf(); + expect(data.notified).toBeDefined(); + expectTypeOf(data.notified).toEqualTypeOf(); + expect(data.oldItem).toBeDefined(); + expectTypeOf(data.oldItem).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => MiningForgeItemName | 'UNKNOWN'>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.name); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForgeItem.ts b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForgeItem.ts new file mode 100644 index 000000000..c980e92aa --- /dev/null +++ b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForgeItem.ts @@ -0,0 +1,34 @@ +import { MiningForgeItems, MiningForgeQuickForgeMultiplier } from '../../../../Utils/Constants.js'; +import type { ForgeItemType, MiningForgeItemId, MiningForgeItemName } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberMiningHotmForgeItem { + type: ForgeItemType | 'UNKNOWN'; + id: MiningForgeItemId | 'UNKNOWN'; + name: MiningForgeItemName | 'UNKNOWN'; + startTime: number; + startTimeAt: Date; + endTime: number; + endTimeAt: Date; + slot: number; + notified: boolean; + oldItem: string | null; + constructor(data: Record, quickForgeTime: number = 0) { + this.type = data?.type || 'UNKNOWN'; + this.id = data?.id || 'UNKNOWN'; + this.name = MiningForgeItems?.[this.id].name || 'UNKNOWN'; + this.startTime = data?.startTime || 0; + this.startTimeAt = new Date(this.startTime); + this.endTime = + this.startTime + MiningForgeItems?.[this.id].duration * (MiningForgeQuickForgeMultiplier[quickForgeTime] || 1); + this.endTimeAt = new Date(this.endTime); + this.slot = data?.slot || 0; + this.notified = data?.notified || false; + this.oldItem = data?.oldItem || null; + } + + toString(): MiningForgeItemName | 'UNKNOWN' { + return this.name; + } +} + +export default SkyBlockMemberMiningHotmForgeItem; diff --git a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningPowder.test.ts b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningPowder.test.ts new file mode 100644 index 000000000..1a433085f --- /dev/null +++ b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningPowder.test.ts @@ -0,0 +1,20 @@ +import SkyBlockMemberMiningPowder from './SkyBlockMemberMiningPowder.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberMiningPowder', () => { + const data = new SkyBlockMemberMiningPowder({ stats: 'meow' }, 'mithril'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberMiningPowder); + expectTypeOf(data).toEqualTypeOf(); + expect(data.spent).toBeDefined(); + expectTypeOf(data.spent).toEqualTypeOf(); + expect(data.powder).toBeDefined(); + expectTypeOf(data.powder).toEqualTypeOf(); + expect(data.total).toBeDefined(); + expectTypeOf(data.total).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.total); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningPowder.ts b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningPowder.ts new file mode 100644 index 000000000..62aefce52 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningPowder.ts @@ -0,0 +1,18 @@ +import type { MiningPower } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberMiningPowder { + spent: number; + powder: number; + total: number; + constructor(data: Record, type: MiningPower) { + this.spent = data?.[`powder_spent_${type}`] || 0; + this.powder = data?.[`powder_${type}`] || 0; + this.total = this.spent + this.powder; + } + + toString(): number { + return this.total; + } +} + +export default SkyBlockMemberMiningPowder; diff --git a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningPowders.test.ts b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningPowders.test.ts new file mode 100644 index 000000000..e693ff85e --- /dev/null +++ b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningPowders.test.ts @@ -0,0 +1,18 @@ +import SkyBlockMemberMiningPowders from './SkyBlockMemberMiningPowders.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockMemberMiningPowder from './SkyBlockMemberMiningPowder.js'; + +test('SkyBlockMemberMiningPowders', () => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + const data = new SkyBlockMemberMiningPowders(); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberMiningPowders); + expectTypeOf(data).toEqualTypeOf(); + expect(data.mithril).toBeDefined(); + expectTypeOf(data.mithril).toEqualTypeOf(); + expect(data.gemstone).toBeDefined(); + expectTypeOf(data.gemstone).toEqualTypeOf(); + expect(data.glacite).toBeDefined(); + expectTypeOf(data.glacite).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningPowders.ts b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningPowders.ts new file mode 100644 index 000000000..e5e99590c --- /dev/null +++ b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningPowders.ts @@ -0,0 +1,14 @@ +import SkyBlockMemberMiningPowder from './SkyBlockMemberMiningPowder.js'; + +class SkyBlockMemberMiningPowders { + mithril: SkyBlockMemberMiningPowder; + gemstone: SkyBlockMemberMiningPowder; + glacite: SkyBlockMemberMiningPowder; + constructor(data: Record) { + this.mithril = new SkyBlockMemberMiningPowder(data || {}, 'mithril'); + this.gemstone = new SkyBlockMemberMiningPowder(data || {}, 'gemstone'); + this.glacite = new SkyBlockMemberMiningPowder(data || {}, 'glacite'); + } +} + +export default SkyBlockMemberMiningPowders; diff --git a/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPet.test.ts b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPet.test.ts new file mode 100644 index 000000000..cf4eb7c3a --- /dev/null +++ b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPet.test.ts @@ -0,0 +1,34 @@ +import SkyBlockMemberPet from './SkyBlockMemberPet.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { LevelData, Rarity, SkyBlockPetId } from '../../../../Types/SkyBlock.js'; +import type { UUID } from '../../../../Types/Global.js'; + +test('SkyBlockMemberPet', () => { + const data = new SkyBlockMemberPet({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberPet); + expectTypeOf(data).toEqualTypeOf(); + expect(data.uuid).toBeDefined(); + expectTypeOf(data.uuid).toEqualTypeOf(); + expect(data.uniqueId).toBeDefined(); + expectTypeOf(data.uniqueId).toEqualTypeOf(); + expect(data.type).toBeDefined(); + expectTypeOf(data.type).toEqualTypeOf(); + expect(data.active).toBeDefined(); + expectTypeOf(data.active).toEqualTypeOf(); + expect(data.tier).toBeDefined(); + expectTypeOf(data.tier).toEqualTypeOf(); + expect(data.heldItem).toBeDefined(); + expectTypeOf(data.heldItem).toEqualTypeOf(); + expect(data.candyUsed).toBeDefined(); + expectTypeOf(data.candyUsed).toEqualTypeOf(); + expect(data.skin).toBeDefined(); + expectTypeOf(data.skin).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => SkyBlockPetId | 'UNKNOWN'>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.type); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPet.ts b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPet.ts new file mode 100644 index 000000000..6f7d91b22 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPet.ts @@ -0,0 +1,32 @@ +import { getPetLevel } from '../../../../Utils/SkyBlockUtils.js'; +import type { LevelData, Rarity, SkyBlockPetId } from '../../../../Types/SkyBlock.js'; +import type { UUID } from '../../../../Types/Global.js'; + +class SkyBlockMemberPet { + uuid: UUID; + uniqueId: string; + type: SkyBlockPetId | 'UNKNOWN'; + active: boolean; + tier: Rarity | 'UNKNOWN'; + heldItem: string | null; + candyUsed: number; + skin: string | null; + level: LevelData; + constructor(data: Record) { + this.uuid = data?.uuid || 'UNKNOWN'; + this.uniqueId = data?.uniqueId || 'UNKNOWN'; + this.type = data?.type || 'UNKNOWN'; + this.active = data?.active || false; + this.tier = data?.tier || 'UNKNOWN'; + this.heldItem = data?.heldItem || null; + this.candyUsed = data?.candyUsed || 0; + this.skin = data?.skin || null; + this.level = getPetLevel(data?.exp || 0, this.type, this.tier); + } + + toString(): SkyBlockPetId | 'UNKNOWN' { + return this.type; + } +} + +export default SkyBlockMemberPet; diff --git a/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPets.test.ts b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPets.test.ts new file mode 100644 index 000000000..2be296126 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPets.test.ts @@ -0,0 +1,24 @@ +import SkyBlockMemberPets from './SkyBlockMemberPets.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockMemberPet from './SkyBlockMemberPet.js'; +import type SkyBlockMemberPetsAutoPets from './SkyBlockMemberPetsAutoPets.js'; +import type SkyBlockMemberPetsCare from './SkyBlockMemberPetsCare.js'; + +test('SkyBlockMemberPets', () => { + const data = new SkyBlockMemberPets({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberPets); + expectTypeOf(data).toEqualTypeOf(); + expect(data.petCare).toBeDefined(); + expectTypeOf(data.petCare).toEqualTypeOf(); + expect(data.autoPetRules).toBeDefined(); + expectTypeOf(data.autoPetRules).toEqualTypeOf(); + expect(data.pets).toBeDefined(); + expectTypeOf(data.pets).toEqualTypeOf(); + expect(data.oresMined).toBeDefined(); + expectTypeOf(data.oresMined).toEqualTypeOf(); + expect(data.seaCreaturesKilled).toBeDefined(); + expectTypeOf(data.seaCreaturesKilled).toEqualTypeOf(); + expect(data.totalExpGained).toBeDefined(); + expectTypeOf(data.totalExpGained).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPets.ts b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPets.ts new file mode 100644 index 000000000..5ee5fccf0 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPets.ts @@ -0,0 +1,62 @@ +import SkyBlockMemberPet from './SkyBlockMemberPet.js'; +import SkyBlockMemberPetsAutoPets from './SkyBlockMemberPetsAutoPets.js'; +import SkyBlockMemberPetsCare from './SkyBlockMemberPetsCare.js'; + +class SkyBlockMemberPets { + petCare: SkyBlockMemberPetsCare; + autoPetRules: SkyBlockMemberPetsAutoPets; + pets: SkyBlockMemberPet[]; + oresMined: number; + seaCreaturesKilled: number; + totalExpGained: number; + constructor(data: Record) { + this.petCare = new SkyBlockMemberPetsCare(data?.pet_care || {}); + this.autoPetRules = new SkyBlockMemberPetsAutoPets(data?.autopet || {}); + this.pets = (data?.pets || []).map((pet: Record) => new SkyBlockMemberPet(pet)); + this.oresMined = data?.milestone?.ores_mined || 0; + this.seaCreaturesKilled = data?.milestone?.sea_creatures_killed || 0; + this.totalExpGained = data?.total_exp_gained || 0; + } + + // CREDIT: https://github.com/SkyCryptWebsite/SkyCryptv2/blob/2d4d0317b1f7a9f27e59d25afd4df24c0e49b0da/src/lib/server/stats/pets.ts#L346-L400 (modified) + getPetScore(): number { + const RARITIES = [ + 'common', + 'uncommon', + 'rare', + 'epic', + 'legendary', + 'mythic', + 'divine', + 'supreme', + 'special', + 'very_special', + 'admin' + ]; + const highestRarity = {} as Record; + const highestLevel = {} as Record; + for (const pet of this.pets) { + if ('UNKNOWN' === pet.type) continue; + if ('UNKNOWN' === pet.tier) continue; + + // ? NOTE: FRACTURED_MONTEZUMA_SOUL is a rift pet so it's not accounted in the calculation + if ('FRACTURED_MONTEZUMA_SOUL' === pet.type) { + continue; + } + + const rarityIndex = RARITIES.indexOf(pet.tier.toLowerCase()) + 1; + if (rarityIndex > (highestRarity[pet.type] ?? 0)) highestRarity[pet.type] = rarityIndex; + + if (pet.level.level > (highestLevel[pet.type] ?? 0)) { + if (pet.level.level < pet.level.maxLevel) continue; + highestLevel[pet.type] = 1; + } + } + + const total = + Object.values(highestRarity).reduce((a, b) => a + b, 0) + Object.values(highestLevel).reduce((a, b) => a + b, 0); + return total; + } +} + +export default SkyBlockMemberPets; diff --git a/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsAutoPetRule.test.ts b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsAutoPetRule.test.ts new file mode 100644 index 000000000..8e4fdd2d3 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsAutoPetRule.test.ts @@ -0,0 +1,29 @@ +import SkyBlockMemberPetsAutoPetRule from './SkyBlockMemberPetsAutoPetRule.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { UUID, UserInput } from '../../../../Types/Global.js'; + +test('SkyBlockMemberPetsAutoPetRule', () => { + const data = new SkyBlockMemberPetsAutoPetRule({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberPetsAutoPetRule); + expectTypeOf(data).toEqualTypeOf(); + expect(data.uuid).toBeDefined(); + expectTypeOf(data.uuid).toEqualTypeOf(); + expect(data.id).toBeDefined(); + expectTypeOf(data.id).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.uniqueId).toBeDefined(); + expectTypeOf(data.uniqueId).toEqualTypeOf(); + expect(data.exceptions).toBeDefined(); + expectTypeOf(data.exceptions).toEqualTypeOf[]>(); + expect(data.disabled).toBeDefined(); + expectTypeOf(data.disabled).toEqualTypeOf(); + expect(data.data).toBeDefined(); + expectTypeOf(data.data).toEqualTypeOf>(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.id); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsAutoPetRule.ts b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsAutoPetRule.ts new file mode 100644 index 000000000..1f9d8663f --- /dev/null +++ b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsAutoPetRule.ts @@ -0,0 +1,26 @@ +import type { UUID, UserInput } from '../../../../Types/Global.js'; + +class SkyBlockMemberPetsAutoPetRule { + uuid: UUID; + id: string; + name: UserInput | 'UNKNOWN'; + uniqueId: string; + exceptions: Record[]; + disabled: boolean; + data: Record; + constructor(data: Record) { + this.uuid = data?.uuid || 'UNKNOWN'; + this.id = data?.id || 'UNKNOWN'; + this.name = data?.name || 'UNKNOWN'; + this.uniqueId = data?.uniqueId || 'UNKNOWN'; + this.exceptions = data?.exceptions || []; + this.disabled = data?.disabled || false; + this.data = data?.data || {}; + } + + toString(): string { + return this.name; + } +} + +export default SkyBlockMemberPetsAutoPetRule; diff --git a/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsAutoPets.test.ts b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsAutoPets.test.ts new file mode 100644 index 000000000..889e7c1cb --- /dev/null +++ b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsAutoPets.test.ts @@ -0,0 +1,14 @@ +import SkyBlockMemberPetsAutoPets from './SkyBlockMemberPetsAutoPets.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockMemberPetsAutoPetRule from './SkyBlockMemberPetsAutoPetRule.js'; + +test('SkyBlockMemberPetsAutoPets', () => { + const data = new SkyBlockMemberPetsAutoPets({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberPetsAutoPets); + expectTypeOf(data).toEqualTypeOf(); + expect(data.rulesLimit).toBeDefined(); + expectTypeOf(data.rulesLimit).toEqualTypeOf(); + expect(data.rules).toBeDefined(); + expectTypeOf(data.rules).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsAutoPets.ts b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsAutoPets.ts new file mode 100644 index 000000000..cf21bc3bd --- /dev/null +++ b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsAutoPets.ts @@ -0,0 +1,12 @@ +import SkyBlockMemberPetsAutoPetRule from './SkyBlockMemberPetsAutoPetRule.js'; + +class SkyBlockMemberPetsAutoPets { + rulesLimit: number; + rules: SkyBlockMemberPetsAutoPetRule[]; + constructor(data: Record) { + this.rulesLimit = data?.rules_limit || 0; + this.rules = (data?.rules || []).map((rule: Record) => new SkyBlockMemberPetsAutoPetRule(rule)); + } +} + +export default SkyBlockMemberPetsAutoPets; diff --git a/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsCare.test.ts b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsCare.test.ts new file mode 100644 index 000000000..6c14ea7ad --- /dev/null +++ b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsCare.test.ts @@ -0,0 +1,19 @@ +import SkyBlockMemberPetsCare from './SkyBlockMemberPetsCare.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { SacrificedPets } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberPetsCare', () => { + const data = new SkyBlockMemberPetsCare({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberPetsCare); + expectTypeOf(data).toEqualTypeOf(); + expect(data.coinsSpent).toBeDefined(); + expectTypeOf(data.coinsSpent).toEqualTypeOf(); + expect(data.petsSacrificed).toBeDefined(); + expectTypeOf(data.petsSacrificed).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.coinsSpent); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsCare.ts b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsCare.ts new file mode 100644 index 000000000..3a2a74472 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsCare.ts @@ -0,0 +1,16 @@ +import type { SacrificedPets } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberPetsCare { + coinsSpent: number; + petsSacrificed: SacrificedPets[]; + constructor(data: Record) { + this.coinsSpent = data?.coins_spent || 0; + this.petsSacrificed = data?.pet_types_sacrificed || []; + } + + toString(): number { + return this.coinsSpent; + } +} + +export default SkyBlockMemberPetsCare; diff --git a/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerData.test.ts b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerData.test.ts new file mode 100644 index 000000000..85ac999aa --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerData.test.ts @@ -0,0 +1,43 @@ +import SkyBlockMemberPlayerData from './SkyBlockMemberPlayerData.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockMemberPlayerDataActiveEffect from './SkyBlockMemberPlayerDataActiveEffect.js'; +import type SkyBlockMemberPlayerDataMinions from './SkyBlockMemberPlayerDataMinions.js'; +import type SkyBlockMemberPlayerDataSkills from './SkyBlockMemberPlayerDataSkills.js'; +import type { SkyBlockArea, SkyBlockPotionEffectName } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberPlayerData', () => { + const data = new SkyBlockMemberPlayerData({ stats: 'meow' }, { farmingCap: 0, tamingCap: 0 }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberPlayerData); + expectTypeOf(data).toEqualTypeOf(); + expect(data.activeEffects).toBeDefined(); + expectTypeOf(data.activeEffects).toEqualTypeOf(); + expect(data.pausedEffects).toBeDefined(); + expectTypeOf(data.pausedEffects).toEqualTypeOf(); + expect(data.disabledPotionEffects).toBeDefined(); + expectTypeOf(data.disabledPotionEffects).toEqualTypeOf(); + expect(data.reaperPeppersEaten).toBeDefined(); + expectTypeOf(data.reaperPeppersEaten).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.lastDeath).toBeDefined(); + expectTypeOf(data.lastDeath).toEqualTypeOf(); + expect(data.visitedZones).toBeDefined(); + expectTypeOf(data.visitedZones).toEqualTypeOf(); + expect(data.visitedModes).toBeDefined(); + expectTypeOf(data.visitedModes).toEqualTypeOf(); + expect(data.achievementSpawnedIslandTypes).toBeDefined(); + expectTypeOf(data.achievementSpawnedIslandTypes).toEqualTypeOf(); + expect(data.unlockedCollTiers).toBeDefined(); + expectTypeOf(data.unlockedCollTiers).toEqualTypeOf(); + expect(data.perks).toBeDefined(); + expectTypeOf(data.perks).toEqualTypeOf>(); + expect(data.minions).toBeDefined(); + expectTypeOf(data.minions).toEqualTypeOf(); + expect(data.fastestTargetPractice).toBeDefined(); + expectTypeOf(data.fastestTargetPractice).toEqualTypeOf(); + expect(data.fishingTreasureCaught).toBeDefined(); + expectTypeOf(data.fishingTreasureCaught).toEqualTypeOf(); + expect(data.skills).toBeDefined(); + expectTypeOf(data.skills).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerData.ts b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerData.ts new file mode 100644 index 000000000..f5ddbad81 --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerData.ts @@ -0,0 +1,43 @@ +import SkyBlockMemberPlayerDataActiveEffect from './SkyBlockMemberPlayerDataActiveEffect.js'; +import SkyBlockMemberPlayerDataMinions from './SkyBlockMemberPlayerDataMinions.js'; +import SkyBlockMemberPlayerDataSkills from './SkyBlockMemberPlayerDataSkills.js'; +import type { SkyBlockArea, SkyBlockPotionEffectName } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberPlayerData { + activeEffects: SkyBlockMemberPlayerDataActiveEffect[]; + pausedEffects: SkyBlockPotionEffectName[]; + disabledPotionEffects: SkyBlockPotionEffectName[]; + reaperPeppersEaten: number; + deaths: number; + lastDeath: number; + visitedZones: string[]; + visitedModes: SkyBlockArea[]; + achievementSpawnedIslandTypes: string[]; + unlockedCollTiers: string[]; + perks: Record; + minions: SkyBlockMemberPlayerDataMinions; + fastestTargetPractice: number; + fishingTreasureCaught: number; + skills: SkyBlockMemberPlayerDataSkills; + constructor(data: Record, skillCaps: { farmingCap: number; tamingCap: number }) { + this.activeEffects = (data?.active_effects || []).map( + (effect: Record) => new SkyBlockMemberPlayerDataActiveEffect(effect) + ); + this.pausedEffects = data?.paused_effects || []; + this.disabledPotionEffects = data?.disabled_potion_effects || []; + this.reaperPeppersEaten = data?.reaper_peppers_eaten || 0; + this.deaths = data?.death_count || 0; + this.lastDeath = data?.last_death || 0; + this.visitedZones = data?.visited_zones || []; + this.visitedModes = data?.visited_modes || []; + this.achievementSpawnedIslandTypes = data?.achievement_spawned_island_types || []; + this.unlockedCollTiers = data?.unlocked_coll_tiers || []; + this.perks = data?.perks || {}; + this.minions = new SkyBlockMemberPlayerDataMinions(data?.crafted_generators || {}); + this.fastestTargetPractice = data?.fastest_target_practice || 0; + this.fishingTreasureCaught = data?.fishing_treasure_caught || 0; + this.skills = new SkyBlockMemberPlayerDataSkills(data?.experience || {}, skillCaps); + } +} + +export default SkyBlockMemberPlayerData; diff --git a/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataActiveEffect.test.ts b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataActiveEffect.test.ts new file mode 100644 index 000000000..1a48c7a64 --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataActiveEffect.test.ts @@ -0,0 +1,13 @@ +import SkyBlockMemberPlayerDataActiveEffect from './SkyBlockMemberPlayerDataActiveEffect.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberPlayerDataActiveEffect', () => { + const data = new SkyBlockMemberPlayerDataActiveEffect({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberPlayerDataActiveEffect); + expectTypeOf(data).toEqualTypeOf(); + expect(data.expireAt).toBeDefined(); + expectTypeOf(data.expireAt).toEqualTypeOf(); + expect(data.expireTimestamp).toBeDefined(); + expectTypeOf(data.expireTimestamp).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataActiveEffect.ts b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataActiveEffect.ts new file mode 100644 index 000000000..b93207c43 --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataActiveEffect.ts @@ -0,0 +1,16 @@ +import SkyBlockPotionEffect from '../../Potion/SkyBlockPotionEffect.js'; +import TicksToMilliseconds from '../../../../Utils/TicksToMilliseconds.js'; + +class SkyBlockMemberPlayerDataActiveEffect extends SkyBlockPotionEffect { + expireAt: Date; + expireTimestamp: number; + constructor(data: Record) { + super(data); + this.durationTicks = data?.ticks_remaining || 0; + this.duration = TicksToMilliseconds(this.durationTicks); + this.expireAt = new Date(new Date().getTime() + this.duration); + this.expireTimestamp = this.expireAt.getTime(); + } +} + +export default SkyBlockMemberPlayerDataActiveEffect; diff --git a/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataMinion.test.ts b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataMinion.test.ts new file mode 100644 index 000000000..b1ce99649 --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataMinion.test.ts @@ -0,0 +1,36 @@ +import SkyBlockMemberPlayerDataMinion from './SkyBlockMemberPlayerDataMinion.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { SkyBlockMinionName } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberPlayerDataMinion', () => { + const data = new SkyBlockMemberPlayerDataMinion([], 'ACACIA'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data).toEqualTypeOf(); + expect(data.minion).toBeDefined(); + expectTypeOf(data.minion).toEqualTypeOf(); + expect(data.tier1).toBeDefined(); + expectTypeOf(data.tier1).toEqualTypeOf(); + expect(data.tier2).toBeDefined(); + expectTypeOf(data.tier2).toEqualTypeOf(); + expect(data.tier3).toBeDefined(); + expectTypeOf(data.tier3).toEqualTypeOf(); + expect(data.tier4).toBeDefined(); + expectTypeOf(data.tier4).toEqualTypeOf(); + expect(data.tier5).toBeDefined(); + expectTypeOf(data.tier5).toEqualTypeOf(); + expect(data.tier6).toBeDefined(); + expectTypeOf(data.tier6).toEqualTypeOf(); + expect(data.tier7).toBeDefined(); + expectTypeOf(data.tier7).toEqualTypeOf(); + expect(data.tier8).toBeDefined(); + expectTypeOf(data.tier8).toEqualTypeOf(); + expect(data.tier9).toBeDefined(); + expectTypeOf(data.tier9).toEqualTypeOf(); + expect(data.tier10).toBeDefined(); + expectTypeOf(data.tier10).toEqualTypeOf(); + expect(data.tier11).toBeDefined(); + expectTypeOf(data.tier11).toEqualTypeOf(); + expect(data.tier12).toBeDefined(); + expectTypeOf(data.tier12).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataMinion.ts b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataMinion.ts new file mode 100644 index 000000000..f1f4a76e9 --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataMinion.ts @@ -0,0 +1,47 @@ +import type { SkyBlockMinion, SkyBlockMinionName } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberPlayerDataMinion { + minion: SkyBlockMinionName; + tier1: boolean; + tier2: boolean; + tier3: boolean; + tier4: boolean; + tier5: boolean; + tier6: boolean; + tier7: boolean; + tier8: boolean; + tier9: boolean; + tier10: boolean; + tier11: boolean; + tier12: boolean; + constructor(data: SkyBlockMinion[], minion: SkyBlockMinionName) { + this.minion = minion; + // this.tier1 = data.includes(`${minion}_1`) || false; + // this.tier2 = data.includes(`${minion}_2`) || false; + // this.tier3 = data.includes(`${minion}_3`) || false; + // this.tier4 = data.includes(`${minion}_4`) || false; + // this.tier5 = data.includes(`${minion}_5`) || false; + // this.tier6 = data.includes(`${minion}_6`) || false; + // this.tier7 = data.includes(`${minion}_7`) || false; + // this.tier8 = data.includes(`${minion}_8`) || false; + // this.tier9 = data.includes(`${minion}_9`) || false; + // this.tier10 = data.includes(`${minion}_10`) || false; + // this.tier11 = data.includes(`${minion}_11`) || false; + // this.tier12 = data.includes(`${minion}_12`) || false; + + this.tier1 = false; + this.tier2 = false; + this.tier3 = false; + this.tier4 = false; + this.tier5 = false; + this.tier6 = false; + this.tier7 = false; + this.tier8 = false; + this.tier9 = false; + this.tier10 = false; + this.tier11 = false; + this.tier12 = false; + } +} + +export default SkyBlockMemberPlayerDataMinion; diff --git a/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataMinions.test.ts b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataMinions.test.ts new file mode 100644 index 000000000..675d1c4e3 --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataMinions.test.ts @@ -0,0 +1,11 @@ +import SkyBlockMemberPlayerDataMinions from './SkyBlockMemberPlayerDataMinions.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberPlayerDataMinions', () => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + const data = new SkyBlockMemberPlayerDataMinions(); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberPlayerDataMinions); + expectTypeOf(data).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataMinions.ts b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataMinions.ts new file mode 100644 index 000000000..3bcc02174 --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataMinions.ts @@ -0,0 +1,127 @@ +import SkyBlockMemberPlayerDataMinion from './SkyBlockMemberPlayerDataMinion.js'; +import type { SkyBlockMinion } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberPlayerDataMinions { + acacia: SkyBlockMemberPlayerDataMinion; + birch: SkyBlockMemberPlayerDataMinion; + blaze: SkyBlockMemberPlayerDataMinion; + cactus: SkyBlockMemberPlayerDataMinion; + carrot: SkyBlockMemberPlayerDataMinion; + cavespider: SkyBlockMemberPlayerDataMinion; + chicken: SkyBlockMemberPlayerDataMinion; + clay: SkyBlockMemberPlayerDataMinion; + coal: SkyBlockMemberPlayerDataMinion; + cobblestone: SkyBlockMemberPlayerDataMinion; + cocoa: SkyBlockMemberPlayerDataMinion; + cow: SkyBlockMemberPlayerDataMinion; + creeper: SkyBlockMemberPlayerDataMinion; + darkOak: SkyBlockMemberPlayerDataMinion; + diamond: SkyBlockMemberPlayerDataMinion; + emerald: SkyBlockMemberPlayerDataMinion; + enderman: SkyBlockMemberPlayerDataMinion; + enderStone: SkyBlockMemberPlayerDataMinion; + fishing: SkyBlockMemberPlayerDataMinion; + flower: SkyBlockMemberPlayerDataMinion; + ghast: SkyBlockMemberPlayerDataMinion; + glowstone: SkyBlockMemberPlayerDataMinion; + gold: SkyBlockMemberPlayerDataMinion; + gravel: SkyBlockMemberPlayerDataMinion; + hardStone: SkyBlockMemberPlayerDataMinion; + ice: SkyBlockMemberPlayerDataMinion; + inferno: SkyBlockMemberPlayerDataMinion; + iron: SkyBlockMemberPlayerDataMinion; + jungle: SkyBlockMemberPlayerDataMinion; + lapis: SkyBlockMemberPlayerDataMinion; + magmaCube: SkyBlockMemberPlayerDataMinion; + melon: SkyBlockMemberPlayerDataMinion; + mithril: SkyBlockMemberPlayerDataMinion; + mushroom: SkyBlockMemberPlayerDataMinion; + mycelium: SkyBlockMemberPlayerDataMinion; + netherWart: SkyBlockMemberPlayerDataMinion; + oak: SkyBlockMemberPlayerDataMinion; + obsidian: SkyBlockMemberPlayerDataMinion; + pig: SkyBlockMemberPlayerDataMinion; + potato: SkyBlockMemberPlayerDataMinion; + pumpkin: SkyBlockMemberPlayerDataMinion; + quartz: SkyBlockMemberPlayerDataMinion; + rabbit: SkyBlockMemberPlayerDataMinion; + redstone: SkyBlockMemberPlayerDataMinion; + redSand: SkyBlockMemberPlayerDataMinion; + revenant: SkyBlockMemberPlayerDataMinion; + sand: SkyBlockMemberPlayerDataMinion; + sheep: SkyBlockMemberPlayerDataMinion; + skeleton: SkyBlockMemberPlayerDataMinion; + slime: SkyBlockMemberPlayerDataMinion; + snow: SkyBlockMemberPlayerDataMinion; + spider: SkyBlockMemberPlayerDataMinion; + spruce: SkyBlockMemberPlayerDataMinion; + sugarCane: SkyBlockMemberPlayerDataMinion; + tarantula: SkyBlockMemberPlayerDataMinion; + vampire: SkyBlockMemberPlayerDataMinion; + voidling: SkyBlockMemberPlayerDataMinion; + wheat: SkyBlockMemberPlayerDataMinion; + zombie: SkyBlockMemberPlayerDataMinion; + constructor(data: SkyBlockMinion[]) { + this.acacia = new SkyBlockMemberPlayerDataMinion(data || [], 'ACACIA'); + this.birch = new SkyBlockMemberPlayerDataMinion(data || [], 'BIRCH'); + this.blaze = new SkyBlockMemberPlayerDataMinion(data || [], 'BLAZE'); + this.cactus = new SkyBlockMemberPlayerDataMinion(data || [], 'CACTUS'); + this.carrot = new SkyBlockMemberPlayerDataMinion(data || [], 'CARROT'); + this.cavespider = new SkyBlockMemberPlayerDataMinion(data || [], 'CAVESPIDER'); + this.chicken = new SkyBlockMemberPlayerDataMinion(data || [], 'CHICKEN'); + this.clay = new SkyBlockMemberPlayerDataMinion(data || [], 'CLAY'); + this.coal = new SkyBlockMemberPlayerDataMinion(data || [], 'COAL'); + this.cobblestone = new SkyBlockMemberPlayerDataMinion(data || [], 'COBBLESTONE'); + this.cocoa = new SkyBlockMemberPlayerDataMinion(data || [], 'COCOA'); + this.cow = new SkyBlockMemberPlayerDataMinion(data || [], 'COW'); + this.creeper = new SkyBlockMemberPlayerDataMinion(data || [], 'CREEPER'); + this.darkOak = new SkyBlockMemberPlayerDataMinion(data || [], 'DARK_OAK'); + this.diamond = new SkyBlockMemberPlayerDataMinion(data || [], 'DIAMOND'); + this.emerald = new SkyBlockMemberPlayerDataMinion(data || [], 'EMERALD'); + this.enderman = new SkyBlockMemberPlayerDataMinion(data || [], 'ENDERMAN'); + this.enderStone = new SkyBlockMemberPlayerDataMinion(data || [], 'ENDER_STONE'); + this.fishing = new SkyBlockMemberPlayerDataMinion(data || [], 'FISHING'); + this.flower = new SkyBlockMemberPlayerDataMinion(data || [], 'FLOWER'); + this.ghast = new SkyBlockMemberPlayerDataMinion(data || [], 'GHAST'); + this.glowstone = new SkyBlockMemberPlayerDataMinion(data || [], 'GLOWSTONE'); + this.gold = new SkyBlockMemberPlayerDataMinion(data || [], 'GOLD'); + this.gravel = new SkyBlockMemberPlayerDataMinion(data || [], 'GRAVEL'); + this.hardStone = new SkyBlockMemberPlayerDataMinion(data || [], 'HARD_STONE'); + this.ice = new SkyBlockMemberPlayerDataMinion(data || [], 'ICE'); + this.inferno = new SkyBlockMemberPlayerDataMinion(data || [], 'INFERNO'); + this.iron = new SkyBlockMemberPlayerDataMinion(data || [], 'IRON'); + this.jungle = new SkyBlockMemberPlayerDataMinion(data || [], 'JUNGLE'); + this.lapis = new SkyBlockMemberPlayerDataMinion(data || [], 'LAPIS'); + this.magmaCube = new SkyBlockMemberPlayerDataMinion(data || [], 'MAGMA_CUBE'); + this.melon = new SkyBlockMemberPlayerDataMinion(data || [], 'MELON'); + this.mithril = new SkyBlockMemberPlayerDataMinion(data || [], 'MITHRIL'); + this.mushroom = new SkyBlockMemberPlayerDataMinion(data || [], 'MUSHROOM'); + this.mycelium = new SkyBlockMemberPlayerDataMinion(data || [], 'MYCELIUM'); + this.netherWart = new SkyBlockMemberPlayerDataMinion(data || [], 'NETHER_WARTS'); + this.oak = new SkyBlockMemberPlayerDataMinion(data || [], 'OAK'); + this.obsidian = new SkyBlockMemberPlayerDataMinion(data || [], 'OBSIDIAN'); + this.pig = new SkyBlockMemberPlayerDataMinion(data || [], 'PIG'); + this.potato = new SkyBlockMemberPlayerDataMinion(data || [], 'POTATO'); + this.pumpkin = new SkyBlockMemberPlayerDataMinion(data || [], 'PUMPKIN'); + this.quartz = new SkyBlockMemberPlayerDataMinion(data || [], 'QUARTZ'); + this.rabbit = new SkyBlockMemberPlayerDataMinion(data || [], 'RABBIT'); + this.redstone = new SkyBlockMemberPlayerDataMinion(data || [], 'REDSTONE'); + this.redSand = new SkyBlockMemberPlayerDataMinion(data || [], 'RED_SAND'); + this.revenant = new SkyBlockMemberPlayerDataMinion(data || [], 'REVENANT'); + this.sand = new SkyBlockMemberPlayerDataMinion(data || [], 'SAND'); + this.sheep = new SkyBlockMemberPlayerDataMinion(data || [], 'SHEEP'); + this.skeleton = new SkyBlockMemberPlayerDataMinion(data || [], 'SKELETON'); + this.slime = new SkyBlockMemberPlayerDataMinion(data || [], 'SLIME'); + this.snow = new SkyBlockMemberPlayerDataMinion(data || [], 'SNOW'); + this.spider = new SkyBlockMemberPlayerDataMinion(data || [], 'SPIDER'); + this.spruce = new SkyBlockMemberPlayerDataMinion(data || [], 'SPRUCE'); + this.sugarCane = new SkyBlockMemberPlayerDataMinion(data || [], 'SUGAR_CANE'); + this.tarantula = new SkyBlockMemberPlayerDataMinion(data || [], 'TARANTULA'); + this.vampire = new SkyBlockMemberPlayerDataMinion(data || [], 'VAMPIRE'); + this.voidling = new SkyBlockMemberPlayerDataMinion(data || [], 'VOIDLING'); + this.wheat = new SkyBlockMemberPlayerDataMinion(data || [], 'WHEAT'); + this.zombie = new SkyBlockMemberPlayerDataMinion(data || [], 'ZOMBIE'); + } +} + +export default SkyBlockMemberPlayerDataMinions; diff --git a/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataSkills.test.ts b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataSkills.test.ts new file mode 100644 index 000000000..29560ce1f --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataSkills.test.ts @@ -0,0 +1,32 @@ +import SkyBlockMemberPlayerDataSkills from './SkyBlockMemberPlayerDataSkills.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { SkillLevelData } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberPlayerDataSkills', () => { + const data = new SkyBlockMemberPlayerDataSkills({ stats: 'meow' }, { farmingCap: 0, tamingCap: 0 }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberPlayerDataSkills); + expectTypeOf(data).toEqualTypeOf(); + expect(data.fishing).toBeDefined(); + expectTypeOf(data.fishing).toEqualTypeOf(); + expect(data.alchemy).toBeDefined(); + expectTypeOf(data.alchemy).toEqualTypeOf(); + expect(data.runecrafting).toBeDefined(); + expectTypeOf(data.runecrafting).toEqualTypeOf(); + expect(data.mining).toBeDefined(); + expectTypeOf(data.mining).toEqualTypeOf(); + expect(data.farming).toBeDefined(); + expectTypeOf(data.farming).toEqualTypeOf(); + expect(data.enchanting).toBeDefined(); + expectTypeOf(data.enchanting).toEqualTypeOf(); + expect(data.taming).toBeDefined(); + expectTypeOf(data.taming).toEqualTypeOf(); + expect(data.foraging).toBeDefined(); + expectTypeOf(data.foraging).toEqualTypeOf(); + expect(data.social).toBeDefined(); + expectTypeOf(data.social).toEqualTypeOf(); + expect(data.carpentry).toBeDefined(); + expectTypeOf(data.carpentry).toEqualTypeOf(); + expect(data.combat).toBeDefined(); + expectTypeOf(data.combat).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataSkills.ts b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataSkills.ts new file mode 100644 index 000000000..bd5c80130 --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataSkills.ts @@ -0,0 +1,61 @@ +import { getLevelByXp } from '../../../../Utils/SkyBlockUtils.js'; +import type { SkillLevelData } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberPlayerDataSkills { + fishing: SkillLevelData; + alchemy: SkillLevelData; + runecrafting: SkillLevelData; + mining: SkillLevelData; + farming: SkillLevelData; + enchanting: SkillLevelData; + taming: SkillLevelData; + foraging: SkillLevelData; + social: SkillLevelData; + carpentry: SkillLevelData; + combat: SkillLevelData; + average: number; + nonCosmeticAverage: number; + constructor(data: Record, skillCaps: { farmingCap: number; tamingCap: number }) { + this.fishing = getLevelByXp(data?.SKILL_FISHING || 0, { type: 'fishing' }); + this.alchemy = getLevelByXp(data?.SKILL_ALCHEMY || 0, { type: 'alchemy' }); + this.runecrafting = getLevelByXp(data?.SKILL_RUNECRAFTING || 0, { type: 'runecrafting' }); + this.mining = getLevelByXp(data?.SKILL_MINING || 0, { type: 'mining' }); + this.farming = getLevelByXp(data?.SKILL_FARMING || 0, { type: 'farming', cap: 50 + skillCaps.farmingCap }); + this.enchanting = getLevelByXp(data?.SKILL_ENCHANTING || 0, { type: 'enchanting' }); + this.taming = getLevelByXp(data?.SKILL_TAMING || 0, { type: 'taming', cap: 50 + skillCaps.tamingCap }); + this.foraging = getLevelByXp(data?.SKILL_FORAGING || 0, { type: 'foraging' }); + this.social = getLevelByXp(data?.SKILL_SOCIAL || 0, { type: 'social' }); + this.carpentry = getLevelByXp(data?.SKILL_CARPENTRY || 0, { type: 'carpentry' }); + this.combat = getLevelByXp(data?.SKILL_COMBAT || 0, { type: 'combat' }); + this.average = + (this.fishing.level + + this.alchemy.level + + this.runecrafting.level + + this.mining.level + + this.farming.level + + this.enchanting.level + + this.taming.level + + this.foraging.level + + this.social.level + + this.carpentry.level + + this.combat.level) / + 11; + this.nonCosmeticAverage = + (this.fishing.level + + this.alchemy.level + + this.mining.level + + this.farming.level + + this.enchanting.level + + this.taming.level + + this.foraging.level + + this.carpentry.level + + this.combat.level) / + 9; + } + + toString(): number { + return this.average; + } +} + +export default SkyBlockMemberPlayerDataSkills; diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStats.test.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStats.test.ts new file mode 100644 index 000000000..024543d76 --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStats.test.ts @@ -0,0 +1,42 @@ +import SkyBlockMemberPlayerStats from './SkyBlockMemberPlayerStats.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockMemberPlayerStatsAuctions from './SkyBlockMemberPlayerStatsAuctions.js'; +import type SkyBlockMemberPlayerStatsCandy from './SkyBlockMemberPlayerStatsCandy.js'; +import type SkyBlockMemberPlayerStatsEndIsland from './SkyBlockMemberPlayerStatsEndIsland.js'; +import type SkyBlockMemberPlayerStatsFishing from './SkyBlockMemberPlayerStatsFishing.js'; +import type SkyBlockMemberPlayerStatsGifts from './SkyBlockMemberPlayerStatsGifts.js'; +import type SkyBlockMemberPlayerStatsMythos from './SkyBlockMemberPlayerStatsMythos.js'; +import type SkyBlockMemberPlayerStatsWinter from './SkyBlockMemberPlayerStatsWinter.js'; + +test('SkyBlockMemberPlayerStats', () => { + const data = new SkyBlockMemberPlayerStats({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberPlayerStats); + expectTypeOf(data).toEqualTypeOf(); + expect(data.fishing).toBeDefined(); + expectTypeOf(data.fishing).toEqualTypeOf(); + expect(data.glowingMushroomsBroken).toBeDefined(); + expectTypeOf(data.glowingMushroomsBroken).toEqualTypeOf(); + expect(data.highestDamage).toBeDefined(); + expectTypeOf(data.highestDamage).toEqualTypeOf(); + expect(data.highestCriticalDamage).toBeDefined(); + expectTypeOf(data.highestCriticalDamage).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expectTypeOf(data.kills).toEqualTypeOf>(); + expect(data.deaths).toBeDefined(); + expectTypeOf(data.deaths).toEqualTypeOf>(); + expect(data.auctions).toBeDefined(); + expectTypeOf(data.auctions).toEqualTypeOf(); + expect(data.candy).toBeDefined(); + expectTypeOf(data.candy).toEqualTypeOf(); + expect(data.gifts).toBeDefined(); + expectTypeOf(data.gifts).toEqualTypeOf(); + expect(data.mythos).toBeDefined(); + expectTypeOf(data.mythos).toEqualTypeOf(); + expect(data.winter).toBeDefined(); + expectTypeOf(data.winter).toEqualTypeOf(); + expect(data.endIsland).toBeDefined(); + expectTypeOf(data.endIsland).toEqualTypeOf(); + expect(data.races).toBeDefined(); + expectTypeOf(data.races).toEqualTypeOf>>(); +}); diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStats.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStats.ts new file mode 100644 index 000000000..9de598b83 --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStats.ts @@ -0,0 +1,60 @@ +import SkyBlockMemberPlayerStatsAuctions from './SkyBlockMemberPlayerStatsAuctions.js'; +import SkyBlockMemberPlayerStatsCandy from './SkyBlockMemberPlayerStatsCandy.js'; +import SkyBlockMemberPlayerStatsEndIsland from './SkyBlockMemberPlayerStatsEndIsland.js'; +import SkyBlockMemberPlayerStatsFishing from './SkyBlockMemberPlayerStatsFishing.js'; +import SkyBlockMemberPlayerStatsGifts from './SkyBlockMemberPlayerStatsGifts.js'; +import SkyBlockMemberPlayerStatsMythos from './SkyBlockMemberPlayerStatsMythos.js'; +import SkyBlockMemberPlayerStatsWinter from './SkyBlockMemberPlayerStatsWinter.js'; + +class SkyBlockMemberPlayerStats { + fishing: SkyBlockMemberPlayerStatsFishing; + glowingMushroomsBroken: number; + highestDamage: number; + highestCriticalDamage: number; + kills: Record; + deaths: Record; + auctions: SkyBlockMemberPlayerStatsAuctions; + candy: SkyBlockMemberPlayerStatsCandy; + gifts: SkyBlockMemberPlayerStatsGifts; + mythos: SkyBlockMemberPlayerStatsMythos; + winter: SkyBlockMemberPlayerStatsWinter; + endIsland: SkyBlockMemberPlayerStatsEndIsland; + races: Record>; + constructor(data: Record) { + this.fishing = new SkyBlockMemberPlayerStatsFishing({ + seaCreatureKills: data?.sea_creature_kills || 0, + ...(data?.items_fished || {}) + }); + this.glowingMushroomsBroken = data?.glowing_mushrooms_broken || 0; + this.highestDamage = data?.highest_damage || 0; + this.highestCriticalDamage = data?.highest_critical_damage || 0; + this.kills = { + total: Object.values(data?.kills || {}).reduce((acc: any, curr) => acc + curr, 0) as number, + ...Object.keys(data?.kills || {}) + .filter((key) => 'total' !== key) + .sort((a, b) => data?.kills[b] - data?.kills[a]) + .map((key) => ({ [key]: data?.kills[key] })) + .reduce((acc, curr) => ({ ...acc, ...curr }), {}) + }; + this.deaths = { + total: Object.values(data?.deaths || {}).reduce((acc: any, curr) => acc + curr, 0) as number, + ...Object.keys(data?.deaths || {}) + .filter((key) => 'total' !== key) + .sort((a, b) => data?.deaths[b] - data?.deaths[a]) + .map((key) => ({ [key]: data?.deaths[key] })) + .reduce((acc, curr) => ({ ...acc, ...curr }), {}) + }; + this.auctions = new SkyBlockMemberPlayerStatsAuctions(data?.auctions || {}); + this.candy = new SkyBlockMemberPlayerStatsCandy({ + ...(data?.candy_collected || {}), + ...(data?.spooky?.bats_spawned || {}) + }); + this.gifts = new SkyBlockMemberPlayerStatsGifts(data?.gifts || {}); + this.mythos = new SkyBlockMemberPlayerStatsMythos(data?.mythos || {}); + this.winter = new SkyBlockMemberPlayerStatsWinter(data?.winter || {}); + this.endIsland = new SkyBlockMemberPlayerStatsEndIsland(data?.end_island || {}); + this.races = data?.races || {}; + } +} + +export default SkyBlockMemberPlayerStats; diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsAuctions.test.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsAuctions.test.ts new file mode 100644 index 000000000..805119925 --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsAuctions.test.ts @@ -0,0 +1,32 @@ +import SkyBlockMemberPlayerStatsAuctions from './SkyBlockMemberPlayerStatsAuctions.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockMemberPlayerStatsAuctionsStats from './SkyBlockMemberPlayerStatsAuctionsStats.js'; + +test('SkyBlockMemberPlayerStatsAuctions', () => { + const data = new SkyBlockMemberPlayerStatsAuctions({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberPlayerStatsAuctions); + expectTypeOf(data).toEqualTypeOf(); + expect(data.bids).toBeDefined(); + expectTypeOf(data.bids).toEqualTypeOf(); + expect(data.highestBid).toBeDefined(); + expectTypeOf(data.highestBid).toEqualTypeOf(); + expect(data.won).toBeDefined(); + expectTypeOf(data.won).toEqualTypeOf(); + expect(data.goldSpent).toBeDefined(); + expectTypeOf(data.goldSpent).toEqualTypeOf(); + expect(data.created).toBeDefined(); + expectTypeOf(data.created).toEqualTypeOf(); + expect(data.fees).toBeDefined(); + expectTypeOf(data.fees).toEqualTypeOf(); + expect(data.completed).toBeDefined(); + expectTypeOf(data.completed).toEqualTypeOf(); + expect(data.goldEarned).toBeDefined(); + expectTypeOf(data.goldEarned).toEqualTypeOf(); + expect(data.noBids).toBeDefined(); + expectTypeOf(data.noBids).toEqualTypeOf(); + expect(data.auctionsSold).toBeDefined(); + expectTypeOf(data.auctionsSold).toEqualTypeOf(); + expect(data.auctionsBought).toBeDefined(); + expectTypeOf(data.auctionsBought).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsAuctions.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsAuctions.ts new file mode 100644 index 000000000..d7304ebe2 --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsAuctions.ts @@ -0,0 +1,30 @@ +import SkyBlockMemberPlayerStatsAuctionsStats from './SkyBlockMemberPlayerStatsAuctionsStats.js'; + +class SkyBlockMemberPlayerStatsAuctions { + bids: number; + highestBid: number; + won: number; + goldSpent: number; + created: number; + fees: number; + completed: number; + goldEarned: number; + noBids: number; + auctionsSold: SkyBlockMemberPlayerStatsAuctionsStats; + auctionsBought: SkyBlockMemberPlayerStatsAuctionsStats; + constructor(data: Record) { + this.bids = data?.bids || 0; + this.highestBid = data?.highest_bid || 0; + this.won = data?.won || 0; + this.goldSpent = data?.gold_spent || 0; + this.created = data?.created || 0; + this.fees = data?.fees || 0; + this.completed = data?.completed || 0; + this.goldEarned = data?.gold_earned || 0; + this.noBids = data?.no_bids || 0; + this.auctionsSold = new SkyBlockMemberPlayerStatsAuctionsStats(data?.total_sold || {}); + this.auctionsBought = new SkyBlockMemberPlayerStatsAuctionsStats(data?.total_bought || {}); + } +} + +export default SkyBlockMemberPlayerStatsAuctions; diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsAuctionsStats.test.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsAuctionsStats.test.ts new file mode 100644 index 000000000..ccdf52bcc --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsAuctionsStats.test.ts @@ -0,0 +1,25 @@ +import SkyBlockMemberPlayerStatsAuctionsStats from './SkyBlockMemberPlayerStatsAuctionsStats.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberPlayerStatsAuctionsStats', () => { + const data = new SkyBlockMemberPlayerStatsAuctionsStats({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberPlayerStatsAuctionsStats); + expectTypeOf(data).toEqualTypeOf(); + expect(data.common).toBeDefined(); + expectTypeOf(data.common).toEqualTypeOf(); + expect(data.uncommon).toBeDefined(); + expectTypeOf(data.uncommon).toEqualTypeOf(); + expect(data.rare).toBeDefined(); + expectTypeOf(data.rare).toEqualTypeOf(); + expect(data.epic).toBeDefined(); + expectTypeOf(data.epic).toEqualTypeOf(); + expect(data.legendary).toBeDefined(); + expectTypeOf(data.legendary).toEqualTypeOf(); + expect(data.special).toBeDefined(); + expectTypeOf(data.special).toEqualTypeOf(); + expect(data.mythic).toBeDefined(); + expectTypeOf(data.mythic).toEqualTypeOf(); + expect(data.total).toBeDefined(); + expectTypeOf(data.total).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsAuctionsStats.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsAuctionsStats.ts new file mode 100644 index 000000000..cbf4f0d29 --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsAuctionsStats.ts @@ -0,0 +1,26 @@ +class SkyBlockMemberPlayerStatsAuctionsStats { + common: number; + uncommon: number; + rare: number; + epic: number; + legendary: number; + special: number; + mythic: number; + total: number; + constructor(data: Record) { + this.common = data?.COMMON || 0; + this.uncommon = data?.UNCOMMON || 0; + this.rare = data?.RARE || 0; + this.epic = data?.EPIC || 0; + this.legendary = data?.LEGENDARY || 0; + this.special = data?.SPECIAL || 0; + this.mythic = data?.MYTHIC || 0; + this.total = this.common + this.uncommon + this.rare + this.epic + this.legendary + this.special + this.mythic; + } + + toString(): number { + return this.total; + } +} + +export default SkyBlockMemberPlayerStatsAuctionsStats; diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsCandy.test.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsCandy.test.ts new file mode 100644 index 000000000..6cc015514 --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsCandy.test.ts @@ -0,0 +1,20 @@ +import SkyBlockMemberPlayerStatsCandy from './SkyBlockMemberPlayerStatsCandy.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockMemberPlayerStatsSpookyFestival from './SkyBlockMemberPlayerStatsSpookyFestival.js'; + +test('SkyBlockMemberPlayerStatsCandy', () => { + const data = new SkyBlockMemberPlayerStatsCandy({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberPlayerStatsCandy); + expectTypeOf(data).toEqualTypeOf(); + expect(data.green).toBeDefined(); + expectTypeOf(data.green).toEqualTypeOf(); + expect(data.purple).toBeDefined(); + expectTypeOf(data.purple).toEqualTypeOf(); + expect(data.total).toBeDefined(); + expectTypeOf(data.total).toEqualTypeOf(); + expect(data.batsSpawned).toBeDefined(); + expectTypeOf(data.batsSpawned).toEqualTypeOf>(); + expect(data.festivals).toBeDefined(); + expectTypeOf(data.festivals).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsCandy.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsCandy.ts new file mode 100644 index 000000000..51e53dc43 --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsCandy.ts @@ -0,0 +1,28 @@ +import SkyBlockMemberPlayerStatsSpookyFestival from './SkyBlockMemberPlayerStatsSpookyFestival.js'; + +class SkyBlockMemberPlayerStatsCandy { + green: number; + purple: number; + total: number; + batsSpawned: Record; + festivals: SkyBlockMemberPlayerStatsSpookyFestival[]; + constructor(data: Record) { + this.green = data?.green_candy || 0; + this.purple = data?.purple_candy || 0; + this.total = this.green + this.purple; + this.batsSpawned = data?.bats_spawned || {}; + this.festivals = Object.keys(data || {}) + .filter((key) => key.startsWith('spooky_festival_')) + .map( + (key) => + new SkyBlockMemberPlayerStatsSpookyFestival(data?.[key], Number(key.split('spooky_festival_')[1] || '0')) + ) + .sort((a, b) => a.year - b.year); + } + + toString(): number { + return this.total; + } +} + +export default SkyBlockMemberPlayerStatsCandy; diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIsland.test.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIsland.test.ts new file mode 100644 index 000000000..43916eeda --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIsland.test.ts @@ -0,0 +1,16 @@ +import SkyBlockMemberPlayerStatsEndIsland from './SkyBlockMemberPlayerStatsEndIsland.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockMemberPlayerStatsEndIslandDragonFight from './SkyBlockMemberPlayerStatsEndIslandDragonFight.js'; + +test('SkyBlockMemberPlayerStatsEndIsland', () => { + const data = new SkyBlockMemberPlayerStatsEndIsland({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberPlayerStatsEndIsland); + expectTypeOf(data).toEqualTypeOf(); + expect(data.dragonFight).toBeDefined(); + expectTypeOf(data.dragonFight).toEqualTypeOf(); + expect(data.summoningEyesCollected).toBeDefined(); + expectTypeOf(data.summoningEyesCollected).toEqualTypeOf(); + expect(data.specialZealotLootCollected).toBeDefined(); + expectTypeOf(data.specialZealotLootCollected).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIsland.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIsland.ts new file mode 100644 index 000000000..efb67f54b --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIsland.ts @@ -0,0 +1,14 @@ +import SkyBlockMemberPlayerStatsEndIslandDragonFight from './SkyBlockMemberPlayerStatsEndIslandDragonFight.js'; + +class SkyBlockMemberPlayerStatsEndIsland { + dragonFight: SkyBlockMemberPlayerStatsEndIslandDragonFight; + summoningEyesCollected: number; + specialZealotLootCollected: number; + constructor(data: Record) { + this.dragonFight = new SkyBlockMemberPlayerStatsEndIslandDragonFight(data?.dragon_fight || {}); + this.summoningEyesCollected = data?.summoning_eyes_collected || 0; + this.specialZealotLootCollected = data?.special_zealot_loot_collected || 0; + } +} + +export default SkyBlockMemberPlayerStatsEndIsland; diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFight.test.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFight.test.ts new file mode 100644 index 000000000..c217b48df --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFight.test.ts @@ -0,0 +1,9 @@ +import SkyBlockMemberPlayerStatsEndIslandDragonFight from './SkyBlockMemberPlayerStatsEndIslandDragonFight.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberPlayerStatsEndIslandDragonFight', () => { + const data = new SkyBlockMemberPlayerStatsEndIslandDragonFight({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberPlayerStatsEndIslandDragonFight); + expectTypeOf(data).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFight.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFight.ts new file mode 100644 index 000000000..d7b100d34 --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFight.ts @@ -0,0 +1,25 @@ +// eslint-disable-next-line max-len +import SkyBlockMemberPlayerStatsEndIslandDragonFightDragon from './SkyBlockMemberPlayerStatsEndIslandDragonFightDragon.js'; + +class SkyBlockMemberPlayerStatsEndIslandDragonFight { + enderCrystalsDestroyed: number; + protector: SkyBlockMemberPlayerStatsEndIslandDragonFightDragon; + old: SkyBlockMemberPlayerStatsEndIslandDragonFightDragon; + unstable: SkyBlockMemberPlayerStatsEndIslandDragonFightDragon; + young: SkyBlockMemberPlayerStatsEndIslandDragonFightDragon; + strong: SkyBlockMemberPlayerStatsEndIslandDragonFightDragon; + wise: SkyBlockMemberPlayerStatsEndIslandDragonFightDragon; + superior: SkyBlockMemberPlayerStatsEndIslandDragonFightDragon; + constructor(data: Record) { + this.enderCrystalsDestroyed = data?.ender_crystals_destroyed || 0; + this.protector = new SkyBlockMemberPlayerStatsEndIslandDragonFightDragon(data || {}, 'protector'); + this.old = new SkyBlockMemberPlayerStatsEndIslandDragonFightDragon(data || {}, 'old'); + this.unstable = new SkyBlockMemberPlayerStatsEndIslandDragonFightDragon(data || {}, 'unstable'); + this.young = new SkyBlockMemberPlayerStatsEndIslandDragonFightDragon(data || {}, 'young'); + this.strong = new SkyBlockMemberPlayerStatsEndIslandDragonFightDragon(data || {}, 'strong'); + this.wise = new SkyBlockMemberPlayerStatsEndIslandDragonFightDragon(data || {}, 'wise'); + this.superior = new SkyBlockMemberPlayerStatsEndIslandDragonFightDragon(data || {}, 'superior'); + } +} + +export default SkyBlockMemberPlayerStatsEndIslandDragonFight; diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFightDragon.test.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFightDragon.test.ts new file mode 100644 index 000000000..9f23feb01 --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFightDragon.test.ts @@ -0,0 +1,20 @@ +// eslint-disable-next-line max-len +import SkyBlockMemberPlayerStatsEndIslandDragonFightDragon from './SkyBlockMemberPlayerStatsEndIslandDragonFightDragon.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberPlayerStatsEndIslandDragonFightDragon', () => { + const data = new SkyBlockMemberPlayerStatsEndIslandDragonFightDragon({ stats: 'meow' }, 'protector'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberPlayerStatsEndIslandDragonFightDragon); + expectTypeOf(data).toEqualTypeOf(); + expect(data.mostDamage).toBeDefined(); + expectTypeOf(data.mostDamage).toEqualTypeOf(); + expect(data.highestRank).toBeDefined(); + expectTypeOf(data.highestRank).toEqualTypeOf(); + expect(data.fastestKill).toBeDefined(); + expectTypeOf(data.fastestKill).toEqualTypeOf(); + expect(data.amountSummoned).toBeDefined(); + expectTypeOf(data.amountSummoned).toEqualTypeOf(); + expect(data.summoningEyesContributed).toBeDefined(); + expectTypeOf(data.summoningEyesContributed).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFightDragon.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFightDragon.ts new file mode 100644 index 000000000..6bb28d6d2 --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFightDragon.ts @@ -0,0 +1,22 @@ +import type { SkyBlockDragon } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberPlayerStatsEndIslandDragonFightDragon { + mostDamage: number; + highestRank: number; + fastestKill: number; + amountSummoned: number; + summoningEyesContributed: number; + constructor(data: Record, dragon: SkyBlockDragon) { + this.mostDamage = data?.most_damage?.[dragon] || 0; + this.highestRank = data?.highest_rank?.[dragon] || 0; + this.fastestKill = data?.fastest_kill?.[dragon] || 0; + this.amountSummoned = data?.amount_summoned?.[dragon] || 0; + this.summoningEyesContributed = data?.summoning_eyes_contributed?.[dragon] || 0; + } + + toString(): number { + return this.amountSummoned; + } +} + +export default SkyBlockMemberPlayerStatsEndIslandDragonFightDragon; diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsFishing.test.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsFishing.test.ts new file mode 100644 index 000000000..06cfae7d6 --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsFishing.test.ts @@ -0,0 +1,21 @@ +import SkyBlockMemberPlayerStatsFishing from './SkyBlockMemberPlayerStatsFishing.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberPlayerStatsFishing', () => { + const data = new SkyBlockMemberPlayerStatsFishing({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberPlayerStatsFishing); + expectTypeOf(data).toEqualTypeOf(); + expect(data.seaCreaturesKills).toBeDefined(); + expectTypeOf(data.seaCreaturesKills).toEqualTypeOf(); + expect(data.normal).toBeDefined(); + expectTypeOf(data.normal).toEqualTypeOf(); + expect(data.treasure).toBeDefined(); + expectTypeOf(data.treasure).toEqualTypeOf(); + expect(data.largeTreasure).toBeDefined(); + expectTypeOf(data.largeTreasure).toEqualTypeOf(); + expect(data.trophyFish).toBeDefined(); + expectTypeOf(data.trophyFish).toEqualTypeOf(); + expect(data.total).toBeDefined(); + expectTypeOf(data.total).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsFishing.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsFishing.ts new file mode 100644 index 000000000..bce29e876 --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsFishing.ts @@ -0,0 +1,22 @@ +class SkyBlockMemberPlayerStatsFishing { + seaCreaturesKills: number; + normal: number; + treasure: number; + largeTreasure: number; + trophyFish: number; + total: number; + constructor(data: Record) { + this.seaCreaturesKills = data?.seaCreatureKills || 0; + this.normal = data?.normal || 0; + this.treasure = data?.treasure || 0; + this.largeTreasure = data?.large_treasure || 0; + this.trophyFish = data?.trophy_fish || 0; + this.total = this.normal + this.treasure + this.largeTreasure + this.trophyFish; + } + + toString(): number { + return this.total; + } +} + +export default SkyBlockMemberPlayerStatsFishing; diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsGifts.test.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsGifts.test.ts new file mode 100644 index 000000000..38f9d2f55 --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsGifts.test.ts @@ -0,0 +1,13 @@ +import SkyBlockMemberPlayerStatsGifts from './SkyBlockMemberPlayerStatsGifts.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberPlayerStatsGifts', () => { + const data = new SkyBlockMemberPlayerStatsGifts({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberPlayerStatsGifts); + expectTypeOf(data).toEqualTypeOf(); + expect(data.received).toBeDefined(); + expectTypeOf(data.received).toEqualTypeOf(); + expect(data.given).toBeDefined(); + expectTypeOf(data.given).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsGifts.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsGifts.ts new file mode 100644 index 000000000..5b2094b5f --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsGifts.ts @@ -0,0 +1,16 @@ +class SkyBlockMemberPlayerStatsGifts { + received: number; + given: number; + total: number; + constructor(data: Record) { + this.received = data?.total_received || 0; + this.given = data?.total_given || 0; + this.total = this.received + this.given; + } + + toString(): number { + return this.total; + } +} + +export default SkyBlockMemberPlayerStatsGifts; diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsMythos.test.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsMythos.test.ts new file mode 100644 index 000000000..accc60a1d --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsMythos.test.ts @@ -0,0 +1,19 @@ +import SkyBlockMemberPlayerStatsMythos from './SkyBlockMemberPlayerStatsMythos.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberPlayerStatsMythos', () => { + const data = new SkyBlockMemberPlayerStatsMythos({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberPlayerStatsMythos); + expectTypeOf(data).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.burrowsDugNext).toBeDefined(); + expectTypeOf(data.burrowsDugNext).toEqualTypeOf(); + expect(data.burrowsDugCombat).toBeDefined(); + expectTypeOf(data.burrowsDugCombat).toEqualTypeOf(); + expect(data.burrowsDugTreasure).toBeDefined(); + expectTypeOf(data.burrowsDugTreasure).toEqualTypeOf(); + expect(data.burrowsChainsComplete).toBeDefined(); + expectTypeOf(data.burrowsChainsComplete).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsMythos.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsMythos.ts new file mode 100644 index 000000000..f221acd4a --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsMythos.ts @@ -0,0 +1,20 @@ +class SkyBlockMemberPlayerStatsMythos { + kills: number; + burrowsDugNext: number; + burrowsDugCombat: number; + burrowsDugTreasure: number; + burrowsChainsComplete: number; + constructor(data: Record) { + this.kills = data?.kills || 0; + this.burrowsDugNext = data?.burrows_dug_next?.total || 0; + this.burrowsDugCombat = data?.burrows_dug_combat?.total || 0; + this.burrowsDugTreasure = data?.burrows_dug_treasure?.total || 0; + this.burrowsChainsComplete = data?.burrows_chains_complete?.total || 0; + } + + toString(): number { + return this.kills; + } +} + +export default SkyBlockMemberPlayerStatsMythos; diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsSpookyFestival.test.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsSpookyFestival.test.ts new file mode 100644 index 000000000..7defad936 --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsSpookyFestival.test.ts @@ -0,0 +1,17 @@ +import SkyBlockMemberPlayerStatsSpookyFestival from './SkyBlockMemberPlayerStatsSpookyFestival.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberPlayerStatsSpookyFestival', () => { + const data = new SkyBlockMemberPlayerStatsSpookyFestival({ stats: 'meow' }, 1); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberPlayerStatsSpookyFestival); + expectTypeOf(data).toEqualTypeOf(); + expect(data.year).toBeDefined(); + expectTypeOf(data.year).toEqualTypeOf(); + expect(data.green).toBeDefined(); + expectTypeOf(data.green).toEqualTypeOf(); + expect(data.purple).toBeDefined(); + expectTypeOf(data.purple).toEqualTypeOf(); + expect(data.total).toBeDefined(); + expectTypeOf(data.total).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsSpookyFestival.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsSpookyFestival.ts new file mode 100644 index 000000000..f502710be --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsSpookyFestival.ts @@ -0,0 +1,18 @@ +class SkyBlockMemberPlayerStatsSpookyFestival { + year: number; + green: number; + purple: number; + total: number; + constructor(data: Record, year: number) { + this.year = year; + this.green = data?.green_candy || 0; + this.purple = data?.purple_candy || 0; + this.total = this.green + this.purple; + } + + toString(): number { + return this.total; + } +} + +export default SkyBlockMemberPlayerStatsSpookyFestival; diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsWinter.test.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsWinter.test.ts new file mode 100644 index 000000000..c39193532 --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsWinter.test.ts @@ -0,0 +1,17 @@ +import SkyBlockMemberPlayerStatsWinter from './SkyBlockMemberPlayerStatsWinter.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberPlayerStatsWinter', () => { + const data = new SkyBlockMemberPlayerStatsWinter({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberPlayerStatsWinter); + expectTypeOf(data).toEqualTypeOf(); + expect(data.mostSnowballsHit).toBeDefined(); + expectTypeOf(data.mostSnowballsHit).toEqualTypeOf(); + expect(data.mostDamageDealt).toBeDefined(); + expectTypeOf(data.mostDamageDealt).toEqualTypeOf(); + expect(data.mostMagmaDamageDealt).toBeDefined(); + expectTypeOf(data.mostMagmaDamageDealt).toEqualTypeOf(); + expect(data.mostCannonballsHit).toBeDefined(); + expectTypeOf(data.mostCannonballsHit).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsWinter.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsWinter.ts new file mode 100644 index 000000000..69ed854bb --- /dev/null +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsWinter.ts @@ -0,0 +1,14 @@ +class SkyBlockMemberPlayerStatsWinter { + mostSnowballsHit: number; + mostDamageDealt: number; + mostMagmaDamageDealt: number; + mostCannonballsHit: number; + constructor(data: Record) { + this.mostSnowballsHit = data?.most_snowballs_hit || 0; + this.mostDamageDealt = data?.most_damage_dealt || 0; + this.mostMagmaDamageDealt = data?.most_magma_damage_dealt || 0; + this.mostCannonballsHit = data?.most_cannonballs_hit || 0; + } +} + +export default SkyBlockMemberPlayerStatsWinter; diff --git a/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuests.test.ts b/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuests.test.ts new file mode 100644 index 000000000..2e77e1343 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuests.test.ts @@ -0,0 +1,15 @@ +import SkyBlockMemberQuests from './SkyBlockMemberQuests.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockMemberQuestsHarp from './SkyBlockMemberQuestsHarp.js'; +import type SkyBlockMemberQuestsTrapper from './SkyBlockMemberQuestsTrapper.js'; + +test('SkyBlockMemberQuests', () => { + const data = new SkyBlockMemberQuests({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberQuests); + expectTypeOf(data).toEqualTypeOf(); + expect(data.harp).toBeDefined(); + expectTypeOf(data.harp).toEqualTypeOf(); + expect(data.trapper).toBeDefined(); + expectTypeOf(data.trapper).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuests.ts b/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuests.ts new file mode 100644 index 000000000..7ecaf47c6 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuests.ts @@ -0,0 +1,13 @@ +import SkyBlockMemberQuestsHarp from './SkyBlockMemberQuestsHarp.js'; +import SkyBlockMemberQuestsTrapper from './SkyBlockMemberQuestsTrapper.js'; + +class SkyBlockMemberQuests { + harp: SkyBlockMemberQuestsHarp; + trapper: SkyBlockMemberQuestsTrapper; + constructor(data: Record) { + this.harp = new SkyBlockMemberQuestsHarp(data?.harp_quest || {}); + this.trapper = new SkyBlockMemberQuestsTrapper(data?.trapper_quest || {}); + } +} + +export default SkyBlockMemberQuests; diff --git a/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsHarp.test.ts b/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsHarp.test.ts new file mode 100644 index 000000000..c8fc5acd3 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsHarp.test.ts @@ -0,0 +1,47 @@ +import SkyBlockMemberQuestsHarp from './SkyBlockMemberQuestsHarp.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockMemberQuestsHarpSong from './SkyBlockMemberQuestsHarpSong.js'; +import type { HarpSong } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberQuestsHarp', () => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + const data = new SkyBlockMemberQuestsHarp(); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberQuestsHarp); + expectTypeOf(data).toEqualTypeOf(); + expect(data.selectedSong).toBeDefined(); + expectTypeOf(data.selectedSong).toEqualTypeOf(); + expect(data.selectedSongTimestamp).toBeDefined(); + expectTypeOf(data.selectedSongTimestamp).toEqualTypeOf(); + expect(data.selectedSongDate).toBeDefined(); + expectTypeOf(data.selectedSongDate).toEqualTypeOf(); + expect(data.claimedTalisman).toBeDefined(); + expectTypeOf(data.claimedTalisman).toEqualTypeOf(); + expect(data.hymnJoy).toBeDefined(); + expectTypeOf(data.hymnJoy).toEqualTypeOf(); + expect(data.frereJacques).toBeDefined(); + expectTypeOf(data.frereJacques).toEqualTypeOf(); + expect(data.amazingGrace).toBeDefined(); + expectTypeOf(data.amazingGrace).toEqualTypeOf(); + expect(data.brahms).toBeDefined(); + expectTypeOf(data.brahms).toEqualTypeOf(); + expect(data.happyBirthday).toBeDefined(); + expectTypeOf(data.happyBirthday).toEqualTypeOf(); + expect(data.greensleeves).toBeDefined(); + expectTypeOf(data.greensleeves).toEqualTypeOf(); + expect(data.jeopardy).toBeDefined(); + expectTypeOf(data.jeopardy).toEqualTypeOf(); + expect(data.minuet).toBeDefined(); + expectTypeOf(data.minuet).toEqualTypeOf(); + expect(data.joyWorld).toBeDefined(); + expectTypeOf(data.joyWorld).toEqualTypeOf(); + expect(data.pureImagination).toBeDefined(); + expectTypeOf(data.pureImagination).toEqualTypeOf(); + expect(data.vieEnRose).toBeDefined(); + expectTypeOf(data.vieEnRose).toEqualTypeOf(); + expect(data.fireAndFlames).toBeDefined(); + expectTypeOf(data.fireAndFlames).toEqualTypeOf(); + expect(data.pachelbel).toBeDefined(); + expectTypeOf(data.pachelbel).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsHarp.ts b/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsHarp.ts new file mode 100644 index 000000000..3883cdc9b --- /dev/null +++ b/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsHarp.ts @@ -0,0 +1,47 @@ +import SkyBlockMemberQuestsHarpSong from './SkyBlockMemberQuestsHarpSong.js'; +import type { HarpSong } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberQuestsHarp { + selectedSong: HarpSong | 'UNKNOWN'; + selectedSongTimestamp: number; + selectedSongDate: Date; + claimedTalisman: boolean; + hymnJoy: SkyBlockMemberQuestsHarpSong; + frereJacques: SkyBlockMemberQuestsHarpSong; + amazingGrace: SkyBlockMemberQuestsHarpSong; + brahms: SkyBlockMemberQuestsHarpSong; + happyBirthday: SkyBlockMemberQuestsHarpSong; + greensleeves: SkyBlockMemberQuestsHarpSong; + jeopardy: SkyBlockMemberQuestsHarpSong; + minuet: SkyBlockMemberQuestsHarpSong; + joyWorld: SkyBlockMemberQuestsHarpSong; + pureImagination: SkyBlockMemberQuestsHarpSong; + vieEnRose: SkyBlockMemberQuestsHarpSong; + fireAndFlames: SkyBlockMemberQuestsHarpSong; + pachelbel: SkyBlockMemberQuestsHarpSong; + constructor(data: Record) { + this.selectedSong = data?.selected_song || 'UNKNOWN'; + this.selectedSongTimestamp = data?.selected_song_epoch || 0; + this.selectedSongDate = new Date(this.selectedSongTimestamp); + this.claimedTalisman = data?.claimed_talisman || false; + this.hymnJoy = new SkyBlockMemberQuestsHarpSong(data || {}, 'hymn_joy'); + this.frereJacques = new SkyBlockMemberQuestsHarpSong(data || {}, 'frere_jacques'); + this.amazingGrace = new SkyBlockMemberQuestsHarpSong(data || {}, 'amazing_grace'); + this.brahms = new SkyBlockMemberQuestsHarpSong(data || {}, 'brahms'); + this.happyBirthday = new SkyBlockMemberQuestsHarpSong(data || {}, 'happy_birthday'); + this.greensleeves = new SkyBlockMemberQuestsHarpSong(data || {}, 'greensleeves'); + this.jeopardy = new SkyBlockMemberQuestsHarpSong(data || {}, 'jeopardy'); + this.minuet = new SkyBlockMemberQuestsHarpSong(data || {}, 'minuet'); + this.joyWorld = new SkyBlockMemberQuestsHarpSong(data || {}, 'joy_world'); + this.pureImagination = new SkyBlockMemberQuestsHarpSong(data || {}, 'pure_imagination'); + this.vieEnRose = new SkyBlockMemberQuestsHarpSong(data || {}, 'vie_en_rose'); + this.fireAndFlames = new SkyBlockMemberQuestsHarpSong(data || {}, 'fire_and_flames'); + this.pachelbel = new SkyBlockMemberQuestsHarpSong(data || {}, 'pachelbel'); + } + + toString(): HarpSong | 'UNKNOWN' { + return this.selectedSong; + } +} + +export default SkyBlockMemberQuestsHarp; diff --git a/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsHarpSong.test.ts b/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsHarpSong.test.ts new file mode 100644 index 000000000..4a23f32bf --- /dev/null +++ b/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsHarpSong.test.ts @@ -0,0 +1,18 @@ +import SkyBlockMemberQuestsHarpSong from './SkyBlockMemberQuestsHarpSong.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { HarpSong } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberQuestsHarpSong', () => { + const data = new SkyBlockMemberQuestsHarpSong({ stats: 'meow' }, 'hymn_joy'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberQuestsHarpSong); + expectTypeOf(data).toEqualTypeOf(); + expect(data.song).toBeDefined(); + expectTypeOf(data.song).toEqualTypeOf(); + expect(data.completions).toBeDefined(); + expectTypeOf(data.completions).toEqualTypeOf(); + expect(data.bestCompletions).toBeDefined(); + expectTypeOf(data.bestCompletions).toEqualTypeOf(); + expect(data.perfectCompletions).toBeDefined(); + expectTypeOf(data.perfectCompletions).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsHarpSong.ts b/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsHarpSong.ts new file mode 100644 index 000000000..76c160daf --- /dev/null +++ b/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsHarpSong.ts @@ -0,0 +1,20 @@ +import type { HarpSong } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberQuestsHarpSong { + song: HarpSong | 'UNKNOWN'; + completions: number; + bestCompletions: number; + perfectCompletions: number; + constructor(data: Record, song: HarpSong | 'UNKNOWN' = 'UNKNOWN') { + this.song = song; + this.completions = data?.[`song_${song}_completions`] || 0; + this.bestCompletions = data?.[`song_${song}_best_completions`] || 0; + this.perfectCompletions = data?.[`song_${song}_perfect_completions`] || 0; + } + + toString(): HarpSong | 'UNKNOWN' { + return this.song; + } +} + +export default SkyBlockMemberQuestsHarpSong; diff --git a/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsTrapper.test.ts b/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsTrapper.test.ts new file mode 100644 index 000000000..816814bf6 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsTrapper.test.ts @@ -0,0 +1,15 @@ +import SkyBlockMemberQuestsTrapper from './SkyBlockMemberQuestsTrapper.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberQuestsTrapper', () => { + const data = new SkyBlockMemberQuestsTrapper({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberQuestsTrapper); + expectTypeOf(data).toEqualTypeOf(); + expect(data.peltCount).toBeDefined(); + expectTypeOf(data.peltCount).toEqualTypeOf(); + expect(data.lastCompletedTimestamp).toBeDefined(); + expectTypeOf(data.lastCompletedTimestamp).toEqualTypeOf(); + expect(data.lastCompletedAt).toBeDefined(); + expectTypeOf(data.lastCompletedAt).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsTrapper.ts b/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsTrapper.ts new file mode 100644 index 000000000..59083375a --- /dev/null +++ b/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsTrapper.ts @@ -0,0 +1,16 @@ +class SkyBlockMemberQuestsTrapper { + peltCount: number; + lastCompletedTimestamp: number; + lastCompletedAt: Date; + constructor(data: Record) { + this.peltCount = data?.pelt_count || 0; + this.lastCompletedTimestamp = data?.last_task_time || 0; + this.lastCompletedAt = new Date(this.lastCompletedTimestamp); + } + + toString(): number { + return this.peltCount; + } +} + +export default SkyBlockMemberQuestsTrapper; diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRift.test.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRift.test.ts new file mode 100644 index 000000000..b63e4ad8e --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRift.test.ts @@ -0,0 +1,47 @@ +import SkyBlockMemberRift from './SkyBlockMemberRift.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockMemberRiftAccess from './SkyBlockMemberRiftAccess.js'; +import type SkyBlockMemberRiftBlackLagoon from './SkyBlockMemberRiftBlackLagoon.js'; +import type SkyBlockMemberRiftCastle from './SkyBlockMemberRiftCastle.js'; +import type SkyBlockMemberRiftDeadCats from './SkyBlockMemberRiftDeadCats.js'; +import type SkyBlockMemberRiftDreamFarm from './SkyBlockMemberRiftDreamFarm.js'; +import type SkyBlockMemberRiftEnigma from './SkyBlockMemberRiftEnigma.js'; +import type SkyBlockMemberRiftGallery from './SkyBlockMemberRiftGallery.js'; +import type SkyBlockMemberRiftInventory from './SkyBlockMemberRiftInventory.js'; +import type SkyBlockMemberRiftVillagePlaza from './VillagePlaza/SkyBlockMemberRiftVillagePlaza.js'; +import type SkyBlockMemberRiftWestVillage from './WestVillage/SkyBlockMemberRiftWestVillage.js'; +import type SkyBlockMemberRiftWitherCage from './SkyBlockMemberRiftWitherCage.js'; +import type SkyBlockMemberRiftWizardTower from './SkyBlockMemberRiftWizardTower.js'; + +test('SkyBlockMemberRift', () => { + const data = new SkyBlockMemberRift({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberRift); + expectTypeOf(data).toEqualTypeOf(); + expect(data.villagePlaza).toBeDefined(); + expectTypeOf(data.villagePlaza).toEqualTypeOf(); + expect(data.witherCage).toBeDefined(); + expectTypeOf(data.witherCage).toEqualTypeOf(); + expect(data.blackLagoon).toBeDefined(); + expectTypeOf(data.blackLagoon).toEqualTypeOf(); + expect(data.deadCats).toBeDefined(); + expectTypeOf(data.deadCats).toEqualTypeOf(); + expect(data.wizardTower).toBeDefined(); + expectTypeOf(data.wizardTower).toEqualTypeOf(); + expect(data.enigma).toBeDefined(); + expectTypeOf(data.enigma).toEqualTypeOf(); + expect(data.gallery).toBeDefined(); + expectTypeOf(data.gallery).toEqualTypeOf(); + expect(data.lifetimePurchasedBoundaries).toBeDefined(); + expectTypeOf(data.lifetimePurchasedBoundaries).toEqualTypeOf(); + expect(data.westVillage).toBeDefined(); + expectTypeOf(data.westVillage).toEqualTypeOf(); + expect(data.castle).toBeDefined(); + expectTypeOf(data.castle).toEqualTypeOf(); + expect(data.access).toBeDefined(); + expectTypeOf(data.access).toEqualTypeOf(); + expect(data.dreamFarm).toBeDefined(); + expectTypeOf(data.dreamFarm).toEqualTypeOf(); + expect(data.inventory).toBeDefined(); + expectTypeOf(data.inventory).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRift.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRift.ts new file mode 100644 index 000000000..b2e5ee33e --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRift.ts @@ -0,0 +1,45 @@ +import SkyBlockMemberRiftAccess from './SkyBlockMemberRiftAccess.js'; +import SkyBlockMemberRiftBlackLagoon from './SkyBlockMemberRiftBlackLagoon.js'; +import SkyBlockMemberRiftCastle from './SkyBlockMemberRiftCastle.js'; +import SkyBlockMemberRiftDeadCats from './SkyBlockMemberRiftDeadCats.js'; +import SkyBlockMemberRiftDreamFarm from './SkyBlockMemberRiftDreamFarm.js'; +import SkyBlockMemberRiftEnigma from './SkyBlockMemberRiftEnigma.js'; +import SkyBlockMemberRiftGallery from './SkyBlockMemberRiftGallery.js'; +import SkyBlockMemberRiftInventory from './SkyBlockMemberRiftInventory.js'; +import SkyBlockMemberRiftVillagePlaza from './VillagePlaza/SkyBlockMemberRiftVillagePlaza.js'; +import SkyBlockMemberRiftWestVillage from './WestVillage/SkyBlockMemberRiftWestVillage.js'; +import SkyBlockMemberRiftWitherCage from './SkyBlockMemberRiftWitherCage.js'; +import SkyBlockMemberRiftWizardTower from './SkyBlockMemberRiftWizardTower.js'; + +class SkyBlockMemberRift { + villagePlaza: SkyBlockMemberRiftVillagePlaza; + witherCage: SkyBlockMemberRiftWitherCage; + blackLagoon: SkyBlockMemberRiftBlackLagoon; + deadCats: SkyBlockMemberRiftDeadCats; + wizardTower: SkyBlockMemberRiftWizardTower; + enigma: SkyBlockMemberRiftEnigma; + gallery: SkyBlockMemberRiftGallery; + lifetimePurchasedBoundaries: string[]; + westVillage: SkyBlockMemberRiftWestVillage; + castle: SkyBlockMemberRiftCastle; + access: SkyBlockMemberRiftAccess; + dreamFarm: SkyBlockMemberRiftDreamFarm; + inventory: SkyBlockMemberRiftInventory; + constructor(data: Record) { + this.villagePlaza = new SkyBlockMemberRiftVillagePlaza(data?.village_plaza || {}); + this.witherCage = new SkyBlockMemberRiftWitherCage(data?.wither_cage || {}); + this.blackLagoon = new SkyBlockMemberRiftBlackLagoon(data?.black_lagoon || {}); + this.deadCats = new SkyBlockMemberRiftDeadCats(data?.dead_cats || {}); + this.wizardTower = new SkyBlockMemberRiftWizardTower(data?.wizard_tower || {}); + this.enigma = new SkyBlockMemberRiftEnigma(data?.enigma || {}); + this.gallery = new SkyBlockMemberRiftGallery(data?.gallery || {}); + this.lifetimePurchasedBoundaries = data?.lifetime_purchased_boundaries || []; + this.westVillage = new SkyBlockMemberRiftWestVillage(data?.west_village || {}); + this.castle = new SkyBlockMemberRiftCastle(data?.castle || {}); + this.access = new SkyBlockMemberRiftAccess(data?.access || {}); + this.dreamFarm = new SkyBlockMemberRiftDreamFarm(data?.dreamfarm || {}); + this.inventory = new SkyBlockMemberRiftInventory(data?.inventory || {}); + } +} + +export default SkyBlockMemberRift; diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftAccess.test.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftAccess.test.ts new file mode 100644 index 000000000..25b75ea50 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftAccess.test.ts @@ -0,0 +1,19 @@ +import SkyBlockMemberRiftAccess from './SkyBlockMemberRiftAccess.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberRiftAccess', () => { + const data = new SkyBlockMemberRiftAccess({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberRiftAccess); + expectTypeOf(data).toEqualTypeOf(); + expect(data.lastFree).toBeDefined(); + expectTypeOf(data.lastFree).toEqualTypeOf(); + expect(data.lastFreeAt).toBeDefined(); + expectTypeOf(data.lastFreeAt).toEqualTypeOf(); + expect(data.consumedPrism).toBeDefined(); + expectTypeOf(data.consumedPrism).toEqualTypeOf(); + expect(data.chargeTrackTimestamp).toBeDefined(); + expectTypeOf(data.chargeTrackTimestamp).toEqualTypeOf(); + expect(data.chargeTrackTimestampAt).toBeDefined(); + expectTypeOf(data.chargeTrackTimestampAt).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftAccess.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftAccess.ts new file mode 100644 index 000000000..f0ea9723c --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftAccess.ts @@ -0,0 +1,16 @@ +class SkyBlockMemberRiftAccess { + lastFree: number; + lastFreeAt: Date; + consumedPrism: boolean; + chargeTrackTimestamp: number; + chargeTrackTimestampAt: Date; + constructor(data: Record) { + this.lastFree = data?.last_free || 0; + this.lastFreeAt = new Date(this.lastFree); + this.consumedPrism = data?.consumed_prism || false; + this.chargeTrackTimestamp = data?.charge_track_timestamp || 0; + this.chargeTrackTimestampAt = new Date(this.chargeTrackTimestamp); + } +} + +export default SkyBlockMemberRiftAccess; diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftBlackLagoon.test.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftBlackLagoon.test.ts new file mode 100644 index 000000000..d6d4e4ff1 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftBlackLagoon.test.ts @@ -0,0 +1,17 @@ +import SkyBlockMemberRiftBlackLagoon from './SkyBlockMemberRiftBlackLagoon.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberRiftBlackLagoon', () => { + const data = new SkyBlockMemberRiftBlackLagoon({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberRiftBlackLagoon); + expectTypeOf(data).toEqualTypeOf(); + expect(data.talkedToEdwin).toBeDefined(); + expectTypeOf(data.talkedToEdwin).toEqualTypeOf(); + expect(data.receivedSciencePaper).toBeDefined(); + expectTypeOf(data.receivedSciencePaper).toEqualTypeOf(); + expect(data.deliveredSciencePaper).toBeDefined(); + expectTypeOf(data.deliveredSciencePaper).toEqualTypeOf(); + expect(data.completedStep).toBeDefined(); + expectTypeOf(data.completedStep).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftBlackLagoon.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftBlackLagoon.ts new file mode 100644 index 000000000..6ae8d2540 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftBlackLagoon.ts @@ -0,0 +1,14 @@ +class SkyBlockMemberRiftBlackLagoon { + talkedToEdwin: boolean; + receivedSciencePaper: boolean; + deliveredSciencePaper: boolean; + completedStep: number; + constructor(data: Record) { + this.talkedToEdwin = data?.talked_to_edwin || false; + this.receivedSciencePaper = data?.received_science_paper || false; + this.deliveredSciencePaper = data?.delivered_science_paper || false; + this.completedStep = data?.completed_step || 0; + } +} + +export default SkyBlockMemberRiftBlackLagoon; diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftCastle.test.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftCastle.test.ts new file mode 100644 index 000000000..688952c7a --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftCastle.test.ts @@ -0,0 +1,15 @@ +import SkyBlockMemberRiftCastle from './SkyBlockMemberRiftCastle.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberRiftCastle', () => { + const data = new SkyBlockMemberRiftCastle({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberRiftCastle); + expectTypeOf(data).toEqualTypeOf(); + expect(data.unlockedPathwaySkip).toBeDefined(); + expectTypeOf(data.unlockedPathwaySkip).toEqualTypeOf(); + expect(data.fairyStep).toBeDefined(); + expectTypeOf(data.fairyStep).toEqualTypeOf(); + expect(data.grubberStacks).toBeDefined(); + expectTypeOf(data.grubberStacks).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftCastle.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftCastle.ts new file mode 100644 index 000000000..4d46d132c --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftCastle.ts @@ -0,0 +1,12 @@ +class SkyBlockMemberRiftCastle { + unlockedPathwaySkip: boolean; + fairyStep: number; + grubberStacks: number; + constructor(data: Record) { + this.unlockedPathwaySkip = data?.unlocked_pathway_skip || false; + this.fairyStep = data?.fairy_step || 0; + this.grubberStacks = data?.grubber_stacks || 0; + } +} + +export default SkyBlockMemberRiftCastle; diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftDeadCats.test.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftDeadCats.test.ts new file mode 100644 index 000000000..cf9db0850 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftDeadCats.test.ts @@ -0,0 +1,20 @@ +import SkyBlockMemberRiftDeadCats from './SkyBlockMemberRiftDeadCats.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockMemberPet from '../Pets/SkyBlockMemberPet.js'; + +test('SkyBlockMemberRiftDeadCats', () => { + const data = new SkyBlockMemberRiftDeadCats({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberRiftDeadCats); + expectTypeOf(data).toEqualTypeOf(); + expect(data.talkedToJacquelle).toBeDefined(); + expectTypeOf(data.talkedToJacquelle).toEqualTypeOf(); + expect(data.pickedUpDetector).toBeDefined(); + expectTypeOf(data.pickedUpDetector).toEqualTypeOf(); + expect(data.foundCats).toBeDefined(); + expectTypeOf(data.foundCats).toEqualTypeOf(); + expect(data.unlockedPet).toBeDefined(); + expectTypeOf(data.unlockedPet).toEqualTypeOf(); + expect(data.montezuma).toBeDefined(); + expectTypeOf(data.montezuma).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftDeadCats.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftDeadCats.ts new file mode 100644 index 000000000..e416499ca --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftDeadCats.ts @@ -0,0 +1,18 @@ +import SkyBlockMemberPet from '../Pets/SkyBlockMemberPet.js'; + +class SkyBlockMemberRiftDeadCats { + talkedToJacquelle: boolean; + pickedUpDetector: boolean; + foundCats: string[]; + unlockedPet: boolean; + montezuma: SkyBlockMemberPet; + constructor(data: Record) { + this.talkedToJacquelle = data?.talked_to_jacquelle || false; + this.pickedUpDetector = data?.picked_up_detector || false; + this.foundCats = data?.found_cats || []; + this.unlockedPet = data?.unlocked_pet || false; + this.montezuma = new SkyBlockMemberPet(data?.montezuma || {}); + } +} + +export default SkyBlockMemberRiftDeadCats; diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftDreamFarm.test.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftDreamFarm.test.ts new file mode 100644 index 000000000..14d2a7582 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftDreamFarm.test.ts @@ -0,0 +1,13 @@ +import SkyBlockMemberRiftDreamFarm from './SkyBlockMemberRiftDreamFarm.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberRiftDreamFarm', () => { + const data = new SkyBlockMemberRiftDreamFarm({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberRiftDreamFarm); + expectTypeOf(data).toEqualTypeOf(); + expect(data.shaniaStage).toBeDefined(); + expectTypeOf(data.shaniaStage).toEqualTypeOf(); + expect(data.caducousFeederUses).toBeDefined(); + expectTypeOf(data.caducousFeederUses).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftDreamFarm.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftDreamFarm.ts new file mode 100644 index 000000000..a69de9947 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftDreamFarm.ts @@ -0,0 +1,10 @@ +class SkyBlockMemberRiftDreamFarm { + shaniaStage: number; + caducousFeederUses: number[]; + constructor(data: Record) { + this.shaniaStage = data?.shania_stage || 0; + this.caducousFeederUses = data?.caducous_feeder_uses || []; + } +} + +export default SkyBlockMemberRiftDreamFarm; diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftEnigma.test.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftEnigma.test.ts new file mode 100644 index 000000000..7130107fb --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftEnigma.test.ts @@ -0,0 +1,15 @@ +import SkyBlockMemberRiftEnigma from './SkyBlockMemberRiftEnigma.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberRiftEnigma', () => { + const data = new SkyBlockMemberRiftEnigma({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberRiftEnigma); + expectTypeOf(data).toEqualTypeOf(); + expect(data.boughtCloak).toBeDefined(); + expectTypeOf(data.boughtCloak).toEqualTypeOf(); + expect(data.foundSouls).toBeDefined(); + expectTypeOf(data.foundSouls).toEqualTypeOf(); + expect(data.claimedBonusIndex).toBeDefined(); + expectTypeOf(data.claimedBonusIndex).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftEnigma.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftEnigma.ts new file mode 100644 index 000000000..d8bccc81b --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftEnigma.ts @@ -0,0 +1,12 @@ +class SkyBlockMemberRiftEnigma { + boughtCloak: boolean; + foundSouls: string[]; + claimedBonusIndex: number; + constructor(data: Record) { + this.boughtCloak = data?.bought_cloak || false; + this.foundSouls = data?.found_souls || []; + this.claimedBonusIndex = data?.claimed_bonus_index || 0; + } +} + +export default SkyBlockMemberRiftEnigma; diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftGallery.test.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftGallery.test.ts new file mode 100644 index 000000000..5a702354b --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftGallery.test.ts @@ -0,0 +1,17 @@ +import SkyBlockMemberRiftGallery from './SkyBlockMemberRiftGallery.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockMemberRiftGallerySecuredTrophy from './SkyBlockMemberRiftGallerySecuredTrophy.js'; +import type { RiftGalleryTrophy } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberRiftGallery', () => { + const data = new SkyBlockMemberRiftGallery({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberRiftGallery); + expectTypeOf(data).toEqualTypeOf(); + expect(data.eliseStep).toBeDefined(); + expectTypeOf(data.eliseStep).toEqualTypeOf(); + expect(data.securedTrophies).toBeDefined(); + expectTypeOf(data.securedTrophies).toEqualTypeOf(); + expect(data.sentTrophyDialogues).toBeDefined(); + expectTypeOf(data.sentTrophyDialogues).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftGallery.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftGallery.ts new file mode 100644 index 000000000..7644a01cf --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftGallery.ts @@ -0,0 +1,17 @@ +import SkyBlockMemberRiftGallerySecuredTrophy from './SkyBlockMemberRiftGallerySecuredTrophy.js'; +import type { RiftGalleryTrophy } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberRiftGallery { + eliseStep: number; + securedTrophies: SkyBlockMemberRiftGallerySecuredTrophy[]; + sentTrophyDialogues: RiftGalleryTrophy[]; + constructor(data: Record) { + this.eliseStep = data?.elise_step || 0; + this.securedTrophies = (data?.sent_trophy_dialogues || []).map((trophy: Record) => { + new SkyBlockMemberRiftGallerySecuredTrophy(trophy); + }); + this.sentTrophyDialogues = data?.sent_trophy_dialogues || []; + } +} + +export default SkyBlockMemberRiftGallery; diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftGallerySecuredTrophy.test.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftGallerySecuredTrophy.test.ts new file mode 100644 index 000000000..db5bb240b --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftGallerySecuredTrophy.test.ts @@ -0,0 +1,18 @@ +import SkyBlockMemberRiftGallerySecuredTrophy from './SkyBlockMemberRiftGallerySecuredTrophy.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { RiftGalleryTrophy } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberRiftGallerySecuredTrophy', () => { + const data = new SkyBlockMemberRiftGallerySecuredTrophy({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberRiftGallerySecuredTrophy); + expectTypeOf(data).toEqualTypeOf(); + expect(data.type).toBeDefined(); + expectTypeOf(data.type).toEqualTypeOf(); + expect(data.timestamp).toBeDefined(); + expectTypeOf(data.timestamp).toEqualTypeOf(); + expect(data.timestampAt).toBeDefined(); + expectTypeOf(data.timestampAt).toEqualTypeOf(); + expect(data.visits).toBeDefined(); + expectTypeOf(data.visits).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftGallerySecuredTrophy.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftGallerySecuredTrophy.ts new file mode 100644 index 000000000..9b56618a9 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftGallerySecuredTrophy.ts @@ -0,0 +1,16 @@ +import type { RiftGalleryTrophy } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberRiftGallerySecuredTrophy { + type: RiftGalleryTrophy | 'UNKNOWN'; + timestamp: number; + timestampAt: Date; + visits: number; + constructor(data: Record) { + this.type = data?.type || 0; + this.timestamp = data?.timestamp || 0; + this.timestampAt = new Date(this.timestamp); + this.visits = data?.visits || 0; + } +} + +export default SkyBlockMemberRiftGallerySecuredTrophy; diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftInventory.test.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftInventory.test.ts new file mode 100644 index 000000000..7ad12d520 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftInventory.test.ts @@ -0,0 +1,22 @@ +import SkyBlockMemberInventoriesArmor from '../Inventories/Armor/SkyBlockMemberInventoriesArmor.js'; +import SkyBlockMemberInventoriesEquipment from '../Inventories/Equipment/SkyBlockMemberInventoriesEquipment.js'; +import SkyBlockMemberInventoriesInventory from '../Inventories/Inventory/SkyBlockMemberInventoriesInventory.js'; +import SkyBlockMemberRiftInventory from './SkyBlockMemberRiftInventory.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberRiftInventory', () => { + const data = new SkyBlockMemberRiftInventory({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberRiftInventory); + expectTypeOf(data).toEqualTypeOf(); + expect(data.enderChestPageIcons).toBeDefined(); + expectTypeOf(data.enderChestPageIcons).toEqualTypeOf<[]>(); + expect(data.inventory).toBeDefined(); + expectTypeOf(data.inventory).toEqualTypeOf(); + expect(data.armor).toBeDefined(); + expectTypeOf(data.armor).toEqualTypeOf(); + expect(data.equipment).toBeDefined(); + expectTypeOf(data.equipment).toEqualTypeOf(); + expect(data.enderChest).toBeDefined(); + expectTypeOf(data.enderChest).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftInventory.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftInventory.ts new file mode 100644 index 000000000..516830e00 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftInventory.ts @@ -0,0 +1,20 @@ +import SkyBlockMemberInventoriesArmor from '../Inventories/Armor/SkyBlockMemberInventoriesArmor.js'; +import SkyBlockMemberInventoriesEquipment from '../Inventories/Equipment/SkyBlockMemberInventoriesEquipment.js'; +import SkyBlockMemberInventoriesInventory from '../Inventories/Inventory/SkyBlockMemberInventoriesInventory.js'; + +class SkyBlockMemberRiftInventory { + enderChestPageIcons: []; + inventory: SkyBlockMemberInventoriesInventory; + armor: SkyBlockMemberInventoriesArmor; + equipment: SkyBlockMemberInventoriesEquipment; + enderChest: SkyBlockMemberInventoriesInventory; + constructor(data: Record) { + this.enderChestPageIcons = data?.ender_chest_page_icons || []; + this.inventory = new SkyBlockMemberInventoriesInventory(data?.inv_contents || {}); + this.armor = new SkyBlockMemberInventoriesArmor(data?.inv_armor || {}); + this.equipment = new SkyBlockMemberInventoriesEquipment(data?.equipment_contents || {}); + this.enderChest = new SkyBlockMemberInventoriesInventory(data?.ender_chest_contents || {}); + } +} + +export default SkyBlockMemberRiftInventory; diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWitherCage.test.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWitherCage.test.ts new file mode 100644 index 000000000..6ea24c0af --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWitherCage.test.ts @@ -0,0 +1,12 @@ +import SkyBlockMemberRiftWitherCage from './SkyBlockMemberRiftWitherCage.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { WitherCageKilledEye } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberRiftWitherCage', () => { + const data = new SkyBlockMemberRiftWitherCage({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberRiftWitherCage); + expectTypeOf(data).toEqualTypeOf(); + expect(data.killedEyes).toBeDefined(); + expectTypeOf(data.killedEyes).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWitherCage.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWitherCage.ts new file mode 100644 index 000000000..d2753246b --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWitherCage.ts @@ -0,0 +1,10 @@ +import type { WitherCageKilledEye } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberRiftWitherCage { + killedEyes: WitherCageKilledEye[]; + constructor(data: Record) { + this.killedEyes = data?.killed_eyes || []; + } +} + +export default SkyBlockMemberRiftWitherCage; diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWizardTower.test.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWizardTower.test.ts new file mode 100644 index 000000000..a6b34050f --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWizardTower.test.ts @@ -0,0 +1,9 @@ +import SkyBlockMemberRiftWizardTower from './SkyBlockMemberRiftWizardTower.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberRiftWizardTower', () => { + const data = new SkyBlockMemberRiftWizardTower({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberRiftWizardTower); + expectTypeOf(data).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWizardTower.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWizardTower.ts new file mode 100644 index 000000000..b747dcdf6 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWizardTower.ts @@ -0,0 +1,10 @@ +class SkyBlockMemberRiftWizardTower { + wizardQuestStep: number; + crumbsLaidOut: number; + constructor(data: Record) { + this.wizardQuestStep = data?.wizard_quest_step || 0; + this.crumbsLaidOut = data?.crumbs_laid_out || 0; + } +} + +export default SkyBlockMemberRiftWizardTower; diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWyldWoods.test.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWyldWoods.test.ts new file mode 100644 index 000000000..de18ee09d --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWyldWoods.test.ts @@ -0,0 +1,21 @@ +import SkyBlockMemberRiftWyldWoods from './SkyBlockMemberRiftWyldWoods.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberRiftWyldWoods', () => { + const data = new SkyBlockMemberRiftWyldWoods({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberRiftWyldWoods); + expectTypeOf(data).toEqualTypeOf(); + expect(data.talkedThreebrothers).toBeDefined(); + expectTypeOf(data.talkedThreebrothers).toEqualTypeOf(); + expect(data.siriusStartedQA).toBeDefined(); + expectTypeOf(data.siriusStartedQA).toEqualTypeOf(); + expect(data.siriusQAChainDone).toBeDefined(); + expectTypeOf(data.siriusQAChainDone).toEqualTypeOf(); + expect(data.siriusCompletedQA).toBeDefined(); + expectTypeOf(data.siriusCompletedQA).toEqualTypeOf(); + expect(data.siriusClaimedDoubloon).toBeDefined(); + expectTypeOf(data.siriusClaimedDoubloon).toEqualTypeOf(); + expect(data.bughunterStep).toBeDefined(); + expectTypeOf(data.bughunterStep).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWyldWoods.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWyldWoods.ts new file mode 100644 index 000000000..c1a991c48 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWyldWoods.ts @@ -0,0 +1,18 @@ +class SkyBlockMemberRiftWyldWoods { + talkedThreebrothers: string[]; + siriusStartedQA: boolean; + siriusQAChainDone: boolean; + siriusCompletedQA: boolean; + siriusClaimedDoubloon: boolean; + bughunterStep: number; + constructor(data: Record) { + this.talkedThreebrothers = data?.talked_threebrothers || []; + this.siriusStartedQA = data?.sirius_started_q_a || false; + this.siriusQAChainDone = data?.sirius_q_a_chain_done || false; + this.siriusCompletedQA = data?.sirius_completed_q_a || false; + this.siriusClaimedDoubloon = data?.sirius_claimed_doubloon || false; + this.bughunterStep = data?.bughunter_step || 0; + } +} + +export default SkyBlockMemberRiftWyldWoods; diff --git a/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlaza.test.ts b/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlaza.test.ts new file mode 100644 index 000000000..9c3ac74be --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlaza.test.ts @@ -0,0 +1,26 @@ +import SkyBlockMemberRiftVillagePlaza from './SkyBlockMemberRiftVillagePlaza.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockMemberRiftVillagePlazaBarry from './SkyBlockMemberRiftVillagePlazaBarry.js'; +import type SkyBlockMemberRiftVillagePlazaCowboy from './SkyBlockMemberRiftVillagePlazaCowboy.js'; +import type SkyBlockMemberRiftVillagePlazaMurder from './SkyBlockMemberRiftVillagePlazaMurder.js'; + +test('SkyBlockMemberRiftVillagePlaza', () => { + const data = new SkyBlockMemberRiftVillagePlaza({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberRiftVillagePlaza); + expectTypeOf(data).toEqualTypeOf(); + expect(data.murder).toBeDefined(); + expectTypeOf(data.murder).toEqualTypeOf(); + expect(data.barry).toBeDefined(); + expectTypeOf(data.barry).toEqualTypeOf(); + expect(data.cowboy).toBeDefined(); + expectTypeOf(data.cowboy).toEqualTypeOf(); + expect(data.barterBank).toBeDefined(); + expectTypeOf(data.barterBank).toEqualTypeOf>(); + expect(data.lonely).toBeDefined(); + expectTypeOf(data.lonely).toEqualTypeOf>(); + expect(data.seraphine).toBeDefined(); + expectTypeOf(data.seraphine).toEqualTypeOf>(); + expect(data.gotScammed).toBeDefined(); + expectTypeOf(data.gotScammed).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlaza.ts b/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlaza.ts new file mode 100644 index 000000000..d9d35abdf --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlaza.ts @@ -0,0 +1,24 @@ +import SkyBlockMemberRiftVillagePlazaBarry from './SkyBlockMemberRiftVillagePlazaBarry.js'; +import SkyBlockMemberRiftVillagePlazaCowboy from './SkyBlockMemberRiftVillagePlazaCowboy.js'; +import SkyBlockMemberRiftVillagePlazaMurder from './SkyBlockMemberRiftVillagePlazaMurder.js'; + +class SkyBlockMemberRiftVillagePlaza { + murder: SkyBlockMemberRiftVillagePlazaMurder; + barry: SkyBlockMemberRiftVillagePlazaBarry; + cowboy: SkyBlockMemberRiftVillagePlazaCowboy; + barterBank: Record; + lonely: Record; + seraphine: Record; + gotScammed: boolean; + constructor(data: Record) { + this.murder = new SkyBlockMemberRiftVillagePlazaMurder(data?.murder || {}); + this.barry = new SkyBlockMemberRiftVillagePlazaBarry(data?.barry_center || {}); + this.cowboy = new SkyBlockMemberRiftVillagePlazaCowboy(data?.cowboy || {}); + this.barterBank = data?.barter_bank || {}; + this.lonely = data?.lonely || {}; + this.seraphine = data?.seraphine || {}; + this.gotScammed = data?.got_scammed || false; + } +} + +export default SkyBlockMemberRiftVillagePlaza; diff --git a/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaBarry.test.ts b/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaBarry.test.ts new file mode 100644 index 000000000..c36c168e7 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaBarry.test.ts @@ -0,0 +1,15 @@ +import SkyBlockMemberRiftVillagePlazaBarry from './SkyBlockMemberRiftVillagePlazaBarry.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberRiftVillagePlazaBarry', () => { + const data = new SkyBlockMemberRiftVillagePlazaBarry({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberRiftVillagePlazaBarry); + expectTypeOf(data).toEqualTypeOf(); + expect(data.firstTalkToBarry).toBeDefined(); + expectTypeOf(data.firstTalkToBarry).toEqualTypeOf(); + expect(data.convinced).toBeDefined(); + expectTypeOf(data.convinced).toEqualTypeOf(); + expect(data.receivedReward).toBeDefined(); + expectTypeOf(data.receivedReward).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaBarry.ts b/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaBarry.ts new file mode 100644 index 000000000..c71fd0e04 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaBarry.ts @@ -0,0 +1,12 @@ +class SkyBlockMemberRiftVillagePlazaBarry { + firstTalkToBarry: boolean; + convinced: boolean; + receivedReward: boolean; + constructor(data: Record) { + this.firstTalkToBarry = data?.first_talk_to_barry || false; + this.convinced = data?.convinced || []; + this.receivedReward = data?.received_reward || false; + } +} + +export default SkyBlockMemberRiftVillagePlazaBarry; diff --git a/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaCowboy.test.ts b/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaCowboy.test.ts new file mode 100644 index 000000000..917c10680 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaCowboy.test.ts @@ -0,0 +1,16 @@ +import SkyBlockMemberRiftVillagePlazaCowboy from './SkyBlockMemberRiftVillagePlazaCowboy.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { RiftVillagePlazaCowboyRabbit } from '../../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberRiftVillagePlazaCowboy', () => { + const data = new SkyBlockMemberRiftVillagePlazaCowboy({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberRiftVillagePlazaCowboy); + expectTypeOf(data).toEqualTypeOf(); + expect(data.stage).toBeDefined(); + expectTypeOf(data.stage).toEqualTypeOf(); + expect(data.hayEaten).toBeDefined(); + expectTypeOf(data.hayEaten).toEqualTypeOf(); + expect(data.rabbitName).toBeDefined(); + expectTypeOf(data.rabbitName).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaCowboy.ts b/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaCowboy.ts new file mode 100644 index 000000000..ad3c83308 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaCowboy.ts @@ -0,0 +1,14 @@ +import type { RiftVillagePlazaCowboyRabbit } from '../../../../../Types/SkyBlock.js'; + +class SkyBlockMemberRiftVillagePlazaCowboy { + stage: number; + hayEaten: number; + rabbitName: RiftVillagePlazaCowboyRabbit | 'UNKNOWN'; + constructor(data: Record) { + this.stage = data?.stage || 0; + this.hayEaten = data?.hay_eaten || 0; + this.rabbitName = data?.rabbit_name || 'UNKNOWN'; + } +} + +export default SkyBlockMemberRiftVillagePlazaCowboy; diff --git a/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaMurder.test.ts b/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaMurder.test.ts new file mode 100644 index 000000000..6e723ae14 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaMurder.test.ts @@ -0,0 +1,17 @@ +import SkyBlockMemberRiftVillagePlazaMurder from './SkyBlockMemberRiftVillagePlazaMurder.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberRiftVillagePlazaMurder', () => { + const data = new SkyBlockMemberRiftVillagePlazaMurder({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberRiftVillagePlazaMurder); + expectTypeOf(data).toEqualTypeOf(); + expect(data.stepIndex).toBeDefined(); + expectTypeOf(data.stepIndex).toEqualTypeOf(); + expect(data.roomClues).toBeDefined(); + expectTypeOf(data.roomClues).toEqualTypeOf(); + expect(data.stepIndexPt2).toBeDefined(); + expectTypeOf(data.stepIndexPt2).toEqualTypeOf(); + expect(data.stepIndexPt3).toBeDefined(); + expectTypeOf(data.stepIndexPt3).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaMurder.ts b/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaMurder.ts new file mode 100644 index 000000000..9a1857a97 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaMurder.ts @@ -0,0 +1,14 @@ +class SkyBlockMemberRiftVillagePlazaMurder { + stepIndex: number; + roomClues: number[]; + stepIndexPt2: number; + stepIndexPt3: number; + constructor(data: Record) { + this.stepIndex = data?.step_index || 0; + this.roomClues = data?.room_clues || []; + this.stepIndexPt2 = data?.step_index_pt2 || 0; + this.stepIndexPt3 = data?.step_index_pt3 || 0; + } +} + +export default SkyBlockMemberRiftVillagePlazaMurder; diff --git a/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillage.test.ts b/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillage.test.ts new file mode 100644 index 000000000..2b41e19a9 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillage.test.ts @@ -0,0 +1,21 @@ +import SkyBlockMemberRiftWestVillage from './SkyBlockMemberRiftWestVillage.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockMemberRiftWestVillageCrazyKloon from './SkyBlockMemberRiftWestVillageCrazyKloon.js'; +import type SkyBlockMemberRiftWestVillageGlyphs from './SkyBlockMemberRiftWestVillageGlyphs.js'; +import type SkyBlockMemberRiftWestVillageKatHouse from './SkyBlockMemberRiftWestVillageKatHouse.js'; +import type SkyBlockMemberRiftWestVillageMirrorverse from './SkyBlockMemberRiftWestVillageMirrorverse.js'; + +test('SkyBlockMemberRiftWestVillage', () => { + const data = new SkyBlockMemberRiftWestVillage({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberRiftWestVillage); + expectTypeOf(data).toEqualTypeOf(); + expect(data.crazyKloon).toBeDefined(); + expectTypeOf(data.crazyKloon).toEqualTypeOf(); + expect(data.mirrorverse).toBeDefined(); + expectTypeOf(data.mirrorverse).toEqualTypeOf(); + expect(data.katHouse).toBeDefined(); + expectTypeOf(data.katHouse).toEqualTypeOf(); + expect(data.glyphs).toBeDefined(); + expectTypeOf(data.glyphs).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillage.ts b/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillage.ts new file mode 100644 index 000000000..da6f29a33 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillage.ts @@ -0,0 +1,19 @@ +import SkyBlockMemberRiftWestVillageCrazyKloon from './SkyBlockMemberRiftWestVillageCrazyKloon.js'; +import SkyBlockMemberRiftWestVillageGlyphs from './SkyBlockMemberRiftWestVillageGlyphs.js'; +import SkyBlockMemberRiftWestVillageKatHouse from './SkyBlockMemberRiftWestVillageKatHouse.js'; +import SkyBlockMemberRiftWestVillageMirrorverse from './SkyBlockMemberRiftWestVillageMirrorverse.js'; + +class SkyBlockMemberRiftWestVillage { + crazyKloon: SkyBlockMemberRiftWestVillageCrazyKloon; + mirrorverse: SkyBlockMemberRiftWestVillageMirrorverse; + katHouse: SkyBlockMemberRiftWestVillageKatHouse; + glyphs: SkyBlockMemberRiftWestVillageGlyphs; + constructor(data: Record) { + this.crazyKloon = new SkyBlockMemberRiftWestVillageCrazyKloon(data?.crazy_kloon || {}); + this.mirrorverse = new SkyBlockMemberRiftWestVillageMirrorverse(data?.mirrorverse || {}); + this.katHouse = new SkyBlockMemberRiftWestVillageKatHouse(data?.kat_house || {}); + this.glyphs = new SkyBlockMemberRiftWestVillageGlyphs(data?.glyphs || {}); + } +} + +export default SkyBlockMemberRiftWestVillage; diff --git a/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageCrazyKloon.test.ts b/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageCrazyKloon.test.ts new file mode 100644 index 000000000..ff1ce1669 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageCrazyKloon.test.ts @@ -0,0 +1,17 @@ +import SkyBlockMemberRiftWestVillageCrazyKloon from './SkyBlockMemberRiftWestVillageCrazyKloon.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberRiftWestVillageCrazyKloon', () => { + const data = new SkyBlockMemberRiftWestVillageCrazyKloon({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberRiftWestVillageCrazyKloon); + expectTypeOf(data).toEqualTypeOf(); + expect(data.selectedColors).toBeDefined(); + expectTypeOf(data.selectedColors).toEqualTypeOf>(); + expect(data.talked).toBeDefined(); + expectTypeOf(data.talked).toEqualTypeOf(); + expect(data.hackedTerminals).toBeDefined(); + expectTypeOf(data.hackedTerminals).toEqualTypeOf(); + expect(data.questComplete).toBeDefined(); + expectTypeOf(data.questComplete).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageCrazyKloon.ts b/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageCrazyKloon.ts new file mode 100644 index 000000000..1dec8f1e2 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageCrazyKloon.ts @@ -0,0 +1,14 @@ +class SkyBlockMemberRiftWestVillageCrazyKloon { + selectedColors: Record; + talked: boolean; + hackedTerminals: string[]; + questComplete: boolean; + constructor(data: Record) { + this.selectedColors = data?.selected_colors || {}; + this.talked = data?.talked || false; + this.hackedTerminals = data?.hacked_terminals || []; + this.questComplete = data?.quest_complete || false; + } +} + +export default SkyBlockMemberRiftWestVillageCrazyKloon; diff --git a/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageGlyphs.test.ts b/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageGlyphs.test.ts new file mode 100644 index 000000000..00a2981e1 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageGlyphs.test.ts @@ -0,0 +1,21 @@ +import SkyBlockMemberRiftWestVillageGlyphs from './SkyBlockMemberRiftWestVillageGlyphs.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberRiftWestVillageGlyphs', () => { + const data = new SkyBlockMemberRiftWestVillageGlyphs({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberRiftWestVillageGlyphs); + expectTypeOf(data).toEqualTypeOf(); + expect(data.claimedWand).toBeDefined(); + expectTypeOf(data.claimedWand).toEqualTypeOf(); + expect(data.currentGlyphDelivered).toBeDefined(); + expectTypeOf(data.currentGlyphDelivered).toEqualTypeOf(); + expect(data.currentGlyphCompleted).toBeDefined(); + expectTypeOf(data.currentGlyphCompleted).toEqualTypeOf(); + expect(data.currentGlyph).toBeDefined(); + expectTypeOf(data.currentGlyph).toEqualTypeOf(); + expect(data.completed).toBeDefined(); + expectTypeOf(data.completed).toEqualTypeOf(); + expect(data.claimedBracelet).toBeDefined(); + expectTypeOf(data.claimedBracelet).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageGlyphs.ts b/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageGlyphs.ts new file mode 100644 index 000000000..8101c11fe --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageGlyphs.ts @@ -0,0 +1,18 @@ +class SkyBlockMemberRiftWestVillageGlyphs { + claimedWand: boolean; + currentGlyphDelivered: boolean; + currentGlyphCompleted: boolean; + currentGlyph: number; + completed: boolean; + claimedBracelet: boolean; + constructor(data: Record) { + this.claimedWand = data?.claimed_wand || false; + this.currentGlyphDelivered = data?.current_glyph_delivered || false; + this.currentGlyphCompleted = data?.current_glyph_completed || false; + this.currentGlyph = data?.current_glyph || 0; + this.completed = data?.completed || false; + this.claimedBracelet = data?.claimed_bracelet || false; + } +} + +export default SkyBlockMemberRiftWestVillageGlyphs; diff --git a/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageKatHouse.test.ts b/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageKatHouse.test.ts new file mode 100644 index 000000000..79b3e012f --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageKatHouse.test.ts @@ -0,0 +1,15 @@ +import SkyBlockMemberRiftWestVillageKatHouse from './SkyBlockMemberRiftWestVillageKatHouse.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberRiftWestVillageKatHouse', () => { + const data = new SkyBlockMemberRiftWestVillageKatHouse({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberRiftWestVillageKatHouse); + expectTypeOf(data).toEqualTypeOf(); + expect(data.binCollectedSilverfish).toBeDefined(); + expectTypeOf(data.binCollectedSilverfish).toEqualTypeOf(); + expect(data.binCollectedSpider).toBeDefined(); + expectTypeOf(data.binCollectedSpider).toEqualTypeOf(); + expect(data.binCollectedMosquito).toBeDefined(); + expectTypeOf(data.binCollectedMosquito).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageKatHouse.ts b/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageKatHouse.ts new file mode 100644 index 000000000..8958c9626 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageKatHouse.ts @@ -0,0 +1,12 @@ +class SkyBlockMemberRiftWestVillageKatHouse { + binCollectedSilverfish: number; + binCollectedSpider: number; + binCollectedMosquito: number; + constructor(data: Record) { + this.binCollectedSilverfish = data?.bin_collected_silverfish || 0; + this.binCollectedSpider = data?.bin_collected_spider || 0; + this.binCollectedMosquito = data?.bin_collected_mosquito || 0; + } +} + +export default SkyBlockMemberRiftWestVillageKatHouse; diff --git a/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageMirrorverse.test.ts b/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageMirrorverse.test.ts new file mode 100644 index 000000000..9bd55163c --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageMirrorverse.test.ts @@ -0,0 +1,18 @@ +import SkyBlockMemberRiftWestVillageMirrorverse from './SkyBlockMemberRiftWestVillageMirrorverse.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { MirrorverseChestItem, MirrorverseRoom } from '../../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberRiftWestVillageMirrorverse', () => { + const data = new SkyBlockMemberRiftWestVillageMirrorverse({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberRiftWestVillageMirrorverse); + expectTypeOf(data).toEqualTypeOf(); + expect(data.visitedRooms).toBeDefined(); + expectTypeOf(data.visitedRooms).toEqualTypeOf(); + expect(data.upsideDownHard).toBeDefined(); + expectTypeOf(data.upsideDownHard).toEqualTypeOf(); + expect(data.claimedChestItems).toBeDefined(); + expectTypeOf(data.claimedChestItems).toEqualTypeOf(); + expect(data.claimedReward).toBeDefined(); + expectTypeOf(data.claimedReward).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageMirrorverse.ts b/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageMirrorverse.ts new file mode 100644 index 000000000..316adb8cd --- /dev/null +++ b/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageMirrorverse.ts @@ -0,0 +1,16 @@ +import type { MirrorverseChestItem, MirrorverseRoom } from '../../../../../Types/SkyBlock.js'; + +class SkyBlockMemberRiftWestVillageMirrorverse { + visitedRooms: MirrorverseRoom[]; + upsideDownHard: boolean; + claimedChestItems: MirrorverseChestItem[]; + claimedReward: boolean; + constructor(data: Record) { + this.visitedRooms = data?.visited_rooms || []; + this.upsideDownHard = data?.upside_down_hard || false; + this.claimedChestItems = data?.claimed_chest_items || []; + this.claimedReward = data?.claimed_reward || false; + } +} + +export default SkyBlockMemberRiftWestVillageMirrorverse; diff --git a/src/Structures/SkyBlock/Member/SkyBlockMember.test.ts b/src/Structures/SkyBlock/Member/SkyBlockMember.test.ts new file mode 100644 index 000000000..23a5010ee --- /dev/null +++ b/src/Structures/SkyBlock/Member/SkyBlockMember.test.ts @@ -0,0 +1,78 @@ +import SkyBlockMember from './SkyBlockMember.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockMemberAccessoryBag from './AccessoryBag/SkyBlockMemberAccessoryBag.js'; +import type SkyBlockMemberBestiary from './Bestiary/SkyBlockMemberBestiary.js'; +import type SkyBlockMemberChocolateFactory from './ChocolateFactory/SkyBlockMemberChocolateFactory.js'; +import type SkyBlockMemberCrimsonIsle from './CrimsonIsle/SkyBlockMemberCrimsonIsle.js'; +import type SkyBlockMemberCurrencies from './SkyBlockMemberCurrencies.js'; +import type SkyBlockMemberDungeons from './Dungeons/SkyBlockMemberDungeons.js'; +import type SkyBlockMemberFairySouls from './SkyBlockMemberFairySouls.js'; +import type SkyBlockMemberJacobContests from './JacobContests/SkyBlockMemberJacobContests.js'; +import type SkyBlockMemberLeveling from './SkyBlockMemberLeveling.js'; +import type SkyBlockMemberMining from './Mining/SkyBlockMemberMining.js'; +import type SkyBlockMemberObjectives from './SkyBlockMemberObjectives.js'; +import type SkyBlockMemberPets from './Pets/SkyBlockMemberPets.js'; +import type SkyBlockMemberPlayerData from './PlayerData/SkyBlockMemberPlayerData.js'; +import type SkyBlockMemberPlayerStats from './PlayerStats/SkyBlockMemberPlayerStats.js'; +import type SkyBlockMemberProfile from './SkyBlockMemberProfile.js'; +import type SkyBlockMemberQuests from './Quests/SkyBlockMemberQuests.js'; +import type SkyBlockMemberRift from './Rift/SkyBlockMemberRift.js'; +import type SkyBlockMemberSlayers from './Slayers/SkyBlockMemberSlayers.js'; +import type { SkyBlockArrow } from '../../../Types/SkyBlock.js'; +import type { UUID } from '../../../Types/Global.js'; + +test('SkyBlockMember', () => { + const data = new SkyBlockMember('meow', { stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMember); + expectTypeOf(data).toEqualTypeOf(); + expect(data.uuid).toBeDefined(); + expectTypeOf(data.uuid).toEqualTypeOf(); + expect(data.accessoryBag).toBeDefined(); + expectTypeOf(data.accessoryBag).toEqualTypeOf(); + expect(data.bestiary).toBeDefined(); + expectTypeOf(data.bestiary).toEqualTypeOf(); + expect(data.collections).toBeDefined(); + expectTypeOf(data.collections).toEqualTypeOf>(); + expect(data.currencies).toBeDefined(); + expectTypeOf(data.currencies).toEqualTypeOf(); + expect(data.dungeons).toBeDefined(); + expectTypeOf(data.dungeons).toEqualTypeOf(); + expect(data.chocolateFactory).toBeDefined(); + expectTypeOf(data.chocolateFactory).toEqualTypeOf(); + expect(data.fairySouls).toBeDefined(); + expectTypeOf(data.fairySouls).toEqualTypeOf(); + expect(data.soulflow).toBeDefined(); + expectTypeOf(data.soulflow).toEqualTypeOf(); + expect(data.favoriteArrow).toBeDefined(); + expectTypeOf(data.favoriteArrow).toEqualTypeOf(); + expect(data.jacobContests).toBeDefined(); + expectTypeOf(data.jacobContests).toEqualTypeOf(); + expect(data.leveling).toBeDefined(); + expectTypeOf(data.leveling).toEqualTypeOf(); + expect(data.mining).toBeDefined(); + expectTypeOf(data.mining).toEqualTypeOf(); + expect(data.crimsonIsle).toBeDefined(); + expectTypeOf(data.crimsonIsle).toEqualTypeOf(); + expect(data.objectives).toBeDefined(); + expectTypeOf(data.objectives).toEqualTypeOf(); + expect(data.pets).toBeDefined(); + expectTypeOf(data.pets).toEqualTypeOf(); + expect(data.playerData).toBeDefined(); + expectTypeOf(data.playerData).toEqualTypeOf(); + expect(data.playerStats).toBeDefined(); + expectTypeOf(data.playerStats).toEqualTypeOf(); + expect(data.profileStats).toBeDefined(); + expectTypeOf(data.profileStats).toEqualTypeOf(); + expect(data.quests).toBeDefined(); + expectTypeOf(data.quests).toEqualTypeOf(); + expect(data.slayers).toBeDefined(); + expectTypeOf(data.slayers).toEqualTypeOf(); + expect(data.rift).toBeDefined(); + expectTypeOf(data.rift).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => UUID>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.uuid); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/SkyBlockMember.ts b/src/Structures/SkyBlock/Member/SkyBlockMember.ts new file mode 100644 index 000000000..899345be5 --- /dev/null +++ b/src/Structures/SkyBlock/Member/SkyBlockMember.ts @@ -0,0 +1,81 @@ +import SkyBlockMemberAccessoryBag from './AccessoryBag/SkyBlockMemberAccessoryBag.js'; +import SkyBlockMemberBestiary from './Bestiary/SkyBlockMemberBestiary.js'; +import SkyBlockMemberChocolateFactory from './ChocolateFactory/SkyBlockMemberChocolateFactory.js'; +import SkyBlockMemberCrimsonIsle from './CrimsonIsle/SkyBlockMemberCrimsonIsle.js'; +import SkyBlockMemberCurrencies from './SkyBlockMemberCurrencies.js'; +import SkyBlockMemberDungeons from './Dungeons/SkyBlockMemberDungeons.js'; +import SkyBlockMemberFairySouls from './SkyBlockMemberFairySouls.js'; +import SkyBlockMemberInventories from './Inventories/SkyBlockMemberInventories.js'; +import SkyBlockMemberJacobContests from './JacobContests/SkyBlockMemberJacobContests.js'; +import SkyBlockMemberLeveling from './SkyBlockMemberLeveling.js'; +import SkyBlockMemberMining from './Mining/SkyBlockMemberMining.js'; +import SkyBlockMemberObjectives from './SkyBlockMemberObjectives.js'; +import SkyBlockMemberPets from './Pets/SkyBlockMemberPets.js'; +import SkyBlockMemberPlayerData from './PlayerData/SkyBlockMemberPlayerData.js'; +import SkyBlockMemberPlayerStats from './PlayerStats/SkyBlockMemberPlayerStats.js'; +import SkyBlockMemberProfile from './SkyBlockMemberProfile.js'; +import SkyBlockMemberQuests from './Quests/SkyBlockMemberQuests.js'; +import SkyBlockMemberRift from './Rift/SkyBlockMemberRift.js'; +import SkyBlockMemberSlayers from './Slayers/SkyBlockMemberSlayers.js'; +import type { SkyBlockArrow } from '../../../Types/SkyBlock.js'; +import type { UUID } from '../../../Types/Global.js'; + +class SkyBlockMember { + uuid: UUID; + accessoryBag: SkyBlockMemberAccessoryBag; + bestiary: SkyBlockMemberBestiary; + collections: Record; + currencies: SkyBlockMemberCurrencies; + dungeons: SkyBlockMemberDungeons; + chocolateFactory: SkyBlockMemberChocolateFactory; + fairySouls: SkyBlockMemberFairySouls; + soulflow: number; + favoriteArrow: SkyBlockArrow; + jacobContests: SkyBlockMemberJacobContests; + leveling: SkyBlockMemberLeveling; + mining: SkyBlockMemberMining; + crimsonIsle: SkyBlockMemberCrimsonIsle; + objectives: SkyBlockMemberObjectives; + pets: SkyBlockMemberPets; + playerData: SkyBlockMemberPlayerData; + playerStats: SkyBlockMemberPlayerStats; + profileStats: SkyBlockMemberProfile; + quests: SkyBlockMemberQuests; + slayers: SkyBlockMemberSlayers; + rift: SkyBlockMemberRift; + inventory: SkyBlockMemberInventories; + constructor(uuid: string, data: Record) { + this.uuid = uuid; + this.accessoryBag = new SkyBlockMemberAccessoryBag(data?.accessory_bag_storage || {}); + this.bestiary = new SkyBlockMemberBestiary(data?.bestiary || {}); + this.collections = data?.collection || {}; + this.currencies = new SkyBlockMemberCurrencies(data?.currencies || {}); + this.dungeons = new SkyBlockMemberDungeons(data?.dungeons || {}); + this.chocolateFactory = new SkyBlockMemberChocolateFactory(data?.events?.easter || {}); + this.fairySouls = new SkyBlockMemberFairySouls(data?.fairy_soul || {}); + this.soulflow = data?.item_data?.soulflow || 0; + this.favoriteArrow = data?.item_data?.favorite_arrow || 'ARROW'; + this.jacobContests = new SkyBlockMemberJacobContests(data?.jacobs_contest || {}); + this.leveling = new SkyBlockMemberLeveling(data?.leveling || {}); + this.mining = new SkyBlockMemberMining({ ...(data?.mining_core || {}), ...(data?.forge || {}) }); + this.crimsonIsle = new SkyBlockMemberCrimsonIsle(data?.nether_island_player_data || {}, data?.trophy_fish || {}); + this.objectives = new SkyBlockMemberObjectives(data?.objectives || {}); + this.pets = new SkyBlockMemberPets({ ...(data?.pets_data || {}), ...(data?.player_stats?.pets || {}) }); + this.playerData = new SkyBlockMemberPlayerData(data?.player_data || {}, { + farmingCap: this.jacobContests.perks.farmingLevelCap || 0, + tamingCap: this.pets.petCare.petsSacrificed.length || 0 + }); + this.playerStats = new SkyBlockMemberPlayerStats(data?.player_stats || {}); + this.profileStats = new SkyBlockMemberProfile(data?.profile || {}); + this.quests = new SkyBlockMemberQuests(data?.quests || {}); + this.slayers = new SkyBlockMemberSlayers(data?.slayer || {}); + this.rift = new SkyBlockMemberRift(data?.rift || {}); + this.inventory = new SkyBlockMemberInventories(data?.inventory || {}); + } + + toString(): UUID { + return this.uuid; + } +} + +export default SkyBlockMember; diff --git a/src/Structures/SkyBlock/Member/SkyBlockMemberCurrencies.test.ts b/src/Structures/SkyBlock/Member/SkyBlockMemberCurrencies.test.ts new file mode 100644 index 000000000..926cd83f9 --- /dev/null +++ b/src/Structures/SkyBlock/Member/SkyBlockMemberCurrencies.test.ts @@ -0,0 +1,29 @@ +import SkyBlockMemberCurrencies from './SkyBlockMemberCurrencies.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberCurrencies', () => { + const data = new SkyBlockMemberCurrencies({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberCurrencies); + expectTypeOf(data).toEqualTypeOf(); + expect(data.purse).toBeDefined(); + expectTypeOf(data.purse).toEqualTypeOf(); + expect(data.motesPurse).toBeDefined(); + expectTypeOf(data.motesPurse).toEqualTypeOf(); + expect(data.witherEssence).toBeDefined(); + expectTypeOf(data.witherEssence).toEqualTypeOf(); + expect(data.dragonEssence).toBeDefined(); + expectTypeOf(data.dragonEssence).toEqualTypeOf(); + expect(data.spiderEssence).toBeDefined(); + expectTypeOf(data.spiderEssence).toEqualTypeOf(); + expect(data.undeadEssence).toBeDefined(); + expectTypeOf(data.undeadEssence).toEqualTypeOf(); + expect(data.diamondEssence).toBeDefined(); + expectTypeOf(data.diamondEssence).toEqualTypeOf(); + expect(data.goldEssence).toBeDefined(); + expectTypeOf(data.goldEssence).toEqualTypeOf(); + expect(data.iceEssence).toBeDefined(); + expectTypeOf(data.iceEssence).toEqualTypeOf(); + expect(data.crimsonEssence).toBeDefined(); + expectTypeOf(data.crimsonEssence).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/SkyBlockMemberCurrencies.ts b/src/Structures/SkyBlock/Member/SkyBlockMemberCurrencies.ts new file mode 100644 index 000000000..52ef173d0 --- /dev/null +++ b/src/Structures/SkyBlock/Member/SkyBlockMemberCurrencies.ts @@ -0,0 +1,26 @@ +class SkyBlockMemberCurrencies { + purse: number; + motesPurse: number; + witherEssence: number; + dragonEssence: number; + spiderEssence: number; + undeadEssence: number; + diamondEssence: number; + goldEssence: number; + iceEssence: number; + crimsonEssence: number; + constructor(data: Record) { + this.purse = data?.coin_purse || 0; + this.motesPurse = data?.motes_purse || 0; + this.witherEssence = data.essence?.WITHER?.current || 0; + this.dragonEssence = data.essence?.DRAGON?.current || 0; + this.spiderEssence = data.essence?.SPIDER?.current || 0; + this.undeadEssence = data.essence?.UNDEAD?.current || 0; + this.diamondEssence = data.essence?.DIAMOND?.current || 0; + this.goldEssence = data.essence?.GOLD?.current || 0; + this.iceEssence = data.essence?.ICE?.current || 0; + this.crimsonEssence = data.essence?.CRIMSON?.current || 0; + } +} + +export default SkyBlockMemberCurrencies; diff --git a/src/Structures/SkyBlock/Member/SkyBlockMemberFairySouls.test.ts b/src/Structures/SkyBlock/Member/SkyBlockMemberFairySouls.test.ts new file mode 100644 index 000000000..fbd366a88 --- /dev/null +++ b/src/Structures/SkyBlock/Member/SkyBlockMemberFairySouls.test.ts @@ -0,0 +1,15 @@ +import SkyBlockMemberFairySouls from './SkyBlockMemberFairySouls.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberFairySouls', () => { + const data = new SkyBlockMemberFairySouls({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberFairySouls); + expectTypeOf(data).toEqualTypeOf(); + expect(data.exchanges).toBeDefined(); + expectTypeOf(data.exchanges).toEqualTypeOf(); + expect(data.collected).toBeDefined(); + expectTypeOf(data.collected).toEqualTypeOf(); + expect(data.unspent).toBeDefined(); + expectTypeOf(data.unspent).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/SkyBlockMemberFairySouls.ts b/src/Structures/SkyBlock/Member/SkyBlockMemberFairySouls.ts new file mode 100644 index 000000000..be785a019 --- /dev/null +++ b/src/Structures/SkyBlock/Member/SkyBlockMemberFairySouls.ts @@ -0,0 +1,16 @@ +class SkyBlockMemberFairySouls { + exchanges: number; + collected: number; + unspent: number; + constructor(data: Record) { + this.exchanges = data?.fairy_exchanges || 0; + this.collected = data?.total_collected || 0; + this.unspent = data?.unspent_souls || 0; + } + + toString(): number { + return this.collected; + } +} + +export default SkyBlockMemberFairySouls; diff --git a/src/Structures/SkyBlock/Member/SkyBlockMemberLeveling.test.ts b/src/Structures/SkyBlock/Member/SkyBlockMemberLeveling.test.ts new file mode 100644 index 000000000..649466342 --- /dev/null +++ b/src/Structures/SkyBlock/Member/SkyBlockMemberLeveling.test.ts @@ -0,0 +1,34 @@ +import SkyBlockMemberLeveling from './SkyBlockMemberLeveling.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { TaskLevelingSort } from '../../../Types/SkyBlock.js'; + +test('SkyBlockMemberLeveling', () => { + const data = new SkyBlockMemberLeveling({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberLeveling); + expectTypeOf(data).toEqualTypeOf(); + expect(data.experience).toBeDefined(); + expectTypeOf(data.experience).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.completions).toBeDefined(); + expectTypeOf(data.completions).toEqualTypeOf>(); + expect(data.completed).toBeDefined(); + expectTypeOf(data.completed).toEqualTypeOf(); + expect(data.completedTasks).toBeDefined(); + expectTypeOf(data.completedTasks).toEqualTypeOf(); + expect(data.lastViewedTasks).toBeDefined(); + expectTypeOf(data.lastViewedTasks).toEqualTypeOf(); + expect(data.highestPetScore).toBeDefined(); + expectTypeOf(data.highestPetScore).toEqualTypeOf(); + expect(data.miningFiestaOresMined).toBeDefined(); + expectTypeOf(data.miningFiestaOresMined).toEqualTypeOf(); + expect(data.fishingFestivalSharksKilled).toBeDefined(); + expectTypeOf(data.fishingFestivalSharksKilled).toEqualTypeOf(); + expect(data.taskSort).toBeDefined(); + expectTypeOf(data.taskSort).toEqualTypeOf(); + expect(data.claimedTalisman).toBeDefined(); + expectTypeOf(data.claimedTalisman).toEqualTypeOf(); + expect(data.emblemUnlocks).toBeDefined(); + expectTypeOf(data.emblemUnlocks).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/SkyBlockMemberLeveling.ts b/src/Structures/SkyBlock/Member/SkyBlockMemberLeveling.ts new file mode 100644 index 000000000..ca12d87ee --- /dev/null +++ b/src/Structures/SkyBlock/Member/SkyBlockMemberLeveling.ts @@ -0,0 +1,36 @@ +import type { TaskLevelingSort } from '../../../Types/SkyBlock.js'; + +class SkyBlockMemberLeveling { + experience: number; + level: number; + completions: Record; + completed: string[]; + completedTasks: string[]; + lastViewedTasks: string[]; + highestPetScore: number; + miningFiestaOresMined: number; + fishingFestivalSharksKilled: number; + taskSort: TaskLevelingSort | 'UNKNOWN'; + claimedTalisman: boolean; + emblemUnlocks: string[]; + constructor(data: Record) { + this.experience = data?.experience || 0; + this.level = this.experience / 100; + this.completions = data?.completions || {}; + this.completed = data?.completed || []; + this.completedTasks = data?.completed_tasks || []; + this.lastViewedTasks = data?.last_viewed_tasks || []; + this.highestPetScore = data?.highest_pet_score || 0; + this.miningFiestaOresMined = data?.mining_fiesta_ores_mined || 0; + this.fishingFestivalSharksKilled = data?.fishing_festival_sharks_killed || 0; + this.taskSort = data?.task_sort || 'UNKNOWN'; + this.claimedTalisman = data?.claimed_talisman || false; + this.emblemUnlocks = data?.emblem_unlocks || []; + } + + toString(): number { + return this.level; + } +} + +export default SkyBlockMemberLeveling; diff --git a/src/Structures/SkyBlock/Member/SkyBlockMemberObjectives.test.ts b/src/Structures/SkyBlock/Member/SkyBlockMemberObjectives.test.ts new file mode 100644 index 000000000..7a762fd8f --- /dev/null +++ b/src/Structures/SkyBlock/Member/SkyBlockMemberObjectives.test.ts @@ -0,0 +1,14 @@ +import SkyBlockMemberObjectives from './SkyBlockMemberObjectives.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { RawSkyBlockObjective } from '../../../Types/SkyBlock.js'; + +test('SkyBlockMemberObjectives', () => { + const data = new SkyBlockMemberObjectives({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberObjectives); + expectTypeOf(data).toEqualTypeOf(); + expect(data.objectives).toBeDefined(); + expectTypeOf(data.objectives).toEqualTypeOf>(); + expect(data.tutorial).toBeDefined(); + expectTypeOf(data.tutorial).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/SkyBlockMemberObjectives.ts b/src/Structures/SkyBlock/Member/SkyBlockMemberObjectives.ts new file mode 100644 index 000000000..22dacec92 --- /dev/null +++ b/src/Structures/SkyBlock/Member/SkyBlockMemberObjectives.ts @@ -0,0 +1,17 @@ +import type { RawSkyBlockObjective } from '../../../Types/SkyBlock.js'; + +class SkyBlockMemberObjectives { + objectives: Record; + tutorial: string[]; + constructor(data: Record) { + this.objectives = Object.keys(data) + .filter((key) => 'tutorial' !== key) + .reduce((obj: Record, key: string) => { + obj[key] = data[key]; + return obj; + }, {}); + this.tutorial = data?.tutorial || []; + } +} + +export default SkyBlockMemberObjectives; diff --git a/src/Structures/SkyBlock/Member/SkyBlockMemberProfile.test.ts b/src/Structures/SkyBlock/Member/SkyBlockMemberProfile.test.ts new file mode 100644 index 000000000..521ac35f1 --- /dev/null +++ b/src/Structures/SkyBlock/Member/SkyBlockMemberProfile.test.ts @@ -0,0 +1,19 @@ +import SkyBlockMemberProfile from './SkyBlockMemberProfile.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberProfile', () => { + const data = new SkyBlockMemberProfile({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberProfile); + expectTypeOf(data).toEqualTypeOf(); + expect(data.firstJoin).toBeDefined(); + expectTypeOf(data.firstJoin).toEqualTypeOf(); + expect(data.firstJoinDate).toBeDefined(); + expectTypeOf(data.firstJoinDate).toEqualTypeOf(); + expect(data.personalBankUpgrade).toBeDefined(); + expectTypeOf(data.personalBankUpgrade).toEqualTypeOf(); + expect(data.bankAccount).toBeDefined(); + expectTypeOf(data.bankAccount).toEqualTypeOf(); + expect(data.hasCookie).toBeDefined(); + expectTypeOf(data.hasCookie).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/SkyBlockMemberProfile.ts b/src/Structures/SkyBlock/Member/SkyBlockMemberProfile.ts new file mode 100644 index 000000000..c636ae749 --- /dev/null +++ b/src/Structures/SkyBlock/Member/SkyBlockMemberProfile.ts @@ -0,0 +1,16 @@ +class SkyBlockMemberProfile { + firstJoin: number; + firstJoinDate: Date; + personalBankUpgrade: number; + bankAccount: number; + hasCookie: boolean; + constructor(data: Record) { + this.firstJoin = data?.first_join || 0; + this.firstJoinDate = new Date(this.firstJoin); + this.personalBankUpgrade = data?.personal_bank_upgrade || 0; + this.bankAccount = data?.bank_account || 0; + this.hasCookie = data?.cookie_buff_active || false; + } +} + +export default SkyBlockMemberProfile; diff --git a/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayer.test.ts b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayer.test.ts new file mode 100644 index 000000000..802e04a0e --- /dev/null +++ b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayer.test.ts @@ -0,0 +1,25 @@ +import SkyBlockMemberSlayer from './SkyBlockMemberSlayer.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockMemberSlayerClaimedLevels from './SkyBlockMemberSlayerClaimedLevels.js'; +import type { LevelData } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberSlayer', () => { + const data = new SkyBlockMemberSlayer({ stats: 'meow' }, 'zombie'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberSlayer); + expectTypeOf(data).toEqualTypeOf(); + expect(data.claimedLevels).toBeDefined(); + expectTypeOf(data.claimedLevels).toEqualTypeOf(); + expect(data.tier0Kills).toBeDefined(); + expectTypeOf(data.tier0Kills).toEqualTypeOf(); + expect(data.tier1Kills).toBeDefined(); + expectTypeOf(data.tier1Kills).toEqualTypeOf(); + expect(data.tier2Kills).toBeDefined(); + expectTypeOf(data.tier2Kills).toEqualTypeOf(); + expect(data.tier3Kills).toBeDefined(); + expectTypeOf(data.tier3Kills).toEqualTypeOf(); + expect(data.tier4Kills).toBeDefined(); + expectTypeOf(data.tier4Kills).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expectTypeOf(data.level).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayer.ts b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayer.ts new file mode 100644 index 000000000..11f4e27fd --- /dev/null +++ b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayer.ts @@ -0,0 +1,28 @@ +import SkyBlockMemberSlayerClaimedLevels from './SkyBlockMemberSlayerClaimedLevels.js'; +import { getSlayerLevel } from '../../../../Utils/SkyBlockUtils.js'; +import type { LevelData, SkyBlockSlayer } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberSlayer { + claimedLevels: SkyBlockMemberSlayerClaimedLevels; + tier0Kills: number; + tier1Kills: number; + tier2Kills: number; + tier3Kills: number; + tier4Kills: number; + level: LevelData; + constructor(data: Record, slayer: SkyBlockSlayer) { + this.claimedLevels = new SkyBlockMemberSlayerClaimedLevels(data?.claimed_levels || {}); + this.tier0Kills = data?.boss_kills_tier_0 || 0; + this.tier1Kills = data?.boss_kills_tier_1 || 0; + this.tier2Kills = data?.boss_kills_tier_2 || 0; + this.tier3Kills = data?.boss_kills_tier_3 || 0; + this.tier4Kills = data?.boss_kills_tier_4 || 0; + this.level = getSlayerLevel(slayer, data?.xp); + } + + toString(): number { + return this.level.level; + } +} + +export default SkyBlockMemberSlayer; diff --git a/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayerClaimedLevels.test.ts b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayerClaimedLevels.test.ts new file mode 100644 index 000000000..649861c3c --- /dev/null +++ b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayerClaimedLevels.test.ts @@ -0,0 +1,27 @@ +import SkyBlockMemberSlayerClaimedLevels from './SkyBlockMemberSlayerClaimedLevels.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberSlayerClaimedLevels', () => { + const data = new SkyBlockMemberSlayerClaimedLevels({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberSlayerClaimedLevels); + expectTypeOf(data).toEqualTypeOf(); + expect(data.level1).toBeDefined(); + expectTypeOf(data.level1).toEqualTypeOf(); + expect(data.level2).toBeDefined(); + expectTypeOf(data.level2).toEqualTypeOf(); + expect(data.level3).toBeDefined(); + expectTypeOf(data.level3).toEqualTypeOf(); + expect(data.level4).toBeDefined(); + expectTypeOf(data.level4).toEqualTypeOf(); + expect(data.level5).toBeDefined(); + expectTypeOf(data.level5).toEqualTypeOf(); + expect(data.level6).toBeDefined(); + expectTypeOf(data.level6).toEqualTypeOf(); + expect(data.level7).toBeDefined(); + expectTypeOf(data.level7).toEqualTypeOf(); + expect(data.level8).toBeDefined(); + expectTypeOf(data.level8).toEqualTypeOf(); + expect(data.level9).toBeDefined(); + expectTypeOf(data.level9).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayerClaimedLevels.ts b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayerClaimedLevels.ts new file mode 100644 index 000000000..fe48c284a --- /dev/null +++ b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayerClaimedLevels.ts @@ -0,0 +1,24 @@ +class SkyBlockMemberSlayerClaimedLevels { + level1: boolean; + level2: boolean; + level3: boolean; + level4: boolean; + level5: boolean; + level6: boolean; + level7: boolean; + level8: boolean; + level9: boolean; + constructor(data: Record) { + this.level1 = data?.level_1 ?? data?.level_1_special ?? false; + this.level2 = data?.level_2 ?? data?.level_2_special ?? false; + this.level3 = data?.level_3 ?? data?.level_3_special ?? false; + this.level4 = data?.level_4 ?? data?.level_4_special ?? false; + this.level5 = data?.level_5 ?? data?.level_5_special ?? false; + this.level6 = data?.level_6 ?? data?.level_6_special ?? false; + this.level7 = data?.level_7 ?? data?.level_7_special ?? false; + this.level8 = data?.level_8 ?? data?.level_8_special ?? false; + this.level9 = data?.level_9 ?? data?.level_9_special ?? false; + } +} + +export default SkyBlockMemberSlayerClaimedLevels; diff --git a/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayers.test.ts b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayers.test.ts new file mode 100644 index 000000000..16e5a4f76 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayers.test.ts @@ -0,0 +1,25 @@ +import SkyBlockMemberSlayers from './SkyBlockMemberSlayers.js'; +import SkyBlockMemberSlayersQuest from './SkyBlockMemberSlayersQuest.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockMemberSlayer from './SkyBlockMemberSlayer.js'; + +test('SkyBlockMemberSlayers', () => { + const data = new SkyBlockMemberSlayers({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberSlayers); + expectTypeOf(data).toEqualTypeOf(); + expect(data.activeSlayer).toBeDefined(); + expectTypeOf(data.activeSlayer).toEqualTypeOf(); + expect(data.zombie).toBeDefined(); + expectTypeOf(data.zombie).toEqualTypeOf(); + expect(data.spider).toBeDefined(); + expectTypeOf(data.spider).toEqualTypeOf(); + expect(data.wolf).toBeDefined(); + expectTypeOf(data.wolf).toEqualTypeOf(); + expect(data.enderman).toBeDefined(); + expectTypeOf(data.enderman).toEqualTypeOf(); + expect(data.blaze).toBeDefined(); + expectTypeOf(data.blaze).toEqualTypeOf(); + expect(data.vampire).toBeDefined(); + expectTypeOf(data.vampire).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayers.ts b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayers.ts new file mode 100644 index 000000000..bf8005f5e --- /dev/null +++ b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayers.ts @@ -0,0 +1,23 @@ +import SkyBlockMemberSlayer from './SkyBlockMemberSlayer.js'; +import SkyBlockMemberSlayersQuest from './SkyBlockMemberSlayersQuest.js'; + +class SkyBlockMemberSlayers { + activeSlayer: SkyBlockMemberSlayersQuest | null; + zombie: SkyBlockMemberSlayer; + spider: SkyBlockMemberSlayer; + wolf: SkyBlockMemberSlayer; + enderman: SkyBlockMemberSlayer; + blaze: SkyBlockMemberSlayer; + vampire: SkyBlockMemberSlayer; + constructor(data: Record) { + this.activeSlayer = data?.slayer_quest ? new SkyBlockMemberSlayersQuest(data?.slayer_quest || {}) : null; + this.zombie = new SkyBlockMemberSlayer(data?.slayer_bosses?.zombie || {}, 'zombie'); + this.spider = new SkyBlockMemberSlayer(data?.slayer_bosses?.spider || {}, 'spider'); + this.wolf = new SkyBlockMemberSlayer(data?.slayer_bosses?.wolf || {}, 'wolf'); + this.enderman = new SkyBlockMemberSlayer(data?.slayer_bosses?.enderman || {}, 'enderman'); + this.blaze = new SkyBlockMemberSlayer(data?.slayer_bosses?.blaze || {}, 'blaze'); + this.vampire = new SkyBlockMemberSlayer(data?.slayer_bosses?.vampire || {}, 'vampire'); + } +} + +export default SkyBlockMemberSlayers; diff --git a/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayersQuest.test.ts b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayersQuest.test.ts new file mode 100644 index 000000000..483e95395 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayersQuest.test.ts @@ -0,0 +1,36 @@ +import SkyBlockMemberSlayersQuest from './SkyBlockMemberSlayersQuest.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { SkyBlockArea, SkyBlockSlayer } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockMemberSlayersQuest', () => { + const data = new SkyBlockMemberSlayersQuest({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberSlayersQuest); + expectTypeOf(data).toEqualTypeOf(); + expect(data.type).toBeDefined(); + expectTypeOf(data.type).toEqualTypeOf(); + expect(data.tier).toBeDefined(); + expectTypeOf(data.tier).toEqualTypeOf(); + expect(data.startTimestamp).toBeDefined(); + expectTypeOf(data.startTimestamp).toEqualTypeOf(); + expect(data.startAt).toBeDefined(); + expectTypeOf(data.startAt).toEqualTypeOf(); + expect(data.completionState).toBeDefined(); + expectTypeOf(data.completionState).toEqualTypeOf(); + expect(data.usedArmor).toBeDefined(); + expectTypeOf(data.usedArmor).toEqualTypeOf(); + expect(data.solo).toBeDefined(); + expectTypeOf(data.solo).toEqualTypeOf(); + expect(data.combatXp).toBeDefined(); + expectTypeOf(data.combatXp).toEqualTypeOf(); + expect(data.recentMobKills).toBeDefined(); + expectTypeOf(data.recentMobKills).toEqualTypeOf<{ xp: number; timestamp: number; timestampAt: Date }[]>(); + expect(data.lastKilledMobIsland).toBeDefined(); + expectTypeOf(data.lastKilledMobIsland).toEqualTypeOf(); + expect(data.xpOnLastFollowerSpawn).toBeDefined(); + expectTypeOf(data.xpOnLastFollowerSpawn).toEqualTypeOf(); + expect(data.spawnTimestamp).toBeDefined(); + expectTypeOf(data.spawnTimestamp).toEqualTypeOf(); + expect(data.spawnAt).toBeDefined(); + expectTypeOf(data.spawnAt).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayersQuest.ts b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayersQuest.ts new file mode 100644 index 000000000..9d81be001 --- /dev/null +++ b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayersQuest.ts @@ -0,0 +1,36 @@ +import type { SkyBlockArea, SkyBlockSlayer } from '../../../../Types/SkyBlock.js'; + +class SkyBlockMemberSlayerQuest { + type: SkyBlockSlayer | 'UNKNOWN'; + tier: number; + startTimestamp: number; + startAt: Date; + completionState: number; + usedArmor: boolean; + solo: boolean; + combatXp: number; + recentMobKills: { xp: number; timestamp: number; timestampAt: Date }[]; + lastKilledMobIsland: SkyBlockArea | 'UNKNOWN'; + xpOnLastFollowerSpawn: number; + spawnTimestamp: number; + spawnAt: Date; + constructor(data: Record) { + this.type = data?.type || 'UNKNOWN'; + this.tier = data?.tier || 0; + this.startTimestamp = data?.start_timestamp || 0; + this.startAt = new Date(this.startTimestamp); + this.completionState = data?.completion_state || 0; + this.usedArmor = data?.used_armor || 0; + this.solo = data?.solo || 0; + this.combatXp = data?.combat_xp || 0; + this.recentMobKills = (data?.recent_mob_kills || []).map((mob: { xp: number; timestamp: number }) => { + return { ...mob, timestampAt: new Date(mob.timestamp) }; + }); + this.lastKilledMobIsland = data?.last_killed_mob_island || 'UNKNOWN'; + this.xpOnLastFollowerSpawn = data?.xp_on_last_follower_spawn || 0; + this.spawnTimestamp = data?.spawn_timestamp || 0; + this.spawnAt = new Date(this.spawnTimestamp); + } +} + +export default SkyBlockMemberSlayerQuest; diff --git a/src/Structures/SkyBlock/Museum/SkyBlockMuseum.test.ts b/src/Structures/SkyBlock/Museum/SkyBlockMuseum.test.ts new file mode 100644 index 000000000..dc3696efe --- /dev/null +++ b/src/Structures/SkyBlock/Museum/SkyBlockMuseum.test.ts @@ -0,0 +1,13 @@ +import SkyBlockMuseum from './SkyBlockMuseum.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockMuseumMember from './SkyBlockMuseumMember.js'; +import type { UUID } from '../../../Types/Global.js'; + +test('SkyBlockMuseum', () => { + const data = new SkyBlockMuseum({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMuseum); + expectTypeOf(data).toEqualTypeOf(); + expect(data.members).toBeDefined(); + expectTypeOf(data.members).toEqualTypeOf>(); +}); diff --git a/src/Structures/SkyBlock/Museum/SkyBlockMuseum.ts b/src/Structures/SkyBlock/Museum/SkyBlockMuseum.ts new file mode 100644 index 000000000..ac082e13a --- /dev/null +++ b/src/Structures/SkyBlock/Museum/SkyBlockMuseum.ts @@ -0,0 +1,15 @@ +import SkyBlockMuseumMember from './SkyBlockMuseumMember.js'; +import type { UUID } from '../../../Types/Global.js'; + +class SkyBlockMuseum { + members: Record; + constructor(data: Record) { + const members = data?.members || {}; + this.members = Object.keys(members).reduce((obj: Record, key: UUID) => { + obj[key] = new SkyBlockMuseumMember(members?.[key] || {}); + return obj; + }, {}); + } +} + +export default SkyBlockMuseum; diff --git a/src/Structures/SkyBlock/Museum/SkyBlockMuseumItem.test.ts b/src/Structures/SkyBlock/Museum/SkyBlockMuseumItem.test.ts new file mode 100644 index 000000000..e44f62557 --- /dev/null +++ b/src/Structures/SkyBlock/Museum/SkyBlockMuseumItem.test.ts @@ -0,0 +1,22 @@ +import SkyBlockMuseumItem from './SkyBlockMuseumItem.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockInventoryItem from '../Inventory/SkyBlockInventoryItem.js'; + +test('SkyBlockMuseumItem', () => { + const data = new SkyBlockMuseumItem('meow', { stats: 'meow' }, []); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMuseumItem); + expectTypeOf(data).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.donated).toBeDefined(); + expectTypeOf(data.donated).toEqualTypeOf(); + expect(data.donatedAt).toBeDefined(); + expectTypeOf(data.donatedAt).toEqualTypeOf(); + expect(data.featuredSlot).toBeDefined(); + expectTypeOf(data.featuredSlot).toEqualTypeOf(); + expect(data.borrowing).toBeDefined(); + expectTypeOf(data.borrowing).toEqualTypeOf(); + expect(data.items).toBeDefined(); + expectTypeOf(data.items).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Museum/SkyBlockMuseumItem.ts b/src/Structures/SkyBlock/Museum/SkyBlockMuseumItem.ts new file mode 100644 index 000000000..e788f8625 --- /dev/null +++ b/src/Structures/SkyBlock/Museum/SkyBlockMuseumItem.ts @@ -0,0 +1,28 @@ +import SkyBlockInventoryItem from '../Inventory/SkyBlockInventoryItem.js'; + +class SkyBlockMuseumItem { + name: string; + donated: number; + donatedAt: Date; + featuredSlot: string | null; + borrowing: boolean; + items: SkyBlockInventoryItem[]; + constructor(name: string, data: Record, decoded: any[]) { + this.name = name; + this.donated = data?.donated_time || 0; + this.donatedAt = new Date(this.donated); + this.featuredSlot = data?.featured_slot || null; + this.borrowing = data?.borrowing || false; + this.items = []; + decoded.forEach((item) => { + if (!item.tag) return; + this.items.push(new SkyBlockInventoryItem(item)); + }); + } + + toString(): string { + return this.name; + } +} + +export default SkyBlockMuseumItem; diff --git a/src/Structures/SkyBlock/Museum/SkyBlockMuseumMember.test.ts b/src/Structures/SkyBlock/Museum/SkyBlockMuseumMember.test.ts new file mode 100644 index 000000000..1999119eb --- /dev/null +++ b/src/Structures/SkyBlock/Museum/SkyBlockMuseumMember.test.ts @@ -0,0 +1,18 @@ +import SkyBlockMuseumMember from './SkyBlockMuseumMember.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockMuseumItem from './SkyBlockMuseumItem.js'; + +test('SkyBlockMuseumMember', () => { + const data = new SkyBlockMuseumMember({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMuseumMember); + expectTypeOf(data).toEqualTypeOf(); + expect(data.value).toBeDefined(); + expectTypeOf(data.value).toEqualTypeOf(); + expect(data.appraisal).toBeDefined(); + expectTypeOf(data.appraisal).toEqualTypeOf(); + expect(data.rawItems).toBeDefined(); + expectTypeOf(data.rawItems).toEqualTypeOf>(); + expect(data.getItems).toBeDefined(); + expectTypeOf(data.getItems).toEqualTypeOf<() => Promise>(); +}); diff --git a/src/Structures/SkyBlock/Museum/SkyBlockMuseumMember.ts b/src/Structures/SkyBlock/Museum/SkyBlockMuseumMember.ts new file mode 100644 index 000000000..d650c3178 --- /dev/null +++ b/src/Structures/SkyBlock/Museum/SkyBlockMuseumMember.ts @@ -0,0 +1,25 @@ +import SkyBlockMuseumItem from './SkyBlockMuseumItem.js'; +import { decode } from '../../../Utils/SkyBlockUtils.js'; + +class SkyBlockMuseumMember { + value: number; + appraisal: boolean; + rawItems: Record; + getItems: () => Promise; + constructor(data: Record) { + this.value = data?.value || 0; + this.appraisal = data?.appraisal || false; + this.rawItems = data?.items || {}; + this.getItems = async (): Promise => { + const items: SkyBlockMuseumItem[] = []; + for (const item of Object.keys(data?.items || {})) { + items.push( + new SkyBlockMuseumItem(item, data?.items?.[item] || {}, await decode((data?.items?.[item] || {})?.data)) + ); + } + return items; + }; + } +} + +export default SkyBlockMuseumMember; diff --git a/src/Structures/SkyBlock/News/SkyBlockNews.test.ts b/src/Structures/SkyBlock/News/SkyBlockNews.test.ts new file mode 100644 index 000000000..a046c120c --- /dev/null +++ b/src/Structures/SkyBlock/News/SkyBlockNews.test.ts @@ -0,0 +1,17 @@ +import SkyBlockNews from './SkyBlockNews.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockNews', () => { + const data = new SkyBlockNews({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockNews); + expectTypeOf(data).toEqualTypeOf(); + expect(data.title).toBeDefined(); + expectTypeOf(data.title).toEqualTypeOf(); + expect(data.link).toBeDefined(); + expectTypeOf(data.link).toEqualTypeOf(); + expect(data.date).toBeDefined(); + expectTypeOf(data.date).toEqualTypeOf(); + expect(data.version).toBeDefined(); + expectTypeOf(data.version).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/News/SkyblockNews.ts b/src/Structures/SkyBlock/News/SkyBlockNews.ts similarity index 77% rename from src/Structures/SkyBlock/News/SkyblockNews.ts rename to src/Structures/SkyBlock/News/SkyBlockNews.ts index fc4d41fdb..b8d058c33 100644 --- a/src/Structures/SkyBlock/News/SkyblockNews.ts +++ b/src/Structures/SkyBlock/News/SkyBlockNews.ts @@ -13,17 +13,15 @@ function parseVer(stringVer: string): string | null { return matches[0]; } -class SkyblockNews { +class SkyBlockNews { title: string; link: string; - rawDate: string; date: Date | null; version: string | null; constructor(data: Record) { - this.title = data.title; - this.link = data.link; - this.rawDate = data.text; - this.date = parseDate(data.text); + this.title = data?.title || 'UNKNOWN'; + this.link = data?.link || 'UNKNOWN'; + this.date = parseDate(data?.text || 'UNKNOWN'); this.version = parseVer(this.title); } @@ -32,4 +30,4 @@ class SkyblockNews { } } -export default SkyblockNews; +export default SkyBlockNews; diff --git a/src/Structures/SkyBlock/Potion/SkyBlockPotionEffect.ts b/src/Structures/SkyBlock/Potion/SkyBlockPotionEffect.ts new file mode 100644 index 000000000..8d4b97620 --- /dev/null +++ b/src/Structures/SkyBlock/Potion/SkyBlockPotionEffect.ts @@ -0,0 +1,25 @@ +import TicksToMilliseconds from '../../../Utils/TicksToMilliseconds.js'; +import type { SkyBlockPotionEffectName } from '../../../Types/SkyBlock.js'; + +class SkyBlockPotionEffect { + effect: SkyBlockPotionEffectName | 'UNKNOWN'; + level: number; + modifiers: { key: string; amp: number }[]; + durationTicks: number; + duration: number; + infinite: boolean; + constructor(data: Record) { + this.effect = data?.effect || 'UNKNOWN'; + this.level = data?.level || 0; + this.modifiers = data?.modifiers || []; + this.durationTicks = data?.duration_ticks; + this.duration = TicksToMilliseconds(this.durationTicks); + this.infinite = data?.infinite || false; + } + + toString(): SkyBlockPotionEffectName | 'UNKNOWN' { + return this.effect; + } +} + +export default SkyBlockPotionEffect; diff --git a/src/Structures/SkyBlock/Profile/Banking/SkyBlockProfileBanking.test.ts b/src/Structures/SkyBlock/Profile/Banking/SkyBlockProfileBanking.test.ts new file mode 100644 index 000000000..bc5e62e06 --- /dev/null +++ b/src/Structures/SkyBlock/Profile/Banking/SkyBlockProfileBanking.test.ts @@ -0,0 +1,14 @@ +import SkyBlockProfileBanking from './SkyBlockProfileBanking.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockProfilesBankingTransaction from './SkyBlockProfilesBankingTransaction.js'; + +test('SkyBlockProfileBanking', () => { + const data = new SkyBlockProfileBanking({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockProfileBanking); + expectTypeOf(data).toEqualTypeOf(); + expect(data.balance).toBeDefined(); + expectTypeOf(data.balance).toEqualTypeOf(); + expect(data.transactions).toBeDefined(); + expectTypeOf(data.transactions).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Profile/Banking/SkyBlockProfileBanking.ts b/src/Structures/SkyBlock/Profile/Banking/SkyBlockProfileBanking.ts new file mode 100644 index 000000000..7bcc73d44 --- /dev/null +++ b/src/Structures/SkyBlock/Profile/Banking/SkyBlockProfileBanking.ts @@ -0,0 +1,18 @@ +import SkyBlockProfilesBankingTransaction from './SkyBlockProfilesBankingTransaction.js'; + +class SkyBlockProfileBanking { + balance: number; + transactions: SkyBlockProfilesBankingTransaction[]; + constructor(data: Record) { + this.balance = data.balance || 0; + this.transactions = (data.transactions || []).map( + (transaction: Record) => new SkyBlockProfilesBankingTransaction(transaction) + ); + } + + toString(): number { + return this.balance; + } +} + +export default SkyBlockProfileBanking; diff --git a/src/Structures/SkyBlock/Profile/Banking/SkyBlockProfilesBankingTransaction.test.ts b/src/Structures/SkyBlock/Profile/Banking/SkyBlockProfilesBankingTransaction.test.ts new file mode 100644 index 000000000..d9e0237a7 --- /dev/null +++ b/src/Structures/SkyBlock/Profile/Banking/SkyBlockProfilesBankingTransaction.test.ts @@ -0,0 +1,18 @@ +import SkyBlockProfilesBankingTransaction from './SkyBlockProfilesBankingTransaction.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { BankingTransactionAction } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockProfilesBankingTransaction', () => { + const data = new SkyBlockProfilesBankingTransaction({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockProfilesBankingTransaction); + expectTypeOf(data).toEqualTypeOf(); + expect(data.amount).toBeDefined(); + expectTypeOf(data.amount).toEqualTypeOf(); + expect(data.timestamp).toBeDefined(); + expectTypeOf(data.timestamp).toEqualTypeOf(); + expect(data.action).toBeDefined(); + expectTypeOf(data.action).toEqualTypeOf(); + expect(data.user).toBeDefined(); + expectTypeOf(data.user).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Profile/Banking/SkyBlockProfilesBankingTransaction.ts b/src/Structures/SkyBlock/Profile/Banking/SkyBlockProfilesBankingTransaction.ts new file mode 100644 index 000000000..136465bdb --- /dev/null +++ b/src/Structures/SkyBlock/Profile/Banking/SkyBlockProfilesBankingTransaction.ts @@ -0,0 +1,20 @@ +import type { BankingTransactionAction } from '../../../../Types/SkyBlock.js'; + +class SkyBlockProfilesBankingTransaction { + amount: number; + timestamp: number; + action: BankingTransactionAction | 'UNKNOWN'; + user: string | 'Bank Interest' | 'UNKNOWN'; + constructor(data: Record) { + this.amount = data?.amount || 0; + this.timestamp = data?.timestamp || 0; + this.action = data?.action || 'UNKNOWN'; + this.user = data?.initiator_name || 'UNKNOWN'; + } + + toString(): number { + return this.amount; + } +} + +export default SkyBlockProfilesBankingTransaction; diff --git a/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgrades.test.ts b/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgrades.test.ts new file mode 100644 index 000000000..bd3fc6f7c --- /dev/null +++ b/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgrades.test.ts @@ -0,0 +1,15 @@ +import SkyBlockProfileCommunityUpgrades from './SkyBlockProfileCommunityUpgrades.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockProfileCommunityUpgradesUpgraded from './SkyBlockProfileCommunityUpgradesUpgraded.js'; +import type SkyBlockProfileCommunityUpgradesUpgrading from './SkyBlockProfileCommunityUpgradesUpgrading.js'; + +test('SkyBlockProfileCommunityUpgrades', () => { + const data = new SkyBlockProfileCommunityUpgrades({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockProfileCommunityUpgrades); + expectTypeOf(data).toEqualTypeOf(); + expect(data.currentlyUpgrading).toBeDefined(); + expectTypeOf(data.currentlyUpgrading).toEqualTypeOf(); + expect(data.upgrades).toBeDefined(); + expectTypeOf(data.upgrades).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgrades.ts b/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgrades.ts new file mode 100644 index 000000000..cbb4c2f89 --- /dev/null +++ b/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgrades.ts @@ -0,0 +1,22 @@ +import SkyBlockProfileCommunityUpgradesUpgraded from './SkyBlockProfileCommunityUpgradesUpgraded.js'; +import SkyBlockProfileCommunityUpgradesUpgrading from './SkyBlockProfileCommunityUpgradesUpgrading.js'; + +class SkyBlockProfileCommunityUpgrades { + currentlyUpgrading: SkyBlockProfileCommunityUpgradesUpgrading | null; + upgrades: SkyBlockProfileCommunityUpgradesUpgraded[]; + constructor(data: Record) { + this.currentlyUpgrading = data.currently_upgrading + ? new SkyBlockProfileCommunityUpgradesUpgrading(data.currently_upgrading) + : null; + this.upgrades = []; + (data.upgrade_states || []).forEach((upgrade: Record) => { + this.upgrades.push(new SkyBlockProfileCommunityUpgradesUpgraded(upgrade)); + }); + } + + toString(): SkyBlockProfileCommunityUpgradesUpgrading | null { + return this.currentlyUpgrading; + } +} + +export default SkyBlockProfileCommunityUpgrades; diff --git a/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgrade.test.ts b/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgrade.test.ts new file mode 100644 index 000000000..e2f4f6acd --- /dev/null +++ b/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgrade.test.ts @@ -0,0 +1,16 @@ +import SkyBlockProfileCommunityUpgradesUpgrade from './SkyBlockProfileCommunityUpgradesUpgrade.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { CommunityUpgradesUpgrades } from '../../../../Types/SkyBlock.js'; + +test('SkyBlockProfileCommunityUpgradesUpgrade', () => { + const data = new SkyBlockProfileCommunityUpgradesUpgrade({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockProfileCommunityUpgradesUpgrade); + expectTypeOf(data).toEqualTypeOf(); + expect(data.upgrade).toBeDefined(); + expectTypeOf(data.upgrade).toEqualTypeOf(); + expect(data.startedTimestamp).toBeDefined(); + expectTypeOf(data.startedTimestamp).toEqualTypeOf(); + expect(data.startedAt).toBeDefined(); + expectTypeOf(data.startedAt).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgrade.ts b/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgrade.ts new file mode 100644 index 000000000..b2a89b35b --- /dev/null +++ b/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgrade.ts @@ -0,0 +1,18 @@ +import type { CommunityUpgradesUpgrades } from '../../../../Types/SkyBlock.js'; + +class SkyBlockProfileCommunityUpgradesUpgrade { + upgrade: CommunityUpgradesUpgrades | 'UNKNOWN'; + startedTimestamp: number; + startedAt: Date; + constructor(data: Record) { + this.upgrade = data.upgrade || 'UNKNOWN'; + this.startedTimestamp = data.started_ms || 0; + this.startedAt = new Date(this.startedTimestamp); + } + + toString(): CommunityUpgradesUpgrades | 'UNKNOWN' { + return this.upgrade; + } +} + +export default SkyBlockProfileCommunityUpgradesUpgrade; diff --git a/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgraded.test.ts b/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgraded.test.ts new file mode 100644 index 000000000..9bd75e450 --- /dev/null +++ b/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgraded.test.ts @@ -0,0 +1,21 @@ +import SkyBlockProfileCommunityUpgradesUpgraded from './SkyBlockProfileCommunityUpgradesUpgraded.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockProfileCommunityUpgradesUpgraded', () => { + const data = new SkyBlockProfileCommunityUpgradesUpgraded({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockProfileCommunityUpgradesUpgraded); + expectTypeOf(data).toEqualTypeOf(); + expect(data.tier).toBeDefined(); + expectTypeOf(data.tier).toEqualTypeOf(); + expect(data.startedBy).toBeDefined(); + expectTypeOf(data.startedBy).toEqualTypeOf(); + expect(data.claimedTimestamp).toBeDefined(); + expectTypeOf(data.claimedTimestamp).toEqualTypeOf(); + expect(data.claimedAt).toBeDefined(); + expectTypeOf(data.claimedAt).toEqualTypeOf(); + expect(data.claimedBy).toBeDefined(); + expectTypeOf(data.claimedBy).toEqualTypeOf(); + expect(data.fasttracked).toBeDefined(); + expectTypeOf(data.fasttracked).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgraded.ts b/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgraded.ts new file mode 100644 index 000000000..2f4ecb51a --- /dev/null +++ b/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgraded.ts @@ -0,0 +1,21 @@ +import SkyBlockProfileCommunityUpgradesUpgrade from './SkyBlockProfileCommunityUpgradesUpgrade.js'; + +class SkyBlockProfileCommunityUpgradesUpgraded extends SkyBlockProfileCommunityUpgradesUpgrade { + tier: number; + startedBy: number; + claimedTimestamp: number; + claimedAt: Date; + claimedBy: number; + fasttracked: boolean; + constructor(data: Record) { + super(data); + this.tier = data.tier || 'UNKNOWN'; + this.startedBy = data.started_by || 0; + this.claimedTimestamp = data.claimed_ms || 0; + this.claimedAt = new Date(this.claimedTimestamp); + this.claimedBy = data.claimed_by || 0; + this.fasttracked = data.fasttracked || false; + } +} + +export default SkyBlockProfileCommunityUpgradesUpgraded; diff --git a/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgrading.test.ts b/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgrading.test.ts new file mode 100644 index 000000000..0b9599da2 --- /dev/null +++ b/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgrading.test.ts @@ -0,0 +1,13 @@ +import SkyBlockProfileCommunityUpgradesUpgrading from './SkyBlockProfileCommunityUpgradesUpgrading.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockProfileCommunityUpgradesUpgrading', () => { + const data = new SkyBlockProfileCommunityUpgradesUpgrading({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockProfileCommunityUpgradesUpgrading); + expectTypeOf(data).toEqualTypeOf(); + expect(data.tier).toBeDefined(); + expectTypeOf(data.tier).toEqualTypeOf(); + expect(data.startedBy).toBeDefined(); + expectTypeOf(data.startedBy).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgrading.ts b/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgrading.ts new file mode 100644 index 000000000..49801e7e3 --- /dev/null +++ b/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgrading.ts @@ -0,0 +1,13 @@ +import SkyBlockProfileCommunityUpgradesUpgrade from './SkyBlockProfileCommunityUpgradesUpgrade.js'; + +class SkyBlockProfileCommunityUpgradesUpgrading extends SkyBlockProfileCommunityUpgradesUpgrade { + tier: number; + startedBy: number; + constructor(data: Record) { + super(data); + this.tier = data.new_tier || 0; + this.startedBy = data.who_started || 0; + } +} + +export default SkyBlockProfileCommunityUpgradesUpgrading; diff --git a/src/Structures/SkyBlock/Profile/SkyBlockProfile.test.ts b/src/Structures/SkyBlock/Profile/SkyBlockProfile.test.ts new file mode 100644 index 000000000..64c124407 --- /dev/null +++ b/src/Structures/SkyBlock/Profile/SkyBlockProfile.test.ts @@ -0,0 +1,36 @@ +import SkyBlockProfile from './SkyBlockProfile.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockGarden from '../Garden/SkyBlockGarden.js'; +import type SkyBlockMember from '../Member/SkyBlockMember.js'; +import type SkyBlockProfileBanking from './Banking/SkyBlockProfileBanking.js'; +import type SkyBlockProfileCommunityUpgrades from './CommunityUpgrades/SkyBlockProfileCommunityUpgrades.js'; +import type { SkyBlockProfileName, SkyBlockProfileType } from '../../../Types/SkyBlock.js'; + +test('SkyBlockProfile', () => { + const data = new SkyBlockProfile({ stats: 'meow' }, { uuid: 'meow', garden: null, museum: null }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockProfile); + expectTypeOf(data).toEqualTypeOf(); + expect(data.profileId).toBeDefined(); + expectTypeOf(data.profileId).toEqualTypeOf(); + expect(data.communityUpgrades).toBeDefined(); + expectTypeOf(data.communityUpgrades).toEqualTypeOf(); + expect(data.createdTimestamp).toBeDefined(); + expectTypeOf(data.createdTimestamp).toEqualTypeOf(); + expect(data.createdAt).toBeDefined(); + expectTypeOf(data.createdAt).toEqualTypeOf(); + expect(data.members).toBeDefined(); + expectTypeOf(data.members).toEqualTypeOf(); + expect(data.me).toBeDefined(); + expectTypeOf(data.me).toEqualTypeOf(); + expect(data.gameMode).toBeDefined(); + expectTypeOf(data.gameMode).toEqualTypeOf(); + expect(data.banking).toBeDefined(); + expectTypeOf(data.banking).toEqualTypeOf(); + expect(data.profileName).toBeDefined(); + expectTypeOf(data.profileName).toEqualTypeOf(); + expect(data.selected).toBeDefined(); + expectTypeOf(data.selected).toEqualTypeOf(); + expect(data.garden).toBeDefined(); + expectTypeOf(data.garden).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Profile/SkyBlockProfile.ts b/src/Structures/SkyBlock/Profile/SkyBlockProfile.ts new file mode 100644 index 000000000..800087bea --- /dev/null +++ b/src/Structures/SkyBlock/Profile/SkyBlockProfile.ts @@ -0,0 +1,46 @@ +import SkyBlockMember from '../Member/SkyBlockMember.js'; +import SkyBlockProfileBanking from './Banking/SkyBlockProfileBanking.js'; +import SkyBlockProfileCommunityUpgrades from './CommunityUpgrades/SkyBlockProfileCommunityUpgrades.js'; +import type SkyBlockGarden from '../Garden/SkyBlockGarden.js'; +import type SkyBlockMuseum from '../Museum/SkyBlockMuseum.js'; +import type { SkyBlockProfileName, SkyBlockProfileType } from '../../../Types/SkyBlock.js'; +import type { UUID } from '../../../Types/Global.js'; + +class SkyBlockProfile { + profileId: string; + communityUpgrades: SkyBlockProfileCommunityUpgrades; + createdTimestamp: number | null; + createdAt: Date | null; + members: SkyBlockMember[]; + me: SkyBlockMember | null; + gameMode: SkyBlockProfileType | null; + banking: SkyBlockProfileBanking; + profileName: SkyBlockProfileName | 'UNKNOWN'; + selected: boolean; + garden: SkyBlockGarden | null; + museum: SkyBlockMuseum | null; + constructor( + data: Record, + extra: { uuid: UUID | null; garden: SkyBlockGarden | null; museum: SkyBlockMuseum | null } + ) { + this.profileId = data?.profile_id || 'UNKNOWN'; + this.communityUpgrades = new SkyBlockProfileCommunityUpgrades(data.communityUpgrades || {}); + this.createdTimestamp = data.created_at ? data.created_at : null; + this.createdAt = this.createdTimestamp ? new Date(this.createdTimestamp) : null; + const members = data?.members || {}; + this.members = Object.keys(members).map((uuid) => new SkyBlockMember(uuid, members?.[uuid] || {})); + this.me = null !== extra.uuid ? this.members.find((x) => x.uuid === extra.uuid) || null : null; + this.gameMode = data?.game_mode || null; + this.banking = new SkyBlockProfileBanking(data?.banking || {}); + this.profileName = data?.cute_name || 'UNKNOWN'; + this.selected = data?.selected || false; + this.garden = extra.garden; + this.museum = extra.museum; + } + + toString(): SkyBlockProfileName | 'UNKNOWN' { + return this.profileName; + } +} + +export default SkyBlockProfile; diff --git a/src/Structures/SkyBlock/Skills/SkyBlockSkill.test.ts b/src/Structures/SkyBlock/Skills/SkyBlockSkill.test.ts new file mode 100644 index 000000000..82ae0db81 --- /dev/null +++ b/src/Structures/SkyBlock/Skills/SkyBlockSkill.test.ts @@ -0,0 +1,18 @@ +import SkyBlockSkill from './SkyBlockSkill.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockSkillLevel from './SkyBlockSkillLevel.js'; + +test('SkyBlockSkill', () => { + const data = new SkyBlockSkill({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockSkill); + expectTypeOf(data).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.description).toBeDefined(); + expectTypeOf(data.description).toEqualTypeOf(); + expect(data.maxLevel).toBeDefined(); + expectTypeOf(data.maxLevel).toEqualTypeOf(); + expect(data.levels).toBeDefined(); + expectTypeOf(data.levels).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Skills/SkyBlockSkill.ts b/src/Structures/SkyBlock/Skills/SkyBlockSkill.ts new file mode 100644 index 000000000..e8ce8add7 --- /dev/null +++ b/src/Structures/SkyBlock/Skills/SkyBlockSkill.ts @@ -0,0 +1,20 @@ +import SkyBlockSkillLevel from './SkyBlockSkillLevel.js'; + +class SkyBlockSkill { + name: string; + description: string; + maxLevel: number; + levels: SkyBlockSkillLevel[]; + constructor(data: Record) { + this.name = data?.name || 'UNKNOWN'; + this.description = data?.description || 'UNKNOWN'; + this.maxLevel = data?.maxLevel || 0; + this.levels = (data?.levels || []).map((level: Record) => new SkyBlockSkillLevel(level)); + } + + toString(): string { + return this.name; + } +} + +export default SkyBlockSkill; diff --git a/src/Structures/SkyBlock/Skills/SkyBlockSkillLevel.test.ts b/src/Structures/SkyBlock/Skills/SkyBlockSkillLevel.test.ts new file mode 100644 index 000000000..1781eae7a --- /dev/null +++ b/src/Structures/SkyBlock/Skills/SkyBlockSkillLevel.test.ts @@ -0,0 +1,15 @@ +import SkyBlockSkillLevel from './SkyBlockSkillLevel.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockSkillLevel', () => { + const data = new SkyBlockSkillLevel({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockSkillLevel); + expectTypeOf(data).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.totalExpRequired).toBeDefined(); + expectTypeOf(data.totalExpRequired).toEqualTypeOf(); + expect(data.unlocks).toBeDefined(); + expectTypeOf(data.unlocks).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Skills/SkyBlockSkillLevel.ts b/src/Structures/SkyBlock/Skills/SkyBlockSkillLevel.ts new file mode 100644 index 000000000..a06e97d41 --- /dev/null +++ b/src/Structures/SkyBlock/Skills/SkyBlockSkillLevel.ts @@ -0,0 +1,16 @@ +class SkyBlockSkillLevel { + level: number; + totalExpRequired: number; + unlocks: string[]; + constructor(data: Record) { + this.level = data?.level || 0; + this.totalExpRequired = data?.totalExpRequired || 0; + this.unlocks = data?.unlocks || []; + } + + toString(): number { + return this.level; + } +} + +export default SkyBlockSkillLevel; diff --git a/src/Structures/SkyBlock/Skills/SkyBlockSkills.test.ts b/src/Structures/SkyBlock/Skills/SkyBlockSkills.test.ts new file mode 100644 index 000000000..220235738 --- /dev/null +++ b/src/Structures/SkyBlock/Skills/SkyBlockSkills.test.ts @@ -0,0 +1,38 @@ +import SkyBlockSkills from './SkyBlockSkills.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type SkyBlockSkill from './SkyBlockSkill.js'; + +test('SkyBlockSkills', () => { + const data = new SkyBlockSkills({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockSkills); + expectTypeOf(data).toEqualTypeOf(); + expect(data.lastUpdated).toBeDefined(); + expectTypeOf(data.lastUpdated).toEqualTypeOf(); + expect(data.lastUpdatedAt).toBeDefined(); + expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); + expect(data.version).toBeDefined(); + expectTypeOf(data.version).toEqualTypeOf(); + expect(data.farming).toBeDefined(); + expectTypeOf(data.farming).toEqualTypeOf(); + expect(data.mining).toBeDefined(); + expectTypeOf(data.mining).toEqualTypeOf(); + expect(data.combat).toBeDefined(); + expectTypeOf(data.combat).toEqualTypeOf(); + expect(data.foraging).toBeDefined(); + expectTypeOf(data.foraging).toEqualTypeOf(); + expect(data.fishing).toBeDefined(); + expectTypeOf(data.fishing).toEqualTypeOf(); + expect(data.enchanting).toBeDefined(); + expectTypeOf(data.enchanting).toEqualTypeOf(); + expect(data.alchemy).toBeDefined(); + expectTypeOf(data.alchemy).toEqualTypeOf(); + expect(data.carpentry).toBeDefined(); + expectTypeOf(data.carpentry).toEqualTypeOf(); + expect(data.runecrafting).toBeDefined(); + expectTypeOf(data.runecrafting).toEqualTypeOf(); + expect(data.social).toBeDefined(); + expectTypeOf(data.social).toEqualTypeOf(); + expect(data.taming).toBeDefined(); + expectTypeOf(data.taming).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Skills/SkyBlockSkills.ts b/src/Structures/SkyBlock/Skills/SkyBlockSkills.ts new file mode 100644 index 000000000..56aeaefe9 --- /dev/null +++ b/src/Structures/SkyBlock/Skills/SkyBlockSkills.ts @@ -0,0 +1,36 @@ +import SkyBlockSkill from './SkyBlockSkill.js'; + +class SkyBlockSkills { + lastUpdated: number; + lastUpdatedAt: Date; + version: string; + farming: SkyBlockSkill; + mining: SkyBlockSkill; + combat: SkyBlockSkill; + foraging: SkyBlockSkill; + fishing: SkyBlockSkill; + enchanting: SkyBlockSkill; + alchemy: SkyBlockSkill; + carpentry: SkyBlockSkill; + runecrafting: SkyBlockSkill; + social: SkyBlockSkill; + taming: SkyBlockSkill; + constructor(data: Record) { + this.lastUpdated = data?.lastUpdated || 0; + this.lastUpdatedAt = new Date(this.lastUpdated); + this.version = data?.version || 'UNKNOWN'; + this.farming = new SkyBlockSkill(data?.skills?.FARMING || {}); + this.mining = new SkyBlockSkill(data?.skills?.MINING || {}); + this.combat = new SkyBlockSkill(data?.skills?.COMBAT || {}); + this.foraging = new SkyBlockSkill(data?.skills?.FORAGING || {}); + this.fishing = new SkyBlockSkill(data?.skills?.FISHING || {}); + this.enchanting = new SkyBlockSkill(data?.skills?.ENCHANTING || {}); + this.alchemy = new SkyBlockSkill(data?.skills?.ALCHEMY || {}); + this.carpentry = new SkyBlockSkill(data?.skills?.CARPENTRY || {}); + this.runecrafting = new SkyBlockSkill(data?.skills?.RUNECRAFTING || {}); + this.social = new SkyBlockSkill(data?.skills?.SOCIAL || {}); + this.taming = new SkyBlockSkill(data?.skills?.TAMING || {}); + } +} + +export default SkyBlockSkills; diff --git a/src/Structures/SkyBlock/SkyBlockItem.test.ts b/src/Structures/SkyBlock/SkyBlockItem.test.ts new file mode 100644 index 000000000..d8a661de7 --- /dev/null +++ b/src/Structures/SkyBlock/SkyBlockItem.test.ts @@ -0,0 +1,127 @@ +import SkyBlockItem from './SkyBlockItem.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockItem', () => { + const data = new SkyBlockItem({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockItem); + expectTypeOf(data).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.material).toBeDefined(); + expectTypeOf(data.material).toEqualTypeOf(); + expect(data.id).toBeDefined(); + expectTypeOf(data.id).toEqualTypeOf(); + expect(data.durability).toBeDefined(); + expectTypeOf(data.durability).toEqualTypeOf(); + expect(data.skin).toBeDefined(); + expectTypeOf(data.skin).toEqualTypeOf>(); + expect(data.category).toBeDefined(); + expectTypeOf(data.category).toEqualTypeOf(); + expect(data.tier).toBeDefined(); + expectTypeOf(data.tier).toEqualTypeOf(); + expect(data.npcSellPrice).toBeDefined(); + expectTypeOf(data.npcSellPrice).toEqualTypeOf(); + expect(data.salvages).toBeDefined(); + expectTypeOf(data.salvages).toEqualTypeOf[]>(); + expect(data.raritySalvageable).toBeDefined(); + expectTypeOf(data.raritySalvageable).toEqualTypeOf(); + expect(data.stats).toBeDefined(); + expectTypeOf(data.stats).toEqualTypeOf>(); + expect(data.unstackable).toBeDefined(); + expectTypeOf(data.unstackable).toEqualTypeOf(); + expect(data.museumData).toBeDefined(); + expectTypeOf(data.museumData).toEqualTypeOf>(); + expect(data.color).toBeDefined(); + expectTypeOf(data.color).toEqualTypeOf(); + expect(data.soulbound).toBeDefined(); + expectTypeOf(data.soulbound).toEqualTypeOf(); + expect(data.hasUuid).toBeDefined(); + expectTypeOf(data.hasUuid).toEqualTypeOf(); + expect(data.gemstoneSlots).toBeDefined(); + expectTypeOf(data.gemstoneSlots).toEqualTypeOf[]>(); + expect(data.glowing).toBeDefined(); + expectTypeOf(data.glowing).toEqualTypeOf(); + expect(data.canAuction).toBeDefined(); + expectTypeOf(data.canAuction).toEqualTypeOf(); + expect(data.canTrade).toBeDefined(); + expectTypeOf(data.canTrade).toEqualTypeOf(); + expect(data.requirements).toBeDefined(); + expectTypeOf(data.requirements).toEqualTypeOf[]>(); + expect(data.canPlace).toBeDefined(); + expectTypeOf(data.canPlace).toEqualTypeOf(); + expect(data.museum).toBeDefined(); + expectTypeOf(data.museum).toEqualTypeOf(); + expect(data.generator).toBeDefined(); + expectTypeOf(data.generator).toEqualTypeOf(); + expect(data.generatorTier).toBeDefined(); + expectTypeOf(data.generatorTier).toEqualTypeOf(); + expect(data.furniture).toBeDefined(); + expectTypeOf(data.furniture).toEqualTypeOf(); + expect(data.itemSpecific).toBeDefined(); + expectTypeOf(data.itemSpecific).toEqualTypeOf>(); + expect(data.description).toBeDefined(); + expectTypeOf(data.description).toEqualTypeOf(); + expect(data.upgradeCosts).toBeDefined(); + expectTypeOf(data.upgradeCosts).toEqualTypeOf>>>(); + expect(data.gearScore).toBeDefined(); + expectTypeOf(data.gearScore).toEqualTypeOf(); + expect(data.dungeonItem).toBeDefined(); + expectTypeOf(data.dungeonItem).toEqualTypeOf(); + expect(data.dungeonItemConversionCost).toBeDefined(); + expectTypeOf(data.dungeonItemConversionCost).toEqualTypeOf>(); + expect(data.catacombsRequirements).toBeDefined(); + expectTypeOf(data.catacombsRequirements).toEqualTypeOf[]>(); + expect(data.canHaveAttributes).toBeDefined(); + expectTypeOf(data.canHaveAttributes).toEqualTypeOf(); + expect(data.salvageableFromRecipe).toBeDefined(); + expectTypeOf(data.salvageableFromRecipe).toEqualTypeOf(); + expect(data.canRecombobulate).toBeDefined(); + expectTypeOf(data.canRecombobulate).toEqualTypeOf(); + expect(data.enchantments).toBeDefined(); + expectTypeOf(data.enchantments).toEqualTypeOf>(); + expect(data.riftTransferrable).toBeDefined(); + expectTypeOf(data.riftTransferrable).toEqualTypeOf(); + expect(data.origin).toBeDefined(); + expectTypeOf(data.origin).toEqualTypeOf(); + expect(data.doubleTapToDrop).toBeDefined(); + expectTypeOf(data.doubleTapToDrop).toEqualTypeOf(); + expect(data.hideFromViewRecipeCommand).toBeDefined(); + expectTypeOf(data.hideFromViewRecipeCommand).toEqualTypeOf(); + expect(data.swordType).toBeDefined(); + expectTypeOf(data.swordType).toEqualTypeOf(); + expect(data.abilityDamageScaling).toBeDefined(); + expectTypeOf(data.abilityDamageScaling).toEqualTypeOf(); + expect(data.tieredStats).toBeDefined(); + expectTypeOf(data.tieredStats).toEqualTypeOf>(); + expect(data.motesSellPrice).toBeDefined(); + expectTypeOf(data.motesSellPrice).toEqualTypeOf(); + expect(data.crystal).toBeDefined(); + expectTypeOf(data.crystal).toEqualTypeOf(); + expect(data.canBurnInFurnace).toBeDefined(); + expectTypeOf(data.canBurnInFurnace).toEqualTypeOf(); + expect(data.salvage).toBeDefined(); + expectTypeOf(data.salvage).toEqualTypeOf>(); + expect(data.serializable).toBeDefined(); + expectTypeOf(data.serializable).toEqualTypeOf(); + expect(data.canInteract).toBeDefined(); + expectTypeOf(data.canInteract).toEqualTypeOf(); + expect(data.canInteractRightClick).toBeDefined(); + expectTypeOf(data.canInteractRightClick).toEqualTypeOf(); + expect(data.privateIsland).toBeDefined(); + expectTypeOf(data.privateIsland).toEqualTypeOf(); + expect(data.canHavePowerScroll).toBeDefined(); + expectTypeOf(data.canHavePowerScroll).toEqualTypeOf(); + expect(data.canInteractEntity).toBeDefined(); + expectTypeOf(data.canInteractEntity).toEqualTypeOf(); + expect(data.miningFortune).toBeDefined(); + expectTypeOf(data.miningFortune).toEqualTypeOf(); + expect(data.recipes).toBeDefined(); + expectTypeOf(data.recipes).toEqualTypeOf[]>(); + expect(data.cannotReforge).toBeDefined(); + expectTypeOf(data.cannotReforge).toEqualTypeOf(); + expect(data.loseMotesValueOnTransfer).toBeDefined(); + expectTypeOf(data.loseMotesValueOnTransfer).toEqualTypeOf(); + expect(data.prestige).toBeDefined(); + expectTypeOf(data.prestige).toEqualTypeOf>(); +}); diff --git a/src/Structures/SkyBlock/SkyBlockItem.ts b/src/Structures/SkyBlock/SkyBlockItem.ts new file mode 100644 index 000000000..f23dfacdd --- /dev/null +++ b/src/Structures/SkyBlock/SkyBlockItem.ts @@ -0,0 +1,128 @@ +class SkyBlockItem { + name: string; + material: string; + id: string; + durability: number; + skin: Record; + category: string; + tier: string; + npcSellPrice: number; + salvages: Record[]; + raritySalvageable: boolean; + stats: Record; + unstackable: boolean; + museumData: Record; + color: string; + soulbound: string; + hasUuid: boolean | string; + gemstoneSlots: Record[]; + glowing: boolean; + canAuction: boolean; + canTrade: boolean; + requirements: Record[]; + canPlace: boolean; + museum: boolean; + generator: string; + generatorTier: number; + furniture: string; + itemSpecific: Record; + description: string; + upgradeCosts: Array>>; + gearScore: number; + dungeonItem: boolean; + dungeonItemConversionCost: Record; + catacombsRequirements: Record[]; + canHaveAttributes: boolean; + salvageableFromRecipe: boolean; + canRecombobulate: boolean; + enchantments: Record; + riftTransferrable: boolean; + origin: string; + doubleTapToDrop: boolean; + hideFromViewRecipeCommand: boolean; + swordType: string; + abilityDamageScaling: number; + tieredStats: Record; + motesSellPrice: number; + crystal: string; + canBurnInFurnace: boolean; + salvage: Record; + serializable: boolean; + canInteract: boolean; + canInteractRightClick: boolean; + privateIsland: string; + canHavePowerScroll: boolean; + canInteractEntity: boolean; + miningFortune: number; + recipes: Record[]; + cannotReforge: boolean; + loseMotesValueOnTransfer: boolean; + prestige: Record; + constructor(data: Record) { + this.name = data?.name || 'UNKNOWN'; + this.material = data?.material || 'UNKNOWN'; + this.id = data?.id || 'UNKNOWN'; + this.durability = data?.durability || 0; + this.skin = data?.skin || {}; + this.category = data?.category || 'UNKNOWN'; + this.tier = data?.tier || 'UNKNOWN'; + this.npcSellPrice = data?.npc_sell_price || 0; + this.salvages = data?.salvages || []; + this.raritySalvageable = data?.rarity_salvageable || false; + this.stats = data?.stats || {}; + this.unstackable = data?.unstackable || false; + this.museumData = data?.museum_data || {}; + this.color = data?.color || 'UNKNOWN'; + this.soulbound = data?.soulbound || 'UNKNOWN'; + this.hasUuid = data?.has_uuid || false; + this.gemstoneSlots = data?.gemstone_slots || []; + this.glowing = data?.glowing || false; + this.canAuction = data?.can_auction || false; + this.canTrade = data?.can_trade || false; + this.requirements = data?.requirements || []; + this.canPlace = data?.can_place || false; + this.museum = data?.museum || false; + this.generator = data?.generator || 'UNKNOWN'; + this.generatorTier = data?.generator_tier || 0; + this.furniture = data?.furniture || 'UNKNOWN'; + this.itemSpecific = data?.item_specific || {}; + this.description = data?.description || 'UNKNOWN'; + this.upgradeCosts = data?.upgrade_costs || []; + this.gearScore = data?.gear_score || 0; + this.dungeonItem = data?.dungeon_item || false; + this.dungeonItemConversionCost = data?.dungeon_item_conversion_cost || {}; + this.catacombsRequirements = data?.catacombs_requirements || []; + this.canHaveAttributes = data?.can_have_attributes || false; + this.salvageableFromRecipe = data?.salvageable_from_recipe || false; + this.canRecombobulate = data?.can_recombobulate || false; + this.enchantments = data?.enchantments || {}; + this.riftTransferrable = data?.rift_transferrable || false; + this.origin = data?.origin || 'UNKNOWN'; + this.doubleTapToDrop = data?.double_tap_to_drop || false; + this.hideFromViewRecipeCommand = data?.hide_from_viewrecipe_command || false; + this.swordType = data?.sword_type || 'UNKNOWN'; + this.abilityDamageScaling = data?.ability_damage_scaling || 0; + this.tieredStats = data?.tiered_stats || {}; + this.motesSellPrice = data?.motes_sell_price || 0; + this.crystal = data?.crystal || 'UNKNOWN'; + this.canBurnInFurnace = data?.can_burn_in_furnace || false; + this.salvage = data?.salvage || {}; + this.serializable = data?.serializable || false; + this.canInteract = data?.can_interact || false; + this.canInteractRightClick = data?.can_interact_right_click || false; + this.privateIsland = data?.private_island || 'UNKNOWN'; + this.canHavePowerScroll = data?.can_have_power_scroll || false; + this.canInteractEntity = data?.can_interact_entity || false; + this.miningFortune = data?.MINING_FORTUNE || 0; + this.recipes = data?.recipes || []; + this.cannotReforge = data?.cannot_reforge || false; + this.loseMotesValueOnTransfer = data?.lose_motes_value_on_transfer || false; + this.prestige = data?.prestige || {}; + } + + toString(): string { + return this.name; + } +} + +export default SkyBlockItem; diff --git a/src/Structures/SkyBlock/SkyblockGarden.test.ts b/src/Structures/SkyBlock/SkyblockGarden.test.ts deleted file mode 100644 index 77cb51aab..000000000 --- a/src/Structures/SkyBlock/SkyblockGarden.test.ts +++ /dev/null @@ -1,30 +0,0 @@ -import SkyblockGarden from './SkyblockGarden.js'; -import { expect, expectTypeOf, test } from 'vitest'; -import type { - SkillLevel, - SkyblockGardenComposter, - SkyblockGardenCropMilestones, - SkyblockGardenVisitor, - SkyblockGarenCrops -} from '../../Types/Skyblock.js'; - -test('SkyblockGarden', () => { - const data = new SkyblockGarden({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(SkyblockGarden); - expectTypeOf(data).toEqualTypeOf(); - expect(data.level).toBeDefined(); - expectTypeOf(data.level).toEqualTypeOf(); - expect(data.barnSkin).toBeDefined(); - expectTypeOf(data.barnSkin).toEqualTypeOf(); - expect(data.unlockedPlots).toBeDefined(); - expectTypeOf(data.unlockedPlots).toEqualTypeOf(); - expect(data.visitors).toBeDefined(); - expectTypeOf(data.visitors).toEqualTypeOf(); - expect(data.cropMilestones).toBeDefined(); - expectTypeOf(data.cropMilestones).toEqualTypeOf(); - expect(data.composter).toBeDefined(); - expectTypeOf(data.composter).toEqualTypeOf(); - expect(data.cropUpgrades).toBeDefined(); - expectTypeOf(data.cropUpgrades).toEqualTypeOf(); -}); diff --git a/src/Structures/SkyBlock/SkyblockGarden.ts b/src/Structures/SkyBlock/SkyblockGarden.ts deleted file mode 100644 index 773ed8689..000000000 --- a/src/Structures/SkyBlock/SkyblockGarden.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { getLevelByXp } from '../../Utils/SkyblockUtils.js'; -import type { - SkillLevel, - SkyblockGardenComposter, - SkyblockGardenCropMilestones, - SkyblockGardenVisitor, - SkyblockGarenCrops -} from '../../Types/Skyblock.js'; - -class SkyblockGarden { - level: SkillLevel; - barnSkin: string; - unlockedPlots: string[]; - visitors: SkyblockGardenVisitor; - cropMilestones: SkyblockGardenCropMilestones; - composter: SkyblockGardenComposter; - cropUpgrades: SkyblockGarenCrops; - constructor(data: Record) { - this.level = getLevelByXp(data?.garden?.garden_experience || 0, 'garden'); - this.barnSkin = data?.garden?.selected_barn_skin || ''; - this.unlockedPlots = data?.garden?.unlocked_plots_ids || []; - this.visitors = { - visited: data?.garden?.commission_data?.visits || {}, - completed: data?.garden?.commission_data?.completed || {}, - served: { - total: data?.garden?.commission_data?.total_completed || 0, - unique: data?.garden?.commission_data?.unique_npcs_served || 0 - } - }; - this.cropMilestones = { - wheat: getLevelByXp(data?.garden?.resources_collected?.WHEAT || 0, 'wheat'), - carrot: getLevelByXp(data?.garden?.resources_collected?.CARROT_ITEM || 0, 'carrot'), - sugarCane: getLevelByXp(data?.garden?.resources_collected?.SUGAR_CANE || 0, 'sugarCane'), - potato: getLevelByXp(data?.garden?.resources_collected?.POTATO_ITEM || 0, 'potato'), - pumpkin: getLevelByXp(data?.garden?.resources_collected?.PUMPKIN || 0, 'pumpkin'), - melon: getLevelByXp(data?.garden?.resources_collected?.MELON || 0, 'melon'), - cactus: getLevelByXp(data?.garden?.resources_collected?.CACTUS || 0, 'cactus'), - cocoaBeans: getLevelByXp(data?.garden?.resources_collected?.['INK_SACK:3'] || 0, 'cocoaBeans'), - mushroom: getLevelByXp(data?.garden?.resources_collected?.MUSHROOM_COLLECTION || 0, 'mushroom'), - netherWart: getLevelByXp(data?.garden?.resources_collected?.NETHER_STALK || 0, 'netherWart') - }; - this.composter = { - organicMatter: data?.garden?.composter_data?.organic_matter || 0, - fuelUnits: data?.garden?.composter_data?.fuel_units || 0, - compostUnits: data?.garden?.composter_data?.compost_units || 0, - compostItems: data?.garden?.composter_data?.compost_items || 0, - conversionTicks: data?.garden?.composter_data?.conversion_ticks || 0, - upgrades: { - speed: data?.garden?.composter_data?.upgrades?.speed || 0, - multiDrop: data?.garden?.composter_data?.upgrades?.multi_drop || 0, - fuelCap: data?.garden?.composter_data?.upgrades?.fuel_cap || 0, - organicMatterCap: data?.garden?.composter_data?.upgrades?.organic_matter_cap || 0, - costReduction: data?.garden?.composter_data?.upgrades?.cost_reduction || 0 - } - }; - this.cropUpgrades = { - wheat: data?.garden?.crop_upgrade_levels?.WHEAT || 0, - carrot: data?.garden?.crop_upgrade_levels?.CARROT_ITEM || 0, - sugarCane: data?.garden?.crop_upgrade_levels?.SUGAR_CANE || 0, - potato: data?.garden?.crop_upgrade_levels?.POTATO_ITEM || 0, - pumpkin: data?.garden?.crop_upgrade_levels?.PUMPKIN || 0, - melon: data?.garden?.crop_upgrade_levels?.MELON || 0, - cactus: data?.garden?.crop_upgrade_levels?.CACTUS || 0, - cocoaBeans: data?.garden?.crop_upgrade_levels?.['INK_SACK:3'] || 0, - mushroom: data?.garden?.crop_upgrade_levels?.MUSHROOM_COLLECTION || 0, - netherWart: data?.garden?.crop_upgrade_levels?.NETHER_STALK || 0 - }; - } -} - -export default SkyblockGarden; diff --git a/src/Structures/SkyBlock/SkyblockGemstone.ts b/src/Structures/SkyBlock/SkyblockGemstone.ts deleted file mode 100644 index 4db4c359d..000000000 --- a/src/Structures/SkyBlock/SkyblockGemstone.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { SkyblockGemstoneQuality } from '../../Types/Skyblock.js'; - -class SkyblockGemstone { - type: string; - quality: SkyblockGemstoneQuality; - constructor(data: Record) { - this.type = data.type; - this.quality = data.quality; - } -} - -export default SkyblockGemstone; diff --git a/src/Structures/SkyBlock/SkyblockInventoryItem.ts b/src/Structures/SkyBlock/SkyblockInventoryItem.ts deleted file mode 100644 index f7245799a..000000000 --- a/src/Structures/SkyBlock/SkyblockInventoryItem.ts +++ /dev/null @@ -1,75 +0,0 @@ -import SkyblockGemstone from './SkyblockGemstone.js'; -import { parseGearScore, parseRarity } from '../../Utils/SkyblockUtils.js'; -import type { SkyblockGemstoneQuality } from '../../Types/Skyblock.js'; - -class SkyblockInventoryItem { - itemId: number; - count: number; - name: string; - lore: string; - loreArray: string[]; - loreForEmbed: string; - color: string | null; - enchantments: Record; - reforge: string; - gemstones: SkyblockGemstone[] | []; - damage: number; - rarity: string; - dungeonStars: number; - gearScore: number; - uuid: string; - soulbound: boolean; - artOfWar: number; - rune: object; - hotPotatoBooks: number; - recombobulated: boolean; - attributes: object; - hecatomb: number; - champion: number; - cultivating: number; - expertise: number; - compact: number; - blocksWalked: number; - constructor(data: Record) { - this.itemId = data?.id || 0; - this.count = data?.Count || 0; - this.name = - null !== data?.tag?.display?.Name - ? data?.tag?.display?.Name?.toString()?.replace(/§([1-9]|[a-f])|§/gm, '') - : null; - this.lore = data?.tag?.display?.Lore?.join('\n'); - this.loreArray = data?.tag?.display?.Lore; - this.loreForEmbed = this?.lore?.replace(/§([0-9]|[a-f])|§/gm, '')?.replace(/
/gm, '\n'); - this.color = data?.tag?.ExtraAttributes?.color ?? data?.tag?.display?.color ?? null; - this.enchantments = data?.tag?.ExtraAttributes?.enchantments ?? null; - this.reforge = data?.tag?.ExtraAttributes?.modifier ?? null; - this.gemstones = data?.tag?.ExtraAttributes?.gems - ? Object.entries(data?.tag?.ExtraAttributes?.gems)?.map((gem) => { - return new SkyblockGemstone({ type: gem[0], quality: gem[1] as SkyblockGemstoneQuality }); - }) - : []; - this.damage = data?.Damage || 0; - this.rarity = parseRarity(this?.loreArray[this?.loreArray?.length - 1] || ''); - this.dungeonStars = data?.tag?.ExtraAttributes?.upgrade_level ?? 0; - this.gearScore = parseGearScore(this?.loreArray); - this.uuid = data?.tag?.ExtraAttributes?.uuid ?? ''; - this.soulbound = 1 === data?.tag?.ExtraAttributes?.donated_museum; - this.artOfWar = data?.tag?.ExtraAttributes?.art_of_war_count ?? 0; - this.rune = data?.tag?.ExtraAttributes?.runes ?? null; - this.hotPotatoBooks = data?.tag?.ExtraAttributes?.hot_potato_count ?? 0; - this.recombobulated = 1 === data?.tag?.ExtraAttributes?.rarity_upgrades; - this.attributes = data?.tag?.ExtraAttributes?.attributes ?? {}; - this.hecatomb = data?.tag?.ExtraAttributes?.hecatomb_s_runs ?? 0; - this.champion = data?.tag?.ExtraAttributes?.champion_combat_xp ?? 0; - this.cultivating = data?.tag?.ExtraAttributes?.farmed_cultivating ?? 0; - this.expertise = data?.tag?.ExtraAttributes?.expertise_kills ?? 0; - this.compact = data?.tag?.ExtraAttributes?.compact_blocks ?? 0; - this.blocksWalked = data?.tag?.ExtraAttributes?.blocks_walked ?? 0; - } - - toString(): string { - return this.name; - } -} - -export default SkyblockInventoryItem; diff --git a/src/Structures/SkyBlock/SkyblockItem.ts b/src/Structures/SkyBlock/SkyblockItem.ts deleted file mode 100644 index fe784e27a..000000000 --- a/src/Structures/SkyBlock/SkyblockItem.ts +++ /dev/null @@ -1,128 +0,0 @@ -class SkyblockItem { - name: string; - material: string; - id: string; - durability?: number; - skin?: Record; - category?: string; - tier?: string; - npcSellPrice?: number; - salvages?: Record[]; - raritySalvageable?: boolean; - stats?: Record; - unstackable?: boolean; - museumData?: Record; - color?: string; - soulbound?: string; - hasUuid?: boolean | string; - gemstoneSlots?: Record[]; - glowing?: boolean; - canAuction?: boolean; - canTrade?: boolean; - requirements?: Record[]; - canPlace?: boolean; - museum?: boolean; - generator?: string; - generatorTier?: number; - furniture?: string; - itemSpecific?: Record; - description?: string; - upgradeCosts?: Array>>; - gearScore?: number; - dungeonItem?: boolean; - dungeonItemConversionCost?: Record; - catacombsRequirements?: Record[]; - canHaveAttributes?: boolean; - salvageableFromRecipe?: boolean; - canRecombobulate?: boolean; - enchantments?: Record; - riftTransferrable?: boolean; - origin?: string; - doubleTapToDrop?: boolean; - hideFromViewRecipeCommand?: boolean; - swordType?: string; - abilityDamageScaling?: number; - tieredStats?: Record; - motesSellPrice?: number; - crystal?: string; - canBurnInFurnace?: boolean; - salvage?: Record; - serializable?: boolean; - canInteract?: boolean; - canInteractRightClick?: boolean; - privateIsland?: string; - canHavePowerScroll?: boolean; - canInteractEntity?: boolean; - miningFortune?: number; - recipes?: Record[]; - cannotReforge?: boolean; - loseMotesValueOnTransfer?: boolean; - prestige?: Record; - constructor(data: Record) { - this.name = data.name; - this.material = data.material; - this.id = data.id; - this.durability = data.durability ?? 0; - this.skin = data.skin ?? {}; - this.category = data.category ?? ''; - this.tier = data.tier ?? ''; - this.npcSellPrice = data.npc_sell_price ?? 0; - this.salvages = data.salvages ?? []; - this.raritySalvageable = data.rarity_salvageable ?? false; - this.stats = data.stats ?? {}; - this.unstackable = data.unstackable ?? false; - this.museumData = data.museum_data ?? {}; - this.color = data.color ?? ''; - this.soulbound = data.soulbound ?? ''; - this.hasUuid = data.has_uuid ?? false; - this.gemstoneSlots = data.gemstone_slots ?? []; - this.glowing = data.glowing ?? false; - this.canAuction = data.can_auction ?? false; - this.canTrade = data.can_trade ?? false; - this.requirements = data.requirements ?? []; - this.canPlace = data.can_place ?? false; - this.museum = data.museum ?? false; - this.generator = data.generator ?? ''; - this.generatorTier = data.generator_tier ?? 0; - this.furniture = data.furniture ?? ''; - this.itemSpecific = data.item_specific ?? {}; - this.description = data.description ?? ''; - this.upgradeCosts = data.upgrade_costs ?? []; - this.gearScore = data.gear_score ?? 0; - this.dungeonItem = data.dungeon_item ?? false; - this.dungeonItemConversionCost = data.dungeon_item_conversion_cost ?? {}; - this.catacombsRequirements = data.catacombs_requirements ?? []; - this.canHaveAttributes = data.can_have_attributes ?? false; - this.salvageableFromRecipe = data.salvageable_from_recipe ?? false; - this.canRecombobulate = data.can_recombobulate ?? false; - this.enchantments = data.enchantments ?? {}; - this.riftTransferrable = data.rift_transferrable ?? false; - this.origin = data.origin ?? ''; - this.doubleTapToDrop = data.double_tap_to_drop ?? false; - this.hideFromViewRecipeCommand = data.hide_from_viewrecipe_command ?? false; - this.swordType = data.sword_type ?? ''; - this.abilityDamageScaling = data.ability_damage_scaling ?? 0; - this.tieredStats = data.tiered_stats ?? {}; - this.motesSellPrice = data.motes_sell_price ?? 0; - this.crystal = data.crystal ?? ''; - this.canBurnInFurnace = data.can_burn_in_furnace ?? false; - this.salvage = data.salvage ?? {}; - this.serializable = data.serializable ?? false; - this.canInteract = data.can_interact ?? false; - this.canInteractRightClick = data.can_interact_right_click ?? false; - this.privateIsland = data.private_island ?? ''; - this.canHavePowerScroll = data.can_have_power_scroll ?? false; - this.canInteractEntity = data.can_interact_entity ?? false; - this.miningFortune = data.MINING_FORTUNE ?? 0; - this.recipes = data.recipes ?? []; - this.cannotReforge = data.cannot_reforge ?? false; - this.loseMotesValueOnTransfer = data.lose_motes_value_on_transfer ?? false; - this.prestige = data.prestige ?? {}; - } - - toString(): string { - return this.name; - } -} - -export default SkyblockItem; diff --git a/src/Structures/SkyBlock/SkyblockMember.test.ts b/src/Structures/SkyBlock/SkyblockMember.test.ts deleted file mode 100644 index ef2462c65..000000000 --- a/src/Structures/SkyBlock/SkyblockMember.test.ts +++ /dev/null @@ -1,85 +0,0 @@ -import SkyblockGarden from './SkyblockGarden.js'; -import SkyblockMember from './SkyblockMember.js'; -import SkyblockMemberStats from './SkyblockMemberStats.js'; -import SkyblockMuseum from './SkyblockMuseum.js'; -import SkyblockPet from './SkyblockPet.js'; -import { expect, expectTypeOf, test } from 'vitest'; -import type { - ChocolateFactoryData, - CrimsonIsle, - Dungeons, - HOTM, - JacobData, - Skills, - Slayer -} from '../../Types/Skyblock.js'; - -test('SkyblockMember', () => { - const data = new SkyblockMember({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(SkyblockMember); - expectTypeOf(data).toEqualTypeOf(); - expect(data.uuid).toBeDefined(); - expectTypeOf(data.uuid).toEqualTypeOf(); - expect(data.gameMode).toBeDefined(); - expectTypeOf(data.gameMode).toEqualTypeOf(); - expect(data.selected).toBeDefined(); - expectTypeOf(data.selected).toEqualTypeOf(); - expect(data.garden).toBeDefined(); - expect(data.garden).toBeNull(); - expectTypeOf(data.garden).toEqualTypeOf(); - expect(data.museum).toBeDefined(); - expect(data.museum).toBeNull(); - expectTypeOf(data.museum).toEqualTypeOf(); - expect(data.profileName).toBeDefined(); - expectTypeOf(data.profileName).toEqualTypeOf(); - expect(data.profileId).toBeDefined(); - expectTypeOf(data.profileId).toEqualTypeOf(); - expect(data.firstJoinTimestamp).toBeDefined(); - expectTypeOf(data.firstJoinTimestamp).toEqualTypeOf(); - expect(data.firstJoinAt).toBeDefined(); - expectTypeOf(data.firstJoinAt).toEqualTypeOf(); - expect(data.experience).toBeDefined(); - expect(data.experience).toBeGreaterThanOrEqual(0); - expectTypeOf(data.experience).toEqualTypeOf(); - expect(data.level).toBeDefined(); - expect(data.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.level).toEqualTypeOf(); - expect(data.hotm).toBeDefined(); - expectTypeOf(data.hotm).toEqualTypeOf(); - expect(data.highestMagicalPower).toBeDefined(); - expect(data.highestMagicalPower).toBeGreaterThanOrEqual(0); - expectTypeOf(data.highestMagicalPower).toEqualTypeOf(); - expect(data.fairySouls).toBeDefined(); - expect(data.fairySouls).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fairySouls).toEqualTypeOf(); - expect(data.fairyExchanges).toBeDefined(); - expect(data.fairyExchanges).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fairyExchanges).toEqualTypeOf(); - expect(data.skills).toBeDefined(); - expectTypeOf(data.skills).toEqualTypeOf(); - expect(data.bestiary).toBeDefined(); - expectTypeOf(data.bestiary).toEqualTypeOf(); - expect(data.slayer).toBeDefined(); - expectTypeOf(data.slayer).toEqualTypeOf(); - expect(data.crimsonIsle).toBeDefined(); - expectTypeOf(data.crimsonIsle).toEqualTypeOf(); - expect(data.dungeons).toBeDefined(); - expectTypeOf(data.dungeons).toEqualTypeOf(); - expect(data.collections).toBeDefined(); - expectTypeOf(data.collections).toEqualTypeOf>(); - expect(data.purse).toBeDefined(); - expect(data.purse).toBeGreaterThanOrEqual(0); - expectTypeOf(data.purse).toEqualTypeOf(); - expect(data.stats).toBeDefined(); - expectTypeOf(data.stats).toEqualTypeOf(); - expect(data.pets).toBeDefined(); - expectTypeOf(data.pets).toEqualTypeOf(); - expect(data.jacob).toBeDefined(); - expectTypeOf(data.jacob).toEqualTypeOf(); - expect(data.chocolate).toBeDefined(); - expectTypeOf(data.chocolate).toEqualTypeOf(); - expect(data.toString()).toBeDefined(); - expect(data.toString()).toBe(data.uuid); - expectTypeOf(data.toString()).toEqualTypeOf(); -}); diff --git a/src/Structures/SkyBlock/SkyblockMember.ts b/src/Structures/SkyBlock/SkyblockMember.ts deleted file mode 100644 index ebcdcf0f7..000000000 --- a/src/Structures/SkyBlock/SkyblockMember.ts +++ /dev/null @@ -1,239 +0,0 @@ -import SkyblockGarden from './SkyblockGarden.js'; -import SkyblockInventoryItem from './SkyblockInventoryItem.js'; -import SkyblockMemberMinions from './SkyblockMemberMinions.js'; -import SkyblockMemberStats from './SkyblockMemberStats.js'; -import SkyblockMuseum from './SkyblockMuseum.js'; -import SkyblockPet from './SkyblockPet.js'; -import { type NetworthResult, getNetworth } from 'skyhelper-networth'; -import { createFarmingWeightCalculator } from 'farming-weight'; -import { - decode, - getBestiaryLevel, - getChocolateFactory, - getCrimsonIsle, - getDungeons, - getHOTM, - getJacobData, - getPetLevel, - getSkills, - getSlayer -} from '../../Utils/SkyblockUtils.js'; -import { petScore } from '../../Utils/Constants.js'; -import type { - Armor, - ChocolateFactoryData, - CrimsonIsle, - Dungeons, - Equipment, - HOTM, - JacobData, - Skills, - Slayer -} from '../../Types/Skyblock.js'; - -class SkyblockMember { - uuid: string; - gameMode: string | null; - selected: boolean; - garden: SkyblockGarden | null; - museum: SkyblockMuseum | null; - profileName: string; - profileId: string; - firstJoinTimestamp: number | null; - firstJoinAt: Date | null; - experience: number; - level: number; - hotm: HOTM; - highestMagicalPower: number; - fairySouls: number; - fairyExchanges: number; - skills: Skills; - bestiary: number; - slayer: Slayer | null; - crimsonIsle: CrimsonIsle; - dungeons: Dungeons; - collections: Record; - purse: number; - stats: SkyblockMemberStats; - pets: SkyblockPet[]; - jacob: JacobData; - chocolate: ChocolateFactoryData; - minions: SkyblockMemberMinions; - getArmor: () => Promise; - getWardrobe: () => Promise; - getEnderChest: () => Promise; - getInventory: () => Promise; - getPetScore: () => number; - getEquipment: () => Promise; - getPersonalVault: () => Promise; - getNetworth: () => Promise; - getFarmingWeight: () => number; - constructor(data: Record) { - this.uuid = data?.uuid || ''; - this.gameMode = data?.gameMode || null; - this.selected = data?.selected || false; - this.garden = data?.garden || null; - this.museum = data?.museum || null; - this.profileName = data?.profileName || ''; - this.profileId = data?.profileId || ''; - this.firstJoinTimestamp = data?.m?.profile?.first_join || 0; - this.firstJoinAt = new Date(data?.m?.profile?.first_join); - this.experience = data?.m?.leveling?.experience || 0; - this.level = this.experience ? this.experience / 100 : 0; - this.hotm = getHOTM(data.m); - this.highestMagicalPower = data?.m?.accessory_bag_storage?.highest_magical_power || 0; - this.fairySouls = data?.m?.fairy_soul?.total_collected || 0; - this.fairyExchanges = data?.m?.fairy_soul?.fairy_exchanges || 0; - this.skills = getSkills(data.m); - this.bestiary = getBestiaryLevel(data.m); - this.slayer = getSlayer(data.m); - this.crimsonIsle = getCrimsonIsle(data.m); - this.dungeons = getDungeons(data.m); - this.collections = data?.m?.collection || {}; - this.purse = data?.m?.currencies?.coin_purse || 0; - this.stats = new SkyblockMemberStats(data?.m?.player_stats); - this.pets = data?.m?.pets_data?.pets ? data.m.pets_data.pets.map((pet: any) => new SkyblockPet(pet)) : []; - this.jacob = getJacobData(data.m); - this.chocolate = getChocolateFactory(data.m); - this.minions = new SkyblockMemberMinions(data.m?.player_data?.crafted_generators ?? []); - this.getArmor = async () => { - const base64 = data?.m?.inventory?.inv_armor; - const decoded = await decode(base64?.data); - const armor = { - helmet: decoded[3]?.id ? new SkyblockInventoryItem(decoded[3]) : null, - chestplate: decoded[2]?.id ? new SkyblockInventoryItem(decoded[2]) : null, - leggings: decoded[1]?.id ? new SkyblockInventoryItem(decoded[1]) : null, - boots: decoded[0]?.id ? new SkyblockInventoryItem(decoded[0]) : null - }; - return armor; - }; - this.getWardrobe = async () => { - const base64 = data?.m?.inventory?.wardrobe_contents?.data; - if (!base64) return []; - const decoded = await decode(base64); - const armor = decoded - .filter((item) => 0 !== Object.keys(item).length) - .map((item) => new SkyblockInventoryItem(item)); - return armor; - }; - this.getEnderChest = async () => { - let chest = data?.m?.inventory?.ender_chest_contents; - if (!chest) return []; - try { - chest = await decode(chest?.data); - const edited = []; - for (let i = 0; i < chest.length; i++) { - if (!chest[i]?.id) continue; - edited.push(new SkyblockInventoryItem(chest[i])); - } - return edited; - } catch { - return []; - } - }; - this.getInventory = async () => { - let inventory = data?.m?.inventory?.inv_contents; - if (!inventory) return []; - try { - inventory = await decode(inventory?.data); - const edited = []; - for (let i = 0; i < inventory.length; i++) { - if (!inventory[i]?.id) continue; - edited.push(new SkyblockInventoryItem(inventory[i])); - } - return edited; - } catch { - return []; - } - }; - this.getPetScore = () => { - const highestRarity: { [key: string]: any } = {}; - for (const pet of data?.m?.pets_data?.pets) { - if (!(pet?.type in highestRarity) || (petScore[pet?.tier] || 1) > highestRarity[pet?.type]) { - highestRarity[pet?.type] = petScore[pet?.tier]; - } - } - const highestLevel: { [key: string]: any } = {}; - for (const pet of data?.m?.pets_data?.pets) { - const maxLevel = 'GOLDEN_DRAGON' === pet?.type ? 200 : 100; - const petLevel = getPetLevel(pet?.exp, pet?.tier, maxLevel); - if (!(pet?.type in highestLevel) || petLevel?.level > highestLevel[pet?.type]) { - if (petLevel?.level < maxLevel) { - continue; - } - highestLevel[pet?.type] = 1; - } - } - return ( - Object.values(highestRarity).reduce((a, b) => a + b, 0) + Object.values(highestLevel).reduce((a, b) => a + b, 0) - ); - }; - this.getEquipment = async () => { - let equipment = data?.m?.inventory?.equipment_contents; - if (!equipment) { - return { gauntlet: null, belt: null, cloak: null, necklace: null }; - } - try { - equipment = await decode(equipment?.data); - const playerEquipment = { - gauntlet: equipment?.[3]?.id ? new SkyblockInventoryItem(equipment[3]) : null, - belt: equipment?.[2]?.id ? new SkyblockInventoryItem(equipment[2]) : null, - cloak: equipment?.[1]?.id ? new SkyblockInventoryItem(equipment[1]) : null, - necklace: equipment?.[0]?.id ? new SkyblockInventoryItem(equipment[0]) : null - }; - return playerEquipment; - } catch { - return { gauntlet: null, belt: null, cloak: null, necklace: null }; - } - }; - this.getPersonalVault = async () => { - let vault = data?.m?.inventory?.personal_vault_contents; - if (!vault) return []; - try { - vault = await decode(vault?.data); - const edited = []; - for (let i = 0; i < vault?.length; i++) { - if (!vault[i]?.id) continue; - edited.push(new SkyblockInventoryItem(vault[i])); - } - return edited; - } catch { - return []; - } - }; - this.getNetworth = async () => { - try { - const nw = await getNetworth(data?.m, data?.banking?.balance ?? 0, { - onlyNetworth: true, - v2Endpoint: true, - cache: true, - museumData: data?.museum?.raw ?? {} - }); - return nw; - } catch { - return null; - } - }; - this.getFarmingWeight = () => { - try { - return createFarmingWeightCalculator({ - collection: this.collections, - farmingXp: this.skills.farming.xp, - levelCapUpgrade: this.jacob.perks.farmingLevelCap, - anitaBonusFarmingFortuneLevel: this.jacob.perks.doubleDrops, - minions: data?.m?.player_data?.crafted_generators, - contests: Object.values(this.jacob.contests), - pests: data?.m?.bestiary?.kills - }).getWeightInfo().totalWeight; - } catch { - return 0; - } - }; - } - - toString(): string { - return this.uuid; - } -} - -export default SkyblockMember; diff --git a/src/Structures/SkyBlock/SkyblockMemberMinion.ts b/src/Structures/SkyBlock/SkyblockMemberMinion.ts deleted file mode 100644 index b74822ac1..000000000 --- a/src/Structures/SkyBlock/SkyblockMemberMinion.ts +++ /dev/null @@ -1,34 +0,0 @@ -class SkyblockMemberMinion { - t1: boolean; - t2: boolean; - t3: boolean; - t4: boolean; - t5: boolean; - t6: boolean; - t7: boolean; - t8: boolean; - t9: boolean; - t10: boolean; - t11: boolean; - t12: boolean; - [key: string]: boolean; - constructor(data: number[]) { - this.t1 = false; - this.t2 = false; - this.t3 = false; - this.t4 = false; - this.t5 = false; - this.t6 = false; - this.t7 = false; - this.t8 = false; - this.t9 = false; - this.t10 = false; - this.t11 = false; - this.t12 = false; - data.forEach((tier) => { - if (1 <= tier && 12 >= tier) this[`t${tier}`] = true; - }); - } -} - -export default SkyblockMemberMinion; diff --git a/src/Structures/SkyBlock/SkyblockMemberMinions.ts b/src/Structures/SkyBlock/SkyblockMemberMinions.ts deleted file mode 100644 index d359a69d6..000000000 --- a/src/Structures/SkyBlock/SkyblockMemberMinions.ts +++ /dev/null @@ -1,32 +0,0 @@ -import SkyblockMemberMinion from './SkyblockMemberMinion.js'; - -function parse(data: string[]): { [key: string]: number[] } { - const minionData: Record = {}; - data - .sort((a, b) => { - if ((a.split('_')[0] || 'Unknown') < (b.split('_')[0] || 'Unknown')) return -1; - if ((a.split('_')[0] || 'Unknown') > (b.split('_')[0] || 'Unknown')) return 1; - return 0; - }) - .forEach((minion) => { - const minionName = minion.split('_')[0] || 'Unknown'; - if (undefined === minionData[minionName]) minionData[minionName] = []; - minionData[minionName].push(Number(minion.split('_')[1] || '0')); - minionData[minionName] = minionData[minionName].sort((a, b) => a - b); - }); - return minionData; -} - -class SkyblockMemberMinions { - [key: string]: SkyblockMemberMinion; - constructor(data: string[]) { - const parsed = parse(data); - if (!parsed) return; - Object.keys(parsed).forEach((minion) => { - if (undefined === parsed[minion]) return; - this[minion.toLowerCase()] = new SkyblockMemberMinion(parsed[minion]); - }); - } -} - -export default SkyblockMemberMinions; diff --git a/src/Structures/SkyBlock/SkyblockMemberStats.ts b/src/Structures/SkyBlock/SkyblockMemberStats.ts deleted file mode 100644 index 4d8aee79c..000000000 --- a/src/Structures/SkyBlock/SkyblockMemberStats.ts +++ /dev/null @@ -1,140 +0,0 @@ -import type { - MemberStatsAuctions, - MemberStatsCandy, - MemberStatsFishing, - MemberStatsGifts, - MemberStatsMythos, - MemberStatsPetMilestones -} from '../../Types/Skyblock.js'; - -class SkyblockMemberStats { - candy: MemberStatsCandy; - petMilestones: MemberStatsPetMilestones; - highestCriticalDamage: number; - highestDamage: number; - glowingMusroomsBroken: number; - kills: Record; - deaths: Record; - auctions: MemberStatsAuctions; - gifts: MemberStatsGifts; - itemsFished: MemberStatsFishing; - mythos: MemberStatsMythos; - constructor(data: Record) { - this.candy = { - green: data?.candy_collected?.green_candy || 0, - purple: data?.candy_collected?.purple_candy || 0, - total: data?.candy_collected?.total || 0, - festivals: [] - }; - Object.keys(data?.candy_collected || {}).forEach((year: string) => { - if ('total' !== year && 'green_candy' !== year && 'purple_candy' !== year) { - this.candy?.festivals?.push({ - year: Number(data?.candy_collected?.[`spooky_festival_${year}`] || '0'), - collected: { - green: data?.candy_collected?.[`spooky_festival_${year}`]?.green_candy || 0, - purple: data?.candy_collected?.[`spooky_festival_${year}`]?.purple_candy || 0, - total: data?.candy_collected?.[`spooky_festival_${year}`]?.total || 0 - } - }); - } - }); - this.petMilestones = { - oresMinned: data?.pets?.milestones?.ores_mined || 0, - seaCreaturesKilled: data?.pets?.milestones?.sea_creatures_killed || 0 - }; - this.highestCriticalDamage = data?.highest_critical_damage || 0; - this.highestDamage = data?.highest_damage || 0; - this.glowingMusroomsBroken = data?.glowing_mushrooms_broken || 0; - this.kills = { - total: Object.values(data?.kills || {})?.reduce((acc: any, curr) => acc + curr, 0) as number, - ...Object.keys(data?.kills || {}) - .filter((key) => 'total' !== key) - .sort((a, b) => data?.kills[b] - data?.kills[a]) - .map((key) => ({ [key]: data?.kills[key] })) - .reduce((acc, curr) => ({ ...acc, ...curr }), {}) - }; - this.deaths = { - total: Object.values(data?.deaths || {})?.reduce((acc: any, curr) => acc + curr, 0) as number, - ...Object.keys(data?.deaths || {}) - .filter((key) => 'total' !== key) - .sort((a, b) => data?.deaths[b] - data?.deaths[a]) - .map((key) => ({ [key]: data?.deaths[key] })) - .reduce((acc, curr) => ({ ...acc, ...curr }), {}) - }; - this.auctions = { - bids: data?.auctions?.bids || 0, - highestBid: data?.auctions?.highest_bid || 0, - goldSpent: data?.auctions?.gold_spent || 0, - goldEarnt: data?.auctions?.gold_earnt || 0, - auctionsWon: data?.auctions?.won || 0, - auctionsCompleted: data?.auctions?.completed || 0, - auctionsCreated: data?.auctions?.created || 0, - auctionFees: data?.auctions?.auction_fees || 0, - auctionsWithOutBids: data?.auctions?.no_bids || 0, - bought: { - uncommon: data?.auctions?.total_bought?.uncommon || 0, - common: data?.auctions?.total_bought?.common || 0, - rare: data?.auctions?.total_bought?.rare || 0, - epic: data?.auctions?.total_bought?.epic || 0, - legendary: data?.auctions?.total_bought?.legendary || 0, - special: data?.auctions?.total_bought?.special || 0, - mythic: data?.auctions?.total_bought?.mythic || 0, - total: - data?.auctions?.total_bought?.uncommon || - 0 + data?.auctions?.total_bought?.common || - 0 + data?.auctions?.total_bought?.rare || - 0 + data?.auctions?.total_bought?.epic || - 0 + data?.auctions?.total_bought?.legendary || - 0 + data?.auctions?.total_bought?.special || - 0 + data?.auctions?.total_bought?.mythic || - 0 - }, - sold: { - uncommon: data?.auctions?.total_sold?.uncommon || 0, - common: data?.auctions?.total_sold?.common || 0, - rare: data?.auctions?.total_sold?.rare || 0, - epic: data?.auctions?.total_sold?.epic || 0, - legendary: data?.auctions?.total_sold?.legendary || 0, - special: data?.auctions?.total_sold?.special || 0, - mythic: data?.auctions?.total_sold?.mythic || 0, - total: - data?.auctions?.total_sold?.uncommon || - 0 + data?.auctions?.total_sold?.common || - 0 + data?.auctions?.total_sold?.rare || - 0 + data?.auctions?.total_sold?.epic || - 0 + data?.auctions?.total_sold?.legendary || - 0 + data?.auctions?.total_sold?.special || - 0 + data?.auctions?.total_sold?.mythic || - 0 - } - }; - this.gifts = { given: data?.gifts?.total_given || 0, received: data?.gifts?.total_received || 0 }; - this.itemsFished = { - total: data?.items_fished?.total || 0, - normal: data?.items_fished?.normal || 0, - tresure: data?.items_fished?.treasure || 0, - largeTresure: data?.items_fished?.large_treasure || 0 - }; - this.mythos = { - kills: data?.mythos?.kills || 0, - burrowsDugNext: { - total: data?.mythos?.burrows_dug_next?.total || 0, - common: data?.mythos?.burrows_dug_next?.common || 0 - }, - burrowsDugCombat: { - total: data?.mythos?.burrows_dug_combat?.total || 0, - common: data?.mythos?.burrows_dug_combat?.common || 0 - }, - burrowsDugTreasure: { - total: data?.mythos?.burrows_dug_treasure?.total || 0, - common: data?.mythos?.burrows_dug_treasure?.common || 0 - }, - burrowsDugComplate: { - total: data?.mythos?.burrows_dug_complete?.total || 0, - common: data?.mythos?.burrows_dug_complete?.common || 0 - } - }; - } -} - -export default SkyblockMemberStats; diff --git a/src/Structures/SkyBlock/SkyblockMuseum.ts b/src/Structures/SkyBlock/SkyblockMuseum.ts deleted file mode 100644 index 525c47e7b..000000000 --- a/src/Structures/SkyBlock/SkyblockMuseum.ts +++ /dev/null @@ -1,43 +0,0 @@ -import SkyblockMuseumItem from './SkyblockMuseumItem.js'; -import { decode } from '../../Utils/SkyblockUtils.js'; - -class SkyblockMuseum { - raw: Record; - value: number; - appraisal: boolean; - getItems: () => Promise; - getSpecial: () => Promise; - constructor(data: Record) { - this.raw = data.m.members?.[data.uuid] ?? {}; - this.value = data.value; - this.appraisal = data.appraisal; - this.getItems = async (): Promise => { - const items: SkyblockMuseumItem[] = []; - for (const item of Object.keys(data?.m?.members[data?.uuid]?.items) || {}) { - items.push( - new SkyblockMuseumItem( - item, - data?.m?.members[data?.uuid]?.items[item], - await decode(data?.m?.members[data?.uuid]?.items[item]?.items?.data) - ) - ); - } - return items; - }; - this.getSpecial = async (): Promise => { - const items: SkyblockMuseumItem[] = []; - for (const item of Object.keys(data?.m?.members[data?.uuid]?.special || {})) { - items.push( - new SkyblockMuseumItem( - item, - data?.m?.members[data?.uuid]?.special[item], - await decode(data?.m?.members[data?.uuid]?.special[item]?.items?.data) - ) - ); - } - return items; - }; - } -} - -export default SkyblockMuseum; diff --git a/src/Structures/SkyBlock/SkyblockMuseumItem.ts b/src/Structures/SkyBlock/SkyblockMuseumItem.ts deleted file mode 100644 index fda8f9992..000000000 --- a/src/Structures/SkyBlock/SkyblockMuseumItem.ts +++ /dev/null @@ -1,26 +0,0 @@ -import SkyblockInventoryItem from './SkyblockInventoryItem.js'; - -class SkyblockMuseumItem { - name: string; - donated: number; - items: SkyblockInventoryItem[]; - borrowing: boolean; - featuredSlot: string | null; - constructor(name: string, data: Record, decoded: any[]) { - this.name = name; - this.donated = data.donated_time || 0; - this.featuredSlot = data.featured_slot || null; - this.borrowing = data.borrowing || false; - this.items = []; - decoded.forEach((item) => { - if (!item.tag) return; - this.items.push(new SkyblockInventoryItem(item)); - }); - } - - toString(): string { - return this.name; - } -} - -export default SkyblockMuseumItem; diff --git a/src/Structures/SkyBlock/SkyblockPet.ts b/src/Structures/SkyBlock/SkyblockPet.ts deleted file mode 100644 index 8836b71a3..000000000 --- a/src/Structures/SkyBlock/SkyblockPet.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { petScore } from '../../Utils/Constants.js'; -import type { Rarity } from '../../Types/Skyblock.js'; - -class SkyblockPet { - uuid: string; - name: string; - xp: number; - active: boolean; - rarity: Rarity; - petScore: number; - heldItem: string | null; - candyUsed: number; - skin: string | null; - constructor(data: Record) { - this.uuid = data.uuid; - this.name = data.type; - this.xp = data.exp || 0; - this.active = Boolean(data.active); - this.rarity = data.tier; - this.petScore = petScore?.[this.rarity] || 0; - this.heldItem = data.heldItem ? data.heldItem.replace(/^PET_ITEM_/, '') : null; - this.candyUsed = data.candyUsed || 0; - this.skin = data.skin; - } - - toString(): string { - return this.name; - } -} - -export default SkyblockPet; diff --git a/src/Structures/SkyBlock/SkyblockProfile.ts b/src/Structures/SkyBlock/SkyblockProfile.ts deleted file mode 100644 index b2a61a85d..000000000 --- a/src/Structures/SkyBlock/SkyblockProfile.ts +++ /dev/null @@ -1,45 +0,0 @@ -import SkyblockGarden from './SkyblockGarden.js'; -import SkyblockMember from './SkyblockMember.js'; - -class SkyblockProfile { - profileId: string; - profileName: string; - gameMode: string | null; - banking: object; - garden: SkyblockGarden | null; - communityUpgrades: object; - selected: boolean; - members: SkyblockMember[]; - me: SkyblockMember | undefined; - constructor(data: Record) { - this.profileId = data.profileId || ''; - this.profileName = data.profileName || ''; - this.gameMode = data.gameMode || null; - this.banking = data.banking || {}; - this.garden = data.garden || null; - this.communityUpgrades = data.communityUpgrades || {}; - this.selected = data.selected || false; - this.members = Object.keys(data.members).map( - (uuid) => - new SkyblockMember({ - uuid: uuid, - profileId: this.profileId, - garden: data.garden, - museum: data.museum, - profileName: this.profileName, - gameMode: this.gameMode, - m: data.members[uuid], - banking: this.banking, - communityUpgrades: this.communityUpgrades, - selected: this.selected - }) - ); - this.me = this.members.find((x) => x.uuid === data.uuid); - } - - toString(): string { - return this.profileName; - } -} - -export default SkyblockProfile; diff --git a/src/Structures/SkyBlock/Static/Bingo.ts b/src/Structures/SkyBlock/Static/Bingo.ts deleted file mode 100644 index cb065065b..000000000 --- a/src/Structures/SkyBlock/Static/Bingo.ts +++ /dev/null @@ -1,50 +0,0 @@ -function parsePosition(position: number): [number, number] { - const x = (position % 5) + 1; - const y = Math.floor(position / 5) + 1; - return [x, y]; -} - -class Bingo { - name: string; - id: string; - row: number | null; - column: number | null; - rawLore: string; - lore: string; - tiers: number[]; - tierStep: number | null; - requiredAmount: number | null; - type: 'ONE_TIME' | 'ONE_TIER' | 'TIERED'; - constructor(data: Record, position: number = 0) { - this.name = data.name; - this.id = data.id; - const [row, column] = parsePosition(position); - this.row = row; - this.column = column; - this.rawLore = data.lore; - this.lore = data.lore?.replace?.(/§([1-9]|[a-l])|§/gm, '') || []; - this.tiers = Array.isArray(data.tiers) ? data.tiers.map((x) => parseInt(x, 10) || 0) : []; - this.tierStep = this.getTierStep(); - this.requiredAmount = parseInt(data.requiredAmount, 10) ?? null; - this.type = this.tiers ? 'TIERED' : this.requiredAmount ? 'ONE_TIER' : 'ONE_TIME'; - } - - toString(): string { - return this.id; - } - - private getTierStep(): number | null { - if ('TIERED' !== this.type) return null; - // No step possible - if (2 > this.tiers.length) return null; - const hypotheticStep = (this.tiers?.[1] || 0) - (this.tiers?.[0] || 0); - // Check if every 2 elements have the same step - const isConstant = this.tiers.slice(1).every((el, index) => { - return hypotheticStep === (this.tiers?.[index - 1] || 0) - el; - }); - if (!isConstant) return null; - return hypotheticStep; - } -} - -export default Bingo; diff --git a/src/Structures/SkyBlock/Static/BingoData.ts b/src/Structures/SkyBlock/Static/BingoData.ts deleted file mode 100644 index cfe9ab710..000000000 --- a/src/Structures/SkyBlock/Static/BingoData.ts +++ /dev/null @@ -1,21 +0,0 @@ -import Bingo from './Bingo.js'; - -class BingoData { - lastUpdatedTimestamp: number; - lastUpdatedAt: Date | null; - id: number | null; - goals: Bingo[] | null; - constructor(data: Record) { - this.lastUpdatedTimestamp = parseInt(data.lastUpdated, 10); - this.lastUpdatedAt = new Date(this.lastUpdatedTimestamp); - this.id = parseInt(data.id, 10) || null; - this.goals = Array.isArray(data.goals) ? data.goals.map((goal, index) => new Bingo(goal, index)) : null; - } - - getGoal(column: number, row: number): Bingo | undefined { - if (!this.goals || 1 > this.goals.length) return; - return this.goals.find((goal) => goal.row === row && goal.column === column); - } -} - -export default BingoData; diff --git a/src/Structures/SkyBlock/Static/Candidate.ts b/src/Structures/SkyBlock/Static/Candidate.ts deleted file mode 100644 index 23604943f..000000000 --- a/src/Structures/SkyBlock/Static/Candidate.ts +++ /dev/null @@ -1,26 +0,0 @@ -import Perk from './Perk.js'; - -class Candidate { - name: string; - keyBenefit: string; - perk: Perk | null; - perks: Perk[] | null; - isMayor: boolean; - isMinister: boolean; - votesReceived: number; - constructor(data: Record, isMayor: boolean = false, isMinister = false) { - this.name = data.name; - this.keyBenefit = data.key; - this.perk = data.perk?.[0] ? new Perk(data.perk[0]) : null; - this.perks = data.perks ? data.perks.map((x: any) => new Perk(x)) : null; - this.isMayor = isMayor || false; - this.isMinister = isMinister || false; - this.votesReceived = parseInt(data.votes, 10); - } - - toString(): string { - return this.name; - } -} - -export default Candidate; diff --git a/src/Structures/SkyBlock/Static/Government.ts b/src/Structures/SkyBlock/Static/Government.ts deleted file mode 100644 index e2ff88c85..000000000 --- a/src/Structures/SkyBlock/Static/Government.ts +++ /dev/null @@ -1,42 +0,0 @@ -import Candidate from './Candidate.js'; - -class GovernmentData { - lastUpdatedTimestamp: number; - lastUpdatedAt: Date; - lastElectionResults: Map; - mayor: Candidate | undefined; - runningYear: number; - currentElectionResults: Map | null; - currentElectionFor: number | null; - constructor(data: Record) { - this.lastUpdatedTimestamp = parseInt(data.lastUpdated, 10); - this.lastUpdatedAt = new Date(this.lastUpdatedTimestamp); - const lastElectionResults = data.mayor.election.candidates.map( - (x: any) => new Candidate(x, x.name === data.mayor.name) - ); - this.lastElectionResults = new Map( - lastElectionResults - .sort((a: any, b: any) => a.votesReceived - b.votesReceived) - .reverse() - .map((x: any) => [x.name, x]) - ); - this.mayor = this.lastElectionResults.get(data.mayor.name); - this.runningYear = parseInt(data.mayor.election.year, 10) || 0; - const thisElection = data.current?.candidates.map((x: any) => new Candidate(x, x.name === data.mayor.name)) || null; - this.currentElectionResults = thisElection - ? new Map( - thisElection - .sort((a: any, b: any) => a.votesReceived - b.votesReceived) - .reverse() - .map((x: any) => [x.name, x]) - ) - : null; - this.currentElectionFor = parseInt(data.current?.year, 10) || null; - } - - toString(): string { - return this.mayor?.name || ''; - } -} - -export default GovernmentData; diff --git a/src/Structures/SkyBlock/Static/Perk.ts b/src/Structures/SkyBlock/Static/Perk.ts deleted file mode 100644 index 6024a5e32..000000000 --- a/src/Structures/SkyBlock/Static/Perk.ts +++ /dev/null @@ -1,10 +0,0 @@ -class Perk { - name: string; - description: string; - constructor(data: Record) { - this.name = data.name; - this.description = data.description; - } -} - -export default Perk; diff --git a/src/Types/API.ts b/src/Types/API.ts index 81d0a545a..65949cdb1 100644 --- a/src/Types/API.ts +++ b/src/Types/API.ts @@ -1,5 +1,8 @@ -import Auction from '../Structures/SkyBlock/Auctions/Auction.js'; -import AuctionInfo from '../Structures/SkyBlock/Auctions/AuctionInfo.js'; +/* v8 ignore next 10000 */ + +import SkyBlockAuction from '../Structures/SkyBlock/Auctions/SkyBlockAuction.js'; +import type SkyBlockAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockAuctionInfo.js'; +import type SkyBlockBaseAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.js'; import type { RequestOptions } from './Requests.js'; export interface PlayerRequestOptions extends RequestOptions { @@ -12,15 +15,20 @@ export interface AuctionRequestOptions extends RequestOptions { includeItemBytes?: boolean; } -export interface SkyblockRequestOptions extends RequestOptions { +export interface SkyBlockRequestOptions extends RequestOptions { garden?: boolean; museum?: boolean; } -export interface SkyblockAuctionsResult { - info: AuctionInfo; - auctions: Auction[]; +export interface SkyBlockAuctionResult { + info: SkyBlockBaseAuctionInfo; + auctions: SkyBlockAuction[]; +} + +export interface SkyBlockAuctionsResult { + info: SkyBlockAuctionInfo; + auctions: SkyBlockAuction[]; } export type GuildFetchOptions = 'id' | 'name' | 'player'; -export type AuctionFetchOptions = 'profile' | 'player' | 'auction'; +export type AuctionFetchOptions = 'PROFILE' | 'PLAYER' | 'AUCTION_ID'; diff --git a/src/Types/Booster.ts b/src/Types/Booster.ts index dbcd95e22..3c17dc348 100644 --- a/src/Types/Booster.ts +++ b/src/Types/Booster.ts @@ -1 +1,3 @@ +/* v8 ignore next 10000 */ + export type BoosterType = 'STACKED' | 'QUEUED' | 'ACTIVE'; diff --git a/src/Types/Client.ts b/src/Types/Client.ts index 877fabc7d..f22546f04 100644 --- a/src/Types/Client.ts +++ b/src/Types/Client.ts @@ -1,3 +1,5 @@ +/* v8 ignore next 10000 */ + export interface ClientOptions { cache?: boolean; cacheTime?: number; diff --git a/src/Types/Color.ts b/src/Types/Color.ts index cf49dd30f..84d2c9754 100644 --- a/src/Types/Color.ts +++ b/src/Types/Color.ts @@ -1,3 +1,5 @@ +/* v8 ignore next 10000 */ + export type ColorCode = | 'BLACK' | 'DARK_BLUE' diff --git a/src/Types/Game.ts b/src/Types/Game.ts index e5665402c..81cce4e75 100644 --- a/src/Types/Game.ts +++ b/src/Types/Game.ts @@ -1,3 +1,5 @@ +/* v8 ignore next 10000 */ + export type GameID = | 2 | 3 diff --git a/src/Types/Global.ts b/src/Types/Global.ts new file mode 100644 index 000000000..834ecc01a --- /dev/null +++ b/src/Types/Global.ts @@ -0,0 +1,4 @@ +/* v8 ignore next 10000 */ + +export type UUID = string; +export type UserInput = string; diff --git a/src/Types/Guild.ts b/src/Types/Guild.ts index 3fa114ab5..6c4625161 100644 --- a/src/Types/Guild.ts +++ b/src/Types/Guild.ts @@ -1,3 +1,5 @@ +/* v8 ignore next 10000 */ + export interface ExpHistory { day: string; date: Date | undefined; diff --git a/src/Types/Player.ts b/src/Types/Player.ts index c4fb72bb7..5fc8c7117 100644 --- a/src/Types/Player.ts +++ b/src/Types/Player.ts @@ -1,3 +1,4 @@ +/* v8 ignore next 10000 */ // Credits: Pixelic: https://github.com/pixelicc - Most types in player import Arcade from '../Structures/MiniGames/Arcade/Arcade.js'; diff --git a/src/Types/Requests.ts b/src/Types/Requests.ts index b4f4042de..cc95a8304 100644 --- a/src/Types/Requests.ts +++ b/src/Types/Requests.ts @@ -1,3 +1,5 @@ +/* v8 ignore next 10000 */ + export interface RequestOptions { raw?: boolean; noCache?: boolean; diff --git a/src/Types/SkyBlock.ts b/src/Types/SkyBlock.ts new file mode 100644 index 000000000..c940d2ac8 --- /dev/null +++ b/src/Types/SkyBlock.ts @@ -0,0 +1,3532 @@ +/* v8 ignore next 10000 */ + +export interface RawAbiphoneData { + talked_to?: boolean; + completed_quest?: boolean; + incoming_calls_count?: number; + last_call_incoming?: number; +} + +export interface RawSkyBlockObjective { + status: 'COMPLETE' | 'ACTIVE'; + progress: number; + completed_at: number; +} + +export type HarpSong = + | 'hymn_joy' + | 'frere_jacques' + | 'amazing_grace' + | 'brahms' + | 'happy_birthday' + | 'greensleeves' + | 'jeopardy' + | 'minuet' + | 'joy_world' + | 'pure_imagination' + | 'vie_en_rose' + | 'fire_and_flames' + | 'pachelbel'; + +export type Rarity = + | 'COMMON' + | 'UNCOMMON' + | 'RARE' + | 'EPIC' + | 'LEGENDARY' + | 'MYTHIC' + | 'DIVINE' + | 'SPECIAL' + | 'VERY_SPECIAL'; + +export type Skills = + | 'farming' + | 'mining' + | 'combat' + | 'foraging' + | 'fishing' + | 'enchanting' + | 'alchemy' + | 'taming' + | 'carpentry' + | 'runecrafting' + | 'social'; + +export type GardenCrops = + | 'wheat' + | 'carrot' + | 'sugarCane' + | 'potato' + | 'pumpkin' + | 'melon' + | 'cactus' + | 'cocoaBeans' + | 'mushroom' + | 'netherWart'; + +export type BankingTransactionAction = 'DEPOSIT' | 'WITHDRAW'; +export type CommunityUpgradesUpgrades = + | 'island_size' + | 'minion_slots' + | 'guests_count' + | 'coop_slots' + | 'coins_allowance'; + +export type SkyBlockProfileName = + | 'Apple' + | 'Banana' + | 'Blueberry' + | 'Coconut' + | 'Cucumber' + | 'Grapes' + | 'Kiwi' + | 'Lemon' + | 'Lime' + | 'Mango' + | 'Orange' + | 'Papaya' + | 'Pear' + | 'Peach' + | 'Pineapple' + | 'Pomegranate' + | 'Raspberry' + | 'Strawberry' + | 'Tomato' + | 'Watermelon' + | 'Zucchini' + | 'Not Allowed To Quit SkyBlock Ever Again' + | 'Complain Everyday' + | 'Restored' + | 'TEST'; + +export type SkyBlockArrow = + | 'ARROW' + | 'REINFORCED_IRON_ARROW' + | 'GOLD_TIPPED_ARROW' + | 'REDSTONE_TIPPED_ARROW' + | 'EMERALD_TIPPED_ARROW' + | 'BOUNCY_ARROW' + | 'ICY_ARROW' + | 'ARMORSHRED_ARROW' + | 'EXPLOSIVE_ARROW' + | 'GLUE_ARROW' + | 'NANSORB_ARROW'; + +export type MiningPickaxeAbility = + | 'mining_speed_boost' + | 'pickaxe_toss' + | 'anomalous_desire' + | 'maniac_miner' + | 'sheer_force'; + +export type MiningSkyMallEffect = + | 'dig_speed' + | 'mining_fortune' + | 'powder_bonus' + | 'pickaxe_ability_cooldown' + | 'goblin_chance' + | 'titanium_ore_multiplier'; +export type TaskLevelingSort = 'unlocked' | 'earned' | 'available' | 'a_to_z' | 'z_to_a'; +export type SkyBlockProfileType = 'bingo' | 'island' | 'ironman'; +export type CrimsonIsleFaction = 'mages' | 'barbarians'; +export type CrimsonIsleBelt = 'White' | 'Yellow' | 'Green' | 'Blue' | 'Brown' | 'Black'; +export type CrimsonIsleDojoRank = 'S' | 'A' | 'B' | 'C' | 'D' | 'F'; +export type CrimsonIsleTrophyFishRank = 'Bronze' | 'Silver' | 'Gold' | 'Diamond'; +export type CrimsonIsleKuudraTier = 'BASIC' | 'HOT' | 'BURNING' | 'FIERY' | 'INFERNAL'; +export type CrimsonIsleRingtone = + | 'DEFAULT' + | 'ENTERTAINER' + | 'NOTKIA' + | 'TEACHY' + | 'SCRAPPER' + | 'FUR_ELISE' + | 'JINGLE_BELLS' + | 'VIBRATE'; + +export type AbiphoneContactSort = 'first_added' | 'alphabetical' | 'last_called' | 'most_called' | 'dnd_enabled'; +export type AbiphoneContact = + | 'alchemist' + | 'alixer' + | 'anita' + | 'aranya' + | 'bingo' + | 'blacksmith' + | 'brynmor' + | 'builder' + | 'captain_ahone' + | 'dean' + | 'duncan' + | 'dusk' + | 'elizabeth' + | 'einary' + | 'elle' + | 'fann' + | 'fear_mongerer' + | 'fred' + | 'geo' + | 'george' + | 'hoppity' + | 'igrupan' + | 'jacob' + | 'jax' + | 'jotraeline_greatforge' + | 'kat' + | 'kaus' + | 'kuudra_gatekeeper' + | 'lumber_merchant' + | 'maddox_the_slayer' + | 'maxwell' + | 'mort' + | 'odger' + | 'ophelia' + | 'oringo' + | 'pablo' + | 'plumber_joe' + | 'queen_mismyla' + | 'queen_nyx' + | 'roddy' + | 'rollim' + | 'rusty' + | 'shifty' + | 'sirih' + | 'sirius' + | 'st._jerry' + | 'suus' + | 'tia_the_fairy' + | 'tomioka' + | 'trevor' + | 'trinity' + | 'vicent' + | 'walter' + | 'wool_weaver' + | 'zog'; +export type VisitorStatus = 'STARTED' | 'NOT_STARTED'; +export type SkyBlockSlayer = 'zombie' | 'spider' | 'wolf' | 'enderman' | 'blaze' | 'vampire'; +export type DungeonsTreasureType = 'wood' | 'gold' | 'diamond' | 'emerald' | 'obsidian' | 'bedrock'; +export type DungeonClass = 'healer' | 'mage' | 'berserk' | 'archer' | 'tank'; +export type DungeonGamemode = 'catacombs' | 'master_catacombs'; +export type SkyBlockDragon = 'protector' | 'old' | 'unstable' | 'young' | 'strong' | 'wise' | 'superior'; +export type ForgeItemType = + | 'REFINING' + | 'FORGING' + | 'PERFECT_GEMSTONES' + | 'REFINE' + | 'ITEM_CASTING' + | 'DRILL_PARTS' + | 'OTHER' + | 'PETS' + | 'GEAR'; +export type SkyBlockXPTables = Skills | 'default' | 'runecrafting' | 'dungeoneering' | 'hotm' | 'garden' | GardenCrops; +export type MiningPower = 'mithril' | 'gemstone' | 'glacite'; +export type MiningCrystal = + | 'jade' + | 'amber' + | 'amethyst' + | 'sapphire' + | 'topaz' + | 'jasper' + | 'ruby' + | 'aquamarine' + | 'opal' + | 'peridot' + | 'onyx' + | 'citrine'; + +export type MiningForgeItemId = + | 'REFINED_DIAMOND' + | 'REFINED_MITHRIL' + | 'REFINED_TITANIUM' + | 'REFINED_TUNGSTEN' + | 'REFINED_UMBER' + | 'MITHRIL_NECKLACE' + | 'MITHRIL_CLOAK' + | 'MITHRIL_BELT' + | 'MITHRIL_GAUNTLET' + | 'TITANIUM_NECKLACE' + | 'TITANIUM_CLOAK' + | 'TITANIUM_BELT' + | 'TITANIUM_GAUNTLET' + | 'TITANIUM_TALISMAN' + | 'TITANIUM_RING' + | 'TITANIUM_ARTIFACT' + | 'TITANIUM_RELIC' + | 'DIVAN_POWDER_COATING' + | 'DIVAN_HELMET' + | 'DIVAN_CHESTPLATE' + | 'DIVAN_LEGGINGS' + | 'DIVAN_BOOTS' + | 'AMBER_NECKLACE' + | 'SAPPHIRE_CLOAK' + | 'JADE_BELT' + | 'AMETHYST_GAUNTLET' + | 'GEMSTONE_CHAMBER' + | 'DWARVEN_HANDWARMERS' + | 'DWARVEN_METAL' + | 'DIVAN_PENDANT' + | 'POWER_RELIC' + | 'PERFECT_AMBER_GEM' + | 'PERFECT_AMETHYST_GEM' + | 'PERFECT_JADE_GEM' + | 'PERFECT_JASPER_GEM' + | 'PERFECT_OPAL_GEM' + | 'PERFECT_RUBY_GEM' + | 'PERFECT_SAPPHIRE_GEM' + | 'PERFECT_TOPAZ_GEM' + | 'PERFECT_AQUAMARINE_GEM' + | 'PERFECT_CITRINE_GEM' + | 'PERFECT_ONYX_GEM' + | 'PERFECT_PERIDOT_GEM' + | 'BEJEWELED_HANDLE' + | 'DRILL_ENGINE' + | 'FUEL_TANK' + | 'GEMSTONE_MIXTURE' + | 'GLACITE_AMALGAMATION' + | 'GOLDEN_PLATE' + | 'MITHRIL_PLATE' + | 'TUNGSTEN_PLATE' + | 'UMBER_PLATE' + | 'PERFECT_PLATE' + | 'DIAMONITE' + | 'POCKET_ICEBERG' + | 'PETRIFIED_STARFALL' + | 'PURE_MITHRIL' + | 'ROCK_GEMSTONE' + | 'TITANIUM_TESSERACT' + | 'GLEAMING_CRYSTAL' + | 'HOT_STUFF' + | 'AMBER_MATERIAL' + | 'FRIGID_HUSK' + | 'BEJEWELED_COLLAR' + | 'MOLE' + | 'AMMONITE' + | 'PENGUIN' + | 'TYRANNOSAURUS' + | 'SPINOSAURUS' + | 'GOBLIN' + | 'ANKYLOSAURUS' + | 'MAMMOTH' + | 'MITHRIL_DRILL_1' + | 'MITHRIL_DRILL_2' + | 'GEMSTONE_DRILL_1' + | 'GEMSTONE_DRILL_2' + | 'GEMSTONE_DRILL_3' + | 'GEMSTONE_DRILL_4' + | 'POLISHED_TOPAZ_ROD' + | 'TITANIUM_DRILL_1' + | 'TITANIUM_DRILL_2' + | 'TITANIUM_DRILL_3' + | 'TITANIUM_DRILL_4' + | 'CHISEL' + | 'REINFORCED_CHISEL' + | 'GLACITE_CHISEL' + | 'PERFECT_CHISEL' + | 'DIVAN_DRILL' + | 'STARFALL_SEASONING' + | 'GOBLIN_OMELETTE' + | 'GOBLIN_OMELETTE_BLUE_CHEESE' + | 'GOBLIN_OMELETTE_PESTO' + | 'GOBLIN_OMELETTE_SPICY' + | 'GOBLIN_OMELETTE_SUNNY_SIDE' + | 'TUNGSTEN_KEYCHAIN' + | 'MITHRIL_DRILL_ENGINE' + | 'TITANIUM_DRILL_ENGINE' + | 'RUBY_POLISHED_DRILL_ENGINE' + | 'SAPPHIRE_POLISHED_DRILL_ENGINE' + | 'AMBER_POLISHED_DRILL_ENGINE' + | 'MITHRIL_FUEL_TANK' + | 'TITANIUM_FUEL_TANK' + | 'GEMSTONE_FUEL_TANK' + | 'PERFECTLY_CUT_FUEL_TANK' + | 'BEACON_2' + | 'BEACON_3' + | 'BEACON_4' + | 'BEACON_5' + | 'FORGE_TRAVEL_SCROLL' + | 'BASE_CAMP_TRAVEL_SCROLL' + | 'POWER_CRYSTAL' + | 'SECRET_RAILROAD_PASS' + | 'TUNGSTEN_KEY' + | 'UMBER_KEY' + | 'SKELETON_KEY' + | 'PORTABLE_CAMPFIRE'; + +export type MiningForgeItemName = + | 'Refined Diamond' + | 'Refined Mithril' + | 'Refined Titanium' + | 'Refined Tungsten' + | 'Refined Umber' + | 'Mithril Necklace' + | 'Mithril Cloak' + | 'Mithril Belt' + | 'Mithril Gauntlet' + | 'Titanium Necklace' + | 'Titanium Cloak' + | 'Titanium Belt' + | 'Titanium Gauntlet' + | 'Titanium Talisman' + | 'Titanium Ring' + | 'Titanium Artifact' + | 'Titanium Relic' + | 'Divan Powder Coating' + | 'Helmet Of Divan' + | 'Chestplate Of Divan' + | 'Leggings Of Divan' + | 'Boots Of Divan' + | 'Amber Necklace' + | 'Sapphire Cloak' + | 'Jade Belt' + | 'Amethyst Gauntlet' + | 'Gemstone Chamber' + | 'Dwarven Handwarmers' + | 'Dwarven Metal Talisman' + | 'Pendant of Divan' + | 'Relic of Power' + | 'Perfect Amber Gemstone' + | 'Perfect Amethyst Gemstone' + | 'Perfect Jade Gemstone' + | 'Perfect Jasper Gemstone' + | 'Perfect Opal Gemstone' + | 'Perfect Ruby Gemstone' + | 'Perfect Sapphire Gemstone' + | 'Perfect Topaz Gemstone' + | 'Perfect Aquamarine Gem' + | 'Perfect Citrine Gem' + | 'Perfect Onyx Gem' + | 'Perfect Peridot Gem' + | 'Bejeweled Handle' + | 'Drill Motor' + | 'Fuel Canister' + | 'Gemstone Mixture' + | 'Glacite Amalgamation' + | 'Golden Plate' + | 'Mithril Plate' + | 'Tungsten Plate' + | 'Umber Plate' + | 'Perfect Plate' + | 'Diamonite' + | 'Pocket Iceberg' + | 'Petrified Starfall' + | 'Pure Mithril' + | 'Dwarven Geode' + | 'Titanium Tesseract' + | 'Gleaming Crystal' + | 'Scorched Topaz' + | 'Amber Material' + | 'Frigid Husk' + | 'Bejeweled Collar' + | '[Lvl 1] Mole' + | '[Lvl 1] Ammonite' + | '[Lvl 1] Penguin' + | '[Lvl 1] T-Rex' + | '[Lvl 1] Spinosaurus' + | '[Lvl 1] Goblin' + | '[Lvl 1] Ankylosaurus' + | '[Lvl 1] Mammoth' + | 'Mithril Drill SX-R226' + | 'Mithril Drill SX-R326' + | 'Ruby Drill TX-15' + | 'Gemstone Drill LT-522' + | 'Topaz Drill KGR-12' + | 'Jasper Drill X' + | 'Polished Topaz Rod' + | 'Titanium Drill DR-X355' + | 'Titanium Drill DR-X455' + | 'Titanium Drill DR-X555' + | 'Titanium Drill DR-X655' + | 'Chisel' + | 'Reinforced Chisel' + | 'Glacite-Plated Chisel' + | 'Perfect Chisel' + | "Divan's Drill" + | 'Starfall Seasoning' + | 'Goblin Omelette' + | 'Blue Cheese Goblin Omelette' + | 'Pesto Goblin Omelette' + | 'Spicy Goblin Omelette' + | 'Sunny Side Goblin Omelette' + | 'Tungsten Regulator' + | 'Mithril-Plated Drill Engine' + | 'Titanium-Plated Drill Engine' + | 'Ruby-polished Drill Engine' + | 'Sapphire-polished Drill Engine' + | 'Amber-polished Drill Engine' + | 'Mithril-Infused Fuel Tank' + | 'Titanium-Infused Fuel Tank' + | 'Gemstone Fuel Tank' + | 'Perfectly-Cut Fuel Tank' + | 'Beacon II' + | 'Beacon III' + | 'Beacon IV' + | 'Beacon V' + | 'Travel Scroll to the Dwarven Forge' + | 'Travel Scroll to the Dwarven Base Camp' + | 'Power Crystal' + | 'Secret Railroad Pass' + | 'Tungsten Key' + | 'Umber Key' + | 'Skeleton Key' + | 'Portable Campfire'; + +export type MiningForgeItemsData = { + [key in MiningForgeItemId | 'UNKNOWN']: { + name: MiningForgeItemName | 'UNKNOWN'; + duration: number; + }; +}; + +export type SkyBlockArea = + | 'dynamic' + | 'hub' + | 'mining_1' + | 'mining_2' + | 'mining_3' + | 'combat_1' + | 'crimson_isle' + | 'combat_3' + | 'farming_1' + | 'foraging_1' + | 'winter' + | 'dungeon' + | 'dungeon_hub' + | 'crystal_hollows' + | 'garden' + | 'rift' + | 'kuudra' + | 'mineshaft' + | 'fishing_1'; + +export type SkyBlockMemberPower = + | 'Fortuitous ' + | 'Pretty' + | 'Protected' + | 'Simple' + | 'Warrior' + | 'Commando' + | 'Disciplined' + | 'Inspired' + | 'Ominous ' + | 'Prepared' + | 'Silky' + | 'Sweet' + | 'Adept' + | 'Bloody' + | 'Forceful' + | 'Itchy' + | 'Mythical' + | 'Shaded' + | 'Sighted' + | 'Bizarre' + | 'Demonic' + | 'Hurtful' + | 'Pleasant' + | 'Sanguisuge' + | 'Frozen' + | 'Healthy' + | 'Slender' + | 'Strong' + | 'Bubba' + | 'Crumbly' + | 'Scorching'; + +export type JacobCrops = + | 'INK_SACK:3' + | 'POTATO_ITEM' + | 'CARROT_ITEM' + | 'CACTUS' + | 'SUGAR_CANE' + | 'MUSHROOM_COLLECTION' + | 'PUMPKIN' + | 'NETHER_STALKk' + | 'WHEAT' + | 'MELON'; + +export interface CustomPetLevelingDataGoldenDragon { + type: number; + petLevels: number[]; + maxLevel: number; +} + +export interface CustomPetLevelingDataBingo { + rarityOffset: { [key in Rarity | 'UNKNOWN']: number }; +} +export interface CustomPetLevelingDataReindeer { + xpMultiplier: number; +} + +export interface CustomPetLevelingData { + GOLDEN_DRAGON: CustomPetLevelingDataGoldenDragon; + BINGO: CustomPetLevelingDataBingo; + REINDEER: CustomPetLevelingDataReindeer; +} + +export type SkyBlockPetId = + | 'FRACTURED_MONTEZUMA_SOUL' + | 'AMMONITE' + | 'ANKYLOSAURUS' + | 'BAL' + | 'ARMADILLO' + | 'BABY_YETI' + | 'BAT' + | 'BEE' + | 'BINGO' + | 'BLACK_CAT' + | 'BLAZE' + | 'BLUE_WHALE' + | 'CHICKEN' + | 'DOLPHIN' + | 'DROPLET_WISP' + | 'EERIE' + | 'ELEPHANT' + | 'ENDERMAN' + | 'ENDERMITE' + | 'ENDER_DRAGON' + | 'FLYING_FISH' + | 'FROST_WISP' + | 'GHOUL' + | 'GIRAFFE' + | 'GLACITE_GOLEM' + | 'GOBLIN' + | 'GOLEM' + | 'GUARDIAN' + | 'GOLDEN_DRAGON' + | 'GLACIAL_WISP' + | 'HEDGEHOG' + | 'HERMIT_CRAB' + | 'HORSE' + | 'HOUND' + | 'JELLYFISH' + | 'JERRY' + | 'KUUDRA' + | 'LION' + | 'MAGMA_CUBE' + | 'MAMMOTH' + | 'MEGALODON' + | 'MOLE' + | 'MONKEY' + | 'MOOSHROOM_COW' + | 'OCELOT' + | 'OWL' + | 'PARROT' + | 'PENGUIN' + | 'PHOENIX' + | 'PIG' + | 'PIGMAN' + | 'RABBIT' + | 'RIFT_FERRET' + | 'ROCK' + | 'REINDEER' + | 'SHEEP' + | 'SILVERFISH' + | 'SKELETON' + | 'SKELETON_HORSE' + | 'SNOWMAN' + | 'SLUG' + | 'SPIDER' + | 'SPINOSAURUS' + | 'SPIRIT' + | 'SQUID' + | 'SCATHA' + | 'SNAIL' + | 'SUBZERO_WISP' + | 'TYRANNOSAURUS' + | 'TARANTULA' + | 'TIGER' + | 'TURTLE' + | 'WITHER_SKELETON' + | 'WOLF' + | 'ZOMBIE' + | 'GRIFFIN' + | 'MITHRIL_GOLEM' + | 'GRANDMA_WOLF' + | 'RAT'; + +export interface LevelData { + xp: number; + level: number; + xpForNext: number | null; + progress: number; + maxed: boolean; + maxLevel: number; +} + +export interface PetLevelData extends LevelData { + xpMaxLevel: number; + currentXp: number; +} + +export interface SkillLevelData extends LevelData { + currentXp: number; +} + +export type BarnSkin = + | 'default_1' + | 'default_2' + | 'default_3' + | 'default_4' + | 'cabin' + | 'mansion_heights' + | 'cube' + | 'cozy_cottage' + | 'tavern' + | 'windmill' + | 'melon' + | 'lucky' + | 'trading_post' + | 'autumn_hut' + | 'bamboo' + | 'hive' + | 'castle' + | 'frog' + | 'jerry' + | 'pinwheel_house' + | 'mushroom' + | 'end' + | 'town_hall' + | 'winter_homestead' + | 'enchanted_nook' + | 'chocolate_factory' + | 'sand_castle' + | 'pesthunters_lair' + | 'winter_barn' + | 'beach_ball' + | 'main_street'; + +export type BarnPlot = + | 'beginner_1' + | 'beginner_2' + | 'beginner_3' + | 'beginner_4' + | 'intermediate_1' + | 'intermediate_2' + | 'intermediate_3' + | 'intermediate_4' + | 'advanced_1' + | 'advanced_2' + | 'advanced_3' + | 'advanced_4' + | 'advanced_5' + | 'advanced_6' + | 'advanced_7' + | 'advanced_8' + | 'advanced_9' + | 'advanced_10' + | 'advanced_11' + | 'advanced_12' + | 'expert_1' + | 'expert_2' + | 'expert_3' + | 'expert_4'; + +export type RiftVillagePlazaCowboyRabbit = + | 'Aaron' + | 'Abigail' + | 'Able' + | 'Ace' + | 'Achilles' + | 'Acker' + | 'Aladdin' + | 'Alexa' + | 'Alexander' + | 'Alfie' + | 'Alice' + | 'Aloysius' + | 'Alpaca' + | 'Alpine' + | 'Amazon' + | 'Angel' + | 'Angus' + | 'Annabelle' + | 'Apollo' + | 'Appollo' + | 'April' + | 'Archie' + | 'Arnie' + | 'Ashes' + | 'Asterix' + | 'Atlas' + | 'Audi' + | 'Augustus' + | 'Baby' + | 'Badger' + | 'Bagel' + | 'Baldwin' + | 'Baloo' + | 'Bambam' + | 'Bandit' + | 'Barbie' + | 'Barcode' + | 'Barney' + | 'Basket' + | 'Baxter' + | 'Beatrice' + | 'Benji' + | 'Bertha' + | 'Bibsy' + | 'Bilbo' + | 'Billy' + | 'Bindi' + | 'Binky' + | 'Bishop' + | 'Blackberry' + | 'Blackjack' + | 'Blake' + | 'Blossom' + | 'Blueberry' + | 'Bob' + | 'Bramble' + | 'Breeze' + | 'Brian' + | 'Brie' + | 'Bronson' + | 'Brooks' + | 'Bruce' + | 'Bruno' + | 'Brutus' + | 'Bubbles' + | 'Bubles' + | 'Buckwheat' + | 'Bud' + | 'Buffalo' + | 'Bugatti' + | 'Bugs' + | 'Bugster' + | 'Bugsy' + | 'Bumper' + | 'Bun Bun' + | 'Buster' + | 'Butters' + | 'Cadet' + | 'Cajun' + | 'Callie' + | 'Calypso' + | 'Candi' + | 'Caramel' + | 'Carter' + | 'Casanova' + | 'Casper' + | 'Cassidy' + | 'Charmin' + | 'Chase' + | 'Chester' + | 'Chevy' + | 'Chewy' + | 'Chilli' + | 'Chip' + | 'Chomper' + | 'Chompsky' + | 'Chubby' + | 'Cinnamon' + | 'Claude' + | 'Cloudy' + | 'Collin' + | 'Comet' + | 'Cookie' + | 'Cooper' + | 'Copper' + | 'Cotton' + | 'Cotton Puff' + | 'Cottonball' + | 'Cottontail' + | 'Cricket' + | 'Crystal' + | 'Cuddles' + | 'Cupcake' + | 'Dallas' + | 'Dalton' + | 'Dandelion' + | 'Dante' + | 'Darla' + | 'Dash' + | 'Delboy' + | 'Delilah' + | 'Demi' + | 'Destiny' + | 'Digger' + | 'Domino' + | 'Draco' + | 'Duchess' + | 'Dusty' + | 'Dutchess' + | 'Easter' + | 'Eastwood' + | 'Echo' + | 'Einstein' + | 'Ella' + | 'Ellie' + | 'Elvis' + | 'Emerson' + | 'Fergie' + | 'Fievel' + | 'Figaro' + | 'Fitch' + | 'Flip Flop' + | 'Fluffy' + | 'Forrest' + | 'Francine' + | 'Frank' + | 'Frankie' + | 'Frodo' + | 'Fudge' + | 'Fuzzy' + | 'Gadget' + | 'Galaxy' + | 'Gatsby' + | 'Gee-Gee' + | 'General' + | 'George' + | 'Ginger' + | 'Ginny' + | 'Gizmo' + | 'Gloria' + | 'Goofy' + | 'Gouda' + | 'Gracie' + | 'Gremlin' + | 'Guinness' + | 'Gunther' + | 'Hadley' + | 'Harley' + | 'Harmony' + | 'Hefner' + | 'Heidie' + | 'Herbie' + | 'Hershey' + | 'Hondo' + | 'Honey' + | 'Hop-a-long' + | 'Hope' + | 'Hopper' + | 'Houdini' + | 'Huck' + | 'Hugo' + | 'Humphrey' + | 'Hunter' + | 'Hyde' + | 'Iggy' + | 'Indie' + | 'Irena' + | 'Jake' + | 'James' + | 'Jammer' + | 'Jasmine' + | 'Jasper' + | 'Jazmin' + | 'Jazz' + | 'Jedi' + | 'Jeffery' + | 'Jelly Bean' + | 'Joey' + | 'Jonah' + | 'Josephine' + | 'Jynx' + | 'Kiera' + | 'King' + | 'Kobi' + | 'Kodo' + | 'Lenny' + | 'Leopold' + | 'Lilly' + | 'Lily' + | 'Linus' + | 'Lone Ranger' + | 'Lotte' + | 'Louie' + | 'Lulu' + | 'Magic' + | 'Mandy' + | 'Marlow' + | 'Maui' + | 'Max' + | 'Maybelline' + | 'Merlin' + | 'Mickey' + | 'Midnight' + | 'Miles' + | 'Milly' + | 'Milo' + | 'Mochi' + | 'Molly' + | 'Mona' + | 'Monalisa' + | 'Moody' + | 'Mookie' + | 'Mopsy' + | 'Morgan' + | 'Morris' + | 'Murphy' + | 'Mystic' + | 'Napoleon' + | 'Natalie' + | 'Ned' + | 'Neptune' + | 'Nibbles' + | 'Niko' + | 'Niza' + | 'Nova' + | 'Nutmeg' + | 'Oakley' + | 'Obelix' + | 'Oletta' + | 'Oliver' + | 'Olivette' + | 'Olivier' + | 'Ollie' + | 'Olympe' + | 'Onyx' + | 'Oreo' + | 'Orlando' + | 'Otto' + | 'Ozwald' + | 'Paddington' + | 'Paddy' + | 'Pancake' + | 'Patch' + | 'Patches' + | 'Peanut' + | 'Pebbles' + | 'Penelope' + | 'Penny' + | 'Peony' + | 'Pepper' + | 'Pepsi' + | 'Petunia' + | 'Phantom' + | 'Pickles' + | 'Pillsbury' + | 'Pinky' + | 'Polka Dot' + | 'Popcorn' + | 'Poppy' + | 'Porsche' + | 'Porter' + | 'Pretzel' + | 'Pride' + | 'Prince' + | 'Pumpkin' + | 'Punch' + | 'Quentin' + | 'Quincy' + | 'Rambo' + | 'Raven' + | 'Razzie' + | 'Reginald' + | 'Remi' + | 'Ressie' + | 'Ricky' + | 'Riley' + | 'Ringo' + | 'River' + | 'Rolf' + | 'Rosco' + | 'Ross' + | 'Rowdy' + | 'Ruben' + | 'Rupert' + | 'Rusty' + | 'Ryder' + | 'Sage' + | 'Sargent' + | 'Sassy' + | 'Scooter' + | 'Scotch' + | 'Scout' + | 'Scuba' + | 'Seinfield' + | 'Selene' + | 'Shadow' + | 'Simba' + | 'Skippe' + | 'Smokey' + | 'Sniffles' + | 'Snoopy' + | 'Snoppy' + | 'Snowball' + | 'Snuffy' + | 'Solomon' + | 'Sophie' + | 'Sorbet' + | 'Spencer' + | 'Spirit' + | 'Spooky' + | 'Spot' + | 'Sprinkles' + | 'Stanley' + | 'Stewart' + | 'Storm' + | 'Stormy' + | 'Stuart' + | 'Sunny' + | 'Suri' + | 'Sweetpea' + | 'Sylvester' + | 'Tagalong' + | 'Teddy' + | 'Thalai' + | 'Theo' + | 'Theodore' + | 'Thor' + | 'Thumper' + | 'Ticky' + | 'Tobi' + | 'Toby' + | 'Tornado' + | 'Tricky' + | 'Trix' + | 'Trixie' + | 'Turbo' + | 'Una' + | 'Uncle Buck' + | 'Vlad' + | 'Wadsworth' + | 'Waffle' + | 'Wesson' + | 'Widget' + | 'William' + | 'Willow' + | 'Winston' + | 'Zack' + | 'Zero' + | 'Zorro'; + +export type DungeonFloor = + | 'CATACOMBS_FLOOR_ONE' + | 'CATACOMBS_FLOOR_TWO' + | 'CATACOMBS_FLOOR_THREE' + | 'CATACOMBS_FLOOR_FOUR' + | 'CATACOMBS_FLOOR_FIVE' + | 'CATACOMBS_FLOOR_SIX' + | 'CATACOMBS_FLOOR_SEVEN' + | 'MASTER_CATACOMBS_FLOOR_ONE' + | 'MASTER_CATACOMBS_FLOOR_TWO' + | 'MASTER_CATACOMBS_FLOOR_THREE' + | 'MASTER_CATACOMBS_FLOOR_FOUR' + | 'MASTER_CATACOMBS_FLOOR_FIVE' + | 'MASTER_CATACOMBS_FLOOR_SIX' + | 'MASTER_CATACOMBS_FLOOR_SEVEN'; + +export type RiftGalleryTrophy = + | 'wyldly_supreme' + | 'chicken_n_egg' + | 'mirrored' + | 'citizen' + | 'lazy_living' + | 'slime' + | 'vampiric' + | 'mountain'; + +export type MirrorverseRoom = + | 'four levers' + | 'lava maze' + | 'crafting room' + | 'upside-down parkour' + | 'red-green puzzle' + | 'dance room' + | 'tubulator' + | 'reward room'; + +export type MirrorverseChestItem = + | 'TEST_BUCKET_PLEASE_IGNORE' + | 'BIG_BRAIN_TALISMAN' + | 'TINY_DANCER' + | 'MINIATURIZED_TUBULATOR'; + +export type SacrificedPets = + | 'RIFT_FERRET' + | 'SLUG' + | 'SPIRIT' + | 'GIRAFFE' + | 'JELLYFISH' + | 'BAL' + | 'BABY_YETI' + | 'BLACK_CAT' + | 'FROST_WISP' + | 'ENDERMAN'; + +export type CrimsonIsleBoss = 'BLADESOUL' | 'BARBARIAN_DUKE_X' | 'ASHFANG' | 'MAGE_OUTLAW' | 'MAGMA_BOSS'; +export type SkyBlockPotionEffectName = + | 'true_defense' + | 'strength' + | 'regeneration' + | 'enchanting_xp_boost' + | 'stun' + | 'experience' + | 'rabbit' + | 'magic_find' + | 'night_vision' + | 'water_breathing' + | 'combat_xp_boost' + | 'fire_resistance' + | 'jump_boost' + | 'resistance' + | 'fishing_xp_boost' + | 'agility' + | 'archery' + | 'critical' + | 'speed' + | 'farming_xp_boost' + | 'adrenaline' + | 'spelunker' + | 'dodge' + | 'spirit' + | 'pet_luck' + | 'mining_xp_boost' + | 'haste' + | 'burning' + | 'mana' + | 'foraging_xp_boost' + | 'alchemy_xp_boost' + | 'jerry_candy' + | 'burning' + | 'spirit' + | 'jump_boost' + | 'speed' + | 'invisibility'; + +export type WitherCageKilledEye = + | 'fisherman_hut' + | 'dreadfarm' + | 'plaza' + | 'wizard_tower' + | 'colosseum' + | 'castle' + | 'mountaintop'; + +export type SkyBlockMinionName = + | 'ACACIA' + | 'BIRCH' + | 'BLAZE' + | 'CACTUS' + | 'CARROT' + | 'CAVESPIDER' + | 'CHICKEN' + | 'CLAY' + | 'COAL' + | 'COBBLESTONE' + | 'COCOA' + | 'COW' + | 'CREEPER' + | 'DARK_OAK' + | 'DIAMOND' + | 'EMERALD' + | 'ENDERMAN' + | 'ENDER_STONE' + | 'FISHING' + | 'FLOWER' + | 'GHAST' + | 'GLOWSTONE' + | 'GOLD' + | 'GRAVEL' + | 'HARD_STONE' + | 'ICE' + | 'INFERNO' + | 'IRON' + | 'JUNGLE' + | 'LAPIS' + | 'MAGMA_CUBE' + | 'MELON' + | 'MITHRIL' + | 'MUSHROOM' + | 'MYCELIUM' + | 'NETHER_WARTS' + | 'OAK' + | 'OBSIDIAN' + | 'PIG' + | 'POTATO' + | 'PUMPKIN' + | 'QUARTZ' + | 'RABBIT' + | 'REDSTONE' + | 'RED_SAND' + | 'REVENANT' + | 'SAND' + | 'SHEEP' + | 'SKELETON' + | 'SLIME' + | 'SNOW' + | 'SPIDER' + | 'SPRUCE' + | 'SUGAR_CANE' + | 'TARANTULA' + | 'VAMPIRE' + | 'VOIDLING' + | 'WHEAT' + | 'ZOMBIE'; + +export type SkyBlockMinion = + | 'ACACIA_1' + | 'ACACIA_2' + | 'ACACIA_3' + | 'ACACIA_4' + | 'ACACIA_5' + | 'ACACIA_6' + | 'ACACIA_7' + | 'ACACIA_8' + | 'ACACIA_9' + | 'ACACIA_10' + | 'ACACIA_11' + | 'ACACIA_12' + | 'BIRCH_1' + | 'BIRCH_2' + | 'BIRCH_3' + | 'BIRCH_4' + | 'BIRCH_5' + | 'BIRCH_6' + | 'BIRCH_7' + | 'BIRCH_8' + | 'BIRCH_9' + | 'BIRCH_10' + | 'BIRCH_11' + | 'BIRCH_12' + | 'BLAZE_1' + | 'BLAZE_2' + | 'BLAZE_3' + | 'BLAZE_4' + | 'BLAZE_5' + | 'BLAZE_6' + | 'BLAZE_7' + | 'BLAZE_8' + | 'BLAZE_9' + | 'BLAZE_10' + | 'BLAZE_11' + | 'BLAZE_12' + | 'CACTUS_1' + | 'CACTUS_2' + | 'CACTUS_3' + | 'CACTUS_4' + | 'CACTUS_5' + | 'CACTUS_6' + | 'CACTUS_7' + | 'CACTUS_8' + | 'CACTUS_9' + | 'CACTUS_10' + | 'CACTUS_11' + | 'CACTUS_12' + | 'CARROT_1' + | 'CARROT_2' + | 'CARROT_3' + | 'CARROT_4' + | 'CARROT_5' + | 'CARROT_6' + | 'CARROT_7' + | 'CARROT_8' + | 'CARROT_9' + | 'CARROT_10' + | 'CARROT_11' + | 'CARROT_12' + | 'CAVESPIDER_1' + | 'CAVESPIDER_2' + | 'CAVESPIDER_3' + | 'CAVESPIDER_4' + | 'CAVESPIDER_5' + | 'CAVESPIDER_6' + | 'CAVESPIDER_7' + | 'CAVESPIDER_8' + | 'CAVESPIDER_9' + | 'CAVESPIDER_10' + | 'CAVESPIDER_11' + | 'CAVESPIDER_12' + | 'CHICKEN_1' + | 'CHICKEN_2' + | 'CHICKEN_3' + | 'CHICKEN_4' + | 'CHICKEN_5' + | 'CHICKEN_6' + | 'CHICKEN_7' + | 'CHICKEN_8' + | 'CHICKEN_9' + | 'CHICKEN_10' + | 'CHICKEN_11' + | 'CHICKEN_12' + | 'CLAY_1' + | 'CLAY_2' + | 'CLAY_3' + | 'CLAY_4' + | 'CLAY_5' + | 'CLAY_6' + | 'CLAY_7' + | 'CLAY_8' + | 'CLAY_9' + | 'CLAY_10' + | 'CLAY_11' + | 'CLAY_12' + | 'COAL_1' + | 'COAL_2' + | 'COAL_3' + | 'COAL_4' + | 'COAL_5' + | 'COAL_6' + | 'COAL_7' + | 'COAL_8' + | 'COAL_9' + | 'COAL_10' + | 'COAL_11' + | 'COAL_12' + | 'COBBLESTONE_1' + | 'COBBLESTONE_2' + | 'COBBLESTONE_3' + | 'COBBLESTONE_4' + | 'COBBLESTONE_5' + | 'COBBLESTONE_6' + | 'COBBLESTONE_7' + | 'COBBLESTONE_8' + | 'COBBLESTONE_9' + | 'COBBLESTONE_10' + | 'COBBLESTONE_11' + | 'COBBLESTONE_12' + | 'COCOA_1' + | 'COCOA_2' + | 'COCOA_3' + | 'COCOA_4' + | 'COCOA_5' + | 'COCOA_6' + | 'COCOA_7' + | 'COCOA_8' + | 'COCOA_9' + | 'COCOA_10' + | 'COCOA_11' + | 'COCOA_12' + | 'COW_1' + | 'COW_2' + | 'COW_3' + | 'COW_4' + | 'COW_5' + | 'COW_6' + | 'COW_7' + | 'COW_8' + | 'COW_9' + | 'COW_10' + | 'COW_11' + | 'COW_12' + | 'CREEPER_1' + | 'CREEPER_2' + | 'CREEPER_3' + | 'CREEPER_4' + | 'CREEPER_5' + | 'CREEPER_6' + | 'CREEPER_7' + | 'CREEPER_8' + | 'CREEPER_9' + | 'CREEPER_10' + | 'CREEPER_11' + | 'CREEPER_12' + | 'DARK_OAK_1' + | 'DARK_OAK_2' + | 'DARK_OAK_3' + | 'DARK_OAK_4' + | 'DARK_OAK_5' + | 'DARK_OAK_6' + | 'DARK_OAK_7' + | 'DARK_OAK_8' + | 'DARK_OAK_9' + | 'DARK_OAK_10' + | 'DARK_OAK_11' + | 'DARK_OAK_12' + | 'DIAMOND_1' + | 'DIAMOND_2' + | 'DIAMOND_3' + | 'DIAMOND_4' + | 'DIAMOND_5' + | 'DIAMOND_6' + | 'DIAMOND_7' + | 'DIAMOND_8' + | 'DIAMOND_9' + | 'DIAMOND_10' + | 'DIAMOND_11' + | 'DIAMOND_12' + | 'EMERALD_1' + | 'EMERALD_2' + | 'EMERALD_3' + | 'EMERALD_4' + | 'EMERALD_5' + | 'EMERALD_6' + | 'EMERALD_7' + | 'EMERALD_8' + | 'EMERALD_9' + | 'EMERALD_10' + | 'EMERALD_11' + | 'EMERALD_12' + | 'ENDERMAN_1' + | 'ENDERMAN_2' + | 'ENDERMAN_3' + | 'ENDERMAN_4' + | 'ENDERMAN_5' + | 'ENDERMAN_6' + | 'ENDERMAN_7' + | 'ENDERMAN_8' + | 'ENDERMAN_9' + | 'ENDERMAN_10' + | 'ENDERMAN_11' + | 'ENDERMAN_12' + | 'ENDER_STONE_1' + | 'ENDER_STONE_2' + | 'ENDER_STONE_3' + | 'ENDER_STONE_4' + | 'ENDER_STONE_5' + | 'ENDER_STONE_6' + | 'ENDER_STONE_7' + | 'ENDER_STONE_8' + | 'ENDER_STONE_9' + | 'ENDER_STONE_10' + | 'ENDER_STONE_11' + | 'ENDER_STONE_12' + | 'FISHING_1' + | 'FISHING_2' + | 'FISHING_3' + | 'FISHING_4' + | 'FISHING_5' + | 'FISHING_6' + | 'FISHING_7' + | 'FISHING_8' + | 'FISHING_9' + | 'FISHING_10' + | 'FISHING_11' + | 'FISHING_12' + | 'FLOWER_1' + | 'FLOWER_2' + | 'FLOWER_3' + | 'FLOWER_4' + | 'FLOWER_5' + | 'FLOWER_6' + | 'FLOWER_7' + | 'FLOWER_8' + | 'FLOWER_9' + | 'FLOWER_10' + | 'FLOWER_11' + | 'FLOWER_12' + | 'GHAST_1' + | 'GHAST_2' + | 'GHAST_3' + | 'GHAST_4' + | 'GHAST_5' + | 'GHAST_6' + | 'GHAST_7' + | 'GHAST_8' + | 'GHAST_9' + | 'GHAST_10' + | 'GHAST_11' + | 'GHAST_12' + | 'GLOWSTONE_1' + | 'GLOWSTONE_2' + | 'GLOWSTONE_3' + | 'GLOWSTONE_4' + | 'GLOWSTONE_5' + | 'GLOWSTONE_6' + | 'GLOWSTONE_7' + | 'GLOWSTONE_8' + | 'GLOWSTONE_9' + | 'GLOWSTONE_10' + | 'GLOWSTONE_11' + | 'GLOWSTONE_12' + | 'GOLD_1' + | 'GOLD_2' + | 'GOLD_3' + | 'GOLD_4' + | 'GOLD_5' + | 'GOLD_6' + | 'GOLD_7' + | 'GOLD_8' + | 'GOLD_9' + | 'GOLD_10' + | 'GOLD_11' + | 'GOLD_12' + | 'GRAVEL_1' + | 'GRAVEL_2' + | 'GRAVEL_3' + | 'GRAVEL_4' + | 'GRAVEL_5' + | 'GRAVEL_6' + | 'GRAVEL_7' + | 'GRAVEL_8' + | 'GRAVEL_9' + | 'GRAVEL_10' + | 'GRAVEL_11' + | 'GRAVEL_12' + | 'HARD_STONE_1' + | 'HARD_STONE_2' + | 'HARD_STONE_3' + | 'HARD_STONE_4' + | 'HARD_STONE_5' + | 'HARD_STONE_6' + | 'HARD_STONE_7' + | 'HARD_STONE_8' + | 'HARD_STONE_9' + | 'HARD_STONE_10' + | 'HARD_STONE_11' + | 'HARD_STONE_12' + | 'ICE_1' + | 'ICE_2' + | 'ICE_3' + | 'ICE_4' + | 'ICE_5' + | 'ICE_6' + | 'ICE_7' + | 'ICE_8' + | 'ICE_9' + | 'ICE_10' + | 'ICE_11' + | 'ICE_12' + | 'INFERNO_1' + | 'INFERNO_2' + | 'INFERNO_3' + | 'INFERNO_4' + | 'INFERNO_5' + | 'INFERNO_6' + | 'INFERNO_7' + | 'INFERNO_8' + | 'INFERNO_9' + | 'INFERNO_10' + | 'INFERNO_11' + | 'INFERNO_12' + | 'IRON_1' + | 'IRON_2' + | 'IRON_3' + | 'IRON_4' + | 'IRON_5' + | 'IRON_6' + | 'IRON_7' + | 'IRON_8' + | 'IRON_9' + | 'IRON_10' + | 'IRON_11' + | 'IRON_12' + | 'JUNGLE_1' + | 'JUNGLE_2' + | 'JUNGLE_3' + | 'JUNGLE_4' + | 'JUNGLE_5' + | 'JUNGLE_6' + | 'JUNGLE_7' + | 'JUNGLE_8' + | 'JUNGLE_9' + | 'JUNGLE_10' + | 'JUNGLE_11' + | 'JUNGLE_12' + | 'LAPIS_1' + | 'LAPIS_2' + | 'LAPIS_3' + | 'LAPIS_4' + | 'LAPIS_5' + | 'LAPIS_6' + | 'LAPIS_7' + | 'LAPIS_8' + | 'LAPIS_9' + | 'LAPIS_10' + | 'LAPIS_11' + | 'LAPIS_12' + | 'MAGMA_CUBE_1' + | 'MAGMA_CUBE_2' + | 'MAGMA_CUBE_3' + | 'MAGMA_CUBE_4' + | 'MAGMA_CUBE_5' + | 'MAGMA_CUBE_6' + | 'MAGMA_CUBE_7' + | 'MAGMA_CUBE_8' + | 'MAGMA_CUBE_9' + | 'MAGMA_CUBE_10' + | 'MAGMA_CUBE_11' + | 'MAGMA_CUBE_12' + | 'MELON_1' + | 'MELON_2' + | 'MELON_3' + | 'MELON_4' + | 'MELON_5' + | 'MELON_6' + | 'MELON_7' + | 'MELON_8' + | 'MELON_9' + | 'MELON_10' + | 'MELON_11' + | 'MELON_12' + | 'MITHRIL_1' + | 'MITHRIL_2' + | 'MITHRIL_3' + | 'MITHRIL_4' + | 'MITHRIL_5' + | 'MITHRIL_6' + | 'MITHRIL_7' + | 'MITHRIL_8' + | 'MITHRIL_9' + | 'MITHRIL_10' + | 'MITHRIL_11' + | 'MITHRIL_12' + | 'MUSHROOM_1' + | 'MUSHROOM_2' + | 'MUSHROOM_3' + | 'MUSHROOM_4' + | 'MUSHROOM_5' + | 'MUSHROOM_6' + | 'MUSHROOM_7' + | 'MUSHROOM_8' + | 'MUSHROOM_9' + | 'MUSHROOM_10' + | 'MUSHROOM_11' + | 'MUSHROOM_12' + | 'MYCELIUM_1' + | 'MYCELIUM_2' + | 'MYCELIUM_3' + | 'MYCELIUM_4' + | 'MYCELIUM_5' + | 'MYCELIUM_6' + | 'MYCELIUM_7' + | 'MYCELIUM_8' + | 'MYCELIUM_9' + | 'MYCELIUM_10' + | 'MYCELIUM_11' + | 'MYCELIUM_12' + | 'NETHER_WARTS_1' + | 'NETHER_WARTS_2' + | 'NETHER_WARTS_3' + | 'NETHER_WARTS_4' + | 'NETHER_WARTS_5' + | 'NETHER_WARTS_6' + | 'NETHER_WARTS_7' + | 'NETHER_WARTS_8' + | 'NETHER_WARTS_9' + | 'NETHER_WARTS_10' + | 'NETHER_WARTS_11' + | 'NETHER_WARTS_12' + | 'OAK_1' + | 'OAK_2' + | 'OAK_3' + | 'OAK_4' + | 'OAK_5' + | 'OAK_6' + | 'OAK_7' + | 'OAK_8' + | 'OAK_9' + | 'OAK_10' + | 'OAK_11' + | 'OAK_12' + | 'OBSIDIAN_1' + | 'OBSIDIAN_2' + | 'OBSIDIAN_3' + | 'OBSIDIAN_4' + | 'OBSIDIAN_5' + | 'OBSIDIAN_6' + | 'OBSIDIAN_7' + | 'OBSIDIAN_8' + | 'OBSIDIAN_9' + | 'OBSIDIAN_10' + | 'OBSIDIAN_11' + | 'OBSIDIAN_12' + | 'PIG_1' + | 'PIG_2' + | 'PIG_3' + | 'PIG_4' + | 'PIG_5' + | 'PIG_6' + | 'PIG_7' + | 'PIG_8' + | 'PIG_9' + | 'PIG_10' + | 'PIG_11' + | 'PIG_12' + | 'POTATO_1' + | 'POTATO_2' + | 'POTATO_3' + | 'POTATO_4' + | 'POTATO_5' + | 'POTATO_6' + | 'POTATO_7' + | 'POTATO_8' + | 'POTATO_9' + | 'POTATO_10' + | 'POTATO_11' + | 'POTATO_12' + | 'PUMPKIN_1' + | 'PUMPKIN_2' + | 'PUMPKIN_3' + | 'PUMPKIN_4' + | 'PUMPKIN_5' + | 'PUMPKIN_6' + | 'PUMPKIN_7' + | 'PUMPKIN_8' + | 'PUMPKIN_9' + | 'PUMPKIN_10' + | 'PUMPKIN_11' + | 'PUMPKIN_12' + | 'QUARTZ_1' + | 'QUARTZ_2' + | 'QUARTZ_3' + | 'QUARTZ_4' + | 'QUARTZ_5' + | 'QUARTZ_6' + | 'QUARTZ_7' + | 'QUARTZ_8' + | 'QUARTZ_9' + | 'QUARTZ_10' + | 'QUARTZ_11' + | 'QUARTZ_12' + | 'RABBIT_1' + | 'RABBIT_2' + | 'RABBIT_3' + | 'RABBIT_4' + | 'RABBIT_5' + | 'RABBIT_6' + | 'RABBIT_7' + | 'RABBIT_8' + | 'RABBIT_9' + | 'RABBIT_10' + | 'RABBIT_11' + | 'RABBIT_12' + | 'REDSTONE_1' + | 'REDSTONE_2' + | 'REDSTONE_3' + | 'REDSTONE_4' + | 'REDSTONE_5' + | 'REDSTONE_6' + | 'REDSTONE_7' + | 'REDSTONE_8' + | 'REDSTONE_9' + | 'REDSTONE_10' + | 'REDSTONE_11' + | 'REDSTONE_12' + | 'RED_SAND_1' + | 'RED_SAND_2' + | 'RED_SAND_3' + | 'RED_SAND_4' + | 'RED_SAND_5' + | 'RED_SAND_6' + | 'RED_SAND_7' + | 'RED_SAND_8' + | 'RED_SAND_9' + | 'RED_SAND_10' + | 'RED_SAND_11' + | 'RED_SAND_12' + | 'REVENANT_1' + | 'REVENANT_2' + | 'REVENANT_3' + | 'REVENANT_4' + | 'REVENANT_5' + | 'REVENANT_6' + | 'REVENANT_7' + | 'REVENANT_8' + | 'REVENANT_9' + | 'REVENANT_10' + | 'REVENANT_11' + | 'REVENANT_12' + | 'SAND_1' + | 'SAND_2' + | 'SAND_3' + | 'SAND_4' + | 'SAND_5' + | 'SAND_6' + | 'SAND_7' + | 'SAND_8' + | 'SAND_9' + | 'SAND_10' + | 'SAND_11' + | 'SAND_12' + | 'SHEEP_1' + | 'SHEEP_2' + | 'SHEEP_3' + | 'SHEEP_4' + | 'SHEEP_5' + | 'SHEEP_6' + | 'SHEEP_7' + | 'SHEEP_8' + | 'SHEEP_9' + | 'SHEEP_10' + | 'SHEEP_11' + | 'SHEEP_12' + | 'SKELETON_1' + | 'SKELETON_2' + | 'SKELETON_3' + | 'SKELETON_4' + | 'SKELETON_5' + | 'SKELETON_6' + | 'SKELETON_7' + | 'SKELETON_8' + | 'SKELETON_9' + | 'SKELETON_10' + | 'SKELETON_11' + | 'SKELETON_12' + | 'SLIME_1' + | 'SLIME_2' + | 'SLIME_3' + | 'SLIME_4' + | 'SLIME_5' + | 'SLIME_6' + | 'SLIME_7' + | 'SLIME_8' + | 'SLIME_9' + | 'SLIME_10' + | 'SLIME_11' + | 'SLIME_12' + | 'SNOW_1' + | 'SNOW_2' + | 'SNOW_3' + | 'SNOW_4' + | 'SNOW_5' + | 'SNOW_6' + | 'SNOW_7' + | 'SNOW_8' + | 'SNOW_9' + | 'SNOW_10' + | 'SNOW_11' + | 'SNOW_12' + | 'SPIDER_1' + | 'SPIDER_2' + | 'SPIDER_3' + | 'SPIDER_4' + | 'SPIDER_5' + | 'SPIDER_6' + | 'SPIDER_7' + | 'SPIDER_8' + | 'SPIDER_9' + | 'SPIDER_10' + | 'SPIDER_11' + | 'SPIDER_12' + | 'SPRUCE_1' + | 'SPRUCE_2' + | 'SPRUCE_3' + | 'SPRUCE_4' + | 'SPRUCE_5' + | 'SPRUCE_6' + | 'SPRUCE_7' + | 'SPRUCE_8' + | 'SPRUCE_9' + | 'SPRUCE_10' + | 'SPRUCE_11' + | 'SPRUCE_12' + | 'SUGAR_CANE_1' + | 'SUGAR_CANE_2' + | 'SUGAR_CANE_3' + | 'SUGAR_CANE_4' + | 'SUGAR_CANE_5' + | 'SUGAR_CANE_6' + | 'SUGAR_CANE_7' + | 'SUGAR_CANE_8' + | 'SUGAR_CANE_9' + | 'SUGAR_CANE_10' + | 'SUGAR_CANE_11' + | 'SUGAR_CANE_12' + | 'TARANTULA_1' + | 'TARANTULA_2' + | 'TARANTULA_3' + | 'TARANTULA_4' + | 'TARANTULA_5' + | 'TARANTULA_6' + | 'TARANTULA_7' + | 'TARANTULA_8' + | 'TARANTULA_9' + | 'TARANTULA_10' + | 'TARANTULA_11' + | 'TARANTULA_12' + | 'VAMPIRE_1' + | 'VAMPIRE_2' + | 'VAMPIRE_3' + | 'VAMPIRE_4' + | 'VAMPIRE_5' + | 'VAMPIRE_6' + | 'VAMPIRE_7' + | 'VAMPIRE_8' + | 'VAMPIRE_9' + | 'VAMPIRE_10' + | 'VAMPIRE_11' + | 'VAMPIRE_12' + | 'VOIDLING_1' + | 'VOIDLING_2' + | 'VOIDLING_3' + | 'VOIDLING_4' + | 'VOIDLING_5' + | 'VOIDLING_6' + | 'VOIDLING_7' + | 'VOIDLING_8' + | 'VOIDLING_9' + | 'VOIDLING_10' + | 'VOIDLING_11' + | 'VOIDLING_12' + | 'WHEAT_1' + | 'WHEAT_2' + | 'WHEAT_3' + | 'WHEAT_4' + | 'WHEAT_5' + | 'WHEAT_6' + | 'WHEAT_7' + | 'WHEAT_8' + | 'WHEAT_9' + | 'WHEAT_10' + | 'WHEAT_11' + | 'WHEAT_12' + | 'ZOMBIE_1' + | 'ZOMBIE_2' + | 'ZOMBIE_3' + | 'ZOMBIE_4' + | 'ZOMBIE_5' + | 'ZOMBIE_6' + | 'ZOMBIE_7' + | 'ZOMBIE_8' + | 'ZOMBIE_9' + | 'ZOMBIE_10' + | 'ZOMBIE_11' + | 'ZOMBIE_12'; + +export type BazaarProduct = + | 'INK_SACK:3' + | 'CORRUPTED_BAIT' + | 'INK_SACK:4' + | 'TARANTULA_WEB' + | 'ENCHANTMENT_ULTIMATE_NO_PAIN_NO_GAIN_2' + | 'ENCHANTMENT_ULTIMATE_NO_PAIN_NO_GAIN_1' + | 'DUNGEON_TRAP' + | 'DARK_ORB' + | 'ARCHITECT_FIRST_DRAFT' + | 'ENCHANTMENT_PROTECTION_7' + | 'ENCHANTMENT_PROTECTION_6' + | 'ESSENCE_DRAGON' + | 'RITUAL_RESIDUE' + | 'ENCHANTMENT_PROTECTION_1' + | 'GIANT_FRAGMENT_LASER' + | 'ENCHANTMENT_PROTECTION_5' + | 'ENCHANTED_MELON' + | 'ENCHANTMENT_PROTECTION_4' + | 'ENCHANTMENT_PROTECTION_3' + | 'ENCHANTMENT_PROTECTION_2' + | 'ENCHANTMENT_TURBO_COCO_1' + | 'ENCHANTMENT_TURBO_COCO_5' + | 'ENCHANTMENT_TURBO_COCO_4' + | 'ENCHANTMENT_TURBO_COCO_3' + | 'ENCHANTED_BLAZE_ROD' + | 'ENCHANTMENT_TURBO_COCO_2' + | 'FRESHLY_MINTED_COINS' + | 'ENCHANTED_BROWN_MUSHROOM' + | 'GOBLIN_EGG_YELLOW' + | 'PARTY_GIFT' + | 'ENCHANTED_GLISTERING_MELON' + | 'ENCHANTMENT_CORRUPTION_5' + | 'ENCHANTMENT_CORRUPTION_4' + | 'PROTECTOR_FRAGMENT' + | 'ENCHANTMENT_CORRUPTION_3' + | 'ENCHANTMENT_CORRUPTION_2' + | 'MAGMAG' + | 'ENCHANTMENT_CORRUPTION_1' + | 'ENCHANTED_MELON_BLOCK' + | 'ROCK_GEMSTONE' + | 'CONDENSED_FERMENTO' + | 'BEADY_EYES' + | 'DIAMOND' + | 'COBBLESTONE' + | 'ENCHANTED_PUFFERFISH' + | 'PERFECT_RUBY_GEM' + | 'MINION_EXPANDER' + | 'HORN_OF_TAURUS' + | 'END_STONE_SHULKER' + | 'MAGMA_LORD_FRAGMENT' + | 'ENCHANTMENT_CAYENNE_5' + | 'ENCHANTED_HARD_STONE' + | 'ENCHANTMENT_CAYENNE_4' + | 'WINTER_FRAGMENT' + | 'ENDER_MONOCLE' + | 'KELVIN_INVERTER' + | 'REFINED_DIAMOND' + | 'X' + | 'Y' + | 'HAZMAT_ENDERMAN' + | 'Z' + | 'LUXURIOUS_SPOOL' + | 'FLAWED_OPAL_GEM' + | 'ENCHANTMENT_CAYENNE_3' + | 'PORK' + | 'ENCHANTMENT_CAYENNE_2' + | 'ENCHANTMENT_CAYENNE_1' + | 'FLAMES' + | 'ENCHANTMENT_ENDER_SLAYER_1' + | 'ULTIMATE_CARROT_CANDY' + | 'HONEY_JAR' + | 'PET_CAKE' + | 'SOLAR_PANEL' + | 'ENCHANTMENT_LAPIDARY_4' + | 'ENCHANTMENT_LAPIDARY_3' + | 'ENCHANTMENT_LAPIDARY_2' + | 'ENCHANTMENT_LAPIDARY_1' + | 'ENCHANTMENT_FIRE_ASPECT_1' + | 'LOG_2:1' + | 'UNDEAD_CATALYST' + | 'ENCHANTMENT_TURBO_CACTUS_5' + | 'ENCHANTED_SNOW_BLOCK' + | 'ENCHANTMENT_TURBO_CACTUS_4' + | 'ENCHANTMENT_TURBO_CACTUS_3' + | 'OLD_LEATHER_BOOT' + | 'ENCHANTMENT_TURBO_CACTUS_2' + | 'ENCHANTMENT_FIRE_ASPECT_2' + | 'ENCHANTMENT_TURBO_CACTUS_1' + | 'ENCHANTMENT_FIRE_ASPECT_3' + | 'ENCHANTMENT_LAPIDARY_5' + | 'ENCHANTMENT_ENDER_SLAYER_5' + | 'ENCHANTMENT_ENDER_SLAYER_4' + | 'ENCHANTMENT_ENDER_SLAYER_3' + | 'ENCHANTMENT_ENDER_SLAYER_2' + | 'ENCHANTMENT_ENDER_SLAYER_7' + | 'ENCHANTMENT_ENDER_SLAYER_6' + | 'ENCHANTMENT_SHARPNESS_1' + | 'DUNGEON_DECOY' + | 'REFINED_TUNGSTEN' + | 'ENCHANTMENT_SHARPNESS_5' + | 'JERRY_BOX_GOLDEN' + | 'ENCHANTMENT_SHARPNESS_4' + | 'ENCHANTMENT_SHARPNESS_3' + | 'ENCHANTMENT_SHARPNESS_2' + | 'ENCHANTMENT_BIG_BRAIN_4' + | 'ENCHANTMENT_BIG_BRAIN_5' + | 'ENCHANTMENT_BIG_BRAIN_3' + | 'MUTATED_BLAZE_ASHES' + | 'ENCHANTED_CARROT_ON_A_STICK' + | 'ENCHANTMENT_THUNDERLORD_7' + | 'ENCHANTMENT_THUNDERLORD_6' + | 'ENCHANTMENT_TURBO_MELON_5' + | 'FLY_SWATTER' + | 'DERELICT_ASHE' + | 'ENCHANTMENT_THUNDERLORD_3' + | 'ENCHANTMENT_THUNDERLORD_2' + | 'ENCHANTMENT_SHARPNESS_7' + | 'ENCHANTMENT_THUNDERLORD_5' + | 'ENCHANTMENT_SHARPNESS_6' + | 'ENCHANTMENT_THUNDERLORD_4' + | 'ENCHANTED_ACACIA_LOG' + | 'ENCHANTMENT_MANA_STEAL_1' + | 'ENCHANTMENT_MANA_STEAL_2' + | 'ENCHANTMENT_THUNDERLORD_1' + | 'ENCHANTMENT_MANA_STEAL_3' + | 'SAND' + | 'ANCIENT_CLAW' + | 'ENCHANTMENT_TURBO_MELON_3' + | 'PLASMA_BUCKET' + | 'ENCHANTMENT_STRONG_MANA_7' + | 'ENCHANTED_GHAST_TEAR' + | 'ENCHANTMENT_STRONG_MANA_6' + | 'ENCHANTMENT_TURBO_MELON_4' + | 'ENCHANTED_COCOA' + | 'ENCHANTMENT_STRONG_MANA_5' + | 'ENCHANTMENT_TURBO_MELON_1' + | 'ENCHANTMENT_STRONG_MANA_4' + | 'ENCHANTMENT_TURBO_MELON_2' + | 'ENCHANTMENT_STRONG_MANA_3' + | 'AMBER_MATERIAL' + | 'ENCHANTMENT_STRONG_MANA_2' + | 'ENCHANTMENT_STRONG_MANA_1' + | 'CARROT_BAIT' + | 'FINE_TOPAZ_GEM' + | 'FINE_RUBY_GEM' + | 'HYPERGOLIC_IONIZED_CERAMICS' + | 'THUNDER_SHARDS' + | 'HAY_BLOCK' + | 'ENCHANTED_ROTTEN_FLESH' + | 'ENCHANTED_GRILLED_PORK' + | 'WISHING_COMPASS' + | 'ENCHANTED_ANCIENT_CLAW' + | 'BRIMSTONE_HANDLE' + | 'DWARVEN_OS_ORE_OATS' + | 'ENCHANTMENT_HARDENED_MANA_1' + | 'PUMPKIN_BOMB' + | 'OVERGROWN_GRASS' + | 'FULL_CHUM_BUCKET' + | 'ENCHANTMENT_HARDENED_MANA_3' + | 'ENCHANTMENT_HARDENED_MANA_2' + | 'SOULFLOW_ENGINE' + | 'ENCHANTMENT_ULTIMATE_COMBO_1' + | 'ENCHANTMENT_ULTIMATE_COMBO_2' + | 'ENCHANTMENT_ULTIMATE_COMBO_5' + | 'PET_ITEM_TOY_JERRY' + | 'ENCHANTMENT_ULTIMATE_COMBO_3' + | 'ENCHANTED_LAVA_BUCKET' + | 'ENCHANTMENT_ULTIMATE_COMBO_4' + | 'RAW_FISH:3' + | 'BUBBA_BLISTER' + | 'ENCHANTED_UMBER' + | 'ENCHANTMENT_STRONG_MANA_9' + | 'ENCHANTMENT_STRONG_MANA_8' + | 'ROUGH_AQUAMARINE_GEM' + | 'DIAMOND_ATOM' + | 'RAW_FISH:2' + | 'HALF_EATEN_MUSHROOM' + | 'RAW_FISH:1' + | 'PRECURSOR_GEAR' + | 'GOBLIN_EGG_RED' + | 'ENCHANTMENT_TURBO_WARTS_1' + | 'TROUBLED_BUBBLE' + | 'ENCHANTMENT_TURBO_WARTS_2' + | 'ENCHANTMENT_TURBO_WARTS_3' + | 'ENCHANTMENT_TURBO_WARTS_4' + | 'ENCHANTMENT_TURBO_WARTS_5' + | 'WHALE_BAIT' + | 'SPONGE' + | 'ENCHANTED_DARK_OAK_LOG' + | 'FLAWLESS_TOPAZ_GEM' + | 'ENCHANTMENT_HARDENED_MANA_5' + | 'ENCHANTMENT_HARDENED_MANA_4' + | 'CAPSAICIN_EYEDROPS_NO_CHARGES' + | 'ENCHANTMENT_HARDENED_MANA_7' + | 'ENCHANTMENT_HARDENED_MANA_6' + | 'ENCHANTMENT_ULTIMATE_NO_PAIN_NO_GAIN_4' + | 'ENCHANTMENT_HARDENED_MANA_9' + | 'ENCHANTMENT_ULTIMATE_NO_PAIN_NO_GAIN_3' + | 'ENCHANTMENT_HARDENED_MANA_8' + | 'ENCHANTMENT_ULTIMATE_NO_PAIN_NO_GAIN_5' + | 'ENCHANTED_RAW_CHICKEN' + | 'ENCHANTED_WATER_LILY' + | 'RED_SCARF' + | 'LOG:1' + | 'TITANIUM_ORE' + | 'BLUE_SHARK_TOOTH' + | 'ROBOTRON_REFLECTOR' + | 'LOG:3' + | 'CHILI_PEPPER' + | 'LOG:2' + | 'ENCHANTED_HAY_BALE' + | 'SIL_EX' + | 'SALT_CUBE' + | 'ENCHANTED_CACTUS' + | 'ONYX' + | 'ENCHANTED_COOKED_SALMON' + | 'ENCHANTED_SULPHUR' + | 'TITANIUM_TESSERACT' + | 'ENCHANTED_SEEDS' + | 'ENCHANTED_BONE_MEAL' + | 'ENCHANTMENT_EXPERIENCE_5' + | 'ENCHANTED_BONE_BLOCK' + | 'SMALL_ENCHANTED_CHEST' + | 'OMEGA_EGG' + | 'PURPLE_CANDY' + | 'ENCHANTMENT_EXPERIENCE_2' + | 'POLISHED_PUMPKIN' + | 'ENCHANTMENT_EXPERIENCE_1' + | 'ENCHANTMENT_EXPERIENCE_4' + | 'ENCHANTMENT_EXPERIENCE_3' + | 'ENCHANTED_GOLD_BLOCK' + | 'FINE_OPAL_GEM' + | 'ENCHANTED_FLINT' + | 'FAKE_SHURIKEN' + | 'SPOTLITE' + | 'SCORCHED_POWER_CRYSTAL' + | 'SCARF_FRAGMENT' + | 'REHEATED_GUMMY_POLAR_BEAR' + | 'FURBALL' + | 'ESSENCE_SPIDER' + | 'ENCHANTED_CLAY_BALL' + | 'GLOWSTONE_DUST' + | 'FLYCATCHER_UPGRADE' + | 'PERFECT_AMETHYST_GEM' + | 'IMPLOSION_SCROLL' + | 'FTX_3070' + | 'CROPIE' + | 'PET_ITEM_VAMPIRE_FANG' + | 'ENDSTONE_GEODE' + | 'ENCHANTMENT_PALEONTOLOGIST_5' + | 'MILLENIA_OLD_BLAZE_ASHES' + | 'GREAT_CARROT_CANDY' + | 'ENCHANTMENT_MANA_VAMPIRE_10' + | 'OPTICAL_LENS' + | 'ENCHANTED_BONE' + | 'LAVA_WATER_ORB' + | 'ENCHANTMENT_PALEONTOLOGIST_3' + | 'ENCHANTMENT_PALEONTOLOGIST_4' + | 'ENCHANTED_DIAMOND_BLOCK' + | 'ENCHANTMENT_PALEONTOLOGIST_1' + | 'ENCHANTMENT_DELICATE_5' + | 'ENCHANTMENT_PALEONTOLOGIST_2' + | 'GOBLIN_EGG_GREEN' + | 'ENCHANTMENT_PROSECUTE_6' + | 'ENCHANTMENT_CASTER_1' + | 'ENCHANTMENT_PROSECUTE_5' + | 'ENCHANTMENT_CASTER_2' + | 'GIANT_FRAGMENT_BIGFOOT' + | 'LIGHT_BAIT' + | 'HOT_POTATO_BOOK' + | 'CUP_OF_BLOOD' + | 'MAGIC_MUSHROOM_SOUP' + | 'ENCHANTMENT_CASTER_3' + | 'CLAY_BALL' + | 'ENCHANTMENT_CASTER_4' + | 'ENCHANTMENT_CASTER_5' + | 'OLD_FRAGMENT' + | 'ENCHANTMENT_CASTER_6' + | 'BEATING_HEART' + | 'ROUGH_AMBER_GEM' + | 'ENCHANTMENT_PROSECUTE_4' + | 'ENCHANTMENT_PROSECUTE_3' + | 'ENCHANTMENT_PROSECUTE_2' + | 'ENCHANTMENT_PROSECUTE_1' + | 'AMALGAMATED_CRIMSONITE' + | 'FINE_AMBER_GEM' + | 'SUPER_MAGIC_MUSHROOM_SOUP' + | 'ENCHANTED_QUARTZ' + | 'ENDER_PEARL' + | 'ENCHANTED_COAL_BLOCK' + | 'LESSER_SOULFLOW_ENGINE' + | 'ENCHANTED_GLACITE' + | 'LARGE_WALNUT' + | 'FLAWED_JADE_GEM' + | 'TOIL_LOG' + | 'SLUDGE_JUICE' + | 'BONZO_FRAGMENT' + | 'SPECTRE_DUST' + | 'BROKEN_RADAR' + | 'ENCHANTMENT_RESPITE_5' + | 'SUGAR_CANE' + | 'ENCHANTMENT_RESPITE_3' + | 'ENCHANTMENT_RESPITE_4' + | 'ENCHANTMENT_RESPITE_1' + | 'ENCHANTMENT_RESPITE_2' + | 'CORRUPTED_FRAGMENT' + | 'TESSELLATED_ENDER_PEARL' + | 'ENCHANTED_RAW_BEEF' + | 'AOTE_STONE' + | 'RABBIT_HIDE' + | 'INFERNO_FUEL_BLOCK' + | 'ENCHANTMENT_OVERLOAD_5' + | 'ENCHANTMENT_OVERLOAD_4' + | 'ENCHANTMENT_OVERLOAD_3' + | 'ENCHANTMENT_OVERLOAD_2' + | 'ENCHANTMENT_OVERLOAD_1' + | 'DARK_BAIT' + | 'ENCHANTED_PUMPKIN' + | 'ENCHANTED_COOKED_FISH' + | 'OBSIDIAN' + | 'PET_ITEM_EXP_SHARE_DROP' + | 'STARFALL' + | 'ENCHANTMENT_FIRE_PROTECTION_6' + | 'SECOND_MASTER_STAR' + | 'ENCHANTMENT_FIRE_PROTECTION_5' + | 'ROUGH_ONYX_GEM' + | 'ENCHANTMENT_FIRE_PROTECTION_7' + | 'ENCHANTMENT_HARDENED_MANA_10' + | 'FLAWLESS_ONYX_GEM' + | 'ENCHANTMENT_ULTIMATE_REND_3' + | 'ENCHANTMENT_ULTIMATE_JERRY_2' + | 'ENTROPY_SUPPRESSOR' + | 'ENCHANTMENT_ULTIMATE_JERRY_1' + | 'ENCHANTMENT_ULTIMATE_REND_2' + | 'ENCHANTMENT_ULTIMATE_REND_1' + | 'ENCHANTED_POPPY' + | 'GLOWSTONE_DUST_DISTILLATE' + | 'ENCHANTMENT_ULTIMATE_JERRY_5' + | 'ENCHANTMENT_ULTIMATE_JERRY_4' + | 'ENCHANTMENT_ULTIMATE_REND_5' + | 'DWARVEN_OS_GEMSTONE_GRAHAMS' + | 'ENCHANTMENT_ULTIMATE_JERRY_3' + | 'ENCHANTMENT_ULTIMATE_REND_4' + | 'ENCHANTMENT_FIRE_PROTECTION_2' + | 'ENCHANTMENT_FIRE_PROTECTION_1' + | 'BAZAAR_COOKIE' + | 'ENCHANTMENT_FIRE_PROTECTION_4' + | 'ENCHANTMENT_FIRE_PROTECTION_3' + | 'FLAWLESS_PERIDOT_GEM' + | 'BROWN_MUSHROOM' + | 'DISPLACED_LEECH' + | 'ENCHANTMENT_HARVESTING_5' + | 'ENCHANTMENT_HARVESTING_4' + | 'ENCHANTMENT_HARVESTING_3' + | 'CARROT_ITEM' + | 'OVERFLOWING_TRASH_CAN' + | 'ENCHANTMENT_HARVESTING_2' + | 'ENCHANTMENT_HARVESTING_1' + | 'UMBER' + | 'MOLTEN_CUBE' + | 'EXP_BOTTLE' + | 'HEALING_TISSUE' + | 'ENCHANTED_RABBIT_HIDE' + | 'ENCHANTMENT_HARVESTING_6' + | 'SQUEAKY_TOY' + | 'WATER_ORB' + | 'GLACITE_JEWEL' + | 'MATCH_STICKS' + | 'INFERNO_VERTEX' + | 'RUSTY_ANCHOR' + | 'WEAK_WOLF_CATALYST' + | 'FLAWED_AMETHYST_GEM' + | 'PERFECT_JADE_GEM' + | 'ENCHANTED_BIRCH_LOG' + | 'FOURTH_MASTER_STAR' + | 'ENCHANTED_GUNPOWDER' + | 'REFINED_AMBER' + | 'ENCHANTED_SUGAR' + | 'CACTUS' + | 'DUNG' + | 'ENCHANTED_RAW_SALMON' + | 'BOBBIN_SCRIPTURES' + | 'ENCHANTED_EMERALD' + | 'RED_MUSHROOM' + | 'GRAND_EXP_BOTTLE' + | 'MUTTON' + | 'ENCHANTMENT_DEDICATION_2' + | 'ENCHANTMENT_DEDICATION_1' + | 'ENCHANTMENT_DEDICATION_4' + | 'ENCHANTMENT_DEDICATION_3' + | 'ENCHANTMENT_ULTIMATE_WISE_2' + | 'SPIDER_EYE' + | 'ENCHANTMENT_ULTIMATE_WISE_1' + | 'ENCHANTMENT_ULTIMATE_WISE_4' + | 'ENCHANTMENT_ULTIMATE_WISE_3' + | 'BEJEWELED_HANDLE' + | 'LARGE_ENCHANTED_CHEST' + | 'ENCHANTED_NETHERRACK' + | 'JADERALD' + | 'ENCHANTMENT_TRUE_PROTECTION_1' + | 'CORRUPT_SOIL' + | 'PRISMARINE_CRYSTALS' + | 'RARE_DIAMOND' + | 'DWARVEN_OS_BLOCK_BRAN' + | 'COMPACT_OOZE' + | 'GLOSSY_GEMSTONE' + | 'ICE' + | 'TIGER_SHARK_TOOTH' + | 'ENCHANTMENT_LUCK_OF_THE_SEA_4' + | 'ENCHANTMENT_LUCK_OF_THE_SEA_5' + | 'ENCHANTMENT_LUCK_OF_THE_SEA_6' + | 'ENCHANTMENT_SMARTY_PANTS_3' + | 'ENCHANTMENT_ULTIMATE_WISE_5' + | 'ENCHANTMENT_SMARTY_PANTS_2' + | 'ENCHANTMENT_LUCK_OF_THE_SEA_1' + | 'ENCHANTMENT_SMARTY_PANTS_5' + | 'ENCHANTMENT_LUCK_OF_THE_SEA_2' + | 'ENCHANTMENT_SMARTY_PANTS_4' + | 'ENCHANTMENT_LUCK_OF_THE_SEA_3' + | 'GOLDEN_TOOTH' + | 'THE_ART_OF_PEACE' + | 'ENCHANTMENT_SMARTY_PANTS_1' + | 'LUMP_OF_MAGMA' + | 'HYPER_CATALYST' + | 'VOLTA' + | 'RABBIT_FOOT' + | 'SUPERLITE_MOTOR' + | 'REDSTONE' + | 'BRAIDED_GRIFFIN_FEATHER' + | 'SUSPICIOUS_SCRAP' + | 'SPIRIT_WING' + | 'PET_ITEM_CHOCOLATE_SYRINGE' + | 'BLAZEN_SPHERE' + | 'SPOOKY_WATER_ORB' + | 'THE_ART_OF_WAR' + | 'ENCHANTMENT_LURE_2' + | 'ENCHANTMENT_LURE_1' + | 'SLIME_BALL' + | 'ENCHANTMENT_LURE_6' + | 'ENCHANTMENT_LURE_5' + | 'ENCHANTMENT_LURE_4' + | 'ENCHANTMENT_LURE_3' + | 'HOLY_FRAGMENT' + | 'SNOW_BALL' + | 'ENCHANTED_WOOL' + | 'ENCHANTED_EGG' + | 'GLEAMING_CRYSTAL' + | 'RUSTY_COIN' + | 'SUPERB_CARROT_CANDY' + | 'ENCHANTMENT_FEROCIOUS_MANA_8' + | 'ENCHANTMENT_FEROCIOUS_MANA_9' + | 'FINE_JADE_GEM' + | 'ENCHANTMENT_FEROCIOUS_MANA_4' + | 'FLAWED_RUBY_GEM' + | 'ENCHANTMENT_MAGNET_2' + | 'RAW_CHICKEN' + | 'ENCHANTMENT_FEROCIOUS_MANA_5' + | 'ENCHANTMENT_MAGNET_1' + | 'SORROW' + | 'ENCHANTMENT_FEROCIOUS_MANA_6' + | 'ENCHANTMENT_MAGNET_4' + | 'ENCHANTMENT_FEROCIOUS_MANA_7' + | 'ENCHANTMENT_MAGNET_3' + | 'FLAWLESS_JASPER_GEM' + | 'ENCHANTMENT_MAGNET_6' + | 'ENCHANTMENT_FEROCIOUS_MANA_1' + | 'ENCHANTMENT_MAGNET_5' + | 'ENCHANTMENT_FEROCIOUS_MANA_2' + | 'LUSH_BERBERIS' + | 'ENCHANTMENT_FEROCIOUS_MANA_3' + | 'ENCHANTMENT_PESTERMINATOR_1' + | 'ENCHANTMENT_PESTERMINATOR_2' + | 'ENCHANTMENT_PROJECTILE_PROTECTION_7' + | 'ENCHANTMENT_CHAMPION_10' + | 'ENCHANTMENT_PROJECTILE_PROTECTION_6' + | 'ENCHANTMENT_PESTERMINATOR_3' + | 'ENCHANTED_SHARK_FIN' + | 'ENCHANTMENT_PESTERMINATOR_4' + | 'ENCHANTMENT_PROJECTILE_PROTECTION_5' + | 'ENCHANTMENT_PESTERMINATOR_5' + | 'ENCHANTMENT_PROJECTILE_PROTECTION_4' + | 'ENCHANTMENT_PROJECTILE_PROTECTION_3' + | 'ENCHANTMENT_PROJECTILE_PROTECTION_2' + | 'ENCHANTMENT_PROJECTILE_PROTECTION_1' + | 'INK_SACK' + | 'ENCHANTMENT_SMALL_BRAIN_5' + | 'CRYSTAL_FRAGMENT' + | 'ENCHANTED_REDSTONE_BLOCK' + | 'DIVAN_POWDER_COATING' + | 'ENCHANTMENT_SMALL_BRAIN_3' + | 'INFERNO_APEX' + | 'ENCHANTMENT_SMALL_BRAIN_4' + | 'ENCHANTED_REDSTONE_LAMP' + | 'TREASURITE' + | 'PERFECT_OPAL_GEM' + | 'MELON' + | 'DIAMONITE' + | 'GLOWING_MUSHROOM' + | 'ENCHANTMENT_DRAGON_HUNTER_4' + | 'ENCHANTMENT_DRAGON_HUNTER_3' + | 'ENCHANTMENT_DRAGON_HUNTER_5' + | 'ENCHANTED_IRON_BLOCK' + | 'ENCHANTMENT_DRAGON_HUNTER_2' + | 'BONE' + | 'ENCHANTMENT_DRAGON_HUNTER_1' + | 'POISONOUS_POTATO' + | 'KISMET_FEATHER' + | 'REVENANT_FLESH' + | 'VOLCANIC_ROCK' + | 'ENCHANTED_GLOWSTONE' + | 'OBSIDIAN_TABLET' + | 'ESSENCE_WITHER' + | 'GENERATOR_UPGRADE_STONE_CLAY_12' + | 'ENCHANTMENT_CHARM_2' + | 'ENCHANTMENT_CHARM_3' + | 'ENCHANTMENT_CHARM_1' + | 'BLAZE_ROD' + | 'ENCHANTMENT_CHARM_4' + | 'YOUNG_FRAGMENT' + | 'ENCHANTMENT_CHARM_5' + | 'MITHRIL_PLATE' + | 'BLOOD_SOAKED_COINS' + | 'REFINED_MINERAL' + | 'CHYME' + | 'GUARDIAN_LUCKY_BLOCK' + | 'DIVAN_FRAGMENT' + | 'ROUGH_RUBY_GEM' + | 'ENCHANTMENT_IMPALING_3' + | 'ENCHANTMENT_IMPALING_2' + | 'GOBLIN_EGG_BLUE' + | 'ENCHANTMENT_IMPALING_1' + | 'DIGESTED_MUSHROOMS' + | 'CATALYST' + | 'MOBY_DUCK_COLLECTOR_EDITION' + | 'REFINED_DARK_CACAO_TRUFFLE' + | 'ENCHANTED_INK_SACK' + | 'JERRY_STONE' + | 'MOLTEN_POWDER' + | 'FLAWLESS_SAPPHIRE_GEM' + | 'MAGMA_URCHIN' + | 'PERFECT_AQUAMARINE_GEM' + | 'JACOBS_TICKET' + | 'BAT_FIREWORK' + | 'ENCHANTMENT_QUANTUM_4' + | 'ENCHANTMENT_QUANTUM_5' + | 'ABSOLUTE_ENDER_PEARL' + | 'ARACHNE_FRAGMENT' + | 'ENCHANTMENT_QUANTUM_3' + | 'ENCHANTMENT_REPLENISH_1' + | 'ENCHANTED_ENDER_PEARL' + | 'ARROW_BUNDLE_MAGMA' + | 'SPIKED_BAIT' + | 'ENCHANTED_FERMENTED_SPIDER_EYE' + | 'FROZEN_BAIT' + | 'BLESSED_FRUIT' + | 'ENCHANTMENT_ULTIMATE_SWARM_5' + | 'VERY_CRUDE_GABAGOOL' + | 'ENCHANTMENT_TURBO_WHEAT_3' + | 'ENCHANTMENT_TURBO_WHEAT_4' + | 'CHAIN_END_TIMES' + | 'ENCHANTMENT_SILK_TOUCH_1' + | 'ENCHANTMENT_TURBO_WHEAT_1' + | 'ENCHANTMENT_TURBO_WHEAT_2' + | 'ENCHANTMENT_ULTIMATE_SWARM_3' + | 'ENCHANTMENT_ULTIMATE_SWARM_4' + | 'ENCHANTMENT_ULTIMATE_SWARM_1' + | 'ENCHANTMENT_TURBO_WHEAT_5' + | 'EXPORTABLE_CARROTS' + | 'ENCHANTMENT_ULTIMATE_SWARM_2' + | 'NULL_OVOID' + | 'GOLD_INGOT' + | 'ENCHANTMENT_SUGAR_RUSH_3' + | 'ENCHANTMENT_SUGAR_RUSH_2' + | 'FLAWLESS_CITRINE_GEM' + | 'ENCHANTED_IRON' + | 'ENCHANTMENT_SUGAR_RUSH_1' + | 'BEZOS' + | 'ENCHANTED_HAY_BLOCK' + | 'HEMOVIBE' + | 'ENCHANTED_TITANIUM' + | 'DWARVEN_OS_METALLIC_MINIS' + | 'SPOOKY_BAIT' + | 'HEAVY_PEARL' + | 'TWILIGHT_ARROW_POISON' + | 'EMERALD' + | 'ENCHANTED_RABBIT_FOOT' + | 'POTATO_SPREADING' + | 'ENCHANTED_ICE' + | 'ARACHNE_KEEPER_FRAGMENT' + | 'ENCHANTMENT_GROWTH_1' + | 'ENCHANTMENT_GROWTH_2' + | 'GREEN_GIFT' + | 'ENCHANTMENT_GROWTH_3' + | 'ENCHANTMENT_GROWTH_4' + | 'SKELETON_KEY' + | 'ENCHANTMENT_GROWTH_5' + | 'ENCHANTMENT_GROWTH_6' + | 'FLAWLESS_AMETHYST_GEM' + | 'RED_NOSE' + | 'ENCHANTMENT_GROWTH_7' + | 'NULL_EDGE' + | 'THORN_FRAGMENT' + | 'PACKED_ICE' + | 'YELLOW_FLOWER' + | 'CLIPPED_WINGS' + | 'REVENANT_CATALYST' + | 'WITHER_CATALYST' + | 'HAMSTER_WHEEL' + | 'PESTHUNTING_GUIDE' + | 'ENCHANTED_COAL' + | 'MAGMA_FISH_SILVER' + | 'SULPHURIC_COAL' + | 'FLAWLESS_OPAL_GEM' + | 'ESSENCE_UNDEAD' + | 'GENERATOR_UPGRADE_STONE_FISHING_12' + | 'DRAGON_CLAW' + | 'DAEDALUS_STICK' + | 'ENCHANTMENT_ULTIMATE_CHIMERA_1' + | 'ENCHANTMENT_ULTIMATE_LAST_STAND_5' + | 'ENCHANTMENT_ULTIMATE_LAST_STAND_4' + | 'ENCHANTMENT_ULTIMATE_CHIMERA_5' + | 'ENCHANTMENT_ULTIMATE_LAST_STAND_3' + | 'ENCHANTMENT_ULTIMATE_LAST_STAND_2' + | 'ENCHANTMENT_ULTIMATE_CHIMERA_4' + | 'PET_ITEM_PURE_MITHRIL_GEM' + | 'ENCHANTMENT_ULTIMATE_LAST_STAND_1' + | 'ENCHANTMENT_ULTIMATE_CHIMERA_3' + | 'JUNGLE_HEART' + | 'ENCHANTMENT_ULTIMATE_CHIMERA_2' + | 'LUCKY_DICE' + | 'GOLD_BOTTLE_CAP' + | 'FOUL_FLESH' + | 'RAW_BEEF' + | 'ENCHANTED_EYE_OF_ENDER' + | 'ECTOPLASM' + | 'GIANT_BOUNCY_BEACH_BALL' + | 'ORB_OF_ENERGY' + | 'PRECIOUS_PEARL' + | 'ENCHANTED_MYCELIUM' + | 'MAGMA_FISH_DIAMOND' + | 'RABBIT' + | 'ENCHANTED_HOPPER' + | 'FINE_FLOUR' + | 'ENCHANTMENT_QUICK_BITE_4' + | 'GRIFFIN_FEATHER' + | 'HEMOBOMB' + | 'POLARVOID_BOOK' + | 'ENCHANTMENT_QUICK_BITE_3' + | 'ENCHANTMENT_QUICK_BITE_2' + | 'FREE_WILL' + | 'ENCHANTMENT_QUICK_BITE_1' + | 'GIANT_FRAGMENT_DIAMOND' + | 'SOULFLOW' + | 'METAPHYSICAL_SERUM' + | 'AVARICIOUS_CHALICE' + | 'MINNOW_BAIT' + | 'ENCHANTED_MAGMA_CREAM' + | 'ENCHANTED_FIREWORK_ROCKET' + | 'BLAZE_WAX' + | 'WITHER_BLOOD' + | 'ENCHANTMENT_QUICK_BITE_5' + | 'ENCHANTMENT_EFFICIENCY_5' + | 'ENCHANTMENT_EFFICIENCY_4' + | 'CHOCOLATE_CHIP' + | 'ENCHANTMENT_EFFICIENCY_3' + | 'BOUNCY_BEACH_BALL' + | 'ENCHANTMENT_EFFICIENCY_2' + | 'HARD_STONE' + | 'FLAWLESS_JADE_GEM' + | 'ENCHANTMENT_EFFICIENCY_1' + | 'SUPERBOOM_TNT' + | 'ENCHANTED_COOKED_MUTTON' + | 'ENCHANTMENT_EFFICIENCY_9' + | 'ENCHANTMENT_EFFICIENCY_8' + | 'REFINED_TITANIUM' + | 'FLAWED_ONYX_GEM' + | 'ENCHANTMENT_EFFICIENCY_7' + | 'ENCHANTMENT_FEATHER_FALLING_10' + | 'ENCHANTMENT_EFFICIENCY_6' + | 'SHINY_PRISM' + | 'ENCHANTMENT_SMOLDERING_5' + | 'ENCHANTMENT_SMOLDERING_3' + | 'ENCHANTMENT_SMOLDERING_4' + | 'ENCHANTMENT_SMOLDERING_1' + | 'EGG' + | 'FIRST_MASTER_STAR' + | 'ENCHANTMENT_SMOLDERING_2' + | 'UMBER_KEY' + | 'FLOWERING_BOUQUET' + | 'SPIRIT_LEAP' + | 'FINE_JASPER_GEM' + | 'ENCHANTED_CHARCOAL' + | 'BOOK_OF_STATS' + | 'SIMPLE_CARROT_CANDY' + | 'ENCHANTED_DIAMOND' + | 'ENCHANTMENT_FEATHER_FALLING_20' + | 'TITANOBOA_SHED' + | 'OIL_BARREL' + | 'CORRUPTED_NETHER_STAR' + | 'GOLEM_POPPY' + | 'HORNS_OF_TORMENT' + | 'ENCHANTMENT_CRITICAL_6' + | 'JERRY_BOX_GREEN' + | 'FARMING_FOR_DUMMIES' + | 'ENCHANTMENT_CRITICAL_7' + | 'POCKET_ICEBERG' + | 'ENCHANTMENT_TOXOPHILITE_1' + | 'ENCHANTMENT_CRITICAL_4' + | 'ENCHANTMENT_CRITICAL_5' + | 'ENCHANTMENT_CRITICAL_2' + | 'ENCHANTED_GOLDEN_CARROT' + | 'ENCHANTED_TUNGSTEN' + | 'ENCHANTMENT_CRITICAL_3' + | 'ENCHANTMENT_CRITICAL_1' + | 'MANA_DISINTEGRATOR' + | 'ENCHANTMENT_AIMING_1' + | 'ENCHANTMENT_AIMING_2' + | 'ENCHANTMENT_AIMING_3' + | 'ENCHANTMENT_AIMING_4' + | 'ENCHANTMENT_AIMING_5' + | 'SHADOW_WARP_SCROLL' + | 'FLAWED_PERIDOT_GEM' + | 'ENCHANTMENT_ULTIMATE_HABANERO_TACTICS_4' + | 'ENCHANTMENT_FROST_WALKER_2' + | 'ENCHANTMENT_THUNDERBOLT_6' + | 'ENCHANTMENT_THUNDERBOLT_7' + | 'ENCHANTMENT_BLAST_PROTECTION_7' + | 'ENCHANTED_MYCELIUM_CUBE' + | 'ENCHANTMENT_ULTIMATE_HABANERO_TACTICS_5' + | 'FLAWED_JASPER_GEM' + | 'ENCHANTMENT_FROST_WALKER_1' + | 'EXPIRED_PUMPKIN' + | 'ENCHANTMENT_ICE_COLD_4' + | 'ENCHANTMENT_ICE_COLD_3' + | 'ENCHANTMENT_THUNDERBOLT_1' + | 'GLACIAL_FRAGMENT' + | 'ENCHANTED_POISONOUS_POTATO' + | 'ENCHANTMENT_ICE_COLD_5' + | 'TUNGSTEN_PLATE' + | 'FLAWED_AMBER_GEM' + | 'ENCHANTMENT_THUNDERBOLT_4' + | 'ENCHANTMENT_THUNDERBOLT_5' + | 'ENCHANTMENT_ICE_COLD_2' + | 'ENCHANTMENT_THUNDERBOLT_2' + | 'ENCHANTMENT_ICE_COLD_1' + | 'ENCHANTMENT_THUNDERBOLT_3' + | 'ENCHANTMENT_ULTIMATE_REITERATE_1' + | 'ENCHANTMENT_ULTIMATE_REITERATE_4' + | 'ENCHANTMENT_COMPACT_10' + | 'ENCHANTMENT_ULTIMATE_REITERATE_5' + | 'ENCHANTMENT_ULTIMATE_REITERATE_2' + | 'PRISMARINE_SHARD' + | 'ENCHANTMENT_ULTIMATE_REITERATE_3' + | 'PRECURSOR_APPARATUS' + | 'SYNTHETIC_HEART' + | 'ENCHANTED_CLAY_BLOCK' + | 'POWER_CRYSTAL' + | 'WISE_FRAGMENT' + | 'SHARK_FIN' + | 'PERFECT_PERIDOT_GEM' + | 'SCUTTLER_SHELL' + | 'REFINED_MITHRIL' + | 'XXLARGE_ENCHANTED_CHEST' + | 'FUEL_TANK' + | 'UMBER_PLATE' + | 'SINGED_POWDER' + | 'JALAPENO_BOOK' + | 'ENCHANTMENT_VENOMOUS_3' + | 'POTATO_ITEM' + | 'ENCHANTMENT_VENOMOUS_4' + | 'ENCHANTMENT_VENOMOUS_5' + | 'ENCHANTED_HUGE_MUSHROOM_1' + | 'SKYMART_BROCHURE' + | 'ENCHANTMENT_VENOMOUS_6' + | 'PRESUMED_GALLON_OF_RED_PAINT' + | 'HEMOGLASS' + | 'ENCHANTMENT_VENOMOUS_1' + | 'ENCHANTMENT_VENOMOUS_2' + | 'ELECTRON_TRANSMITTER' + | 'ENCHANTED_COBBLESTONE' + | 'ENCHANTMENT_STRONG_MANA_10' + | 'ENCHANTED_HUGE_MUSHROOM_2' + | 'MOOGMA_PELT' + | 'GLOWY_CHUM_BAIT' + | 'GAZING_PEARL' + | 'STUFFED_CHILI_PEPPER' + | 'BUDGET_HOPPER' + | 'REKINDLED_EMBER_FRAGMENT' + | 'ICE_BAIT' + | 'TERRY_SNOWGLOBE' + | 'FINE_ONYX_GEM' + | 'CHEESE_FUEL' + | 'KUUDRA_MANDIBLE' + | 'ENCHANTMENT_FEATHER_FALLING_3' + | 'ENCHANTMENT_FEATHER_FALLING_2' + | 'PUMPKIN_GUTS' + | 'ENCHANTMENT_FEATHER_FALLING_1' + | 'ENCHANTMENT_FEATHER_FALLING_7' + | 'BLAZE_ROD_DISTILLATE' + | 'ENCHANTMENT_FEATHER_FALLING_6' + | 'WITHER_SHIELD_SCROLL' + | 'ENCHANTMENT_FEATHER_FALLING_5' + | 'ENCHANTMENT_FEATHER_FALLING_4' + | 'ACACIA_BIRDHOUSE' + | 'ENCHANTMENT_FEATHER_FALLING_9' + | 'ENCHANTMENT_FEATHER_FALLING_8' + | 'SPIDER_CATALYST' + | 'ENCHANTED_ENDSTONE' + | 'ENCHANTED_LAPIS_LAZULI_BLOCK' + | 'ENCHANTED_SAND' + | 'ESSENCE_ICE' + | 'COLOSSAL_EXP_BOTTLE' + | 'ENCHANTED_STRING' + | 'PERFECT_ONYX_GEM' + | 'MOIL_LOG' + | 'ENCHANTED_DANDELION' + | 'MIMIC_FRAGMENT' + | 'MAGMA_FISH_GOLD' + | 'SOUL_FRAGMENT' + | 'ENCHANTED_LAPIS_LAZULI' + | 'ENDERMAN_CORTEX_REWRITER' + | 'MELON_BLOCK' + | 'CRUDE_GABAGOOL_DISTILLATE' + | 'SEEDS' + | 'ENCHANTED_LEATHER' + | 'ENCHANTED_SPONGE' + | 'WOLF_TOOTH' + | 'ENCHANTED_NETHER_STALK' + | 'ENCHANTMENT_CURSE_OF_VANISHING_0' + | 'ENCHANTED_REDSTONE' + | 'METEOR_SHARD' + | 'ENCHANTMENT_COMPACT_2' + | 'ENCHANTMENT_COMPACT_3' + | 'DWARVEN_COMPACTOR' + | 'ENCHANTMENT_COMPACT_1' + | 'GREAT_WHITE_SHARK_TOOTH' + | 'ESSENCE_GOLD' + | 'LEATHER_CLOTH' + | 'ENCHANTMENT_PRISTINE_1' + | 'ENCHANTMENT_COMPACT_6' + | 'ENCHANTMENT_BLAST_PROTECTION_4' + | 'ENCHANTMENT_PRISTINE_2' + | 'ENCHANTMENT_COMPACT_7' + | 'ENCHANTMENT_BLAST_PROTECTION_3' + | 'RECOMBOBULATOR_3000' + | 'ENCHANTMENT_BLAST_PROTECTION_6' + | 'ENCHANTMENT_COMPACT_4' + | 'ENCHANTMENT_BLAST_PROTECTION_5' + | 'ENCHANTMENT_COMPACT_5' + | 'ENCHANTMENT_PRISTINE_5' + | 'ENCHANTMENT_PRISTINE_3' + | 'ENCHANTMENT_COMPACT_8' + | 'ENCHANTMENT_BLAST_PROTECTION_2' + | 'ENCHANTED_WHEAT' + | 'ENCHANTMENT_PRISTINE_4' + | 'ENCHANTMENT_COMPACT_9' + | 'ENCHANTMENT_BLAST_PROTECTION_1' + | 'ENCHANTMENT_FEROCIOUS_MANA_10' + | 'ENCHANTED_PORK' + | 'NECROMANCER_BROOCH' + | 'PET_ITEM_LUCKY_CLOVER_DROP' + | 'BURROWING_SPORES' + | 'DEEP_SEA_ORB' + | 'ROUGH_JASPER_GEM' + | 'FEATHER' + | 'PETRIFIED_STARFALL' + | 'MAGIC_TOP_HAT' + | 'ENCHANTED_RED_SAND' + | 'ENCHANTED_CLOWNFISH' + | 'REFINED_UMBER' + | 'PITCHIN_KOI' + | 'ENCHANTED_GOLD' + | 'ENCHANTMENT_LIFE_STEAL_1' + | 'ENCHANTMENT_LIFE_STEAL_2' + | 'ENCHANTMENT_SMELTING_TOUCH_1' + | 'ENCHANTMENT_LIFE_STEAL_5' + | 'ROUGH_CITRINE_GEM' + | 'ENCHANTMENT_LIFE_STEAL_3' + | 'ENCHANTMENT_LIFE_STEAL_4' + | 'ENCHANTMENT_PISCARY_1' + | 'GOLDEN_PLATE' + | 'ENCHANTMENT_TURBO_MUSHROOMS_5' + | 'SADAN_BROOCH' + | 'FIFTH_MASTER_STAR' + | 'ENCHANTMENT_PISCARY_3' + | 'ENCHANTMENT_PISCARY_2' + | 'BLUE_ICE_HUNK' + | 'ENCHANTED_GLOWSTONE_DUST' + | 'ENCHANTMENT_PISCARY_5' + | 'ENCHANTMENT_PISCARY_4' + | 'ENCHANTMENT_PISCARY_6' + | 'ENCHANTMENT_TABASCO_1' + | 'ENCHANTMENT_TABASCO_3' + | 'ENCHANTMENT_PUNCH_1' + | 'ENCHANTED_SUGAR_CANE' + | 'ENCHANTMENT_TABASCO_2' + | 'TRANSMISSION_TUNER' + | 'ENCHANTMENT_PUNCH_2' + | 'ENCHANTMENT_TURBO_MUSHROOMS_2' + | 'BUSTED_BELT_BUCKLE' + | 'ENCHANTMENT_TURBO_MUSHROOMS_1' + | 'ENCHANTMENT_TURBO_MUSHROOMS_4' + | 'CONCENTRATED_STONE' + | 'ENCHANTMENT_TURBO_MUSHROOMS_3' + | 'ENCHANTMENT_MANA_VAMPIRE_2' + | 'ENCHANTMENT_MANA_VAMPIRE_1' + | 'ENCHANTMENT_MANA_VAMPIRE_4' + | 'ENCHANTMENT_MANA_VAMPIRE_3' + | 'ENCHANTMENT_MANA_VAMPIRE_6' + | 'ENCHANTMENT_MANA_VAMPIRE_5' + | 'SHARK_WATER_ORB' + | 'ENCHANTMENT_MANA_VAMPIRE_8' + | 'ENCHANTMENT_MANA_VAMPIRE_7' + | 'GHAST_TEAR' + | 'ENCHANTMENT_MANA_VAMPIRE_9' + | 'UNSTABLE_FRAGMENT' + | 'KUUDRA_TEETH' + | 'MAGMA_CREAM_DISTILLATE' + | 'CORLEONITE' + | 'ENCHANTED_EMERALD_BLOCK' + | 'SUBZERO_INVERTER' + | 'GIANT_TOOTH' + | 'ENCHANTMENT_PIERCING_1' + | 'ENCHANTMENT_ULTIMATE_THE_ONE_5' + | 'ENCHANTED_MUTTON' + | 'ENCHANTMENT_TITAN_KILLER_7' + | 'SLEEPY_HOLLOW' + | 'ENCHANTMENT_TITAN_KILLER_6' + | 'NULL_SPHERE' + | 'ENCHANTMENT_TITAN_KILLER_5' + | 'ENCHANTMENT_TITAN_KILLER_4' + | 'ENCHANTMENT_TITAN_KILLER_3' + | 'ENCHANTMENT_TITAN_KILLER_2' + | 'ENCHANTMENT_TITAN_KILLER_1' + | 'STOCK_OF_STONKS' + | 'BRONZE_BOWL' + | 'SUPERIOR_FRAGMENT' + | 'MAGMA_BUCKET' + | 'ENCHANTMENT_ULTIMATE_THE_ONE_4' + | 'ALLIGATOR_SKIN' + | 'ENCHANTMENT_POWER_1' + | 'HOT_BAIT' + | 'NULL_BLADE' + | 'WITHER_SOUL' + | 'ENCHANTMENT_POWER_7' + | 'ENCHANTMENT_POWER_6' + | 'ENCHANTMENT_ANGLER_1' + | 'ENCHANTMENT_ANGLER_2' + | 'WORM_MEMBRANE' + | 'GLACITE_SHARD' + | 'ENCHANTMENT_ANGLER_3' + | 'ENCHANTMENT_POWER_3' + | 'ENCHANTMENT_ANGLER_4' + | 'BLACK_WOOLEN_YARN' + | 'ENCHANTMENT_ANGLER_5' + | 'ENCHANTMENT_POWER_2' + | 'ENCHANTMENT_ANGLER_6' + | 'ENCHANTMENT_POWER_5' + | 'ENCHANTMENT_POWER_4' + | 'WATER_LILY' + | 'ENCHANTMENT_THORNS_3' + | 'BOB_OMB' + | 'LOG_2' + | 'MITHRIL_INFUSION' + | 'COAL' + | 'ENCHANTMENT_ULTIMATE_BOBBIN_TIME_3' + | 'ENCHANTMENT_ULTIMATE_BOBBIN_TIME_4' + | 'ENCHANTMENT_ULTIMATE_BOBBIN_TIME_5' + | 'ENCHANTMENT_THORNS_1' + | 'GOLDEN_BOUNTY' + | 'ENCHANTMENT_THORNS_2' + | 'ENCHANTMENT_VAMPIRISM_5' + | 'GOBLIN_EGG' + | 'ENCHANTMENT_VAMPIRISM_6' + | 'ENCHANTED_PRISMARINE_CRYSTALS' + | 'PERFECT_TOPAZ_GEM' + | 'LIVID_FRAGMENT' + | 'ENCHANTMENT_VAMPIRISM_3' + | 'PLASMA' + | 'ENCHANTMENT_VAMPIRISM_4' + | 'ENCHANTED_WET_SPONGE' + | 'ENCHANTMENT_CULTIVATING_9' + | 'ENCHANTMENT_EXPERTISE_7' + | 'ENCHANTMENT_EXPERTISE_6' + | 'ENCHANTMENT_EXPERTISE_9' + | 'ENCHANTMENT_CULTIVATING_7' + | 'ENCHANTMENT_EXPERTISE_8' + | 'ENCHANTMENT_CULTIVATING_8' + | 'ENCHANTMENT_CULTIVATING_5' + | 'PERFECT_PLATE' + | 'ESSENCE_CRIMSON' + | 'ENDER_STONE' + | 'ENCHANTMENT_CULTIVATING_6' + | 'GOLDEN_BAIT' + | 'ENCHANTMENT_CULTIVATING_3' + | 'ENCHANTMENT_CULTIVATING_4' + | 'ENCHANTMENT_CULTIVATING_1' + | 'ENCHANTMENT_VAMPIRISM_1' + | 'ENCHANTMENT_VAMPIRISM_2' + | 'ENCHANTMENT_CULTIVATING_2' + | 'QUARTZ' + | 'JERRY_BOX_PURPLE' + | 'SALMON_OPAL' + | 'ENCHANTMENT_ULTIMATE_SOUL_EATER_1' + | 'CHUM' + | 'ENCHANTMENT_ULTIMATE_SOUL_EATER_3' + | 'HALLOWED_SKULL' + | 'ENCHANTMENT_ULTIMATE_SOUL_EATER_2' + | 'ENCHANTMENT_ULTIMATE_SOUL_EATER_5' + | 'ENCHANTMENT_ULTIMATE_SOUL_EATER_4' + | 'MAGMA_CREAM' + | 'ENCHANTED_COMPOST' + | 'ENCHANTMENT_CHANCE_2' + | 'RED_GIFT' + | 'ENCHANTED_MITHRIL' + | 'ENCHANTMENT_CHANCE_1' + | 'ROUGH_PERIDOT_GEM' + | 'ENCHANTMENT_CHANCE_5' + | 'FEL_PEARL' + | 'ENCHANTED_FEATHER' + | 'ENCHANTMENT_CHANCE_4' + | 'ENCHANTED_OAK_LOG' + | 'ENCHANTMENT_CHANCE_3' + | 'ENCHANTMENT_GREEN_THUMB_5' + | 'ENCHANTMENT_KNOCKBACK_2' + | 'WHITE_GIFT' + | 'FLAWLESS_AQUAMARINE_GEM' + | 'ENCHANTMENT_KNOCKBACK_1' + | 'ENCHANTMENT_GREEN_THUMB_1' + | 'ENCHANTMENT_ULTIMATE_FLASH_2' + | 'ENCHANTMENT_ULTIMATE_FLASH_1' + | 'ENCHANTMENT_GREEN_THUMB_2' + | 'NETHER_STALK' + | 'ENCHANTMENT_GREEN_THUMB_3' + | 'ENCHANTMENT_ULTIMATE_FLASH_4' + | 'ENCHANTMENT_GREEN_THUMB_4' + | 'ENCHANTMENT_ULTIMATE_FLASH_3' + | 'ENCHANTMENT_FIRST_STRIKE_1' + | 'HORSEMAN_CANDLE' + | 'ENCHANTMENT_FIRST_STRIKE_5' + | 'RED_ROSE' + | 'ENCHANTMENT_ULTIMATE_FLASH_5' + | 'ENCHANTMENT_FIRST_STRIKE_4' + | 'ENCHANTMENT_FIRST_STRIKE_3' + | 'ENCHANTMENT_FIRST_STRIKE_2' + | 'GOLDEN_BALL' + | 'BURNING_EYE' + | 'WRIGGLING_LARVA' + | 'ENCHANTMENT_TURBO_PUMPKIN_1' + | 'ENCHANTMENT_TURBO_PUMPKIN_2' + | 'ENCHANTMENT_TURBO_PUMPKIN_3' + | 'ENCHANTMENT_TURBO_PUMPKIN_4' + | 'ENCHANTMENT_TURBO_PUMPKIN_5' + | 'EMPTY_CHUM_BUCKET' + | 'HOTSPOT_BAIT' + | 'LEATHER' + | 'GIANT_FRAGMENT_BOULDER' + | 'MAGMA_FISH' + | 'LAVA_SHELL' + | 'SOUL_STRING' + | 'ENCHANTMENT_EXPERTISE_3' + | 'ENCHANTMENT_EXPERTISE_2' + | 'ENCHANTMENT_EXPERTISE_5' + | 'ENCHANTMENT_EXPERTISE_4' + | 'ENCHANTED_BREAD' + | 'ENCHANTMENT_EXPERTISE_1' + | 'FUMING_POTATO_BOOK' + | 'ENCHANTMENT_ULTIMATE_FATAL_TEMPO_5' + | 'ENCHANTMENT_ULTIMATE_FATAL_TEMPO_3' + | 'ENCHANTMENT_DEPTH_STRIDER_2' + | 'ENCHANTMENT_BLESSING_2' + | 'SULPHUR_ORE' + | 'FLAWED_SAPPHIRE_GEM' + | 'ENCHANTMENT_ULTIMATE_FATAL_TEMPO_4' + | 'ENCHANTMENT_DEPTH_STRIDER_3' + | 'ENCHANTMENT_BLESSING_3' + | 'ENCHANTMENT_ULTIMATE_FATAL_TEMPO_1' + | 'ENCHANTMENT_ULTIMATE_FATAL_TEMPO_2' + | 'ENCHANTMENT_BLESSING_1' + | 'ENCHANTMENT_BLESSING_6' + | 'PERFECT_SAPPHIRE_GEM' + | 'ENCHANTMENT_BLESSING_4' + | 'SNOW_BLOCK' + | 'ENCHANTMENT_BLESSING_5' + | 'ENCHANTED_BAKED_POTATO' + | 'AGARIMOO_TONGUE' + | 'COMPACTOR' + | 'FROZEN_BAUBLE' + | 'MANDRAA' + | 'PYROCLASTIC_SCALE' + | 'ENCHANTMENT_DEPTH_STRIDER_1' + | 'SPOOKY_SHARD' + | 'ENCHANTMENT_CHAMPION_1' + | 'ENCHANTMENT_CHAMPION_3' + | 'SEVERED_PINCER' + | 'ENCHANTMENT_CHAMPION_2' + | 'ENCHANTMENT_CHAMPION_5' + | 'ENCHANTED_LUSH_BERBERIS' + | 'ENCHANTED_POTATO' + | 'ENCHANTMENT_CHAMPION_4' + | 'RADIOACTIVE_VIAL' + | 'ENCHANTMENT_CHAMPION_7' + | 'ENCHANTED_SLIME_BALL' + | 'ENCHANTMENT_CHAMPION_6' + | 'ENCHANTMENT_CHAMPION_9' + | 'ENCHANTMENT_CHAMPION_8' + | 'BULKY_STONE' + | 'ENCHANTMENT_SNIPE_3' + | 'ENCHANTED_RED_MUSHROOM' + | 'ENCHANTMENT_SNIPE_2' + | 'ENCHANTMENT_SNIPE_1' + | 'ENCHANTMENT_RESPIRATION_3' + | 'ENCHANTMENT_ULTIMATE_ONE_FOR_ALL_0' + | 'ENCHANTMENT_ULTIMATE_ONE_FOR_ALL_1' + | 'ENCHANTMENT_SNIPE_4' + | 'TUNGSTEN_KEY' + | 'FINE_CITRINE_GEM' + | 'GREAT_WHITE_TOOTH_MEAL' + | 'ENCHANTMENT_RESPIRATION_1' + | 'ENCHANTMENT_RESPIRATION_2' + | 'BOOKWORM_BOOK' + | 'CALCIFIED_HEART' + | 'FULL_JAW_FANGING_KIT' + | 'ENCHANTED_CAKE' + | 'PUMPKIN' + | 'WHEAT' + | 'NURSE_SHARK_TOOTH' + | 'ENCHANTMENT_REFLECTION_5' + | 'ENCHANTMENT_REFLECTION_4' + | 'TENTACLE_MEAT' + | 'ENCHANTMENT_ULTIMATE_BANK_5' + | 'SCORCHED_CRAB_STICK' + | 'ENCHANTMENT_ULTIMATE_LEGION_1' + | 'ENCHANTMENT_ULTIMATE_BANK_2' + | 'ENCHANTMENT_ULTIMATE_BANK_1' + | 'ENCHANTMENT_ULTIMATE_LEGION_2' + | 'ENCHANTED_SPIDER_EYE' + | 'ENCHANTMENT_ULTIMATE_BANK_4' + | 'ENCHANTMENT_ULTIMATE_BANK_3' + | 'ENCHANTMENT_ULTIMATE_LEGION_5' + | 'ENCHANTMENT_REFLECTION_1' + | 'ENCHANTMENT_REFLECTION_3' + | 'ENCHANTMENT_ULTIMATE_LEGION_3' + | 'ENCHANTMENT_REFLECTION_2' + | 'ENCHANTMENT_ULTIMATE_LEGION_4' + | 'RAW_SOULFLOW' + | 'ENCHANTMENT_TRIPLE_STRIKE_1' + | 'ENCHANTMENT_TRIPLE_STRIKE_3' + | 'ENCHANTMENT_TRIPLE_STRIKE_2' + | 'ENCHANTMENT_PROSPERITY_1' + | 'RAW_FISH' + | 'ENCHANTMENT_PROSPERITY_3' + | 'YOGGIE' + | 'ENCHANTMENT_PROSPERITY_2' + | 'PERFECT_JASPER_GEM' + | 'ICE_HUNK' + | 'ENCHANTMENT_PROSPERITY_5' + | 'ENCHANTMENT_HECATOMB_10' + | 'ENCHANTMENT_PROSPERITY_4' + | 'OCTOPUS_TENDRIL' + | 'CONTROL_SWITCH' + | 'ENCHANTMENT_COUNTER_STRIKE_3' + | 'DIAMOND_SPREADING' + | 'ENCHANTMENT_COUNTER_STRIKE_4' + | 'ENCHANTMENT_COUNTER_STRIKE_5' + | 'TIGHTLY_TIED_HAY_BALE' + | 'NETHER_STALK_DISTILLATE' + | 'DIVER_FRAGMENT' + | 'DARK_CANDY' + | 'ENCHANTMENT_WITHER_HUNTER_0' + | 'ENCHANTMENT_SPIKED_HOOK_5' + | 'KADA_LEAD' + | 'ENCHANTMENT_SPIKED_HOOK_6' + | 'ENCHANTMENT_SPIKED_HOOK_3' + | 'ENCHANTMENT_SPIKED_HOOK_4' + | 'ENCHANTMENT_ULTIMATE_FLOWSTATE_1' + | 'ESSENCE_DIAMOND' + | 'ENCHANTMENT_LETHALITY_1' + | 'ENCHANTMENT_LETHALITY_2' + | 'ENCHANTMENT_LETHALITY_3' + | 'ENCHANTMENT_LETHALITY_4' + | 'ENCHANTMENT_LETHALITY_5' + | 'ENCHANTMENT_LETHALITY_6' + | 'GLACITE' + | 'PLANT_MATTER' + | 'ENCHANTMENT_CLEAVE_2' + | 'BLOOD_STAINED_COINS' + | 'ENCHANTMENT_CLEAVE_1' + | 'HUGE_MUSHROOM_1' + | 'ENCHANTMENT_REJUVENATE_1' + | 'ENCHANTMENT_CLEAVE_4' + | 'HUGE_MUSHROOM_2' + | 'ENCHANTMENT_CLEAVE_3' + | 'ENCHANTMENT_CLEAVE_6' + | 'ENCHANTMENT_CLEAVE_5' + | 'ENCHANTMENT_REJUVENATE_5' + | 'ENCHANTMENT_VICIOUS_3' + | 'ENCHANTMENT_REJUVENATE_4' + | 'ENCHANTMENT_VICIOUS_4' + | 'ENCHANTMENT_REJUVENATE_3' + | 'ENCHANTMENT_VICIOUS_5' + | 'ENCHANTMENT_REJUVENATE_2' + | 'STRING' + | 'ENCHANTMENT_ULTIMATE_FLOWSTATE_3' + | 'CRUDE_GABAGOOL' + | 'ENCHANTMENT_ULTIMATE_FLOWSTATE_2' + | 'DRAGON_SCALE' + | 'ENCHANTMENT_SPIKED_HOOK_1' + | 'ENCHANTMENT_SPIKED_HOOK_2' + | 'BAYOU_WATER_ORB' + | 'ENCHANTED_CACTUS_GREEN' + | 'FRIGID_HUSK' + | 'POISON_SAMPLE' + | 'BOOSTER_COOKIE' + | 'ENCHANTED_COOKIE' + | 'AMALGAMATED_CRIMSONITE_NEW' + | 'BLAZE_ASHES' + | 'STRONG_FRAGMENT' + | 'MYCEL' + | 'AUTO_SMELTER' + | 'WOOL' + | 'ENCHANTMENT_TURBO_CARROT_2' + | 'ENCHANTMENT_TURBO_CARROT_1' + | 'SPELL_POWDER' + | 'ENCHANTMENT_ULTIMATE_REFRIGERATE_5' + | 'ENCHANTMENT_GIANT_KILLER_4' + | 'WHIPPED_MAGMA_CREAM' + | 'ENCHANTMENT_GIANT_KILLER_5' + | 'ENCHANTMENT_GIANT_KILLER_2' + | 'DRAGON_HORN' + | 'PERFECT_AMBER_GEM' + | 'ENCHANTMENT_GIANT_KILLER_3' + | 'ENCHANTMENT_GIANT_KILLER_6' + | 'FLINT' + | 'ENCHANTMENT_GIANT_KILLER_7' + | 'MAGMA_CORE' + | 'ENCHANTMENT_TRIPLE_STRIKE_5' + | 'DWARVEN_TREASURE' + | 'ENCHANTED_SPRUCE_LOG' + | 'HARDENED_WOOD' + | 'TUNGSTEN' + | 'ENCHANTMENT_TRIPLE_STRIKE_4' + | 'ENCHANTMENT_ULTIMATE_INFERNO_1' + | 'LUMINO_FIBER' + | 'ENCHANTMENT_ULTIMATE_REFRIGERATE_1' + | 'ENCHANTMENT_ULTIMATE_INFERNO_3' + | 'ENCHANTED_QUARTZ_BLOCK' + | 'ENCHANTMENT_ULTIMATE_INFERNO_2' + | 'ENCHANTMENT_ULTIMATE_REFRIGERATE_2' + | 'HEAVY_GABAGOOL' + | 'ENCHANTMENT_ULTIMATE_REFRIGERATE_3' + | 'ENCHANTMENT_ULTIMATE_INFERNO_5' + | 'ENCHANTMENT_ULTIMATE_INFERNO_4' + | 'MIXED_MITE_GEL' + | 'ENCHANTMENT_ULTIMATE_REFRIGERATE_4' + | 'GREEN_CANDY' + | 'ECCENTRIC_PAINTING' + | 'REAPER_PEPPER' + | 'ENCHANTMENT_AQUA_AFFINITY_1' + | 'GRAVEL' + | 'ENCHANTED_PACKED_ICE' + | 'HOTSPOT_WATER_ORB' + | 'FLAMING_HEART' + | 'ENCHANTED_PRISMARINE_SHARD' + | 'SPIRIT_DECOY' + | 'ENCHANTMENT_TURBO_CARROT_4' + | 'HYPERGOLIC_GABAGOOL' + | 'ENCHANTMENT_TURBO_CARROT_3' + | 'ENCHANTED_CARROT_STICK' + | 'ENCHANTMENT_TURBO_CARROT_5' + | 'TORN_CLOTH' + | 'ENCHANTMENT_TURBO_CANE_4' + | 'DRILL_ENGINE' + | 'ENCHANTMENT_TURBO_CANE_3' + | 'ENCHANTMENT_TURBO_CANE_2' + | 'ENCHANTMENT_TURBO_CANE_1' + | 'ENCHANTMENT_TURBO_CANE_5' + | 'PERFECT_CITRINE_GEM' + | 'BOX_OF_SEEDS' + | 'THIRD_MASTER_STAR' + | 'XLARGE_ENCHANTED_CHEST' + | 'VITAMIN_DEATH' + | 'PET_ITEM_TIER_BOOST_DROP' + | 'NETHERRACK' + | 'COMPOST' + | 'DARK_QUEENS_SOUL_DROP' + | 'FERMENTO' + | 'MIDAS_JEWEL' + | 'CANDY_CORN' + | 'ASCENSION_ROPE' + | 'PREMIUM_FLESH' + | 'BLUE_RING' + | 'SQUASH' + | 'ROUGH_AMETHYST_GEM' + | 'FLAWLESS_RUBY_GEM' + | 'NULL_ATOM' + | 'BLESSED_BAIT' + | 'PURE_MITHRIL' + | 'ROCK_CANDY' + | 'GLACITE_AMALGAMATION' + | 'ENCHANTMENT_FORTUNE_1' + | 'ENCHANTMENT_FORTUNE_2' + | 'LOG' + | 'ENCHANTMENT_FORTUNE_3' + | 'ENCHANTMENT_FORTUNE_4' + | 'SEARING_STONE' + | 'ENCHANTMENT_FLAME_2' + | 'ENCHANTMENT_FLAME_1' + | 'ROUGH_JADE_GEM' + | 'ENCHANTED_JUNGLE_LOG' + | 'WOOD_SINGULARITY' + | 'IRON_INGOT' + | 'CAN_OF_WORMS' + | 'GEMSTONE_MIXTURE' + | 'ENCHANTMENT_DIVINE_GIFT_3' + | 'ENCHANTMENT_DIVINE_GIFT_2' + | 'ENCHANTMENT_DIVINE_GIFT_1' + | 'SPIRIT_BONE' + | 'ROUGH_SAPPHIRE_GEM' + | 'FRIED_FEATHER' + | 'REVENANT_VISCERA' + | 'MITE_GEL' + | 'ENCHANTMENT_GIANT_KILLER_1' + | 'TARANTULA_SILK' + | 'TITANIC_EXP_BOTTLE' + | 'ENCHANTMENT_FRAIL_2' + | 'ENCHANTMENT_FRAIL_1' + | 'ENCHANTMENT_FRAIL_4' + | 'SUPER_EGG' + | 'SUPER_COMPACTOR_3000' + | 'ENCHANTMENT_FRAIL_3' + | 'ENCHANTMENT_FRAIL_6' + | 'ENCHANTMENT_FRAIL_5' + | 'MITHRIL_ORE' + | 'ENCHANTED_PAPER' + | 'HOT_STUFF' + | 'FLAWED_AQUAMARINE_GEM' + | 'WORM_BAIT' + | 'HIGHLITE' + | 'SUSPICIOUS_VIAL' + | 'DIRT_BOTTLE' + | 'ENCHANTMENT_TIDAL_3' + | 'ENCHANTMENT_TIDAL_2' + | 'ENCHANTMENT_TIDAL_1' + | 'ARACHNE_FANG' + | 'ROUGH_TOPAZ_GEM' + | 'ENCHANTED_OBSIDIAN' + | 'ROUGH_OPAL_GEM' + | 'ENCHANTMENT_EFFICIENCY_10' + | 'WEREWOLF_SKIN' + | 'ENCHANTMENT_SYPHON_3' + | 'ENCHANTMENT_SYPHON_2' + | 'ENCHANTMENT_SYPHON_5' + | 'ENCHANTMENT_SYPHON_4' + | 'ENCHANTED_RED_SAND_CUBE' + | 'ENCHANTED_RAW_FISH' + | 'BERBERIS_FUEL_INJECTOR' + | 'ENCHANTMENT_EXECUTE_6' + | 'ENCHANTMENT_INFINITE_QUIVER_10' + | 'ENCHANTMENT_EXECUTE_3' + | 'MAGMA_CHUNK' + | 'ENCHANTMENT_EXECUTE_2' + | 'ENCHANTMENT_EXECUTE_5' + | 'ENCHANTMENT_SYPHON_1' + | 'ENCHANTMENT_EXECUTE_4' + | 'ENCHANTMENT_LOOTING_4' + | 'ENCHANTMENT_SMITE_7' + | 'ENCHANTMENT_SCAVENGER_3' + | 'ENCHANTMENT_SCAVENGER_4' + | 'ENCHANTMENT_LOOTING_3' + | 'ENCHANTMENT_SCAVENGER_1' + | 'ENCHANTMENT_LOOTING_2' + | 'ENCHANTMENT_EXECUTE_1' + | 'FUEL_GABAGOOL' + | 'ENCHANTMENT_SCAVENGER_2' + | 'ENCHANTMENT_LOOTING_1' + | 'ENCHANTMENT_CUBISM_2' + | 'ENCHANTMENT_CUBISM_3' + | 'ENCHANTMENT_SCAVENGER_5' + | 'ENCHANTMENT_CUBISM_1' + | 'SHARK_BAIT' + | 'ENCHANTMENT_LOOTING_5' + | 'JUNGLE_KEY' + | 'FLAWED_CITRINE_GEM' + | 'JERRY_BOX_BLUE' + | 'ENCHANTED_SLIME_BLOCK' + | 'ENCHANTMENT_CUBISM_6' + | 'SCORCHED_BOOKS' + | 'SULPHUR' + | 'FINE_SAPPHIRE_GEM' + | 'ENCHANTMENT_CUBISM_4' + | 'ENCHANTMENT_SMITE_1' + | 'ENCHANTMENT_CUBISM_5' + | 'ENCHANTMENT_SMITE_2' + | 'GOLDEN_POWDER' + | 'ENCHANTMENT_EXPERTISE_10' + | 'ENCHANTMENT_SMITE_3' + | 'ENCHANTMENT_SMITE_4' + | 'ENCHANTED_CARROT' + | 'ENCHANTMENT_SMITE_5' + | 'ENCHANTMENT_SMITE_6' + | 'FINE_AQUAMARINE_GEM' + | 'ROTTEN_FLESH' + | 'FINE_PERIDOT_GEM' + | 'TREASURE_BAIT' + | 'ENCHANTMENT_HECATOMB_2' + | 'ENCHANTMENT_HECATOMB_3' + | 'ENCHANTMENT_HECATOMB_1' + | 'ENCHANTMENT_HECATOMB_6' + | 'ENCHANTMENT_HECATOMB_7' + | 'ENCHANTMENT_HECATOMB_4' + | 'DUNGEON_CHEST_KEY' + | 'ENCHANTMENT_HECATOMB_5' + | 'ENCHANTMENT_HECATOMB_8' + | 'ENCHANTMENT_HECATOMB_9' + | 'GOLDEN_FRAGMENT' + | 'INFLATABLE_JERRY' + | 'FLAWED_TOPAZ_GEM' + | 'ENCHANTMENT_SUNDER_1' + | 'LAPIS_CRYSTAL' + | 'FINE_AMETHYST_GEM' + | 'ENCHANTMENT_TRANSYLVANIAN_5' + | 'SAND:1' + | 'ENCHANTED_RABBIT' + | 'SUPREME_CHOCOLATE_BAR' + | 'MEDIUM_ENCHANTED_CHEST' + | 'TOXIC_ARROW_POISON' + | 'ENCHANTMENT_TRANSYLVANIAN_4' + | 'ENCHANTMENT_SUNDER_4' + | 'ENCHANTMENT_SUNDER_5' + | 'ENCHANTMENT_SUNDER_2' + | 'MUTANT_NETHER_STALK' + | 'ENCHANTMENT_SUNDER_3' + | 'ENCHANTMENT_LUCK_6' + | 'ENCHANTMENT_LUCK_7' + | 'ENCHANTMENT_SUNDER_6' + | 'ENCHANTMENT_LUCK_2' + | 'FLAWLESS_AMBER_GEM' + | 'REFINED_BOTTLE_OF_JYRRE' + | 'ENCHANTMENT_LUCK_3' + | 'ENCHANTED_BLAZE_POWDER' + | 'ENCHANTMENT_LUCK_4' + | 'ENCHANTMENT_LUCK_5' + | 'ENCHANTED_SULPHUR_CUBE' + | 'SUMMONING_EYE' + | 'ENCHANTMENT_INFINITE_QUIVER_8' + | 'ENCHANTMENT_INFINITE_QUIVER_9' + | 'ENCHANTMENT_INFINITE_QUIVER_6' + | 'FISH_BAIT' + | 'ENCHANTMENT_INFINITE_QUIVER_7' + | 'ENCHANTMENT_LUCK_1' + | 'ENCHANTMENT_ULTIMATE_WISDOM_4' + | 'ENCHANTMENT_TURBO_POTATO_3' + | 'ENCHANTMENT_INFINITE_QUIVER_4' + | 'ENCHANTMENT_BANE_OF_ARTHROPODS_2' + | 'ENCHANTMENT_TURBO_POTATO_4' + | 'ENCHANTMENT_ULTIMATE_WISDOM_5' + | 'ENCHANTMENT_INFINITE_QUIVER_5' + | 'ENCHANTMENT_BANE_OF_ARTHROPODS_3' + | 'ENCHANTMENT_TURBO_POTATO_5' + | 'ENCHANTMENT_INFINITE_QUIVER_2' + | 'ENCHANTMENT_INFINITE_QUIVER_3' + | 'ENCHANTMENT_BANE_OF_ARTHROPODS_1' + | 'ENCHANTMENT_BANE_OF_ARTHROPODS_6' + | 'ENCHANTMENT_BANE_OF_ARTHROPODS_7' + | 'ENCHANTMENT_ULTIMATE_WISDOM_1' + | 'WINTER_WATER_ORB' + | 'ENCHANTMENT_INFINITE_QUIVER_1' + | 'ENCHANTMENT_TURBO_POTATO_1' + | 'ENCHANTMENT_ULTIMATE_WISDOM_2' + | 'ENCHANTMENT_BANE_OF_ARTHROPODS_4' + | 'ENCHANTMENT_TURBO_POTATO_2' + | 'ENCHANTMENT_ULTIMATE_WISDOM_3' + | 'ENCHANTMENT_BANE_OF_ARTHROPODS_5'; + +export type SkyBlockBingoGoalType = 'ONE_TIME' | 'ONE_TIER' | 'TIERED'; + +export type SkyBlockMayor = + | 'Aatrox' + | 'Cole' + | 'Diana' + | 'Diaz' + | 'Finnegan' + | 'Foxy' + | 'Marina' + | 'Paul' + | 'Jerry' + | 'Derpy' + | 'Scorpius'; + +export type SkyBlockCandidateKeyBenefit = + | 'slayer' + | 'mining' + | 'pets' + | 'economist' + | 'farming' + | 'fishing' + | 'dungeons'; + +export type BestiaryMob = { + name: string; + kills: number; + nextTierKills: number | null; + maxKills: number; + tier: number; + maxTier: number; +}; + +export type BestiaryCategory = { + name: string; + mobs: BestiaryMob[]; + mobsUnlocked: number; + mobsMaxed: number; +}; + +export type BestiaryStats = { + level: number; + maxLevel: number; + familiesUnlocked: number; + familiesCompleted: number; + totalFamilies: number; + familyTiers: number; + maxFamilyTiers: number; + categories: Record; +}; + +export interface RawBestiaryMob { + name: string; + cap: number; + mobs: string[]; + bracket: number; +} + +export interface RawBestiaryIsland { + name: string; + mobs: RawBestiaryMob[]; +} + +export interface BestiaryMobsData { + dynamic: RawBestiaryIsland; + hub: RawBestiaryIsland; + farming_1: RawBestiaryIsland; + combat_1: RawBestiaryIsland; + combat_3: RawBestiaryIsland; + crimson_isle: RawBestiaryIsland; + mining_2: RawBestiaryIsland; + mining_3: RawBestiaryIsland; + crystal_hollows: RawBestiaryIsland; + foraging_1: RawBestiaryIsland; + spooky_festival: RawBestiaryIsland; + mythological_creatures: RawBestiaryIsland; + jerry: RawBestiaryIsland; + kuudra: RawBestiaryIsland; + fishing: { + name: string; + hasSubcategories: boolean; + fishing: RawBestiaryIsland; + lava: RawBestiaryIsland; + spooky_festival: RawBestiaryIsland; + fishing_festival: RawBestiaryIsland; + winter: RawBestiaryIsland; + backwater_bayou: RawBestiaryIsland; + }; + catacombs: RawBestiaryIsland; + garden: RawBestiaryIsland; +} diff --git a/src/Types/Skyblock.ts b/src/Types/Skyblock.ts deleted file mode 100644 index f3309e2bf..000000000 --- a/src/Types/Skyblock.ts +++ /dev/null @@ -1,416 +0,0 @@ -import SkyblockInventoryItem from '../Structures/SkyBlock/SkyblockInventoryItem.js'; - -export type SkyblockGemstoneQuality = 'Rough' | 'Flawed' | 'Fine' | 'Flawless' | 'Perfect'; -export type TrophyFishRank = 'Bronze' | 'Silver' | 'Gold' | 'Diamond'; -export type DungeonClass = 'healer' | 'mage' | 'berserk' | 'archer' | 'tank'; -export type CrimsonIsleFactions = 'mages' | 'barbarians'; -export type CrimsonIsleBelt = 'White' | 'Yellow' | 'Green' | 'Blue' | 'Brown' | 'Black'; -export type CrimsonIsleDojoRank = 'S' | 'A' | 'B' | 'C' | 'D' | 'F'; -export type Rarity = - | 'COMMON' - | 'UNCOMMON' - | 'RARE' - | 'EPIC' - | 'LEGENDARY' - | 'MYTHIC' - | 'DIVINE' - | 'SPECIAL' - | 'VERY_SPECIAL'; - -export interface Equipment { - gauntlet: SkyblockInventoryItem | null; - belt: SkyblockInventoryItem | null; - cloak: SkyblockInventoryItem | null; - necklace: SkyblockInventoryItem | null; -} - -export interface Armor { - helmet: SkyblockInventoryItem | null; - chestplate: SkyblockInventoryItem | null; - leggings: SkyblockInventoryItem | null; - boots: SkyblockInventoryItem | null; -} - -export interface MemberStatsCandyCollected { - green: number; - purple: number; - total: number; -} - -export interface MemberStatsFestival { - year: number; - collected: MemberStatsCandyCollected; -} - -export interface MemberStatsCandy extends MemberStatsCandyCollected { - festivals: MemberStatsFestival[]; -} - -export interface MemberStatsPetMilestones { - oresMinned: number; - seaCreaturesKilled: number; -} - -export interface MemberStatsAuctionsStats { - uncommon: number; - common: number; - rare: number; - epic: number; - legendary: number; - special: number; - mythic: number; - total: number; -} - -export interface MemberStatsAuctions { - bids: number; - highestBid: number; - goldSpent: number; - goldEarnt: number; - auctionsWon: number; - auctionsCompleted: number; - auctionsCreated: number; - auctionFees: number; - auctionsWithOutBids: number; - sold: MemberStatsAuctionsStats; - bought: MemberStatsAuctionsStats; -} - -export interface MemberStatsGifts { - given: number; - received: number; -} - -export interface MemberStatsFishing { - total: number; - normal: number; - tresure: number; - largeTresure: number; -} - -export interface MemberStatsBurrow { - total: number; - common: number; -} - -export interface MemberStatsMythos { - kills: number; - burrowsDugNext: MemberStatsBurrow; - burrowsDugCombat: MemberStatsBurrow; - burrowsDugTreasure: MemberStatsBurrow; - burrowsDugComplate: MemberStatsBurrow; -} - -export interface JacobDataMedals { - gold: number; - silver: number; - bronze: number; -} - -export interface JacobDataPerks { - doubleDrops: number; - farmingLevelCap: number; - personalBests: boolean; -} - -export interface JacobData { - medals: JacobDataMedals; - perks: JacobDataPerks; - contests: Record; -} - -export interface ChocolateFactoryDataEmployees { - bro: number; - cousin: number; - sis: number; - father: number; - grandma: number; - dog: number; - uncle: number; -} - -export interface ChocolateFactoryDataChocolate { - current: number; - total: number; - sincePrestige: number; -} - -export interface ChocolateFactoryDataTimeTower { - charges: number; - level: number; -} - -export interface ChocolateFactoryDataUpgrades { - click: number; - multiplier: number; - rabbitRarity: number; -} - -export interface ChocolateFactoryDataGoldenClick { - amount: number; - year: number; -} - -export interface ChocolateFactoryData { - employees: ChocolateFactoryDataEmployees; - chocolate: ChocolateFactoryDataChocolate; - timeTower: ChocolateFactoryDataTimeTower; - upgrades: ChocolateFactoryDataUpgrades; - goldenClick: ChocolateFactoryDataGoldenClick; - barnCapacity: number; - prestige: number; -} - -export interface SlayerData { - xp: number; - tier1: number; - tier2: number; - tier3: number; - tier4: number; - tier5: number; - level: number; -} - -export interface Slayer { - zombie: SlayerData; - spider: SlayerData; - wolf: SlayerData; - enderman: SlayerData; - blaze: SlayerData; - vampire: SlayerData; -} -export interface SkillLevel { - xp: number; - level: number; - maxLevel: number; - xpCurrent: number; - xpForNext: number; - progress: number; - cosmetic: boolean; -} - -export interface Skills { - combat: SkillLevel; - farming: SkillLevel; - fishing: SkillLevel; - mining: SkillLevel; - foraging: SkillLevel; - enchanting: SkillLevel; - alchemy: SkillLevel; - carpentry: SkillLevel; - runecrafting: SkillLevel; - taming: SkillLevel; - social: SkillLevel; - average: number; -} - -export interface RawDungeonRun { - timestamp: number; - score_exploration: number; - score_speed: number; - score_skill: number; - score_bonus: number; - dungeon_class: DungeonClass; - teammates: string[]; - elapsed_time: number; - damage_dealt: number; - deaths: number; - mobs_killed: number; - secrets_found: number; - damage_mitigated: number; - ally_healing: number; -} - -export interface DungeonsFloorStats { - fastestRun: RawDungeonRun; - fastestSRun: RawDungeonRun; - fastestSPlusRun: RawDungeonRun; - completions: number; -} - -export interface DungeonsFloors { - entrance: DungeonsFloorStats; - floor1: DungeonsFloorStats; - floor2: DungeonsFloorStats; - floor3: DungeonsFloorStats; - floor4: DungeonsFloorStats; - floor5: DungeonsFloorStats; - floor6: DungeonsFloorStats; - floor7: DungeonsFloorStats; - masterMode1: DungeonsFloorStats; - masterMode2: DungeonsFloorStats; - masterMode3: DungeonsFloorStats; - masterMode4: DungeonsFloorStats; - masterMode5: DungeonsFloorStats; - masterMode6: DungeonsFloorStats; - masterMode7: DungeonsFloorStats; -} - -export interface DungeonsClasses { - healer: SkillLevel; - mage: SkillLevel; - berserk: SkillLevel; - archer: SkillLevel; - tank: SkillLevel; - selected: DungeonClass; -} - -export interface DungeonsEssence { - diamond: number; - dragon: number; - spider: number; - wither: number; - undead: number; - gold: number; - ice: number; - crimson: number; -} -export interface DungeonsCompletions { - catacombs: Record; - masterMode: Record; -} - -export interface Dungeons { - experience: SkillLevel; - secrets: number; - completions: DungeonsCompletions; - floors: DungeonsFloors; - classes: DungeonsClasses; - essence: DungeonsEssence; -} - -export interface CrimsonIsleKuudra { - none: number; - hot: number; - burning: number; - fiery: number; - highestWaveHot: number; - highestWaveFiery: number; - infernal: number; - highestWaveInfernal: number; - highestWaveBurning: number; -} - -export interface CrimsonIsleReputation { - mages: number; - barbarians: number; -} - -export interface CrimsonIsleTrophyFishCaught { - total: number; - bronze: number; - silver: number; - gold: number; - diamond: number; -} - -export interface CrimsonIsleTrophyFish { - rank: TrophyFishRank; - caught: CrimsonIsleTrophyFishCaught; -} - -export interface CrimsonIsleDojoMinigame { - points: number; - rank: CrimsonIsleDojoRank; -} - -export interface CrimsonIsleDojo { - belt: CrimsonIsleBelt; - force: CrimsonIsleDojoMinigame; - stamina: CrimsonIsleDojoMinigame; - mastery: CrimsonIsleDojoMinigame; - discipline: CrimsonIsleDojoMinigame; - swiftness: CrimsonIsleDojoMinigame; - control: CrimsonIsleDojoMinigame; - tenacity: CrimsonIsleDojoMinigame; -} - -export interface CrimsonIsle { - faction: CrimsonIsleFactions | null; - reputation: CrimsonIsleReputation; - trophyFish: CrimsonIsleTrophyFish; - dojo: CrimsonIsleDojo; - kuudra: CrimsonIsleKuudra; -} - -export interface HOTMPowderData { - spent: number; - current: number; - total: number; -} - -export interface HOTMPowder { - mithril: HOTMPowderData; - gemstone: HOTMPowderData; - glacite: HOTMPowderData; -} - -export interface HOTM { - experience: SkillLevel; - ability: string; - powder: HOTMPowder; -} -export interface SkyblockGardenVisitorServed { - total: number; - unique: number; -} - -export interface SkyblockGardenVisitor { - visited: Record; - completed: Record; - served: SkyblockGardenVisitorServed; -} - -export interface SkyblockGardenComposterUpgrades { - speed: number; - multiDrop: number; - fuelCap: number; - organicMatterCap: number; - costReduction: number; -} - -export interface SkyblockGardenComposter { - organicMatter: number; - fuelUnits: number; - compostUnits: number; - compostItems: number; - conversionTicks: number; - upgrades: SkyblockGardenComposterUpgrades; -} - -export interface SkyblockGarenCrops { - wheat: number; - carrot: number; - sugarCane: number; - potato: number; - pumpkin: number; - melon: number; - cactus: number; - cocoaBeans: number; - mushroom: number; - netherWart: number; -} - -export interface SkyblockGardenCropMilestones { - wheat: SkillLevel; - carrot: SkillLevel; - sugarCane: SkillLevel; - potato: SkillLevel; - pumpkin: SkillLevel; - melon: SkillLevel; - cactus: SkillLevel; - cocoaBeans: SkillLevel; - mushroom: SkillLevel; - netherWart: SkillLevel; -} - -export interface ProductStatus { - sellPrice: number; - buyPrice: number; - sellVolume: number; - buyVolume: number; - sellMovingWeek: number; - buyMovingWeek: number; - sellOrders: number; - buyOrders: number; -} diff --git a/src/Types/Static.ts b/src/Types/Static.ts index b16d4a838..dd71a8821 100644 --- a/src/Types/Static.ts +++ b/src/Types/Static.ts @@ -1,3 +1,5 @@ +/* v8 ignore next 10000 */ + export type QuestObjectiveType = 'Integer' | 'Boolean'; export type QuestType = 'Daily' | 'Weekly'; diff --git a/src/Utils/Constants.ts b/src/Utils/Constants.ts index 80de84086..6bcf32c6f 100644 --- a/src/Utils/Constants.ts +++ b/src/Utils/Constants.ts @@ -1,3 +1,11 @@ +import type { + BestiaryMobsData, + CustomPetLevelingData, + MiningForgeItemsData, + Rarity, + SkyBlockSlayer, + SkyBlockXPTables +} from '../Types/SkyBlock.js'; import type { DuelsBaseDivision } from '../Types/Player.js'; import type { GameCode, GameID, GameString } from '../Types/Game.js'; @@ -86,7 +94,6 @@ export const MiniGamesString: { [key: string]: string } = { }; // Credits (pit) https://github.com/PitPanda/PitPandaProduction/blob/b1971f56ea1aa8c829b722cbb33247c96591c0cb/structures/Pit.js - interface PitPrestigeData { Multiplier: number; TotalXp: number; @@ -169,2035 +176,3188 @@ export const pit: { Prestiges: PitPrestigeData[]; Levels: PitLevelData[] } = { ] }; -export const bestiaryBrackets: { [key: number]: number[] } = { - 1: [ - 20, 40, 60, 100, 200, 400, 800, 1400, 2000, 3000, 6000, 12000, 20000, 30000, 40000, 50000, 60000, 72000, 86000, - 100000, 200000, 400000, 600000, 800000, 1000000 - ], - 2: [ - 5, 10, 15, 25, 50, 100, 200, 350, 500, 750, 1500, 3000, 5000, 7500, 10000, 12500, 15000, 18000, 21500, 25000, 50000, - 100000, 150000, 200000, 250000 - ], - 3: [ - 4, 8, 12, 16, 20, 40, 80, 140, 200, 300, 600, 1200, 2000, 3000, 4000, 5000, 6000, 7200, 8600, 10000, 20000, 40000, - 60000, 80000, 100000 - ], - 4: [ - 2, 4, 6, 10, 15, 20, 25, 35, 50, 75, 150, 300, 500, 750, 1000, 1350, 1650, 2000, 2500, 3000, 5000, 10000, 15000, - 20000, 25000 - ], - 5: [ - 1, 2, 3, 5, 7, 10, 15, 20, 25, 30, 60, 120, 200, 300, 400, 500, 600, 720, 860, 1000, 2000, 4000, 6000, 8000, 10000 - ], - 6: [1, 2, 3, 5, 7, 9, 14, 17, 21, 25, 50, 80, 125, 175, 250, 325, 425, 525, 625, 750, 1500], - 7: [1, 2, 3, 5, 7, 9, 11, 14, 17, 20, 30, 40, 55, 75, 100, 150, 200, 275, 375, 500, 1000] +// credit: https://github.com/SkyCryptWebsite/SkyCrypt/blob/b9842bea6f1494fa2d2fd005b64f57d84646c188/src/constants/forge.js#L1 (Modified) +// Times in milliseconds +export const MiningForgeItems: MiningForgeItemsData = { + REFINED_DIAMOND: { name: 'Refined Diamond', duration: 28800000 }, + REFINED_MITHRIL: { name: 'Refined Mithril', duration: 21600000 }, + REFINED_TITANIUM: { name: 'Refined Titanium', duration: 43200000 }, + REFINED_TUNGSTEN: { name: 'Refined Tungsten', duration: 3600000 }, + REFINED_UMBER: { name: 'Refined Umber', duration: 3600000 }, + MITHRIL_NECKLACE: { name: 'Mithril Necklace', duration: 3600000 }, + MITHRIL_CLOAK: { name: 'Mithril Cloak', duration: 3600000 }, + MITHRIL_BELT: { name: 'Mithril Belt', duration: 3600000 }, + MITHRIL_GAUNTLET: { name: 'Mithril Gauntlet', duration: 3600000 }, + TITANIUM_NECKLACE: { name: 'Titanium Necklace', duration: 16200000 }, + TITANIUM_CLOAK: { name: 'Titanium Cloak', duration: 16200000 }, + TITANIUM_BELT: { name: 'Titanium Belt', duration: 16200000 }, + TITANIUM_GAUNTLET: { name: 'Titanium Gauntlet', duration: 16200000 }, + TITANIUM_TALISMAN: { name: 'Titanium Talisman', duration: 50400000 }, + TITANIUM_RING: { name: 'Titanium Ring', duration: 72000000 }, + TITANIUM_ARTIFACT: { name: 'Titanium Artifact', duration: 129600000 }, + TITANIUM_RELIC: { name: 'Titanium Relic', duration: 259200000 }, + DIVAN_POWDER_COATING: { name: 'Divan Powder Coating', duration: 129600000 }, + DIVAN_HELMET: { name: 'Helmet Of Divan', duration: 86400000 }, + DIVAN_CHESTPLATE: { name: 'Chestplate Of Divan', duration: 86400000 }, + DIVAN_LEGGINGS: { name: 'Leggings Of Divan', duration: 86400000 }, + DIVAN_BOOTS: { name: 'Boots Of Divan', duration: 86400000 }, + AMBER_NECKLACE: { name: 'Amber Necklace', duration: 86400000 }, + SAPPHIRE_CLOAK: { name: 'Sapphire Cloak', duration: 86400000 }, + JADE_BELT: { name: 'Jade Belt', duration: 86400000 }, + AMETHYST_GAUNTLET: { name: 'Amethyst Gauntlet', duration: 86400000 }, + GEMSTONE_CHAMBER: { name: 'Gemstone Chamber', duration: 14400000 }, + DWARVEN_HANDWARMERS: { name: 'Dwarven Handwarmers', duration: 14400000 }, + DWARVEN_METAL: { name: 'Dwarven Metal Talisman', duration: 86400000 }, + DIVAN_PENDANT: { name: 'Pendant of Divan', duration: 604800000 }, + POWER_RELIC: { name: 'Relic of Power', duration: 28800000 }, + PERFECT_AMBER_GEM: { name: 'Perfect Amber Gemstone', duration: 72000000 }, + PERFECT_AMETHYST_GEM: { name: 'Perfect Amethyst Gemstone', duration: 72000000 }, + PERFECT_JADE_GEM: { name: 'Perfect Jade Gemstone', duration: 72000000 }, + PERFECT_JASPER_GEM: { name: 'Perfect Jasper Gemstone', duration: 72000000 }, + PERFECT_OPAL_GEM: { name: 'Perfect Opal Gemstone', duration: 72000000 }, + PERFECT_RUBY_GEM: { name: 'Perfect Ruby Gemstone', duration: 72000000 }, + PERFECT_SAPPHIRE_GEM: { name: 'Perfect Sapphire Gemstone', duration: 72000000 }, + PERFECT_TOPAZ_GEM: { name: 'Perfect Topaz Gemstone', duration: 72000000 }, + PERFECT_AQUAMARINE_GEM: { name: 'Perfect Aquamarine Gem', duration: 72000000 }, + PERFECT_CITRINE_GEM: { name: 'Perfect Citrine Gem', duration: 72000000 }, + PERFECT_ONYX_GEM: { name: 'Perfect Onyx Gem', duration: 72000000 }, + PERFECT_PERIDOT_GEM: { name: 'Perfect Peridot Gem', duration: 72000000 }, + BEJEWELED_HANDLE: { name: 'Bejeweled Handle', duration: 30000 }, + DRILL_ENGINE: { name: 'Drill Motor', duration: 108000000 }, + FUEL_TANK: { name: 'Fuel Canister', duration: 36000000 }, + GEMSTONE_MIXTURE: { name: 'Gemstone Mixture', duration: 14400000 }, + GLACITE_AMALGAMATION: { name: 'Glacite Amalgamation', duration: 14400000 }, + GOLDEN_PLATE: { name: 'Golden Plate', duration: 21600000 }, + MITHRIL_PLATE: { name: 'Mithril Plate', duration: 64800000 }, + TUNGSTEN_PLATE: { name: 'Tungsten Plate', duration: 10800000 }, + UMBER_PLATE: { name: 'Umber Plate', duration: 10800000 }, + PERFECT_PLATE: { name: 'Perfect Plate', duration: 1800000 }, + DIAMONITE: { name: 'Diamonite', duration: 21600000 }, + POCKET_ICEBERG: { name: 'Pocket Iceberg', duration: 21600000 }, + PETRIFIED_STARFALL: { name: 'Petrified Starfall', duration: 21600000 }, + PURE_MITHRIL: { name: 'Pure Mithril', duration: 21600000 }, + ROCK_GEMSTONE: { name: 'Dwarven Geode', duration: 21600000 }, + TITANIUM_TESSERACT: { name: 'Titanium Tesseract', duration: 21600000 }, + GLEAMING_CRYSTAL: { name: 'Gleaming Crystal', duration: 21600000 }, + HOT_STUFF: { name: 'Scorched Topaz', duration: 21600000 }, + AMBER_MATERIAL: { name: 'Amber Material', duration: 21600000 }, + FRIGID_HUSK: { name: 'Frigid Husk', duration: 21600000 }, + BEJEWELED_COLLAR: { name: 'Bejeweled Collar', duration: 7200000 }, + MOLE: { name: '[Lvl 1] Mole', duration: 259200000 }, + AMMONITE: { name: '[Lvl 1] Ammonite', duration: 259200000 }, + PENGUIN: { name: '[Lvl 1] Penguin', duration: 604800000 }, + TYRANNOSAURUS: { name: '[Lvl 1] T-Rex', duration: 604800000 }, + SPINOSAURUS: { name: '[Lvl 1] Spinosaurus', duration: 604800000 }, + GOBLIN: { name: '[Lvl 1] Goblin', duration: 604800000 }, + ANKYLOSAURUS: { name: '[Lvl 1] Ankylosaurus', duration: 604800000 }, + MAMMOTH: { name: '[Lvl 1] Mammoth', duration: 604800000 }, + MITHRIL_DRILL_1: { name: 'Mithril Drill SX-R226', duration: 14400000 }, + MITHRIL_DRILL_2: { name: 'Mithril Drill SX-R326', duration: 30000 }, + GEMSTONE_DRILL_1: { name: 'Ruby Drill TX-15', duration: 14400000 }, + GEMSTONE_DRILL_2: { name: 'Gemstone Drill LT-522', duration: 30000 }, + GEMSTONE_DRILL_3: { name: 'Topaz Drill KGR-12', duration: 30000 }, + GEMSTONE_DRILL_4: { name: 'Jasper Drill X', duration: 30000 }, + POLISHED_TOPAZ_ROD: { name: 'Polished Topaz Rod', duration: 43200000 }, + TITANIUM_DRILL_1: { name: 'Titanium Drill DR-X355', duration: 14400000 }, + TITANIUM_DRILL_2: { name: 'Titanium Drill DR-X455', duration: 30000 }, + TITANIUM_DRILL_3: { name: 'Titanium Drill DR-X555', duration: 30000 }, + TITANIUM_DRILL_4: { name: 'Titanium Drill DR-X655', duration: 30000 }, + CHISEL: { name: 'Chisel', duration: 14400000 }, + REINFORCED_CHISEL: { name: 'Reinforced Chisel', duration: 30000 }, + GLACITE_CHISEL: { name: 'Glacite-Plated Chisel', duration: 30000 }, + PERFECT_CHISEL: { name: 'Perfect Chisel', duration: 30000 }, + DIVAN_DRILL: { name: "Divan's Drill", duration: 30000 }, + STARFALL_SEASONING: { name: 'Starfall Seasoning', duration: 64800000 }, + GOBLIN_OMELETTE: { name: 'Goblin Omelette', duration: 64800000 }, + GOBLIN_OMELETTE_BLUE_CHEESE: { name: 'Blue Cheese Goblin Omelette', duration: 64800000 }, + GOBLIN_OMELETTE_PESTO: { name: 'Pesto Goblin Omelette', duration: 64800000 }, + GOBLIN_OMELETTE_SPICY: { name: 'Spicy Goblin Omelette', duration: 64800000 }, + GOBLIN_OMELETTE_SUNNY_SIDE: { name: 'Sunny Side Goblin Omelette', duration: 64800000 }, + TUNGSTEN_KEYCHAIN: { name: 'Tungsten Regulator', duration: 64800000 }, + MITHRIL_DRILL_ENGINE: { name: 'Mithril-Plated Drill Engine', duration: 86400000 }, + TITANIUM_DRILL_ENGINE: { name: 'Titanium-Plated Drill Engine', duration: 30000 }, + RUBY_POLISHED_DRILL_ENGINE: { name: 'Ruby-polished Drill Engine', duration: 30000 }, + SAPPHIRE_POLISHED_DRILL_ENGINE: { name: 'Sapphire-polished Drill Engine', duration: 30000 }, + AMBER_POLISHED_DRILL_ENGINE: { name: 'Amber-polished Drill Engine', duration: 30000 }, + MITHRIL_FUEL_TANK: { name: 'Mithril-Infused Fuel Tank', duration: 86400000 }, + TITANIUM_FUEL_TANK: { name: 'Titanium-Infused Fuel Tank', duration: 30000 }, + GEMSTONE_FUEL_TANK: { name: 'Gemstone Fuel Tank', duration: 30000 }, + PERFECTLY_CUT_FUEL_TANK: { name: 'Perfectly-Cut Fuel Tank', duration: 30000 }, + BEACON_2: { name: 'Beacon II', duration: 72000000 }, + BEACON_3: { name: 'Beacon III', duration: 108000000 }, + BEACON_4: { name: 'Beacon IV', duration: 144000000 }, + BEACON_5: { name: 'Beacon V', duration: 180000000 }, + FORGE_TRAVEL_SCROLL: { name: 'Travel Scroll to the Dwarven Forge', duration: 18000000 }, + BASE_CAMP_TRAVEL_SCROLL: { name: 'Travel Scroll to the Dwarven Base Camp', duration: 36000000 }, + POWER_CRYSTAL: { name: 'Power Crystal', duration: 7200000 }, + SECRET_RAILROAD_PASS: { name: 'Secret Railroad Pass', duration: 30000 }, + TUNGSTEN_KEY: { name: 'Tungsten Key', duration: 1800000 }, + UMBER_KEY: { name: 'Umber Key', duration: 1800000 }, + SKELETON_KEY: { name: 'Skeleton Key', duration: 1800000 }, + PORTABLE_CAMPFIRE: { name: 'Portable Campfire', duration: 1800000 }, + UNKNOWN: { name: 'UNKNOWN', duration: 0 } }; -export const petLevels: number[] = [ - 100, 110, 120, 130, 145, 160, 175, 190, 210, 230, 250, 275, 300, 330, 360, 400, 440, 490, 540, 600, 660, 730, 800, - 880, 960, 1050, 1150, 1260, 1380, 1510, 1650, 1800, 1960, 2130, 2310, 2500, 2700, 2920, 3160, 3420, 3700, 4000, 4350, - 4750, 5200, 5700, 6300, 7000, 7800, 8700, 9700, 10800, 12000, 13300, 14700, 16200, 17800, 19500, 21300, 23200, 25200, - 27400, 29800, 32400, 35200, 38200, 41400, 44800, 48400, 52200, 56200, 60400, 64800, 69400, 74200, 79200, 84700, 90700, - 97200, 104200, 111700, 119700, 128200, 137200, 146700, 156700, 167700, 179700, 192700, 206700, 221700, 237700, 254700, - 272700, 291700, 311700, 333700, 357700, 383700, 411700, 441700, 476700, 516700, 561700, 611700, 666700, 726700, - 791700, 861700, 936700, 1016700, 1101700, 1191700, 1286700, 1386700, 1496700, 1616700, 1746700, 1886700, 0, 5555, - 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, - 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, - 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, - 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, - 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, - 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, - 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, - 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700 -]; +export const MiningForgeQuickForgeMultiplier: { [key: number]: number } = { + 0: 1, + 1: 0.895, + 2: 0.89, + 3: 0.885, + 4: 0.88, + 5: 0.875, + 6: 0.87, + 7: 0.865, + 8: 0.86, + 9: 0.855, + 10: 0.85, + 11: 0.845, + 12: 0.84, + 13: 0.835, + 14: 0.83, + 15: 0.825, + 16: 0.82, + 17: 0.815, + 18: 0.81, + 19: 0.805, + 20: 0.7 +}; -export const petScore: { [key: string]: number } = { +export const magicalPowerValues: { [key in Rarity | 'UNKNOWN']: number } = { + COMMON: 3, + UNCOMMON: 5, + RARE: 8, + EPIC: 12, + LEGENDARY: 16, + MYTHIC: 22, + SPECIAL: 3, + VERY_SPECIAL: 5, + DIVINE: 0, + UNKNOWN: 0 +}; + +export const petScore: { [key in Rarity | 'UNKNOWN']: number } = { COMMON: 1, UNCOMMON: 2, RARE: 3, EPIC: 4, LEGENDARY: 5, MYTHIC: 6, - VERY_SPECIAL: 6 + VERY_SPECIAL: 6, + DIVINE: 0, + SPECIAL: 0, + UNKNOWN: 0 }; -export const petRarityOffset: { [key: string]: number } = { + +export const petRarityOffset: { [key in Rarity | 'UNKNOWN']: number } = { COMMON: 0, UNCOMMON: 6, RARE: 11, EPIC: 16, LEGENDARY: 20, - MYTHIC: 20 + MYTHIC: 20, + DIVINE: 0, + SPECIAL: 0, + VERY_SPECIAL: 0, + UNKNOWN: 0 +}; + +export const PetLevels: number[] = [ + 100, 110, 120, 130, 145, 160, 175, 190, 210, 230, 250, 275, 300, 330, 360, 400, 440, 490, 540, 600, 660, 730, 800, + 880, 960, 1050, 1150, 1260, 1380, 1510, 1650, 1800, 1960, 2130, 2310, 2500, 2700, 2920, 3160, 3420, 3700, 4000, 4350, + 4750, 5200, 5700, 6300, 7000, 7800, 8700, 9700, 10800, 12000, 13300, 14700, 16200, 17800, 19500, 21300, 23200, 25200, + 27400, 29800, 32400, 35200, 38200, 41400, 44800, 48400, 52200, 56200, 60400, 64800, 69400, 74200, 79200, 84700, 90700, + 97200, 104200, 111700, 119700, 128200, 137200, 146700, 156700, 167700, 179700, 192700, 206700, 221700, 237700, 254700, + 272700, 291700, 311700, 333700, 357700, 383700, 411700, 441700, 476700, 516700, 561700, 611700, 666700, 726700, + 791700, 861700, 936700, 1016700, 1101700, 1191700, 1286700, 1386700, 1496700, 1616700, 1746700, 1886700 +]; + +export const CustomPetLeveling: CustomPetLevelingData = { + GOLDEN_DRAGON: { + type: 1, + petLevels: [ + 0, 5555, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, + 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, + 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, + 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, + 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, + 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, + 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, + 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, + 1886700, 1886700, 1886700 + ], + maxLevel: 200 + }, + BINGO: { + rarityOffset: { + UNKNOWN: 0, + COMMON: 0, + UNCOMMON: 0, + RARE: 0, + EPIC: 0, + LEGENDARY: 0, + MYTHIC: 0, + DIVINE: 0, + SPECIAL: 0, + VERY_SPECIAL: 0 + } + }, + REINDEER: { + xpMultiplier: 2 + } }; -export default { - levelingXp: { - 1: 50, - 2: 125, +export const SLAYER_XP: { [key in SkyBlockSlayer]: Record } = { + zombie: { + 1: 5, + 2: 15, 3: 200, - 4: 300, - 5: 500, - 6: 750, - 7: 1000, - 8: 1500, - 9: 2000, - 10: 3500, - 11: 5000, - 12: 7500, - 13: 10000, - 14: 15000, - 15: 20000, - 16: 30000, - 17: 50000, - 18: 75000, - 19: 100000, - 20: 200000, - 21: 300000, - 22: 400000, - 23: 500000, - 24: 600000, - 25: 700000, - 26: 800000, - 27: 900000, - 28: 1000000, - 29: 1100000, - 30: 1200000, - 31: 1300000, - 32: 1400000, - 33: 1500000, - 34: 1600000, - 35: 1700000, - 36: 1800000, - 37: 1900000, - 38: 2000000, - 39: 2100000, - 40: 2200000, - 41: 2300000, - 42: 2400000, - 43: 2500000, - 44: 2600000, - 45: 2750000, - 46: 2900000, - 47: 3100000, - 48: 3400000, - 49: 3700000, - 50: 4000000, - 51: 4300000, - 52: 4600000, - 53: 4900000, - 54: 5200000, - 55: 5500000, - 56: 5800000, - 57: 6100000, - 58: 6400000, - 59: 6700000, - 60: 7000000 + 4: 1000, + 5: 5000, + 6: 20000, + 7: 100000, + 8: 400000, + 9: 1000000 }, - runecraftingXp: { - 1: 50, - 2: 100, - 3: 125, - 4: 160, - 5: 200, - 6: 250, - 7: 315, - 8: 400, - 9: 500, - 10: 625, - 11: 785, - 12: 1000, - 13: 1250, - 14: 1600, - 15: 2000, - 16: 2465, - 17: 3125, - 18: 4000, - 19: 5000, - 20: 6200, - 21: 7800, - 22: 9800, - 23: 12200, - 24: 15300, - 25: 19050 + spider: { + 1: 5, + 2: 25, + 3: 200, + 4: 1000, + 5: 5000, + 6: 20000, + 7: 100000, + 8: 400000, + 9: 1000000 }, - skillsCap: { - taming: 60, - farming: 60, - mining: 60, - combat: 60, - foraging: 50, - fishing: 50, - enchanting: 60, - alchemy: 50, - carpentry: 50, - runecrafting: 25, - dungeons: 50, - social: 25, - hotm: 10, - garden: 15 + wolf: { + 1: 10, + 2: 30, + 3: 250, + 4: 1500, + 5: 5000, + 6: 20000, + 7: 100000, + 8: 400000, + 9: 1000000 }, - dungeonXp: { - 1: 50, - 2: 75, - 3: 110, - 4: 160, - 5: 230, - 6: 330, - 7: 470, - 8: 670, - 9: 950, - 10: 1340, - 11: 1890, - 12: 2665, - 13: 3760, - 14: 5260, - 15: 7380, - 16: 10300, - 17: 14400, - 18: 20000, - 19: 27600, - 20: 38000, - 21: 52500, - 22: 71500, - 23: 97000, - 24: 132000, - 25: 180000, - 26: 243000, - 27: 328000, - 28: 445000, - 29: 600000, - 30: 800000, - 31: 1065000, - 32: 1410000, - 33: 1900000, - 34: 2500000, - 35: 3300000, - 36: 4300000, - 37: 5600000, - 38: 7200000, - 39: 9200000, - 40: 1.2e7, - 41: 1.5e7, - 42: 1.9e7, - 43: 2.4e7, - 44: 3e7, - 45: 3.8e7, - 46: 4.8e7, - 47: 6e7, - 48: 7.5e7, - 49: 9.3e7, - 50: 1.1625e8, - 55: 1e9 + enderman: { + 1: 10, + 2: 30, + 3: 250, + 4: 1500, + 5: 5000, + 6: 20000, + 7: 100000, + 8: 400000, + 9: 1000000 }, - hotmXp: { 1: 0, 2: 3000, 3: 9000, 4: 25000, 5: 60000, 6: 100000, 7: 150000, 8: 210000, 9: 290000, 10: 400000 }, - socialXp: { - 1: 50, - 2: 100, - 3: 150, - 4: 250, - 5: 500, - 6: 750, - 7: 1000, - 8: 1250, - 9: 1500, - 10: 2000, - 11: 2500, - 12: 3000, - 13: 3750, - 14: 4500, - 15: 6000, - 16: 8000, - 17: 10000, - 18: 12500, - 19: 15000, - 20: 20000, - 21: 25000, - 22: 30000, - 23: 35000, - 24: 40000, - 25: 50000 + blaze: { + 1: 10, + 2: 30, + 3: 250, + 4: 1500, + 5: 5000, + 6: 20000, + 7: 100000, + 8: 400000, + 9: 1000000 }, - garden: { - 1: 0, - 2: 70, - 3: 70, - 4: 140, - 5: 240, - 6: 600, - 7: 1500, - 8: 2000, - 9: 2500, - 10: 3000, - 11: 10000, - 12: 10000, - 13: 10000, - 14: 10000, - 15: 10000 + vampire: { + 1: 20, + 2: 75, + 3: 240, + 4: 840, + 5: 2400 + } +}; + +export const DEFAULT_SKILL_CAPS: { [key in SkyBlockXPTables]: number } = { + farming: 50, + mining: 60, + combat: 60, + foraging: 50, + fishing: 50, + enchanting: 60, + alchemy: 50, + taming: 50, + carpentry: 50, + runecrafting: 25, + social: 25, + dungeoneering: 50, + default: 0, + hotm: 10, + wheat: 46, + carrot: 46, + sugarCane: 46, + potato: 46, + pumpkin: 46, + melon: 46, + cactus: 46, + cocoaBeans: 46, + mushroom: 46, + netherWart: 46, + garden: 15 +}; + +export const NON_RUNECRAFTING_LEVEL_CAP = 3; + +export const RUNECRAFTING_XP: Record = { + 1: 50, + 2: 100, + 3: 125, + 4: 160, + 5: 200, + 6: 250, + 7: 315, + 8: 400, + 9: 500, + 10: 625, + 11: 785, + 12: 1000, + 13: 1250, + 14: 1600, + 15: 2000, + 16: 2465, + 17: 3125, + 18: 4000, + 19: 5000, + 20: 6200, + 21: 7800, + 22: 9800, + 23: 12200, + 24: 15300, + 25: 19050 +}; + +export const DUNGEONEERING_XP: Record = { + 1: 50, + 2: 75, + 3: 110, + 4: 160, + 5: 230, + 6: 330, + 7: 470, + 8: 670, + 9: 950, + 10: 1340, + 11: 1890, + 12: 2665, + 13: 3760, + 14: 5260, + 15: 7380, + 16: 10300, + 17: 14400, + 18: 20000, + 19: 27600, + 20: 38000, + 21: 52500, + 22: 71500, + 23: 97000, + 24: 132000, + 25: 180000, + 26: 243000, + 27: 328000, + 28: 445000, + 29: 600000, + 30: 800000, + 31: 1065000, + 32: 1410000, + 33: 1900000, + 34: 2500000, + 35: 3300000, + 36: 4300000, + 37: 5600000, + 38: 7200000, + 39: 9200000, + 40: 12000000, + 41: 15000000, + 42: 19000000, + 43: 24000000, + 44: 30000000, + 45: 38000000, + 46: 48000000, + 47: 60000000, + 48: 75000000, + 49: 93000000, + 50: 116250000, + 51: 200000000 +}; + +export const SOCIAL_XP: Record = { + 1: 50, + 2: 100, + 3: 150, + 4: 250, + 5: 500, + 6: 750, + 7: 1000, + 8: 1250, + 9: 1500, + 10: 2000, + 11: 2500, + 12: 3000, + 13: 3750, + 14: 4500, + 15: 6000, + 16: 8000, + 17: 10000, + 18: 12500, + 19: 15000, + 20: 20000, + 21: 25000, + 22: 30000, + 23: 35000, + 24: 40000, + 25: 50000 +}; + +export const DEFAULT_LEVELING_XP: Record = { + 1: 50, + 2: 125, + 3: 200, + 4: 300, + 5: 500, + 6: 750, + 7: 1000, + 8: 1500, + 9: 2000, + 10: 3500, + 11: 5000, + 12: 7500, + 13: 10000, + 14: 15000, + 15: 20000, + 16: 30000, + 17: 50000, + 18: 75000, + 19: 100000, + 20: 200000, + 21: 300000, + 22: 400000, + 23: 500000, + 24: 600000, + 25: 700000, + 26: 800000, + 27: 900000, + 28: 1000000, + 29: 1100000, + 30: 1200000, + 31: 1300000, + 32: 1400000, + 33: 1500000, + 34: 1600000, + 35: 1700000, + 36: 1800000, + 37: 1900000, + 38: 2000000, + 39: 2100000, + 40: 2200000, + 41: 2300000, + 42: 2400000, + 43: 2500000, + 44: 2600000, + 45: 2750000, + 46: 2900000, + 47: 3100000, + 48: 3400000, + 49: 3700000, + 50: 4000000, + 51: 4300000, + 52: 4600000, + 53: 4900000, + 54: 5200000, + 55: 5500000, + 56: 5800000, + 57: 6100000, + 58: 6400000, + 59: 6700000, + 60: 7000000 +}; + +export const HOTM_XP: Record = { + 1: 0, + 2: 3000, + 3: 9000, + 4: 25000, + 5: 60000, + 6: 100000, + 7: 150000, + 8: 210000, + 9: 290000, + 10: 400000 +}; + +export const COSMETIC_SKILLS = ['runecrafting', 'social']; + +export const INFINITE = ['dungeoneering', 'skyblock_level']; + +export const GARDEN_XP = { + 1: 0, + 2: 70, + 3: 70, + 4: 140, + 5: 240, + 6: 600, + 7: 1500, + 8: 2000, + 9: 2500, + 10: 3000, + 11: 10000, + 12: 10000, + 13: 10000, + 14: 10000, + 15: 10000 +}; + +export const WHEAT = { + 0: 30, + 1: 50, + 2: 80, + 3: 170, + 4: 330, + 5: 670, + 6: 1330, + 7: 2500, + 8: 3500, + 9: 5000, + 10: 6500, + 11: 8000, + 12: 10000, + 13: 20000, + 14: 35000, + 15: 50000, + 16: 75000, + 17: 100000, + 18: 175000, + 19: 250000, + 20: 350000, + 21: 500000, + 22: 750000, + 23: 1000000, + 24: 1300000, + 25: 1600000, + 26: 2000000, + 27: 2300000, + 28: 2600000, + 29: 3000000, + 30: 3000000, + 31: 3000000, + 32: 3000000, + 33: 3000000, + 34: 3000000, + 35: 3000000, + 36: 3000000, + 37: 3000000, + 38: 3000000, + 39: 3000000, + 40: 3000000, + 41: 3000000, + 42: 3000000, + 43: 3000000, + 44: 3000000, + 45: 3000000 +}; + +export const CARROT = { + 0: 100, + 1: 150, + 2: 250, + 3: 500, + 4: 1500, + 5: 2500, + 6: 5000, + 7: 7500, + 8: 10000, + 9: 15000, + 10: 20000, + 11: 25000, + 12: 40000, + 13: 70000, + 14: 100000, + 15: 200000, + 16: 250000, + 17: 250000, + 18: 500000, + 19: 750000, + 20: 1000000, + 21: 1500000, + 22: 2000000, + 23: 3000000, + 24: 4000000, + 25: 5000000, + 26: 6000000, + 27: 7000000, + 28: 8000000, + 29: 9000000, + 30: 10000000, + 31: 10000000, + 32: 10000000, + 33: 10000000, + 34: 10000000, + 35: 10000000, + 36: 10000000, + 37: 10000000, + 38: 10000000, + 39: 10000000, + 40: 10000000, + 41: 10000000, + 42: 10000000, + 43: 10000000, + 44: 10000000, + 45: 10000000 +}; + +export const POTATO = { + 0: 100, + 1: 150, + 2: 250, + 3: 500, + 4: 1500, + 5: 2500, + 6: 5000, + 7: 7500, + 8: 10000, + 9: 15000, + 10: 20000, + 11: 25000, + 12: 40000, + 13: 70000, + 14: 100000, + 15: 200000, + 16: 250000, + 17: 250000, + 18: 500000, + 19: 750000, + 20: 1000000, + 21: 1500000, + 22: 2000000, + 23: 3000000, + 24: 4000000, + 25: 5000000, + 26: 6000000, + 27: 7000000, + 28: 8000000, + 29: 9000000, + 30: 10000000, + 31: 10000000, + 32: 10000000, + 33: 10000000, + 34: 10000000, + 35: 10000000, + 36: 10000000, + 37: 10000000, + 38: 10000000, + 39: 10000000, + 40: 10000000, + 41: 10000000, + 42: 10000000, + 43: 10000000, + 44: 10000000, + 45: 10000000 +}; + +export const MELON = { + 0: 150, + 1: 250, + 2: 400, + 3: 850, + 4: 1650, + 5: 3350, + 6: 6650, + 7: 12500, + 8: 17500, + 9: 25000, + 10: 32500, + 11: 40000, + 12: 50000, + 13: 100000, + 14: 175000, + 15: 250000, + 16: 375000, + 17: 500000, + 18: 875000, + 19: 1250000, + 20: 1750000, + 21: 2500000, + 22: 3750000, + 23: 5000000, + 24: 6500000, + 25: 8000000, + 26: 10000000, + 27: 11500000, + 28: 13000000, + 29: 15000000, + 30: 15000000, + 31: 15000000, + 32: 15000000, + 33: 15000000, + 34: 15000000, + 35: 15000000, + 36: 15000000, + 37: 15000000, + 38: 15000000, + 39: 15000000, + 40: 15000000, + 41: 15000000, + 42: 15000000, + 43: 15000000, + 44: 15000000, + 45: 15000000 +}; + +export const PUMPKIN = { + 0: 30, + 1: 50, + 2: 80, + 3: 170, + 4: 330, + 5: 670, + 6: 1330, + 7: 2500, + 8: 3500, + 9: 5000, + 10: 6500, + 11: 8000, + 12: 10000, + 13: 20000, + 14: 35000, + 15: 50000, + 16: 75000, + 17: 100000, + 18: 175000, + 19: 250000, + 20: 350000, + 21: 500000, + 22: 750000, + 23: 1000000, + 24: 1300000, + 25: 1600000, + 26: 2000000, + 27: 2300000, + 28: 2600000, + 29: 3000000, + 30: 3000000, + 31: 3000000, + 32: 3000000, + 33: 3000000, + 34: 3000000, + 35: 3000000, + 36: 3000000, + 37: 3000000, + 38: 3000000, + 39: 3000000, + 40: 3000000, + 41: 3000000, + 42: 3000000, + 43: 3000000, + 44: 3000000, + 45: 3000000 +}; + +export const SUGAR_CANE = { + 0: 60, + 1: 100, + 2: 160, + 3: 340, + 4: 660, + 5: 1340, + 6: 2660, + 7: 5000, + 8: 7000, + 9: 10000, + 10: 13000, + 11: 16000, + 12: 20000, + 13: 40000, + 14: 70000, + 15: 100000, + 16: 150000, + 17: 200000, + 18: 350000, + 19: 500000, + 20: 700000, + 21: 1000000, + 22: 1500000, + 23: 2000000, + 24: 2600000, + 25: 3200000, + 26: 4000000, + 27: 4600000, + 28: 5200000, + 29: 6000000, + 30: 6000000, + 31: 6000000, + 32: 6000000, + 33: 6000000, + 34: 6000000, + 35: 6000000, + 36: 6000000, + 37: 6000000, + 38: 6000000, + 39: 6000000, + 40: 6000000, + 41: 6000000, + 42: 6000000, + 43: 6000000, + 44: 6000000, + 45: 6000000 +}; + +export const COCOA_BEANS = { + 0: 90, + 1: 150, + 2: 250, + 3: 500, + 4: 1000, + 5: 2000, + 6: 4000, + 7: 7500, + 8: 10000, + 9: 15000, + 10: 20000, + 11: 25000, + 12: 30000, + 13: 50000, + 14: 100000, + 15: 150000, + 16: 200000, + 17: 300000, + 18: 500000, + 19: 750000, + 20: 1000000, + 21: 1500000, + 22: 2000000, + 23: 3000000, + 24: 4000000, + 25: 5000000, + 26: 6000000, + 27: 7000000, + 28: 8000000, + 29: 9000000, + 30: 9000000, + 31: 9000000, + 32: 9000000, + 33: 9000000, + 34: 9000000, + 35: 9000000, + 36: 9000000, + 37: 9000000, + 38: 9000000, + 39: 9000000, + 40: 9000000, + 41: 9000000, + 42: 9000000, + 43: 9000000, + 44: 9000000, + 45: 9000000 +}; + +export const CACTUS = { + 0: 60, + 1: 100, + 2: 160, + 3: 340, + 4: 660, + 5: 1340, + 6: 2660, + 7: 5000, + 8: 7000, + 9: 10000, + 10: 13000, + 11: 16000, + 12: 20000, + 13: 40000, + 14: 70000, + 15: 100000, + 16: 150000, + 17: 200000, + 18: 350000, + 19: 500000, + 20: 700000, + 21: 1000000, + 22: 1500000, + 23: 2000000, + 24: 2600000, + 25: 3200000, + 26: 4000000, + 27: 4600000, + 28: 5200000, + 29: 6000000, + 30: 6000000, + 31: 6000000, + 32: 6000000, + 33: 6000000, + 34: 6000000, + 35: 6000000, + 36: 6000000, + 37: 6000000, + 38: 6000000, + 39: 6000000, + 40: 6000000, + 41: 6000000, + 42: 6000000, + 43: 6000000, + 44: 6000000, + 45: 6000000 +}; + +export const MUSHROOM = { + 0: 30, + 1: 50, + 2: 80, + 3: 170, + 4: 330, + 5: 670, + 6: 1330, + 7: 2500, + 8: 3500, + 9: 5000, + 10: 6500, + 11: 8000, + 12: 10000, + 13: 20000, + 14: 35000, + 15: 50000, + 16: 75000, + 17: 100000, + 18: 175000, + 19: 250000, + 20: 350000, + 21: 500000, + 22: 750000, + 23: 1000000, + 24: 1300000, + 25: 1600000, + 26: 2000000, + 27: 2300000, + 28: 2600000, + 29: 3000000, + 30: 3000000, + 31: 3000000, + 32: 3000000, + 33: 3000000, + 34: 3000000, + 35: 3000000, + 36: 3000000, + 37: 3000000, + 38: 3000000, + 39: 3000000, + 40: 3000000, + 41: 3000000, + 42: 3000000, + 43: 3000000, + 44: 3000000, + 45: 3000000 +}; + +export const NETHER_WART = { + 0: 90, + 1: 150, + 2: 250, + 3: 500, + 4: 1000, + 5: 2000, + 6: 4000, + 7: 7500, + 8: 10000, + 9: 15000, + 10: 20000, + 11: 25000, + 12: 30000, + 13: 50000, + 14: 100000, + 15: 150000, + 16: 200000, + 17: 300000, + 18: 500000, + 19: 750000, + 20: 1000000, + 21: 1500000, + 22: 2000000, + 23: 3000000, + 24: 4000000, + 25: 5000000, + 26: 6000000, + 27: 7000000, + 28: 8000000, + 29: 9000000, + 30: 9000000, + 31: 9000000, + 32: 9000000, + 33: 9000000, + 34: 9000000, + 35: 9000000, + 36: 9000000, + 37: 9000000, + 38: 9000000, + 39: 9000000, + 40: 9000000, + 41: 9000000, + 42: 9000000, + 43: 9000000, + 44: 9000000, + 45: 9000000 +}; + +/* eslint-disable camelcase */ + +export const BestiaryBrackets: { [key: number]: number[] } = { + 1: [ + 20, 40, 60, 100, 200, 400, 800, 1400, 2000, 3000, 6000, 12000, 20000, 30000, 40000, 50000, 60000, 72000, 86000, + 100000, 200000, 400000, 600000, 800000, 1000000 + ], + 2: [ + 5, 10, 15, 25, 50, 100, 200, 350, 500, 750, 1500, 3000, 5000, 7500, 10000, 12500, 15000, 18000, 21500, 25000, 50000, + 100000, 150000, 200000, 250000 + ], + 3: [ + 4, 8, 12, 16, 20, 40, 80, 140, 200, 300, 600, 1200, 2000, 3000, 4000, 5000, 6000, 7200, 8600, 10000, 20000, 40000, + 60000, 80000, 100000 + ], + 4: [ + 2, 4, 6, 10, 15, 20, 25, 35, 50, 75, 150, 300, 500, 750, 1000, 1350, 1650, 2000, 2500, 3000, 5000, 10000, 15000, + 20000, 25000 + ], + 5: [ + 1, 2, 3, 5, 7, 10, 15, 20, 25, 30, 60, 120, 200, 300, 400, 500, 600, 720, 860, 1000, 2000, 4000, 6000, 8000, 10000 + ], + 6: [1, 2, 3, 5, 7, 9, 14, 17, 21, 25, 50, 80, 125, 175, 250, 325, 425, 525, 625, 750, 1500, 3000, 4500, 6000, 7500], + 7: [1, 2, 3, 5, 7, 9, 11, 14, 17, 20, 30, 40, 55, 75, 100, 150, 200, 275, 375, 500, 1000, 1500, 2000, 2500, 3000] +}; + +export const BestiaryMobs: BestiaryMobsData = { + dynamic: { + name: 'Private Island', + mobs: [ + { + name: '§aBat', + cap: 200, + mobs: ['forest_island_bat_3'], + bracket: 1 + }, + { + name: '§aCreeper', + cap: 200, + mobs: ['creeper_1'], + bracket: 1 + }, + { + name: '§aEnderman', + cap: 200, + mobs: [ + 'enderman_1', + 'enderman_2', + 'enderman_3', + 'enderman_4', + 'enderman_5', + 'enderman_6', + 'enderman_7', + 'enderman_8', + 'enderman_9', + 'enderman_10', + 'enderman_11', + 'enderman_12', + 'enderman_13', + 'enderman_14', + 'enderman_15' + ], + bracket: 1 + }, + { + name: '§aSkeleton', + cap: 200, + mobs: [ + 'skeleton_1', + 'skeleton_2', + 'skeleton_3', + 'skeleton_4', + 'skeleton_5', + 'skeleton_6', + 'skeleton_7', + 'skeleton_8', + 'skeleton_9', + 'skeleton_10', + 'skeleton_11', + 'skeleton_12', + 'skeleton_13', + 'skeleton_14', + 'skeleton_15' + ], + bracket: 1 + }, + { + name: '§aSlime', + cap: 200, + mobs: [ + 'slime_1', + 'slime_2', + 'slime_3', + 'slime_4', + 'slime_5', + 'slime_6', + 'slime_7', + 'slime_8', + 'slime_9', + 'slime_10', + 'slime_11', + 'slime_12', + 'slime_13', + 'slime_14', + 'slime_15' + ], + bracket: 1 + }, + { + name: '§aSpider', + cap: 200, + mobs: [ + 'spider_1', + 'spider_2', + 'spider_3', + 'spider_4', + 'spider_5', + 'spider_6', + 'spider_7', + 'spider_8', + 'spider_9', + 'spider_10', + 'spider_11', + 'spider_12', + 'spider_13', + 'spider_14', + 'spider_15' + ], + bracket: 1 + }, + { + name: '§aWitch', + cap: 200, + mobs: [ + 'witch_1', + 'witch_2', + 'witch_3', + 'witch_4', + 'witch_5', + 'witch_6', + 'witch_7', + 'witch_8', + 'witch_9', + 'witch_10', + 'witch_11', + 'witch_12', + 'witch_13', + 'witch_14', + 'witch_15' + ], + bracket: 1 + }, + { + name: '§aZombie', + cap: 200, + mobs: [ + 'zombie_1', + 'zombie_2', + 'zombie_3', + 'zombie_4', + 'zombie_5', + 'zombie_6', + 'zombie_7', + 'zombie_8', + 'zombie_9', + 'zombie_10', + 'zombie_11', + 'zombie_12', + 'zombie_13', + 'zombie_14', + 'zombie_15' + ], + bracket: 1 + } + ] }, - wheat: { - 1: 30, - 2: 50, - 3: 80, - 4: 170, - 5: 330, - 6: 670, - 7: 1330, - 8: 2500, - 9: 3500, - 10: 5000, - 11: 6500, - 12: 8000, - 13: 10000, - 14: 20000, - 15: 35000, - 16: 50000, - 17: 75000, - 18: 100000, - 19: 175000, - 20: 250000, - 21: 350000, - 22: 500000, - 23: 750000, - 24: 1000000, - 25: 1300000, - 26: 1600000, - 27: 2000000, - 28: 2300000, - 29: 2600000, - 30: 3000000, - 31: 3000000, - 32: 3000000, - 33: 3000000, - 34: 3000000, - 35: 3000000, - 36: 3000000, - 37: 3000000, - 38: 3000000, - 39: 3000000, - 40: 3000000, - 41: 3000000, - 42: 3000000, - 43: 3000000, - 44: 3000000, - 45: 3000000, - 46: 3000000 + hub: { + name: 'Hub', + mobs: [ + { + name: '§aCrypt Ghoul', + cap: 40000, + mobs: ['unburried_zombie_30'], + bracket: 1 + }, + { + name: '§6Golden Ghoul', + cap: 4000, + mobs: ['unburried_zombie_60'], + bracket: 3 + }, + { + name: '§aGraveyard Zombie', + cap: 200, + mobs: ['graveyard_zombie_1'], + bracket: 1 + }, + { + name: '§aOld Wolf', + cap: 4000, + mobs: ['old_wolf_50'], + bracket: 3 + }, + { + name: '§aWolf', + cap: 40000, + mobs: ['ruin_wolf_15'], + bracket: 1 + }, + { + name: '§aZombie Villager', + cap: 1000, + mobs: ['zombie_villager_1'], + bracket: 4 + } + ] }, - carrot: { - 1: 100, - 2: 150, - 3: 250, - 4: 500, - 5: 1500, - 6: 2500, - 7: 5000, - 8: 7500, - 9: 10000, - 10: 15000, - 11: 20000, - 12: 25000, - 13: 40000, - 14: 70000, - 15: 100000, - 16: 200000, - 17: 250000, - 18: 250000, - 19: 500000, - 20: 750000, - 21: 1000000, - 22: 1500000, - 23: 2000000, - 24: 3000000, - 25: 4000000, - 26: 5000000, - 27: 6000000, - 28: 7000000, - 29: 8000000, - 30: 9000000, - 31: 10000000, - 32: 10000000, - 33: 10000000, - 34: 10000000, - 35: 10000000, - 36: 10000000, - 37: 10000000, - 38: 10000000, - 39: 10000000, - 40: 10000000, - 41: 10000000, - 42: 10000000, - 43: 10000000, - 44: 10000000, - 45: 10000000, - 46: 10000000 + farming_1: { + name: 'The Farming Islands', + mobs: [ + { + name: '§aChicken', + cap: 200, + mobs: ['farming_chicken_1'], + bracket: 1 + }, + { + name: '§aCow', + cap: 200, + mobs: ['farming_cow_1'], + bracket: 1 + }, + { + name: '§aMushroom Cow', + cap: 200, + mobs: ['mushroom_cow_1'], + bracket: 1 + }, + { + name: '§aPig', + cap: 200, + mobs: ['farming_pig_1'], + bracket: 1 + }, + { + name: '§aRabbit', + cap: 200, + mobs: ['farming_rabbit_1'], + bracket: 1 + }, + { + name: '§aSheep', + cap: 200, + mobs: ['farming_sheep_1'], + bracket: 1 + } + ] }, - potato: { - 1: 100, - 2: 150, - 3: 250, - 4: 500, - 5: 1500, - 6: 2500, - 7: 5000, - 8: 7500, - 9: 10000, - 10: 15000, - 11: 20000, - 12: 25000, - 13: 40000, - 14: 70000, - 15: 100000, - 16: 200000, - 17: 250000, - 18: 250000, - 19: 500000, - 20: 750000, - 21: 1000000, - 22: 1500000, - 23: 2000000, - 24: 3000000, - 25: 4000000, - 26: 5000000, - 27: 6000000, - 28: 7000000, - 29: 8000000, - 30: 9000000, - 31: 10000000, - 32: 10000000, - 33: 10000000, - 34: 10000000, - 35: 10000000, - 36: 10000000, - 37: 10000000, - 38: 10000000, - 39: 10000000, - 40: 10000000, - 41: 10000000, - 42: 10000000, - 43: 10000000, - 44: 10000000, - 45: 10000000, - 46: 10000000 + combat_1: { + name: "Spider's Den", + mobs: [ + { + name: '§aArachne', + cap: 500, + mobs: ['arachne_500', 'arachne_300'], + bracket: 7 + }, + { + name: "§aArachne's Brood", + cap: 1000, + mobs: ['arachne_brood_200', 'arachne_brood_100'], + bracket: 4 + }, + { + name: "§aArachne's Keeper", + cap: 400, + mobs: ['arachne_keeper_100'], + bracket: 5 + }, + { + name: '§aBroodmother', + cap: 400, + mobs: ['brood_mother_spider_12'], + bracket: 5 + }, + { + name: '§aDasher Spider', + cap: 10000, + mobs: ['dasher_spider_50', 'dasher_spider_45', 'dasher_spider_42', 'dasher_spider_4', 'dasher_spider_6'], + bracket: 2 + }, + { + name: '§aGravel Skeleton', + cap: 4000, + mobs: ['respawning_skeleton_2'], + bracket: 3 + }, + { + name: '§aRain Slime', + cap: 1000, + mobs: ['random_slime_8', 'random_slime_20'], + bracket: 4 + }, + { + name: '§aSilverfish', + cap: 10000, + mobs: [ + 'jockey_shot_silverfish_3', + 'splitter_spider_silverfish_2', + 'splitter_spider_silverfish_45', + 'splitter_spider_silverfish_42', + 'splitter_spider_silverfish_50', + 'jockey_shot_silverfish_42' + ], + bracket: 2 + }, + { + name: '§aSpider Jockey', + cap: 4000, + mobs: ['spider_jockey_3', 'spider_jockey_42', 'spider_jockey_5'], + bracket: 3 + }, + { + name: '§aSplitter Spider', + cap: 10000, + mobs: [ + 'splitter_spider_2', + 'splitter_spider_45', + 'splitter_spider_42', + 'splitter_spider_50', + 'splitter_spider_4', + 'splitter_spider_6' + ], + bracket: 2 + }, + { + name: '§aVoracious Spider', + cap: 10000, + mobs: ['voracious_spider_50', 'voracious_spider_42', 'voracious_spider_45', 'voracious_spider_10'], + bracket: 2 + }, + { + name: '§aWeaver Spider', + cap: 10000, + mobs: [ + 'weaver_spider_3', + 'weaver_spider_4', + 'weaver_spider_5', + 'weaver_spider_6', + 'weaver_spider_42', + 'weaver_spider_45', + 'weaver_spider_50' + ], + bracket: 2 + } + ] }, - melon: { - 1: 150, - 2: 250, - 3: 400, - 4: 850, - 5: 1650, - 6: 3350, - 7: 6650, - 8: 12500, - 9: 17500, - 10: 25000, - 11: 32500, - 12: 40000, - 13: 50000, - 14: 100000, - 15: 175000, - 16: 250000, - 17: 375000, - 18: 500000, - 19: 875000, - 20: 1250000, - 21: 1750000, - 22: 2500000, - 23: 3750000, - 24: 5000000, - 25: 6500000, - 26: 8000000, - 27: 10000000, - 28: 11500000, - 29: 13000000, - 30: 15000000, - 31: 15000000, - 32: 15000000, - 33: 15000000, - 34: 15000000, - 35: 15000000, - 36: 15000000, - 37: 15000000, - 38: 15000000, - 39: 15000000, - 40: 15000000, - 41: 15000000, - 42: 15000000, - 43: 15000000, - 44: 15000000, - 45: 15000000, - 46: 15000000 + combat_3: { + name: 'The End', + mobs: [ + { + name: '§aDragon', + cap: 1000, + mobs: [ + 'protector_dragon_100', + 'old_dragon_100', + 'young_dragon_100', + 'wise_dragon_100', + 'superior_dragon_100', + 'strong_dragon_100', + 'unstable_dragon_100' + ], + bracket: 5 + }, + { + name: '§aEnderman', + cap: 25000, + mobs: ['enderman_50', 'enderman_45', 'enderman_42'], + bracket: 4 + }, + { + name: '§aEndermite', + cap: 10000, + mobs: ['nest_endermite_50', 'endermite_37', 'endermite_40'], + bracket: 5 + }, + { + name: '§aEndstone Protector', + cap: 500, + mobs: ['corrupted_protector_100'], + bracket: 7 + }, + { + name: '§aObsidian Defender', + cap: 10000, + mobs: ['obsidian_wither_55'], + bracket: 5 + }, + { + name: '§a§dVoidling Extremist', + cap: 4000, + mobs: ['voidling_extremist_100'], + bracket: 3 + }, + { + name: '§aVoidling Fanatic', + cap: 25000, + mobs: ['voidling_fanatic_85'], + bracket: 4 + }, + { + name: '§aWatcher', + cap: 10000, + mobs: ['watcher_55'], + bracket: 5 + }, + { + name: '§aZealot', + cap: 25000, + mobs: ['zealot_bruiser_100', 'zealot_enderman_55'], + bracket: 4 + } + ] }, - pumpkin: { - 1: 30, - 2: 50, - 3: 80, - 4: 170, - 5: 330, - 6: 670, - 7: 1330, - 8: 2500, - 9: 3500, - 10: 5000, - 11: 6500, - 12: 8000, - 13: 10000, - 14: 20000, - 15: 35000, - 16: 50000, - 17: 75000, - 18: 100000, - 19: 175000, - 20: 250000, - 21: 350000, - 22: 500000, - 23: 750000, - 24: 1000000, - 25: 1300000, - 26: 1600000, - 27: 2000000, - 28: 2300000, - 29: 2600000, - 30: 3000000, - 31: 3000000, - 32: 3000000, - 33: 3000000, - 34: 3000000, - 35: 3000000, - 36: 3000000, - 37: 3000000, - 38: 3000000, - 39: 3000000, - 40: 3000000, - 41: 3000000, - 42: 3000000, - 43: 3000000, - 44: 3000000, - 45: 3000000, - 46: 3000000 + crimson_isle: { + name: 'Crimson Isle', + mobs: [ + { + name: '§aAshfang', + cap: 500, + mobs: ['ashfang_200'], + bracket: 7 + }, + { + name: '§aBarbarian Duke X', + cap: 500, + mobs: ['barbarian_duke_x_200'], + bracket: 7 + }, + { + name: '§aBladesoul', + cap: 500, + mobs: ['bladesoul_200'], + bracket: 7 + }, + { + name: '§aBlaze', + cap: 3000, + mobs: ['blaze_25', 'blaze_70', 'bezal_80', 'mutated_blaze_70'], + bracket: 4 + }, + { + name: '§aFlaming Spider', + cap: 10000, + mobs: ['flaming_spider_80'], + bracket: 3 + }, + { + name: '§aFlare', + cap: 100000, + mobs: ['flare_90'], + bracket: 1 + }, + { + name: '§aGhast', + cap: 3000, + mobs: ['ghast_85', 'dive_ghast_90'], + bracket: 4 + }, + { + name: '§aKada Knight', + cap: 3000, + mobs: ['kada_knight_90'], + bracket: 4 + }, + { + name: '§5§lMage Outlaw', + cap: 500, + mobs: ['mage_outlaw_200'], + bracket: 7 + }, + { + name: '§a§4§lMagma Boss', + cap: 500, + mobs: ['magma_boss_500'], + bracket: 7 + }, + { + name: '§aMagma Cube', + cap: 10000, + mobs: ['pack_magma_cube_90', 'magma_cube_75', 'fireball_magma_cube_75'], + bracket: 3 + }, + { + name: '§aMagma Cube Rider', + cap: 3000, + mobs: ['magma_cube_rider_90'], + bracket: 4 + }, + { + name: '§aMatcho', + cap: 400, + mobs: ['matcho_100'], + bracket: 5 + }, + { + name: '§4Millennia-Aged Blaze', + cap: 4000, + mobs: ['old_blaze_110'], + bracket: 3 + }, + { + name: '§aMushroom Bull', + cap: 10000, + mobs: ['charging_mushroom_cow_80'], + bracket: 3 + }, + { + name: '§aSmoldering Blaze', + cap: 25000, + mobs: ['smoldering_blaze_95'], + bracket: 2 + }, + { + name: '§aTentacle', + cap: 1000, + mobs: ['hellwisp_100'], + bracket: 5 + }, + { + name: '§5Vanquisher', + cap: 1000, + mobs: ['vanquisher_100'], + bracket: 5 + }, + { + name: '§aWither Skeleton', + cap: 3000, + mobs: ['wither_skeleton_70'], + bracket: 4 + }, + { + name: '§aWither Spectre', + cap: 10000, + mobs: ['wither_spectre_70'], + bracket: 3 + } + ] }, - sugarCane: { - 1: 60, - 2: 100, - 3: 160, - 4: 340, - 5: 660, - 6: 1340, - 7: 2660, - 8: 5000, - 9: 7000, - 10: 10000, - 11: 13000, - 12: 16000, - 13: 20000, - 14: 40000, - 15: 70000, - 16: 100000, - 17: 150000, - 18: 200000, - 19: 350000, - 20: 500000, - 21: 700000, - 22: 1000000, - 23: 1500000, - 24: 2000000, - 25: 2600000, - 26: 3200000, - 27: 4000000, - 28: 4600000, - 29: 5200000, - 30: 6000000, - 31: 6000000, - 32: 6000000, - 33: 6000000, - 34: 6000000, - 35: 6000000, - 36: 6000000, - 37: 6000000, - 38: 6000000, - 39: 6000000, - 40: 6000000, - 41: 6000000, - 42: 6000000, - 43: 6000000, - 44: 6000000, - 45: 6000000, - 46: 6000000 + mining_2: { + name: 'Deep Caverns', + mobs: [ + { + name: '§aEmerald Slime', + cap: 3000, + mobs: ['emerald_slime_5', 'emerald_slime_10'], + bracket: 1 + }, + { + name: '§aLapis Zombie', + cap: 3000, + mobs: ['lapis_zombie_7'], + bracket: 1 + }, + { + name: '§aMiner Skeleton', + cap: 3000, + mobs: ['diamond_skeleton_15', 'diamond_skeleton_20'], + bracket: 1 + }, + { + name: '§aMiner Zombie', + cap: 3000, + mobs: ['diamond_zombie_15', 'diamond_zombie_20'], + bracket: 1 + }, + { + name: '§aRedstone Pigman', + cap: 3000, + mobs: ['redstone_pigman_10'], + bracket: 1 + }, + { + name: '§aSneaky Creeper', + cap: 300, + mobs: ['invisible_creeper_3'], + bracket: 3 + } + ] }, - cocoaBeans: { - 1: 90, - 2: 150, - 3: 250, - 4: 500, - 5: 1000, - 6: 2000, - 7: 4000, - 8: 7500, - 9: 10000, - 10: 15000, - 11: 20000, - 12: 25000, - 13: 30000, - 14: 50000, - 15: 100000, - 16: 150000, - 17: 200000, - 18: 300000, - 19: 500000, - 20: 750000, - 21: 1000000, - 22: 1500000, - 23: 2000000, - 24: 3000000, - 25: 4000000, - 26: 5000000, - 27: 6000000, - 28: 7000000, - 29: 8000000, - 30: 9000000, - 31: 9000000, - 32: 9000000, - 33: 9000000, - 34: 9000000, - 35: 9000000, - 36: 9000000, - 37: 9000000, - 38: 9000000, - 39: 9000000, - 40: 9000000, - 41: 9000000, - 42: 9000000, - 43: 9000000, - 44: 9000000, - 45: 9000000, - 46: 9000000 + mining_3: { + name: 'Dwarven Mines', + mobs: [ + { + name: '§aDiamond Goblin', + cap: 100, + mobs: ['goblin_500'], + bracket: 7 + }, + { + name: '§aGhost', + cap: 100000, + mobs: ['caverns_ghost_250'], + bracket: 3 + }, + { + name: '§aGlacite Bowman', + cap: 1000, + mobs: ['glacite_bowman_165'], + bracket: 4 + }, + { + name: '§aGlacite Caver', + cap: 1000, + mobs: ['glacite_caver_200'], + bracket: 4 + }, + { + name: '§aGlacite Mage', + cap: 1000, + mobs: ['glacite_mage_155'], + bracket: 4 + }, + { + name: '§aGlacite Mutt', + cap: 1000, + mobs: ['glacite_mutt_180'], + bracket: 4 + }, + { + name: '§aGlacite Walker', + cap: 10000, + mobs: ['ice_walker_45'], + bracket: 2 + }, + { + name: '§aGoblin', + cap: 25000, + mobs: [ + 'goblin_weakling_melee_25', + 'goblin_weakling_melee_40', + 'goblin_weakling_bow_25', + 'goblin_weakling_bow_40', + 'goblin_creepertamer_100', + 'goblin_pitfighter_70', + 'goblin_knife_thrower_25', + 'goblin_knife_thrower_40', + 'goblin_flamethrower_100', + 'goblin_murderlover_200' + ], + bracket: 2 + }, + { + name: '§aGoblin Raiders', + cap: 1000, + mobs: [ + 'goblin_weakling_melee_5', + 'goblin_weakling_bow_5', + 'goblin_creepertamer_90', + 'goblin_creeper_20', + 'goblin_battler_60', + 'goblin_murderlover_150', + 'goblin_golem_150' + ], + bracket: 4 + }, + { + name: '§aGolden Goblin', + cap: 400, + mobs: ['goblin_50'], + bracket: 5 + }, + { + name: '§aPowder Ghast', + cap: 200, + mobs: ['powder_ghast_1'], + bracket: 1 + }, + { + name: '§5Star Sentry', + cap: 1000, + mobs: ['crystal_sentry_50'], + bracket: 4 + }, + { + name: '§aTreasure Hoarder', + cap: 1000, + mobs: ['treasure_hoarder_70'], + bracket: 4 + } + ] }, - cactus: { - 1: 60, - 2: 100, - 3: 160, - 4: 340, - 5: 660, - 6: 1340, - 7: 2660, - 8: 5000, - 9: 7000, - 10: 10000, - 11: 13000, - 12: 16000, - 13: 20000, - 14: 40000, - 15: 70000, - 16: 100000, - 17: 150000, - 18: 200000, - 19: 350000, - 20: 500000, - 21: 700000, - 22: 1000000, - 23: 1500000, - 24: 2000000, - 25: 2600000, - 26: 3200000, - 27: 4000000, - 28: 4600000, - 29: 5200000, - 30: 6000000, - 31: 6000000, - 32: 6000000, - 33: 6000000, - 34: 6000000, - 35: 6000000, - 36: 6000000, - 37: 6000000, - 38: 6000000, - 39: 6000000, - 40: 6000000, - 41: 6000000, - 42: 6000000, - 43: 6000000, - 44: 6000000, - 45: 6000000, - 46: 6000000 + crystal_hollows: { + name: 'Crystal Hollows', + mobs: [ + { + name: '§aAutomaton', + cap: 10000, + mobs: ['automaton_100', 'automaton_150'], + bracket: 2 + }, + { + name: '§c§lBal', + cap: 250, + mobs: ['bal_boss_100'], + bracket: 6 + }, + { + name: '§aBoss Corleone', + cap: 100, + mobs: ['team_treasurite_corleone_200'], + bracket: 7 + }, + { + name: '§eButterfly', + cap: 1000, + mobs: ['butterfly_100'], + bracket: 4 + }, + { + name: '§aGrunt', + cap: 4000, + mobs: [ + 'team_treasurite_grunt_50', + 'team_treasurite_viper_100', + 'team_treasurite_wendy_100', + 'team_treasurite_sebastian_100' + ], + bracket: 3 + }, + { + name: '§aKey Guardian', + cap: 250, + mobs: ['key_guardian_100'], + bracket: 6 + }, + { + name: '§aSludge', + cap: 10000, + mobs: ['sludge_5', 'sludge_10', 'sludge_100'], + bracket: 2 + }, + { + name: '§aThyst', + cap: 4000, + mobs: ['thyst_20'], + bracket: 3 + }, + { + name: '§aWorm', + cap: 400, + mobs: ['worm_5', 'scatha_10'], + bracket: 5 + }, + { + name: '§aYog', + cap: 4000, + mobs: ['yog_100'], + bracket: 3 + } + ] }, - mushroom: { - 1: 30, - 2: 50, - 3: 80, - 4: 170, - 5: 330, - 6: 670, - 7: 1330, - 8: 2500, - 9: 3500, - 10: 5000, - 11: 6500, - 12: 8000, - 13: 10000, - 14: 20000, - 15: 35000, - 16: 50000, - 17: 75000, - 18: 100000, - 19: 175000, - 20: 250000, - 21: 350000, - 22: 500000, - 23: 750000, - 24: 1000000, - 25: 1300000, - 26: 1600000, - 27: 2000000, - 28: 2300000, - 29: 2600000, - 30: 3000000, - 31: 3000000, - 32: 3000000, - 33: 3000000, - 34: 3000000, - 35: 3000000, - 36: 3000000, - 37: 3000000, - 38: 3000000, - 39: 3000000, - 40: 3000000, - 41: 3000000, - 42: 3000000, - 43: 3000000, - 44: 3000000, - 45: 3000000, - 46: 3000000 + foraging_1: { + name: 'The Park', + mobs: [ + { + name: '§bHowling Spirit', + cap: 10000, + mobs: ['howling_spirit_35'], + bracket: 2 + }, + { + name: '§bPack Spirit', + cap: 10000, + mobs: ['pack_spirit_30'], + bracket: 2 + }, + { + name: '§bSoul of the Alpha', + cap: 1000, + mobs: ['soul_of_the_alpha_55'], + bracket: 4 + } + ] }, - netherWart: { - 1: 90, - 2: 150, - 3: 250, - 4: 500, - 5: 1000, - 6: 2000, - 7: 4000, - 8: 7500, - 9: 10000, - 10: 15000, - 11: 20000, - 12: 25000, - 13: 30000, - 14: 50000, - 15: 100000, - 16: 150000, - 17: 200000, - 18: 300000, - 19: 500000, - 20: 750000, - 21: 1000000, - 22: 1500000, - 23: 2000000, - 24: 3000000, - 25: 4000000, - 26: 5000000, - 27: 6000000, - 28: 7000000, - 29: 8000000, - 30: 9000000, - 31: 9000000, - 32: 9000000, - 33: 9000000, - 34: 9000000, - 35: 9000000, - 36: 9000000, - 37: 9000000, - 38: 9000000, - 39: 9000000, - 40: 9000000, - 41: 9000000, - 42: 9000000, - 43: 9000000, - 44: 9000000, - 45: 9000000, - 46: 9000000 + spooky_festival: { + name: 'Spooky Festival', + mobs: [ + { + name: '§8Crazy Witch', + cap: 750, + mobs: ['batty_witch_60'], + bracket: 2 + }, + { + name: '§6Headless Horseman', + cap: 500, + mobs: ['horseman_horse_100'], + bracket: 7 + }, + { + name: '§cPhantom Spirit', + cap: 750, + mobs: ['phantom_spirit_35'], + bracket: 2 + }, + { + name: '§6Scary Jerry', + cap: 750, + mobs: ['scary_jerry_30'], + bracket: 2 + }, + { + name: '§eTrick or Treater', + cap: 750, + mobs: ['trick_or_treater_30'], + bracket: 2 + }, + { + name: '§6Wither Gourd', + cap: 750, + mobs: ['wither_gourd_40'], + bracket: 2 + }, + { + name: '§8Wraith', + cap: 750, + mobs: ['wraith_50'], + bracket: 2 + } + ] }, - SkyWarsPrestigeIcons: { - /* eslint-disable camelcase */ - default: '⋆', - angel_1: '★', - angel_2: '☆', - angel_3: '⁕', - angel_4: '✶', - angel_5: '✳', - angel_6: '✴', - angel_7: '✷', - angel_8: '❋', - angel_9: '✼', - angel_10: '❂', - angel_11: '❁', - angel_12: '☬', - iron_prestige: '✙', - gold_prestige: '❤️', - diamond_prestige: '☠', - emerald_prestige: '✦', - sapphire_prestige: '✌', - ruby_prestige: '❦', - crystal_prestige: '✵', - opal_prestige: '❣', - amethyst_prestige: '☯', - rainbow_prestige: '✺', - mythic_prestige: 'ಠ_ಠ', - favor_of_the_angel_prestige: '⚔' + mythological_creatures: { + name: 'Mythological Creatures', + mobs: [ + { + name: '§aGaia Construct', + cap: 3000, + mobs: ['gaia_construct_140', 'gaia_construct_260'], + bracket: 4 + }, + { + name: '§aMinos Champion', + cap: 1000, + mobs: ['minos_champion_175', 'minos_champion_310'], + bracket: 5 + }, + { + name: '§aMinos Hunter', + cap: 1000, + mobs: ['minos_hunter_125', 'minos_hunter_15', 'minos_hunter_60'], + bracket: 5 + }, + { + name: '§aMinos Inquisitor', + cap: 500, + mobs: ['minos_inquisitor_750'], + bracket: 7 + }, + { + name: '§aMinotaur', + cap: 3000, + mobs: ['minotaur_45', 'minotaur_120', 'minotaur_210'], + bracket: 4 + }, + { + name: '§aSiamese Lynx', + cap: 3000, + mobs: ['siamese_lynx_25', 'siamese_lynx_85', 'siamese_lynx_155'], + bracket: 4 + } + ] }, - /* eslint-disable camelcase */ - bestiary: { - dynamic: { - name: 'Private Island', - mobs: [ - { name: 'Creeper', cap: 200, mobs: ['creeper_1'], bracket: 1 }, - { - name: 'Enderman', - cap: 200, - mobs: [ - 'enderman_1', - 'enderman_2', - 'enderman_3', - 'enderman_4', - 'enderman_5', - 'enderman_6', - 'enderman_7', - 'enderman_8', - 'enderman_9', - 'enderman_10', - 'enderman_11', - 'enderman_12', - 'enderman_13', - 'enderman_14', - 'enderman_15' - ], - bracket: 1 - }, - { - name: 'Skeleton', - cap: 200, - mobs: [ - 'skeleton_1', - 'skeleton_2', - 'skeleton_3', - 'skeleton_4', - 'skeleton_5', - 'skeleton_6', - 'skeleton_7', - 'skeleton_8', - 'skeleton_9', - 'skeleton_10', - 'skeleton_11', - 'skeleton_12', - 'skeleton_13', - 'skeleton_14', - 'skeleton_15' - ], - bracket: 1 - }, - { - name: 'Slime', - cap: 200, - mobs: [ - 'slime_1', - 'slime_2', - 'slime_3', - 'slime_4', - 'slime_5', - 'slime_6', - 'slime_7', - 'slime_8', - 'slime_9', - 'slime_10', - 'slime_11', - 'slime_12', - 'slime_13', - 'slime_14', - 'slime_15' - ], - bracket: 1 - }, - { - name: 'Spider', - cap: 200, - mobs: [ - 'spider_1', - 'spider_2', - 'spider_3', - 'spider_4', - 'spider_5', - 'spider_6', - 'spider_7', - 'spider_8', - 'spider_9', - 'spider_10', - 'spider_11', - 'spider_12', - 'spider_13', - 'spider_14', - 'spider_15' - ], - bracket: 1 - }, - { - name: 'Witch', - cap: 200, - mobs: [ - 'witch_1', - 'witch_2', - 'witch_3', - 'witch_4', - 'witch_5', - 'witch_6', - 'witch_7', - 'witch_8', - 'witch_9', - 'witch_10', - 'witch_11', - 'witch_12', - 'witch_13', - 'witch_14', - 'witch_15' - ], - bracket: 1 - }, - { - name: 'Zombie', - cap: 200, - mobs: [ - 'zombie_1', - 'zombie_2', - 'zombie_3', - 'zombie_4', - 'zombie_5', - 'zombie_6', - 'zombie_7', - 'zombie_8', - 'zombie_9', - 'zombie_10', - 'zombie_11', - 'zombie_12', - 'zombie_13', - 'zombie_14', - 'zombie_15' - ], - bracket: 1 - } - ] - }, - hub: { - name: 'Hub', - mobs: [ - { name: 'Crypt Ghoul', cap: 40000, mobs: ['unburried_zombie_30'], bracket: 1 }, - { name: 'Golden Ghoul', cap: 4000, mobs: ['unburried_zombie_60'], bracket: 3 }, - { name: 'Graveyard Zombie', cap: 200, mobs: ['graveyard_zombie_1'], bracket: 1 }, - { name: 'Old Wolf', cap: 4000, mobs: ['old_wolf_50'], bracket: 3 }, - { name: 'Wolf', cap: 40000, mobs: ['ruin_wolf_15'], bracket: 1 }, - { name: 'Zombie Villager', cap: 1000, mobs: ['zombie_villager_1'], bracket: 4 } - ] - }, - farming_1: { - name: 'The Farming Islands', - mobs: [ - { name: 'Chicken', cap: 200, mobs: ['farming_chicken_1'], bracket: 1 }, - { name: 'Cow', cap: 200, mobs: ['farming_cow_1'], bracket: 1 }, - { name: 'Mushroom Cow', cap: 200, mobs: ['mushroom_cow_1'], bracket: 1 }, - { name: 'Pig', cap: 200, mobs: ['farming_pig_1'], bracket: 1 }, - { name: 'Rabbit', cap: 200, mobs: ['farming_rabbit_1'], bracket: 1 }, - { name: 'Sheep', cap: 200, mobs: ['farming_sheep_1'], bracket: 1 } - ] - }, - combat_1: { - name: 'Spiders Den', + jerry: { + name: 'Jerry', + mobs: [ + { + name: '§9Blue Jerry', + cap: 30, + mobs: ['mayor_jerry_blue_2'], + bracket: 5 + }, + { + name: '§6Golden Jerry', + cap: 20, + mobs: ['mayor_jerry_golden_5'], + bracket: 7 + }, + { + name: '§aGreen Jerry', + cap: 75, + mobs: ['mayor_jerry_green_1'], + bracket: 4 + }, + { + name: '§5Purple Jerry', + cap: 25, + mobs: ['mayor_jerry_purple_3'], + bracket: 6 + } + ] + }, + kuudra: { + name: 'Kuudra', + mobs: [ + { + name: '§aBlazing Golem', + cap: 300, + mobs: ['blazing_golem_100', 'blazing_golem_200', 'blazing_golem_300', 'blazing_golem_400', 'blazing_golem_500'], + bracket: 3 + }, + { + name: '§aBlight', + cap: 10000, + mobs: ['blight_100', 'blight_200', 'blight_300', 'blight_400', 'blight_500'], + bracket: 3 + }, + { + name: '§aDropship', + cap: 300, + mobs: ['dropship_100', 'dropship_200', 'dropship_300', 'dropship_400', 'dropship_500'], + bracket: 3 + }, + { + name: '§aExplosive Imp', + cap: 3000, + mobs: ['explosive_imp_100', 'explosive_imp_200', 'explosive_imp_300', 'explosive_imp_400', 'explosive_imp_500'], + bracket: 4 + }, + { + name: '§aInferno Magma Cube', + cap: 10000, + mobs: [ + 'inferno_magma_cube_100', + 'inferno_magma_cube_200', + 'inferno_magma_cube_300', + 'inferno_magma_cube_400', + 'inferno_magma_cube_500' + ], + bracket: 3 + }, + { + name: '§aKuudra Berserker', + cap: 10000, + mobs: [ + 'kuudra_berserker_100', + 'kuudra_berserker_200', + 'kuudra_berserker_300', + 'kuudra_berserker_400', + 'kuudra_berserker_500' + ], + bracket: 3 + }, + { + name: '§aKuudra Follower', + cap: 25000, + mobs: [ + 'kuudra_follower_100', + 'kuudra_follower_200', + 'kuudra_follower_300', + 'kuudra_follower_400', + 'kuudra_follower_500' + ], + bracket: 2 + }, + { + name: '§aKuudra Knocker', + cap: 10000, + mobs: [ + 'kuudra_knocker_100', + 'kuudra_knocker_200', + 'kuudra_knocker_300', + 'kuudra_knocker_400', + 'kuudra_knocker_500' + ], + bracket: 3 + }, + { + name: '§aKuudra Landmine', + cap: 10000, + mobs: [ + 'kuudra_landmine_100', + 'kuudra_landmine_200', + 'kuudra_landmine_300', + 'kuudra_landmine_400', + 'kuudra_landmine_500' + ], + bracket: 3 + }, + { + name: '§aKuudra Slasher', + cap: 30, + mobs: [ + 'kuudra_slasher_100', + 'kuudra_slasher_200', + 'kuudra_slasher_300', + 'kuudra_slasher_400', + 'kuudra_slasher_500' + ], + bracket: 5 + }, + { + name: '§aMagma Follower', + cap: 30, + mobs: [ + 'magma_follower_100', + 'magma_follower_200', + 'magma_follower_300', + 'magma_follower_400', + 'magma_follower_500' + ], + bracket: 5 + }, + { + name: '§aWandering Blaze', + cap: 3000, + mobs: [ + 'wandering_blaze_100', + 'wandering_blaze_200', + 'wandering_blaze_300', + 'wandering_blaze_400', + 'wandering_blaze_500' + ], + bracket: 4 + }, + { + name: '§aWither Sentry', + cap: 75, + mobs: ['wither_sentry_100', 'wither_sentry_200', 'wither_sentry_300', 'wither_sentry_400', 'wither_sentry_500'], + bracket: 4 + } + ] + }, + fishing: { + name: 'Fishing', + hasSubcategories: true, + fishing: { + name: 'Fishing', mobs: [ - { name: 'Arachne', cap: 500, mobs: ['arachne_500', 'arachne_300'], bracket: 7 }, - { name: "Arachne's Brood", cap: 1000, mobs: ['arachne_brood_200', 'arachne_brood_100'], bracket: 4 }, - { name: "Arachne's Keeper", cap: 400, mobs: ['arachne_keeper_100'], bracket: 5 }, - { name: 'Brood Mother', cap: 400, mobs: ['brood_mother_spider_12'], bracket: 5 }, - { - name: 'Dasher Spider', - cap: 10000, - mobs: ['dasher_spider_50', 'dasher_spider_45', 'dasher_spider_42', 'dasher_spider_4', 'dasher_spider_6'], - bracket: 2 - }, - { name: 'Gravel Skeleton', cap: 4000, mobs: ['respawning_skeleton_2'], bracket: 3 }, - { name: 'Rain Slime', cap: 1000, mobs: ['random_slime_8', 'random_slime_20'], bracket: 4 }, { - name: 'Silverfish', - cap: 40000, - mobs: [ - 'jockey_shot_silverfish_3', - 'splitter_spider_silverfish_2', - 'splitter_spider_silverfish_45', - 'splitter_spider_silverfish_42', - 'splitter_spider_silverfish_50', - 'jockey_shot_silverfish_42' - ], - bracket: 1 + name: '§aAbyssal Miner', + cap: 250, + mobs: ['zombie_miner_150'], + bracket: 6 }, { - name: 'Spider Jockey', - cap: 10000, - mobs: ['spider_jockey_3', 'spider_jockey_42', 'spider_jockey_5'], - bracket: 2 + name: '§aAgarimoo', + cap: 4000, + mobs: ['agarimoo_35'], + bracket: 3 }, { - name: 'Splitter Spider', - cap: 10000, - mobs: [ - 'splitter_spider_2', - 'splitter_spider_45', - 'splitter_spider_42', - 'splitter_spider_50', - 'splitter_spider_4', - 'splitter_spider_6' - ], - bracket: 2 + name: '§aBlue Ringed Octopus', + cap: 400, + mobs: ['blue_ringed_octopus_275'], + bracket: 5 }, { - name: 'Voracious Spider', - cap: 40000, - mobs: ['voracious_spider_50', 'voracious_spider_42', 'voracious_spider_45', 'voracious_spider_10'], - bracket: 1 + name: '§aCarrot King', + cap: 400, + mobs: ['carrot_king_25'], + bracket: 5 }, { - name: 'Weaver Spider', - cap: 10000, - mobs: [ - 'weaver_spider_3', - 'weaver_spider_4', - 'weaver_spider_5', - 'weaver_spider_6', - 'weaver_spider_42', - 'weaver_spider_45', - 'weaver_spider_50' - ], - bracket: 2 - } - ] - }, - combat_3: { - name: 'The End', - mobs: [ - { - name: 'Dragon', + name: '§aCatfish', cap: 1000, - mobs: [ - 'protector_dragon_100', - 'old_dragon_100', - 'young_dragon_100', - 'wise_dragon_100', - 'superior_dragon_100', - 'strong_dragon_100', - 'unstable_dragon_100' - ], - bracket: 5 + mobs: ['catfish_23'], + bracket: 4 }, - { name: 'Enderman', cap: 25000, mobs: ['enderman_50', 'enderman_45', 'enderman_42'], bracket: 4 }, - { name: 'Endermite', cap: 10000, mobs: ['nest_endermite_50', 'endermite_37', 'endermite_40'], bracket: 5 }, - { name: 'Endstone Protector', cap: 500, mobs: ['corrupted_protector_100'], bracket: 7 }, - { name: 'Obsidian Defender', cap: 25000, mobs: ['obsidian_wither_55'], bracket: 4 }, - { name: 'Voidling Extremist', cap: 4000, mobs: ['voidling_extremist_100'], bracket: 3 }, - { name: 'Voidling Fanatic', cap: 25000, mobs: ['voidling_fanatic_85'], bracket: 4 }, - { name: 'Watcher', cap: 25000, mobs: ['watcher_55'], bracket: 4 }, - { name: 'Zealot', cap: 100000, mobs: ['zealot_bruiser_100', 'zealot_enderman_55'], bracket: 3 } - ] - }, - crimson_isle: { - name: 'Crimson Isle', - mobs: [ - { name: 'Ashfang', cap: 1000, mobs: ['ashfang_200'], bracket: 5 }, - { name: 'Barbarian Duke X', cap: 1000, mobs: ['barbarian_duke_x_200'], bracket: 5 }, - { name: 'Bladesoul', cap: 1000, mobs: ['bladesoul_200'], bracket: 5 }, - { name: 'Blaze', cap: 3000, mobs: ['blaze_25', 'blaze_70', 'bezal_80', 'mutated_blaze_70'], bracket: 4 }, - { name: 'Smoldering Blaze', cap: 25000, mobs: ['smoldering_blaze_95'], bracket: 2 }, - { name: 'Millenia-Aged Blaze', cap: 4000, mobs: ['old_blaze_110'], bracket: 3 }, - { name: 'Flaming Spider', cap: 10000, mobs: ['flaming_spider_80'], bracket: 3 }, - { name: 'Flare', cap: 100000, mobs: ['flare_90'], bracket: 1 }, - { name: 'Ghast', cap: 1000, mobs: ['ghast_85', 'dive_ghast_90'], bracket: 4 }, - { name: 'Mage Outlaw', cap: 1000, mobs: ['mage_outlaw_200'], bracket: 5 }, { - name: 'Magma Cube', - cap: 10000, - mobs: ['pack_magma_cube_90', 'magma_cube_75', 'fireball_magma_cube_75'], - bracket: 3 + name: '§aDeep Sea Protector', + cap: 1000, + mobs: ['deep_sea_protector_60'], + bracket: 4 }, - { name: 'Magma Boss', cap: 1000, mobs: ['magma_boss_500'], bracket: 5 }, - { name: 'Matcho', cap: 400, mobs: ['matcho_100'], bracket: 5 }, - { name: 'Mushroom Bull', cap: 10000, mobs: ['charging_mushroom_cow_80'], bracket: 3 }, - { name: 'Pigman', cap: 10000, mobs: ['kada_knight_90', 'magma_cube_rider_90', 'pigman_12'], bracket: 3 }, - { name: 'Wither Skeleton', cap: 10000, mobs: ['wither_skeleton_70'], bracket: 3 }, - { name: 'Wither Spectre', cap: 10000, mobs: ['wither_spectre_70'], bracket: 3 }, - { name: 'Tentacle', cap: 1000, mobs: ['hellwisp_100'], bracket: 5 }, - { name: 'Vanquisher', cap: 1000, mobs: ['vanquisher_100'], bracket: 5 } - ] - }, - mining_2: { - name: 'Deep Caverns', - mobs: [ { - name: 'Emerald Slime', + name: '§aFrog Man', cap: 3000, - mobs: ['emerald_slime_5', 'emerald_slime_10', 'emerald_slime_15'], - bracket: 1 - }, - { name: 'Miner Skeleton', cap: 3000, mobs: ['diamond_skeleton_15', 'diamond_skeleton_20'], bracket: 1 }, - { name: 'Miner Zombie', cap: 3000, mobs: ['diamond_zombie_15', 'diamond_zombie_20'], bracket: 1 }, - { name: 'Redstone Pigman', cap: 3000, mobs: ['redstone_pigman_10'], bracket: 1 }, - { name: 'Sneaky Creeper', cap: 300, mobs: ['invisible_creeper_3'], bracket: 3 }, - { name: 'Lapis Zombie', cap: 3000, mobs: ['lapis_zombie_7'], bracket: 1 } - ] - }, - mining_3: { - name: 'Dwarven Mines', - mobs: [ - { name: 'Ghost', cap: 250000, mobs: ['caverns_ghost_250'], bracket: 2 }, - { - name: 'Goblin', - cap: 25000, - mobs: [ - 'goblin_weakling_melee_25', - 'goblin_weakling_melee_40', - 'goblin_weakling_bow_25', - 'goblin_weakling_bow_40', - 'goblin_creepertamer_100', - 'goblin_pitfighter_70', - 'goblin_knife_thrower_25', - 'goblin_knife_thrower_40', - 'goblin_flamethrower_100', - 'goblin_murderlover_200' - ], - bracket: 2 + mobs: ['frog_man_10'], + bracket: 4 }, { - name: 'Goblin Raiders', + name: '§aGuardian Defender', cap: 1000, - mobs: [ - 'goblin_weakling_melee_5', - 'goblin_weakling_bow_5', - 'goblin_creepertamer_90', - 'goblin_creeper_20', - 'goblin_battler_60', - 'goblin_murderlover_150', - 'goblin_golem_150' - ], + mobs: ['guardian_defender_45'], bracket: 4 }, - { name: 'Golden Goblin', cap: 400, mobs: ['goblin_50'], bracket: 5 }, - { name: 'Ice Walker', cap: 10000, mobs: ['ice_walker_45'], bracket: 2 }, - { name: 'Powder Ghast', cap: 200, mobs: ['powder_ghast_1'], bracket: 1 }, - { name: 'Star Sentry', cap: 1000, mobs: ['crystal_sentry_50'], bracket: 4 }, - { name: 'Treasure Hoarder', cap: 3000, mobs: ['treasure_hoarder_70'], bracket: 3 } - ] - }, - crystal_hollows: { - name: 'Crystal Hollows', - mobs: [ - { name: 'Thyst', cap: 4000, mobs: ['thyst_20'], bracket: 3 }, - { name: 'Worm', cap: 400, mobs: ['worm_5', 'scatha_10'], bracket: 5 }, - { name: 'Yog', cap: 4000, mobs: ['yog_100'], bracket: 3 }, - { name: 'Sludge', cap: 10000, mobs: ['sludge_5', 'sludge_10', 'sludge_100'], bracket: 2 }, - { name: 'Automaton', cap: 10000, mobs: ['automaton_100', 'automaton_150'], bracket: 2 }, - { name: 'Butterfly', cap: 1000, mobs: ['butterfly_100'], bracket: 4 }, { - name: 'Grunt', - cap: 4000, + name: '§aMithril Grubber', + cap: 300, mobs: [ - 'team_treasurite_grunt_50', - 'team_treasurite_viper_100', - 'team_treasurite_wendy_100', - 'team_treasurite_sebastian_100', - 'team_treasurite_corleone_200' + 'small_mithril_grubber_15', + 'medium_mithril_grubber_15', + 'large_mithril_grubber_15', + 'bloated_mithril_grubber_15' ], bracket: 3 }, - { name: 'Bal', cap: 250, mobs: ['bal_boss_100'], bracket: 6 }, - { name: 'Key Guardian', cap: 250, mobs: ['key_guardian_100'], bracket: 6 } - ] - }, - foraging_1: { - name: 'The Park', - mobs: [ - { name: 'Howling Spirit', cap: 10000, mobs: ['howling_spirit_35'], bracket: 2 }, - { name: 'Pack Spirit', cap: 10000, mobs: ['pack_spirit_30'], bracket: 2 }, - { name: 'Soul of the Alpha', cap: 1000, mobs: ['soul_of_the_alpha_55'], bracket: 4 } - ] - }, - spooky_festival: { - name: 'Spooky Festival', - mobs: [ - { name: 'Crazy Witch', cap: 750, mobs: ['batty_witch_60'], bracket: 2 }, - { name: 'Headless Horseman', cap: 500, mobs: ['horseman_horse_100'], bracket: 7 }, - { name: 'Phantom Spirit', cap: 750, mobs: ['phantom_spirit_35'], bracket: 2 }, - { name: 'Scary Jerry', cap: 750, mobs: ['scary_jerry_30'], bracket: 2 }, - { name: 'Trick or Treater', cap: 750, mobs: ['trick_or_treater_30'], bracket: 2 }, - { name: 'Wither Gourd', cap: 750, mobs: ['wither_gourd_40'], bracket: 2 }, - { name: 'Wraith', cap: 750, mobs: ['wraith_50'], bracket: 2 } - ] - }, - mythological_creatures: { - name: 'Mythological Creatures', - mobs: [ - { name: 'Gaia Construct', cap: 3000, mobs: ['gaia_construct_140', 'gaia_construct_260'], bracket: 4 }, - { name: 'Minos Champion', cap: 1000, mobs: ['minos_champion_175', 'minos_champion_310'], bracket: 5 }, { - name: 'Minos Hunter', + name: '§aNight Squid', cap: 1000, - mobs: ['minos_hunter_125', 'minos_hunter_15', 'minos_hunter_60'], - bracket: 5 - }, - { name: 'Minos Inquisitor', cap: 500, mobs: ['minos_inquisitor_750'], bracket: 7 }, - { name: 'Minotaur', cap: 3000, mobs: ['minotaur_45', 'minotaur_120', 'minotaur_210'], bracket: 4 }, - { - name: 'Siamese Lynx', - cap: 3000, - mobs: ['siamese_lynx_25', 'siamese_lynx_85', 'siamese_lynx_155'], + mobs: ['night_squid_6'], bracket: 4 - } - ] - }, - jerry: { - name: 'Jerry', - mobs: [ - { name: 'Green Jerry', cap: 75, mobs: ['mayor_jerry_green_1'], bracket: 4 }, - { name: 'Blue Jerry', cap: 30, mobs: ['mayor_jerry_blue_2'], bracket: 5 }, - { name: 'Purple Jerry', cap: 25, mobs: ['mayor_jerry_purple_3'], bracket: 6 }, - { name: 'Golden Jerry', cap: 20, mobs: ['mayor_jerry_golden_5'], bracket: 7 } - ] - }, - kuudra: { - name: 'Kuudra', - mobs: [ + }, { - name: 'Blazing Golem', + name: '§aOasis Rabbit', cap: 300, - mobs: [ - 'blazing_golem_100', - 'blazing_golem_200', - 'blazing_golem_300', - 'blazing_golem_400', - 'blazing_golem_500' - ], + mobs: ['oasis_rabbit_10'], bracket: 3 }, { - name: 'Blight', - cap: 10000, - mobs: ['blight_100', 'blight_200', 'blight_300', 'blight_400', 'blight_500'], + name: '§aOasis Sheep', + cap: 300, + mobs: ['oasis_sheep_10'], bracket: 3 }, { - name: 'Dropship', - cap: 300, - mobs: ['dropship_100', 'dropship_200', 'dropship_300', 'dropship_400', 'dropship_500'], - bracket: 3 + name: '§aPoisoned Water Worm', + cap: 1000, + mobs: ['poisoned_water_worm_25'], + bracket: 4 }, { - name: 'Explosive Imp', - cap: 10000, - mobs: [ - 'explosive_imp_100', - 'explosive_imp_200', - 'explosive_imp_300', - 'explosive_imp_400', - 'explosive_imp_500' - ], + name: '§aRider of the Deep', + cap: 4000, + mobs: ['zombie_deep_20', 'chicken_deep_20'], bracket: 3 }, { - name: 'Inferno Magma Cube', - cap: 10000, - mobs: [ - 'inferno_magma_cube_100', - 'inferno_magma_cube_200', - 'inferno_magma_cube_300', - 'inferno_magma_cube_400', - 'inferno_magma_cube_500' - ], + name: '§aSea Archer', + cap: 4000, + mobs: ['sea_archer_15'], bracket: 3 }, { - name: 'Kuudra Berserker', - cap: 10000, - mobs: [ - 'kuudra_berserker_100', - 'kuudra_berserker_200', - 'kuudra_berserker_300', - 'kuudra_berserker_400', - 'kuudra_berserker_500' - ], + name: '§aSea Guardian', + cap: 4000, + mobs: ['sea_guardian_10'], bracket: 3 }, { - name: 'Kuudra Follower', - cap: 25000, - mobs: [ - 'kuudra_follower_100', - 'kuudra_follower_200', - 'kuudra_follower_300', - 'kuudra_follower_400', - 'kuudra_follower_500' - ], - bracket: 2 + name: '§aSea Leech', + cap: 1000, + mobs: ['sea_leech_30'], + bracket: 4 }, { - name: 'Kuudra Knocker', - cap: 10000, - mobs: [ - 'kuudra_knocker_100', - 'kuudra_knocker_200', - 'kuudra_knocker_300', - 'kuudra_knocker_400', - 'kuudra_knocker_500' - ], + name: '§aSea Walker', + cap: 4000, + mobs: ['sea_walker_4'], bracket: 3 }, { - name: 'Kuudra Landmine', - cap: 10000, - mobs: [ - 'kuudra_landmine_100', - 'kuudra_landmine_200', - 'kuudra_landmine_300', - 'kuudra_landmine_400', - 'kuudra_landmine_500' - ], + name: '§aSea Witch', + cap: 4000, + mobs: ['sea_witch_15'], bracket: 3 }, { - name: 'Kuudra Slasher', - cap: 30, - mobs: [ - 'kuudra_slasher_100', - 'kuudra_slasher_200', - 'kuudra_slasher_300', - 'kuudra_slasher_400', - 'kuudra_slasher_500' - ], - bracket: 5 + name: '§aSnapping Turtle', + cap: 1000, + mobs: ['snapping_turtle_30'], + bracket: 4 }, { - name: 'Magma Follower', - cap: 30, - mobs: [ - 'magma_follower_100', - 'magma_follower_200', - 'magma_follower_300', - 'magma_follower_400', - 'magma_follower_500' - ], + name: '§aSquid', + cap: 10000, + mobs: ['pond_squid_1'], + bracket: 2 + }, + { + name: '§aThe Sea Emperor', + cap: 100, + mobs: ['skeleton_emperor_150', 'guardian_emperor_150'], + bracket: 7 + }, + { + name: '§aWater Hydra', + cap: 400, + mobs: ['water_hydra_100'], bracket: 5 }, { - name: 'Wandering Blaze', - cap: 3000, - mobs: [ - 'wandering_blaze_100', - 'wandering_blaze_200', - 'wandering_blaze_300', - 'wandering_blaze_400', - 'wandering_blaze_500' - ], + name: '§aWater Worm', + cap: 1000, + mobs: ['water_worm_20'], bracket: 4 }, { - name: 'Wither Sentry', - cap: 75, - mobs: [ - 'wither_sentry_100', - 'wither_sentry_200', - 'wither_sentry_300', - 'wither_sentry_400', - 'wither_sentry_500' - ], - bracket: 4 + name: '§aWiki Tiki', + cap: 100, + mobs: ['wiki_tiki_400'], + bracket: 7 } ] }, - fishing: { - fishing: { - name: 'Fishing', - mobs: [ - { name: 'Agarimoo', cap: 4000, mobs: ['agarimoo_35'], bracket: 3 }, - { name: 'Carrot King', cap: 400, mobs: ['carrot_king_25'], bracket: 5 }, - { name: 'Catfish', cap: 1000, mobs: ['catfish_23'], bracket: 4 }, - { name: 'Deep Sea Protector', cap: 1000, mobs: ['deep_sea_protector_60'], bracket: 4 }, - { name: 'Guardian Defender', cap: 1000, mobs: ['guardian_defender_45'], bracket: 4 }, - { name: 'Night Squid', cap: 1000, mobs: ['night_squid_6'], bracket: 4 }, - { name: 'Oasis Rabbit', cap: 300, mobs: ['oasis_rabbit_10'], bracket: 3 }, - { name: 'Oasis Sheep', cap: 300, mobs: ['oasis_sheep_10'], bracket: 3 }, - { name: 'Poisoned Water Worm', cap: 1000, mobs: ['poisoned_water_worm_25'], bracket: 4 }, - { name: 'Rider of the Deep', cap: 4000, mobs: ['zombie_deep_20', 'chicken_deep_20'], bracket: 3 }, - { name: 'Sea Archer', cap: 4000, mobs: ['sea_archer_15'], bracket: 3 }, - { name: 'Sea Guardian', cap: 4000, mobs: ['sea_guardian_10'], bracket: 3 }, - { name: 'Sea Leech', cap: 1000, mobs: ['sea_leech_30'], bracket: 4 }, - { name: 'Sea Walker', cap: 4000, mobs: ['sea_walker_4'], bracket: 3 }, - { name: 'Sea Witch', cap: 4000, mobs: ['sea_witch_15'], bracket: 3 }, - { name: 'Squid', cap: 10000, mobs: ['pond_squid_1'], bracket: 2 }, - { name: 'The Sea Emperor', cap: 100, mobs: ['skeleton_emperor_150', 'guardian_emperor_150'], bracket: 7 }, - { name: 'Water Hydra', cap: 400, mobs: ['water_hydra_100'], bracket: 5 }, - { name: 'Water Worm', cap: 1000, mobs: ['water_worm_20'], bracket: 4 }, - { name: 'Zombie Miner', cap: 250, mobs: ['zombie_miner_150'], bracket: 6 } - ] - }, - lava: { - name: 'Lava Fishing', - mobs: [ - { name: 'Fire Eel', cap: 1000, mobs: ['fire_eel_240'], bracket: 4 }, - { name: 'Flaming Worm', cap: 4000, mobs: ['flaming_worm_50'], bracket: 3 }, - { name: 'Lava Blaze', cap: 1000, mobs: ['lava_blaze_100'], bracket: 4 }, - { name: 'Lava Flame', cap: 1000, mobs: ['lava_flame_230'], bracket: 4 }, - { name: 'Lava Leech', cap: 4000, mobs: ['lava_leech_220'], bracket: 3 }, - { name: 'Lava Pigman', cap: 1000, mobs: ['lava_pigman_100'], bracket: 4 }, - { name: 'Lord Jawbus', cap: 250, mobs: ['lord_jawbus_600'], bracket: 6 }, - { name: 'Magma Slug', cap: 10000, mobs: ['magma_slug_200'], bracket: 2 }, - { name: 'Moogma', cap: 4000, mobs: ['moogma_210'], bracket: 3 }, - { name: 'Plhlegblast', cap: 7, mobs: ['pond_squid_300'], bracket: 7 }, - { name: 'Pyroclastic Worm', cap: 4000, mobs: ['pyroclastic_worm_240'], bracket: 3 }, - { name: 'Taurus', cap: 1000, mobs: ['pig_rider_250'], bracket: 4 }, - { name: 'Thunder', cap: 400, mobs: ['thunder_400'], bracket: 5 } - ] - }, - spooky_festival: { - name: 'Spooky Festival Fishing', - mobs: [ - { name: 'Grim Reaper', cap: 100, mobs: ['grim_reaper_190'], bracket: 7 }, - { name: 'Nightmare', cap: 1000, mobs: ['nightmare_24'], bracket: 4 }, - { name: 'Phantom Fisher', cap: 250, mobs: ['phantom_fisherman_160'], bracket: 6 }, - { name: 'Scarecrow', cap: 4000, mobs: ['scarecrow_9'], bracket: 3 }, - { name: 'Werewolf', cap: 1000, mobs: ['werewolf_50'], bracket: 4 } - ] - }, - fishing_festival: { - name: 'Fishing Festival', - mobs: [ - { name: 'Blue Shark', cap: 1000, mobs: ['blue_shark_20'], bracket: 4 }, - { name: 'Great White Shark', cap: 400, mobs: ['great_white_shark_180'], bracket: 5 }, - { name: 'Nurse Shark', cap: 4000, mobs: ['nurse_shark_6'], bracket: 3 }, - { name: 'Tiger Shark', cap: 1000, mobs: ['tiger_shark_50'], bracket: 4 } - ] - }, - winter: { - name: 'Winter Fishing', - mobs: [ - { name: 'Frosty', cap: 4000, mobs: ['frosty_the_snowman_13'], bracket: 3 }, - { name: 'Frozen Steve', cap: 4000, mobs: ['frozen_steve_7'], bracket: 3 }, - { name: 'Grinch', cap: 250, mobs: ['grinch_21'], bracket: 6 }, - { name: 'Nutcracker', cap: 400, mobs: ['nutcracker_50'], bracket: 5 }, - { name: 'Reindrake', cap: 100, mobs: ['reindrake_100'], bracket: 7 }, - { name: 'Yeti', cap: 250, mobs: ['yeti_175'], bracket: 6 } - ] - } - }, - catacombs: { - name: 'Catacombs', + lava: { + name: 'Lava', mobs: [ { - name: 'Angry Archeologist', - cap: 10000, - mobs: [ - 'diamond_guy_80', - 'diamond_guy_90', - 'diamond_guy_100', - 'diamond_guy_110', - 'diamond_guy_120', - 'diamond_guy_130', - 'diamond_guy_140', - 'diamond_guy_150', - 'diamond_guy_160', - 'diamond_guy_170', - 'master_diamond_guy_80', - 'master_diamond_guy_90', - 'master_diamond_guy_100', - 'master_diamond_guy_110', - 'master_diamond_guy_120', - 'master_diamond_guy_130', - 'master_diamond_guy_140', - 'master_diamond_guy_150', - 'master_diamond_guy_160', - 'master_diamond_guy_170' - ], + name: '§aFiery Scuttler', + cap: 400, + mobs: ['fiery_scuttler_475'], bracket: 5 }, { - name: 'Lonely Spider', - cap: 25000, - mobs: [ - 'lonely_spider_35', - 'lonely_spider_55', - 'lonely_spider_65', - 'lonely_spider_75', - 'lonely_spider_85', - 'lonely_spider_95', - 'lonely_spider_105', - 'lonely_spider_115', - 'master_lonely_spider_35', - 'master_lonely_spider_55', - 'master_lonely_spider_65', - 'master_lonely_spider_75', - 'master_lonely_spider_85', - 'master_lonely_spider_95', - 'master_lonely_spider_105', - 'master_lonely_spider_115' - ], - bracket: 4 - }, - { name: 'Bat', cap: 1000, mobs: ['dungeon_secret_bat_1'], bracket: 4 }, - { - name: 'Cellar Spider', + name: '§aFire Eel', cap: 1000, - mobs: [ - 'cellar_spider_45', - 'cellar_spider_65', - 'cellar_spider_75', - 'cellar_spider_85', - 'cellar_spider_95', - 'cellar_spider_105', - 'cellar_spider_115', - 'cellar_spider_125', - 'master_cellar_spider_45', - 'master_cellar_spider_65', - 'master_cellar_spider_75', - 'master_cellar_spider_85', - 'master_cellar_spider_95', - 'master_cellar_spider_105', - 'master_cellar_spider_115', - 'master_cellar_spider_125' - ], + mobs: ['fire_eel_240'], bracket: 4 }, { - name: 'Crypt Dreadlord', - cap: 25000, - mobs: [ - 'crypt_dreadlord_47', - 'crypt_dreadlord_67', - 'crypt_dreadlord_77', - 'crypt_dreadlord_87', - 'crypt_dreadlord_97', - 'crypt_dreadlord_107', - 'crypt_dreadlord_117', - 'crypt_dreadlord_127', - 'master_crypt_dreadlord_47', - 'master_crypt_dreadlord_67', - 'master_crypt_dreadlord_77', - 'master_crypt_dreadlord_87', - 'master_crypt_dreadlord_97', - 'master_crypt_dreadlord_107', - 'master_crypt_dreadlord_117', - 'master_crypt_dreadlord_127' - ], + name: '§aFireproof Witch', + cap: 1000, + mobs: ['fireproof_witch_75'], bracket: 4 }, { - name: 'Crypt Lurker', - cap: 25000, - mobs: [ - 'crypt_lurker_41', - 'crypt_lurker_61', - 'crypt_lurker_71', - 'crypt_lurker_81', - 'crypt_lurker_91', - 'crypt_lurker_101', - 'crypt_lurker_111', - 'crypt_lurker_121', - 'master_crypt_lurker_41', - 'master_crypt_lurker_61', - 'master_crypt_lurker_71', - 'master_crypt_lurker_81', - 'master_crypt_lurker_91', - 'master_crypt_lurker_101', - 'master_crypt_lurker_111', - 'master_crypt_lurker_121' - ], - bracket: 4 + name: '§aFlaming Worm', + cap: 4000, + mobs: ['flaming_worm_50'], + bracket: 3 }, { - name: 'Crypt Souleater', - cap: 25000, - mobs: [ - 'crypt_souleater_45', - 'crypt_souleater_65', - 'crypt_souleater_75', - 'crypt_souleater_85', - 'crypt_souleater_95', - 'crypt_souleater_105', - 'crypt_souleater_115', - 'crypt_souleater_125', - 'master_crypt_souleater_45', - 'master_crypt_souleater_65', - 'master_crypt_souleater_75', - 'master_crypt_souleater_85', - 'master_crypt_souleater_95', - 'master_crypt_souleater_105', - 'master_crypt_souleater_115', - 'master_crypt_souleater_125' - ], + name: '§aFried Chicken', + cap: 3000, + mobs: ['fried_chicken_30'], bracket: 4 }, { - name: 'Fels', - cap: 25000, - mobs: [ - 'tentaclees_90', - 'tentaclees_100', - 'tentaclees_110', - 'master_tentaclees_90', - 'master_tentaclees_100', - 'master_tentaclees_110' - ], + name: '§aLava Blaze', + cap: 1000, + mobs: ['lava_blaze_100'], bracket: 4 }, - { name: 'Golem', cap: 1000, mobs: ['sadan_golem_1', 'master_sadan_golem_1'], bracket: 4 }, { - name: 'King Midas', + name: '§aLava Flame', cap: 1000, - mobs: [ - 'king_midas_130', - 'king_midas_140', - 'king_midas_150', - 'king_midas_160', - 'king_midas_170', - 'master_king_midas_130', - 'master_king_midas_140', - 'master_king_midas_150', - 'master_king_midas_160', - 'master_king_midas_170' - ], - bracket: 5 + mobs: ['lava_flame_230'], + bracket: 4 }, { - name: 'Lost Adventurer', - cap: 10000, - mobs: [ - 'lost_adventurer_80', - 'lost_adventurer_81', - 'lost_adventurer_82', - 'lost_adventurer_83', - 'lost_adventurer_85', - 'lost_adventurer_86', - 'lost_adventurer_87', - 'lost_adventurer_88', - 'lost_adventurer_90', - 'lost_adventurer_91', - 'lost_adventurer_92', - 'lost_adventurer_93', - 'lost_adventurer_100', - 'lost_adventurer_101', - 'lost_adventurer_102', - 'lost_adventurer_103', - 'lost_adventurer_110', - 'lost_adventurer_111', - 'lost_adventurer_112', - 'lost_adventurer_113', - 'lost_adventurer_120', - 'lost_adventurer_121', - 'lost_adventurer_122', - 'lost_adventurer_123', - 'lost_adventurer_130', - 'lost_adventurer_131', - 'lost_adventurer_132', - 'lost_adventurer_133', - 'lost_adventurer_134', - 'lost_adventurer_135', - 'lost_adventurer_140', - 'lost_adventurer_141', - 'lost_adventurer_142', - 'lost_adventurer_143', - 'lost_adventurer_144', - 'lost_adventurer_150', - 'lost_adventurer_151', - 'lost_adventurer_152', - 'lost_adventurer_153', - 'lost_adventurer_154', - 'lost_adventurer_160', - 'lost_adventurer_161', - 'lost_adventurer_162', - 'lost_adventurer_163', - 'lost_adventurer_164', - 'master_lost_adventurer_80', - 'master_lost_adventurer_81', - 'master_lost_adventurer_82', - 'master_lost_adventurer_83', - 'master_lost_adventurer_85', - 'master_lost_adventurer_86', - 'master_lost_adventurer_87', - 'master_lost_adventurer_88', - 'master_lost_adventurer_90', - 'master_lost_adventurer_91', - 'master_lost_adventurer_92', - 'master_lost_adventurer_93', - 'master_lost_adventurer_100', - 'master_lost_adventurer_101', - 'master_lost_adventurer_102', - 'master_lost_adventurer_103', - 'master_lost_adventurer_110', - 'master_lost_adventurer_111', - 'master_lost_adventurer_112', - 'master_lost_adventurer_113', - 'master_lost_adventurer_120', - 'master_lost_adventurer_121', - 'master_lost_adventurer_122', - 'master_lost_adventurer_123', - 'master_lost_adventurer_130', - 'master_lost_adventurer_131', - 'master_lost_adventurer_132', - 'master_lost_adventurer_133', - 'master_lost_adventurer_134', - 'master_lost_adventurer_135', - 'master_lost_adventurer_140', - 'master_lost_adventurer_141', - 'master_lost_adventurer_142', - 'master_lost_adventurer_143', - 'master_lost_adventurer_144', - 'master_lost_adventurer_150', - 'master_lost_adventurer_151', - 'master_lost_adventurer_152', - 'master_lost_adventurer_153', - 'master_lost_adventurer_154', - 'master_lost_adventurer_160', - 'master_lost_adventurer_161', - 'master_lost_adventurer_162', - 'master_lost_adventurer_163', - 'master_lost_adventurer_164' - ], - bracket: 5 + name: '§aLava Leech', + cap: 4000, + mobs: ['lava_leech_220'], + bracket: 3 }, { - name: 'Mimic', + name: '§aLava Pigman', cap: 1000, - mobs: ['mimic_115', 'mimic_125', 'master_mimic_115', 'master_mimic_125'], + mobs: ['lava_pigman_100'], bracket: 4 }, { - name: 'Scared Skeleton', - cap: 4000, - mobs: [ - 'scared_skeleton_42', - 'scared_skeleton_62', - 'scared_skeleton_72', - 'master_scared_skeleton_42', - 'master_scared_skeleton_62', - 'master_scared_skeleton_72' - ], - bracket: 3 + name: '§aLord Jawbus', + cap: 100, + mobs: ['lord_jawbus_600'], + bracket: 7 }, { - name: 'Shadow Assassin', + name: '§aMagma Slug', cap: 10000, - mobs: [ - 'shadow_assassin_120', - 'shadow_assassin_130', - 'shadow_assassin_140', - 'shadow_assassin_150', - 'shadow_assassin_160', - 'shadow_assassin_170', - 'shadow_assassin_171', - 'master_shadow_assassin_120', - 'master_shadow_assassin_130', - 'master_shadow_assassin_140', - 'master_shadow_assassin_150', - 'master_shadow_assassin_160', - 'master_shadow_assassin_170', - 'master_shadow_assassin_171' - ], - bracket: 5 + mobs: ['magma_slug_200'], + bracket: 2 }, { - name: 'Skeleton Grunt', + name: '§aMoogma', cap: 4000, - mobs: [ - 'skeleton_grunt_40', - 'skeleton_grunt_60', - 'skeleton_grunt_70', - 'skeleton_grunt_80', - 'master_skeleton_grunt_40', - 'master_skeleton_grunt_60', - 'master_skeleton_grunt_70', - 'master_skeleton_grunt_80' - ], + mobs: ['moogma_210'], bracket: 3 }, - { name: 'Skeleton Lord', cap: 1000, mobs: ['skeleton_lord_150', 'master_skeleton_lord_150'], bracket: 5 }, { - name: 'Skeleton Master', - cap: 25000, - mobs: [ - 'skeleton_master_48', - 'skeleton_master_68', - 'skeleton_master_78', - 'skeleton_master_88', - 'skeleton_master_98', - 'skeleton_master_108', - 'skeleton_master_118', - 'skeleton_master_128', - 'master_skeleton_master_48', - 'master_skeleton_master_68', - 'master_skeleton_master_78', - 'master_skeleton_master_88', - 'master_skeleton_master_98', - 'master_skeleton_master_108', - 'master_skeleton_master_118', - 'master_skeleton_master_128' - ], + name: '§aPlhlegblast', + cap: 7, + mobs: ['pond_squid_300'], + bracket: 7 + }, + { + name: '§aPyroclastic Worm', + cap: 1000, + mobs: ['pyroclastic_worm_240'], bracket: 4 }, { - name: 'Skeleton Soldier', - cap: 40000, - mobs: [ - 'skeleton_soldier_46', - 'skeleton_soldier_66', - 'skeleton_soldier_76', - 'skeleton_soldier_86', - 'skeleton_soldier_96', - 'skeleton_soldier_106', - 'skeleton_soldier_116', - 'skeleton_soldier_126', - 'master_skeleton_soldier_46', - 'master_skeleton_soldier_66', - 'master_skeleton_soldier_76', - 'master_skeleton_soldier_86', - 'master_skeleton_soldier_96', - 'master_skeleton_soldier_106', - 'master_skeleton_soldier_116', - 'master_skeleton_soldier_126' - ], - bracket: 1 + name: '§aRagnarok', + cap: 100, + mobs: ['ragnarok_666'], + bracket: 7 }, { - name: 'Skeletor', - cap: 10000, - mobs: [ - 'skeletor_80', - 'skeletor_90', - 'skeletor_100', - 'skeletor_101', - 'skeletor_110', - 'skeletor_120', - 'skeletor_prime_100', - 'skeletor_prime_110', - 'skeletor_prime_120', - 'master_skeletor_80', - 'master_skeletor_90', - 'master_skeletor_100', - 'master_skeletor_101', - 'master_skeletor_110', - 'master_skeletor_120', - 'master_skeletor_prime_100', - 'master_skeletor_prime_110', - 'master_skeletor_prime_120' - ], + name: '§aTaurus', + cap: 1000, + mobs: ['pig_rider_250'], + bracket: 4 + }, + { + name: '§aThunder', + cap: 400, + mobs: ['thunder_400'], bracket: 5 + } + ] + }, + spooky_festival: { + name: 'Spooky Festival', + mobs: [ + { + name: '§aGrim Reaper', + cap: 100, + mobs: ['grim_reaper_190'], + bracket: 7 }, { - name: 'Sniper', + name: '§aNightmare', + cap: 1000, + mobs: ['nightmare_24'], + bracket: 4 + }, + { + name: '§aPhantom Fisher', + cap: 250, + mobs: ['phantom_fisherman_160'], + bracket: 6 + }, + { + name: '§aScarecrow', cap: 4000, - mobs: [ - 'sniper_skeleton_43', - 'sniper_skeleton_63', - 'sniper_skeleton_73', - 'sniper_skeleton_83', - 'sniper_skeleton_93', - 'sniper_skeleton_103', - 'sniper_skeleton_113', - 'sniper_skeleton_123', - 'master_sniper_skeleton_43', - 'master_sniper_skeleton_63', - 'master_sniper_skeleton_73', - 'master_sniper_skeleton_83', - 'master_sniper_skeleton_93', - 'master_sniper_skeleton_103', - 'master_sniper_skeleton_113', - 'master_sniper_skeleton_123' - ], + mobs: ['scarecrow_9'], bracket: 3 }, { - name: 'Super Archer', - cap: 10000, - mobs: [ - 'super_archer_90', - 'super_archer_100', - 'super_archer_110', - 'super_archer_120', - 'master_super_archer_90', - 'master_super_archer_100', - 'master_super_archer_110', - 'master_super_archer_120' - ], + name: '§aWerewolf', + cap: 1000, + mobs: ['werewolf_50'], + bracket: 4 + } + ] + }, + fishing_festival: { + name: 'Fishing Festival', + mobs: [ + { + name: '§aBlue Shark', + cap: 1000, + mobs: ['blue_shark_20'], + bracket: 4 + }, + { + name: '§aGreat White Shark', + cap: 400, + mobs: ['great_white_shark_180'], bracket: 5 }, { - name: 'Super Tank Zombie', - cap: 25000, - mobs: [ - 'super_tank_zombie_90', - 'super_tank_zombie_100', - 'super_tank_zombie_110', - 'super_tank_zombie_120', - 'master_super_tank_zombie_90', - 'master_super_tank_zombie_100', - 'master_super_tank_zombie_110', - 'master_super_tank_zombie_120' - ], + name: '§aNurse Shark', + cap: 4000, + mobs: ['nurse_shark_6'], + bracket: 3 + }, + { + name: '§aTiger Shark', + cap: 1000, + mobs: ['tiger_shark_50'], bracket: 4 + } + ] + }, + winter: { + name: 'Winter', + mobs: [ + { + name: '§aFrosty', + cap: 4000, + mobs: ['frosty_the_snowman_13'], + bracket: 3 }, { - name: 'Tank Zombie', + name: '§aFrozen Steve', cap: 4000, - mobs: [ - 'crypt_tank_zombie_40', - 'crypt_tank_zombie_60', - 'crypt_tank_zombie_70', - 'crypt_tank_zombie_80', - 'crypt_tank_zombie_90', - 'master_crypt_tank_zombie_40', - 'master_crypt_tank_zombie_60', - 'master_crypt_tank_zombie_70', - 'master_crypt_tank_zombie_80', - 'master_crypt_tank_zombie_90' - ], + mobs: ['frozen_steve_7'], bracket: 3 }, { - name: 'Withermancer', - cap: 25000, - mobs: [ - 'crypt_witherskeleton_90', - 'crypt_witherskeleton_100', - 'crypt_witherskeleton_110', - 'crypt_witherskeleton_120', - 'master_crypt_witherskeleton_90', - 'master_crypt_witherskeleton_100', - 'master_crypt_witherskeleton_110', - 'master_crypt_witherskeleton_120' - ], - bracket: 4 + name: '§aGrinch', + cap: 250, + mobs: ['grinch_21'], + bracket: 6 }, - { name: 'Terracotta', cap: 40000, mobs: ['sadan_statue_1', 'master_sadan_statue_1'], bracket: 1 }, { - name: 'Undead', - cap: 10000, - mobs: [ - 'watcher_summon_undead_1', - 'watcher_summon_undead_2', - 'watcher_summon_undead_3', - 'watcher_summon_undead_4', - 'watcher_summon_undead_5', - 'watcher_summon_undead_6', - 'watcher_summon_undead_7', - 'watcher_summon_undead_8', - 'master_watcher_summon_undead_1', - 'master_watcher_summon_undead_2', - 'master_watcher_summon_undead_3', - 'master_watcher_summon_undead_4', - 'master_watcher_summon_undead_5', - 'master_watcher_summon_undead_6', - 'master_watcher_summon_undead_7', - 'master_watcher_summon_undead_8' - ], - bracket: 2 + name: '§aNutcracker', + cap: 400, + mobs: ['nutcracker_50'], + bracket: 5 }, { - name: 'Undead Skeleton', - cap: 25000, - mobs: [ - 'dungeon_respawning_skeleton_40', - 'dungeon_respawning_skeleton_40', - 'dungeon_respawning_skeleton_60', - 'dungeon_respawning_skeleton_60', - 'dungeon_respawning_skeleton_70', - 'dungeon_respawning_skeleton_70', - 'dungeon_respawning_skeleton_80', - 'dungeon_respawning_skeleton_80', - 'dungeon_respawning_skeleton_90', - 'dungeon_respawning_skeleton_90', - 'dungeon_respawning_skeleton_100', - 'dungeon_respawning_skeleton_100', - 'dungeon_respawning_skeleton_110', - 'dungeon_respawning_skeleton_110', - 'dungeon_respawning_skeleton_120', - 'dungeon_respawning_skeleton_120', - 'master_dungeon_respawning_skeleton_40', - 'master_dungeon_respawning_skeleton_40', - 'master_dungeon_respawning_skeleton_60', - 'master_dungeon_respawning_skeleton_60', - 'master_dungeon_respawning_skeleton_70', - 'master_dungeon_respawning_skeleton_70', - 'master_dungeon_respawning_skeleton_80', - 'master_dungeon_respawning_skeleton_80', - 'master_dungeon_respawning_skeleton_90', - 'master_dungeon_respawning_skeleton_90', - 'master_dungeon_respawning_skeleton_100', - 'master_dungeon_respawning_skeleton_100', - 'master_dungeon_respawning_skeleton_110', - 'master_dungeon_respawning_skeleton_110', - 'master_dungeon_respawning_skeleton_120' - ], - bracket: 4 + name: '§aReindrake', + cap: 100, + mobs: ['reindrake_100'], + bracket: 7 }, - { name: 'Wither Guard', cap: 10000, mobs: ['wither_guard_100', 'master_wither_guard_100'], bracket: 5 }, - { name: 'Wither Husk', cap: 10000, mobs: ['master_wither_husk_100'], bracket: 5 }, - { name: 'Wither Miner', cap: 25000, mobs: ['wither_miner_100', 'master_wither_miner_100'], bracket: 4 }, { - name: 'Zombie Commander', - cap: 3000, - mobs: [ - 'zombie_commander_110', - 'zombie_commander_120', - 'master_zombie_commander_110', - 'master_zombie_commander_120' - ], + name: '§aYeti', + cap: 250, + mobs: ['yeti_175'], + bracket: 6 + } + ] + }, + backwater_bayou: { + name: 'Backwater Bayou', + mobs: [ + { + name: '§aAlligator', + cap: 400, + mobs: ['alligator_120'], + bracket: 5 + }, + { + name: '§aBanshee', + cap: 1000, + mobs: ['banshee_10'], bracket: 4 }, { - name: 'Zombie Grunt', - cap: 4000, - mobs: [ - 'zombie_grunt_40', - 'zombie_grunt_60', - 'zombie_grunt_70', - 'zombie_grunt_80', - 'master_zombie_grunt_40', - 'master_zombie_grunt_60', - 'master_zombie_grunt_70', - 'master_zombie_grunt_80' - ], - bracket: 3 + name: '§aBayou Sludge', + cap: 1000, + mobs: ['bayou_sludge_25'], + bracket: 4 }, { - name: 'Zombie Knight', - cap: 25000, - mobs: [ - 'zombie_knight_86', - 'zombie_knight_96', - 'zombie_knight_106', - 'zombie_knight_116', - 'zombie_knight_126', - 'master_zombie_knight_86', - 'master_zombie_knight_96', - 'master_zombie_knight_106', - 'master_zombie_knight_116', - 'master_zombie_knight_126' - ], + name: '§aDumpster Diver', + cap: 1000, + mobs: ['dumpster_diver_15'], bracket: 4 }, - { name: 'Zombie Lord', cap: 1000, mobs: ['zombie_lord_150', 'master_zombie_lord_150'], bracket: 5 }, { - name: 'Zombie Soldier', - cap: 40000, - mobs: [ - 'zombie_soldier_83', - 'zombie_soldier_93', - 'zombie_soldier_103', - 'zombie_soldier_113', - 'zombie_soldier_123', - 'master_zombie_soldier_83', - 'master_zombie_soldier_93', - 'master_zombie_soldier_103', - 'master_zombie_soldier_113', - 'master_zombie_soldier_123' - ], - bracket: 1 + name: '§aTitanoboa', + cap: 100, + mobs: ['titanoboa_240'], + bracket: 7 + }, + { + name: '§aTrash Gobbler', + cap: 1000, + mobs: ['trash_gobbler_8'], + bracket: 4 } ] } + }, + catacombs: { + name: 'Catacombs', + mobs: [ + { + name: '§a§d§lAngry Archaeologist', + cap: 3000, + mobs: [ + 'diamond_guy_80', + 'diamond_guy_90', + 'diamond_guy_100', + 'diamond_guy_110', + 'diamond_guy_120', + 'diamond_guy_130', + 'diamond_guy_140', + 'diamond_guy_150', + 'diamond_guy_160', + 'diamond_guy_170', + 'master_diamond_guy_80', + 'master_diamond_guy_90', + 'master_diamond_guy_100', + 'master_diamond_guy_110', + 'master_diamond_guy_120', + 'master_diamond_guy_130', + 'master_diamond_guy_140', + 'master_diamond_guy_150', + 'master_diamond_guy_160', + 'master_diamond_guy_170' + ], + bracket: 7 + }, + { + name: '§aBat', + cap: 1000, + mobs: ['dungeon_secret_bat_1'], + bracket: 4 + }, + { + name: '§aCellar Spider', + cap: 1000, + mobs: [ + 'cellar_spider_45', + 'cellar_spider_65', + 'cellar_spider_75', + 'cellar_spider_85', + 'cellar_spider_95', + 'cellar_spider_105', + 'cellar_spider_115', + 'cellar_spider_125', + 'master_cellar_spider_45', + 'master_cellar_spider_65', + 'master_cellar_spider_75', + 'master_cellar_spider_85', + 'master_cellar_spider_95', + 'master_cellar_spider_105', + 'master_cellar_spider_115', + 'master_cellar_spider_125' + ], + bracket: 4 + }, + { + name: '§aLonely Spider', + cap: 25000, + mobs: [ + 'lonely_spider_35', + 'lonely_spider_55', + 'lonely_spider_65', + 'lonely_spider_75', + 'lonely_spider_85', + 'lonely_spider_95', + 'lonely_spider_105', + 'lonely_spider_115', + 'master_lonely_spider_35', + 'master_lonely_spider_55', + 'master_lonely_spider_65', + 'master_lonely_spider_75', + 'master_lonely_spider_85', + 'master_lonely_spider_95', + 'master_lonely_spider_105', + 'master_lonely_spider_115' + ], + bracket: 4 + }, + { + name: '§aCrypt Dreadlord', + cap: 25000, + mobs: [ + 'crypt_dreadlord_47', + 'crypt_dreadlord_67', + 'crypt_dreadlord_77', + 'crypt_dreadlord_87', + 'crypt_dreadlord_97', + 'crypt_dreadlord_107', + 'crypt_dreadlord_117', + 'crypt_dreadlord_127', + 'master_crypt_dreadlord_47', + 'master_crypt_dreadlord_67', + 'master_crypt_dreadlord_77', + 'master_crypt_dreadlord_87', + 'master_crypt_dreadlord_97', + 'master_crypt_dreadlord_107', + 'master_crypt_dreadlord_117', + 'master_crypt_dreadlord_127' + ], + bracket: 4 + }, + { + name: '§aCrypt Lurker', + cap: 25000, + mobs: [ + 'crypt_lurker_41', + 'crypt_lurker_61', + 'crypt_lurker_71', + 'crypt_lurker_81', + 'crypt_lurker_91', + 'crypt_lurker_101', + 'crypt_lurker_111', + 'crypt_lurker_121', + 'master_crypt_lurker_41', + 'master_crypt_lurker_61', + 'master_crypt_lurker_71', + 'master_crypt_lurker_81', + 'master_crypt_lurker_91', + 'master_crypt_lurker_101', + 'master_crypt_lurker_111', + 'master_crypt_lurker_121' + ], + bracket: 4 + }, + { + name: '§aCrypt Souleater', + cap: 25000, + mobs: [ + 'crypt_souleater_45', + 'crypt_souleater_65', + 'crypt_souleater_75', + 'crypt_souleater_85', + 'crypt_souleater_95', + 'crypt_souleater_105', + 'crypt_souleater_115', + 'crypt_souleater_125', + 'master_crypt_souleater_45', + 'master_crypt_souleater_65', + 'master_crypt_souleater_75', + 'master_crypt_souleater_85', + 'master_crypt_souleater_95', + 'master_crypt_souleater_105', + 'master_crypt_souleater_115', + 'master_crypt_souleater_125' + ], + bracket: 4 + }, + { + name: '§aFels', + cap: 10000, + mobs: [ + 'tentaclees_90', + 'tentaclees_100', + 'tentaclees_110', + 'master_tentaclees_90', + 'master_tentaclees_100', + 'master_tentaclees_110' + ], + bracket: 5 + }, + { + name: '§aGolem', + cap: 1000, + mobs: ['sadan_golem_1', 'master_sadan_golem_1'], + bracket: 4 + }, + { + name: '§a§d§lKing Midas', + cap: 750, + mobs: [ + 'king_midas_130', + 'king_midas_140', + 'king_midas_150', + 'king_midas_160', + 'king_midas_170', + 'master_king_midas_130', + 'master_king_midas_140', + 'master_king_midas_150', + 'master_king_midas_160', + 'master_king_midas_170' + ], + bracket: 6 + }, + { + name: '§a§d§lLost Adventurer', + cap: 3000, + mobs: [ + 'lost_adventurer_80', + 'lost_adventurer_81', + 'lost_adventurer_82', + 'lost_adventurer_83', + 'lost_adventurer_85', + 'lost_adventurer_86', + 'lost_adventurer_87', + 'lost_adventurer_88', + 'lost_adventurer_90', + 'lost_adventurer_91', + 'lost_adventurer_92', + 'lost_adventurer_93', + 'lost_adventurer_100', + 'lost_adventurer_101', + 'lost_adventurer_102', + 'lost_adventurer_103', + 'lost_adventurer_110', + 'lost_adventurer_111', + 'lost_adventurer_112', + 'lost_adventurer_113', + 'lost_adventurer_120', + 'lost_adventurer_121', + 'lost_adventurer_122', + 'lost_adventurer_123', + 'lost_adventurer_130', + 'lost_adventurer_131', + 'lost_adventurer_132', + 'lost_adventurer_133', + 'lost_adventurer_134', + 'lost_adventurer_135', + 'lost_adventurer_140', + 'lost_adventurer_141', + 'lost_adventurer_142', + 'lost_adventurer_143', + 'lost_adventurer_144', + 'lost_adventurer_150', + 'lost_adventurer_151', + 'lost_adventurer_152', + 'lost_adventurer_153', + 'lost_adventurer_154', + 'lost_adventurer_160', + 'lost_adventurer_161', + 'lost_adventurer_162', + 'lost_adventurer_163', + 'lost_adventurer_164', + 'master_lost_adventurer_80', + 'master_lost_adventurer_81', + 'master_lost_adventurer_82', + 'master_lost_adventurer_83', + 'master_lost_adventurer_85', + 'master_lost_adventurer_86', + 'master_lost_adventurer_87', + 'master_lost_adventurer_88', + 'master_lost_adventurer_90', + 'master_lost_adventurer_91', + 'master_lost_adventurer_92', + 'master_lost_adventurer_93', + 'master_lost_adventurer_100', + 'master_lost_adventurer_101', + 'master_lost_adventurer_102', + 'master_lost_adventurer_103', + 'master_lost_adventurer_110', + 'master_lost_adventurer_111', + 'master_lost_adventurer_112', + 'master_lost_adventurer_113', + 'master_lost_adventurer_120', + 'master_lost_adventurer_121', + 'master_lost_adventurer_122', + 'master_lost_adventurer_123', + 'master_lost_adventurer_130', + 'master_lost_adventurer_131', + 'master_lost_adventurer_132', + 'master_lost_adventurer_133', + 'master_lost_adventurer_134', + 'master_lost_adventurer_135', + 'master_lost_adventurer_140', + 'master_lost_adventurer_141', + 'master_lost_adventurer_142', + 'master_lost_adventurer_143', + 'master_lost_adventurer_144', + 'master_lost_adventurer_150', + 'master_lost_adventurer_151', + 'master_lost_adventurer_152', + 'master_lost_adventurer_153', + 'master_lost_adventurer_154', + 'master_lost_adventurer_160', + 'master_lost_adventurer_161', + 'master_lost_adventurer_162', + 'master_lost_adventurer_163', + 'master_lost_adventurer_164' + ], + bracket: 7 + }, + { + name: '§aMimic', + cap: 1000, + mobs: ['mimic_115', 'mimic_125', 'master_mimic_115', 'master_mimic_125'], + bracket: 4 + }, + { + name: '§aScared Skeleton', + cap: 4000, + mobs: [ + 'scared_skeleton_42', + 'scared_skeleton_62', + 'scared_skeleton_72', + 'master_scared_skeleton_42', + 'master_scared_skeleton_62', + 'master_scared_skeleton_72' + ], + bracket: 3 + }, + { + name: '§a§d§lShadow Assassin', + cap: 3000, + mobs: [ + 'shadow_assassin_120', + 'shadow_assassin_130', + 'shadow_assassin_140', + 'shadow_assassin_150', + 'shadow_assassin_160', + 'shadow_assassin_170', + 'shadow_assassin_171', + 'master_shadow_assassin_120', + 'master_shadow_assassin_130', + 'master_shadow_assassin_140', + 'master_shadow_assassin_150', + 'master_shadow_assassin_160', + 'master_shadow_assassin_170', + 'master_shadow_assassin_171' + ], + bracket: 7 + }, + { + name: '§aSkeleton Grunt', + cap: 4000, + mobs: [ + 'skeleton_grunt_40', + 'skeleton_grunt_60', + 'skeleton_grunt_70', + 'skeleton_grunt_80', + 'master_skeleton_grunt_40', + 'master_skeleton_grunt_60', + 'master_skeleton_grunt_70', + 'master_skeleton_grunt_80' + ], + bracket: 3 + }, + { + name: '§aSkeleton Lord', + cap: 1000, + mobs: ['skeleton_lord_150', 'master_skeleton_lord_150'], + bracket: 5 + }, + { + name: '§aSkeleton Master', + cap: 25000, + mobs: [ + 'skeleton_master_48', + 'skeleton_master_68', + 'skeleton_master_78', + 'skeleton_master_88', + 'skeleton_master_98', + 'skeleton_master_108', + 'skeleton_master_118', + 'skeleton_master_128', + 'master_skeleton_master_48', + 'master_skeleton_master_68', + 'master_skeleton_master_78', + 'master_skeleton_master_88', + 'master_skeleton_master_98', + 'master_skeleton_master_108', + 'master_skeleton_master_118', + 'master_skeleton_master_128' + ], + bracket: 4 + }, + { + name: '§aSkeleton Soldier', + cap: 40000, + mobs: [ + 'skeleton_soldier_46', + 'skeleton_soldier_66', + 'skeleton_soldier_76', + 'skeleton_soldier_86', + 'skeleton_soldier_96', + 'skeleton_soldier_106', + 'skeleton_soldier_116', + 'skeleton_soldier_126', + 'master_skeleton_soldier_46', + 'master_skeleton_soldier_66', + 'master_skeleton_soldier_76', + 'master_skeleton_soldier_86', + 'master_skeleton_soldier_96', + 'master_skeleton_soldier_106', + 'master_skeleton_soldier_116', + 'master_skeleton_soldier_126' + ], + bracket: 1 + }, + { + name: '§aSkeletor', + cap: 10000, + mobs: [ + 'skeletor_80', + 'skeletor_90', + 'skeletor_100', + 'skeletor_101', + 'skeletor_110', + 'skeletor_120', + 'skeletor_prime_100', + 'skeletor_prime_110', + 'skeletor_prime_120', + 'master_skeletor_80', + 'master_skeletor_90', + 'master_skeletor_100', + 'master_skeletor_101', + 'master_skeletor_110', + 'master_skeletor_120', + 'master_skeletor_prime_100', + 'master_skeletor_prime_110', + 'master_skeletor_prime_120' + ], + bracket: 5 + }, + { + name: '§aSniper', + cap: 4000, + mobs: [ + 'sniper_skeleton_43', + 'sniper_skeleton_63', + 'sniper_skeleton_73', + 'sniper_skeleton_83', + 'sniper_skeleton_93', + 'sniper_skeleton_103', + 'sniper_skeleton_113', + 'sniper_skeleton_123', + 'master_sniper_skeleton_43', + 'master_sniper_skeleton_63', + 'master_sniper_skeleton_73', + 'master_sniper_skeleton_83', + 'master_sniper_skeleton_93', + 'master_sniper_skeleton_103', + 'master_sniper_skeleton_113', + 'master_sniper_skeleton_123' + ], + bracket: 3 + }, + { + name: '§aSuper Archer', + cap: 10000, + mobs: [ + 'super_archer_90', + 'super_archer_100', + 'super_archer_110', + 'super_archer_120', + 'master_super_archer_90', + 'master_super_archer_100', + 'master_super_archer_110', + 'master_super_archer_120' + ], + bracket: 5 + }, + { + name: '§aSuper Tank Zombie', + cap: 25000, + mobs: [ + 'super_tank_zombie_90', + 'super_tank_zombie_100', + 'super_tank_zombie_110', + 'super_tank_zombie_120', + 'master_super_tank_zombie_90', + 'master_super_tank_zombie_100', + 'master_super_tank_zombie_110', + 'master_super_tank_zombie_120' + ], + bracket: 4 + }, + { + name: '§aTank Zombie', + cap: 4000, + mobs: [ + 'crypt_tank_zombie_40', + 'crypt_tank_zombie_60', + 'crypt_tank_zombie_70', + 'crypt_tank_zombie_80', + 'crypt_tank_zombie_90', + 'master_crypt_tank_zombie_40', + 'master_crypt_tank_zombie_60', + 'master_crypt_tank_zombie_70', + 'master_crypt_tank_zombie_80', + 'master_crypt_tank_zombie_90' + ], + bracket: 3 + }, + { + name: '§aTerracotta', + cap: 40000, + mobs: ['sadan_statue_1', 'master_sadan_statue_1'], + bracket: 1 + }, + { + name: '§a§4§lUndead', + cap: 10000, + mobs: [ + 'watcher_summon_undead_1', + 'watcher_summon_undead_2', + 'watcher_summon_undead_3', + 'watcher_summon_undead_4', + 'watcher_summon_undead_5', + 'watcher_summon_undead_6', + 'watcher_summon_undead_7', + 'watcher_summon_undead_8', + 'master_watcher_summon_undead_1', + 'master_watcher_summon_undead_2', + 'master_watcher_summon_undead_3', + 'master_watcher_summon_undead_4', + 'master_watcher_summon_undead_5', + 'master_watcher_summon_undead_6', + 'master_watcher_summon_undead_7', + 'master_watcher_summon_undead_8' + ], + bracket: 2 + }, + { + name: '§aUndead Skeleton', + cap: 25000, + mobs: [ + 'dungeon_respawning_skeleton_40', + 'dungeon_respawning_skeleton_skull_40', + 'dungeon_respawning_skeleton_60', + 'dungeon_respawning_skeleton_70', + 'dungeon_respawning_skeleton_80', + 'dungeon_respawning_skeleton_90', + 'dungeon_respawning_skeleton_100', + 'dungeon_respawning_skeleton_110', + 'dungeon_respawning_skeleton_120', + 'master_dungeon_respawning_skeleton_40', + 'master_dungeon_respawning_skeleton_60', + 'master_dungeon_respawning_skeleton_70', + 'master_dungeon_respawning_skeleton_80', + 'master_dungeon_respawning_skeleton_90', + 'master_dungeon_respawning_skeleton_100', + 'master_dungeon_respawning_skeleton_110', + 'master_dungeon_respawning_skeleton_120' + ], + bracket: 4 + }, + { + name: '§aWither Guard', + cap: 10000, + mobs: ['wither_guard_100', 'master_wither_guard_100'], + bracket: 5 + }, + { + name: '§aWither Husk', + cap: 10000, + mobs: ['master_wither_husk_100'], + bracket: 5 + }, + { + name: '§aWither Miner', + cap: 25000, + mobs: ['wither_miner_100', 'master_wither_miner_100'], + bracket: 4 + }, + { + name: '§aWithermancer', + cap: 25000, + mobs: [ + 'crypt_witherskeleton_90', + 'crypt_witherskeleton_100', + 'crypt_witherskeleton_110', + 'crypt_witherskeleton_120', + 'master_crypt_witherskeleton_90', + 'master_crypt_witherskeleton_100', + 'master_crypt_witherskeleton_110', + 'master_crypt_witherskeleton_120' + ], + bracket: 4 + }, + { + name: '§aZombie Commander', + cap: 3000, + mobs: [ + 'zombie_commander_110', + 'zombie_commander_120', + 'master_zombie_commander_110', + 'master_zombie_commander_120' + ], + bracket: 4 + }, + { + name: '§aZombie Grunt', + cap: 4000, + mobs: [ + 'zombie_grunt_40', + 'zombie_grunt_60', + 'zombie_grunt_70', + 'zombie_grunt_80', + 'master_zombie_grunt_40', + 'master_zombie_grunt_60', + 'master_zombie_grunt_70', + 'master_zombie_grunt_80' + ], + bracket: 3 + }, + { + name: '§aZombie Knight', + cap: 10000, + mobs: [ + 'zombie_knight_86', + 'zombie_knight_96', + 'zombie_knight_106', + 'zombie_knight_116', + 'zombie_knight_126', + 'master_zombie_knight_86', + 'master_zombie_knight_96', + 'master_zombie_knight_106', + 'master_zombie_knight_116', + 'master_zombie_knight_126' + ], + bracket: 5 + }, + { + name: '§aZombie Lord', + cap: 1000, + mobs: ['zombie_lord_150', 'master_zombie_lord_150'], + bracket: 5 + }, + { + name: '§aZombie Soldier', + cap: 40000, + mobs: [ + 'zombie_soldier_83', + 'zombie_soldier_93', + 'zombie_soldier_103', + 'zombie_soldier_113', + 'zombie_soldier_123', + 'master_zombie_soldier_83', + 'master_zombie_soldier_93', + 'master_zombie_soldier_103', + 'master_zombie_soldier_113', + 'master_zombie_soldier_123' + ], + bracket: 1 + } + ] + }, + garden: { + name: 'Garden', + mobs: [ + { + name: '§aBeetle', + cap: 250, + mobs: ['pest_beetle_1'], + bracket: 6 + }, + { + name: '§aCricket', + cap: 250, + mobs: ['pest_cricket_1'], + bracket: 6 + }, + { + name: '§aEarthworm', + cap: 250, + mobs: ['pest_worm_1'], + bracket: 6 + }, + { + name: '§aField Mouse', + cap: 100, + mobs: ['pest_mouse_1'], + bracket: 7 + }, + { + name: '§aFly', + cap: 250, + mobs: ['pest_fly_1'], + bracket: 6 + }, + { + name: '§aLocust', + cap: 250, + mobs: ['pest_locust_1'], + bracket: 6 + }, + { + name: '§aMite', + cap: 250, + mobs: ['pest_mite_1'], + bracket: 6 + }, + { + name: '§aMosquito', + cap: 250, + mobs: ['pest_mosquito_1'], + bracket: 6 + }, + { + name: '§aMoth', + cap: 250, + mobs: ['pest_moth_1'], + bracket: 6 + }, + { + name: '§aRat', + cap: 250, + mobs: ['pest_rat_1'], + bracket: 6 + }, + { + name: '§aSlug', + cap: 250, + mobs: ['pest_slug_1'], + bracket: 6 + } + ] } }; diff --git a/src/Utils/SkyBlockUtils.ts b/src/Utils/SkyBlockUtils.ts new file mode 100644 index 000000000..076d1c3cb --- /dev/null +++ b/src/Utils/SkyBlockUtils.ts @@ -0,0 +1,214 @@ +import { + CACTUS, + CARROT, + COCOA_BEANS, + CustomPetLeveling, + DEFAULT_LEVELING_XP, + DEFAULT_SKILL_CAPS, + DUNGEONEERING_XP, + GARDEN_XP, + HOTM_XP, + INFINITE, + MELON, + MUSHROOM, + NETHER_WART, + POTATO, + PUMPKIN, + PetLevels, + RUNECRAFTING_XP, + SLAYER_XP, + SOCIAL_XP, + SUGAR_CANE, + WHEAT, + petRarityOffset +} from './Constants.js'; +import { parse, simplify } from 'prismarine-nbt'; +import type { + LevelData, + PetLevelData, + Rarity, + SkillLevelData, + SkyBlockPetId, + SkyBlockSlayer, + SkyBlockXPTables +} from '../Types/SkyBlock.js'; + +export async function decode(base64: any, isBuffer: boolean = false): Promise { + // Credit: https://github.com/SkyCryptWebsite/SkyCryptv2/blob/3b5b3ae4fe77c60eff90691797f09024baf68872/src/lib/server/stats/items/processing.ts#L215-L218 + const buffer = isBuffer ? base64 : Buffer.from(base64, 'base64'); + const parseData = await parse(buffer); + const data = simplify(parseData.parsed); + const newdata = []; + for (let i = 0; i < data.i.length; i++) { + newdata.push(data.i[i]); + } + return newdata; +} + +// Credit: https://github.com/SkyCryptWebsite/SkyCryptv2/blob/2d4d0317b1f7a9f27e59d25afd4df24c0e49b0da/src/lib/server/stats/pets.ts#L70-L101 (modified) +export function getPetLevel(petExp: number, type: SkyBlockPetId | 'UNKNOWN', rarity: Rarity | 'UNKNOWN'): PetLevelData { + const rarityOffset = + 'BINGO' === type ? (CustomPetLeveling[type]?.rarityOffset?.[rarity] ?? petRarityOffset[rarity]) : 0; + + const maxLevel = 'GOLDEN_DRAGON' === type ? CustomPetLeveling[type]?.maxLevel : 100; + + const levels: number[] = PetLevels.slice(rarityOffset, rarityOffset + maxLevel - 1).concat( + 'GOLDEN_DRAGON' === type ? CustomPetLeveling[type]?.petLevels : PetLevels + ); + + let level: number = 1; + let xpMaxLevel: number = 0; + let currentXp: number = 0; + for (let i: number = 0; i < maxLevel - 1; i++) { + xpMaxLevel += levels?.[i] || 0; + if (xpMaxLevel <= petExp) { + level++; + currentXp = petExp - xpMaxLevel; + } + } + + const xpForNext: number | null = levels[level - 1] ?? null; + const progress = null !== xpForNext ? (isNaN(currentXp / xpForNext) ? 0 : currentXp / xpForNext) : 0; + + return { + xp: petExp, + level, + xpForNext, + progress, + maxed: maxLevel === level, + maxLevel, + xpMaxLevel, + currentXp + }; +} + +// CREDITS: https://github.com/SkyCryptWebsite/SkyCryptv2/blob/2d4d0317b1f7a9f27e59d25afd4df24c0e49b0da/src/lib/server/stats/slayer.ts#L24-L59 (modified) +export function getSlayerLevel(slayer: SkyBlockSlayer, xp: number): LevelData { + if (SLAYER_XP[slayer] === undefined) { + return { + xp: 0, + level: 0, + xpForNext: SLAYER_XP[slayer] ? SLAYER_XP[slayer][1] : null, + progress: 0, + maxed: false, + maxLevel: 0 + }; + } + + const reversed = Object.entries(SLAYER_XP[slayer]).reverse(); + const maxLevel = Object.keys(SLAYER_XP[slayer]).length; + + for (const [level, requiredXP] of reversed) { + if (xp >= requiredXP) { + const xpForNext = SLAYER_XP[slayer][parseInt(level) + 1] || 0; + return { + xp, + xpForNext, + level: parseInt(level), + maxLevel, + maxed: parseInt(level) === maxLevel, + progress: isNaN(xp / xpForNext) ? 0 : xp / xpForNext + }; + } + } + + return { + xp, + xpForNext: 0, + level: 0, + maxLevel, + maxed: false, + progress: 0 + }; +} + +function getXpTable(type: SkyBlockXPTables): Record { + const SKILL_TABLES = { + default: DEFAULT_LEVELING_XP, + runecrafting: RUNECRAFTING_XP, + social: SOCIAL_XP, + dungeoneering: DUNGEONEERING_XP, + hotm: HOTM_XP, + farming: DEFAULT_LEVELING_XP, + mining: DEFAULT_LEVELING_XP, + combat: DEFAULT_LEVELING_XP, + foraging: DEFAULT_LEVELING_XP, + fishing: DEFAULT_LEVELING_XP, + enchanting: DEFAULT_LEVELING_XP, + alchemy: DEFAULT_LEVELING_XP, + taming: DEFAULT_LEVELING_XP, + carpentry: DEFAULT_LEVELING_XP, + garden: GARDEN_XP, + wheat: WHEAT, + carrot: CARROT, + sugarCane: SUGAR_CANE, + potato: POTATO, + pumpkin: PUMPKIN, + melon: MELON, + cactus: CACTUS, + cocoaBeans: COCOA_BEANS, + mushroom: MUSHROOM, + netherWart: NETHER_WART + }; + + return SKILL_TABLES[type] ?? DEFAULT_LEVELING_XP; +} + +export type Extra = { type: SkyBlockXPTables; cap?: number }; + +// Credit: https://github.com/SkyCryptWebsite/SkyCryptv2/blob/2d4d0317b1f7a9f27e59d25afd4df24c0e49b0da/src/lib/server/stats/leveling/leveling.ts#L43-L126 (modifed) +export function getLevelByXp(xp: number, extra: Extra = { type: 'default' }): SkillLevelData { + const xpTable = getXpTable(extra.type) as Record; + if ('number' !== typeof xp || isNaN(xp)) { + xp = 0; + } + + const levelCap = extra.cap ?? DEFAULT_SKILL_CAPS[extra.type] ?? Math.max(...Object.keys(xpTable).map(Number)); + let uncappedLevel = 0; + let currentXp = xp; + let xpRemaining = xp; + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + while (xpTable[uncappedLevel + 1] <= xpRemaining) { + uncappedLevel++; + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + xpRemaining -= xpTable[uncappedLevel]; + if (uncappedLevel <= levelCap) { + currentXp = xpRemaining; + } + } + + const isInfiniteLevelable = INFINITE.includes(extra.type); + if (isInfiniteLevelable) { + const maxExperience = Object.values(xpTable).at(-1) as number; + uncappedLevel += Math.floor(xpRemaining / maxExperience); + xpRemaining %= maxExperience; + currentXp = xpRemaining; + } + + const maxLevel = isInfiniteLevelable ? Math.max(uncappedLevel, levelCap) : levelCap; + const level = isInfiniteLevelable ? uncappedLevel : Math.min(levelCap, uncappedLevel); + + const xpForNext = ( + level < maxLevel + ? Math.ceil(xpTable[level + 1] ?? 0 ?? Object.values(xpTable).at(-1)) + : isInfiniteLevelable + ? Object.values(xpTable).at(-1) + : Infinity + ) as number; + + const progress = level >= maxLevel && !isInfiniteLevelable ? 0 : Math.max(0, Math.min(currentXp / xpForNext, 1)); + const maxed = level >= maxLevel; + + return { + xp, + level, + xpForNext, + progress, + maxed, + maxLevel, + currentXp + }; +} diff --git a/src/Utils/SkyblockUtils.test.ts b/src/Utils/SkyblockUtils.test.ts deleted file mode 100644 index b8b2bc5cd..000000000 --- a/src/Utils/SkyblockUtils.test.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { expect, test } from 'vitest'; -import { getTrophyFishRank } from './SkyblockUtils.js'; - -test('getTrophyFishRank', () => { - expect(getTrophyFishRank(1)).toBe('Bronze'); - expect(getTrophyFishRank(2)).toBe('Silver'); - expect(getTrophyFishRank(3)).toBe('Gold'); - expect(getTrophyFishRank(4)).toBe('Diamond'); -}); diff --git a/src/Utils/SkyblockUtils.ts b/src/Utils/SkyblockUtils.ts deleted file mode 100644 index 81a7daf2b..000000000 --- a/src/Utils/SkyblockUtils.ts +++ /dev/null @@ -1,553 +0,0 @@ -import Constants, { bestiaryBrackets, petLevels, petRarityOffset } from './Constants.js'; -import { parse, simplify } from 'prismarine-nbt'; -import type { - ChocolateFactoryData, - CrimsonIsle, - CrimsonIsleBelt, - CrimsonIsleDojoRank, - Dungeons, - HOTM, - JacobData, - Rarity, - RawDungeonRun, - SkillLevel, - Skills, - Slayer, - SlayerData, - TrophyFishRank -} from '../Types/Skyblock.js'; - -export async function decode(base64: any, isBuffer: boolean = false): Promise { - // Credit: https://github.com/SkyCryptWebsite/SkyCryptv2/blob/3b5b3ae4fe77c60eff90691797f09024baf68872/src/lib/server/stats/items/processing.ts#L215-L218 - const buffer = isBuffer ? base64 : Buffer.from(base64, 'base64'); - const parseData = await parse(buffer); - const data = simplify(parseData.parsed); - const newdata = []; - for (let i = 0; i < data.i.length; i++) { - newdata.push(data.i[i]); - } - return newdata; -} - -export function getLevelByXp(xp: number, type: string): SkillLevel { - let xpTable: Record; - switch (type) { - case 'runecrafting': - xpTable = Constants.runecraftingXp; - break; - case 'dungeons': - xpTable = Constants.dungeonXp; - break; - case 'hotm': - xpTable = Constants.hotmXp; - break; - case 'social': - xpTable = Constants.socialXp; - break; - case 'garden': - xpTable = Constants.garden; - break; - case 'wheat': - xpTable = Constants.wheat; - break; - case 'carrot': - xpTable = Constants.carrot; - break; - case 'potato': - xpTable = Constants.potato; - break; - case 'melon': - xpTable = Constants.melon; - break; - case 'pumpkin': - xpTable = Constants.pumpkin; - break; - case 'sugarCane': - xpTable = Constants.sugarCane; - break; - case 'cocoaBeans': - xpTable = Constants.cocoaBeans; - break; - case 'cactus': - xpTable = Constants.cactus; - break; - case 'mushroom': - xpTable = Constants.mushroom; - break; - case 'netherWart': - xpTable = Constants.netherWart; - break; - default: - xpTable = Constants.levelingXp; - } - const maxLevel = Math.max(...Object.keys(xpTable).map(Number)); - if (isNaN(xp)) { - return { - xp: 0, - level: 0, - maxLevel, - xpCurrent: 0, - xpForNext: xpTable[1] || 0, - progress: 0, - cosmetic: Boolean('runecrafting' === type || 'social' === type) - }; - } - let xpTotal = 0; - let level = 0; - let xpForNext = 0; - for (let x = 1; x <= maxLevel; x++) { - if (!xpTable[x]) continue; - xpTotal += xpTable?.[x] || 0; - if (xpTotal > xp) { - xpTotal -= xpTable?.[x] || 0; - break; - } else { - level = x; - } - } - const xpCurrent = Math.floor(xp - xpTotal); - if (level < maxLevel) xpForNext = Math.ceil(xpTable?.[level + 1] || 0); - const progress = Math.floor(Math.max(0, Math.min(xpCurrent / xpForNext, 1)) * 100 * 10) / 10; - return { - xp: xp, - level: level, - maxLevel: maxLevel, - xpCurrent: xpCurrent, - xpForNext: xpForNext, - progress: progress, - cosmetic: Boolean('runecrafting' === type || 'social' === type) - }; -} - -export function getSlayerLevel(slayer: Record): SlayerData { - if (!slayer) { - return { xp: 0, tier1: 0, tier2: 0, tier3: 0, tier4: 0, tier5: 0, level: 0 }; - } - // eslint-disable-next-line camelcase - const { claimed_levels } = slayer; - let level = 0; - // eslint-disable-next-line camelcase - for (const levelName in claimed_levels) { - if (Object.prototype.hasOwnProperty.call(claimed_levels, levelName)) { - const newLevel = parseInt(levelName.replace('_special', '').split('_').pop() ?? '', 10); - if (newLevel > level) { - level = newLevel; - } - } - } - return { - xp: slayer.xp || 0, - tier1: slayer.boss_kills_tier_0 || 0, - tier2: slayer.boss_kills_tier_1 || 0, - tier3: slayer.boss_kills_tier_2 || 0, - tier4: slayer.boss_kills_tier_3 || 0, - tier5: slayer.boss_kills_tier_4 || 0, - level - }; -} - -export function getTrophyFishRank(level: number): TrophyFishRank { - if (1 === level) { - return 'Bronze'; - } else if (2 === level) { - return 'Silver'; - } else if (3 === level) { - return 'Gold'; - } else if (4 === level) { - return 'Diamond'; - } - return 'Bronze'; -} - -export function getSkills(data: Record): Skills { - const skillsObject: Skills = { - combat: getLevelByXp(data?.player_data?.experience?.SKILL_COMBAT ?? 0, 'combat'), - farming: getLevelByXp(data?.player_data?.experience?.SKILL_FARMING ?? 0, 'farming'), - fishing: getLevelByXp(data?.player_data?.experience?.SKILL_FISHING ?? 0, 'fishing'), - mining: getLevelByXp(data?.player_data?.experience?.SKILL_MINING ?? 0, 'mining'), - foraging: getLevelByXp(data?.player_data?.experience?.SKILL_FORAGING ?? 0, 'foraging'), - enchanting: getLevelByXp(data?.player_data?.experience?.SKILL_ENCHANTING ?? 0, 'enchanting'), - alchemy: getLevelByXp(data?.player_data?.experience?.SKILL_ALCHEMY ?? 0, 'alchemy'), - carpentry: getLevelByXp(data?.player_data?.experience?.SKILL_CARPENTRY ?? 0, 'carpentry'), - runecrafting: getLevelByXp(data?.player_data?.experience?.SKILL_RUNECRAFTING ?? 0, 'runecrafting'), - taming: getLevelByXp(data?.player_data?.experience?.SKILL_TAMING ?? 0, 'taming'), - social: getLevelByXp(data?.player_data?.experience?.SKILL_SOCIAL ?? 0, 'social'), - average: 0 - }; - const levels = Object.values(skillsObject) - .filter((skill) => true !== skill.cosmetic) - .map((skill) => skill.level); - skillsObject.average = levels.reduce((a, b) => a + b, 0) / levels.length; - return skillsObject; -} -function formatBestiaryMobs(userProfile: Record, mobs: any) { - const output = []; - for (const mob of mobs) { - const mobBracket = bestiaryBrackets?.[mob.bracket] || []; - const totalKills = mob.mobs.reduce((acc: any, cur: any) => { - return acc + (userProfile.bestiary.kills[cur] ?? 0); - }, 0); - const maxKills = mob.cap; - const nextTierKills = mobBracket.find((tier: any) => totalKills < tier && tier <= maxKills); - const tier = nextTierKills ? mobBracket.indexOf(nextTierKills) : mobBracket.indexOf(maxKills) + 1; - output.push({ tier: tier }); - } - return output; -} - -export function getBestiaryLevel(userProfile: Record): number { - if (userProfile?.bestiary?.kills === undefined) { - return 0; - } - const output: { [key: string]: any } = {}; - let tiersUnlocked = 0; - for (const [category, data] of Object.entries(Constants.bestiary)) { - const { mobs } = data as { mobs: any }; - output[category] = {}; - if ('fishing' === category) { - for (const [key, value] of Object.entries(data)) { - output[category][key] = { mobs: formatBestiaryMobs(userProfile, value.mobs) }; - tiersUnlocked += output[category][key].mobs.reduce((acc: any, cur: any) => acc + cur.tier, 0); - } - } else { - output[category].mobs = formatBestiaryMobs(userProfile, mobs); - tiersUnlocked += output[category].mobs.reduce((acc: any, cur: any) => acc + cur.tier, 0); - } - } - return tiersUnlocked / 10; -} - -export function getSlayer(data: Record): Slayer | null { - if (!data?.slayer?.slayer_bosses) return null; - return { - zombie: getSlayerLevel(data?.slayer?.slayer_bosses?.zombie), - spider: getSlayerLevel(data?.slayer?.slayer_bosses?.spider), - wolf: getSlayerLevel(data?.slayer?.slayer_bosses?.wolf), - enderman: getSlayerLevel(data?.slayer?.slayer_bosses?.enderman), - blaze: getSlayerLevel(data?.slayer?.slayer_bosses?.blaze), - vampire: getSlayerLevel(data?.slayer?.slayer_bosses?.vampire) - }; -} - -function getCompletions(data: Record): Record { - const completions: Record = { total: 0 }; - for (const tier in data) { - if ('total' === tier) continue; - completions[`Floor_${tier}`] = data?.[tier]; - completions.total += data?.[tier]; - } - return completions; -} - -function getDungeonsFloor( - data: Record, - type: 'catacombs' | 'master_catacombs', - floor: '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' -) { - return { - fastestRun: (data?.dungeons?.dungeon_types?.[type]?.best_runs?.[floor] || [])?.sort( - (a: RawDungeonRun, b: RawDungeonRun) => a?.elapsed_time - b?.elapsed_time - )[0], - fastestSRun: (data?.dungeons?.dungeon_types?.[type]?.best_runs?.[floor] || []) - ?.filter( - (run: RawDungeonRun) => 270 >= run?.score_exploration + run?.score_speed + run?.score_skill + run?.score_bonus - ) - ?.sort((a: RawDungeonRun, b: RawDungeonRun) => a?.elapsed_time - b?.elapsed_time)[0], - fastestSPlusRun: (data?.dungeons?.dungeon_type?.s[type]?.best_runs?.[floor] || []) - ?.filter( - (run: RawDungeonRun) => 300 >= run?.score_exploration + run?.score_speed + run?.score_skill + run?.score_bonus - ) - ?.sort((a: RawDungeonRun, b: RawDungeonRun) => a?.elapsed_time - b?.elapsed_time)[0], - completions: data?.dungeonXp?.dungeon_types?.[type]?.tier_completions?.[floor] || 0 - }; -} - -export function getDungeons(data: Record): Dungeons { - return { - experience: getLevelByXp(data?.dungeons?.dungeon_types?.catacombs?.experience || 0, 'dungeons'), - secrets: data?.dungeons?.secrets || 0, - completions: { - catacombs: getCompletions(data?.dungeons?.dungeon_types?.catacombs?.tier_completions), - masterMode: getCompletions(data?.dungeons?.dungeon_types?.master_catacombs?.tier_completions) - }, - floors: { - entrance: getDungeonsFloor(data, 'catacombs', '0'), - floor1: getDungeonsFloor(data, 'catacombs', '1'), - floor2: getDungeonsFloor(data, 'catacombs', '2'), - floor3: getDungeonsFloor(data, 'catacombs', '3'), - floor4: getDungeonsFloor(data, 'catacombs', '4'), - floor5: getDungeonsFloor(data, 'catacombs', '5'), - floor6: getDungeonsFloor(data, 'catacombs', '6'), - floor7: getDungeonsFloor(data, 'catacombs', '7'), - masterMode1: getDungeonsFloor(data, 'master_catacombs', '1'), - masterMode2: getDungeonsFloor(data, 'master_catacombs', '2'), - masterMode3: getDungeonsFloor(data, 'master_catacombs', '3'), - masterMode4: getDungeonsFloor(data, 'master_catacombs', '4'), - masterMode5: getDungeonsFloor(data, 'master_catacombs', '5'), - masterMode6: getDungeonsFloor(data, 'master_catacombs', '6'), - masterMode7: getDungeonsFloor(data, 'master_catacombs', '7') - }, - classes: { - healer: getLevelByXp(data?.dungeons?.player_classes?.healer?.experience || 0, 'dungeons'), - mage: getLevelByXp(data?.dungeons?.player_classes?.mage?.experience || 0, 'dungeons'), - berserk: getLevelByXp(data?.dungeons?.player_classes?.berserk?.experience || 0, 'dungeons'), - archer: getLevelByXp(data?.dungeons?.player_classes?.archer?.experience || 0, 'dungeons'), - tank: getLevelByXp(data?.dungeons?.player_classes?.tank?.experience || 0, 'dungeons'), - selected: data?.dungeons?.selected_dungeon_class || 'mage' - }, - essence: { - diamond: data?.currencies?.essence?.DIAMOND?.current || 0, - dragon: data?.currencies?.essence?.DRAGON?.current || 0, - spider: data?.currencies?.essence?.SPIDER?.current || 0, - wither: data?.currencies?.essence?.WITHER?.current || 0, - undead: data?.currencies?.essence?.UNDEAD?.current || 0, - gold: data?.currencies?.essence?.GOLD?.current || 0, - ice: data?.currencies?.essence?.ICE?.current || 0, - crimson: data?.currencies?.essence?.CRIMSON?.current || 0 - } - }; -} - -export function getJacobData(data: Record): JacobData { - return { - medals: { - bronze: data?.jacobs_contest?.medals_inv?.bronze || 0, - silver: data?.jacobs_contest?.medals_inv?.silver || 0, - gold: data?.jacobs_contest?.medals_inv?.gold || 0 - }, - perks: { - doubleDrops: data?.jacobs_contest?.perks?.double_drops || 0, - farmingLevelCap: data?.jacobs_contest?.perks?.farming_level_cap || 0, - personalBests: data?.jacobs_contest?.perks?.personal_bests || false - }, - contests: data?.jacobs_contestcontests || {} - }; -} - -export function getChocolateFactory(data: Record): ChocolateFactoryData { - if (!data?.events?.easter) { - return { - employees: { bro: 0, cousin: 0, sis: 0, father: 0, grandma: 0, dog: 0, uncle: 0 }, - chocolate: { current: 0, total: 0, sincePrestige: 0 }, - timeTower: { charges: 0, level: 0 }, - upgrades: { click: 0, multiplier: 0, rabbitRarity: 0 }, - goldenClick: { amount: 0, year: 0 }, - barnCapacity: 0, - prestige: 0 - }; - } - return { - employees: { - bro: data?.events?.easter?.employees?.rabbit_bro || 0, - cousin: data?.events?.easter?.employees?.rabbit_cousin || 0, - sis: data?.events?.easter?.employees?.rabbit_sis || 0, - father: data?.events?.easter?.employees?.rabbit_father || 0, - grandma: data?.events?.easter?.employees?.rabbit_grandma || 0, - dog: data?.events?.easter?.employees?.rabbit_dog || 0, - uncle: data?.events?.easter?.employees?.rabbit_uncle || 0 - }, - chocolate: { - current: data?.events?.easter?.chocolate || 0, - total: data?.events?.easter?.total_chocolate || 0, - sincePrestige: data?.events?.easter?.chocolate_since_prestige || 0 - }, - timeTower: { - charges: data?.events?.easter?.time_tower?.charges || 0, - level: data?.events?.easter?.time_tower?.level || 0 - }, - upgrades: { - click: data?.events?.easter?.click_upgrades || 0, - multiplier: data?.events?.easter?.chocolate_multiplier_upgrades || 0, - rabbitRarity: data?.events?.easter?.rabbit_rarity_upgrades || 0 - }, - goldenClick: { - amount: data?.events?.easter?.golden_click_amount || 0, - year: data?.events?.easter?.golden_click_year || 0 - }, - barnCapacity: data?.events?.easter?.rabbit_barn_capacity_level || 0, - prestige: data?.events?.easter?.chocolate_level || 0 - }; -} - -export function getPetLevel(petExp: number, offsetRarity: keyof typeof petRarityOffset, maxLevel: number) { - const rarityOffset = petRarityOffset[offsetRarity] || 0; - const levels = petLevels.slice(rarityOffset, rarityOffset + maxLevel - 1) as number[]; - const xpMaxLevel = levels.reduce((a, b) => a + b, 0); - let xpTotal = 0; - let level = 1; - let xpForNext; - for (let i = 0; i < maxLevel; i++) { - xpTotal += levels?.[i] || 0; - if (xpTotal > petExp) { - xpTotal -= levels?.[i] || 0; - break; - } else { - level++; - } - } - let xpCurrent = Math.floor(petExp - xpTotal); - let progress; - if (level < maxLevel) { - xpForNext = Math.ceil(levels?.[level - 1] || 0); - progress = Math.max(0, Math.min(xpCurrent / xpForNext, 1)); - } else { - level = maxLevel; - xpCurrent = petExp - (levels?.[maxLevel - 1] || 0); - xpForNext = 0; - progress = 1; - } - return { level, xpCurrent, xpForNext, progress, xpMaxLevel }; -} - -export function parseRarity(str: string): Rarity { - const rarityArray = [ - 'COMMON', - 'UNCOMMON', - 'RARE', - 'EPIC', - 'LEGENDARY', - 'MYTHIC', - 'DIVINE', - 'SPECIAL', - 'VERY SPECIAL' - ]; - for (const rarity of rarityArray) { - if (str.includes(rarity)) return rarity as Rarity; - } - return 'COMMON'; -} - -export function parseGearScore(lore: any): number { - for (const line of lore) { - if (line.match(/Gear Score: §[0-9a-f](\d+)/)) return Number(line.match(/Gear Score: §d(\d+)/)[1]); - } - return 0; -} - -function getScore(points: number): CrimsonIsleDojoRank { - if (1000 <= points) { - return 'S'; - } else if (800 <= points) { - return 'A'; - } else if (600 <= points) { - return 'B'; - } else if (400 <= points) { - return 'C'; - } else if (200 <= points) { - return 'D'; - } - return 'F'; -} - -function getBelt(points: number): CrimsonIsleBelt { - if (7000 <= points) { - return 'Black'; - } else if (6000 <= points) { - return 'Brown'; - } else if (4000 <= points) { - return 'Blue'; - } else if (2000 <= points) { - return 'Green'; - } else if (1000 <= points) { - return 'Yellow'; - } - return 'White'; -} - -export function getCrimsonIsle(data: Record): CrimsonIsle { - return { - faction: data?.nether_island_player_data?.selected_faction || null, - reputation: { - barbarians: data?.nether_island_player_data?.barbarians_reputation ?? 0, - mages: data?.nether_island_player_data?.mages_reputation ?? 0 - }, - trophyFish: { - rank: getTrophyFishRank((data?.nether_island_player_data?.trophy_fish?.rewards ?? [])?.length), - caught: { - total: data?.nether_island_player_data?.trophy_fish?.total_caught || 0, - bronze: - Object.keys(data?.nether_island_player_data?.trophy_fish || {}).filter((key) => key.endsWith('_bronze')) - .length || 0, - silver: - Object.keys(data?.nether_island_player_data?.trophy_fish || {}).filter((key) => key.endsWith('_silver')) - .length || 0, - gold: - Object.keys(data?.nether_island_player_data?.trophy_fish || {}).filter((key) => key.endsWith('_gold')) - .length || 0, - diamond: - Object.keys(data?.nether_island_player_data?.trophy_fish || {}).filter((key) => key.endsWith('_diamond')) - .length || 0 - } - }, - dojo: { - belt: getBelt( - Object.keys(data?.nether_island_player_data?.dojo ?? {}) - .filter((key) => key.startsWith('dojo_points')) - .reduce((acc, key) => acc + (data?.nether_island_player_data?.dojo[key] || 0), 0) - ), - force: { - points: data?.nether_island_player_data?.dojo?.dojo_points_mob_kb || 0, - rank: getScore(data?.nether_island_player_data?.dojo?.dojo_points_mob_kb || 0) - }, - stamina: { - points: data?.nether_island_player_data?.dojo?.dojo_points_wall_jump || 0, - rank: getScore(data?.nether_island_player_data?.dojo?.dojo_points_wall_jump || 0) - }, - mastery: { - points: data?.nether_island_player_data?.dojo?.dojo_points_archer || 0, - rank: getScore(data?.nether_island_player_data?.dojo?.dojo_points_archer || 0) - }, - discipline: { - points: data?.nether_island_player_data?.dojo?.dojo_points_sword_swap || 0, - rank: getScore(data?.nether_island_player_data?.dojo?.dojo_points_sword_swap || 0) - }, - swiftness: { - points: data?.nether_island_player_data?.dojo?.dojo_points_snake || 0, - rank: getScore(data?.nether_island_player_data?.dojo?.dojo_points_snake || 0) - }, - control: { - points: data?.nether_island_player_data?.dojo?.dojo_points_lock_head || 0, - rank: getScore(data?.nether_island_player_data?.dojo?.dojo_points_lock_head || 0) - }, - tenacity: { - points: data?.nether_island_player_data?.dojo?.dojo_points_fireball || 0, - rank: getScore(data?.nether_island_player_data?.dojo?.dojo_points_fireball || 0) - } - }, - kuudra: { - none: data?.nether_island_player_data?.kuudra_completed_tiers?.none || 0, - hot: data?.nether_island_player_data?.kuudra_completed_tiers?.hot || 0, - burning: data?.nether_island_player_data?.kuudra_completed_tiers?.burning || 0, - fiery: data?.nether_island_player_data?.kuudra_completed_tiers?.fiery || 0, - highestWaveHot: data?.nether_island_player_data?.kuudra_completed_tiers?.highest_wave_hot || 0, - highestWaveFiery: data?.nether_island_player_data?.kuudra_completed_tiers?.highest_wave_fiery || 0, - infernal: data?.nether_island_player_data?.kuudra_completed_tiers?.infernal || 0, - highestWaveInfernal: data?.nether_island_player_data?.kuudra_completed_tiers?.highest_wave_infernal || 0, - highestWaveBurning: data?.nether_island_player_data?.kuudra_completed_tiers?.highest_wave_burning || 0 - } - }; -} - -export function getHOTM(data: Record): HOTM { - return { - experience: getLevelByXp(data?.mining_core?.experience || 0, 'hotm'), - ability: data?.mining_core?.selected_pickaxe_ability || 'none', - powder: { - mithril: { - spent: data?.mining_core?.powder_spent_mithril || 0, - current: data?.mining_core?.powder_mithril || 0, - total: data?.mining_core?.powder_spent_mithril || 0 + data?.mining_core?.powder_mithril || 0 - }, - gemstone: { - spent: data?.mining_core?.powder_spent_gemstone || 0, - current: data?.mining_core?.powder_gemstone || 0, - total: data?.mining_core?.powder_spent_gemstone || 0 + data?.mining_core?.powder_gemstone || 0 - }, - glacite: { - spent: data?.mining_core?.powder_spent_glacite || 0, - current: data?.mining_core?.powder_glacite || 0, - total: data?.mining_core?.powder_spent_glacite || 0 + data?.mining_core?.powder_glacite || 0 - } - } - }; -} diff --git a/src/Utils/TicksToMilliseconds.ts b/src/Utils/TicksToMilliseconds.ts new file mode 100644 index 000000000..1af5ed962 --- /dev/null +++ b/src/Utils/TicksToMilliseconds.ts @@ -0,0 +1,3 @@ +export default function TicksToMilliseconds(ticks: number): number { + return (ticks / 20) * 1000; +} diff --git a/src/index.ts b/src/index.ts index e62bd4cb1..05389f235 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ -/* v8 ignore next 400 */ +/* v8 ignore next 1000 */ /* eslint-disable max-len */ import Client from './Client.js'; @@ -9,20 +9,18 @@ export * from './Types/Booster.js'; export * from './Types/Client.js'; export * from './Types/Color.js'; export * from './Types/Game.js'; +export * from './Types/Global.js'; export * from './Types/Guild.js'; export * from './Types/Player.js'; export * from './Types/Requests.js'; -export * from './Types/Skyblock.js'; +export * from './Types/SkyBlock.js'; export * from './Types/Static.js'; import Achievements from './Structures/Static/Achievements/Achievements.js'; import Arcade from './Structures/MiniGames/Arcade/Arcade.js'; import ArenaBrawl from './Structures/MiniGames/ArenaBrawl/ArenaBrawl.js'; import ArenaBrawlMode from './Structures/MiniGames/ArenaBrawl/ArenaBrawlMode.js'; -import Auction from './Structures/SkyBlock/Auctions/Auction.js'; -import AuctionInfo from './Structures/SkyBlock/Auctions/AuctionInfo.js'; import BaseAchievement from './Structures/Static/Achievements/BaseAchievement.js'; -import BaseAuction from './Structures/SkyBlock/Auctions/BaseAuction.js'; import BedWars from './Structures/MiniGames/BedWars/BedWars.js'; import BedWarsBeds from './Structures/MiniGames/BedWars/BedWarsBeds.js'; import BedWarsCollectedItems from './Structures/MiniGames/BedWars/BedWarsCollectedItems.js'; @@ -37,9 +35,6 @@ import BedWarsPracticeModeAttempts from './Structures/MiniGames/BedWars/Practice import BedWarsPracticeRecord from './Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecord.js'; import BedWarsPracticeRecordElevation from './Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecordElevation.js'; import BedWarsPracticeStats from './Structures/MiniGames/BedWars/Practice/BedWarsPracticeStats.js'; -import Bid from './Structures/SkyBlock/Auctions/Bid.js'; -import Bingo from './Structures/SkyBlock/Static/Bingo.js'; -import BingoData from './Structures/SkyBlock/Static/BingoData.js'; import BlitzSurvivalGames from './Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.js'; import BlitzSurvivalGamesKit from './Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesKit.js'; import BlockingDead from './Structures/MiniGames/Arcade/BlockingDead.js'; @@ -47,7 +42,6 @@ import Booster from './Structures/Boosters/Booster.js'; import BountyHunters from './Structures/MiniGames/Arcade/BountyHunters.js'; import BowSpleef from './Structures/MiniGames/TNTGames/BowSpleef.js'; import BuildBattle from './Structures/MiniGames/BuildBattle.js'; -import Candidate from './Structures/SkyBlock/Static/Candidate.js'; import CaptureTheWool from './Structures/MiniGames/WoolGames/CaptureTheWool.js'; import Challenge from './Structures/Static/Challenge.js'; import Challenges from './Structures/Static/Challenges.js'; @@ -68,7 +62,6 @@ import DuelsSkyWars from './Structures/MiniGames/Duels/DuelsSkyWars.js'; import DuelsUHC from './Structures/MiniGames/Duels/DuelsUHC.js'; import EnderSpleef from './Structures/MiniGames/Arcade/EnderSpleef.js'; import FarmHunt from './Structures/MiniGames/Arcade/FarmHunt.js'; -import FireSale from './Structures/SkyBlock/Static/FireSale.js'; import Football from './Structures/MiniGames/Arcade/Football.js'; import GalaxyWars from './Structures/MiniGames/Arcade/GalaxyWars.js'; import Game from './Structures/Game.js'; @@ -77,7 +70,6 @@ import GameChallenges from './Structures/Static/GameChallenges.js'; import GameCounts from './Structures/GameCounts.js'; import GameQuests from './Structures/Static/GameQuests.js'; import Gifting from './Structures/Player/Gifting.js'; -import Government from './Structures/SkyBlock/Static/Government.js'; import Guild from './Structures/Guild/Guild.js'; import GuildAchievements from './Structures/Static/Achievements/GuildAchievements.js'; import GuildMember from './Structures/Guild/GuildMember.js'; @@ -97,13 +89,11 @@ import MonthlyCrate from './Structures/Player/MonthlyCrate.js'; import MurderMystery from './Structures/MiniGames/MurderMystery/MurderMystery.js'; import MurderMysteryModeStats from './Structures/MiniGames/MurderMystery/MurderMysteryModeStats.js'; import OneTimeAchivement from './Structures/Static/Achievements/OneTimeAchivement.js'; -import Order from './Structures/SkyBlock/Bazaar/Order.js'; import PVPRun from './Structures/MiniGames/TNTGames/PVPRun.js'; import Paintball from './Structures/MiniGames/Paintball.js'; import Parkour from './Structures/Player/Parkour.js'; import PartyGames from './Structures/MiniGames/Arcade/PartyGames.js'; import PartyPooper from './Structures/MiniGames/Arcade/PartyPooper.js'; -import Perk from './Structures/SkyBlock/Static/Perk.js'; import Pet from './Structures/Player/Pet.js'; import PetConsumables from './Structures/Player/PetConsumables.js'; import Pets from './Structures/Player/Pets.js'; @@ -118,7 +108,6 @@ import PlayerQuest from './Structures/Player/Quests/PlayerQuest.js'; import PlayerQuestCompletion from './Structures/Player/Quests/PlayerQuestCompletion.js'; import PlayerQuestCompletions from './Structures/Player/Quests/PlayerQuestCompletions.js'; import PlayerQuests from './Structures/Player/Quests/PlayerQuests.js'; -import Product from './Structures/SkyBlock/Bazaar/Product.js'; import PropHunt from './Structures/MiniGames/Arcade/PropHunt.js'; import Quakecraft from './Structures/MiniGames/Quakecraft/Quakecraft.js'; import QuakecraftMode from './Structures/MiniGames/Quakecraft/QuakecraftMode.js'; @@ -133,25 +122,169 @@ import SeasonBingoTier from './Structures/Player/Seasonal/SeasonBingoTier.js'; import SeasonYear from './Structures/Player/Seasonal/SeasonYear.js'; import Seasonal from './Structures/Player/Seasonal/Seasonal.js'; import SheepWars from './Structures/MiniGames/WoolGames/SheepWars.js'; +import SkyBlockAuction from './Structures/SkyBlock/Auctions/SkyBlockAuction.js'; +import SkyBlockAuctionBid from './Structures/SkyBlock/Auctions/SkyBlockAuctionBid.js'; +import SkyBlockAuctionInfo from './Structures/SkyBlock/Auctions/SkyBlockAuctionInfo.js'; +import SkyBlockBaseAuction from './Structures/SkyBlock/Auctions/SkyBlockBaseAuction.js'; +import SkyBlockBaseAuctionInfo from './Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.js'; +import SkyBlockBazaar from './Structures/SkyBlock/Bazaar/SkyBlockBazaar.js'; +import SkyBlockBazaarProduct from './Structures/SkyBlock/Bazaar/SkyBlockBazaarProduct.js'; +import SkyBlockBazaarProductOrder from './Structures/SkyBlock/Bazaar/SkyBlockBazaarProductOrder.js'; +import SkyBlockBazaarQuickStatus from './Structures/SkyBlock/Bazaar/SkyBlockBazaarQuickStatus.js'; +import SkyBlockBingo from './Structures/SkyBlock/Bingo/SkyBlockBingo.js'; +import SkyBlockBingoGoal from './Structures/SkyBlock/Bingo/SkyBlockBingoGoal.js'; +import SkyBlockCollection from './Structures/SkyBlock/Collections/SkyBlockCollection.js'; +import SkyBlockCollectionTier from './Structures/SkyBlock/Collections/SkyBlockCollectionTier.js'; +import SkyBlockCollections from './Structures/SkyBlock/Collections/SkyBlockCollections.js'; +import SkyBlockElection from './Structures/SkyBlock/Election/SkyBlockElection.js'; +import SkyBlockElectionCandidate from './Structures/SkyBlock/Election/SkyBlockElectionCandidate.js'; +import SkyBlockElectionCandidatePerk from './Structures/SkyBlock/Election/SkyBlockElectionCandidatePerk.js'; +import SkyBlockElectionData from './Structures/SkyBlock/Election/SkyBlockElectionData.js'; +import SkyBlockFireSale from './Structures/SkyBlock/FireSale/SkyBlockFireSale.js'; +import SkyBlockGarden from './Structures/SkyBlock/Garden/SkyBlockGarden.js'; +import SkyBlockGardenActiveVisitor from './Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitor.js'; +import SkyBlockGardenActiveVisitorRequirement from './Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitorRequirement.js'; +import SkyBlockGardenComposter from './Structures/SkyBlock/Garden/SkyBlockGardenComposter.js'; +import SkyBlockGardenComposterUpgrades from './Structures/SkyBlock/Garden/SkyBlockGardenComposterUpgrades.js'; +import SkyBlockGardenCropMilestones from './Structures/SkyBlock/Garden/SkyBlockGardenCropMilestones.js'; +import SkyBlockGardenCropsUpgrades from './Structures/SkyBlock/Garden/SkyBlockGardenCropsUpgrades.js'; +import SkyBlockGardenVisitors from './Structures/SkyBlock/Garden/SkyBlockGardenVisitors.js'; +import SkyBlockInventoryItem from './Structures/SkyBlock/Inventory/SkyBlockInventoryItem.js'; +import SkyBlockInventoryItemAttribute from './Structures/SkyBlock/Inventory/SkyBlockInventoryItemAttribute.js'; +import SkyBlockInventoryItemEnchantment from './Structures/SkyBlock/Inventory/SkyBlockInventoryItemEnchantment.js'; +import SkyBlockInventoryItemRune from './Structures/SkyBlock/Inventory/SkyBlockInventoryItemRune.js'; +import SkyBlockItem from './Structures/SkyBlock/SkyBlockItem.js'; +import SkyBlockMember from './Structures/SkyBlock/Member/SkyBlockMember.js'; +import SkyBlockMemberAccessoryBag from './Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBag.js'; +import SkyBlockMemberAccessoryBagTuning from './Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBagTuning.js'; +import SkyBlockMemberAccessoryBagTuningSlot from './Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBagTuningSlot.js'; +import SkyBlockMemberBestiary from './Structures/SkyBlock/Member/Bestiary/SkyBlockMemberBestiary.js'; +import SkyBlockMemberChocolateFactory from './Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactory.js'; +import SkyBlockMemberChocolateFactoryEggs from './Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryEggs.js'; +import SkyBlockMemberChocolateFactoryEmployees from './Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryEmployees.js'; +import SkyBlockMemberChocolateFactoryHitmen from './Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryHitmen.js'; +import SkyBlockMemberChocolateFactoryTimeTower from './Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryTimeTower.js'; +import SkyBlockMemberChocolateFactoryUpgrades from './Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryUpgrades.js'; +import SkyBlockMemberCrimsonIsle from './Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsle.js'; +import SkyBlockMemberCrimsonIsleAbiphone from './Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleAbiphone.js'; +import SkyBlockMemberCrimsonIsleDojo from './Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojo.js'; +import SkyBlockMemberCrimsonIsleDojoMinigame from './Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojoMinigame.js'; +import SkyBlockMemberCrimsonIsleKuudra from './Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleKuudra.js'; +import SkyBlockMemberCrimsonIsleKuudraPartyFinder from './Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleKuudraPartyFinder.js'; +import SkyBlockMemberCrimsonIsleMatriarch from './Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleMatriarch.js'; +import SkyBlockMemberCrimsonIsleTrophyFish from './Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish.js'; +import SkyBlockMemberCrimsonIsleTrophyFishFish from './Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFishFish.js'; +import SkyBlockMemberCurrencies from './Structures/SkyBlock/Member/SkyBlockMemberCurrencies.js'; +import SkyBlockMemberDungeons from './Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeons.js'; +import SkyBlockMemberDungeonsClasses from './Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsClasses.js'; +import SkyBlockMemberDungeonsFloor from './Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsFloor.js'; +import SkyBlockMemberDungeonsFloorRun from './Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsFloorRun.js'; +import SkyBlockMemberDungeonsMode from './Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsMode.js'; +import SkyBlockMemberDungeonsTreasureRun from './Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasureRun.js'; +import SkyBlockMemberDungeonsTreasuresChest from './Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasuresChest.js'; +import SkyBlockMemberFairySouls from './Structures/SkyBlock/Member/SkyBlockMemberFairySouls.js'; +import SkyBlockMemberInventories from './Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.js'; +import SkyBlockMemberInventoriesArmor from './Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmor.js'; +import SkyBlockMemberInventoriesArmorDecoded from './Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmorDecoded.js'; +import SkyBlockMemberInventoriesBackpack from './Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.js'; +import SkyBlockMemberInventoriesBackpackDecoded from './Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpackDecoded.js'; +import SkyBlockMemberInventoriesBackpacks from './Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpacks.js'; +import SkyBlockMemberInventoriesBags from './Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBags.js'; +import SkyBlockMemberInventoriesBagsTalisman from './Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalisman.js'; +import SkyBlockMemberInventoriesBagsTalismanDecoded from './Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalismanDecoded.js'; +import SkyBlockMemberInventoriesBaseInventory from './Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventoriesBaseInventory.js'; +import SkyBlockMemberInventoriesEquipment from './Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipment.js'; +import SkyBlockMemberInventoriesEquipmentDecoded from './Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipmentDecoded.js'; +import SkyBlockMemberInventoriesInventory from './Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventory.js'; +import SkyBlockMemberInventoriesInventoryDecoded from './Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventoryDecoded.js'; +import SkyBlockMemberJacobContest from './Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContest.js'; +import SkyBlockMemberJacobContests from './Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContests.js'; +import SkyBlockMemberJacobContestsMedals from './Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsMedals.js'; +import SkyBlockMemberJacobContestsPerks from './Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsPerks.js'; +import SkyBlockMemberJacobContestsUniqueBrackets from './Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsUniqueBrackets.js'; +import SkyBlockMemberLeveling from './Structures/SkyBlock/Member/SkyBlockMemberLeveling.js'; +import SkyBlockMemberMining from './Structures/SkyBlock/Member/Mining/SkyBlockMemberMining.js'; +import SkyBlockMemberMiningCrystal from './Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningCrystal.js'; +import SkyBlockMemberMiningHotm from './Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotm.js'; +import SkyBlockMemberMiningHotmForge from './Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForge.js'; +import SkyBlockMemberMiningHotmForgeItem from './Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForgeItem.js'; +import SkyBlockMemberMiningPowder from './Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningPowder.js'; +import SkyBlockMemberMiningPowders from './Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningPowders.js'; +import SkyBlockMemberObjectives from './Structures/SkyBlock/Member/SkyBlockMemberObjectives.js'; +import SkyBlockMemberPet from './Structures/SkyBlock/Member/Pets/SkyBlockMemberPet.js'; +import SkyBlockMemberPets from './Structures/SkyBlock/Member/Pets/SkyBlockMemberPets.js'; +import SkyBlockMemberPetsAutoPetRule from './Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsAutoPetRule.js'; +import SkyBlockMemberPetsAutoPets from './Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsAutoPets.js'; +import SkyBlockMemberPetsCare from './Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsCare.js'; +import SkyBlockMemberPlayerData from './Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerData.js'; +import SkyBlockMemberPlayerDataActiveEffect from './Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataActiveEffect.js'; +import SkyBlockMemberPlayerDataMinion from './Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataMinion.js'; +import SkyBlockMemberPlayerDataMinions from './Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataMinions.js'; +import SkyBlockMemberPlayerDataSkills from './Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataSkills.js'; +import SkyBlockMemberPlayerStats from './Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStats.js'; +import SkyBlockMemberPlayerStatsAuctions from './Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsAuctions.js'; +import SkyBlockMemberPlayerStatsAuctionsStats from './Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsAuctionsStats.js'; +import SkyBlockMemberPlayerStatsCandy from './Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsCandy.js'; +import SkyBlockMemberPlayerStatsEndIsland from './Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIsland.js'; +import SkyBlockMemberPlayerStatsEndIslandDragonFight from './Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFight.js'; +import SkyBlockMemberPlayerStatsEndIslandDragonFightDragon from './Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFightDragon.js'; +import SkyBlockMemberPlayerStatsFishing from './Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsFishing.js'; +import SkyBlockMemberPlayerStatsGifts from './Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsGifts.js'; +import SkyBlockMemberPlayerStatsMythos from './Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsMythos.js'; +import SkyBlockMemberPlayerStatsSpookyFestival from './Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsSpookyFestival.js'; +import SkyBlockMemberPlayerStatsWinter from './Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsWinter.js'; +import SkyBlockMemberProfile from './Structures/SkyBlock/Member/SkyBlockMemberProfile.js'; +import SkyBlockMemberQuests from './Structures/SkyBlock/Member/Quests/SkyBlockMemberQuests.js'; +import SkyBlockMemberQuestsHarp from './Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsHarp.js'; +import SkyBlockMemberQuestsHarpSong from './Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsHarpSong.js'; +import SkyBlockMemberQuestsTrapper from './Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsTrapper.js'; +import SkyBlockMemberRift from './Structures/SkyBlock/Member/Rift/SkyBlockMemberRift.js'; +import SkyBlockMemberRiftAccess from './Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftAccess.js'; +import SkyBlockMemberRiftBlackLagoon from './Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftBlackLagoon.js'; +import SkyBlockMemberRiftCastle from './Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftCastle.js'; +import SkyBlockMemberRiftDeadCats from './Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftDeadCats.js'; +import SkyBlockMemberRiftDreamFarm from './Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftDreamFarm.js'; +import SkyBlockMemberRiftEnigma from './Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftEnigma.js'; +import SkyBlockMemberRiftGallery from './Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftGallery.js'; +import SkyBlockMemberRiftGallerySecuredTrophy from './Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftGallerySecuredTrophy.js'; +import SkyBlockMemberRiftInventory from './Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftInventory.js'; +import SkyBlockMemberRiftVillagePlaza from './Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlaza.js'; +import SkyBlockMemberRiftVillagePlazaBarry from './Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaBarry.js'; +import SkyBlockMemberRiftVillagePlazaCowboy from './Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaCowboy.js'; +import SkyBlockMemberRiftVillagePlazaMurder from './Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaMurder.js'; +import SkyBlockMemberRiftWestVillage from './Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillage.js'; +import SkyBlockMemberRiftWestVillageCrazyKloon from './Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageCrazyKloon.js'; +import SkyBlockMemberRiftWestVillageGlyphs from './Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageGlyphs.js'; +import SkyBlockMemberRiftWestVillageKatHouse from './Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageKatHouse.js'; +import SkyBlockMemberRiftWestVillageMirrorverse from './Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageMirrorverse.js'; +import SkyBlockMemberRiftWitherCage from './Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWitherCage.js'; +import SkyBlockMemberRiftWizardTower from './Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWizardTower.js'; +import SkyBlockMemberRiftWyldWoods from './Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWyldWoods.js'; +import SkyBlockMemberSlayer from './Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayer.js'; +import SkyBlockMemberSlayerClaimedLevels from './Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayerClaimedLevels.js'; +import SkyBlockMemberSlayers from './Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayers.js'; +import SkyBlockMemberSlayersQuest from './Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayersQuest.js'; +import SkyBlockMuseum from './Structures/SkyBlock/Museum/SkyBlockMuseum.js'; +import SkyBlockMuseumItem from './Structures/SkyBlock/Museum/SkyBlockMuseumItem.js'; +import SkyBlockMuseumMember from './Structures/SkyBlock/Museum/SkyBlockMuseumMember.js'; +import SkyBlockNews from './Structures/SkyBlock/News/SkyBlockNews.js'; +import SkyBlockPotionEffect from './Structures/SkyBlock/Potion/SkyBlockPotionEffect.js'; +import SkyBlockProfile from './Structures/SkyBlock/Profile/SkyBlockProfile.js'; +import SkyBlockProfileBanking from './Structures/SkyBlock/Profile/Banking/SkyBlockProfileBanking.js'; +import SkyBlockProfileCommunityUpgrades from './Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgrades.js'; +import SkyBlockProfileCommunityUpgradesUpgrade from './Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgrade.js'; +import SkyBlockProfileCommunityUpgradesUpgraded from './Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgraded.js'; +import SkyBlockProfileCommunityUpgradesUpgrading from './Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgrading.js'; +import SkyBlockProfilesBankingTransaction from './Structures/SkyBlock/Profile/Banking/SkyBlockProfilesBankingTransaction.js'; +import SkyBlockSkill from './Structures/SkyBlock/Skills/SkyBlockSkill.js'; +import SkyBlockSkillLevel from './Structures/SkyBlock/Skills/SkyBlockSkillLevel.js'; +import SkyBlockSkills from './Structures/SkyBlock/Skills/SkyBlockSkills.js'; import SkyWars from './Structures/MiniGames/SkyWars/SkyWars.js'; import SkyWarsKit from './Structures/MiniGames/SkyWars/SkyWarsKit.js'; import SkyWarsKits from './Structures/MiniGames/SkyWars/SkyWarsKits.js'; import SkyWarsMode from './Structures/MiniGames/SkyWars/SkyWarsMode.js'; import SkyWarsModeStats from './Structures/MiniGames/SkyWars/SkyWarsModeStats.js'; import SkyWarsPackages from './Structures/MiniGames/SkyWars/SkyWarsPackages.js'; -import SkyblockGarden from './Structures/SkyBlock/SkyblockGarden.js'; -import SkyblockGemstone from './Structures/SkyBlock/SkyblockGemstone.js'; -import SkyblockInventoryItem from './Structures/SkyBlock/SkyblockInventoryItem.js'; -import SkyblockItem from './Structures/SkyBlock/SkyblockItem.js'; -import SkyblockMember from './Structures/SkyBlock/SkyblockMember.js'; -import SkyblockMemberMinion from './Structures/SkyBlock/SkyblockMemberMinion.js'; -import SkyblockMemberMinions from './Structures/SkyBlock/SkyblockMemberMinions.js'; -import SkyblockMemberStats from './Structures/SkyBlock/SkyblockMemberStats.js'; -import SkyblockMuseum from './Structures/SkyBlock/SkyblockMuseum.js'; -import SkyblockMuseumItem from './Structures/SkyBlock/SkyblockMuseumItem.js'; -import SkyblockNews from './Structures/SkyBlock/News/SkyblockNews.js'; -import SkyblockPet from './Structures/SkyBlock/SkyblockPet.js'; -import SkyblockProfile from './Structures/SkyBlock/SkyblockProfile.js'; import SmashHeoresHero from './Structures/MiniGames/SmashHeroes/SmashHeoresHero.js'; import SmashHeroes from './Structures/MiniGames/SmashHeroes/SmashHeroes.js'; import SmashHeroesMode from './Structures/MiniGames/SmashHeroes/SmashHeroesMode.js'; @@ -187,41 +320,11 @@ export default { Client, Errors, - Booster, - Color, - Game, - GameCounts, - Guild, - GuildMember, - GuildRank, - House, - Housing, - ItemBytes, - Leaderboard, + Achievements, Arcade, - BlockingDead, - BountyHunters, - DragonWars, - Dropper, - DropperMap, - EnderSpleef, - FarmHunt, - Football, - GalaxyWars, - HideAndSeek, - HoleInTheWall, - HypixelSays, - MiniWalls, - PartyGames, - PartyPooper, - PixelParty, - PixelPartyGameMode, - PropHunt, - ThrowOut, - Zombies, - ZombiesStats, ArenaBrawl, ArenaBrawlMode, + BaseAchievement, BedWars, BedWarsBeds, BedWarsCollectedItems, @@ -238,10 +341,22 @@ export default { BedWarsPracticeStats, BlitzSurvivalGames, BlitzSurvivalGamesKit, + BlockingDead, + Booster, + BountyHunters, + BowSpleef, BuildBattle, + CaptureTheWool, + Challenge, + Challenges, + Color, CopsAndCrims, CopsAndCrimsGamemode, CopsAndCrimsGun, + Cosmetics, + DragonWars, + Dropper, + DropperMap, Duels, DuelsBridge, DuelsGamemode, @@ -249,16 +364,225 @@ export default { DuelsOP, DuelsSkyWars, DuelsUHC, + EnderSpleef, + FarmHunt, + Football, + GalaxyWars, + Game, + GameAchievements, + GameChallenges, + GameCounts, + GameQuests, + Gifting, + Guild, + GuildAchievements, + GuildMember, + GuildRank, + HideAndSeek, + HoleInTheWall, + House, + Housing, + HypixelSays, + ItemBytes, + Leaderboard, MegaWalls, MegaWallsKitStats, MegaWallsModeStats, + MiniWalls, + MonthlyCrate, MurderMystery, MurderMysteryModeStats, + OneTimeAchivement, + PVPRun, Paintball, + Parkour, + PartyGames, + PartyPooper, + Pet, + PetConsumables, + Pets, Pit, PitInventoryItem, + PixelParty, + PixelPartyGameMode, + Player, + PlayerAchievements, + PlayerAchievementsRewards, + PlayerQuest, + PlayerQuestCompletion, + PlayerQuestCompletions, + PlayerQuests, + PropHunt, Quakecraft, QuakecraftMode, + Quest, + QuestObjective, + Quests, + RecentGame, + Rewards, + Season, + SeasonBingo, + SeasonBingoTier, + SeasonYear, + Seasonal, + SheepWars, + SkyBlockAuction, + SkyBlockAuctionBid, + SkyBlockAuctionInfo, + SkyBlockBaseAuction, + SkyBlockBaseAuctionInfo, + SkyBlockBazaar, + SkyBlockBazaarProduct, + SkyBlockBazaarProductOrder, + SkyBlockBazaarQuickStatus, + SkyBlockBingo, + SkyBlockBingoGoal, + SkyBlockCollection, + SkyBlockCollectionTier, + SkyBlockCollections, + SkyBlockElection, + SkyBlockElectionCandidate, + SkyBlockElectionCandidatePerk, + SkyBlockElectionData, + SkyBlockFireSale, + SkyBlockGarden, + SkyBlockGardenActiveVisitor, + SkyBlockGardenActiveVisitorRequirement, + SkyBlockGardenComposter, + SkyBlockGardenComposterUpgrades, + SkyBlockGardenCropMilestones, + SkyBlockGardenCropsUpgrades, + SkyBlockGardenVisitors, + SkyBlockInventoryItem, + SkyBlockInventoryItemAttribute, + SkyBlockInventoryItemEnchantment, + SkyBlockInventoryItemRune, + SkyBlockItem, + SkyBlockMember, + SkyBlockMemberAccessoryBag, + SkyBlockMemberAccessoryBagTuning, + SkyBlockMemberAccessoryBagTuningSlot, + SkyBlockMemberBestiary, + SkyBlockMemberChocolateFactory, + SkyBlockMemberChocolateFactoryEggs, + SkyBlockMemberChocolateFactoryEmployees, + SkyBlockMemberChocolateFactoryHitmen, + SkyBlockMemberChocolateFactoryTimeTower, + SkyBlockMemberChocolateFactoryUpgrades, + SkyBlockMemberCrimsonIsle, + SkyBlockMemberCrimsonIsleAbiphone, + SkyBlockMemberCrimsonIsleDojo, + SkyBlockMemberCrimsonIsleDojoMinigame, + SkyBlockMemberCrimsonIsleKuudra, + SkyBlockMemberCrimsonIsleKuudraPartyFinder, + SkyBlockMemberCrimsonIsleMatriarch, + SkyBlockMemberCrimsonIsleTrophyFish, + SkyBlockMemberCrimsonIsleTrophyFishFish, + SkyBlockMemberCurrencies, + SkyBlockMemberDungeons, + SkyBlockMemberDungeonsClasses, + SkyBlockMemberDungeonsFloor, + SkyBlockMemberDungeonsFloorRun, + SkyBlockMemberDungeonsMode, + SkyBlockMemberDungeonsTreasureRun, + SkyBlockMemberDungeonsTreasuresChest, + SkyBlockMemberFairySouls, + SkyBlockMemberInventories, + SkyBlockMemberInventoriesArmor, + SkyBlockMemberInventoriesArmorDecoded, + SkyBlockMemberInventoriesBackpack, + SkyBlockMemberInventoriesBackpackDecoded, + SkyBlockMemberInventoriesBackpacks, + SkyBlockMemberInventoriesBags, + SkyBlockMemberInventoriesBagsTalisman, + SkyBlockMemberInventoriesBagsTalismanDecoded, + SkyBlockMemberInventoriesBaseInventory, + SkyBlockMemberInventoriesEquipment, + SkyBlockMemberInventoriesEquipmentDecoded, + SkyBlockMemberInventoriesInventory, + SkyBlockMemberInventoriesInventoryDecoded, + SkyBlockMemberJacobContest, + SkyBlockMemberJacobContests, + SkyBlockMemberJacobContestsMedals, + SkyBlockMemberJacobContestsPerks, + SkyBlockMemberJacobContestsUniqueBrackets, + SkyBlockMemberLeveling, + SkyBlockMemberMining, + SkyBlockMemberMiningCrystal, + SkyBlockMemberMiningHotm, + SkyBlockMemberMiningHotmForge, + SkyBlockMemberMiningHotmForgeItem, + SkyBlockMemberMiningPowder, + SkyBlockMemberMiningPowders, + SkyBlockMemberObjectives, + SkyBlockMemberPet, + SkyBlockMemberPets, + SkyBlockMemberPetsAutoPetRule, + SkyBlockMemberPetsAutoPets, + SkyBlockMemberPetsCare, + SkyBlockMemberPlayerData, + SkyBlockMemberPlayerDataActiveEffect, + SkyBlockMemberPlayerDataMinion, + SkyBlockMemberPlayerDataMinions, + SkyBlockMemberPlayerDataSkills, + SkyBlockMemberPlayerStats, + SkyBlockMemberPlayerStatsAuctions, + SkyBlockMemberPlayerStatsAuctionsStats, + SkyBlockMemberPlayerStatsCandy, + SkyBlockMemberPlayerStatsEndIsland, + SkyBlockMemberPlayerStatsEndIslandDragonFight, + SkyBlockMemberPlayerStatsEndIslandDragonFightDragon, + SkyBlockMemberPlayerStatsFishing, + SkyBlockMemberPlayerStatsGifts, + SkyBlockMemberPlayerStatsMythos, + SkyBlockMemberPlayerStatsSpookyFestival, + SkyBlockMemberPlayerStatsWinter, + SkyBlockMemberProfile, + SkyBlockMemberQuests, + SkyBlockMemberQuestsHarp, + SkyBlockMemberQuestsHarpSong, + SkyBlockMemberQuestsTrapper, + SkyBlockMemberRift, + SkyBlockMemberRiftAccess, + SkyBlockMemberRiftBlackLagoon, + SkyBlockMemberRiftCastle, + SkyBlockMemberRiftDeadCats, + SkyBlockMemberRiftDreamFarm, + SkyBlockMemberRiftEnigma, + SkyBlockMemberRiftGallery, + SkyBlockMemberRiftGallerySecuredTrophy, + SkyBlockMemberRiftInventory, + SkyBlockMemberRiftVillagePlaza, + SkyBlockMemberRiftVillagePlazaBarry, + SkyBlockMemberRiftVillagePlazaCowboy, + SkyBlockMemberRiftVillagePlazaMurder, + SkyBlockMemberRiftWestVillage, + SkyBlockMemberRiftWestVillageCrazyKloon, + SkyBlockMemberRiftWestVillageGlyphs, + SkyBlockMemberRiftWestVillageKatHouse, + SkyBlockMemberRiftWestVillageMirrorverse, + SkyBlockMemberRiftWitherCage, + SkyBlockMemberRiftWizardTower, + SkyBlockMemberRiftWyldWoods, + SkyBlockMemberSlayer, + SkyBlockMemberSlayerClaimedLevels, + SkyBlockMemberSlayers, + SkyBlockMemberSlayersQuest, + SkyBlockMuseum, + SkyBlockMuseumItem, + SkyBlockMuseumMember, + SkyBlockNews, + SkyBlockPotionEffect, + SkyBlockProfile, + SkyBlockProfileBanking, + SkyBlockProfileCommunityUpgrades, + SkyBlockProfileCommunityUpgradesUpgrade, + SkyBlockProfileCommunityUpgradesUpgraded, + SkyBlockProfileCommunityUpgradesUpgrading, + SkyBlockProfilesBankingTransaction, + SkyBlockSkill, + SkyBlockSkillLevel, + SkyBlockSkills, SkyWars, SkyWarsKit, SkyWarsKits, @@ -268,14 +592,18 @@ export default { SmashHeoresHero, SmashHeroes, SmashHeroesMode, + SocialMedia, SpeedUHC, SpeedUHCMode, - BowSpleef, - PVPRun, + Status, TNTGames, TNTRun, TNTTag, TNTWizards, + ThrowOut, + TieredAchivement, + Tourney, + TourneyData, TurboKartRacers, TurboKartRacersMap, UHC, @@ -285,73 +613,10 @@ export default { Walls, Warlords, WarlordsClass, - CaptureTheWool, - SheepWars, + WatchdogStats, WoolGames, WoolWars, WoolWarsClass, - Cosmetics, - Gifting, - MonthlyCrate, - Parkour, - Pet, - PetConsumables, - Pets, - Player, - PlayerAchievements, - PlayerAchievementsRewards, - PlayerQuest, - PlayerQuestCompletion, - PlayerQuestCompletions, - PlayerQuests, - Rewards, - Season, - SeasonBingo, - SeasonBingoTier, - SeasonYear, - Seasonal, - SocialMedia, - Tourney, - TourneyData, - RecentGame, - Auction, - AuctionInfo, - BaseAuction, - Bid, - Order, - Product, - SkyblockNews, - SkyblockGarden, - SkyblockGemstone, - SkyblockInventoryItem, - SkyblockItem, - SkyblockMember, - SkyblockMemberMinion, - SkyblockMemberMinions, - SkyblockMemberStats, - SkyblockMuseum, - SkyblockMuseumItem, - SkyblockPet, - SkyblockProfile, - Bingo, - BingoData, - Candidate, - FireSale, - Government, - Perk, - Achievements, - BaseAchievement, - GameAchievements, - GuildAchievements, - OneTimeAchivement, - TieredAchivement, - Challenge, - Challenges, - GameChallenges, - GameQuests, - Quest, - QuestObjective, - Quests, - Status, - WatchdogStats + Zombies, + ZombiesStats }; diff --git a/vitest.config.ts b/vitest.config.ts index 34f470db3..caee54edf 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,7 +1,8 @@ -import { defineConfig } from 'vitest/config'; +import { configDefaults, defineConfig } from 'vitest/config'; export default defineConfig({ test: { + exclude: [...configDefaults.exclude, 'dist/*', 'coverage/*'], setupFiles: ['./vitest.setup.ts'], testTimeout: 30000 } From ff02c7031e2afe41ad4a62d29d6d3bbdee378d4b Mon Sep 17 00:00:00 2001 From: Jacob Date: Mon, 14 Apr 2025 13:14:45 +0800 Subject: [PATCH 009/124] Change Docs URL --- typedoc.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typedoc.json b/typedoc.json index a1844e1ff..5ccf5d550 100644 --- a/typedoc.json +++ b/typedoc.json @@ -10,7 +10,7 @@ "cleanOutputDir": true, "page404Content": "This poage does not exist", "useHostedBaseUrlForAbsoluteLinks": true, - "hostedBaseUrl": "https://hypixel-api-reborn.github.io/reborn-ts/", + "hostedBaseUrl": "https://hypixel-api-reborn.github.io/hypixel-api-reborn/", "lang": "en", "themeColor": "#2f3236" } From 8c35098cb63cee00cb6441a0e5221f4af2d4314b Mon Sep 17 00:00:00 2001 From: Jacob Date: Mon, 14 Apr 2025 13:15:58 +0800 Subject: [PATCH 010/124] Change docs branch --- .github/workflows/UpdateDocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/UpdateDocs.yml b/.github/workflows/UpdateDocs.yml index 0363d4650..e3939368d 100644 --- a/.github/workflows/UpdateDocs.yml +++ b/.github/workflows/UpdateDocs.yml @@ -59,7 +59,7 @@ jobs: - name: Switch to documentation branch run: | git fetch --all - git checkout docs + git checkout documentation - name: Clear Old Documentation files run: From 0747e72b0e5bfdcac0a9aaf29deb766a2a91fa7c Mon Sep 17 00:00:00 2001 From: Jacob <55346310+Kathund@users.noreply.github.com> Date: Mon, 14 Apr 2025 15:43:43 +0800 Subject: [PATCH 011/124] fix Spelling (#664) * fix `achivement` -> `achievement` * convert `winstreak` -> `winStreak` * convert `killstreak` -> `killStreak` * convert `headshot` -> `headShot` * convert `gexp` -> `GEXP` * convert `bedwars` -> `BedWars` * convert `eatan` -> `eaten` * convert `travelled` -> `traveled` * convert `turney` -> `tourney` * fix misc spelling * fix Pit stats tests --- src/API/getAchievements.test.ts | 14 +- src/API/getGuild.test.ts | 12 +- src/API/getGuildAchievements.test.ts | 18 +- src/API/getPlayer.test.ts | 530 ++++++++-------- src/API/getSkyBlockFireSales.test.ts | 40 +- src/Errors.ts | 2 +- src/Private/Functions.test.ts | 4 +- src/Structures/Guild/Guild.test.ts | 4 +- src/Structures/Guild/Guild.ts | 6 +- .../MiniGames/Arcade/BlockingDead.test.ts | 6 +- .../MiniGames/Arcade/BlockingDead.ts | 4 +- .../MiniGames/Arcade/Zombies.test.ts | 12 +- src/Structures/MiniGames/Arcade/Zombies.ts | 8 +- .../ArenaBrawl/ArenaBrawlMode.test.ts | 6 +- .../MiniGames/ArenaBrawl/ArenaBrawlMode.ts | 4 +- .../MiniGames/BedWars/BedWars.test.ts | 6 +- src/Structures/MiniGames/BedWars/BedWars.ts | 8 +- .../MiniGames/BedWars/BedWarsBeds.ts | 4 +- .../MiniGames/BedWars/BedWarsDreamMode.ts | 8 +- .../MiniGames/BedWars/BedWarsDreamStats.ts | 22 +- .../MiniGames/BedWars/BedWarsMode.ts | 10 +- .../CopsAndCrims/CopsAndCrims.test.ts | 6 +- .../MiniGames/CopsAndCrims/CopsAndCrims.ts | 4 +- .../CopsAndCrims/CopsAndCrimsGun.test.ts | 6 +- .../MiniGames/CopsAndCrims/CopsAndCrimsGun.ts | 4 +- src/Structures/MiniGames/Duels/Duels.test.ts | 576 +++++++++--------- src/Structures/MiniGames/Duels/Duels.ts | 12 +- src/Structures/MiniGames/Duels/DuelsBridge.ts | 26 +- .../MiniGames/Duels/DuelsGamemode.ts | 12 +- .../MiniGames/Duels/DuelsMegaWalls.ts | 12 +- src/Structures/MiniGames/Duels/DuelsOP.ts | 12 +- .../MiniGames/Duels/DuelsSkyWars.ts | 12 +- src/Structures/MiniGames/Duels/DuelsUHC.ts | 20 +- src/Structures/MiniGames/Paintball.test.ts | 6 +- src/Structures/MiniGames/Paintball.ts | 4 +- src/Structures/MiniGames/Pit/Pit.test.ts | 24 +- .../MiniGames/Quakecraft/Quakecraft.test.ts | 18 +- .../MiniGames/Quakecraft/Quakecraft.ts | 12 +- .../Quakecraft/QuakecraftMode.test.ts | 18 +- .../MiniGames/Quakecraft/QuakecraftMode.ts | 12 +- src/Structures/MiniGames/SkyWars/SkyWars.ts | 12 +- .../SkyWars/SkyWarsModeStats.test.ts | 6 +- .../MiniGames/SkyWars/SkyWarsModeStats.ts | 4 +- .../MiniGames/SkyWars/Skywars.test.ts | 6 +- .../MiniGames/SmashHeroes/SmashHeroes.test.ts | 6 +- .../MiniGames/SmashHeroes/SmashHeroes.ts | 4 +- .../MiniGames/SpeedUHC/SpeedUHC.test.ts | 12 +- src/Structures/MiniGames/SpeedUHC/SpeedUHC.ts | 8 +- .../MiniGames/SpeedUHC/SpeedUHCMode.test.ts | 6 +- .../MiniGames/SpeedUHC/SpeedUHCMode.ts | 4 +- .../MiniGames/TNTGames/TNTGames.test.ts | 6 +- src/Structures/MiniGames/TNTGames/TNTGames.ts | 4 +- .../MiniGames/Warlords/Warlords.test.ts | 6 +- src/Structures/MiniGames/Warlords/Warlords.ts | 4 +- .../MiniGames/WoolGames/WoolWars.test.ts | 6 +- .../MiniGames/WoolGames/WoolWars.ts | 4 +- .../MiniGames/WoolGames/WoolWarsClass.test.ts | 6 +- .../MiniGames/WoolGames/WoolWarsClass.ts | 4 +- src/Structures/Player/Cosmetics.test.ts | 4 +- src/Structures/Player/Cosmetics.ts | 4 +- src/Structures/Player/Player.test.ts | 132 ++-- src/Structures/Player/Player.ts | 44 +- .../Player/PlayerAchievements.test.ts | 4 +- src/Structures/Player/PlayerAchievements.ts | 4 +- src/Structures/Player/Tourney/Tourney.test.ts | 4 +- src/Structures/Player/Tourney/Tourney.ts | 6 +- ...kyBlockMemberInventoriesBackpackDecoded.ts | 2 - .../Static/Achievements/GameAchievements.ts | 12 +- .../Static/Achievements/GuildAchievements.ts | 12 +- ...imeAchivement.ts => OneTimeAchievement.ts} | 8 +- .../Static/Achievements/TieredAchievement.ts | 12 + .../Static/Achievements/TieredAchivement.ts | 12 - src/Types/Player.ts | 48 +- src/Types/Static.ts | 2 +- src/Utils/Guild.ts | 14 +- src/Utils/SkyBlockUtils.ts | 20 +- src/index.ts | 8 +- typedoc.json | 2 +- 78 files changed, 992 insertions(+), 994 deletions(-) rename src/Structures/Static/Achievements/{OneTimeAchivement.ts => OneTimeAchievement.ts} (61%) create mode 100644 src/Structures/Static/Achievements/TieredAchievement.ts delete mode 100644 src/Structures/Static/Achievements/TieredAchivement.ts diff --git a/src/API/getAchievements.test.ts b/src/API/getAchievements.test.ts index 658c819a3..a91a55416 100644 --- a/src/API/getAchievements.test.ts +++ b/src/API/getAchievements.test.ts @@ -1,11 +1,11 @@ import Achievements from '../Structures/Static/Achievements/Achievements.js'; import Client from '../Client.js'; import GameAchievements from '../Structures/Static/Achievements/GameAchievements.js'; -import OneTimeAchivement from '../Structures/Static/Achievements/OneTimeAchivement.js'; +import OneTimeAchievement from '../Structures/Static/Achievements/OneTimeAchievement.js'; import RequestData from '../Private/RequestData.js'; -import TieredAchivement from '../Structures/Static/Achievements/TieredAchivement.js'; +import TieredAchievement from '../Structures/Static/Achievements/TieredAchievement.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type { AchivementTier } from '../Types/Static.js'; +import type { AchievementTier } from '../Types/Static.js'; test('getAchievements (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); @@ -44,7 +44,7 @@ test('getAchievements', async () => { expect(gameData.legacyPoints).toBeGreaterThanOrEqual(0); expectTypeOf(gameData.legacyPoints).toEqualTypeOf(); expect(gameData.oneTimeAchievements).toBeDefined(); - expectTypeOf(gameData.oneTimeAchievements).toEqualTypeOf(); + expectTypeOf(gameData.oneTimeAchievements).toEqualTypeOf(); gameData.oneTimeAchievements.forEach((achievement) => { expect(achievement.codeName).toBeDefined(); expectTypeOf(achievement.codeName).toEqualTypeOf(); @@ -67,7 +67,7 @@ test('getAchievements', async () => { expectTypeOf(achievement.toString()).toEqualTypeOf(); }); expect(gameData.tieredAchievements).toBeDefined(); - expectTypeOf(gameData.tieredAchievements).toEqualTypeOf(); + expectTypeOf(gameData.tieredAchievements).toEqualTypeOf(); gameData.tieredAchievements.forEach((achievement) => { expect(achievement.codeName).toBeDefined(); expectTypeOf(achievement.codeName).toEqualTypeOf(); @@ -80,10 +80,10 @@ test('getAchievements', async () => { expect(achievement.legacy).toBeDefined(); expectTypeOf(achievement.legacy).toEqualTypeOf(); expect(achievement.tiers).toBeDefined(); - expectTypeOf(achievement.tiers).toEqualTypeOf(); + expectTypeOf(achievement.tiers).toEqualTypeOf(); achievement.tiers.forEach((tier) => { expect(tier).toBeDefined(); - expectTypeOf(tier).toEqualTypeOf(); + expectTypeOf(tier).toEqualTypeOf(); expect(tier.tier).toBeDefined(); expect(tier.tier).toBeGreaterThanOrEqual(0); expectTypeOf(tier.tier).toEqualTypeOf(); diff --git a/src/API/getGuild.test.ts b/src/API/getGuild.test.ts index 8dcea3493..1abcdde3f 100644 --- a/src/API/getGuild.test.ts +++ b/src/API/getGuild.test.ts @@ -155,8 +155,8 @@ test('getGuild (Name)', async () => { expectTypeOf(rank.toString()).toEqualTypeOf(); expect(rank.toString()).toEqual(rank.name); }); - expect(data.totalWeeklyGexp).toBeDefined(); - expectTypeOf(data.totalWeeklyGexp).toEqualTypeOf(); + expect(data.totalWeeklyGEXP).toBeDefined(); + expectTypeOf(data.totalWeeklyGEXP).toEqualTypeOf(); expect(data.createdAtTimestamp).toBeDefined(); expectTypeOf(data.createdAtTimestamp).toEqualTypeOf(); expect(data.createdAt).toBeDefined(); @@ -337,8 +337,8 @@ test('getGuild (Id)', async () => { expectTypeOf(rank.toString()).toEqualTypeOf(); expect(rank.toString()).toEqual(rank.name); }); - expect(data.totalWeeklyGexp).toBeDefined(); - expectTypeOf(data.totalWeeklyGexp).toEqualTypeOf(); + expect(data.totalWeeklyGEXP).toBeDefined(); + expectTypeOf(data.totalWeeklyGEXP).toEqualTypeOf(); expect(data.createdAtTimestamp).toBeDefined(); expectTypeOf(data.createdAtTimestamp).toEqualTypeOf(); expect(data.createdAt).toBeDefined(); @@ -519,8 +519,8 @@ test('getGuild (Player)', async () => { expectTypeOf(rank.toString()).toEqualTypeOf(); expect(rank.toString()).toEqual(rank.name); }); - expect(data.totalWeeklyGexp).toBeDefined(); - expectTypeOf(data.totalWeeklyGexp).toEqualTypeOf(); + expect(data.totalWeeklyGEXP).toBeDefined(); + expectTypeOf(data.totalWeeklyGEXP).toEqualTypeOf(); expect(data.createdAtTimestamp).toBeDefined(); expectTypeOf(data.createdAtTimestamp).toEqualTypeOf(); expect(data.createdAt).toBeDefined(); diff --git a/src/API/getGuildAchievements.test.ts b/src/API/getGuildAchievements.test.ts index a66392d61..5944c6318 100644 --- a/src/API/getGuildAchievements.test.ts +++ b/src/API/getGuildAchievements.test.ts @@ -1,10 +1,10 @@ import Client from '../Client.js'; import GuildAchievements from '../Structures/Static/Achievements/GuildAchievements.js'; -import OneTimeAchivement from '../Structures/Static/Achievements/OneTimeAchivement.js'; +import OneTimeAchievement from '../Structures/Static/Achievements/OneTimeAchievement.js'; import RequestData from '../Private/RequestData.js'; -import TieredAchivement from '../Structures/Static/Achievements/TieredAchivement.js'; +import TieredAchievement from '../Structures/Static/Achievements/TieredAchievement.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type { AchivementTier } from '../Types/Static.js'; +import type { AchievementTier } from '../Types/Static.js'; test('getGuildAchievements (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); @@ -26,8 +26,8 @@ test('getGuildAchievements', async () => { expect(data.lastUpdatedAt).toBeDefined(); expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); expect(data.oneTimeAchievements).toBeDefined(); - expectTypeOf(data.oneTimeAchievements).toEqualTypeOf(); - data.oneTimeAchievements.forEach((achievement: OneTimeAchivement) => { + expectTypeOf(data.oneTimeAchievements).toEqualTypeOf(); + data.oneTimeAchievements.forEach((achievement: OneTimeAchievement) => { expect(achievement.codeName).toBeDefined(); expectTypeOf(achievement.codeName).toEqualTypeOf(); expect(achievement.name).toBeDefined(); @@ -49,8 +49,8 @@ test('getGuildAchievements', async () => { expectTypeOf(achievement.toString()).toEqualTypeOf(); }); expect(data.tieredAchievements).toBeDefined(); - expectTypeOf(data.tieredAchievements).toEqualTypeOf(); - data.tieredAchievements.forEach((achievement: TieredAchivement) => { + expectTypeOf(data.tieredAchievements).toEqualTypeOf(); + data.tieredAchievements.forEach((achievement: TieredAchievement) => { expect(achievement.codeName).toBeDefined(); expectTypeOf(achievement.codeName).toEqualTypeOf(); expect(achievement.name).toBeDefined(); @@ -62,10 +62,10 @@ test('getGuildAchievements', async () => { expect(achievement.legacy).toBeDefined(); expectTypeOf(achievement.legacy).toEqualTypeOf(); expect(achievement.tiers).toBeDefined(); - expectTypeOf(achievement.tiers).toEqualTypeOf(); + expectTypeOf(achievement.tiers).toEqualTypeOf(); achievement.tiers.forEach((tier) => { expect(tier).toBeDefined(); - expectTypeOf(tier).toEqualTypeOf(); + expectTypeOf(tier).toEqualTypeOf(); expect(tier.tier).toBeDefined(); expect(tier.tier).toBeGreaterThanOrEqual(0); expectTypeOf(tier.tier).toEqualTypeOf(); diff --git a/src/API/getPlayer.test.ts b/src/API/getPlayer.test.ts index 9c8fe83db..4d41a0f87 100644 --- a/src/API/getPlayer.test.ts +++ b/src/API/getPlayer.test.ts @@ -41,7 +41,7 @@ import { defaultRequestData } from '../../vitest.setup.js'; import { expect, expectTypeOf, test, vi } from 'vitest'; import type { ChatChannel, Language, LevelProgress, PlayerRank, PlayerStats, ScorpiusBribe } from '../Types/Player.js'; -test('getPlayer (never joinned hypixel)', async () => { +test('getPlayer (never joined hypixel)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); vi.spyOn(global, 'fetch').mockResolvedValue({ ...defaultRequestData, @@ -147,72 +147,72 @@ test('getPlayer (guild)', async () => { expectTypeOf(data.recentGames).toEqualTypeOf(); expect(data.stats).toBeDefined(); expectTypeOf(data.stats).toEqualTypeOf(); - expect(data.stats.arcade).toBeDefined(); - expect(data.stats.arcade).toBeInstanceOf(Arcade); - expectTypeOf(data.stats.arcade).toEqualTypeOf(); - expect(data.stats.arenaBrawl).toBeDefined(); - expect(data.stats.arenaBrawl).toBeInstanceOf(ArenaBrawl); - expectTypeOf(data.stats.arenaBrawl).toEqualTypeOf(); - expect(data.stats.bedwars).toBeDefined(); - expect(data.stats.bedwars).toBeInstanceOf(BedWars); - expectTypeOf(data.stats.bedwars).toEqualTypeOf(); - expect(data.stats.blitzsg).toBeDefined(); - expect(data.stats.blitzsg).toBeInstanceOf(BlitzSurvivalGames); - expectTypeOf(data.stats.blitzsg).toEqualTypeOf(); - expect(data.stats.buildbattle).toBeDefined(); - expect(data.stats.buildbattle).toBeInstanceOf(BuildBattle); - expectTypeOf(data.stats.buildbattle).toEqualTypeOf(); - expect(data.stats.copsandcrims).toBeDefined(); - expect(data.stats.copsandcrims).toBeInstanceOf(CopsAndCrims); - expectTypeOf(data.stats.copsandcrims).toEqualTypeOf(); - expect(data.stats.duels).toBeDefined(); - expect(data.stats.duels).toBeInstanceOf(Duels); - expectTypeOf(data.stats.duels).toEqualTypeOf(); - expect(data.stats.megawalls).toBeDefined(); - expect(data.stats.megawalls).toBeInstanceOf(MegaWalls); - expectTypeOf(data.stats.megawalls).toEqualTypeOf(); - expect(data.stats.murdermystery).toBeDefined(); - expect(data.stats.murdermystery).toBeInstanceOf(MurderMystery); - expectTypeOf(data.stats.murdermystery).toEqualTypeOf(); - expect(data.stats.paintball).toBeDefined(); - expect(data.stats.paintball).toBeInstanceOf(Paintball); - expectTypeOf(data.stats.paintball).toEqualTypeOf(); - expect(data.stats.pit).toBeDefined(); - expect(data.stats.pit).toBeInstanceOf(Pit); - expectTypeOf(data.stats.pit).toEqualTypeOf(); - expect(data.stats.quakecraft).toBeDefined(); - expect(data.stats.quakecraft).toBeInstanceOf(Quakecraft); - expectTypeOf(data.stats.quakecraft).toEqualTypeOf(); - expect(data.stats.skywars).toBeDefined(); - expect(data.stats.skywars).toBeInstanceOf(SkyWars); - expectTypeOf(data.stats.skywars).toEqualTypeOf(); - expect(data.stats.smashheroes).toBeDefined(); - expect(data.stats.smashheroes).toBeInstanceOf(SmashHeroes); - expectTypeOf(data.stats.smashheroes).toEqualTypeOf(); - expect(data.stats.speeduhc).toBeDefined(); - expect(data.stats.speeduhc).toBeInstanceOf(SpeedUHC); - expectTypeOf(data.stats.speeduhc).toEqualTypeOf(); - expect(data.stats.tntgames).toBeDefined(); - expect(data.stats.tntgames).toBeInstanceOf(TNTGames); - expectTypeOf(data.stats.tntgames).toEqualTypeOf(); - expect(data.stats.turbokartracers).toBeDefined(); - expect(data.stats.turbokartracers).toBeInstanceOf(TurboKartRacers); - expectTypeOf(data.stats.turbokartracers).toEqualTypeOf(); - expect(data.stats.uhc).toBeDefined(); - expect(data.stats.uhc).toBeInstanceOf(UHC); - expectTypeOf(data.stats.uhc).toEqualTypeOf(); - expect(data.stats.vampirez).toBeDefined(); - expect(data.stats.vampirez).toBeInstanceOf(VampireZ); - expectTypeOf(data.stats.vampirez).toEqualTypeOf(); - expect(data.stats.walls).toBeDefined(); - expect(data.stats.walls).toBeInstanceOf(Walls); - expectTypeOf(data.stats.walls).toEqualTypeOf(); - expect(data.stats.warlords).toBeDefined(); - expect(data.stats.warlords).toBeInstanceOf(Warlords); - expectTypeOf(data.stats.warlords).toEqualTypeOf(); - expect(data.stats.woolgames).toBeDefined(); - expect(data.stats.woolgames).toBeInstanceOf(WoolGames); - expectTypeOf(data.stats.woolgames).toEqualTypeOf(); + expect(data.stats.Arcade).toBeDefined(); + expect(data.stats.Arcade).toBeInstanceOf(Arcade); + expectTypeOf(data.stats.Arcade).toEqualTypeOf(); + expect(data.stats.ArenaBrawl).toBeDefined(); + expect(data.stats.ArenaBrawl).toBeInstanceOf(ArenaBrawl); + expectTypeOf(data.stats.ArenaBrawl).toEqualTypeOf(); + expect(data.stats.BedWars).toBeDefined(); + expect(data.stats.BedWars).toBeInstanceOf(BedWars); + expectTypeOf(data.stats.BedWars).toEqualTypeOf(); + expect(data.stats.BlitzSurvivalGames).toBeDefined(); + expect(data.stats.BlitzSurvivalGames).toBeInstanceOf(BlitzSurvivalGames); + expectTypeOf(data.stats.BlitzSurvivalGames).toEqualTypeOf(); + expect(data.stats.BuildBattle).toBeDefined(); + expect(data.stats.BuildBattle).toBeInstanceOf(BuildBattle); + expectTypeOf(data.stats.BuildBattle).toEqualTypeOf(); + expect(data.stats.CopsAndCrims).toBeDefined(); + expect(data.stats.CopsAndCrims).toBeInstanceOf(CopsAndCrims); + expectTypeOf(data.stats.CopsAndCrims).toEqualTypeOf(); + expect(data.stats.Duels).toBeDefined(); + expect(data.stats.Duels).toBeInstanceOf(Duels); + expectTypeOf(data.stats.Duels).toEqualTypeOf(); + expect(data.stats.MegaWalls).toBeDefined(); + expect(data.stats.MegaWalls).toBeInstanceOf(MegaWalls); + expectTypeOf(data.stats.MegaWalls).toEqualTypeOf(); + expect(data.stats.MurderMystery).toBeDefined(); + expect(data.stats.MurderMystery).toBeInstanceOf(MurderMystery); + expectTypeOf(data.stats.MurderMystery).toEqualTypeOf(); + expect(data.stats.Paintball).toBeDefined(); + expect(data.stats.Paintball).toBeInstanceOf(Paintball); + expectTypeOf(data.stats.Paintball).toEqualTypeOf(); + expect(data.stats.Pit).toBeDefined(); + expect(data.stats.Pit).toBeInstanceOf(Pit); + expectTypeOf(data.stats.Pit).toEqualTypeOf(); + expect(data.stats.QuakeCraft).toBeDefined(); + expect(data.stats.QuakeCraft).toBeInstanceOf(Quakecraft); + expectTypeOf(data.stats.QuakeCraft).toEqualTypeOf(); + expect(data.stats.SkyWars).toBeDefined(); + expect(data.stats.SkyWars).toBeInstanceOf(SkyWars); + expectTypeOf(data.stats.SkyWars).toEqualTypeOf(); + expect(data.stats.SmashHeroes).toBeDefined(); + expect(data.stats.SmashHeroes).toBeInstanceOf(SmashHeroes); + expectTypeOf(data.stats.SmashHeroes).toEqualTypeOf(); + expect(data.stats.SpeedUHC).toBeDefined(); + expect(data.stats.SpeedUHC).toBeInstanceOf(SpeedUHC); + expectTypeOf(data.stats.SpeedUHC).toEqualTypeOf(); + expect(data.stats.TNTGames).toBeDefined(); + expect(data.stats.TNTGames).toBeInstanceOf(TNTGames); + expectTypeOf(data.stats.TNTGames).toEqualTypeOf(); + expect(data.stats.TurboKartRacers).toBeDefined(); + expect(data.stats.TurboKartRacers).toBeInstanceOf(TurboKartRacers); + expectTypeOf(data.stats.TurboKartRacers).toEqualTypeOf(); + expect(data.stats.UHC).toBeDefined(); + expect(data.stats.UHC).toBeInstanceOf(UHC); + expectTypeOf(data.stats.UHC).toEqualTypeOf(); + expect(data.stats.VampireZ).toBeDefined(); + expect(data.stats.VampireZ).toBeInstanceOf(VampireZ); + expectTypeOf(data.stats.VampireZ).toEqualTypeOf(); + expect(data.stats.Walls).toBeDefined(); + expect(data.stats.Walls).toBeInstanceOf(Walls); + expectTypeOf(data.stats.Walls).toEqualTypeOf(); + expect(data.stats.Warlords).toBeDefined(); + expect(data.stats.Warlords).toBeInstanceOf(Warlords); + expectTypeOf(data.stats.Warlords).toEqualTypeOf(); + expect(data.stats.WoolGames).toBeDefined(); + expect(data.stats.WoolGames).toBeInstanceOf(WoolGames); + expectTypeOf(data.stats.WoolGames).toEqualTypeOf(); client.destroy(); }); @@ -300,72 +300,72 @@ test('getPlayer (houses)', async () => { expectTypeOf(data.recentGames).toEqualTypeOf(); expect(data.stats).toBeDefined(); expectTypeOf(data.stats).toEqualTypeOf(); - expect(data.stats.arcade).toBeDefined(); - expect(data.stats.arcade).toBeInstanceOf(Arcade); - expectTypeOf(data.stats.arcade).toEqualTypeOf(); - expect(data.stats.arenaBrawl).toBeDefined(); - expect(data.stats.arenaBrawl).toBeInstanceOf(ArenaBrawl); - expectTypeOf(data.stats.arenaBrawl).toEqualTypeOf(); - expect(data.stats.bedwars).toBeDefined(); - expect(data.stats.bedwars).toBeInstanceOf(BedWars); - expectTypeOf(data.stats.bedwars).toEqualTypeOf(); - expect(data.stats.blitzsg).toBeDefined(); - expect(data.stats.blitzsg).toBeInstanceOf(BlitzSurvivalGames); - expectTypeOf(data.stats.blitzsg).toEqualTypeOf(); - expect(data.stats.buildbattle).toBeDefined(); - expect(data.stats.buildbattle).toBeInstanceOf(BuildBattle); - expectTypeOf(data.stats.buildbattle).toEqualTypeOf(); - expect(data.stats.copsandcrims).toBeDefined(); - expect(data.stats.copsandcrims).toBeInstanceOf(CopsAndCrims); - expectTypeOf(data.stats.copsandcrims).toEqualTypeOf(); - expect(data.stats.duels).toBeDefined(); - expect(data.stats.duels).toBeInstanceOf(Duels); - expectTypeOf(data.stats.duels).toEqualTypeOf(); - expect(data.stats.megawalls).toBeDefined(); - expect(data.stats.megawalls).toBeInstanceOf(MegaWalls); - expectTypeOf(data.stats.megawalls).toEqualTypeOf(); - expect(data.stats.murdermystery).toBeDefined(); - expect(data.stats.murdermystery).toBeInstanceOf(MurderMystery); - expectTypeOf(data.stats.murdermystery).toEqualTypeOf(); - expect(data.stats.paintball).toBeDefined(); - expect(data.stats.paintball).toBeInstanceOf(Paintball); - expectTypeOf(data.stats.paintball).toEqualTypeOf(); - expect(data.stats.pit).toBeDefined(); - expect(data.stats.pit).toBeInstanceOf(Pit); - expectTypeOf(data.stats.pit).toEqualTypeOf(); - expect(data.stats.quakecraft).toBeDefined(); - expect(data.stats.quakecraft).toBeInstanceOf(Quakecraft); - expectTypeOf(data.stats.quakecraft).toEqualTypeOf(); - expect(data.stats.skywars).toBeDefined(); - expect(data.stats.skywars).toBeInstanceOf(SkyWars); - expectTypeOf(data.stats.skywars).toEqualTypeOf(); - expect(data.stats.smashheroes).toBeDefined(); - expect(data.stats.smashheroes).toBeInstanceOf(SmashHeroes); - expectTypeOf(data.stats.smashheroes).toEqualTypeOf(); - expect(data.stats.speeduhc).toBeDefined(); - expect(data.stats.speeduhc).toBeInstanceOf(SpeedUHC); - expectTypeOf(data.stats.speeduhc).toEqualTypeOf(); - expect(data.stats.tntgames).toBeDefined(); - expect(data.stats.tntgames).toBeInstanceOf(TNTGames); - expectTypeOf(data.stats.tntgames).toEqualTypeOf(); - expect(data.stats.turbokartracers).toBeDefined(); - expect(data.stats.turbokartracers).toBeInstanceOf(TurboKartRacers); - expectTypeOf(data.stats.turbokartracers).toEqualTypeOf(); - expect(data.stats.uhc).toBeDefined(); - expect(data.stats.uhc).toBeInstanceOf(UHC); - expectTypeOf(data.stats.uhc).toEqualTypeOf(); - expect(data.stats.vampirez).toBeDefined(); - expect(data.stats.vampirez).toBeInstanceOf(VampireZ); - expectTypeOf(data.stats.vampirez).toEqualTypeOf(); - expect(data.stats.walls).toBeDefined(); - expect(data.stats.walls).toBeInstanceOf(Walls); - expectTypeOf(data.stats.walls).toEqualTypeOf(); - expect(data.stats.warlords).toBeDefined(); - expect(data.stats.warlords).toBeInstanceOf(Warlords); - expectTypeOf(data.stats.warlords).toEqualTypeOf(); - expect(data.stats.woolgames).toBeDefined(); - expect(data.stats.woolgames).toBeInstanceOf(WoolGames); - expectTypeOf(data.stats.woolgames).toEqualTypeOf(); + expect(data.stats.Arcade).toBeDefined(); + expect(data.stats.Arcade).toBeInstanceOf(Arcade); + expectTypeOf(data.stats.Arcade).toEqualTypeOf(); + expect(data.stats.ArenaBrawl).toBeDefined(); + expect(data.stats.ArenaBrawl).toBeInstanceOf(ArenaBrawl); + expectTypeOf(data.stats.ArenaBrawl).toEqualTypeOf(); + expect(data.stats.BedWars).toBeDefined(); + expect(data.stats.BedWars).toBeInstanceOf(BedWars); + expectTypeOf(data.stats.BedWars).toEqualTypeOf(); + expect(data.stats.BlitzSurvivalGames).toBeDefined(); + expect(data.stats.BlitzSurvivalGames).toBeInstanceOf(BlitzSurvivalGames); + expectTypeOf(data.stats.BlitzSurvivalGames).toEqualTypeOf(); + expect(data.stats.BuildBattle).toBeDefined(); + expect(data.stats.BuildBattle).toBeInstanceOf(BuildBattle); + expectTypeOf(data.stats.BuildBattle).toEqualTypeOf(); + expect(data.stats.CopsAndCrims).toBeDefined(); + expect(data.stats.CopsAndCrims).toBeInstanceOf(CopsAndCrims); + expectTypeOf(data.stats.CopsAndCrims).toEqualTypeOf(); + expect(data.stats.Duels).toBeDefined(); + expect(data.stats.Duels).toBeInstanceOf(Duels); + expectTypeOf(data.stats.Duels).toEqualTypeOf(); + expect(data.stats.MegaWalls).toBeDefined(); + expect(data.stats.MegaWalls).toBeInstanceOf(MegaWalls); + expectTypeOf(data.stats.MegaWalls).toEqualTypeOf(); + expect(data.stats.MurderMystery).toBeDefined(); + expect(data.stats.MurderMystery).toBeInstanceOf(MurderMystery); + expectTypeOf(data.stats.MurderMystery).toEqualTypeOf(); + expect(data.stats.Paintball).toBeDefined(); + expect(data.stats.Paintball).toBeInstanceOf(Paintball); + expectTypeOf(data.stats.Paintball).toEqualTypeOf(); + expect(data.stats.Pit).toBeDefined(); + expect(data.stats.Pit).toBeInstanceOf(Pit); + expectTypeOf(data.stats.Pit).toEqualTypeOf(); + expect(data.stats.QuakeCraft).toBeDefined(); + expect(data.stats.QuakeCraft).toBeInstanceOf(Quakecraft); + expectTypeOf(data.stats.QuakeCraft).toEqualTypeOf(); + expect(data.stats.SkyWars).toBeDefined(); + expect(data.stats.SkyWars).toBeInstanceOf(SkyWars); + expectTypeOf(data.stats.SkyWars).toEqualTypeOf(); + expect(data.stats.SmashHeroes).toBeDefined(); + expect(data.stats.SmashHeroes).toBeInstanceOf(SmashHeroes); + expectTypeOf(data.stats.SmashHeroes).toEqualTypeOf(); + expect(data.stats.SpeedUHC).toBeDefined(); + expect(data.stats.SpeedUHC).toBeInstanceOf(SpeedUHC); + expectTypeOf(data.stats.SpeedUHC).toEqualTypeOf(); + expect(data.stats.TNTGames).toBeDefined(); + expect(data.stats.TNTGames).toBeInstanceOf(TNTGames); + expectTypeOf(data.stats.TNTGames).toEqualTypeOf(); + expect(data.stats.TurboKartRacers).toBeDefined(); + expect(data.stats.TurboKartRacers).toBeInstanceOf(TurboKartRacers); + expectTypeOf(data.stats.TurboKartRacers).toEqualTypeOf(); + expect(data.stats.UHC).toBeDefined(); + expect(data.stats.UHC).toBeInstanceOf(UHC); + expectTypeOf(data.stats.UHC).toEqualTypeOf(); + expect(data.stats.VampireZ).toBeDefined(); + expect(data.stats.VampireZ).toBeInstanceOf(VampireZ); + expectTypeOf(data.stats.VampireZ).toEqualTypeOf(); + expect(data.stats.Walls).toBeDefined(); + expect(data.stats.Walls).toBeInstanceOf(Walls); + expectTypeOf(data.stats.Walls).toEqualTypeOf(); + expect(data.stats.Warlords).toBeDefined(); + expect(data.stats.Warlords).toBeInstanceOf(Warlords); + expectTypeOf(data.stats.Warlords).toEqualTypeOf(); + expect(data.stats.WoolGames).toBeDefined(); + expect(data.stats.WoolGames).toBeInstanceOf(WoolGames); + expectTypeOf(data.stats.WoolGames).toEqualTypeOf(); client.destroy(); }); @@ -450,72 +450,72 @@ test('getPlayer (recent games)', async () => { } expect(data.stats).toBeDefined(); expectTypeOf(data.stats).toEqualTypeOf(); - expect(data.stats.arcade).toBeDefined(); - expect(data.stats.arcade).toBeInstanceOf(Arcade); - expectTypeOf(data.stats.arcade).toEqualTypeOf(); - expect(data.stats.arenaBrawl).toBeDefined(); - expect(data.stats.arenaBrawl).toBeInstanceOf(ArenaBrawl); - expectTypeOf(data.stats.arenaBrawl).toEqualTypeOf(); - expect(data.stats.bedwars).toBeDefined(); - expect(data.stats.bedwars).toBeInstanceOf(BedWars); - expectTypeOf(data.stats.bedwars).toEqualTypeOf(); - expect(data.stats.blitzsg).toBeDefined(); - expect(data.stats.blitzsg).toBeInstanceOf(BlitzSurvivalGames); - expectTypeOf(data.stats.blitzsg).toEqualTypeOf(); - expect(data.stats.buildbattle).toBeDefined(); - expect(data.stats.buildbattle).toBeInstanceOf(BuildBattle); - expectTypeOf(data.stats.buildbattle).toEqualTypeOf(); - expect(data.stats.copsandcrims).toBeDefined(); - expect(data.stats.copsandcrims).toBeInstanceOf(CopsAndCrims); - expectTypeOf(data.stats.copsandcrims).toEqualTypeOf(); - expect(data.stats.duels).toBeDefined(); - expect(data.stats.duels).toBeInstanceOf(Duels); - expectTypeOf(data.stats.duels).toEqualTypeOf(); - expect(data.stats.megawalls).toBeDefined(); - expect(data.stats.megawalls).toBeInstanceOf(MegaWalls); - expectTypeOf(data.stats.megawalls).toEqualTypeOf(); - expect(data.stats.murdermystery).toBeDefined(); - expect(data.stats.murdermystery).toBeInstanceOf(MurderMystery); - expectTypeOf(data.stats.murdermystery).toEqualTypeOf(); - expect(data.stats.paintball).toBeDefined(); - expect(data.stats.paintball).toBeInstanceOf(Paintball); - expectTypeOf(data.stats.paintball).toEqualTypeOf(); - expect(data.stats.pit).toBeDefined(); - expect(data.stats.pit).toBeInstanceOf(Pit); - expectTypeOf(data.stats.pit).toEqualTypeOf(); - expect(data.stats.quakecraft).toBeDefined(); - expect(data.stats.quakecraft).toBeInstanceOf(Quakecraft); - expectTypeOf(data.stats.quakecraft).toEqualTypeOf(); - expect(data.stats.skywars).toBeDefined(); - expect(data.stats.skywars).toBeInstanceOf(SkyWars); - expectTypeOf(data.stats.skywars).toEqualTypeOf(); - expect(data.stats.smashheroes).toBeDefined(); - expect(data.stats.smashheroes).toBeInstanceOf(SmashHeroes); - expectTypeOf(data.stats.smashheroes).toEqualTypeOf(); - expect(data.stats.speeduhc).toBeDefined(); - expect(data.stats.speeduhc).toBeInstanceOf(SpeedUHC); - expectTypeOf(data.stats.speeduhc).toEqualTypeOf(); - expect(data.stats.tntgames).toBeDefined(); - expect(data.stats.tntgames).toBeInstanceOf(TNTGames); - expectTypeOf(data.stats.tntgames).toEqualTypeOf(); - expect(data.stats.turbokartracers).toBeDefined(); - expect(data.stats.turbokartracers).toBeInstanceOf(TurboKartRacers); - expectTypeOf(data.stats.turbokartracers).toEqualTypeOf(); - expect(data.stats.uhc).toBeDefined(); - expect(data.stats.uhc).toBeInstanceOf(UHC); - expectTypeOf(data.stats.uhc).toEqualTypeOf(); - expect(data.stats.vampirez).toBeDefined(); - expect(data.stats.vampirez).toBeInstanceOf(VampireZ); - expectTypeOf(data.stats.vampirez).toEqualTypeOf(); - expect(data.stats.walls).toBeDefined(); - expect(data.stats.walls).toBeInstanceOf(Walls); - expectTypeOf(data.stats.walls).toEqualTypeOf(); - expect(data.stats.warlords).toBeDefined(); - expect(data.stats.warlords).toBeInstanceOf(Warlords); - expectTypeOf(data.stats.warlords).toEqualTypeOf(); - expect(data.stats.woolgames).toBeDefined(); - expect(data.stats.woolgames).toBeInstanceOf(WoolGames); - expectTypeOf(data.stats.woolgames).toEqualTypeOf(); + expect(data.stats.Arcade).toBeDefined(); + expect(data.stats.Arcade).toBeInstanceOf(Arcade); + expectTypeOf(data.stats.Arcade).toEqualTypeOf(); + expect(data.stats.ArenaBrawl).toBeDefined(); + expect(data.stats.ArenaBrawl).toBeInstanceOf(ArenaBrawl); + expectTypeOf(data.stats.ArenaBrawl).toEqualTypeOf(); + expect(data.stats.BedWars).toBeDefined(); + expect(data.stats.BedWars).toBeInstanceOf(BedWars); + expectTypeOf(data.stats.BedWars).toEqualTypeOf(); + expect(data.stats.BlitzSurvivalGames).toBeDefined(); + expect(data.stats.BlitzSurvivalGames).toBeInstanceOf(BlitzSurvivalGames); + expectTypeOf(data.stats.BlitzSurvivalGames).toEqualTypeOf(); + expect(data.stats.BuildBattle).toBeDefined(); + expect(data.stats.BuildBattle).toBeInstanceOf(BuildBattle); + expectTypeOf(data.stats.BuildBattle).toEqualTypeOf(); + expect(data.stats.CopsAndCrims).toBeDefined(); + expect(data.stats.CopsAndCrims).toBeInstanceOf(CopsAndCrims); + expectTypeOf(data.stats.CopsAndCrims).toEqualTypeOf(); + expect(data.stats.Duels).toBeDefined(); + expect(data.stats.Duels).toBeInstanceOf(Duels); + expectTypeOf(data.stats.Duels).toEqualTypeOf(); + expect(data.stats.MegaWalls).toBeDefined(); + expect(data.stats.MegaWalls).toBeInstanceOf(MegaWalls); + expectTypeOf(data.stats.MegaWalls).toEqualTypeOf(); + expect(data.stats.MurderMystery).toBeDefined(); + expect(data.stats.MurderMystery).toBeInstanceOf(MurderMystery); + expectTypeOf(data.stats.MurderMystery).toEqualTypeOf(); + expect(data.stats.Paintball).toBeDefined(); + expect(data.stats.Paintball).toBeInstanceOf(Paintball); + expectTypeOf(data.stats.Paintball).toEqualTypeOf(); + expect(data.stats.Pit).toBeDefined(); + expect(data.stats.Pit).toBeInstanceOf(Pit); + expectTypeOf(data.stats.Pit).toEqualTypeOf(); + expect(data.stats.QuakeCraft).toBeDefined(); + expect(data.stats.QuakeCraft).toBeInstanceOf(Quakecraft); + expectTypeOf(data.stats.QuakeCraft).toEqualTypeOf(); + expect(data.stats.SkyWars).toBeDefined(); + expect(data.stats.SkyWars).toBeInstanceOf(SkyWars); + expectTypeOf(data.stats.SkyWars).toEqualTypeOf(); + expect(data.stats.SmashHeroes).toBeDefined(); + expect(data.stats.SmashHeroes).toBeInstanceOf(SmashHeroes); + expectTypeOf(data.stats.SmashHeroes).toEqualTypeOf(); + expect(data.stats.SpeedUHC).toBeDefined(); + expect(data.stats.SpeedUHC).toBeInstanceOf(SpeedUHC); + expectTypeOf(data.stats.SpeedUHC).toEqualTypeOf(); + expect(data.stats.TNTGames).toBeDefined(); + expect(data.stats.TNTGames).toBeInstanceOf(TNTGames); + expectTypeOf(data.stats.TNTGames).toEqualTypeOf(); + expect(data.stats.TurboKartRacers).toBeDefined(); + expect(data.stats.TurboKartRacers).toBeInstanceOf(TurboKartRacers); + expectTypeOf(data.stats.TurboKartRacers).toEqualTypeOf(); + expect(data.stats.UHC).toBeDefined(); + expect(data.stats.UHC).toBeInstanceOf(UHC); + expectTypeOf(data.stats.UHC).toEqualTypeOf(); + expect(data.stats.VampireZ).toBeDefined(); + expect(data.stats.VampireZ).toBeInstanceOf(VampireZ); + expectTypeOf(data.stats.VampireZ).toEqualTypeOf(); + expect(data.stats.Walls).toBeDefined(); + expect(data.stats.Walls).toBeInstanceOf(Walls); + expectTypeOf(data.stats.Walls).toEqualTypeOf(); + expect(data.stats.Warlords).toBeDefined(); + expect(data.stats.Warlords).toBeInstanceOf(Warlords); + expectTypeOf(data.stats.Warlords).toEqualTypeOf(); + expect(data.stats.WoolGames).toBeDefined(); + expect(data.stats.WoolGames).toBeInstanceOf(WoolGames); + expectTypeOf(data.stats.WoolGames).toEqualTypeOf(); client.destroy(); }); @@ -594,71 +594,71 @@ test('getPlayer', async () => { expectTypeOf(data.recentGames).toEqualTypeOf(); expect(data.stats).toBeDefined(); expectTypeOf(data.stats).toEqualTypeOf(); - expect(data.stats.arcade).toBeDefined(); - expect(data.stats.arcade).toBeInstanceOf(Arcade); - expectTypeOf(data.stats.arcade).toEqualTypeOf(); - expect(data.stats.arenaBrawl).toBeDefined(); - expect(data.stats.arenaBrawl).toBeInstanceOf(ArenaBrawl); - expectTypeOf(data.stats.arenaBrawl).toEqualTypeOf(); - expect(data.stats.bedwars).toBeDefined(); - expect(data.stats.bedwars).toBeInstanceOf(BedWars); - expectTypeOf(data.stats.bedwars).toEqualTypeOf(); - expect(data.stats.blitzsg).toBeDefined(); - expect(data.stats.blitzsg).toBeInstanceOf(BlitzSurvivalGames); - expectTypeOf(data.stats.blitzsg).toEqualTypeOf(); - expect(data.stats.buildbattle).toBeDefined(); - expect(data.stats.buildbattle).toBeInstanceOf(BuildBattle); - expectTypeOf(data.stats.buildbattle).toEqualTypeOf(); - expect(data.stats.copsandcrims).toBeDefined(); - expect(data.stats.copsandcrims).toBeInstanceOf(CopsAndCrims); - expectTypeOf(data.stats.copsandcrims).toEqualTypeOf(); - expect(data.stats.duels).toBeDefined(); - expect(data.stats.duels).toBeInstanceOf(Duels); - expectTypeOf(data.stats.duels).toEqualTypeOf(); - expect(data.stats.megawalls).toBeDefined(); - expect(data.stats.megawalls).toBeInstanceOf(MegaWalls); - expectTypeOf(data.stats.megawalls).toEqualTypeOf(); - expect(data.stats.murdermystery).toBeDefined(); - expect(data.stats.murdermystery).toBeInstanceOf(MurderMystery); - expectTypeOf(data.stats.murdermystery).toEqualTypeOf(); - expect(data.stats.paintball).toBeDefined(); - expect(data.stats.paintball).toBeInstanceOf(Paintball); - expectTypeOf(data.stats.paintball).toEqualTypeOf(); - expect(data.stats.pit).toBeDefined(); - expect(data.stats.pit).toBeInstanceOf(Pit); - expectTypeOf(data.stats.pit).toEqualTypeOf(); - expect(data.stats.quakecraft).toBeDefined(); - expect(data.stats.quakecraft).toBeInstanceOf(Quakecraft); - expectTypeOf(data.stats.quakecraft).toEqualTypeOf(); - expect(data.stats.skywars).toBeDefined(); - expect(data.stats.skywars).toBeInstanceOf(SkyWars); - expectTypeOf(data.stats.skywars).toEqualTypeOf(); - expect(data.stats.smashheroes).toBeDefined(); - expect(data.stats.smashheroes).toBeInstanceOf(SmashHeroes); - expectTypeOf(data.stats.smashheroes).toEqualTypeOf(); - expect(data.stats.speeduhc).toBeDefined(); - expect(data.stats.speeduhc).toBeInstanceOf(SpeedUHC); - expectTypeOf(data.stats.speeduhc).toEqualTypeOf(); - expect(data.stats.tntgames).toBeDefined(); - expect(data.stats.tntgames).toBeInstanceOf(TNTGames); - expectTypeOf(data.stats.tntgames).toEqualTypeOf(); - expect(data.stats.turbokartracers).toBeDefined(); - expect(data.stats.turbokartracers).toBeInstanceOf(TurboKartRacers); - expectTypeOf(data.stats.turbokartracers).toEqualTypeOf(); - expect(data.stats.uhc).toBeDefined(); - expect(data.stats.uhc).toBeInstanceOf(UHC); - expectTypeOf(data.stats.uhc).toEqualTypeOf(); - expect(data.stats.vampirez).toBeDefined(); - expect(data.stats.vampirez).toBeInstanceOf(VampireZ); - expectTypeOf(data.stats.vampirez).toEqualTypeOf(); - expect(data.stats.walls).toBeDefined(); - expect(data.stats.walls).toBeInstanceOf(Walls); - expectTypeOf(data.stats.walls).toEqualTypeOf(); - expect(data.stats.warlords).toBeDefined(); - expect(data.stats.warlords).toBeInstanceOf(Warlords); - expectTypeOf(data.stats.warlords).toEqualTypeOf(); - expect(data.stats.woolgames).toBeDefined(); - expect(data.stats.woolgames).toBeInstanceOf(WoolGames); - expectTypeOf(data.stats.woolgames).toEqualTypeOf(); + expect(data.stats.Arcade).toBeDefined(); + expect(data.stats.Arcade).toBeInstanceOf(Arcade); + expectTypeOf(data.stats.Arcade).toEqualTypeOf(); + expect(data.stats.ArenaBrawl).toBeDefined(); + expect(data.stats.ArenaBrawl).toBeInstanceOf(ArenaBrawl); + expectTypeOf(data.stats.ArenaBrawl).toEqualTypeOf(); + expect(data.stats.BedWars).toBeDefined(); + expect(data.stats.BedWars).toBeInstanceOf(BedWars); + expectTypeOf(data.stats.BedWars).toEqualTypeOf(); + expect(data.stats.BlitzSurvivalGames).toBeDefined(); + expect(data.stats.BlitzSurvivalGames).toBeInstanceOf(BlitzSurvivalGames); + expectTypeOf(data.stats.BlitzSurvivalGames).toEqualTypeOf(); + expect(data.stats.BuildBattle).toBeDefined(); + expect(data.stats.BuildBattle).toBeInstanceOf(BuildBattle); + expectTypeOf(data.stats.BuildBattle).toEqualTypeOf(); + expect(data.stats.CopsAndCrims).toBeDefined(); + expect(data.stats.CopsAndCrims).toBeInstanceOf(CopsAndCrims); + expectTypeOf(data.stats.CopsAndCrims).toEqualTypeOf(); + expect(data.stats.Duels).toBeDefined(); + expect(data.stats.Duels).toBeInstanceOf(Duels); + expectTypeOf(data.stats.Duels).toEqualTypeOf(); + expect(data.stats.MegaWalls).toBeDefined(); + expect(data.stats.MegaWalls).toBeInstanceOf(MegaWalls); + expectTypeOf(data.stats.MegaWalls).toEqualTypeOf(); + expect(data.stats.MurderMystery).toBeDefined(); + expect(data.stats.MurderMystery).toBeInstanceOf(MurderMystery); + expectTypeOf(data.stats.MurderMystery).toEqualTypeOf(); + expect(data.stats.Paintball).toBeDefined(); + expect(data.stats.Paintball).toBeInstanceOf(Paintball); + expectTypeOf(data.stats.Paintball).toEqualTypeOf(); + expect(data.stats.Pit).toBeDefined(); + expect(data.stats.Pit).toBeInstanceOf(Pit); + expectTypeOf(data.stats.Pit).toEqualTypeOf(); + expect(data.stats.QuakeCraft).toBeDefined(); + expect(data.stats.QuakeCraft).toBeInstanceOf(Quakecraft); + expectTypeOf(data.stats.QuakeCraft).toEqualTypeOf(); + expect(data.stats.SkyWars).toBeDefined(); + expect(data.stats.SkyWars).toBeInstanceOf(SkyWars); + expectTypeOf(data.stats.SkyWars).toEqualTypeOf(); + expect(data.stats.SmashHeroes).toBeDefined(); + expect(data.stats.SmashHeroes).toBeInstanceOf(SmashHeroes); + expectTypeOf(data.stats.SmashHeroes).toEqualTypeOf(); + expect(data.stats.SpeedUHC).toBeDefined(); + expect(data.stats.SpeedUHC).toBeInstanceOf(SpeedUHC); + expectTypeOf(data.stats.SpeedUHC).toEqualTypeOf(); + expect(data.stats.TNTGames).toBeDefined(); + expect(data.stats.TNTGames).toBeInstanceOf(TNTGames); + expectTypeOf(data.stats.TNTGames).toEqualTypeOf(); + expect(data.stats.TurboKartRacers).toBeDefined(); + expect(data.stats.TurboKartRacers).toBeInstanceOf(TurboKartRacers); + expectTypeOf(data.stats.TurboKartRacers).toEqualTypeOf(); + expect(data.stats.UHC).toBeDefined(); + expect(data.stats.UHC).toBeInstanceOf(UHC); + expectTypeOf(data.stats.UHC).toEqualTypeOf(); + expect(data.stats.VampireZ).toBeDefined(); + expect(data.stats.VampireZ).toBeInstanceOf(VampireZ); + expectTypeOf(data.stats.VampireZ).toEqualTypeOf(); + expect(data.stats.Walls).toBeDefined(); + expect(data.stats.Walls).toBeInstanceOf(Walls); + expectTypeOf(data.stats.Walls).toEqualTypeOf(); + expect(data.stats.Warlords).toBeDefined(); + expect(data.stats.Warlords).toBeInstanceOf(Warlords); + expectTypeOf(data.stats.Warlords).toEqualTypeOf(); + expect(data.stats.WoolGames).toBeDefined(); + expect(data.stats.WoolGames).toBeInstanceOf(WoolGames); + expectTypeOf(data.stats.WoolGames).toEqualTypeOf(); client.destroy(); }); diff --git a/src/API/getSkyBlockFireSales.test.ts b/src/API/getSkyBlockFireSales.test.ts index c5bc3c536..5020bcacb 100644 --- a/src/API/getSkyBlockFireSales.test.ts +++ b/src/API/getSkyBlockFireSales.test.ts @@ -33,26 +33,26 @@ test('getSkyBlockFireSales', async () => { expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); data = data as SkyBlockFireSale[]; - data.forEach((firesale: SkyBlockFireSale) => { - expect(firesale.itemId).toBeDefined(); - expectTypeOf(firesale.itemId).toEqualTypeOf(); - expect(firesale.startTimestamp).toBeDefined(); - expectTypeOf(firesale.startTimestamp).toEqualTypeOf(); - expect(firesale.startAt).toBeDefined(); - expectTypeOf(firesale.startAt).toEqualTypeOf(); - expect(firesale.endTimestamp).toBeDefined(); - expectTypeOf(firesale.endTimestamp).toEqualTypeOf(); - expect(firesale.endAt).toBeDefined(); - expectTypeOf(firesale.endAt).toEqualTypeOf(); - expect(firesale.amount).toBeDefined(); - expectTypeOf(firesale.amount).toEqualTypeOf(); - expect(firesale.price).toBeDefined(); - expectTypeOf(firesale.price).toEqualTypeOf(); - expect(firesale.toString).toBeDefined(); - expectTypeOf(firesale.toString).toEqualTypeOf<() => string>(); - expect(firesale.toString()).toBeDefined(); - expect(firesale.toString()).toBe(firesale.itemId); - expectTypeOf(firesale.toString()).toEqualTypeOf(); + data.forEach((FireSale: SkyBlockFireSale) => { + expect(FireSale.itemId).toBeDefined(); + expectTypeOf(FireSale.itemId).toEqualTypeOf(); + expect(FireSale.startTimestamp).toBeDefined(); + expectTypeOf(FireSale.startTimestamp).toEqualTypeOf(); + expect(FireSale.startAt).toBeDefined(); + expectTypeOf(FireSale.startAt).toEqualTypeOf(); + expect(FireSale.endTimestamp).toBeDefined(); + expectTypeOf(FireSale.endTimestamp).toEqualTypeOf(); + expect(FireSale.endAt).toBeDefined(); + expectTypeOf(FireSale.endAt).toEqualTypeOf(); + expect(FireSale.amount).toBeDefined(); + expectTypeOf(FireSale.amount).toEqualTypeOf(); + expect(FireSale.price).toBeDefined(); + expectTypeOf(FireSale.price).toEqualTypeOf(); + expect(FireSale.toString).toBeDefined(); + expectTypeOf(FireSale.toString).toEqualTypeOf<() => string>(); + expect(FireSale.toString()).toBeDefined(); + expect(FireSale.toString()).toBe(FireSale.itemId); + expectTypeOf(FireSale.toString()).toEqualTypeOf(); }); vi.restoreAllMocks(); client.destroy(); diff --git a/src/Errors.ts b/src/Errors.ts index 57ffeb295..c41135754 100644 --- a/src/Errors.ts +++ b/src/Errors.ts @@ -38,7 +38,7 @@ class Errors { NOT_IMPLEMENTED: string = '[Hypixel-API-Reborn] Endpoint execute method is not implemented yet! Please report this https://discord.gg/NSEBNMM'; RATE_LIMIT_INIT_ERROR: string = - '[hypixel-api-reborn] An error happened whilst initializing rate limit. We strongly recommend restarting the code as this can lead to desynchronization.'; + '[hypixel-api-reborn] An error happened whilst initializing rate limit. We strongly recommend restarting the code as this can lead to de-synchronization.'; ENDPOINT_NOT_LOADED: string = '[hypixel-api-reborn] This endpoint has not been loaded yet. Please restart your code'; } diff --git a/src/Private/Functions.test.ts b/src/Private/Functions.test.ts index ff3590cf7..f2ca53401 100644 --- a/src/Private/Functions.test.ts +++ b/src/Private/Functions.test.ts @@ -15,7 +15,7 @@ test('Functions', () => { '17ec71b4e5fa467481344b319a2958c3', '37501e7512b845ab8796e2baf9e9677a' ]; - const dashs = [ + const dashed = [ 'add71246-c46e-455c-8345-c129ea6f146c', '1ac8f319-1ac8-4c44-93ac-fcae2848cd9f', '337a48bf-57e9-44eb-8acb-83b885936e83' @@ -27,7 +27,7 @@ test('Functions', () => { expectTypeOf(client.functions.isUUID(uuid)).toBeBoolean(); }); - dashs.forEach((uuid) => { + dashed.forEach((uuid) => { expect(client.functions.isUUID(uuid)).toBe(true); expectTypeOf(client.functions.isUUID(uuid)).toBeBoolean(); }); diff --git a/src/Structures/Guild/Guild.test.ts b/src/Structures/Guild/Guild.test.ts index 774e8e9d7..e39c46983 100644 --- a/src/Structures/Guild/Guild.test.ts +++ b/src/Structures/Guild/Guild.test.ts @@ -27,8 +27,8 @@ test('Guild', () => { expectTypeOf(data.me).toEqualTypeOf(); expect(data.ranks).toBeDefined(); expectTypeOf(data.ranks).toEqualTypeOf(); - expect(data.totalWeeklyGexp).toBeDefined(); - expectTypeOf(data.totalWeeklyGexp).toEqualTypeOf(); + expect(data.totalWeeklyGEXP).toBeDefined(); + expectTypeOf(data.totalWeeklyGEXP).toEqualTypeOf(); expect(data.createdAtTimestamp).toBeDefined(); expectTypeOf(data.createdAtTimestamp).toEqualTypeOf(); expect(data.createdAt).toBeDefined(); diff --git a/src/Structures/Guild/Guild.ts b/src/Structures/Guild/Guild.ts index 3362954ff..79a50410d 100644 --- a/src/Structures/Guild/Guild.ts +++ b/src/Structures/Guild/Guild.ts @@ -2,7 +2,7 @@ import Color from '../Color.js'; import Game from '../Game.js'; import GuildMember from './GuildMember.js'; import GuildRank from './GuildRank.js'; -import { calculateExpHistory, getGuildLevel, members, ranks, totalWeeklyGexp } from '../../Utils/Guild.js'; +import { calculateExpHistory, getGuildLevel, members, ranks, totalWeeklyGEXP } from '../../Utils/Guild.js'; import type { ExpHistory } from '../../Types/Guild.js'; class Guild { @@ -14,7 +14,7 @@ class Guild { members: GuildMember[]; me: GuildMember | null; ranks: GuildRank[]; - totalWeeklyGexp: number; + totalWeeklyGEXP: number; createdAtTimestamp: number | null; createdAt: Date | null; joinable: boolean; @@ -37,7 +37,7 @@ class Guild { this.members = members(data?.members || []); this.me = uuid ? (this.members.find((member) => member.uuid === uuid) as GuildMember) : null; this.ranks = ranks(data); - this.totalWeeklyGexp = totalWeeklyGexp(this.members); + this.totalWeeklyGEXP = totalWeeklyGEXP(this.members); this.createdAtTimestamp = data.created || null; this.createdAt = this.createdAtTimestamp ? new Date(this.createdAtTimestamp) : null; this.joinable = data.joinable ?? false; diff --git a/src/Structures/MiniGames/Arcade/BlockingDead.test.ts b/src/Structures/MiniGames/Arcade/BlockingDead.test.ts index 59ae2d1b0..247357d1d 100644 --- a/src/Structures/MiniGames/Arcade/BlockingDead.test.ts +++ b/src/Structures/MiniGames/Arcade/BlockingDead.test.ts @@ -12,7 +12,7 @@ test('BlockingDead', () => { expect(data.kills).toBeDefined(); expect(data.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.kills).toEqualTypeOf(); - expect(data.headshots).toBeDefined(); - expect(data.headshots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.headshots).toEqualTypeOf(); + expect(data.headShots).toBeDefined(); + expect(data.headShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.headShots).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/Arcade/BlockingDead.ts b/src/Structures/MiniGames/Arcade/BlockingDead.ts index 7419cae1e..3a34f3cae 100644 --- a/src/Structures/MiniGames/Arcade/BlockingDead.ts +++ b/src/Structures/MiniGames/Arcade/BlockingDead.ts @@ -1,11 +1,11 @@ class BlockingDead { wins: number; kills: number; - headshots: number; + headShots: number; constructor(data: Record) { this.wins = data?.wins_dayone || 0; this.kills = data?.kills_dayone || 0; - this.headshots = data?.headshots_dayone || 0; + this.headShots = data?.headshots_dayone || 0; } } diff --git a/src/Structures/MiniGames/Arcade/Zombies.test.ts b/src/Structures/MiniGames/Arcade/Zombies.test.ts index 847240451..97dd3a00a 100644 --- a/src/Structures/MiniGames/Arcade/Zombies.test.ts +++ b/src/Structures/MiniGames/Arcade/Zombies.test.ts @@ -28,10 +28,10 @@ test('Zombies', () => { expect(data.gunAccuracy).toBeDefined(); expect(data.gunAccuracy).toBeGreaterThanOrEqual(0); expectTypeOf(data.gunAccuracy).toEqualTypeOf(); - expect(data.headshots).toBeDefined(); - expect(data.headshots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.headshots).toEqualTypeOf(); - expect(data.headshotAccuracy).toBeDefined(); - expect(data.headshotAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.headshotAccuracy).toEqualTypeOf(); + expect(data.headShots).toBeDefined(); + expect(data.headShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.headShots).toEqualTypeOf(); + expect(data.headShotAccuracy).toBeDefined(); + expect(data.headShotAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.headShotAccuracy).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/Arcade/Zombies.ts b/src/Structures/MiniGames/Arcade/Zombies.ts index 812fec820..01bd92d05 100644 --- a/src/Structures/MiniGames/Arcade/Zombies.ts +++ b/src/Structures/MiniGames/Arcade/Zombies.ts @@ -12,8 +12,8 @@ class Zombies { bulletsHit: number; bulletsShot: number; gunAccuracy: number; - headshots: number; - headshotAccuracy: number; + headShots: number; + headShotAccuracy: number; constructor(data: Record) { this.overall = new ZombiesStats(data); this.deadEnd = new ZombiesStats(data, 'deadend'); @@ -24,8 +24,8 @@ class Zombies { this.bulletsHit = data?.bullets_hit_zombies || 0; this.bulletsShot = data?.bullets_shot_zombies || 0; this.gunAccuracy = Divide(this.bulletsHit, this.bulletsShot); - this.headshots = data?.headshots_zombies || 0; - this.headshotAccuracy = Divide(this.headshots, this.bulletsShot); + this.headShots = data?.headshots_zombies || 0; + this.headShotAccuracy = Divide(this.headShots, this.bulletsShot); } private parseZombiesKills(data: Record): Record { const matches = Array.from(Object.keys(data)) diff --git a/src/Structures/MiniGames/ArenaBrawl/ArenaBrawlMode.test.ts b/src/Structures/MiniGames/ArenaBrawl/ArenaBrawlMode.test.ts index 09ddb013f..8bb3415a9 100644 --- a/src/Structures/MiniGames/ArenaBrawl/ArenaBrawlMode.test.ts +++ b/src/Structures/MiniGames/ArenaBrawl/ArenaBrawlMode.test.ts @@ -33,7 +33,7 @@ test('ArenaBrawlMode', () => { expect(data.games).toBeDefined(); expect(data.games).toBeGreaterThanOrEqual(0); expectTypeOf(data.games).toEqualTypeOf(); - expect(data.winstreak).toBeDefined(); - expect(data.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winstreak).toEqualTypeOf(); + expect(data.winStreak).toBeDefined(); + expect(data.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winStreak).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/ArenaBrawl/ArenaBrawlMode.ts b/src/Structures/MiniGames/ArenaBrawl/ArenaBrawlMode.ts index b0be2f277..f2caad015 100644 --- a/src/Structures/MiniGames/ArenaBrawl/ArenaBrawlMode.ts +++ b/src/Structures/MiniGames/ArenaBrawl/ArenaBrawlMode.ts @@ -11,7 +11,7 @@ class ArenaBrawlMode { losses: number; WLR: number; games: number; - winstreak: number; + winStreak: number; constructor(data: Record, mode: ArenaBrawlModes) { this.damage = data?.[`damage_${mode}`] || 0; this.kills = data?.[`kills_${mode}`] || 0; @@ -22,7 +22,7 @@ class ArenaBrawlMode { this.losses = data?.[`losses_${mode}`] || 0; this.WLR = Divide(this.wins, this.losses); this.games = data?.[`games_${mode}`] || 0; - this.winstreak = data?.[`win_streaks_${mode}`] || 0; + this.winStreak = data?.[`win_streaks_${mode}`] || 0; } } diff --git a/src/Structures/MiniGames/BedWars/BedWars.test.ts b/src/Structures/MiniGames/BedWars/BedWars.test.ts index ba50b1836..f7e070bb4 100644 --- a/src/Structures/MiniGames/BedWars/BedWars.test.ts +++ b/src/Structures/MiniGames/BedWars/BedWars.test.ts @@ -28,9 +28,9 @@ test('BedWars', () => { expect(data.wins).toBeDefined(); expect(data.wins).toBeGreaterThanOrEqual(0); expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.winstreak).toBeDefined(); - expect(data.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winstreak).toEqualTypeOf(); + expect(data.winStreak).toBeDefined(); + expect(data.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winStreak).toEqualTypeOf(); expect(data.kills).toBeDefined(); expect(data.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.kills).toEqualTypeOf(); diff --git a/src/Structures/MiniGames/BedWars/BedWars.ts b/src/Structures/MiniGames/BedWars/BedWars.ts index d8e19e334..810dd28c8 100644 --- a/src/Structures/MiniGames/BedWars/BedWars.ts +++ b/src/Structures/MiniGames/BedWars/BedWars.ts @@ -6,7 +6,7 @@ import BedWarsPracticeStats from './Practice/BedWarsPracticeStats.js'; import Divide from '../../../Utils/Divide.js'; import type { BedWarsPrestige } from '../../../Types/Player.js'; -function getBedwarsLevel(xp: number): number { +function getBedWarsLevel(xp: number): number { let level = Math.floor(xp / 487000) * 100; xp = xp % 487000; if (500 > xp) return level + xp / 500; @@ -88,7 +88,7 @@ class BedWars { prestige: BedWarsPrestige; playedGames: number; wins: number; - winstreak: number; + winStreak: number; kills: number; finalKills: number; losses: number; @@ -111,12 +111,12 @@ class BedWars { totalSlumberTicket: number; constructor(data: Record) { this.tokens = data?.coins || data?.tokens || 0; - this.level = data?.Experience ? getBedwarsLevel(data?.Experience) : 0; + this.level = data?.Experience ? getBedWarsLevel(data?.Experience) : 0; this.experience = data?.Experience || 0; this.prestige = getPrestige(this.level); this.playedGames = data?.games_played_bedwars || 0; this.wins = data?.wins_bedwars || 0; - this.winstreak = data?.winstreak || 0; + this.winStreak = data?.winstreak || 0; this.kills = data?.kills_bedwars || 0; this.finalKills = data?.final_kills_bedwars || 0; this.losses = data?.losses_bedwars || 0; diff --git a/src/Structures/MiniGames/BedWars/BedWarsBeds.ts b/src/Structures/MiniGames/BedWars/BedWarsBeds.ts index 09e4eff48..260a52ec3 100644 --- a/src/Structures/MiniGames/BedWars/BedWarsBeds.ts +++ b/src/Structures/MiniGames/BedWars/BedWarsBeds.ts @@ -1,11 +1,11 @@ import Divide from '../../../Utils/Divide.js'; -import type { BedwarsGamemodeName } from '../../../Types/Player.js'; +import type { BedWarsGamemodeName } from '../../../Types/Player.js'; class BedWarsBeds { broken: number; lost: number; BLRatio: number; - constructor(data: Record, mode?: BedwarsGamemodeName | string) { + constructor(data: Record, mode?: BedWarsGamemodeName | string) { mode = mode ? `${mode}_` : ''; this.broken = data?.[`${mode}beds_broken_bedwars`] || 0; this.lost = data?.[`${mode}beds_lost_bedwars`] || 0; diff --git a/src/Structures/MiniGames/BedWars/BedWarsDreamMode.ts b/src/Structures/MiniGames/BedWars/BedWarsDreamMode.ts index fb105fe3a..0b2ac4805 100644 --- a/src/Structures/MiniGames/BedWars/BedWarsDreamMode.ts +++ b/src/Structures/MiniGames/BedWars/BedWarsDreamMode.ts @@ -1,13 +1,13 @@ import BedWarsMode from './BedWarsMode.js'; -import type { BedwarsDreamGamemodeName } from '../../../Types/Player.js'; +import type { BedWarsDreamGamemodeName } from '../../../Types/Player.js'; -class BedwarsDreamMode { +class BedWarsDreamMode { doubles: BedWarsMode; fours: BedWarsMode; - constructor(data: Record, mode: BedwarsDreamGamemodeName) { + constructor(data: Record, mode: BedWarsDreamGamemodeName) { this.doubles = new BedWarsMode(data, `eight_two_${mode}`); this.fours = new BedWarsMode(data, `four_four_${mode}`); } } -export default BedwarsDreamMode; +export default BedWarsDreamMode; diff --git a/src/Structures/MiniGames/BedWars/BedWarsDreamStats.ts b/src/Structures/MiniGames/BedWars/BedWarsDreamStats.ts index 4bce03e36..6169cad49 100644 --- a/src/Structures/MiniGames/BedWars/BedWarsDreamStats.ts +++ b/src/Structures/MiniGames/BedWars/BedWarsDreamStats.ts @@ -1,17 +1,17 @@ -import BedwarsDreamMode from './BedWarsDreamMode.js'; +import BedWarsDreamMode from './BedWarsDreamMode.js'; class BedWarsDreamStats { - ultimate: BedwarsDreamMode; - rush: BedwarsDreamMode; - armed: BedwarsDreamMode; - lucky: BedwarsDreamMode; - voidless: BedwarsDreamMode; + ultimate: BedWarsDreamMode; + rush: BedWarsDreamMode; + armed: BedWarsDreamMode; + lucky: BedWarsDreamMode; + voidless: BedWarsDreamMode; constructor(data: Record) { - this.ultimate = new BedwarsDreamMode(data, 'ultimate'); - this.rush = new BedwarsDreamMode(data, 'rush'); - this.armed = new BedwarsDreamMode(data, 'armed'); - this.lucky = new BedwarsDreamMode(data, 'lucky'); - this.voidless = new BedwarsDreamMode(data, 'voidless'); + this.ultimate = new BedWarsDreamMode(data, 'ultimate'); + this.rush = new BedWarsDreamMode(data, 'rush'); + this.armed = new BedWarsDreamMode(data, 'armed'); + this.lucky = new BedWarsDreamMode(data, 'lucky'); + this.voidless = new BedWarsDreamMode(data, 'voidless'); } } diff --git a/src/Structures/MiniGames/BedWars/BedWarsMode.ts b/src/Structures/MiniGames/BedWars/BedWarsMode.ts index 12a99a092..3dd46d5a3 100644 --- a/src/Structures/MiniGames/BedWars/BedWarsMode.ts +++ b/src/Structures/MiniGames/BedWars/BedWarsMode.ts @@ -1,10 +1,10 @@ import BedWarsBeds from './BedWarsBeds.js'; import Divide from '../../../Utils/Divide.js'; -import type { BedwarsGamemodeName } from '../../../Types/Player.js'; +import type { BedWarsGamemodeName } from '../../../Types/Player.js'; class BedWarsMode { - mode: BedwarsGamemodeName; - winstreak: number; + mode: BedWarsGamemodeName; + winStreak: number; playedGames: number; kills: number; deaths: number; @@ -16,9 +16,9 @@ class BedWarsMode { KDR: number; WLR: number; FKDR: number; - constructor(data: Record, mode: BedwarsGamemodeName) { + constructor(data: Record, mode: BedWarsGamemodeName) { this.mode = mode; - this.winstreak = data?.[`${mode}_winstreak`] || 0; + this.winStreak = data?.[`${mode}_winstreak`] || 0; this.playedGames = data?.[`${mode}_games_played_bedwars`] || 0; this.kills = data?.[`${mode}_kills_bedwars`] || 0; this.deaths = data?.[`${mode}_deaths_bedwars`] || 0; diff --git a/src/Structures/MiniGames/CopsAndCrims/CopsAndCrims.test.ts b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrims.test.ts index 35cbf1cf0..29e79e905 100644 --- a/src/Structures/MiniGames/CopsAndCrims/CopsAndCrims.test.ts +++ b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrims.test.ts @@ -19,9 +19,9 @@ test('CopsAndCrims', () => { expect(data.copKills).toBeDefined(); expect(data.copKills).toBeGreaterThanOrEqual(0); expectTypeOf(data.copKills).toEqualTypeOf(); - expect(data.headshotKills).toBeDefined(); - expect(data.headshotKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.headshotKills).toEqualTypeOf(); + expect(data.headShotKills).toBeDefined(); + expect(data.headShotKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.headShotKills).toEqualTypeOf(); expect(data.grenadeKills).toBeDefined(); expect(data.grenadeKills).toBeGreaterThanOrEqual(0); expectTypeOf(data.grenadeKills).toEqualTypeOf(); diff --git a/src/Structures/MiniGames/CopsAndCrims/CopsAndCrims.ts b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrims.ts index ccf2da8b3..ca56703c3 100644 --- a/src/Structures/MiniGames/CopsAndCrims/CopsAndCrims.ts +++ b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrims.ts @@ -7,7 +7,7 @@ class CopsAndCrims { kills: number; criminalKills: number; copKills: number; - headshotKills: number; + headShotKills: number; grenadeKills: number; assists: number; deaths: number; @@ -67,7 +67,7 @@ class CopsAndCrims { this.kills = data?.kills || 0; this.criminalKills = data?.criminal_kills || 0; this.copKills = data?.cop_kills || 0; - this.headshotKills = data?.headshot_kills || 0; + this.headShotKills = data?.headshot_kills || 0; this.grenadeKills = data?.grenade_kills || 0; this.assists = data?.assists || 0; this.deaths = data?.deaths || 0; diff --git a/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.test.ts b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.test.ts index 974a9880a..80ceb5f01 100644 --- a/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.test.ts +++ b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.test.ts @@ -23,7 +23,7 @@ test('CopsAndCrimsGun', () => { expect(data.kills).toBeDefined(); expect(data.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.kills).toEqualTypeOf(); - expect(data.headshots).toBeDefined(); - expect(data.headshots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.headshots).toEqualTypeOf(); + expect(data.headShots).toBeDefined(); + expect(data.headShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.headShots).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.ts b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.ts index 96c7e68f5..686255cd4 100644 --- a/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.ts +++ b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.ts @@ -7,7 +7,7 @@ class CopsAndCrimsGun { reloadSpeedReduction: number; costReduction: number; kills: number; - headshots: number; + headShots: number; constructor(data: Record, gunName: CopsAndCrimsGuns) { this.gunName = gunName; this.damageIncrease = data?.[`${gunName}_damage_increase`] || 0; @@ -15,7 +15,7 @@ class CopsAndCrimsGun { this.reloadSpeedReduction = data?.[`${gunName}_reload_speed_reduction`] || 0; this.costReduction = data?.[`${gunName}_cost_reduction`] || 0; this.kills = data?.[`${gunName}Kills`] || data?.[`${gunName}_kills`] || 0; - this.headshots = data?.[`${gunName}Headshots`] || 0; + this.headShots = data?.[`${gunName}Headshots`] || 0; } } diff --git a/src/Structures/MiniGames/Duels/Duels.test.ts b/src/Structures/MiniGames/Duels/Duels.test.ts index 7c7ad6158..6eb00e646 100644 --- a/src/Structures/MiniGames/Duels/Duels.test.ts +++ b/src/Structures/MiniGames/Duels/Duels.test.ts @@ -37,12 +37,12 @@ test('Duels', () => { expect(data.playedGames).toBeDefined(); expect(data.playedGames).toBeGreaterThanOrEqual(0); expectTypeOf(data.playedGames).toEqualTypeOf(); - expect(data.winstreak).toBeDefined(); - expect(data.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winstreak).toEqualTypeOf(); - expect(data.bestWinstreak).toBeDefined(); - expect(data.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bestWinstreak).toEqualTypeOf(); + expect(data.winStreak).toBeDefined(); + expect(data.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winStreak).toEqualTypeOf(); + expect(data.bestWinStreak).toBeDefined(); + expect(data.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bestWinStreak).toEqualTypeOf(); expect(data.ping).toBeDefined(); expect(data.ping).toBeGreaterThanOrEqual(0); expectTypeOf(data.ping).toEqualTypeOf(); @@ -70,27 +70,27 @@ test('Duels', () => { expect(data.healthRegenerated).toBeDefined(); expect(data.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.healthRegenerated).toEqualTypeOf(); - expect(data.goldenApplesEatan).toBeDefined(); - expect(data.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.goldenApplesEatan).toEqualTypeOf(); + expect(data.goldenApplesEaten).toBeDefined(); + expect(data.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goldenApplesEaten).toEqualTypeOf(); expect(data.uhc).toBeDefined(); expectTypeOf(data.uhc).toEqualTypeOf(); expectTypeOf(data.uhc.title).toEqualTypeOf(); - expect(data.uhc.winstreak).toBeDefined(); - expect(data.uhc.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.winstreak).toEqualTypeOf(); - expect(data.uhc.bestWinstreak).toBeDefined(); - expect(data.uhc.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.bestWinstreak).toEqualTypeOf(); + expect(data.uhc.winStreak).toBeDefined(); + expect(data.uhc.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.winStreak).toEqualTypeOf(); + expect(data.uhc.bestWinStreak).toBeDefined(); + expect(data.uhc.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.bestWinStreak).toEqualTypeOf(); expect(data.uhc.solo).toBeDefined(); expectTypeOf(data.uhc.solo).toEqualTypeOf(); expectTypeOf(data.uhc.solo.title).toEqualTypeOf(); - expect(data.uhc.solo.winstreak).toBeDefined(); - expect(data.uhc.solo.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.solo.winstreak).toEqualTypeOf(); - expect(data.uhc.solo.bestWinstreak).toBeDefined(); - expect(data.uhc.solo.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.solo.bestWinstreak).toEqualTypeOf(); + expect(data.uhc.solo.winStreak).toBeDefined(); + expect(data.uhc.solo.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.solo.winStreak).toEqualTypeOf(); + expect(data.uhc.solo.bestWinStreak).toBeDefined(); + expect(data.uhc.solo.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.solo.bestWinStreak).toEqualTypeOf(); expect(data.uhc.solo.kills).toBeDefined(); expect(data.uhc.solo.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.uhc.solo.kills).toEqualTypeOf(); @@ -136,18 +136,18 @@ test('Duels', () => { expect(data.uhc.solo.healthRegenerated).toBeDefined(); expect(data.uhc.solo.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.uhc.solo.healthRegenerated).toEqualTypeOf(); - expect(data.uhc.solo.goldenApplesEatan).toBeDefined(); - expect(data.uhc.solo.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.solo.goldenApplesEatan).toEqualTypeOf(); + expect(data.uhc.solo.goldenApplesEaten).toBeDefined(); + expect(data.uhc.solo.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.solo.goldenApplesEaten).toEqualTypeOf(); expect(data.uhc.doubles).toBeDefined(); expectTypeOf(data.uhc.doubles).toEqualTypeOf(); expectTypeOf(data.uhc.doubles.title).toEqualTypeOf(); - expect(data.uhc.doubles.winstreak).toBeDefined(); - expect(data.uhc.doubles.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.doubles.winstreak).toEqualTypeOf(); - expect(data.uhc.doubles.bestWinstreak).toBeDefined(); - expect(data.uhc.doubles.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.doubles.bestWinstreak).toEqualTypeOf(); + expect(data.uhc.doubles.winStreak).toBeDefined(); + expect(data.uhc.doubles.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.doubles.winStreak).toEqualTypeOf(); + expect(data.uhc.doubles.bestWinStreak).toBeDefined(); + expect(data.uhc.doubles.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.doubles.bestWinStreak).toEqualTypeOf(); expect(data.uhc.doubles.kills).toBeDefined(); expect(data.uhc.doubles.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.uhc.doubles.kills).toEqualTypeOf(); @@ -193,18 +193,18 @@ test('Duels', () => { expect(data.uhc.doubles.healthRegenerated).toBeDefined(); expect(data.uhc.doubles.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.uhc.doubles.healthRegenerated).toEqualTypeOf(); - expect(data.uhc.doubles.goldenApplesEatan).toBeDefined(); - expect(data.uhc.doubles.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.doubles.goldenApplesEatan).toEqualTypeOf(); + expect(data.uhc.doubles.goldenApplesEaten).toBeDefined(); + expect(data.uhc.doubles.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.doubles.goldenApplesEaten).toEqualTypeOf(); expect(data.uhc.fours).toBeDefined(); expectTypeOf(data.uhc.fours).toEqualTypeOf(); expectTypeOf(data.uhc.fours.title).toEqualTypeOf(); - expect(data.uhc.fours.winstreak).toBeDefined(); - expect(data.uhc.fours.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.fours.winstreak).toEqualTypeOf(); - expect(data.uhc.fours.bestWinstreak).toBeDefined(); - expect(data.uhc.fours.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.fours.bestWinstreak).toEqualTypeOf(); + expect(data.uhc.fours.winStreak).toBeDefined(); + expect(data.uhc.fours.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.fours.winStreak).toEqualTypeOf(); + expect(data.uhc.fours.bestWinStreak).toBeDefined(); + expect(data.uhc.fours.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.fours.bestWinStreak).toEqualTypeOf(); expect(data.uhc.fours.kills).toBeDefined(); expect(data.uhc.fours.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.uhc.fours.kills).toEqualTypeOf(); @@ -250,18 +250,18 @@ test('Duels', () => { expect(data.uhc.fours.healthRegenerated).toBeDefined(); expect(data.uhc.fours.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.uhc.fours.healthRegenerated).toEqualTypeOf(); - expect(data.uhc.fours.goldenApplesEatan).toBeDefined(); - expect(data.uhc.fours.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.fours.goldenApplesEatan).toEqualTypeOf(); + expect(data.uhc.fours.goldenApplesEaten).toBeDefined(); + expect(data.uhc.fours.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.fours.goldenApplesEaten).toEqualTypeOf(); expect(data.uhc.deathmatch).toBeDefined(); expectTypeOf(data.uhc.deathmatch).toEqualTypeOf(); expectTypeOf(data.uhc.deathmatch.title).toEqualTypeOf(); - expect(data.uhc.deathmatch.winstreak).toBeDefined(); - expect(data.uhc.deathmatch.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.deathmatch.winstreak).toEqualTypeOf(); - expect(data.uhc.deathmatch.bestWinstreak).toBeDefined(); - expect(data.uhc.deathmatch.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.deathmatch.bestWinstreak).toEqualTypeOf(); + expect(data.uhc.deathmatch.winStreak).toBeDefined(); + expect(data.uhc.deathmatch.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.deathmatch.winStreak).toEqualTypeOf(); + expect(data.uhc.deathmatch.bestWinStreak).toBeDefined(); + expect(data.uhc.deathmatch.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.deathmatch.bestWinStreak).toEqualTypeOf(); expect(data.uhc.deathmatch.kills).toBeDefined(); expect(data.uhc.deathmatch.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.uhc.deathmatch.kills).toEqualTypeOf(); @@ -307,9 +307,9 @@ test('Duels', () => { expect(data.uhc.deathmatch.healthRegenerated).toBeDefined(); expect(data.uhc.deathmatch.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.uhc.deathmatch.healthRegenerated).toEqualTypeOf(); - expect(data.uhc.deathmatch.goldenApplesEatan).toBeDefined(); - expect(data.uhc.deathmatch.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.deathmatch.goldenApplesEatan).toEqualTypeOf(); + expect(data.uhc.deathmatch.goldenApplesEaten).toBeDefined(); + expect(data.uhc.deathmatch.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.deathmatch.goldenApplesEaten).toEqualTypeOf(); expect(data.uhc.kills).toBeDefined(); expect(data.uhc.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.uhc.kills).toEqualTypeOf(); @@ -355,29 +355,29 @@ test('Duels', () => { expect(data.uhc.healthRegenerated).toBeDefined(); expect(data.uhc.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.uhc.healthRegenerated).toEqualTypeOf(); - expect(data.uhc.goldenApplesEatan).toBeDefined(); - expect(data.uhc.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.goldenApplesEatan).toEqualTypeOf(); + expect(data.uhc.goldenApplesEaten).toBeDefined(); + expect(data.uhc.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uhc.goldenApplesEaten).toEqualTypeOf(); expect(data.skywars).toBeDefined(); expectTypeOf(data.skywars).toEqualTypeOf(); expect(data.skywars.title).toBeDefined(); expectTypeOf(data.skywars.title).toEqualTypeOf(); - expect(data.skywars.winstreak).toBeDefined(); - expect(data.skywars.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.winstreak).toEqualTypeOf(); - expect(data.skywars.bestWinstreak).toBeDefined(); - expect(data.skywars.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.bestWinstreak).toEqualTypeOf(); + expect(data.skywars.winStreak).toBeDefined(); + expect(data.skywars.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.winStreak).toEqualTypeOf(); + expect(data.skywars.bestWinStreak).toBeDefined(); + expect(data.skywars.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.bestWinStreak).toEqualTypeOf(); expect(data.skywars.solo).toBeDefined(); expectTypeOf(data.skywars.solo).toEqualTypeOf(); expect(data.skywars.solo.title).toBeDefined(); expectTypeOf(data.skywars.solo.title).toEqualTypeOf(); - expect(data.skywars.solo.winstreak).toBeDefined(); - expect(data.skywars.solo.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.solo.winstreak).toEqualTypeOf(); - expect(data.skywars.solo.bestWinstreak).toBeDefined(); - expect(data.skywars.solo.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.solo.bestWinstreak).toEqualTypeOf(); + expect(data.skywars.solo.winStreak).toBeDefined(); + expect(data.skywars.solo.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.solo.winStreak).toEqualTypeOf(); + expect(data.skywars.solo.bestWinStreak).toBeDefined(); + expect(data.skywars.solo.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.solo.bestWinStreak).toEqualTypeOf(); expect(data.skywars.solo.kills).toBeDefined(); expect(data.skywars.solo.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.skywars.solo.kills).toEqualTypeOf(); @@ -423,19 +423,19 @@ test('Duels', () => { expect(data.skywars.solo.healthRegenerated).toBeDefined(); expect(data.skywars.solo.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.skywars.solo.healthRegenerated).toEqualTypeOf(); - expect(data.skywars.solo.goldenApplesEatan).toBeDefined(); - expect(data.skywars.solo.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.solo.goldenApplesEatan).toEqualTypeOf(); + expect(data.skywars.solo.goldenApplesEaten).toBeDefined(); + expect(data.skywars.solo.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.solo.goldenApplesEaten).toEqualTypeOf(); expect(data.skywars.doubles).toBeDefined(); expectTypeOf(data.skywars.doubles).toEqualTypeOf(); expect(data.skywars.doubles.title).toBeDefined(); expectTypeOf(data.skywars.doubles.title).toEqualTypeOf(); - expect(data.skywars.doubles.winstreak).toBeDefined(); - expect(data.skywars.doubles.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.doubles.winstreak).toEqualTypeOf(); - expect(data.skywars.doubles.bestWinstreak).toBeDefined(); - expect(data.skywars.doubles.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.doubles.bestWinstreak).toEqualTypeOf(); + expect(data.skywars.doubles.winStreak).toBeDefined(); + expect(data.skywars.doubles.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.doubles.winStreak).toEqualTypeOf(); + expect(data.skywars.doubles.bestWinStreak).toBeDefined(); + expect(data.skywars.doubles.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.doubles.bestWinStreak).toEqualTypeOf(); expect(data.skywars.doubles.kills).toBeDefined(); expect(data.skywars.doubles.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.skywars.doubles.kills).toEqualTypeOf(); @@ -481,9 +481,9 @@ test('Duels', () => { expect(data.skywars.doubles.healthRegenerated).toBeDefined(); expect(data.skywars.doubles.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.skywars.doubles.healthRegenerated).toEqualTypeOf(); - expect(data.skywars.doubles.goldenApplesEatan).toBeDefined(); - expect(data.skywars.doubles.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.doubles.goldenApplesEatan).toEqualTypeOf(); + expect(data.skywars.doubles.goldenApplesEaten).toBeDefined(); + expect(data.skywars.doubles.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.doubles.goldenApplesEaten).toEqualTypeOf(); expect(data.skywars.kills).toBeDefined(); expect(data.skywars.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.skywars.kills).toEqualTypeOf(); @@ -529,29 +529,29 @@ test('Duels', () => { expect(data.skywars.healthRegenerated).toBeDefined(); expect(data.skywars.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.skywars.healthRegenerated).toEqualTypeOf(); - expect(data.skywars.goldenApplesEatan).toBeDefined(); - expect(data.skywars.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.goldenApplesEatan).toEqualTypeOf(); + expect(data.skywars.goldenApplesEaten).toBeDefined(); + expect(data.skywars.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skywars.goldenApplesEaten).toEqualTypeOf(); expect(data.megawalls).toBeDefined(); expectTypeOf(data.megawalls).toEqualTypeOf(); expect(data.megawalls.title).toBeDefined(); expectTypeOf(data.megawalls.title).toEqualTypeOf(); - expect(data.megawalls.winstreak).toBeDefined(); - expect(data.megawalls.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.winstreak).toEqualTypeOf(); - expect(data.megawalls.bestWinstreak).toBeDefined(); - expect(data.megawalls.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.bestWinstreak).toEqualTypeOf(); + expect(data.megawalls.winStreak).toBeDefined(); + expect(data.megawalls.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.winStreak).toEqualTypeOf(); + expect(data.megawalls.bestWinStreak).toBeDefined(); + expect(data.megawalls.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.bestWinStreak).toEqualTypeOf(); expect(data.megawalls.solo).toBeDefined(); expectTypeOf(data.megawalls.solo).toEqualTypeOf(); expect(data.megawalls.solo.title).toBeDefined(); expectTypeOf(data.megawalls.solo.title).toEqualTypeOf(); - expect(data.megawalls.solo.winstreak).toBeDefined(); - expect(data.megawalls.solo.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.solo.winstreak).toEqualTypeOf(); - expect(data.megawalls.solo.bestWinstreak).toBeDefined(); - expect(data.megawalls.solo.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.solo.bestWinstreak).toEqualTypeOf(); + expect(data.megawalls.solo.winStreak).toBeDefined(); + expect(data.megawalls.solo.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.solo.winStreak).toEqualTypeOf(); + expect(data.megawalls.solo.bestWinStreak).toBeDefined(); + expect(data.megawalls.solo.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.solo.bestWinStreak).toEqualTypeOf(); expect(data.megawalls.solo.kills).toBeDefined(); expect(data.megawalls.solo.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.megawalls.solo.kills).toEqualTypeOf(); @@ -597,19 +597,19 @@ test('Duels', () => { expect(data.megawalls.solo.healthRegenerated).toBeDefined(); expect(data.megawalls.solo.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.megawalls.solo.healthRegenerated).toEqualTypeOf(); - expect(data.megawalls.solo.goldenApplesEatan).toBeDefined(); - expect(data.megawalls.solo.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.solo.goldenApplesEatan).toEqualTypeOf(); + expect(data.megawalls.solo.goldenApplesEaten).toBeDefined(); + expect(data.megawalls.solo.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.solo.goldenApplesEaten).toEqualTypeOf(); expect(data.megawalls.doubles).toBeDefined(); expectTypeOf(data.megawalls.doubles).toEqualTypeOf(); expect(data.megawalls.doubles.title).toBeDefined(); expectTypeOf(data.megawalls.doubles.title).toEqualTypeOf(); - expect(data.megawalls.doubles.winstreak).toBeDefined(); - expect(data.megawalls.doubles.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.doubles.winstreak).toEqualTypeOf(); - expect(data.megawalls.doubles.bestWinstreak).toBeDefined(); - expect(data.megawalls.doubles.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.doubles.bestWinstreak).toEqualTypeOf(); + expect(data.megawalls.doubles.winStreak).toBeDefined(); + expect(data.megawalls.doubles.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.doubles.winStreak).toEqualTypeOf(); + expect(data.megawalls.doubles.bestWinStreak).toBeDefined(); + expect(data.megawalls.doubles.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.doubles.bestWinStreak).toEqualTypeOf(); expect(data.megawalls.doubles.kills).toBeDefined(); expect(data.megawalls.doubles.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.megawalls.doubles.kills).toEqualTypeOf(); @@ -655,9 +655,9 @@ test('Duels', () => { expect(data.megawalls.doubles.healthRegenerated).toBeDefined(); expect(data.megawalls.doubles.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.megawalls.doubles.healthRegenerated).toEqualTypeOf(); - expect(data.megawalls.doubles.goldenApplesEatan).toBeDefined(); - expect(data.megawalls.doubles.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.doubles.goldenApplesEatan).toEqualTypeOf(); + expect(data.megawalls.doubles.goldenApplesEaten).toBeDefined(); + expect(data.megawalls.doubles.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.doubles.goldenApplesEaten).toEqualTypeOf(); expect(data.megawalls.kills).toBeDefined(); expect(data.megawalls.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.megawalls.kills).toEqualTypeOf(); @@ -703,18 +703,18 @@ test('Duels', () => { expect(data.megawalls.healthRegenerated).toBeDefined(); expect(data.megawalls.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.megawalls.healthRegenerated).toEqualTypeOf(); - expect(data.megawalls.goldenApplesEatan).toBeDefined(); - expect(data.megawalls.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.goldenApplesEatan).toEqualTypeOf(); + expect(data.megawalls.goldenApplesEaten).toBeDefined(); + expect(data.megawalls.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megawalls.goldenApplesEaten).toEqualTypeOf(); expect(data.blitz).toBeDefined(); expectTypeOf(data.blitz).toEqualTypeOf(); expectTypeOf(data.blitz.title).toEqualTypeOf(); - expect(data.blitz.winstreak).toBeDefined(); - expect(data.blitz.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blitz.winstreak).toEqualTypeOf(); - expect(data.blitz.bestWinstreak).toBeDefined(); - expect(data.blitz.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blitz.bestWinstreak).toEqualTypeOf(); + expect(data.blitz.winStreak).toBeDefined(); + expect(data.blitz.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blitz.winStreak).toEqualTypeOf(); + expect(data.blitz.bestWinStreak).toBeDefined(); + expect(data.blitz.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blitz.bestWinStreak).toEqualTypeOf(); expect(data.blitz.kills).toBeDefined(); expect(data.blitz.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.blitz.kills).toEqualTypeOf(); @@ -760,29 +760,29 @@ test('Duels', () => { expect(data.blitz.healthRegenerated).toBeDefined(); expect(data.blitz.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.blitz.healthRegenerated).toEqualTypeOf(); - expect(data.blitz.goldenApplesEatan).toBeDefined(); - expect(data.blitz.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blitz.goldenApplesEatan).toEqualTypeOf(); + expect(data.blitz.goldenApplesEaten).toBeDefined(); + expect(data.blitz.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blitz.goldenApplesEaten).toEqualTypeOf(); expect(data.op).toBeDefined(); expectTypeOf(data.op).toEqualTypeOf(); expect(data.op.title).toBeDefined(); expectTypeOf(data.op.title).toEqualTypeOf(); - expect(data.op.winstreak).toBeDefined(); - expect(data.op.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.winstreak).toEqualTypeOf(); - expect(data.op.bestWinstreak).toBeDefined(); - expect(data.op.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.bestWinstreak).toEqualTypeOf(); + expect(data.op.winStreak).toBeDefined(); + expect(data.op.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.winStreak).toEqualTypeOf(); + expect(data.op.bestWinStreak).toBeDefined(); + expect(data.op.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.bestWinStreak).toEqualTypeOf(); expect(data.op.solo).toBeDefined(); expectTypeOf(data.op.solo).toEqualTypeOf(); expect(data.op.solo.title).toBeDefined(); expectTypeOf(data.op.solo.title).toEqualTypeOf(); - expect(data.op.solo.winstreak).toBeDefined(); - expect(data.op.solo.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.solo.winstreak).toEqualTypeOf(); - expect(data.op.solo.bestWinstreak).toBeDefined(); - expect(data.op.solo.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.solo.bestWinstreak).toEqualTypeOf(); + expect(data.op.solo.winStreak).toBeDefined(); + expect(data.op.solo.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.solo.winStreak).toEqualTypeOf(); + expect(data.op.solo.bestWinStreak).toBeDefined(); + expect(data.op.solo.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.solo.bestWinStreak).toEqualTypeOf(); expect(data.op.solo.kills).toBeDefined(); expect(data.op.solo.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.op.solo.kills).toEqualTypeOf(); @@ -828,19 +828,19 @@ test('Duels', () => { expect(data.op.solo.healthRegenerated).toBeDefined(); expect(data.op.solo.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.op.solo.healthRegenerated).toEqualTypeOf(); - expect(data.op.solo.goldenApplesEatan).toBeDefined(); - expect(data.op.solo.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.solo.goldenApplesEatan).toEqualTypeOf(); + expect(data.op.solo.goldenApplesEaten).toBeDefined(); + expect(data.op.solo.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.solo.goldenApplesEaten).toEqualTypeOf(); expect(data.op.doubles).toBeDefined(); expectTypeOf(data.op.doubles).toEqualTypeOf(); expect(data.op.doubles.title).toBeDefined(); expectTypeOf(data.op.doubles.title).toEqualTypeOf(); - expect(data.op.doubles.winstreak).toBeDefined(); - expect(data.op.doubles.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.doubles.winstreak).toEqualTypeOf(); - expect(data.op.doubles.bestWinstreak).toBeDefined(); - expect(data.op.doubles.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.doubles.bestWinstreak).toEqualTypeOf(); + expect(data.op.doubles.winStreak).toBeDefined(); + expect(data.op.doubles.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.doubles.winStreak).toEqualTypeOf(); + expect(data.op.doubles.bestWinStreak).toBeDefined(); + expect(data.op.doubles.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.doubles.bestWinStreak).toEqualTypeOf(); expect(data.op.doubles.kills).toBeDefined(); expect(data.op.doubles.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.op.doubles.kills).toEqualTypeOf(); @@ -886,9 +886,9 @@ test('Duels', () => { expect(data.op.doubles.healthRegenerated).toBeDefined(); expect(data.op.doubles.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.op.doubles.healthRegenerated).toEqualTypeOf(); - expect(data.op.doubles.goldenApplesEatan).toBeDefined(); - expect(data.op.doubles.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.doubles.goldenApplesEatan).toEqualTypeOf(); + expect(data.op.doubles.goldenApplesEaten).toBeDefined(); + expect(data.op.doubles.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.doubles.goldenApplesEaten).toEqualTypeOf(); expect(data.op.kills).toBeDefined(); expect(data.op.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.op.kills).toEqualTypeOf(); @@ -934,18 +934,18 @@ test('Duels', () => { expect(data.op.healthRegenerated).toBeDefined(); expect(data.op.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.op.healthRegenerated).toEqualTypeOf(); - expect(data.op.goldenApplesEatan).toBeDefined(); - expect(data.op.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.goldenApplesEatan).toEqualTypeOf(); + expect(data.op.goldenApplesEaten).toBeDefined(); + expect(data.op.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.op.goldenApplesEaten).toEqualTypeOf(); expect(data.classic).toBeDefined(); expectTypeOf(data.classic).toEqualTypeOf(); expectTypeOf(data.classic.title).toEqualTypeOf(); - expect(data.classic.winstreak).toBeDefined(); - expect(data.classic.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.classic.winstreak).toEqualTypeOf(); - expect(data.classic.bestWinstreak).toBeDefined(); - expect(data.classic.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.classic.bestWinstreak).toEqualTypeOf(); + expect(data.classic.winStreak).toBeDefined(); + expect(data.classic.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.classic.winStreak).toEqualTypeOf(); + expect(data.classic.bestWinStreak).toBeDefined(); + expect(data.classic.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.classic.bestWinStreak).toEqualTypeOf(); expect(data.classic.kills).toBeDefined(); expect(data.classic.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.classic.kills).toEqualTypeOf(); @@ -991,18 +991,18 @@ test('Duels', () => { expect(data.classic.healthRegenerated).toBeDefined(); expect(data.classic.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.classic.healthRegenerated).toEqualTypeOf(); - expect(data.classic.goldenApplesEatan).toBeDefined(); - expect(data.classic.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.classic.goldenApplesEatan).toEqualTypeOf(); + expect(data.classic.goldenApplesEaten).toBeDefined(); + expect(data.classic.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.classic.goldenApplesEaten).toEqualTypeOf(); expect(data.bow).toBeDefined(); expectTypeOf(data.bow).toEqualTypeOf(); expectTypeOf(data.bow.title).toEqualTypeOf(); - expect(data.bow.winstreak).toBeDefined(); - expect(data.bow.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bow.winstreak).toEqualTypeOf(); - expect(data.bow.bestWinstreak).toBeDefined(); - expect(data.bow.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bow.bestWinstreak).toEqualTypeOf(); + expect(data.bow.winStreak).toBeDefined(); + expect(data.bow.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bow.winStreak).toEqualTypeOf(); + expect(data.bow.bestWinStreak).toBeDefined(); + expect(data.bow.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bow.bestWinStreak).toEqualTypeOf(); expect(data.bow.kills).toBeDefined(); expect(data.bow.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.bow.kills).toEqualTypeOf(); @@ -1048,18 +1048,18 @@ test('Duels', () => { expect(data.bow.healthRegenerated).toBeDefined(); expect(data.bow.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.bow.healthRegenerated).toEqualTypeOf(); - expect(data.bow.goldenApplesEatan).toBeDefined(); - expect(data.bow.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bow.goldenApplesEatan).toEqualTypeOf(); + expect(data.bow.goldenApplesEaten).toBeDefined(); + expect(data.bow.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bow.goldenApplesEaten).toEqualTypeOf(); expect(data.noDebuff).toBeDefined(); expectTypeOf(data.noDebuff).toEqualTypeOf(); expectTypeOf(data.noDebuff.title).toEqualTypeOf(); - expect(data.noDebuff.winstreak).toBeDefined(); - expect(data.noDebuff.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.noDebuff.winstreak).toEqualTypeOf(); - expect(data.noDebuff.bestWinstreak).toBeDefined(); - expect(data.noDebuff.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.noDebuff.bestWinstreak).toEqualTypeOf(); + expect(data.noDebuff.winStreak).toBeDefined(); + expect(data.noDebuff.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.noDebuff.winStreak).toEqualTypeOf(); + expect(data.noDebuff.bestWinStreak).toBeDefined(); + expect(data.noDebuff.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.noDebuff.bestWinStreak).toEqualTypeOf(); expect(data.noDebuff.kills).toBeDefined(); expect(data.noDebuff.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.noDebuff.kills).toEqualTypeOf(); @@ -1105,18 +1105,18 @@ test('Duels', () => { expect(data.noDebuff.healthRegenerated).toBeDefined(); expect(data.noDebuff.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.noDebuff.healthRegenerated).toEqualTypeOf(); - expect(data.noDebuff.goldenApplesEatan).toBeDefined(); - expect(data.noDebuff.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.noDebuff.goldenApplesEatan).toEqualTypeOf(); + expect(data.noDebuff.goldenApplesEaten).toBeDefined(); + expect(data.noDebuff.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.noDebuff.goldenApplesEaten).toEqualTypeOf(); expect(data.combo).toBeDefined(); expectTypeOf(data.combo).toEqualTypeOf(); expectTypeOf(data.combo.title).toEqualTypeOf(); - expect(data.combo.winstreak).toBeDefined(); - expect(data.combo.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.combo.winstreak).toEqualTypeOf(); - expect(data.combo.bestWinstreak).toBeDefined(); - expect(data.combo.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.combo.bestWinstreak).toEqualTypeOf(); + expect(data.combo.winStreak).toBeDefined(); + expect(data.combo.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.combo.winStreak).toEqualTypeOf(); + expect(data.combo.bestWinStreak).toBeDefined(); + expect(data.combo.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.combo.bestWinStreak).toEqualTypeOf(); expect(data.combo.kills).toBeDefined(); expect(data.combo.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.combo.kills).toEqualTypeOf(); @@ -1162,18 +1162,18 @@ test('Duels', () => { expect(data.combo.healthRegenerated).toBeDefined(); expect(data.combo.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.combo.healthRegenerated).toEqualTypeOf(); - expect(data.combo.goldenApplesEatan).toBeDefined(); - expect(data.combo.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.combo.goldenApplesEatan).toEqualTypeOf(); + expect(data.combo.goldenApplesEaten).toBeDefined(); + expect(data.combo.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.combo.goldenApplesEaten).toEqualTypeOf(); expect(data.bowSpleef).toBeDefined(); expectTypeOf(data.bowSpleef).toEqualTypeOf(); expectTypeOf(data.bowSpleef.title).toEqualTypeOf(); - expect(data.bowSpleef.winstreak).toBeDefined(); - expect(data.bowSpleef.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowSpleef.winstreak).toEqualTypeOf(); - expect(data.bowSpleef.bestWinstreak).toBeDefined(); - expect(data.bowSpleef.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowSpleef.bestWinstreak).toEqualTypeOf(); + expect(data.bowSpleef.winStreak).toBeDefined(); + expect(data.bowSpleef.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowSpleef.winStreak).toEqualTypeOf(); + expect(data.bowSpleef.bestWinStreak).toBeDefined(); + expect(data.bowSpleef.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowSpleef.bestWinStreak).toEqualTypeOf(); expect(data.bowSpleef.kills).toBeDefined(); expect(data.bowSpleef.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.bowSpleef.kills).toEqualTypeOf(); @@ -1219,18 +1219,18 @@ test('Duels', () => { expect(data.bowSpleef.healthRegenerated).toBeDefined(); expect(data.bowSpleef.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.bowSpleef.healthRegenerated).toEqualTypeOf(); - expect(data.bowSpleef.goldenApplesEatan).toBeDefined(); - expect(data.bowSpleef.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowSpleef.goldenApplesEatan).toEqualTypeOf(); + expect(data.bowSpleef.goldenApplesEaten).toBeDefined(); + expect(data.bowSpleef.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowSpleef.goldenApplesEaten).toEqualTypeOf(); expect(data.sumo).toBeDefined(); expectTypeOf(data.sumo).toEqualTypeOf(); expectTypeOf(data.sumo.title).toEqualTypeOf(); - expect(data.sumo.winstreak).toBeDefined(); - expect(data.sumo.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.sumo.winstreak).toEqualTypeOf(); - expect(data.sumo.bestWinstreak).toBeDefined(); - expect(data.sumo.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.sumo.bestWinstreak).toEqualTypeOf(); + expect(data.sumo.winStreak).toBeDefined(); + expect(data.sumo.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sumo.winStreak).toEqualTypeOf(); + expect(data.sumo.bestWinStreak).toBeDefined(); + expect(data.sumo.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sumo.bestWinStreak).toEqualTypeOf(); expect(data.sumo.kills).toBeDefined(); expect(data.sumo.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.sumo.kills).toEqualTypeOf(); @@ -1276,29 +1276,29 @@ test('Duels', () => { expect(data.sumo.healthRegenerated).toBeDefined(); expect(data.sumo.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.sumo.healthRegenerated).toEqualTypeOf(); - expect(data.sumo.goldenApplesEatan).toBeDefined(); - expect(data.sumo.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.sumo.goldenApplesEatan).toEqualTypeOf(); + expect(data.sumo.goldenApplesEaten).toBeDefined(); + expect(data.sumo.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sumo.goldenApplesEaten).toEqualTypeOf(); expect(data.bridge).toBeDefined(); expectTypeOf(data.bridge).toEqualTypeOf(); expect(data.bridge.title).toBeDefined(); expectTypeOf(data.bridge.title).toEqualTypeOf(); - expect(data.bridge.winstreak).toBeDefined(); - expect(data.bridge.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.winstreak).toEqualTypeOf(); - expect(data.bridge.bestWinstreak).toBeDefined(); - expect(data.bridge.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.bestWinstreak).toEqualTypeOf(); + expect(data.bridge.winStreak).toBeDefined(); + expect(data.bridge.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.winStreak).toEqualTypeOf(); + expect(data.bridge.bestWinStreak).toBeDefined(); + expect(data.bridge.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.bestWinStreak).toEqualTypeOf(); expect(data.bridge.solo).toBeDefined(); expectTypeOf(data.bridge.solo).toEqualTypeOf(); expect(data.bridge.solo.title).toBeDefined(); expectTypeOf(data.bridge.solo.title).toEqualTypeOf(); - expect(data.bridge.solo.winstreak).toBeDefined(); - expect(data.bridge.solo.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.solo.winstreak).toEqualTypeOf(); - expect(data.bridge.solo.bestWinstreak).toBeDefined(); - expect(data.bridge.solo.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.solo.bestWinstreak).toEqualTypeOf(); + expect(data.bridge.solo.winStreak).toBeDefined(); + expect(data.bridge.solo.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.solo.winStreak).toEqualTypeOf(); + expect(data.bridge.solo.bestWinStreak).toBeDefined(); + expect(data.bridge.solo.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.solo.bestWinStreak).toEqualTypeOf(); expect(data.bridge.solo.kills).toBeDefined(); expect(data.bridge.solo.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.bridge.solo.kills).toEqualTypeOf(); @@ -1344,19 +1344,19 @@ test('Duels', () => { expect(data.bridge.solo.healthRegenerated).toBeDefined(); expect(data.bridge.solo.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.bridge.solo.healthRegenerated).toEqualTypeOf(); - expect(data.bridge.solo.goldenApplesEatan).toBeDefined(); - expect(data.bridge.solo.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.solo.goldenApplesEatan).toEqualTypeOf(); + expect(data.bridge.solo.goldenApplesEaten).toBeDefined(); + expect(data.bridge.solo.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.solo.goldenApplesEaten).toEqualTypeOf(); expect(data.bridge.doubles).toBeDefined(); expectTypeOf(data.bridge.doubles).toEqualTypeOf(); expect(data.bridge.doubles.title).toBeDefined(); expectTypeOf(data.bridge.doubles.title).toEqualTypeOf(); - expect(data.bridge.doubles.winstreak).toBeDefined(); - expect(data.bridge.doubles.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.doubles.winstreak).toEqualTypeOf(); - expect(data.bridge.doubles.bestWinstreak).toBeDefined(); - expect(data.bridge.doubles.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.doubles.bestWinstreak).toEqualTypeOf(); + expect(data.bridge.doubles.winStreak).toBeDefined(); + expect(data.bridge.doubles.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.doubles.winStreak).toEqualTypeOf(); + expect(data.bridge.doubles.bestWinStreak).toBeDefined(); + expect(data.bridge.doubles.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.doubles.bestWinStreak).toEqualTypeOf(); expect(data.bridge.doubles.kills).toBeDefined(); expect(data.bridge.doubles.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.bridge.doubles.kills).toEqualTypeOf(); @@ -1402,19 +1402,19 @@ test('Duels', () => { expect(data.bridge.doubles.healthRegenerated).toBeDefined(); expect(data.bridge.doubles.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.bridge.doubles.healthRegenerated).toEqualTypeOf(); - expect(data.bridge.doubles.goldenApplesEatan).toBeDefined(); - expect(data.bridge.doubles.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.doubles.goldenApplesEatan).toEqualTypeOf(); + expect(data.bridge.doubles.goldenApplesEaten).toBeDefined(); + expect(data.bridge.doubles.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.doubles.goldenApplesEaten).toEqualTypeOf(); expect(data.bridge.threes).toBeDefined(); expectTypeOf(data.bridge.threes).toEqualTypeOf(); expect(data.bridge.threes.title).toBeDefined(); expectTypeOf(data.bridge.threes.title).toEqualTypeOf(); - expect(data.bridge.threes.winstreak).toBeDefined(); - expect(data.bridge.threes.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.threes.winstreak).toEqualTypeOf(); - expect(data.bridge.threes.bestWinstreak).toBeDefined(); - expect(data.bridge.threes.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.threes.bestWinstreak).toEqualTypeOf(); + expect(data.bridge.threes.winStreak).toBeDefined(); + expect(data.bridge.threes.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.threes.winStreak).toEqualTypeOf(); + expect(data.bridge.threes.bestWinStreak).toBeDefined(); + expect(data.bridge.threes.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.threes.bestWinStreak).toEqualTypeOf(); expect(data.bridge.threes.kills).toBeDefined(); expect(data.bridge.threes.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.bridge.threes.kills).toEqualTypeOf(); @@ -1460,19 +1460,19 @@ test('Duels', () => { expect(data.bridge.threes.healthRegenerated).toBeDefined(); expect(data.bridge.threes.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.bridge.threes.healthRegenerated).toEqualTypeOf(); - expect(data.bridge.threes.goldenApplesEatan).toBeDefined(); - expect(data.bridge.threes.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.threes.goldenApplesEatan).toEqualTypeOf(); + expect(data.bridge.threes.goldenApplesEaten).toBeDefined(); + expect(data.bridge.threes.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.threes.goldenApplesEaten).toEqualTypeOf(); expect(data.bridge.fours).toBeDefined(); expectTypeOf(data.bridge.fours).toEqualTypeOf(); expect(data.bridge.fours.title).toBeDefined(); expectTypeOf(data.bridge.fours.title).toEqualTypeOf(); - expect(data.bridge.fours.winstreak).toBeDefined(); - expect(data.bridge.fours.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.fours.winstreak).toEqualTypeOf(); - expect(data.bridge.fours.bestWinstreak).toBeDefined(); - expect(data.bridge.fours.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.fours.bestWinstreak).toEqualTypeOf(); + expect(data.bridge.fours.winStreak).toBeDefined(); + expect(data.bridge.fours.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.fours.winStreak).toEqualTypeOf(); + expect(data.bridge.fours.bestWinStreak).toBeDefined(); + expect(data.bridge.fours.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.fours.bestWinStreak).toEqualTypeOf(); expect(data.bridge.fours.kills).toBeDefined(); expect(data.bridge.fours.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.bridge.fours.kills).toEqualTypeOf(); @@ -1518,19 +1518,19 @@ test('Duels', () => { expect(data.bridge.fours.healthRegenerated).toBeDefined(); expect(data.bridge.fours.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.bridge.fours.healthRegenerated).toEqualTypeOf(); - expect(data.bridge.fours.goldenApplesEatan).toBeDefined(); - expect(data.bridge.fours.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.fours.goldenApplesEatan).toEqualTypeOf(); + expect(data.bridge.fours.goldenApplesEaten).toBeDefined(); + expect(data.bridge.fours.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.fours.goldenApplesEaten).toEqualTypeOf(); expect(data.bridge['2v2v2v2']).toBeDefined(); expectTypeOf(data.bridge['2v2v2v2']).toEqualTypeOf(); expect(data.bridge['2v2v2v2'].title).toBeDefined(); expectTypeOf(data.bridge['2v2v2v2'].title).toEqualTypeOf(); - expect(data.bridge['2v2v2v2'].winstreak).toBeDefined(); - expect(data.bridge['2v2v2v2'].winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['2v2v2v2'].winstreak).toEqualTypeOf(); - expect(data.bridge['2v2v2v2'].bestWinstreak).toBeDefined(); - expect(data.bridge['2v2v2v2'].bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['2v2v2v2'].bestWinstreak).toEqualTypeOf(); + expect(data.bridge['2v2v2v2'].winStreak).toBeDefined(); + expect(data.bridge['2v2v2v2'].winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['2v2v2v2'].winStreak).toEqualTypeOf(); + expect(data.bridge['2v2v2v2'].bestWinStreak).toBeDefined(); + expect(data.bridge['2v2v2v2'].bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['2v2v2v2'].bestWinStreak).toEqualTypeOf(); expect(data.bridge['2v2v2v2'].kills).toBeDefined(); expect(data.bridge['2v2v2v2'].kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.bridge['2v2v2v2'].kills).toEqualTypeOf(); @@ -1576,19 +1576,19 @@ test('Duels', () => { expect(data.bridge['2v2v2v2'].healthRegenerated).toBeDefined(); expect(data.bridge['2v2v2v2'].healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.bridge['2v2v2v2'].healthRegenerated).toEqualTypeOf(); - expect(data.bridge['2v2v2v2'].goldenApplesEatan).toBeDefined(); - expect(data.bridge['2v2v2v2'].goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['2v2v2v2'].goldenApplesEatan).toEqualTypeOf(); + expect(data.bridge['2v2v2v2'].goldenApplesEaten).toBeDefined(); + expect(data.bridge['2v2v2v2'].goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['2v2v2v2'].goldenApplesEaten).toEqualTypeOf(); expect(data.bridge['3v3v3v3']).toBeDefined(); expectTypeOf(data.bridge['3v3v3v3']).toEqualTypeOf(); expect(data.bridge['3v3v3v3'].title).toBeDefined(); expectTypeOf(data.bridge['3v3v3v3'].title).toEqualTypeOf(); - expect(data.bridge['3v3v3v3'].winstreak).toBeDefined(); - expect(data.bridge['3v3v3v3'].winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['3v3v3v3'].winstreak).toEqualTypeOf(); - expect(data.bridge['3v3v3v3'].bestWinstreak).toBeDefined(); - expect(data.bridge['3v3v3v3'].bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['3v3v3v3'].bestWinstreak).toEqualTypeOf(); + expect(data.bridge['3v3v3v3'].winStreak).toBeDefined(); + expect(data.bridge['3v3v3v3'].winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['3v3v3v3'].winStreak).toEqualTypeOf(); + expect(data.bridge['3v3v3v3'].bestWinStreak).toBeDefined(); + expect(data.bridge['3v3v3v3'].bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['3v3v3v3'].bestWinStreak).toEqualTypeOf(); expect(data.bridge['3v3v3v3'].kills).toBeDefined(); expect(data.bridge['3v3v3v3'].kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.bridge['3v3v3v3'].kills).toEqualTypeOf(); @@ -1634,19 +1634,19 @@ test('Duels', () => { expect(data.bridge['3v3v3v3'].healthRegenerated).toBeDefined(); expect(data.bridge['3v3v3v3'].healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.bridge['3v3v3v3'].healthRegenerated).toEqualTypeOf(); - expect(data.bridge['3v3v3v3'].goldenApplesEatan).toBeDefined(); - expect(data.bridge['3v3v3v3'].goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['3v3v3v3'].goldenApplesEatan).toEqualTypeOf(); + expect(data.bridge['3v3v3v3'].goldenApplesEaten).toBeDefined(); + expect(data.bridge['3v3v3v3'].goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge['3v3v3v3'].goldenApplesEaten).toEqualTypeOf(); expect(data.bridge.ctf).toBeDefined(); expectTypeOf(data.bridge.ctf).toEqualTypeOf(); expect(data.bridge.ctf.title).toBeDefined(); expectTypeOf(data.bridge.ctf.title).toEqualTypeOf(); - expect(data.bridge.ctf.winstreak).toBeDefined(); - expect(data.bridge.ctf.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.ctf.winstreak).toEqualTypeOf(); - expect(data.bridge.ctf.bestWinstreak).toBeDefined(); - expect(data.bridge.ctf.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.ctf.bestWinstreak).toEqualTypeOf(); + expect(data.bridge.ctf.winStreak).toBeDefined(); + expect(data.bridge.ctf.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.ctf.winStreak).toEqualTypeOf(); + expect(data.bridge.ctf.bestWinStreak).toBeDefined(); + expect(data.bridge.ctf.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.ctf.bestWinStreak).toEqualTypeOf(); expect(data.bridge.ctf.kills).toBeDefined(); expect(data.bridge.ctf.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.bridge.ctf.kills).toEqualTypeOf(); @@ -1692,9 +1692,9 @@ test('Duels', () => { expect(data.bridge.ctf.healthRegenerated).toBeDefined(); expect(data.bridge.ctf.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.bridge.ctf.healthRegenerated).toEqualTypeOf(); - expect(data.bridge.ctf.goldenApplesEatan).toBeDefined(); - expect(data.bridge.ctf.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.ctf.goldenApplesEatan).toEqualTypeOf(); + expect(data.bridge.ctf.goldenApplesEaten).toBeDefined(); + expect(data.bridge.ctf.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.ctf.goldenApplesEaten).toEqualTypeOf(); expect(data.bridge.kills).toBeDefined(); expect(data.bridge.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.bridge.kills).toEqualTypeOf(); @@ -1740,18 +1740,18 @@ test('Duels', () => { expect(data.bridge.healthRegenerated).toBeDefined(); expect(data.bridge.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.bridge.healthRegenerated).toEqualTypeOf(); - expect(data.bridge.goldenApplesEatan).toBeDefined(); - expect(data.bridge.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.goldenApplesEatan).toEqualTypeOf(); + expect(data.bridge.goldenApplesEaten).toBeDefined(); + expect(data.bridge.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge.goldenApplesEaten).toEqualTypeOf(); expect(data.parkour).toBeDefined(); expectTypeOf(data.parkour).toEqualTypeOf(); expectTypeOf(data.parkour.title).toEqualTypeOf(); - expect(data.parkour.winstreak).toBeDefined(); - expect(data.parkour.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.parkour.winstreak).toEqualTypeOf(); - expect(data.parkour.bestWinstreak).toBeDefined(); - expect(data.parkour.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.parkour.bestWinstreak).toEqualTypeOf(); + expect(data.parkour.winStreak).toBeDefined(); + expect(data.parkour.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.parkour.winStreak).toEqualTypeOf(); + expect(data.parkour.bestWinStreak).toBeDefined(); + expect(data.parkour.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.parkour.bestWinStreak).toEqualTypeOf(); expect(data.parkour.kills).toBeDefined(); expect(data.parkour.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.parkour.kills).toEqualTypeOf(); @@ -1797,18 +1797,18 @@ test('Duels', () => { expect(data.parkour.healthRegenerated).toBeDefined(); expect(data.parkour.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.parkour.healthRegenerated).toEqualTypeOf(); - expect(data.parkour.goldenApplesEatan).toBeDefined(); - expect(data.parkour.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.parkour.goldenApplesEatan).toEqualTypeOf(); + expect(data.parkour.goldenApplesEaten).toBeDefined(); + expect(data.parkour.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.parkour.goldenApplesEaten).toEqualTypeOf(); expect(data.arena).toBeDefined(); expectTypeOf(data.arena).toEqualTypeOf(); expectTypeOf(data.arena.title).toEqualTypeOf(); - expect(data.arena.winstreak).toBeDefined(); - expect(data.arena.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arena.winstreak).toEqualTypeOf(); - expect(data.arena.bestWinstreak).toBeDefined(); - expect(data.arena.bestWinstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arena.bestWinstreak).toEqualTypeOf(); + expect(data.arena.winStreak).toBeDefined(); + expect(data.arena.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arena.winStreak).toEqualTypeOf(); + expect(data.arena.bestWinStreak).toBeDefined(); + expect(data.arena.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arena.bestWinStreak).toEqualTypeOf(); expect(data.arena.kills).toBeDefined(); expect(data.arena.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.arena.kills).toEqualTypeOf(); @@ -1854,7 +1854,7 @@ test('Duels', () => { expect(data.arena.healthRegenerated).toBeDefined(); expect(data.arena.healthRegenerated).toBeGreaterThanOrEqual(0); expectTypeOf(data.arena.healthRegenerated).toEqualTypeOf(); - expect(data.arena.goldenApplesEatan).toBeDefined(); - expect(data.arena.goldenApplesEatan).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arena.goldenApplesEatan).toEqualTypeOf(); + expect(data.arena.goldenApplesEaten).toBeDefined(); + expect(data.arena.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arena.goldenApplesEaten).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/Duels/Duels.ts b/src/Structures/MiniGames/Duels/Duels.ts index d53bf1478..7a737c3a2 100644 --- a/src/Structures/MiniGames/Duels/Duels.ts +++ b/src/Structures/MiniGames/Duels/Duels.ts @@ -27,8 +27,8 @@ class Duels { losses: number; WLR: number; playedGames: number; - winstreak: number; - bestWinstreak: number; + winStreak: number; + bestWinStreak: number; ping: number; blocksPlaced: number; swings: number; @@ -38,7 +38,7 @@ class Duels { bowHits: number; bowAccuracy: number; healthRegenerated: number; - goldenApplesEatan: number; + goldenApplesEaten: number; uhc: DuelsUHC; skywars: DuelsSkyWars; megawalls: DuelsMegaWalls; @@ -63,8 +63,8 @@ class Duels { this.losses = data?.losses || 0; this.WLR = Divide(this.wins, this.losses); this.playedGames = data?.games_played_duels || 0; - this.winstreak = data?.current_winstreak || 0; - this.bestWinstreak = data?.best_overall_winstreak || 0; + this.winStreak = data?.current_winstreak || 0; + this.bestWinStreak = data?.best_overall_winstreak || 0; this.ping = data?.pingPreference || 0; this.blocksPlaced = data?.blocks_placed || 0; this.swings = data?.melee_swings || 0; @@ -74,7 +74,7 @@ class Duels { this.bowHits = data?.bow_hits || 0; this.bowAccuracy = Divide(this.bowHits, this.bowShots); this.healthRegenerated = data?.health_regenerated || 0; - this.goldenApplesEatan = data?.golden_apples_eaten || 0; + this.goldenApplesEaten = data?.golden_apples_eaten || 0; this.uhc = new DuelsUHC(data); this.skywars = new DuelsSkyWars(data); this.megawalls = new DuelsMegaWalls(data); diff --git a/src/Structures/MiniGames/Duels/DuelsBridge.ts b/src/Structures/MiniGames/Duels/DuelsBridge.ts index 1883e7c74..d911fd32e 100644 --- a/src/Structures/MiniGames/Duels/DuelsBridge.ts +++ b/src/Structures/MiniGames/Duels/DuelsBridge.ts @@ -4,8 +4,8 @@ import { getTitle } from './Duels.js'; class DuelsBridge { title: string; - winstreak: number; - bestWinstreak: number; + winStreak: number; + bestWinStreak: number; solo: DuelsGamemode; doubles: DuelsGamemode; threes: DuelsGamemode; @@ -28,11 +28,11 @@ class DuelsBridge { bowAccuracy: number; blocksPlaced: number; healthRegenerated: number; - goldenApplesEatan: number; + goldenApplesEaten: number; constructor(data: Record) { this.title = getTitle(data, 'bridge'); - this.winstreak = data?.current_bridge_winstreak || 0; - this.bestWinstreak = data?.best_bridge_winstreak || 0; + this.winStreak = data?.current_bridge_winstreak || 0; + this.bestWinStreak = data?.best_bridge_winstreak || 0; this.solo = new DuelsGamemode(data, 'bridge_duel', this.title); this.doubles = new DuelsGamemode(data, 'bridge_doubles', this.title); this.threes = new DuelsGamemode(data, 'bridge_threes', this.title); @@ -132,14 +132,14 @@ class DuelsBridge { this['2v2v2v2'].healthRegenerated + this['3v3v3v3'].healthRegenerated + this.ctf.healthRegenerated; - this.goldenApplesEatan = - this.solo.goldenApplesEatan + - this.doubles.goldenApplesEatan + - this.threes.goldenApplesEatan + - this.fours.goldenApplesEatan + - this['2v2v2v2'].goldenApplesEatan + - this['3v3v3v3'].goldenApplesEatan + - this.ctf.goldenApplesEatan; + this.goldenApplesEaten = + this.solo.goldenApplesEaten + + this.doubles.goldenApplesEaten + + this.threes.goldenApplesEaten + + this.fours.goldenApplesEaten + + this['2v2v2v2'].goldenApplesEaten + + this['3v3v3v3'].goldenApplesEaten + + this.ctf.goldenApplesEaten; } } diff --git a/src/Structures/MiniGames/Duels/DuelsGamemode.ts b/src/Structures/MiniGames/Duels/DuelsGamemode.ts index 10decafda..3eb797829 100644 --- a/src/Structures/MiniGames/Duels/DuelsGamemode.ts +++ b/src/Structures/MiniGames/Duels/DuelsGamemode.ts @@ -3,8 +3,8 @@ import type { DuelsModes } from '../../../Types/Player.js'; class DuelsGamemode { title: string; - winstreak: number; - bestWinstreak: number; + winStreak: number; + bestWinStreak: number; kills: number; deaths: number; KDR: number; @@ -20,11 +20,11 @@ class DuelsGamemode { bowAccuracy: number; blocksPlaced: number; healthRegenerated: number; - goldenApplesEatan: number; + goldenApplesEaten: number; constructor(data: Record, mode: DuelsModes, title: string = '') { this.title = title; - this.winstreak = data?.[`current_winstreak_mode_${mode}`] || 0; - this.bestWinstreak = data?.[`best_winstreak_mode_${mode}`] || 0; + this.winStreak = data?.[`current_winstreak_mode_${mode}`] || 0; + this.bestWinStreak = data?.[`best_winstreak_mode_${mode}`] || 0; this.kills = data?.[`${mode}_kills`] || 0; this.deaths = data?.[`${mode}_deaths`] || 0; this.KDR = Divide(this.kills, this.deaths); @@ -40,7 +40,7 @@ class DuelsGamemode { this.bowAccuracy = Divide(this.bowShots, this.bowHits); this.blocksPlaced = data?.[`${mode}_blocks_placed`] || 0; this.healthRegenerated = data?.[`${mode}_health_regenerated`] || 0; - this.goldenApplesEatan = data?.[`${mode}_golden_apples_eaten`] || 0; + this.goldenApplesEaten = data?.[`${mode}_golden_apples_eaten`] || 0; } } diff --git a/src/Structures/MiniGames/Duels/DuelsMegaWalls.ts b/src/Structures/MiniGames/Duels/DuelsMegaWalls.ts index 395cfcb88..c05350615 100644 --- a/src/Structures/MiniGames/Duels/DuelsMegaWalls.ts +++ b/src/Structures/MiniGames/Duels/DuelsMegaWalls.ts @@ -4,8 +4,8 @@ import { getTitle } from './Duels.js'; class DuelsMegaWalls { title: string; - winstreak: number; - bestWinstreak: number; + winStreak: number; + bestWinStreak: number; solo: DuelsGamemode; doubles: DuelsGamemode; kills: number; @@ -23,11 +23,11 @@ class DuelsMegaWalls { bowAccuracy: number; blocksPlaced: number; healthRegenerated: number; - goldenApplesEatan: number; + goldenApplesEaten: number; constructor(data: Record) { this.title = getTitle(data, 'mega_walls'); - this.winstreak = data?.current_mega_walls_winstreak || 0; - this.bestWinstreak = data?.best_mega_walls_winstreak || 0; + this.winStreak = data?.current_mega_walls_winstreak || 0; + this.bestWinStreak = data?.best_mega_walls_winstreak || 0; this.solo = new DuelsGamemode(data, 'mw_duel', this.title); this.doubles = new DuelsGamemode(data, 'mw_doubles', this.title); this.kills = this.solo.kills + this.doubles.kills; @@ -45,7 +45,7 @@ class DuelsMegaWalls { this.bowAccuracy = Divide(this.bowHits, this.bowShots); this.blocksPlaced = this.solo.blocksPlaced + this.doubles.blocksPlaced; this.healthRegenerated = this.solo.healthRegenerated + this.doubles.healthRegenerated; - this.goldenApplesEatan = this.solo.goldenApplesEatan + this.doubles.goldenApplesEatan; + this.goldenApplesEaten = this.solo.goldenApplesEaten + this.doubles.goldenApplesEaten; } } diff --git a/src/Structures/MiniGames/Duels/DuelsOP.ts b/src/Structures/MiniGames/Duels/DuelsOP.ts index dcaa8e031..9198c4fde 100644 --- a/src/Structures/MiniGames/Duels/DuelsOP.ts +++ b/src/Structures/MiniGames/Duels/DuelsOP.ts @@ -4,8 +4,8 @@ import { getTitle } from './Duels.js'; class DuelsOP { title: string; - winstreak: number; - bestWinstreak: number; + winStreak: number; + bestWinStreak: number; solo: DuelsGamemode; doubles: DuelsGamemode; kills: number; @@ -23,11 +23,11 @@ class DuelsOP { bowAccuracy: number; blocksPlaced: number; healthRegenerated: number; - goldenApplesEatan: number; + goldenApplesEaten: number; constructor(data: Record) { this.title = getTitle(data, 'op'); - this.winstreak = data?.current_op_winstreak || 0; - this.bestWinstreak = data?.best_op_winstreak || 0; + this.winStreak = data?.current_op_winstreak || 0; + this.bestWinStreak = data?.best_op_winstreak || 0; this.solo = new DuelsGamemode(data, 'op_duel', this.title); this.doubles = new DuelsGamemode(data, 'op_doubles', this.title); this.kills = this.solo.kills + this.doubles.kills; @@ -45,7 +45,7 @@ class DuelsOP { this.bowAccuracy = Divide(this.bowHits, this.bowShots); this.blocksPlaced = this.solo.blocksPlaced + this.doubles.blocksPlaced; this.healthRegenerated = this.solo.healthRegenerated + this.doubles.healthRegenerated; - this.goldenApplesEatan = this.solo.goldenApplesEatan + this.doubles.goldenApplesEatan; + this.goldenApplesEaten = this.solo.goldenApplesEaten + this.doubles.goldenApplesEaten; } } diff --git a/src/Structures/MiniGames/Duels/DuelsSkyWars.ts b/src/Structures/MiniGames/Duels/DuelsSkyWars.ts index 138cb93f9..82bf6be9d 100644 --- a/src/Structures/MiniGames/Duels/DuelsSkyWars.ts +++ b/src/Structures/MiniGames/Duels/DuelsSkyWars.ts @@ -4,8 +4,8 @@ import { getTitle } from './Duels.js'; class DuelsSkyWars { title: string; - winstreak: number; - bestWinstreak: number; + winStreak: number; + bestWinStreak: number; solo: DuelsGamemode; doubles: DuelsGamemode; kills: number; @@ -23,11 +23,11 @@ class DuelsSkyWars { bowAccuracy: number; blocksPlaced: number; healthRegenerated: number; - goldenApplesEatan: number; + goldenApplesEaten: number; constructor(data: Record) { this.title = getTitle(data, 'sw'); - this.winstreak = data?.current_sw_winstreak || 0; - this.bestWinstreak = data?.best_sw_winstreak || 0; + this.winStreak = data?.current_sw_winstreak || 0; + this.bestWinStreak = data?.best_sw_winstreak || 0; this.solo = new DuelsGamemode(data, 'sw_duel', this.title); this.doubles = new DuelsGamemode(data, 'sw_doubles', this.title); this.kills = this.solo.kills + this.doubles.kills; @@ -45,7 +45,7 @@ class DuelsSkyWars { this.bowAccuracy = Divide(this.bowHits, this.bowShots); this.blocksPlaced = this.solo.blocksPlaced + this.doubles.blocksPlaced; this.healthRegenerated = this.solo.healthRegenerated + this.doubles.healthRegenerated; - this.goldenApplesEatan = this.solo.goldenApplesEatan + this.doubles.goldenApplesEatan; + this.goldenApplesEaten = this.solo.goldenApplesEaten + this.doubles.goldenApplesEaten; } } diff --git a/src/Structures/MiniGames/Duels/DuelsUHC.ts b/src/Structures/MiniGames/Duels/DuelsUHC.ts index 6dcd8d32d..133ae2808 100644 --- a/src/Structures/MiniGames/Duels/DuelsUHC.ts +++ b/src/Structures/MiniGames/Duels/DuelsUHC.ts @@ -4,8 +4,8 @@ import { getTitle } from './Duels.js'; class DuelsUHC { title: string; - winstreak: number; - bestWinstreak: number; + winStreak: number; + bestWinStreak: number; solo: DuelsGamemode; doubles: DuelsGamemode; fours: DuelsGamemode; @@ -25,11 +25,11 @@ class DuelsUHC { bowAccuracy: number; blocksPlaced: number; healthRegenerated: number; - goldenApplesEatan: number; + goldenApplesEaten: number; constructor(data: Record) { this.title = getTitle(data, 'uhc'); - this.winstreak = data?.current_uhc_winstreak || 0; - this.bestWinstreak = data?.best_uhc_winstreak || 0; + this.winStreak = data?.current_uhc_winstreak || 0; + this.bestWinStreak = data?.best_uhc_winstreak || 0; this.solo = new DuelsGamemode(data, 'uhc_duel', this.title); this.doubles = new DuelsGamemode(data, 'uhc_doubles', this.title); this.fours = new DuelsGamemode(data, 'uhc_four', this.title); @@ -55,11 +55,11 @@ class DuelsUHC { this.doubles.healthRegenerated + this.fours.healthRegenerated + this.deathmatch.healthRegenerated; - this.goldenApplesEatan = - this.solo.goldenApplesEatan + - this.doubles.goldenApplesEatan + - this.fours.goldenApplesEatan + - this.deathmatch.goldenApplesEatan; + this.goldenApplesEaten = + this.solo.goldenApplesEaten + + this.doubles.goldenApplesEaten + + this.fours.goldenApplesEaten + + this.deathmatch.goldenApplesEaten; } } diff --git a/src/Structures/MiniGames/Paintball.test.ts b/src/Structures/MiniGames/Paintball.test.ts index 45310f5ea..0a67a484f 100644 --- a/src/Structures/MiniGames/Paintball.test.ts +++ b/src/Structures/MiniGames/Paintball.test.ts @@ -24,9 +24,9 @@ test('Paintball', () => { expect(data.shotsFired).toBeDefined(); expect(data.shotsFired).toBeGreaterThanOrEqual(0); expectTypeOf(data.shotsFired).toEqualTypeOf(); - expect(data.killstreaks).toBeDefined(); - expect(data.killstreaks).toBeGreaterThanOrEqual(0); - expectTypeOf(data.killstreaks).toEqualTypeOf(); + expect(data.killStreaks).toBeDefined(); + expect(data.killStreaks).toBeGreaterThanOrEqual(0); + expectTypeOf(data.killStreaks).toEqualTypeOf(); expect(data.forceFieldTime).toBeDefined(); expect(data.forceFieldTime).toBeGreaterThanOrEqual(0); expectTypeOf(data.forceFieldTime).toEqualTypeOf(); diff --git a/src/Structures/MiniGames/Paintball.ts b/src/Structures/MiniGames/Paintball.ts index 3dd651522..fe080ef25 100644 --- a/src/Structures/MiniGames/Paintball.ts +++ b/src/Structures/MiniGames/Paintball.ts @@ -8,7 +8,7 @@ class Paintball { KDR: number; wins: number; shotsFired: number; - killstreaks: number; + killStreaks: number; forceFieldTime: number; hat: PaintballHats | 'None'; adrenaline: number; @@ -24,7 +24,7 @@ class Paintball { this.KDR = Divide(this.kills, this.deaths); this.wins = data?.wins || 0; this.shotsFired = data?.shots_fired || 0; - this.killstreaks = data?.killstreaks || 0; + this.killStreaks = data?.killstreaks || 0; this.forceFieldTime = data?.forcefieldTime || 0; this.hat = data?.hat || 'None'; this.adrenaline = data?.adrenaline || 0; diff --git a/src/Structures/MiniGames/Pit/Pit.test.ts b/src/Structures/MiniGames/Pit/Pit.test.ts index f6b527a36..c75ac93e1 100644 --- a/src/Structures/MiniGames/Pit/Pit.test.ts +++ b/src/Structures/MiniGames/Pit/Pit.test.ts @@ -92,10 +92,10 @@ test('Pit Inventory', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); let data = await client.getPlayer('3457688aa57c4d71ab9d22b04f9160db'); data = data as Player; - expect(data.stats.pit.getInventory).toBeDefined(); - expectTypeOf(data.stats.pit.getInventory).toEqualTypeOf<() => Promise>(); - expect(data.stats.pit.getInventory).toBeInstanceOf(Function); - const pitInventory = await data.stats.pit.getInventory(); + expect(data.stats.Pit.getInventory).toBeDefined(); + expectTypeOf(data.stats.Pit.getInventory).toEqualTypeOf<() => Promise>(); + expect(data.stats.Pit.getInventory).toBeInstanceOf(Function); + const pitInventory = await data.stats.Pit.getInventory(); expect(pitInventory).toBeDefined(); pitInventory.forEach((item: PitInventoryItem) => { expect(item).toBeDefined(); @@ -114,10 +114,10 @@ test('Pit Inventory', async () => { expect(item.extraAttributes).toBeDefined(); expectTypeOf(item.extraAttributes).toEqualTypeOf(); }); - expect(data.stats.pit.getEnterChest).toBeDefined(); - expectTypeOf(data.stats.pit.getEnterChest).toEqualTypeOf<() => Promise>(); - expect(data.stats.pit.getEnterChest).toBeInstanceOf(Function); - const pitEnterChest = await data.stats.pit.getEnterChest(); + expect(data.stats.Pit.getEnterChest).toBeDefined(); + expectTypeOf(data.stats.Pit.getEnterChest).toEqualTypeOf<() => Promise>(); + expect(data.stats.Pit.getEnterChest).toBeInstanceOf(Function); + const pitEnterChest = await data.stats.Pit.getEnterChest(); expect(pitEnterChest).toBeDefined(); pitEnterChest.forEach((item: PitInventoryItem) => { expect(item).toBeDefined(); @@ -136,10 +136,10 @@ test('Pit Inventory', async () => { expect(item.extraAttributes).toBeDefined(); expectTypeOf(item.extraAttributes).toEqualTypeOf(); }); - expect(data.stats.pit.getArmor).toBeDefined(); - expectTypeOf(data.stats.pit.getArmor).toEqualTypeOf<() => Promise>(); - expect(data.stats.pit.getArmor).toBeInstanceOf(Function); - const pitArmor = await data.stats.pit.getArmor(); + expect(data.stats.Pit.getArmor).toBeDefined(); + expectTypeOf(data.stats.Pit.getArmor).toEqualTypeOf<() => Promise>(); + expect(data.stats.Pit.getArmor).toBeInstanceOf(Function); + const pitArmor = await data.stats.Pit.getArmor(); expect(pitArmor).toBeDefined(); expectTypeOf(pitArmor).toEqualTypeOf(); expect(pitArmor.helmet).toBeDefined(); diff --git a/src/Structures/MiniGames/Quakecraft/Quakecraft.test.ts b/src/Structures/MiniGames/Quakecraft/Quakecraft.test.ts index 3d29bf312..7193fe0a8 100644 --- a/src/Structures/MiniGames/Quakecraft/Quakecraft.test.ts +++ b/src/Structures/MiniGames/Quakecraft/Quakecraft.test.ts @@ -35,18 +35,18 @@ test('Quakecraft', () => { expect(data.KDR).toBeDefined(); expect(data.KDR).toBeGreaterThanOrEqual(0); expectTypeOf(data.KDR).toEqualTypeOf(); - expect(data.killstreaks).toBeDefined(); - expect(data.killstreaks).toBeGreaterThanOrEqual(0); - expectTypeOf(data.killstreaks).toEqualTypeOf(); - expect(data.distanceTravelled).toBeDefined(); - expect(data.distanceTravelled).toBeGreaterThanOrEqual(0); - expectTypeOf(data.distanceTravelled).toEqualTypeOf(); + expect(data.killStreaks).toBeDefined(); + expect(data.killStreaks).toBeGreaterThanOrEqual(0); + expectTypeOf(data.killStreaks).toEqualTypeOf(); + expect(data.distanceTraveled).toBeDefined(); + expect(data.distanceTraveled).toBeGreaterThanOrEqual(0); + expectTypeOf(data.distanceTraveled).toEqualTypeOf(); expect(data.shotsFired).toBeDefined(); expect(data.shotsFired).toBeGreaterThanOrEqual(0); expectTypeOf(data.shotsFired).toEqualTypeOf(); - expect(data.headshots).toBeDefined(); - expect(data.headshots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.headshots).toEqualTypeOf(); + expect(data.headShots).toBeDefined(); + expect(data.headShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.headShots).toEqualTypeOf(); expect(data.instantRespawn).toBeDefined(); expectTypeOf(data.instantRespawn).toEqualTypeOf(); expect(data.killPrefixColor).toBeDefined(); diff --git a/src/Structures/MiniGames/Quakecraft/Quakecraft.ts b/src/Structures/MiniGames/Quakecraft/Quakecraft.ts index 138a1c3af..3b129ae81 100644 --- a/src/Structures/MiniGames/Quakecraft/Quakecraft.ts +++ b/src/Structures/MiniGames/Quakecraft/Quakecraft.ts @@ -18,10 +18,10 @@ class Quakecraft { kills: number; deaths: number; KDR: number; - killstreaks: number; - distanceTravelled: number; + killStreaks: number; + distanceTraveled: number; shotsFired: number; - headshots: number; + headShots: number; instantRespawn: boolean; killPrefixColor: ColorCode; showPrefix: boolean; @@ -39,10 +39,10 @@ class Quakecraft { this.kills = this.solo?.kills + this.teams?.kills; this.deaths = this.solo?.deaths + this.teams?.deaths; this.KDR = Divide(this.kills, this.deaths); - this.killstreaks = this.solo?.killstreaks + this.teams?.killstreaks; - this.distanceTravelled = this.solo?.distanceTravelled + this.teams?.distanceTravelled; + this.killStreaks = this.solo?.killStreaks + this.teams?.killStreaks; + this.distanceTraveled = this.solo?.distanceTraveled + this.teams?.distanceTraveled; this.shotsFired = this.solo?.shotsFired + this.teams?.shotsFired; - this.headshots = this.solo?.headshots + this.teams?.headshots; + this.headShots = this.solo?.headShots + this.teams?.headShots; this.instantRespawn = data?.instantRespawn || false; this.killPrefixColor = data?.selectedKillPrefix || ''; this.showPrefix = data?.showKillPrefix || false; diff --git a/src/Structures/MiniGames/Quakecraft/QuakecraftMode.test.ts b/src/Structures/MiniGames/Quakecraft/QuakecraftMode.test.ts index c9a0f1eef..a5b8ba4b6 100644 --- a/src/Structures/MiniGames/Quakecraft/QuakecraftMode.test.ts +++ b/src/Structures/MiniGames/Quakecraft/QuakecraftMode.test.ts @@ -18,16 +18,16 @@ test('QuakecraftMode', () => { expect(data.KDR).toBeDefined(); expect(data.KDR).toBeGreaterThanOrEqual(0); expectTypeOf(data.KDR).toEqualTypeOf(); - expect(data.killstreaks).toBeDefined(); - expect(data.killstreaks).toBeGreaterThanOrEqual(0); - expectTypeOf(data.killstreaks).toEqualTypeOf(); - expect(data.distanceTravelled).toBeDefined(); - expect(data.distanceTravelled).toBeGreaterThanOrEqual(0); - expectTypeOf(data.distanceTravelled).toEqualTypeOf(); + expect(data.killStreaks).toBeDefined(); + expect(data.killStreaks).toBeGreaterThanOrEqual(0); + expectTypeOf(data.killStreaks).toEqualTypeOf(); + expect(data.distanceTraveled).toBeDefined(); + expect(data.distanceTraveled).toBeGreaterThanOrEqual(0); + expectTypeOf(data.distanceTraveled).toEqualTypeOf(); expect(data.shotsFired).toBeDefined(); expect(data.shotsFired).toBeGreaterThanOrEqual(0); expectTypeOf(data.shotsFired).toEqualTypeOf(); - expect(data.headshots).toBeDefined(); - expect(data.headshots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.headshots).toEqualTypeOf(); + expect(data.headShots).toBeDefined(); + expect(data.headShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.headShots).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/Quakecraft/QuakecraftMode.ts b/src/Structures/MiniGames/Quakecraft/QuakecraftMode.ts index d38cb42e3..05af248e1 100644 --- a/src/Structures/MiniGames/Quakecraft/QuakecraftMode.ts +++ b/src/Structures/MiniGames/Quakecraft/QuakecraftMode.ts @@ -5,20 +5,20 @@ class QuakecraftMode { kills: number; deaths: number; KDR: number; - killstreaks: number; - distanceTravelled: number; + killStreaks: number; + distanceTraveled: number; shotsFired: number; - headshots: number; + headShots: number; constructor(data: Record, gamemode?: 'teams') { const mode = gamemode ? `_${gamemode}` : ''; this.wins = data?.[`wins${mode}`] || 0; this.kills = data?.[`kills${mode}`] || 0; this.deaths = data?.[`deaths${mode}`] || 0; this.KDR = Divide(this.kills, this.deaths); - this.killstreaks = data?.[`killstreaks${mode}`] || 0; - this.distanceTravelled = data?.[`distance_travelled${mode}`] || 0; + this.killStreaks = data?.[`killstreaks${mode}`] || 0; + this.distanceTraveled = data?.[`distance_travelled${mode}`] || 0; this.shotsFired = data?.[`shots_fired${mode}`] || 0; - this.headshots = data?.[`headshots${mode}`] || 0; + this.headShots = data?.[`headshots${mode}`] || 0; } } diff --git a/src/Structures/MiniGames/SkyWars/SkyWars.ts b/src/Structures/MiniGames/SkyWars/SkyWars.ts index de41bc06d..eaf05230e 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWars.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWars.ts @@ -38,14 +38,14 @@ function getSkyWarsLevelProgress(xp: number) { const percentRemaining = Math.round((100 - percent) * 100) / 100; return { currentLevelXp, xpToNextLevel, percent, xpNextLevel: 10000, percentRemaining }; } - const totalXptoNextLevel = (xpToNextLvl?.[totalXp.findIndex((x) => 0 < x * 10 - xp)] || 0) * 10; + const totalXpToNextLevel = (xpToNextLvl?.[totalXp.findIndex((x) => 0 < x * 10 - xp)] || 0) * 10; for (let i = 0; i < xpToNextLvl.length; i++) { if (0 > currentLevelXp - (xpToNextLvl?.[i] || 0) * 10) break; currentLevelXp -= (xpToNextLvl?.[i] || 0) * 10; } - xpToNextLevel = totalXptoNextLevel - currentLevelXp; - percent = Math.round((currentLevelXp / totalXptoNextLevel) * 10000) / 100; - return { currentLevelXp, xpToNextLevel, percent, xpNextLevel: totalXptoNextLevel }; + xpToNextLevel = totalXpToNextLevel - currentLevelXp; + percent = Math.round((currentLevelXp / totalXpToNextLevel) * 10000) / 100; + return { currentLevelXp, xpToNextLevel, percent, xpNextLevel: totalXpToNextLevel }; } class SkyWars { @@ -62,7 +62,7 @@ class SkyWars { tenacity: number; shards: number; angelOfDeathLevel: number; - killstreak: number; + killStreak: number; kills: number; voidKills: number; meleeKills: number; @@ -114,7 +114,7 @@ class SkyWars { this.tenacity = data?.tenacity || 0; this.shards = data?.shard || 0; this.angelOfDeathLevel = data?.angel_of_death_level || 0; - this.killstreak = data?.killstreak || 0; + this.killStreak = data?.killstreak || 0; this.kills = data?.kills || 0; this.voidKills = data?.void_kills || 0; this.meleeKills = data?.melee_kills || 0; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsModeStats.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsModeStats.test.ts index 31833bc11..3b5024fab 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsModeStats.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsModeStats.test.ts @@ -10,9 +10,9 @@ test('SkyWars (Mode Stats)', () => { expectTypeOf(data).toEqualTypeOf(); expect(data.activeKit).toBeDefined(); expectTypeOf(data.activeKit).toEqualTypeOf(); - expect(data.killstreak).toBeDefined(); - expect(data.killstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.killstreak).toEqualTypeOf(); + expect(data.killStreak).toBeDefined(); + expect(data.killStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.killStreak).toEqualTypeOf(); expect(data.kills).toBeDefined(); expect(data.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.kills).toEqualTypeOf(); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsModeStats.ts b/src/Structures/MiniGames/SkyWars/SkyWarsModeStats.ts index beb42bc6b..dfa737cfa 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsModeStats.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsModeStats.ts @@ -4,7 +4,7 @@ import type { SkyWarsBaseModes, SkyWarsKitNames } from '../../../Types/Player.js class SkyWarsModeStats { activeKit: SkyWarsKitNames; - killstreak: number; + killStreak: number; kills: number; voidKills: number; meleeKills: number; @@ -31,7 +31,7 @@ class SkyWarsModeStats { insane: SkyWarsMode; constructor(data: Record, gamemode: SkyWarsBaseModes) { this.activeKit = data?.[`activeKit_${gamemode?.toUpperCase()}`] || ''; - this.killstreak = data?.[`killstreak_${gamemode}`] || 0; + this.killStreak = data?.[`killstreak_${gamemode}`] || 0; this.kills = data?.[`kills_${gamemode}`] || 0; this.voidKills = data?.[`void_kills_${gamemode}`] || 0; this.meleeKills = data?.[`melee_kills_${gamemode}`] || 0; diff --git a/src/Structures/MiniGames/SkyWars/Skywars.test.ts b/src/Structures/MiniGames/SkyWars/Skywars.test.ts index 2d9bdf0d5..4b59d5502 100644 --- a/src/Structures/MiniGames/SkyWars/Skywars.test.ts +++ b/src/Structures/MiniGames/SkyWars/Skywars.test.ts @@ -46,9 +46,9 @@ test('SkyWars', () => { expect(data.angelOfDeathLevel).toBeDefined(); expect(data.angelOfDeathLevel).toBeGreaterThanOrEqual(0); expectTypeOf(data.angelOfDeathLevel).toEqualTypeOf(); - expect(data.killstreak).toBeDefined(); - expect(data.killstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.killstreak).toEqualTypeOf(); + expect(data.killStreak).toBeDefined(); + expect(data.killStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.killStreak).toEqualTypeOf(); expect(data.kills).toBeDefined(); expect(data.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.kills).toEqualTypeOf(); diff --git a/src/Structures/MiniGames/SmashHeroes/SmashHeroes.test.ts b/src/Structures/MiniGames/SmashHeroes/SmashHeroes.test.ts index 64cd57718..650772d0d 100644 --- a/src/Structures/MiniGames/SmashHeroes/SmashHeroes.test.ts +++ b/src/Structures/MiniGames/SmashHeroes/SmashHeroes.test.ts @@ -15,9 +15,9 @@ test('SmashHeroes', () => { expect(data.level).toBeDefined(); expect(data.level).toBeGreaterThanOrEqual(0); expectTypeOf(data.level).toEqualTypeOf(); - expect(data.winstreak).toBeDefined(); - expect(data.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winstreak).toEqualTypeOf(); + expect(data.winStreak).toBeDefined(); + expect(data.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winStreak).toEqualTypeOf(); expect(data.playedGames).toBeDefined(); expect(data.playedGames).toBeGreaterThanOrEqual(0); expectTypeOf(data.playedGames).toEqualTypeOf(); diff --git a/src/Structures/MiniGames/SmashHeroes/SmashHeroes.ts b/src/Structures/MiniGames/SmashHeroes/SmashHeroes.ts index 9e5852896..4e46206e0 100644 --- a/src/Structures/MiniGames/SmashHeroes/SmashHeroes.ts +++ b/src/Structures/MiniGames/SmashHeroes/SmashHeroes.ts @@ -6,7 +6,7 @@ import type { SmashHeoresHeros } from '../../../Types/Player.js'; class SmashHeroes { coins: number; level: number; - winstreak: number; + winStreak: number; playedGames: number; kills: number; deaths: number; @@ -38,7 +38,7 @@ class SmashHeroes { constructor(data: Record) { this.coins = data?.coins || data?.tokens || 0; this.level = data?.smash_level_total || 0; - this.winstreak = data?.win_streak || 0; + this.winStreak = data?.win_streak || 0; this.playedGames = data?.games || 0; this.kills = data?.kills || 0; this.deaths = data?.deaths || 0; diff --git a/src/Structures/MiniGames/SpeedUHC/SpeedUHC.test.ts b/src/Structures/MiniGames/SpeedUHC/SpeedUHC.test.ts index fac408516..2384df0c3 100644 --- a/src/Structures/MiniGames/SpeedUHC/SpeedUHC.test.ts +++ b/src/Structures/MiniGames/SpeedUHC/SpeedUHC.test.ts @@ -31,12 +31,12 @@ test('SpeedUHC', () => { expect(data.playedGames).toBeDefined(); expect(data.playedGames).toBeGreaterThanOrEqual(0); expectTypeOf(data.playedGames).toEqualTypeOf(); - expect(data.winstreak).toBeDefined(); - expect(data.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winstreak).toEqualTypeOf(); - expect(data.killstreak).toBeDefined(); - expect(data.killstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.killstreak).toEqualTypeOf(); + expect(data.winStreak).toBeDefined(); + expect(data.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winStreak).toEqualTypeOf(); + expect(data.killStreak).toBeDefined(); + expect(data.killStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.killStreak).toEqualTypeOf(); expect(data.blocksBroken).toBeDefined(); expect(data.blocksBroken).toBeGreaterThanOrEqual(0); expectTypeOf(data.blocksBroken).toEqualTypeOf(); diff --git a/src/Structures/MiniGames/SpeedUHC/SpeedUHC.ts b/src/Structures/MiniGames/SpeedUHC/SpeedUHC.ts index dcc5ede1e..7c799c36d 100644 --- a/src/Structures/MiniGames/SpeedUHC/SpeedUHC.ts +++ b/src/Structures/MiniGames/SpeedUHC/SpeedUHC.ts @@ -10,8 +10,8 @@ class SpeedUHC { losses: number; WLR: number; playedGames: number; - winstreak: number; - killstreak: number; + winStreak: number; + killStreak: number; blocksBroken: number; blocksPlaced: number; quits: number; @@ -32,8 +32,8 @@ class SpeedUHC { this.losses = data?.losses || 0; this.WLR = Divide(this.wins, this.losses); this.playedGames = data?.games || 0; - this.winstreak = data?.win_streak || 0; - this.killstreak = data?.killstreak || 0; + this.winStreak = data?.win_streak || 0; + this.killStreak = data?.killstreak || 0; this.blocksBroken = data?.blocks_broken || 0; this.blocksPlaced = data?.blocks_placed || 0; this.quits = data?.quits || 0; diff --git a/src/Structures/MiniGames/SpeedUHC/SpeedUHCMode.test.ts b/src/Structures/MiniGames/SpeedUHC/SpeedUHCMode.test.ts index a3da313f5..2ff16fde1 100644 --- a/src/Structures/MiniGames/SpeedUHC/SpeedUHCMode.test.ts +++ b/src/Structures/MiniGames/SpeedUHC/SpeedUHCMode.test.ts @@ -27,9 +27,9 @@ test('SpeedUHC', () => { expect(data.playedGames).toBeDefined(); expect(data.playedGames).toBeGreaterThanOrEqual(0); expectTypeOf(data.playedGames).toEqualTypeOf(); - expect(data.winstreak).toBeDefined(); - expect(data.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winstreak).toEqualTypeOf(); + expect(data.winStreak).toBeDefined(); + expect(data.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winStreak).toEqualTypeOf(); expect(data.killStreak).toBeDefined(); expect(data.killStreak).toBeGreaterThanOrEqual(0); expectTypeOf(data.killStreak).toEqualTypeOf(); diff --git a/src/Structures/MiniGames/SpeedUHC/SpeedUHCMode.ts b/src/Structures/MiniGames/SpeedUHC/SpeedUHCMode.ts index e9cefab56..ecee7f606 100644 --- a/src/Structures/MiniGames/SpeedUHC/SpeedUHCMode.ts +++ b/src/Structures/MiniGames/SpeedUHC/SpeedUHCMode.ts @@ -9,7 +9,7 @@ class SpeedUHCMode { losses: number; WLR: number; playedGames: number; - winstreak: number; + winStreak: number; killStreak: number; assists: number; constructor(data: Record, mode: SpeedUHCModes) { @@ -20,7 +20,7 @@ class SpeedUHCMode { this.losses = data?.[`losses_${mode}`] || 0; this.WLR = Divide(this.wins, this.losses); this.playedGames = data?.[`games_${mode}`] || 0; - this.winstreak = data?.[`win_streak_${mode}`] || 0; + this.winStreak = data?.[`win_streak_${mode}`] || 0; this.killStreak = data?.[`killstreak_${mode}`] || 0; this.assists = data?.[`assists_${mode}`] || 0; } diff --git a/src/Structures/MiniGames/TNTGames/TNTGames.test.ts b/src/Structures/MiniGames/TNTGames/TNTGames.test.ts index 5c9e2e229..b77b4ab09 100644 --- a/src/Structures/MiniGames/TNTGames/TNTGames.test.ts +++ b/src/Structures/MiniGames/TNTGames/TNTGames.test.ts @@ -14,9 +14,9 @@ test('TNTGames', () => { expect(data.coins).toBeDefined(); expect(data.coins).toBeGreaterThanOrEqual(0); expectTypeOf(data.coins).toEqualTypeOf(); - expect(data.winstreak).toBeDefined(); - expect(data.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winstreak).toEqualTypeOf(); + expect(data.winStreak).toBeDefined(); + expect(data.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winStreak).toEqualTypeOf(); expect(data.wins).toBeDefined(); expect(data.wins).toBeGreaterThanOrEqual(0); expectTypeOf(data.wins).toEqualTypeOf(); diff --git a/src/Structures/MiniGames/TNTGames/TNTGames.ts b/src/Structures/MiniGames/TNTGames/TNTGames.ts index babfdb699..610798274 100644 --- a/src/Structures/MiniGames/TNTGames/TNTGames.ts +++ b/src/Structures/MiniGames/TNTGames/TNTGames.ts @@ -6,7 +6,7 @@ import TNTWizards from './TNTWizards.js'; class TNTGames { coins: number; - winstreak: number; + winStreak: number; wins: number; tntrun: TNTRun; pvpRun: PVPRun; @@ -15,7 +15,7 @@ class TNTGames { wizards: TNTWizards; constructor(data: Record) { this.coins = data?.coins || data?.tokens || 0; - this.winstreak = data?.winstreak || 0; + this.winStreak = data?.winstreak || 0; this.wins = data?.wins || 0; this.tntrun = new TNTRun(data); this.pvpRun = new PVPRun(data); diff --git a/src/Structures/MiniGames/Warlords/Warlords.test.ts b/src/Structures/MiniGames/Warlords/Warlords.test.ts index 07bcfd7b4..638f03c3a 100644 --- a/src/Structures/MiniGames/Warlords/Warlords.test.ts +++ b/src/Structures/MiniGames/Warlords/Warlords.test.ts @@ -29,9 +29,9 @@ test('Warlords', () => { expect(data.WLR).toBeDefined(); expect(data.WLR).toBeGreaterThanOrEqual(0); expectTypeOf(data.WLR).toEqualTypeOf(); - expect(data.winstreak).toBeDefined(); - expect(data.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winstreak).toEqualTypeOf(); + expect(data.winStreak).toBeDefined(); + expect(data.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winStreak).toEqualTypeOf(); expect(data.assists).toBeDefined(); expect(data.assists).toBeGreaterThanOrEqual(0); expectTypeOf(data.assists).toEqualTypeOf(); diff --git a/src/Structures/MiniGames/Warlords/Warlords.ts b/src/Structures/MiniGames/Warlords/Warlords.ts index 49bb4b4f0..fee24672e 100644 --- a/src/Structures/MiniGames/Warlords/Warlords.ts +++ b/src/Structures/MiniGames/Warlords/Warlords.ts @@ -10,7 +10,7 @@ class Warlords { wins: number; losses: number; WLR: number; - winstreak: number; + winStreak: number; assists: number; class: WarlordsClasses | 'None'; pyromancer: WarlordsClass; @@ -37,7 +37,7 @@ class Warlords { this.wins = data?.wins || 0; this.losses = data?.losses || 0; this.WLR = Divide(this.wins, this.losses); - this.winstreak = data?.win_streak || 0; + this.winStreak = data?.win_streak || 0; this.assists = data?.assists || 0; this.class = data?.chosen_class || 'None'; this.pyromancer = new WarlordsClass(data, 'pyromancer'); diff --git a/src/Structures/MiniGames/WoolGames/WoolWars.test.ts b/src/Structures/MiniGames/WoolGames/WoolWars.test.ts index 5bea6f5d0..23cc10672 100644 --- a/src/Structures/MiniGames/WoolGames/WoolWars.test.ts +++ b/src/Structures/MiniGames/WoolGames/WoolWars.test.ts @@ -37,9 +37,9 @@ test('WoolWars', () => { expect(data.placeBreakRatio).toBeDefined(); expect(data.placeBreakRatio).toBeGreaterThanOrEqual(0); expectTypeOf(data.placeBreakRatio).toEqualTypeOf(); - expect(data.powerups).toBeDefined(); - expect(data.powerups).toBeGreaterThanOrEqual(0); - expectTypeOf(data.powerups).toEqualTypeOf(); + expect(data.powerUps).toBeDefined(); + expect(data.powerUps).toBeGreaterThanOrEqual(0); + expectTypeOf(data.powerUps).toEqualTypeOf(); expect(data.assault).toBeDefined(); expectTypeOf(data.assault).toEqualTypeOf(); expect(data.tank).toBeDefined(); diff --git a/src/Structures/MiniGames/WoolGames/WoolWars.ts b/src/Structures/MiniGames/WoolGames/WoolWars.ts index f28f051fa..c2a71a4eb 100644 --- a/src/Structures/MiniGames/WoolGames/WoolWars.ts +++ b/src/Structures/MiniGames/WoolGames/WoolWars.ts @@ -13,7 +13,7 @@ class WoolWars { woolsPlaced: number; blocksBroken: number; placeBreakRatio: number; - powerups: number; + powerUps: number; assault: WoolWarsClass; tank: WoolWarsClass; golem: WoolWarsClass; @@ -31,7 +31,7 @@ class WoolWars { this.woolsPlaced = data?.stats?.wool_placed || 0; this.blocksBroken = data?.stats?.blocks_broken || 0; this.placeBreakRatio = Divide(this.woolsPlaced, this.blocksBroken); - this.powerups = data?.powerups_gotten || 0; + this.powerUps = data?.powerups_gotten || 0; this.assault = new WoolWarsClass(data?.stats?.classes, 'ASSAULT'); this.tank = new WoolWarsClass(data?.stats?.classes, 'TANK'); this.golem = new WoolWarsClass(data?.stats?.classes, 'GOLEM'); diff --git a/src/Structures/MiniGames/WoolGames/WoolWarsClass.test.ts b/src/Structures/MiniGames/WoolGames/WoolWarsClass.test.ts index adac71094..dcc0a6b6b 100644 --- a/src/Structures/MiniGames/WoolGames/WoolWarsClass.test.ts +++ b/src/Structures/MiniGames/WoolGames/WoolWarsClass.test.ts @@ -33,7 +33,7 @@ test('WoolWarsClass', () => { expect(data.placeBreakRatio).toBeDefined(); expect(data.placeBreakRatio).toBeGreaterThanOrEqual(0); expectTypeOf(data.placeBreakRatio).toEqualTypeOf(); - expect(data.powerups).toBeDefined(); - expect(data.powerups).toBeGreaterThanOrEqual(0); - expectTypeOf(data.powerups).toEqualTypeOf(); + expect(data.powerUps).toBeDefined(); + expect(data.powerUps).toBeGreaterThanOrEqual(0); + expectTypeOf(data.powerUps).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/WoolGames/WoolWarsClass.ts b/src/Structures/MiniGames/WoolGames/WoolWarsClass.ts index d9b67f172..5742fb213 100644 --- a/src/Structures/MiniGames/WoolGames/WoolWarsClass.ts +++ b/src/Structures/MiniGames/WoolGames/WoolWarsClass.ts @@ -11,7 +11,7 @@ class WoolWarsClass { woolsPlaced: number; blocksBroken: number; placeBreakRatio: number; - powerups: number; + powerUps: number; constructor(data: Record, classInput: WoolWarsClassNames) { const className = classInput.toLowerCase(); this.wins = data?.[className]?.wins || 0; @@ -23,7 +23,7 @@ class WoolWarsClass { this.woolsPlaced = data?.[className]?.wool_placed || 0; this.blocksBroken = data?.[className]?.blocks_broken || 0; this.placeBreakRatio = Divide(this.woolsPlaced, this.blocksBroken); - this.powerups = data?.[className]?.powerups_gotten || 0; + this.powerUps = data?.[className]?.powerups_gotten || 0; } } diff --git a/src/Structures/Player/Cosmetics.test.ts b/src/Structures/Player/Cosmetics.test.ts index 0353fc8b8..ffb3170f8 100644 --- a/src/Structures/Player/Cosmetics.test.ts +++ b/src/Structures/Player/Cosmetics.test.ts @@ -30,6 +30,6 @@ test('Cosmetics', () => { expectTypeOf(data.rankColors).toEqualTypeOf(); expect(data.particlePacks).toBeDefined(); expectTypeOf(data.particlePacks).toEqualTypeOf(); - expect(data.clickfx).toBeDefined(); - expectTypeOf(data.clickfx).toEqualTypeOf(); + expect(data.clickEffects).toBeDefined(); + expectTypeOf(data.clickEffects).toEqualTypeOf(); }); diff --git a/src/Structures/Player/Cosmetics.ts b/src/Structures/Player/Cosmetics.ts index 894e6ac15..d647ba8a1 100644 --- a/src/Structures/Player/Cosmetics.ts +++ b/src/Structures/Player/Cosmetics.ts @@ -13,7 +13,7 @@ class Cosmetics { taunts: string[]; rankColors: string[]; particlePacks: string[]; - clickfx: string[]; + clickEffects: string[]; constructor(data: Record) { this.cosmetics = data?.vanityMeta?.packages || []; this.currentGadget = data?.currentGadget || null; @@ -47,7 +47,7 @@ class Cosmetics { this.cosmetics .filter((x) => x.startsWith('particlepack_')) .map((x) => RemoveSnakeCaseString(x.replace('particlepack_', ''))) || []; - this.clickfx = + this.clickEffects = this.cosmetics .filter((x) => x.startsWith('clickeffects_')) .map((x) => RemoveSnakeCaseString(x.replace('clickeffects_', ''))) || []; diff --git a/src/Structures/Player/Player.test.ts b/src/Structures/Player/Player.test.ts index 25ac69db1..4fe7ac361 100644 --- a/src/Structures/Player/Player.test.ts +++ b/src/Structures/Player/Player.test.ts @@ -115,70 +115,70 @@ test('Player', () => { expectTypeOf(data.recentGames).toEqualTypeOf(); expect(data.stats).toBeDefined(); expectTypeOf(data.stats).toEqualTypeOf(); - expect(data.stats.arcade).toBeDefined(); - expect(data.stats.arcade).toBeInstanceOf(Arcade); - expectTypeOf(data.stats.arcade).toEqualTypeOf(); - expect(data.stats.arenaBrawl).toBeDefined(); - expect(data.stats.arenaBrawl).toBeInstanceOf(ArenaBrawl); - expectTypeOf(data.stats.arenaBrawl).toEqualTypeOf(); - expect(data.stats.bedwars).toBeDefined(); - expect(data.stats.bedwars).toBeInstanceOf(BedWars); - expectTypeOf(data.stats.bedwars).toEqualTypeOf(); - expect(data.stats.blitzsg).toBeDefined(); - expect(data.stats.blitzsg).toBeInstanceOf(BlitzSurvivalGames); - expectTypeOf(data.stats.blitzsg).toEqualTypeOf(); - expect(data.stats.buildbattle).toBeDefined(); - expect(data.stats.buildbattle).toBeInstanceOf(BuildBattle); - expectTypeOf(data.stats.buildbattle).toEqualTypeOf(); - expect(data.stats.copsandcrims).toBeDefined(); - expect(data.stats.copsandcrims).toBeInstanceOf(CopsAndCrims); - expectTypeOf(data.stats.copsandcrims).toEqualTypeOf(); - expect(data.stats.duels).toBeDefined(); - expect(data.stats.duels).toBeInstanceOf(Duels); - expectTypeOf(data.stats.duels).toEqualTypeOf(); - expect(data.stats.megawalls).toBeDefined(); - expect(data.stats.megawalls).toBeInstanceOf(MegaWalls); - expectTypeOf(data.stats.megawalls).toEqualTypeOf(); - expect(data.stats.murdermystery).toBeDefined(); - expect(data.stats.murdermystery).toBeInstanceOf(MurderMystery); - expectTypeOf(data.stats.murdermystery).toEqualTypeOf(); - expect(data.stats.paintball).toBeDefined(); - expect(data.stats.paintball).toBeInstanceOf(Paintball); - expectTypeOf(data.stats.paintball).toEqualTypeOf(); - expect(data.stats.pit).toBeDefined(); - expect(data.stats.pit).toBeInstanceOf(Pit); - expectTypeOf(data.stats.pit).toEqualTypeOf(); - expect(data.stats.quakecraft).toBeDefined(); - expect(data.stats.quakecraft).toBeInstanceOf(Quakecraft); - expectTypeOf(data.stats.quakecraft).toEqualTypeOf(); - expect(data.stats.skywars).toBeDefined(); - expect(data.stats.skywars).toBeInstanceOf(SkyWars); - expectTypeOf(data.stats.skywars).toEqualTypeOf(); - expect(data.stats.smashheroes).toBeDefined(); - expect(data.stats.smashheroes).toBeInstanceOf(SmashHeroes); - expectTypeOf(data.stats.smashheroes).toEqualTypeOf(); - expect(data.stats.speeduhc).toBeDefined(); - expect(data.stats.speeduhc).toBeInstanceOf(SpeedUHC); - expectTypeOf(data.stats.speeduhc).toEqualTypeOf(); - expect(data.stats.tntgames).toBeDefined(); - expect(data.stats.tntgames).toBeInstanceOf(TNTGames); - expectTypeOf(data.stats.tntgames).toEqualTypeOf(); - expect(data.stats.turbokartracers).toBeDefined(); - expect(data.stats.turbokartracers).toBeInstanceOf(TurboKartRacers); - expectTypeOf(data.stats.turbokartracers).toEqualTypeOf(); - expect(data.stats.uhc).toBeDefined(); - expect(data.stats.uhc).toBeInstanceOf(UHC); - expectTypeOf(data.stats.uhc).toEqualTypeOf(); - expect(data.stats.vampirez).toBeDefined(); - expect(data.stats.vampirez).toBeInstanceOf(VampireZ); - expectTypeOf(data.stats.vampirez).toEqualTypeOf(); - expect(data.stats.walls).toBeDefined(); - expect(data.stats.walls).toBeInstanceOf(Walls); - expectTypeOf(data.stats.walls).toEqualTypeOf(); - expect(data.stats.warlords).toBeDefined(); - expect(data.stats.warlords).toBeInstanceOf(Warlords); - expectTypeOf(data.stats.warlords).toEqualTypeOf(); - expect(data.stats.woolgames).toBeDefined(); - expect(data.stats.woolgames).toBeInstanceOf(WoolGames); - expectTypeOf(data.stats.woolgames).toEqualTypeOf(); + expect(data.stats.Arcade).toBeDefined(); + expect(data.stats.Arcade).toBeInstanceOf(Arcade); + expectTypeOf(data.stats.Arcade).toEqualTypeOf(); + expect(data.stats.ArenaBrawl).toBeDefined(); + expect(data.stats.ArenaBrawl).toBeInstanceOf(ArenaBrawl); + expectTypeOf(data.stats.ArenaBrawl).toEqualTypeOf(); + expect(data.stats.BedWars).toBeDefined(); + expect(data.stats.BedWars).toBeInstanceOf(BedWars); + expectTypeOf(data.stats.BedWars).toEqualTypeOf(); + expect(data.stats.BlitzSurvivalGames).toBeDefined(); + expect(data.stats.BlitzSurvivalGames).toBeInstanceOf(BlitzSurvivalGames); + expectTypeOf(data.stats.BlitzSurvivalGames).toEqualTypeOf(); + expect(data.stats.BuildBattle).toBeDefined(); + expect(data.stats.BuildBattle).toBeInstanceOf(BuildBattle); + expectTypeOf(data.stats.BuildBattle).toEqualTypeOf(); + expect(data.stats.CopsAndCrims).toBeDefined(); + expect(data.stats.CopsAndCrims).toBeInstanceOf(CopsAndCrims); + expectTypeOf(data.stats.CopsAndCrims).toEqualTypeOf(); + expect(data.stats.Duels).toBeDefined(); + expect(data.stats.Duels).toBeInstanceOf(Duels); + expectTypeOf(data.stats.Duels).toEqualTypeOf(); + expect(data.stats.MegaWalls).toBeDefined(); + expect(data.stats.MegaWalls).toBeInstanceOf(MegaWalls); + expectTypeOf(data.stats.MegaWalls).toEqualTypeOf(); + expect(data.stats.MurderMystery).toBeDefined(); + expect(data.stats.MurderMystery).toBeInstanceOf(MurderMystery); + expectTypeOf(data.stats.MurderMystery).toEqualTypeOf(); + expect(data.stats.Paintball).toBeDefined(); + expect(data.stats.Paintball).toBeInstanceOf(Paintball); + expectTypeOf(data.stats.Paintball).toEqualTypeOf(); + expect(data.stats.Pit).toBeDefined(); + expect(data.stats.Pit).toBeInstanceOf(Pit); + expectTypeOf(data.stats.Pit).toEqualTypeOf(); + expect(data.stats.QuakeCraft).toBeDefined(); + expect(data.stats.QuakeCraft).toBeInstanceOf(Quakecraft); + expectTypeOf(data.stats.QuakeCraft).toEqualTypeOf(); + expect(data.stats.SkyWars).toBeDefined(); + expect(data.stats.SkyWars).toBeInstanceOf(SkyWars); + expectTypeOf(data.stats.SkyWars).toEqualTypeOf(); + expect(data.stats.SmashHeroes).toBeDefined(); + expect(data.stats.SmashHeroes).toBeInstanceOf(SmashHeroes); + expectTypeOf(data.stats.SmashHeroes).toEqualTypeOf(); + expect(data.stats.SpeedUHC).toBeDefined(); + expect(data.stats.SpeedUHC).toBeInstanceOf(SpeedUHC); + expectTypeOf(data.stats.SpeedUHC).toEqualTypeOf(); + expect(data.stats.TNTGames).toBeDefined(); + expect(data.stats.TNTGames).toBeInstanceOf(TNTGames); + expectTypeOf(data.stats.TNTGames).toEqualTypeOf(); + expect(data.stats.TurboKartRacers).toBeDefined(); + expect(data.stats.TurboKartRacers).toBeInstanceOf(TurboKartRacers); + expectTypeOf(data.stats.TurboKartRacers).toEqualTypeOf(); + expect(data.stats.UHC).toBeDefined(); + expect(data.stats.UHC).toBeInstanceOf(UHC); + expectTypeOf(data.stats.UHC).toEqualTypeOf(); + expect(data.stats.VampireZ).toBeDefined(); + expect(data.stats.VampireZ).toBeInstanceOf(VampireZ); + expectTypeOf(data.stats.VampireZ).toEqualTypeOf(); + expect(data.stats.Walls).toBeDefined(); + expect(data.stats.Walls).toBeInstanceOf(Walls); + expectTypeOf(data.stats.Walls).toEqualTypeOf(); + expect(data.stats.Warlords).toBeDefined(); + expect(data.stats.Warlords).toBeInstanceOf(Warlords); + expectTypeOf(data.stats.Warlords).toEqualTypeOf(); + expect(data.stats.WoolGames).toBeDefined(); + expect(data.stats.WoolGames).toBeInstanceOf(WoolGames); + expectTypeOf(data.stats.WoolGames).toEqualTypeOf(); }); diff --git a/src/Structures/Player/Player.ts b/src/Structures/Player/Player.ts index a939a6ecb..765d41c2f 100644 --- a/src/Structures/Player/Player.ts +++ b/src/Structures/Player/Player.ts @@ -120,28 +120,28 @@ class Player { this.houses = extra.houses || null; this.recentGames = extra.recentGames || null; this.stats = { - arcade: new Arcade(data?.stats?.Arcade), - arenaBrawl: new ArenaBrawl(data?.stats?.Arena), - bedwars: new BedWars(data?.stats?.Bedwars), - blitzsg: new BlitzSurvivalGames(data?.stats?.HungerGames), - buildbattle: new BuildBattle(data?.stats?.BuildBattle), - copsandcrims: new CopsAndCrims(data?.stats?.MCGO), - duels: new Duels(data?.stats?.Duels), - megawalls: new MegaWalls(data?.stats?.Walls3), - murdermystery: new MurderMystery(data?.stats?.MurderMystery), - paintball: new Paintball(data?.stats?.Paintball), - pit: new Pit(data?.stats?.Pit), - quakecraft: new Quakecraft(data?.stats?.Quake), - skywars: new SkyWars(data?.stats?.SkyWars), - smashheroes: new SmashHeroes(data?.stats?.SuperSmash), - speeduhc: new SpeedUHC(data?.stats?.SpeedUHC), - tntgames: new TNTGames(data?.stats?.TNTGames), - turbokartracers: new TurboKartRacers(data?.stats?.GingerBread), - uhc: new UHC(data?.stats?.UHC), - vampirez: new VampireZ(data?.stats?.VampireZ), - walls: new Walls(data?.stats?.Walls), - warlords: new Warlords(data?.stats?.Battleground), - woolgames: new WoolGames(data?.stats?.WoolGames) + Arcade: new Arcade(data?.stats?.Arcade), + ArenaBrawl: new ArenaBrawl(data?.stats?.Arena), + BedWars: new BedWars(data?.stats?.Bedwars), + BlitzSurvivalGames: new BlitzSurvivalGames(data?.stats?.HungerGames), + BuildBattle: new BuildBattle(data?.stats?.BuildBattle), + CopsAndCrims: new CopsAndCrims(data?.stats?.MCGO), + Duels: new Duels(data?.stats?.Duels), + MegaWalls: new MegaWalls(data?.stats?.Walls3), + MurderMystery: new MurderMystery(data?.stats?.MurderMystery), + Paintball: new Paintball(data?.stats?.Paintball), + Pit: new Pit(data?.stats?.Pit), + QuakeCraft: new Quakecraft(data?.stats?.Quake), + SkyWars: new SkyWars(data?.stats?.SkyWars), + SmashHeroes: new SmashHeroes(data?.stats?.SuperSmash), + SpeedUHC: new SpeedUHC(data?.stats?.SpeedUHC), + TNTGames: new TNTGames(data?.stats?.TNTGames), + TurboKartRacers: new TurboKartRacers(data?.stats?.GingerBread), + UHC: new UHC(data?.stats?.UHC), + VampireZ: new VampireZ(data?.stats?.VampireZ), + Walls: new Walls(data?.stats?.Walls), + Warlords: new Warlords(data?.stats?.Battleground), + WoolGames: new WoolGames(data?.stats?.WoolGames) }; } diff --git a/src/Structures/Player/PlayerAchievements.test.ts b/src/Structures/Player/PlayerAchievements.test.ts index d4ac1cdaa..f766ec04f 100644 --- a/src/Structures/Player/PlayerAchievements.test.ts +++ b/src/Structures/Player/PlayerAchievements.test.ts @@ -14,8 +14,8 @@ test('PlayerAchievements', () => { expectTypeOf(data.rewards).toEqualTypeOf(); expect(data.tracking).toBeDefined(); expectTypeOf(data.tracking).toEqualTypeOf(); - expect(data.achivements).toBeDefined(); - expectTypeOf(data.achivements).toEqualTypeOf>(); + expect(data.achievements).toBeDefined(); + expectTypeOf(data.achievements).toEqualTypeOf>(); expect(data.oneTime).toBeDefined(); expectTypeOf(data.oneTime).toEqualTypeOf(); expect(data.totem).toBeDefined(); diff --git a/src/Structures/Player/PlayerAchievements.ts b/src/Structures/Player/PlayerAchievements.ts index d441246a6..8e6bc15c1 100644 --- a/src/Structures/Player/PlayerAchievements.ts +++ b/src/Structures/Player/PlayerAchievements.ts @@ -4,14 +4,14 @@ class PlayerAchievements { points: number; rewards: PlayerAchievementsRewards; tracking: string[]; - achivements: Record; + achievements: Record; oneTime: string[]; totem: Record; constructor(data: Record) { this.points = data?.achievementPoints || 0; this.rewards = new PlayerAchievementsRewards(data?.achievementRewardsNew || {}); this.tracking = data?.achievementTracking || []; - this.achivements = data?.achievements || {}; + this.achievements = data?.achievements || {}; this.oneTime = data.achievementsOneTime || []; this.totem = data?.achievementTotem || {}; } diff --git a/src/Structures/Player/Tourney/Tourney.test.ts b/src/Structures/Player/Tourney/Tourney.test.ts index 95fb26dba..11f4ff444 100644 --- a/src/Structures/Player/Tourney/Tourney.test.ts +++ b/src/Structures/Player/Tourney/Tourney.test.ts @@ -15,6 +15,6 @@ test('Tourney', () => { expectTypeOf(data.shopSort).toEqualTypeOf(); expect(data.hidePurchased).toBeDefined(); expectTypeOf(data.hidePurchased).toEqualTypeOf(); - expect(data.turneyData).toBeDefined(); - expectTypeOf(data.turneyData).toEqualTypeOf(); + expect(data.tourneyData).toBeDefined(); + expectTypeOf(data.tourneyData).toEqualTypeOf(); }); diff --git a/src/Structures/Player/Tourney/Tourney.ts b/src/Structures/Player/Tourney/Tourney.ts index 8654e110f..052ffe550 100644 --- a/src/Structures/Player/Tourney/Tourney.ts +++ b/src/Structures/Player/Tourney/Tourney.ts @@ -5,16 +5,16 @@ class Tourney { totalTributes: number; shopSort: string; hidePurchased: boolean; - turneyData: TourneyData[]; + tourneyData: TourneyData[]; constructor(data: Record) { this.firstJoinLobby = data.first_join_lobby || null; this.totalTributes = data.total_tributes || 0; this.shopSort = data.shop_sort || ''; this.hidePurchased = data.hide_purchased || false; - this.turneyData = []; + this.tourneyData = []; Object.keys(data) .filter((key) => ['first_join_lobby', 'total_tributes', 'shop_sort', 'hide_purchased'].includes(key)) - .forEach((key) => this.turneyData.push(new TourneyData(data[key]))); + .forEach((key) => this.tourneyData.push(new TourneyData(data[key]))); } } diff --git a/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpackDecoded.ts b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpackDecoded.ts index 084d6b005..3a2439577 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpackDecoded.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpackDecoded.ts @@ -1,11 +1,9 @@ import SkyBlockInventoryItem from '../../../Inventory/SkyBlockInventoryItem.js'; -import { writeFileSync } from 'fs'; class SkyBlockMemberInventoriesBackpackDecoded { icon: SkyBlockInventoryItem; items: SkyBlockInventoryItem[]; constructor(data: Record) { - writeFileSync('fixed.json', JSON.stringify(data)); this.icon = new SkyBlockInventoryItem(data?.backpackIconDecoded[0]); this.items = []; for (let i = 0; i < data?.backpackItemsDecoded.length; i++) { diff --git a/src/Structures/Static/Achievements/GameAchievements.ts b/src/Structures/Static/Achievements/GameAchievements.ts index 3e31ad2e0..f0279373e 100644 --- a/src/Structures/Static/Achievements/GameAchievements.ts +++ b/src/Structures/Static/Achievements/GameAchievements.ts @@ -1,21 +1,21 @@ -import OneTimeAchivement from './OneTimeAchivement.js'; -import TieredAchivement from './TieredAchivement.js'; +import OneTimeAchievement from './OneTimeAchievement.js'; +import TieredAchievement from './TieredAchievement.js'; class GameAchievements { game: string; points: number; legacyPoints: number; - oneTimeAchievements: OneTimeAchivement[]; - tieredAchievements: TieredAchivement[]; + oneTimeAchievements: OneTimeAchievement[]; + tieredAchievements: TieredAchievement[]; constructor(game: string, data: Record) { this.game = game; this.points = data.total_points || 0; this.legacyPoints = data.total_legacy_points || 0; this.oneTimeAchievements = Object.keys(data.one_time).map( - (achivementKey) => new OneTimeAchivement(achivementKey, data.one_time[achivementKey]) + (achievementKey) => new OneTimeAchievement(achievementKey, data.one_time[achievementKey]) ); this.tieredAchievements = Object.keys(data.tiered).map( - (achivementKey) => new TieredAchivement(achivementKey, data.tiered[achivementKey]) + (achievementKey) => new TieredAchievement(achievementKey, data.tiered[achievementKey]) ); } } diff --git a/src/Structures/Static/Achievements/GuildAchievements.ts b/src/Structures/Static/Achievements/GuildAchievements.ts index 146cc4a4d..a7b4335c0 100644 --- a/src/Structures/Static/Achievements/GuildAchievements.ts +++ b/src/Structures/Static/Achievements/GuildAchievements.ts @@ -1,19 +1,19 @@ -import OneTimeAchivement from './OneTimeAchivement.js'; -import TieredAchivement from './TieredAchivement.js'; +import OneTimeAchievement from './OneTimeAchievement.js'; +import TieredAchievement from './TieredAchievement.js'; class GuildAchievements { lastUpdatedTimestamp: number; lastUpdatedAt: Date; - oneTimeAchievements: OneTimeAchivement[]; - tieredAchievements: TieredAchivement[]; + oneTimeAchievements: OneTimeAchievement[]; + tieredAchievements: TieredAchievement[]; constructor(data: Record) { this.lastUpdatedTimestamp = data.lastUpdated; this.lastUpdatedAt = new Date(this.lastUpdatedTimestamp); this.oneTimeAchievements = Object.keys(data.one_time).map( - (achivementKey) => new OneTimeAchivement(achivementKey, data.one_time[achivementKey]) + (achievementKey) => new OneTimeAchievement(achievementKey, data.one_time[achievementKey]) ); this.tieredAchievements = Object.keys(data.tiered).map( - (achivementKey) => new TieredAchivement(achivementKey, data.tiered[achivementKey]) + (achievementKey) => new TieredAchievement(achievementKey, data.tiered[achievementKey]) ); } } diff --git a/src/Structures/Static/Achievements/OneTimeAchivement.ts b/src/Structures/Static/Achievements/OneTimeAchievement.ts similarity index 61% rename from src/Structures/Static/Achievements/OneTimeAchivement.ts rename to src/Structures/Static/Achievements/OneTimeAchievement.ts index 289799a64..11ed7c1b8 100644 --- a/src/Structures/Static/Achievements/OneTimeAchivement.ts +++ b/src/Structures/Static/Achievements/OneTimeAchievement.ts @@ -1,15 +1,15 @@ import BaseAchievement from './BaseAchievement.js'; -class OneTimeAchivement extends BaseAchievement { +class OneTimeAchievement extends BaseAchievement { points: number; gamePercentUnlocked: number; globalPercentUnlocked: number; - constructor(achivementName: string, data: Record) { - super(achivementName, data); + constructor(achievementName: string, data: Record) { + super(achievementName, data); this.points = data.points; this.gamePercentUnlocked = data.gamePercentUnlocked || 0; this.globalPercentUnlocked = data.globalPercentUnlocked || 0; } } -export default OneTimeAchivement; +export default OneTimeAchievement; diff --git a/src/Structures/Static/Achievements/TieredAchievement.ts b/src/Structures/Static/Achievements/TieredAchievement.ts new file mode 100644 index 000000000..23a2c1b9f --- /dev/null +++ b/src/Structures/Static/Achievements/TieredAchievement.ts @@ -0,0 +1,12 @@ +import BaseAchievement from './BaseAchievement.js'; +import type { AchievementTier } from '../../../Types/Static.js'; + +class TieredAchievement extends BaseAchievement { + tiers: AchievementTier[]; + constructor(achievementName: string, data: Record) { + super(achievementName, data); + this.tiers = data.tiers; + } +} + +export default TieredAchievement; diff --git a/src/Structures/Static/Achievements/TieredAchivement.ts b/src/Structures/Static/Achievements/TieredAchivement.ts deleted file mode 100644 index 0d3f47609..000000000 --- a/src/Structures/Static/Achievements/TieredAchivement.ts +++ /dev/null @@ -1,12 +0,0 @@ -import BaseAchievement from './BaseAchievement.js'; -import type { AchivementTier } from '../../../Types/Static.js'; - -class TieredAchivement extends BaseAchievement { - tiers: AchivementTier[]; - constructor(achivementName: string, data: Record) { - super(achivementName, data); - this.tiers = data.tiers; - } -} - -export default TieredAchivement; diff --git a/src/Types/Player.ts b/src/Types/Player.ts index 5fc8c7117..9033e4cad 100644 --- a/src/Types/Player.ts +++ b/src/Types/Player.ts @@ -76,8 +76,8 @@ export type CopsAndCrimsGamemodes = 'deathmatch' | 'gungame'; export type BedWarsPracticeRecordDistances = 30 | 50 | 100; export type BedWarsPracticeRecordElevations = 'NONE' | 'SLIGHT' | 'STAIRCASE'; export type BedWarsPracticeModes = 'BRIDGING' | 'FIREBALL_JUMPING' | 'BOW' | 'MLG' | 'PEARL_CLUTCHING'; -export type BedwarsDreamGamemodeName = 'ultimate' | 'rush' | 'armed' | 'lucky' | 'voidless'; -export type BedwarsGamemodeName = +export type BedWarsDreamGamemodeName = 'ultimate' | 'rush' | 'armed' | 'lucky' | 'voidless'; +export type BedWarsGamemodeName = | 'eight_one' | 'eight_two' | 'four_three' @@ -426,28 +426,28 @@ export interface LevelProgress { } export interface PlayerStats { - arcade: Arcade; - arenaBrawl: ArenaBrawl; - bedwars: BedWars; - blitzsg: BlitzSurvivalGames; - buildbattle: BuildBattle; - copsandcrims: CopsAndCrims; - duels: Duels; - megawalls: MegaWalls; - murdermystery: MurderMystery; - paintball: Paintball; - pit: Pit; - quakecraft: Quakecraft; - skywars: SkyWars; - smashheroes: SmashHeroes; - speeduhc: SpeedUHC; - tntgames: TNTGames; - turbokartracers: TurboKartRacers; - uhc: UHC; - vampirez: VampireZ; - walls: Walls; - warlords: Warlords; - woolgames: WoolGames; + Arcade: Arcade; + ArenaBrawl: ArenaBrawl; + BedWars: BedWars; + BlitzSurvivalGames: BlitzSurvivalGames; + BuildBattle: BuildBattle; + CopsAndCrims: CopsAndCrims; + Duels: Duels; + MegaWalls: MegaWalls; + MurderMystery: MurderMystery; + Paintball: Paintball; + Pit: Pit; + QuakeCraft: Quakecraft; + SkyWars: SkyWars; + SmashHeroes: SmashHeroes; + SpeedUHC: SpeedUHC; + TNTGames: TNTGames; + TurboKartRacers: TurboKartRacers; + UHC: UHC; + VampireZ: VampireZ; + Walls: Walls; + Warlords: Warlords; + WoolGames: WoolGames; } export type PlayerRank = diff --git a/src/Types/Static.ts b/src/Types/Static.ts index dd71a8821..5748a76c6 100644 --- a/src/Types/Static.ts +++ b/src/Types/Static.ts @@ -13,7 +13,7 @@ export interface ChallengeReward { amount: number; } -export interface AchivementTier { +export interface AchievementTier { tier: number; points?: number; amount: number; diff --git a/src/Utils/Guild.ts b/src/Utils/Guild.ts index 5ebbc036d..c364e0b0c 100644 --- a/src/Utils/Guild.ts +++ b/src/Utils/Guild.ts @@ -65,9 +65,9 @@ export function calculateExpHistory(data: GuildMember[]): ExpHistory[] { const finalObj: Record = {}; if (undefined === data[0]?.expHistory) return []; Object.keys(data[0].expHistory).forEach((day, index) => { - let gexp = 0; - data.forEach((member) => (gexp += member.expHistory?.[index]?.exp || 0)); - finalObj[data[0]?.expHistory[index]?.day || 'Unknown'] = expLimit(gexp); + let GEXP = 0; + data.forEach((member) => (GEXP += member.expHistory?.[index]?.exp || 0)); + finalObj[data[0]?.expHistory[index]?.day || 'Unknown'] = expLimit(GEXP); }); return parseHistory(finalObj); } @@ -76,8 +76,8 @@ export function members(data: Record): GuildMember[] { return data.length ? data.map((m: Record) => new GuildMember(m)) : []; } -export function totalWeeklyGexp(data: GuildMember[]): number { - let gexp: number = 0; - data.forEach((member) => (gexp += member.weeklyExperience)); - return gexp; +export function totalWeeklyGEXP(data: GuildMember[]): number { + let GEXP: number = 0; + data.forEach((member) => (GEXP += member.weeklyExperience)); + return GEXP; } diff --git a/src/Utils/SkyBlockUtils.ts b/src/Utils/SkyBlockUtils.ts index 076d1c3cb..2d4f74241 100644 --- a/src/Utils/SkyBlockUtils.ts +++ b/src/Utils/SkyBlockUtils.ts @@ -38,11 +38,11 @@ export async function decode(base64: any, isBuffer: boolean = false): Promise { export type Extra = { type: SkyBlockXPTables; cap?: number }; -// Credit: https://github.com/SkyCryptWebsite/SkyCryptv2/blob/2d4d0317b1f7a9f27e59d25afd4df24c0e49b0da/src/lib/server/stats/leveling/leveling.ts#L43-L126 (modifed) +// Credit: https://github.com/SkyCryptWebsite/SkyCryptv2/blob/2d4d0317b1f7a9f27e59d25afd4df24c0e49b0da/src/lib/server/stats/leveling/leveling.ts#L43-L126 (modified) export function getLevelByXp(xp: number, extra: Extra = { type: 'default' }): SkillLevelData { const xpTable = getXpTable(extra.type) as Record; if ('number' !== typeof xp || isNaN(xp)) { @@ -180,26 +180,26 @@ export function getLevelByXp(xp: number, extra: Extra = { type: 'default' }): Sk } } - const isInfiniteLevelable = INFINITE.includes(extra.type); - if (isInfiniteLevelable) { + const isInfiniteLevelAble = INFINITE.includes(extra.type); + if (isInfiniteLevelAble) { const maxExperience = Object.values(xpTable).at(-1) as number; uncappedLevel += Math.floor(xpRemaining / maxExperience); xpRemaining %= maxExperience; currentXp = xpRemaining; } - const maxLevel = isInfiniteLevelable ? Math.max(uncappedLevel, levelCap) : levelCap; - const level = isInfiniteLevelable ? uncappedLevel : Math.min(levelCap, uncappedLevel); + const maxLevel = isInfiniteLevelAble ? Math.max(uncappedLevel, levelCap) : levelCap; + const level = isInfiniteLevelAble ? uncappedLevel : Math.min(levelCap, uncappedLevel); const xpForNext = ( level < maxLevel ? Math.ceil(xpTable[level + 1] ?? 0 ?? Object.values(xpTable).at(-1)) - : isInfiniteLevelable + : isInfiniteLevelAble ? Object.values(xpTable).at(-1) : Infinity ) as number; - const progress = level >= maxLevel && !isInfiniteLevelable ? 0 : Math.max(0, Math.min(currentXp / xpForNext, 1)); + const progress = level >= maxLevel && !isInfiniteLevelAble ? 0 : Math.max(0, Math.min(currentXp / xpForNext, 1)); const maxed = level >= maxLevel; return { diff --git a/src/index.ts b/src/index.ts index 05389f235..bc589c4d4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -88,7 +88,7 @@ import MiniWalls from './Structures/MiniGames/Arcade/MiniWalls.js'; import MonthlyCrate from './Structures/Player/MonthlyCrate.js'; import MurderMystery from './Structures/MiniGames/MurderMystery/MurderMystery.js'; import MurderMysteryModeStats from './Structures/MiniGames/MurderMystery/MurderMysteryModeStats.js'; -import OneTimeAchivement from './Structures/Static/Achievements/OneTimeAchivement.js'; +import OneTimeAchievement from './Structures/Static/Achievements/OneTimeAchievement.js'; import PVPRun from './Structures/MiniGames/TNTGames/PVPRun.js'; import Paintball from './Structures/MiniGames/Paintball.js'; import Parkour from './Structures/Player/Parkour.js'; @@ -297,7 +297,7 @@ import TNTRun from './Structures/MiniGames/TNTGames/TNTRun.js'; import TNTTag from './Structures/MiniGames/TNTGames/TNTTag.js'; import TNTWizards from './Structures/MiniGames/TNTGames/TNTWizards.js'; import ThrowOut from './Structures/MiniGames/Arcade/ThrowOut.js'; -import TieredAchivement from './Structures/Static/Achievements/TieredAchivement.js'; +import TieredAchievement from './Structures/Static/Achievements/TieredAchievement.js'; import Tourney from './Structures/Player/Tourney/Tourney.js'; import TourneyData from './Structures/Player/Tourney/TourneyData.js'; import TurboKartRacers from './Structures/MiniGames/TurboKartRacers/TurboKartRacers.js'; @@ -392,7 +392,7 @@ export default { MonthlyCrate, MurderMystery, MurderMysteryModeStats, - OneTimeAchivement, + OneTimeAchievement, PVPRun, Paintball, Parkour, @@ -601,7 +601,7 @@ export default { TNTTag, TNTWizards, ThrowOut, - TieredAchivement, + TieredAchievement, Tourney, TourneyData, TurboKartRacers, diff --git a/typedoc.json b/typedoc.json index 5ccf5d550..d3c571138 100644 --- a/typedoc.json +++ b/typedoc.json @@ -8,7 +8,7 @@ "entryPointStrategy": "expand", "hideGenerator": true, "cleanOutputDir": true, - "page404Content": "This poage does not exist", + "page404Content": "This page does not exist", "useHostedBaseUrlForAbsoluteLinks": true, "hostedBaseUrl": "https://hypixel-api-reborn.github.io/hypixel-api-reborn/", "lang": "en", From 1d5be6db51853953f5ce056eba171ef5ef39f6db Mon Sep 17 00:00:00 2001 From: Jacob <55346310+Kathund@users.noreply.github.com> Date: Mon, 14 Apr 2025 16:14:25 +0800 Subject: [PATCH 012/124] Prepare for vitest v3 (#665) --- src/API/getGuild.test.ts | 16 ++++++++-------- src/API/getHouse.test.ts | 4 ++-- src/API/getLeaderboards.test.ts | 4 ++-- src/API/getPlayer.test.ts | 4 ++-- src/API/getPlayerHouses.test.ts | 4 ++-- src/API/getRecentGames.test.ts | 4 ++-- src/API/getSkyBlockAuction.test.ts | 12 ++++++------ src/API/getSkyBlockAuctions.test.ts | 16 ++++++++-------- src/API/getSkyBlockGarden.test.ts | 4 ++-- src/API/getSkyBlockMuseum.test.ts | 4 ++-- src/API/getSkyBlockProfile.test.ts | 8 ++++---- src/API/getSkyBlockProfiles.test.ts | 8 ++++---- src/Private/RateLimit.test.ts | 4 ++-- src/Private/RequestHandler.test.ts | 28 ++++++++++++++++------------ src/Private/Updater.test.ts | 4 ++-- 15 files changed, 64 insertions(+), 60 deletions(-) diff --git a/src/API/getGuild.test.ts b/src/API/getGuild.test.ts index 1abcdde3f..506f99bfc 100644 --- a/src/API/getGuild.test.ts +++ b/src/API/getGuild.test.ts @@ -10,35 +10,35 @@ import type { ColorCode, ColorHex, ColorString, InGameCode } from '../Types/Colo import type { ExpHistory } from '../Types/Guild.js'; import type { GameCode, GameID, GameString } from '../Types/Game.js'; -test('Invalid Guild Type', () => { +test('Invalid Guild Type', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - expect(() => client.getGuild('invalid', 'invalid')).rejects.toThrowError( + await expect(() => client.getGuild('invalid', 'invalid')).rejects.toThrowError( client.errors.INVALID_GUILD_SEARCH_PARAMETER ); client.destroy(); }); -test('Invalid Guild', () => { +test('Invalid Guild', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - expect(() => client.getGuild('name', 'this guild dose not exist')).rejects.toThrowError( + await expect(() => client.getGuild('name', 'this guild dose not exist')).rejects.toThrowError( client.errors.GUILD_DOES_NOT_EXIST ); client.destroy(); }); -test('Invalid Guild ID', () => { +test('Invalid Guild ID', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - expect(() => client.getGuild('id', 'invalid guild id')).rejects.toThrowError(client.errors.INVALID_GUILD_ID); + await expect(() => client.getGuild('id', 'invalid guild id')).rejects.toThrowError(client.errors.INVALID_GUILD_ID); client.destroy(); }); -test('No Guild Query', () => { +test('No Guild Query', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - expect(() => client.getGuild('id')).rejects.toThrowError(client.errors.NO_GUILD_QUERY); + await expect(() => client.getGuild('id')).rejects.toThrowError(client.errors.NO_GUILD_QUERY); client.destroy(); }); diff --git a/src/API/getHouse.test.ts b/src/API/getHouse.test.ts index 7a66fa334..616abdb85 100644 --- a/src/API/getHouse.test.ts +++ b/src/API/getHouse.test.ts @@ -13,11 +13,11 @@ test('getHouse (raw)', async () => { client.destroy(); }); -test('getHouse (no input)', () => { +test('getHouse (no input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - expect(() => client.getHouse()).rejects.toThrowError(client.errors.NO_UUID); + await expect(() => client.getHouse()).rejects.toThrowError(client.errors.NO_UUID); client.destroy(); }); diff --git a/src/API/getLeaderboards.test.ts b/src/API/getLeaderboards.test.ts index c0b0fb316..7967eda89 100644 --- a/src/API/getLeaderboards.test.ts +++ b/src/API/getLeaderboards.test.ts @@ -50,14 +50,14 @@ test('getLeaderboards', async () => { client.destroy(); }); -test('getLeaderboards (Missing Data)', () => { +test('getLeaderboards (Missing Data)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? ''); vi.spyOn(global, 'fetch').mockResolvedValue({ ...defaultRequestData, json: () => Promise.resolve({ success: true }) } as any); - expect(() => client.getLeaderboards()).rejects.toThrowError( + await expect(() => client.getLeaderboards()).rejects.toThrowError( client.errors.SOMETHING_WENT_WRONG.replace(/{cause}/, 'Try again.') ); vi.restoreAllMocks(); diff --git a/src/API/getPlayer.test.ts b/src/API/getPlayer.test.ts index 4d41a0f87..3f074c41c 100644 --- a/src/API/getPlayer.test.ts +++ b/src/API/getPlayer.test.ts @@ -55,11 +55,11 @@ test('getPlayer (never joined hypixel)', async () => { client.destroy(); }); -test('getPlayer (no input)', () => { +test('getPlayer (no input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - expect(() => client.getPlayer()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); + await expect(() => client.getPlayer()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); client.destroy(); }); diff --git a/src/API/getPlayerHouses.test.ts b/src/API/getPlayerHouses.test.ts index 8a083eaf5..6c7075b86 100644 --- a/src/API/getPlayerHouses.test.ts +++ b/src/API/getPlayerHouses.test.ts @@ -3,11 +3,11 @@ import House from '../Structures/House.js'; import RequestData from '../Private/RequestData.js'; import { expect, expectTypeOf, test } from 'vitest'; -test('getPlayerHouses (No input)', () => { +test('getPlayerHouses (No input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - expect(() => client.getPlayerHouses()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); + await expect(() => client.getPlayerHouses()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); client.destroy(); }); diff --git a/src/API/getRecentGames.test.ts b/src/API/getRecentGames.test.ts index e9afa9ff4..ec918a3ec 100644 --- a/src/API/getRecentGames.test.ts +++ b/src/API/getRecentGames.test.ts @@ -4,11 +4,11 @@ import RecentGame from '../Structures/RecentGame.js'; import RequestData from '../Private/RequestData.js'; import { expect, expectTypeOf, test } from 'vitest'; -test('getRecentGames (no input)', () => { +test('getRecentGames (no input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - expect(() => client.getRecentGames()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); + await expect(() => client.getRecentGames()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); client.destroy(); }); diff --git a/src/API/getSkyBlockAuction.test.ts b/src/API/getSkyBlockAuction.test.ts index 9a88a8dc4..7495b948b 100644 --- a/src/API/getSkyBlockAuction.test.ts +++ b/src/API/getSkyBlockAuction.test.ts @@ -16,27 +16,27 @@ test('getSkyBlockAuction (raw)', async () => { expectTypeOf(data).toEqualTypeOf(); }); -test('getSkyBlockAuction (No Type Input)', () => { +test('getSkyBlockAuction (No Type Input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - expect(() => client.getSkyBlockAuction()).rejects.toThrowError(client.errors.BAD_AUCTION_FILTER); + await expect(() => client.getSkyBlockAuction()).rejects.toThrowError(client.errors.BAD_AUCTION_FILTER); client.destroy(); }); -test('getSkyBlockAuction (Bad Type Input)', () => { +test('getSkyBlockAuction (Bad Type Input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - expect(() => client.getSkyBlockAuction('meow', 'meow')).rejects.toThrowError(client.errors.BAD_AUCTION_FILTER); + await expect(() => client.getSkyBlockAuction('meow', 'meow')).rejects.toThrowError(client.errors.BAD_AUCTION_FILTER); client.destroy(); }); -test('getSkyBlockAuction (No Query Input)', () => { +test('getSkyBlockAuction (No Query Input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - expect(() => client.getSkyBlockAuction('AUCTION_ID')).rejects.toThrowError(client.errors.NO_UUID); + await expect(() => client.getSkyBlockAuction('AUCTION_ID')).rejects.toThrowError(client.errors.NO_UUID); client.destroy(); }); diff --git a/src/API/getSkyBlockAuctions.test.ts b/src/API/getSkyBlockAuctions.test.ts index b1f30cf49..b49799e49 100644 --- a/src/API/getSkyBlockAuctions.test.ts +++ b/src/API/getSkyBlockAuctions.test.ts @@ -5,31 +5,31 @@ import { expect, expectTypeOf, test } from 'vitest'; import type SkyBlockAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockAuctionInfo.js'; import type { SkyBlockAuctionsResult } from '../Types/API.js'; -test('getSkyBlockAuctions (No Input)', () => { +test('getSkyBlockAuctions (No Input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - expect(() => client.getSkyBlockAuctions()).rejects.toThrowError(client.errors.INVALID_OPTION_VALUE); + await expect(() => client.getSkyBlockAuctions()).rejects.toThrowError(client.errors.INVALID_OPTION_VALUE); client.destroy(); }); -test('getSkyBlockAuctions (Negative Input)', () => { +test('getSkyBlockAuctions (Negative Input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - expect(() => client.getSkyBlockAuctions(-1)).rejects.toThrowError(client.errors.INVALID_OPTION_VALUE); + await expect(() => client.getSkyBlockAuctions(-1)).rejects.toThrowError(client.errors.INVALID_OPTION_VALUE); client.destroy(); }); -test('getSkyBlockAuctions (Page 0)', () => { +test('getSkyBlockAuctions (Page 0)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - expect(() => client.getSkyBlockAuctions(0)).rejects.toThrowError(client.errors.INVALID_OPTION_VALUE); + await expect(() => client.getSkyBlockAuctions(0)).rejects.toThrowError(client.errors.INVALID_OPTION_VALUE); client.destroy(); }); -test('getSkyBlockAuctions (String Input)', () => { +test('getSkyBlockAuctions (String Input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - expect(() => client.getSkyBlockAuctions('hi')).rejects.toThrowError(client.errors.INVALID_OPTION_VALUE); + await expect(() => client.getSkyBlockAuctions('hi')).rejects.toThrowError(client.errors.INVALID_OPTION_VALUE); client.destroy(); }); diff --git a/src/API/getSkyBlockGarden.test.ts b/src/API/getSkyBlockGarden.test.ts index a29818e98..a9d1c85af 100644 --- a/src/API/getSkyBlockGarden.test.ts +++ b/src/API/getSkyBlockGarden.test.ts @@ -9,11 +9,11 @@ import SkyBlockGardenVisitors from '../Structures/SkyBlock/Garden/SkyBlockGarden import { expect, expectTypeOf, test } from 'vitest'; import type { BarnPlot, BarnSkin, SkillLevelData } from '../Types/SkyBlock.js'; -test('getSkyBlockGarden (no input)', () => { +test('getSkyBlockGarden (no input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - expect(() => client.getSkyBlockGarden()).rejects.toThrowError(client.errors.NO_UUID); + await expect(() => client.getSkyBlockGarden()).rejects.toThrowError(client.errors.NO_UUID); client.destroy(); }); diff --git a/src/API/getSkyBlockMuseum.test.ts b/src/API/getSkyBlockMuseum.test.ts index e4dc4931b..b5948b165 100644 --- a/src/API/getSkyBlockMuseum.test.ts +++ b/src/API/getSkyBlockMuseum.test.ts @@ -14,11 +14,11 @@ test('getSkyBlockMuseum (raw)', async () => { client.destroy(); }); -test('getSkyBlockMuseum (No input)', () => { +test('getSkyBlockMuseum (No input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - expect(() => client.getSkyBlockMuseum()).rejects.toThrowError(client.errors.NO_UUID); + await expect(() => client.getSkyBlockMuseum()).rejects.toThrowError(client.errors.NO_UUID); client.destroy(); }); diff --git a/src/API/getSkyBlockProfile.test.ts b/src/API/getSkyBlockProfile.test.ts index 83abea58f..09efd5b4e 100644 --- a/src/API/getSkyBlockProfile.test.ts +++ b/src/API/getSkyBlockProfile.test.ts @@ -18,17 +18,17 @@ test('getSkyBlockProfile (raw)', async () => { client.destroy(); }); -test('getSkyBlockProfile (no input)', () => { +test('getSkyBlockProfile (no input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - expect(() => client.getSkyBlockProfile()).rejects.toThrowError(client.errors.NO_UUID); + await expect(() => client.getSkyBlockProfile()).rejects.toThrowError(client.errors.NO_UUID); client.destroy(); }); -test('getSkyBlockProfile (no profiles)', () => { +test('getSkyBlockProfile (no profiles)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - expect(() => client.getSkyBlockProfile('ce6685dd-78dd-4418-9f6f-b01cf9778daa')).rejects.toThrowError( + await expect(() => client.getSkyBlockProfile('ce6685dd-78dd-4418-9f6f-b01cf9778daa')).rejects.toThrowError( client.errors.NO_SKYBLOCK_PROFILES ); client.destroy(); diff --git a/src/API/getSkyBlockProfiles.test.ts b/src/API/getSkyBlockProfiles.test.ts index 352e33a92..d99709524 100644 --- a/src/API/getSkyBlockProfiles.test.ts +++ b/src/API/getSkyBlockProfiles.test.ts @@ -18,17 +18,17 @@ test('getSkyBlockProfiles (raw)', async () => { client.destroy(); }); -test('getSkyBlockProfiles (no input)', () => { +test('getSkyBlockProfiles (no input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - expect(() => client.getSkyBlockProfiles()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); + await expect(() => client.getSkyBlockProfiles()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); client.destroy(); }); -test('getSkyBlockProfiles (no profiles)', () => { +test('getSkyBlockProfiles (no profiles)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - expect(() => client.getSkyBlockProfiles('b45add7b081443909fb00aa9a3e15eb0')).rejects.toThrowError( + await expect(() => client.getSkyBlockProfiles('b45add7b081443909fb00aa9a3e15eb0')).rejects.toThrowError( client.errors.NO_SKYBLOCK_PROFILES ); client.destroy(); diff --git a/src/Private/RateLimit.test.ts b/src/Private/RateLimit.test.ts index ee88d6b41..074f89d40 100644 --- a/src/Private/RateLimit.test.ts +++ b/src/Private/RateLimit.test.ts @@ -79,14 +79,14 @@ test('Ratelimit (Sync)', async () => { client.destroy(); }); -test('Ratelimit (Bad Sync Data)', () => { +test('Ratelimit (Bad Sync Data)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? ''); client.updater.currentVersion = '1.0.0'; vi.spyOn(global, 'fetch').mockResolvedValue({ ...defaultRequestData, headers: new Headers({ hello: '100' }) } as any); - expect(() => client.rateLimit.sync()).rejects.toThrowError(client.errors.RATE_LIMIT_INIT_ERROR); + await expect(() => client.rateLimit.sync()).rejects.toThrowError(client.errors.RATE_LIMIT_INIT_ERROR); vi.restoreAllMocks(); client.destroy(); }); diff --git a/src/Private/RequestHandler.test.ts b/src/Private/RequestHandler.test.ts index fdc5ddd85..fc8255eed 100644 --- a/src/Private/RequestHandler.test.ts +++ b/src/Private/RequestHandler.test.ts @@ -17,15 +17,17 @@ test('RequestHandler', async () => { expect(data).toBe('14727faefbdc4aff848cd2713eb9939e'); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - expect(() => client.requestHandler.toUUID()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); + await expect(() => client.requestHandler.toUUID()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - expect(() => client.requestHandler.toUUID(-1)).rejects.toThrowError(client.errors.UUID_NICKNAME_MUST_BE_A_STRING); + await expect(() => client.requestHandler.toUUID(-1)).rejects.toThrowError( + client.errors.UUID_NICKNAME_MUST_BE_A_STRING + ); client.destroy(); }); -test('RequestHandler (Invalid API Key)', () => { +test('RequestHandler (Invalid API Key)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); expect(client.requestHandler.request).toBeDefined(); expectTypeOf(client.requestHandler.request).toBeFunction(); @@ -34,12 +36,12 @@ test('RequestHandler (Invalid API Key)', () => { status: 403, json: () => Promise.resolve({ success: false }) } as any); - expect(() => client.requestHandler.request('/boosters')).rejects.toThrowError(client.errors.INVALID_API_KEY); + await expect(() => client.requestHandler.request('/boosters')).rejects.toThrowError(client.errors.INVALID_API_KEY); vi.restoreAllMocks(); client.destroy(); }); -test('RequestHandler (400 Bad Request)', () => { +test('RequestHandler (400 Bad Request)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); expect(client.requestHandler.request).toBeDefined(); expectTypeOf(client.requestHandler.request).toBeFunction(); @@ -48,14 +50,14 @@ test('RequestHandler (400 Bad Request)', () => { status: 400, json: () => Promise.resolve({ success: false, cause: 'meow' }) } as any); - expect(() => client.requestHandler.request('/boosters')).rejects.toThrowError( + await expect(() => client.requestHandler.request('/boosters')).rejects.toThrowError( client.errors.ERROR_CODE_CAUSE.replace(/{code}/, '400 Bad Request').replace(/{cause}/, 'meow') ); vi.restoreAllMocks(); client.destroy(); }); -test('RequestHandler (400 Bad Request No Cause)', () => { +test('RequestHandler (400 Bad Request No Cause)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); expect(client.requestHandler.request).toBeDefined(); expectTypeOf(client.requestHandler.request).toBeFunction(); @@ -64,14 +66,14 @@ test('RequestHandler (400 Bad Request No Cause)', () => { status: 400, json: () => Promise.resolve({ success: false }) } as any); - expect(() => client.requestHandler.request('/boosters')).rejects.toThrowError( + await expect(() => client.requestHandler.request('/boosters')).rejects.toThrowError( client.errors.ERROR_CODE_CAUSE.replace(/{code}/, '400 Bad Request').replace(/{cause}/, 'Unknown') ); vi.restoreAllMocks(); client.destroy(); }); -test('RequestHandler (Unprocessable Entity)', () => { +test('RequestHandler (Unprocessable Entity)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); expect(client.requestHandler.request).toBeDefined(); expectTypeOf(client.requestHandler.request).toBeFunction(); @@ -80,12 +82,12 @@ test('RequestHandler (Unprocessable Entity)', () => { status: 422, json: () => Promise.resolve({ success: false }) } as any); - expect(() => client.requestHandler.request('/boosters')).rejects.toThrowError(client.errors.UNEXPECTED_ERROR); + await expect(() => client.requestHandler.request('/boosters')).rejects.toThrowError(client.errors.UNEXPECTED_ERROR); vi.restoreAllMocks(); client.destroy(); }); -test('RequestHandler (Rate Limited)', () => { +test('RequestHandler (Rate Limited)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); expect(client.requestHandler.request).toBeDefined(); expectTypeOf(client.requestHandler.request).toBeFunction(); @@ -94,7 +96,9 @@ test('RequestHandler (Rate Limited)', () => { status: 429, json: () => Promise.resolve({ success: false }) } as any); - expect(() => client.requestHandler.request('/boosters')).rejects.toThrowError(client.errors.RATE_LIMIT_EXCEEDED); + await expect(() => client.requestHandler.request('/boosters')).rejects.toThrowError( + client.errors.RATE_LIMIT_EXCEEDED + ); vi.restoreAllMocks(); client.destroy(); }); diff --git a/src/Private/Updater.test.ts b/src/Private/Updater.test.ts index 90fa467e6..705331970 100644 --- a/src/Private/Updater.test.ts +++ b/src/Private/Updater.test.ts @@ -47,14 +47,14 @@ test('Updater (getLatestVersion)', async () => { client.destroy(); }); -test('Updater (getLatestVersion error)', () => { +test('Updater (getLatestVersion error)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); vi.spyOn(global, 'fetch').mockResolvedValue({ ...defaultRequestData, status: 404, json: () => Promise.resolve({ 'dist-tags': { latest: '1.0.0' } }) } as any); - expect(() => client.updater.getLatestVersion()).rejects.toThrowError(client.errors.UPDATER_REQUEST_NOT_OK); + await expect(() => client.updater.getLatestVersion()).rejects.toThrowError(client.errors.UPDATER_REQUEST_NOT_OK); vi.restoreAllMocks(); client.destroy(); }); From f3157d12c66fa75a32a0c5f9eae58d382746e730 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 14 Apr 2025 16:22:07 +0800 Subject: [PATCH 013/124] chore(deps): update vitest monorepo to v3 (#658) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 6 +- pnpm-lock.yaml | 178 +++++++++++++++++++++++++------------------------ 2 files changed, 94 insertions(+), 90 deletions(-) diff --git a/package.json b/package.json index 2aef4ba6c..24377080c 100644 --- a/package.json +++ b/package.json @@ -55,8 +55,8 @@ "@types/eslint": "^9.6.1", "@types/node": "^22.13.10", "@types/xml2js": "^0.4.14", - "@vitest/coverage-v8": "^2.1.9", - "@vitest/ui": "^2.1.9", + "@vitest/coverage-v8": "^3.1.1", + "@vitest/ui": "^3.1.1", "dotenv": "^16.4.7", "eslint": "^9.22.0", "eslint-config-prettier": "^10.1.1", @@ -67,7 +67,7 @@ "typedoc-plugin-rename-defaults": "^0.7.2", "typescript": "^5.8.2", "typescript-eslint": "^8.26.0", - "vitest": "^2.1.9", + "vitest": "^3.1.1", "xml2js": "^0.6.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ff012a1f3..72b540afd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -40,11 +40,11 @@ importers: specifier: ^0.4.14 version: 0.4.14 '@vitest/coverage-v8': - specifier: ^2.1.9 - version: 2.1.9(vitest@2.1.9(@types/node@22.13.13)(@vitest/ui@2.1.9)) + specifier: ^3.1.1 + version: 3.1.1(vitest@3.1.1(@types/node@22.13.13)(@vitest/ui@3.1.1)) '@vitest/ui': - specifier: ^2.1.9 - version: 2.1.9(vitest@2.1.9) + specifier: ^3.1.1 + version: 3.1.1(vitest@3.1.1) dotenv: specifier: ^16.4.7 version: 16.4.7 @@ -76,8 +76,8 @@ importers: specifier: ^8.26.0 version: 8.28.0(eslint@9.23.0)(typescript@5.8.2) vitest: - specifier: ^2.1.9 - version: 2.1.9(@types/node@22.13.13)(@vitest/ui@2.1.9) + specifier: ^3.1.1 + version: 3.1.1(@types/node@22.13.13)(@vitest/ui@3.1.1) xml2js: specifier: ^0.6.2 version: 0.6.2 @@ -111,8 +111,9 @@ packages: resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} engines: {node: '>=6.9.0'} - '@bcoe/v8-coverage@0.2.3': - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} @@ -544,48 +545,48 @@ packages: resolution: {integrity: sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitest/coverage-v8@2.1.9': - resolution: {integrity: sha512-Z2cOr0ksM00MpEfyVE8KXIYPEcBFxdbLSs56L8PO0QQMxt/6bDj45uQfxoc96v05KW3clk7vvgP0qfDit9DmfQ==} + '@vitest/coverage-v8@3.1.1': + resolution: {integrity: sha512-MgV6D2dhpD6Hp/uroUoAIvFqA8AuvXEFBC2eepG3WFc1pxTfdk1LEqqkWoWhjz+rytoqrnUUCdf6Lzco3iHkLQ==} peerDependencies: - '@vitest/browser': 2.1.9 - vitest: 2.1.9 + '@vitest/browser': 3.1.1 + vitest: 3.1.1 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@2.1.9': - resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} + '@vitest/expect@3.1.1': + resolution: {integrity: sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA==} - '@vitest/mocker@2.1.9': - resolution: {integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==} + '@vitest/mocker@3.1.1': + resolution: {integrity: sha512-bmpJJm7Y7i9BBELlLuuM1J1Q6EQ6K5Ye4wcyOpOMXMcePYKSIYlpcrCm4l/O6ja4VJA5G2aMJiuZkZdnxlC3SA==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 + vite: ^5.0.0 || ^6.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@2.1.9': - resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} + '@vitest/pretty-format@3.1.1': + resolution: {integrity: sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==} - '@vitest/runner@2.1.9': - resolution: {integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==} + '@vitest/runner@3.1.1': + resolution: {integrity: sha512-X/d46qzJuEDO8ueyjtKfxffiXraPRfmYasoC4i5+mlLEJ10UvPb0XH5M9C3gWuxd7BAQhpK42cJgJtq53YnWVA==} - '@vitest/snapshot@2.1.9': - resolution: {integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==} + '@vitest/snapshot@3.1.1': + resolution: {integrity: sha512-bByMwaVWe/+1WDf9exFxWWgAixelSdiwo2p33tpqIlM14vW7PRV5ppayVXtfycqze4Qhtwag5sVhX400MLBOOw==} - '@vitest/spy@2.1.9': - resolution: {integrity: sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==} + '@vitest/spy@3.1.1': + resolution: {integrity: sha512-+EmrUOOXbKzLkTDwlsc/xrwOlPDXyVk3Z6P6K4oiCndxz7YLpp/0R0UsWVOKT0IXWjjBJuSMk6D27qipaupcvQ==} - '@vitest/ui@2.1.9': - resolution: {integrity: sha512-izzd2zmnk8Nl5ECYkW27328RbQ1nKvkm6Bb5DAaz1Gk59EbLkiCMa6OLT0NoaAYTjOFS6N+SMYW1nh4/9ljPiw==} + '@vitest/ui@3.1.1': + resolution: {integrity: sha512-2HpiRIYg3dlvAJBV9RtsVswFgUSJK4Sv7QhpxoP0eBGkYwzGIKP34PjaV00AULQi9Ovl6LGyZfsetxDWY5BQdQ==} peerDependencies: - vitest: 2.1.9 + vitest: 3.1.1 - '@vitest/utils@2.1.9': - resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} + '@vitest/utils@3.1.1': + resolution: {integrity: sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==} abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} @@ -1072,8 +1073,8 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} pathval@2.0.0: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} @@ -1237,8 +1238,8 @@ packages: resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} engines: {node: ^18.0.0 || >=20.0.0} - tinyrainbow@1.2.0: - resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} tinyspy@3.0.2: @@ -1302,9 +1303,9 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - vite-node@2.1.9: - resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} - engines: {node: ^18.0.0 || >=20.0.0} + vite-node@3.1.1: + resolution: {integrity: sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true vite@5.4.15: @@ -1338,20 +1339,23 @@ packages: terser: optional: true - vitest@2.1.9: - resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==} - engines: {node: ^18.0.0 || >=20.0.0} + vitest@3.1.1: + resolution: {integrity: sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.1.9 - '@vitest/ui': 2.1.9 + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.1.1 + '@vitest/ui': 3.1.1 happy-dom: '*' jsdom: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true + '@types/debug': + optional: true '@types/node': optional: true '@vitest/browser': @@ -1430,7 +1434,7 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@bcoe/v8-coverage@0.2.3': {} + '@bcoe/v8-coverage@1.0.2': {} '@esbuild/aix-ppc64@0.21.5': optional: true @@ -1793,10 +1797,10 @@ snapshots: '@typescript-eslint/types': 8.28.0 eslint-visitor-keys: 4.2.0 - '@vitest/coverage-v8@2.1.9(vitest@2.1.9(@types/node@22.13.13)(@vitest/ui@2.1.9))': + '@vitest/coverage-v8@3.1.1(vitest@3.1.1(@types/node@22.13.13)(@vitest/ui@3.1.1))': dependencies: '@ampproject/remapping': 2.3.0 - '@bcoe/v8-coverage': 0.2.3 + '@bcoe/v8-coverage': 1.0.2 debug: 4.4.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 @@ -1806,61 +1810,61 @@ snapshots: magicast: 0.3.5 std-env: 3.8.1 test-exclude: 7.0.1 - tinyrainbow: 1.2.0 - vitest: 2.1.9(@types/node@22.13.13)(@vitest/ui@2.1.9) + tinyrainbow: 2.0.0 + vitest: 3.1.1(@types/node@22.13.13)(@vitest/ui@3.1.1) transitivePeerDependencies: - supports-color - '@vitest/expect@2.1.9': + '@vitest/expect@3.1.1': dependencies: - '@vitest/spy': 2.1.9 - '@vitest/utils': 2.1.9 + '@vitest/spy': 3.1.1 + '@vitest/utils': 3.1.1 chai: 5.2.0 - tinyrainbow: 1.2.0 + tinyrainbow: 2.0.0 - '@vitest/mocker@2.1.9(vite@5.4.15(@types/node@22.13.13))': + '@vitest/mocker@3.1.1(vite@5.4.15(@types/node@22.13.13))': dependencies: - '@vitest/spy': 2.1.9 + '@vitest/spy': 3.1.1 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: vite: 5.4.15(@types/node@22.13.13) - '@vitest/pretty-format@2.1.9': + '@vitest/pretty-format@3.1.1': dependencies: - tinyrainbow: 1.2.0 + tinyrainbow: 2.0.0 - '@vitest/runner@2.1.9': + '@vitest/runner@3.1.1': dependencies: - '@vitest/utils': 2.1.9 - pathe: 1.1.2 + '@vitest/utils': 3.1.1 + pathe: 2.0.3 - '@vitest/snapshot@2.1.9': + '@vitest/snapshot@3.1.1': dependencies: - '@vitest/pretty-format': 2.1.9 + '@vitest/pretty-format': 3.1.1 magic-string: 0.30.17 - pathe: 1.1.2 + pathe: 2.0.3 - '@vitest/spy@2.1.9': + '@vitest/spy@3.1.1': dependencies: tinyspy: 3.0.2 - '@vitest/ui@2.1.9(vitest@2.1.9)': + '@vitest/ui@3.1.1(vitest@3.1.1)': dependencies: - '@vitest/utils': 2.1.9 + '@vitest/utils': 3.1.1 fflate: 0.8.2 flatted: 3.3.3 - pathe: 1.1.2 + pathe: 2.0.3 sirv: 3.0.1 tinyglobby: 0.2.12 - tinyrainbow: 1.2.0 - vitest: 2.1.9(@types/node@22.13.13)(@vitest/ui@2.1.9) + tinyrainbow: 2.0.0 + vitest: 3.1.1(@types/node@22.13.13)(@vitest/ui@3.1.1) - '@vitest/utils@2.1.9': + '@vitest/utils@3.1.1': dependencies: - '@vitest/pretty-format': 2.1.9 + '@vitest/pretty-format': 3.1.1 loupe: 3.1.3 - tinyrainbow: 1.2.0 + tinyrainbow: 2.0.0 abort-controller@3.0.0: dependencies: @@ -2339,7 +2343,7 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 - pathe@1.1.2: {} + pathe@2.0.3: {} pathval@2.0.0: {} @@ -2504,7 +2508,7 @@ snapshots: tinypool@1.0.2: {} - tinyrainbow@1.2.0: {} + tinyrainbow@2.0.0: {} tinyspy@3.0.2: {} @@ -2561,12 +2565,12 @@ snapshots: dependencies: punycode: 2.3.1 - vite-node@2.1.9(@types/node@22.13.13): + vite-node@3.1.1(@types/node@22.13.13): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 - pathe: 1.1.2 + pathe: 2.0.3 vite: 5.4.15(@types/node@22.13.13) transitivePeerDependencies: - '@types/node' @@ -2588,31 +2592,31 @@ snapshots: '@types/node': 22.13.13 fsevents: 2.3.3 - vitest@2.1.9(@types/node@22.13.13)(@vitest/ui@2.1.9): + vitest@3.1.1(@types/node@22.13.13)(@vitest/ui@3.1.1): dependencies: - '@vitest/expect': 2.1.9 - '@vitest/mocker': 2.1.9(vite@5.4.15(@types/node@22.13.13)) - '@vitest/pretty-format': 2.1.9 - '@vitest/runner': 2.1.9 - '@vitest/snapshot': 2.1.9 - '@vitest/spy': 2.1.9 - '@vitest/utils': 2.1.9 + '@vitest/expect': 3.1.1 + '@vitest/mocker': 3.1.1(vite@5.4.15(@types/node@22.13.13)) + '@vitest/pretty-format': 3.1.1 + '@vitest/runner': 3.1.1 + '@vitest/snapshot': 3.1.1 + '@vitest/spy': 3.1.1 + '@vitest/utils': 3.1.1 chai: 5.2.0 debug: 4.4.0 expect-type: 1.2.0 magic-string: 0.30.17 - pathe: 1.1.2 + pathe: 2.0.3 std-env: 3.8.1 tinybench: 2.9.0 tinyexec: 0.3.2 tinypool: 1.0.2 - tinyrainbow: 1.2.0 + tinyrainbow: 2.0.0 vite: 5.4.15(@types/node@22.13.13) - vite-node: 2.1.9(@types/node@22.13.13) + vite-node: 3.1.1(@types/node@22.13.13) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.13.13 - '@vitest/ui': 2.1.9(vitest@2.1.9) + '@vitest/ui': 3.1.1(vitest@3.1.1) transitivePeerDependencies: - less - lightningcss From 1517b8ec19522cd302b899aab07b7acbf4495894 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 14 Apr 2025 16:44:42 +0800 Subject: [PATCH 014/124] chore(deps): Update all non-major dependencies (#666) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 22 +-- pnpm-lock.yaml | 378 +++++++++++++++++++++++++++++-------------------- 2 files changed, 239 insertions(+), 161 deletions(-) diff --git a/package.json b/package.json index 24377080c..85aa6d317 100644 --- a/package.json +++ b/package.json @@ -49,24 +49,24 @@ ], "publisher": "Kathund", "devDependencies": { - "@8hobbies/typedoc-plugin-404": "^3.1.0", - "@eslint/js": "^9.22.0", + "@8hobbies/typedoc-plugin-404": "^3.2.1", + "@eslint/js": "^9.24.0", "@j4cobi/eslint-plugin-sort-imports": "^1.0.2", "@types/eslint": "^9.6.1", - "@types/node": "^22.13.10", + "@types/node": "^22.14.1", "@types/xml2js": "^0.4.14", "@vitest/coverage-v8": "^3.1.1", "@vitest/ui": "^3.1.1", - "dotenv": "^16.4.7", - "eslint": "^9.22.0", - "eslint-config-prettier": "^10.1.1", + "dotenv": "^16.5.0", + "eslint": "^9.24.0", + "eslint-config-prettier": "^10.1.2", "globals": "^15.15.0", "prettier": "^3.5.3", - "typedoc": "^0.27.9", - "typedoc-material-theme": "^1.3.0", - "typedoc-plugin-rename-defaults": "^0.7.2", - "typescript": "^5.8.2", - "typescript-eslint": "^8.26.0", + "typedoc": "^0.28.2", + "typedoc-material-theme": "^1.4.0", + "typedoc-plugin-rename-defaults": "^0.7.3", + "typescript": "^5.8.3", + "typescript-eslint": "^8.29.1", "vitest": "^3.1.1", "xml2js": "^0.6.2" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 72b540afd..4dd933885 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,38 +22,38 @@ importers: version: 3.13.0 devDependencies: '@8hobbies/typedoc-plugin-404': - specifier: ^3.1.0 - version: 3.2.1(typedoc@0.27.9(typescript@5.8.2)) + specifier: ^3.2.1 + version: 3.2.1(typedoc@0.28.2(typescript@5.8.3)) '@eslint/js': - specifier: ^9.22.0 - version: 9.23.0 + specifier: ^9.24.0 + version: 9.24.0 '@j4cobi/eslint-plugin-sort-imports': specifier: ^1.0.2 - version: 1.0.2(eslint@9.23.0)(typescript@5.8.2) + version: 1.0.2(eslint@9.24.0)(typescript@5.8.3) '@types/eslint': specifier: ^9.6.1 version: 9.6.1 '@types/node': - specifier: ^22.13.10 - version: 22.13.13 + specifier: ^22.14.1 + version: 22.14.1 '@types/xml2js': specifier: ^0.4.14 version: 0.4.14 '@vitest/coverage-v8': specifier: ^3.1.1 - version: 3.1.1(vitest@3.1.1(@types/node@22.13.13)(@vitest/ui@3.1.1)) + version: 3.1.1(vitest@3.1.1(@types/node@22.14.1)(@vitest/ui@3.1.1)) '@vitest/ui': specifier: ^3.1.1 version: 3.1.1(vitest@3.1.1) dotenv: - specifier: ^16.4.7 - version: 16.4.7 + specifier: ^16.5.0 + version: 16.5.0 eslint: - specifier: ^9.22.0 - version: 9.23.0 + specifier: ^9.24.0 + version: 9.24.0 eslint-config-prettier: - specifier: ^10.1.1 - version: 10.1.1(eslint@9.23.0) + specifier: ^10.1.2 + version: 10.1.2(eslint@9.24.0) globals: specifier: ^15.15.0 version: 15.15.0 @@ -61,23 +61,23 @@ importers: specifier: ^3.5.3 version: 3.5.3 typedoc: - specifier: ^0.27.9 - version: 0.27.9(typescript@5.8.2) + specifier: ^0.28.2 + version: 0.28.2(typescript@5.8.3) typedoc-material-theme: - specifier: ^1.3.0 - version: 1.3.0(typedoc@0.27.9(typescript@5.8.2)) + specifier: ^1.4.0 + version: 1.4.0(typedoc@0.28.2(typescript@5.8.3)) typedoc-plugin-rename-defaults: - specifier: ^0.7.2 - version: 0.7.3(typedoc@0.27.9(typescript@5.8.2)) + specifier: ^0.7.3 + version: 0.7.3(typedoc@0.28.2(typescript@5.8.3)) typescript: - specifier: ^5.8.2 - version: 5.8.2 + specifier: ^5.8.3 + version: 5.8.3 typescript-eslint: - specifier: ^8.26.0 - version: 8.28.0(eslint@9.23.0)(typescript@5.8.2) + specifier: ^8.29.1 + version: 8.29.1(eslint@9.24.0)(typescript@5.8.3) vitest: specifier: ^3.1.1 - version: 3.1.1(@types/node@22.13.13)(@vitest/ui@3.1.1) + version: 3.1.1(@types/node@22.14.1)(@vitest/ui@3.1.1) xml2js: specifier: ^0.6.2 version: 0.6.2 @@ -263,8 +263,8 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.19.2': - resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} + '@eslint/config-array@0.20.0': + resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/config-helpers@0.2.0': @@ -279,8 +279,8 @@ packages: resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.23.0': - resolution: {integrity: sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==} + '@eslint/js@9.24.0': + resolution: {integrity: sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': @@ -291,8 +291,8 @@ packages: resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@gerrit0/mini-shiki@1.27.2': - resolution: {integrity: sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==} + '@gerrit0/mini-shiki@3.2.3': + resolution: {integrity: sha512-yemSYr0Oiqk5NAQRfbD5DKUTlThiZw1MxTMx/YpQTg6m4QRJDtV2JTYSuNevgx1ayy/O7x+uwDjh3IgECGFY/Q==} '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} @@ -465,11 +465,17 @@ packages: cpu: [x64] os: [win32] - '@shikijs/engine-oniguruma@1.29.2': - resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} + '@shikijs/engine-oniguruma@3.2.2': + resolution: {integrity: sha512-vyXRnWVCSvokwbaUD/8uPn6Gqsf5Hv7XwcW4AgiU4Z2qwy19sdr6VGzMdheKKN58tJOOe5MIKiNb901bgcUXYQ==} - '@shikijs/types@1.29.2': - resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} + '@shikijs/langs@3.2.2': + resolution: {integrity: sha512-NY0Urg2dV9ETt3JIOWoMPuoDNwte3geLZ4M1nrPHbkDS8dWMpKcEwlqiEIGqtwZNmt5gKyWpR26ln2Bg2ecPgw==} + + '@shikijs/themes@3.2.2': + resolution: {integrity: sha512-Zuq4lgAxVKkb0FFdhHSdDkALuRpsj1so1JdihjKNQfgM78EHxV2JhO10qPsMrm01FkE3mDRTdF68wfmsqjt6HA==} + + '@shikijs/types@3.2.2': + resolution: {integrity: sha512-a5TiHk7EH5Lso8sHcLHbVNNhWKP0Wi3yVnXnu73g86n3WoDgEra7n3KszyeCGuyoagspQ2fzvy4cpSc8pKhb0A==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} @@ -489,8 +495,8 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@22.13.13': - resolution: {integrity: sha512-ClsL5nMwKaBRwPcCvH8E7+nU4GxHVx1axNvMZTFHMEfNI7oahimt26P5zjVCRrjiIWj6YFXfE1v3dEp94wLcGQ==} + '@types/node@22.14.1': + resolution: {integrity: sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==} '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -498,16 +504,16 @@ packages: '@types/xml2js@0.4.14': resolution: {integrity: sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==} - '@typescript-eslint/eslint-plugin@8.28.0': - resolution: {integrity: sha512-lvFK3TCGAHsItNdWZ/1FkvpzCxTHUVuFrdnOGLMa0GGCFIbCgQWVk3CzCGdA7kM3qGVc+dfW9tr0Z/sHnGDFyg==} + '@typescript-eslint/eslint-plugin@8.29.1': + resolution: {integrity: sha512-ba0rr4Wfvg23vERs3eB+P3lfj2E+2g3lhWcCVukUuhtcdUx5lSIFZlGFEBHKr+3zizDa/TvZTptdNHVZWAkSBg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.28.0': - resolution: {integrity: sha512-LPcw1yHD3ToaDEoljFEfQ9j2xShY367h7FZ1sq5NJT9I3yj4LHer1Xd1yRSOdYy9BpsrxU7R+eoDokChYM53lQ==} + '@typescript-eslint/parser@8.29.1': + resolution: {integrity: sha512-zczrHVEqEaTwh12gWBIJWj8nx+ayDcCJs06yoNMY0kwjMWDM6+kppljY+BxWI06d2Ja+h4+WdufDcwMnnMEWmg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -517,8 +523,12 @@ packages: resolution: {integrity: sha512-u2oITX3BJwzWCapoZ/pXw6BCOl8rJP4Ij/3wPoGvY8XwvXflOzd1kLrDUUUAIEdJSFh+ASwdTHqtan9xSg8buw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.28.0': - resolution: {integrity: sha512-oRoXu2v0Rsy/VoOGhtWrOKDiIehvI+YNrDk5Oqj40Mwm0Yt01FC/Q7nFqg088d3yAsR1ZcZFVfPCTTFCe/KPwg==} + '@typescript-eslint/scope-manager@8.29.1': + resolution: {integrity: sha512-2nggXGX5F3YrsGN08pw4XpMLO1Rgtnn4AzTegC2MDesv6q3QaTU5yU7IbS1tf1IwCR0Hv/1EFygLn9ms6LIpDA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.29.1': + resolution: {integrity: sha512-DkDUSDwZVCYN71xA4wzySqqcZsHKic53A4BLqmrWFFpOpNSoxX233lwGu/2135ymTCR04PoKiEEEvN1gFYg4Tw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -528,12 +538,22 @@ packages: resolution: {integrity: sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.29.1': + resolution: {integrity: sha512-VT7T1PuJF1hpYC3AGm2rCgJBjHL3nc+A/bhOp9sGMKfi5v0WufsX/sHCFBfNTx2F+zA6qBc/PD0/kLRLjdt8mQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.28.0': resolution: {integrity: sha512-H74nHEeBGeklctAVUvmDkxB1mk+PAZ9FiOMPFncdqeRBXxk1lWSYraHw8V12b7aa6Sg9HOBNbGdSHobBPuQSuA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/typescript-estree@8.29.1': + resolution: {integrity: sha512-l1enRoSaUkQxOQnbi0KPUtqeZkSiFlqrx9/3ns2rEDhGKfTa+88RmXqedC1zmVTOWrLc2e6DEJrTA51C9iLH5g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/utils@8.28.0': resolution: {integrity: sha512-OELa9hbTYciYITqgurT1u/SzpQVtDLmQMFzy/N8pQE+tefOyCWT79jHsav294aTqV1q1u+VzqDGbuujvRYaeSQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -541,10 +561,21 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/utils@8.29.1': + resolution: {integrity: sha512-QAkFEbytSaB8wnmB+DflhUPz6CLbFWE2SnSCrRMEa+KnXIzDYbpsn++1HGvnfAsUY44doDXmvRkO5shlM/3UfA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/visitor-keys@8.28.0': resolution: {integrity: sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.29.1': + resolution: {integrity: sha512-RGLh5CRaUEf02viP5c1Vh1cMGffQscyHe7HPAzGpfmfflFg1wUz2rYxd+OZqwpeypYvZ8UxSxuIpF++fmOzEcg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@vitest/coverage-v8@3.1.1': resolution: {integrity: sha512-MgV6D2dhpD6Hp/uroUoAIvFqA8AuvXEFBC2eepG3WFc1pxTfdk1LEqqkWoWhjz+rytoqrnUUCdf6Lzco3iHkLQ==} peerDependencies: @@ -705,8 +736,8 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dotenv@16.4.7: - resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + dotenv@16.5.0: + resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} engines: {node: '>=12'} eastasianwidth@0.2.0: @@ -737,8 +768,8 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-prettier@10.1.1: - resolution: {integrity: sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==} + eslint-config-prettier@10.1.2: + resolution: {integrity: sha512-Epgp/EofAUeEpIdZkW60MHKvPyru1ruQJxPL+WIycnaPApuseK0Zpkrh/FwL9oIpQvIhJwV7ptOy0DWUjTlCiA==} hasBin: true peerDependencies: eslint: '>=7.0.0' @@ -755,8 +786,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.23.0: - resolution: {integrity: sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==} + eslint@9.24.0: + resolution: {integrity: sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1264,41 +1295,41 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - typedoc-material-theme@1.3.0: - resolution: {integrity: sha512-4vY68NUBBkMc3gKAltDtvT0KbIYX1uaFAT/3brDwhnUxhfTiYRtfg8VXR2lr8f+9VNDh7BfEtj8gpRO7Y93TWQ==} + typedoc-material-theme@1.4.0: + resolution: {integrity: sha512-TBoBpX/4zWO6l74/wBLivXHC2rIiD70KXMliYrw1KhcqdybyxkVBLP5z8KiJuNV8aQIeS+rK2QG6GSucQHJQDQ==} engines: {node: '>=18.0.0', npm: '>=8.6.0'} peerDependencies: - typedoc: ^0.25.13 || ^0.26.x || ^0.27.x + typedoc: ^0.25.13 || ^0.26.x || ^0.27.x || ^0.28.x typedoc-plugin-rename-defaults@0.7.3: resolution: {integrity: sha512-fDtrWZ9NcDfdGdlL865GW7uIGQXlthPscURPOhDkKUe4DBQSRRFUf33fhWw41FLlsz8ZTeSxzvvuNmh54MynFA==} peerDependencies: typedoc: '>=0.22.x <0.29.x' - typedoc@0.27.9: - resolution: {integrity: sha512-/z585740YHURLl9DN2jCWe6OW7zKYm6VoQ93H0sxZ1cwHQEQrUn5BJrEnkWhfzUdyO+BLGjnKUZ9iz9hKloFDw==} - engines: {node: '>= 18'} + typedoc@0.28.2: + resolution: {integrity: sha512-9Giuv+eppFKnJ0oi+vxqLM817b/IrIsEMYgy3jj6zdvppAfDqV3d6DXL2vXUg2TnlL62V48th25Zf/tcQKAJdg==} + engines: {node: '>= 18', pnpm: '>= 10'} hasBin: true peerDependencies: typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x - typescript-eslint@8.28.0: - resolution: {integrity: sha512-jfZtxJoHm59bvoCMYCe2BM0/baMswRhMmYhy+w6VfcyHrjxZ0OJe0tGasydCpIpA+A/WIJhTyZfb3EtwNC/kHQ==} + typescript-eslint@8.29.1: + resolution: {integrity: sha512-f8cDkvndhbQMPcysk6CUSGBWV+g1utqdn71P5YKwMumVMOG/5k7cHq0KyG4O52nB0oKS4aN2Tp5+wB4APJGC+w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - typescript@5.8.2: - resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} hasBin: true uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - undici-types@6.20.0: - resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -1401,8 +1432,8 @@ packages: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} - yaml@2.7.0: - resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} + yaml@2.7.1: + resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} engines: {node: '>= 14'} hasBin: true @@ -1412,9 +1443,9 @@ packages: snapshots: - '@8hobbies/typedoc-plugin-404@3.2.1(typedoc@0.27.9(typescript@5.8.2))': + '@8hobbies/typedoc-plugin-404@3.2.1(typedoc@0.28.2(typescript@5.8.3))': dependencies: - typedoc: 0.27.9(typescript@5.8.2) + typedoc: 0.28.2(typescript@5.8.3) '@ampproject/remapping@2.3.0': dependencies: @@ -1505,14 +1536,14 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.5.1(eslint@9.23.0)': + '@eslint-community/eslint-utils@4.5.1(eslint@9.24.0)': dependencies: - eslint: 9.23.0 + eslint: 9.24.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.19.2': + '@eslint/config-array@0.20.0': dependencies: '@eslint/object-schema': 2.1.6 debug: 4.4.0 @@ -1540,7 +1571,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.23.0': {} + '@eslint/js@9.24.0': {} '@eslint/object-schema@2.1.6': {} @@ -1549,10 +1580,12 @@ snapshots: '@eslint/core': 0.12.0 levn: 0.4.1 - '@gerrit0/mini-shiki@1.27.2': + '@gerrit0/mini-shiki@3.2.3': dependencies: - '@shikijs/engine-oniguruma': 1.29.2 - '@shikijs/types': 1.29.2 + '@shikijs/engine-oniguruma': 3.2.2 + '@shikijs/langs': 3.2.2 + '@shikijs/themes': 3.2.2 + '@shikijs/types': 3.2.2 '@shikijs/vscode-textmate': 10.0.2 '@humanfs/core@0.19.1': {} @@ -1579,9 +1612,9 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@j4cobi/eslint-plugin-sort-imports@1.0.2(eslint@9.23.0)(typescript@5.8.2)': + '@j4cobi/eslint-plugin-sort-imports@1.0.2(eslint@9.24.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/utils': 8.28.0(eslint@9.23.0)(typescript@5.8.2) + '@typescript-eslint/utils': 8.28.0(eslint@9.24.0)(typescript@5.8.3) transitivePeerDependencies: - eslint - supports-color @@ -1683,12 +1716,20 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.37.0': optional: true - '@shikijs/engine-oniguruma@1.29.2': + '@shikijs/engine-oniguruma@3.2.2': dependencies: - '@shikijs/types': 1.29.2 + '@shikijs/types': 3.2.2 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/types@1.29.2': + '@shikijs/langs@3.2.2': + dependencies: + '@shikijs/types': 3.2.2 + + '@shikijs/themes@3.2.2': + dependencies: + '@shikijs/types': 3.2.2 + + '@shikijs/types@3.2.2': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -1710,42 +1751,42 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@22.13.13': + '@types/node@22.14.1': dependencies: - undici-types: 6.20.0 + undici-types: 6.21.0 '@types/unist@3.0.3': {} '@types/xml2js@0.4.14': dependencies: - '@types/node': 22.13.13 + '@types/node': 22.14.1 - '@typescript-eslint/eslint-plugin@8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2)': + '@typescript-eslint/eslint-plugin@8.29.1(@typescript-eslint/parser@8.29.1(eslint@9.24.0)(typescript@5.8.3))(eslint@9.24.0)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.28.0(eslint@9.23.0)(typescript@5.8.2) - '@typescript-eslint/scope-manager': 8.28.0 - '@typescript-eslint/type-utils': 8.28.0(eslint@9.23.0)(typescript@5.8.2) - '@typescript-eslint/utils': 8.28.0(eslint@9.23.0)(typescript@5.8.2) - '@typescript-eslint/visitor-keys': 8.28.0 - eslint: 9.23.0 + '@typescript-eslint/parser': 8.29.1(eslint@9.24.0)(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.29.1 + '@typescript-eslint/type-utils': 8.29.1(eslint@9.24.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.29.1(eslint@9.24.0)(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.29.1 + eslint: 9.24.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.2) - typescript: 5.8.2 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.28.0(eslint@9.23.0)(typescript@5.8.2)': + '@typescript-eslint/parser@8.29.1(eslint@9.24.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 8.28.0 - '@typescript-eslint/types': 8.28.0 - '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.2) - '@typescript-eslint/visitor-keys': 8.28.0 + '@typescript-eslint/scope-manager': 8.29.1 + '@typescript-eslint/types': 8.29.1 + '@typescript-eslint/typescript-estree': 8.29.1(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.29.1 debug: 4.4.0 - eslint: 9.23.0 - typescript: 5.8.2 + eslint: 9.24.0 + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -1754,20 +1795,27 @@ snapshots: '@typescript-eslint/types': 8.28.0 '@typescript-eslint/visitor-keys': 8.28.0 - '@typescript-eslint/type-utils@8.28.0(eslint@9.23.0)(typescript@5.8.2)': + '@typescript-eslint/scope-manager@8.29.1': dependencies: - '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.2) - '@typescript-eslint/utils': 8.28.0(eslint@9.23.0)(typescript@5.8.2) + '@typescript-eslint/types': 8.29.1 + '@typescript-eslint/visitor-keys': 8.29.1 + + '@typescript-eslint/type-utils@8.29.1(eslint@9.24.0)(typescript@5.8.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.29.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.29.1(eslint@9.24.0)(typescript@5.8.3) debug: 4.4.0 - eslint: 9.23.0 - ts-api-utils: 2.1.0(typescript@5.8.2) - typescript: 5.8.2 + eslint: 9.24.0 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.28.0': {} - '@typescript-eslint/typescript-estree@8.28.0(typescript@5.8.2)': + '@typescript-eslint/types@8.29.1': {} + + '@typescript-eslint/typescript-estree@8.28.0(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 8.28.0 '@typescript-eslint/visitor-keys': 8.28.0 @@ -1776,19 +1824,44 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.1 - ts-api-utils: 2.1.0(typescript@5.8.2) - typescript: 5.8.2 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@8.29.1(typescript@5.8.3)': + dependencies: + '@typescript-eslint/types': 8.29.1 + '@typescript-eslint/visitor-keys': 8.29.1 + debug: 4.4.0 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.1 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.28.0(eslint@9.23.0)(typescript@5.8.2)': + '@typescript-eslint/utils@8.28.0(eslint@9.24.0)(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0) + '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0) '@typescript-eslint/scope-manager': 8.28.0 '@typescript-eslint/types': 8.28.0 - '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.2) - eslint: 9.23.0 - typescript: 5.8.2 + '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.3) + eslint: 9.24.0 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.29.1(eslint@9.24.0)(typescript@5.8.3)': + dependencies: + '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0) + '@typescript-eslint/scope-manager': 8.29.1 + '@typescript-eslint/types': 8.29.1 + '@typescript-eslint/typescript-estree': 8.29.1(typescript@5.8.3) + eslint: 9.24.0 + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -1797,7 +1870,12 @@ snapshots: '@typescript-eslint/types': 8.28.0 eslint-visitor-keys: 4.2.0 - '@vitest/coverage-v8@3.1.1(vitest@3.1.1(@types/node@22.13.13)(@vitest/ui@3.1.1))': + '@typescript-eslint/visitor-keys@8.29.1': + dependencies: + '@typescript-eslint/types': 8.29.1 + eslint-visitor-keys: 4.2.0 + + '@vitest/coverage-v8@3.1.1(vitest@3.1.1(@types/node@22.14.1)(@vitest/ui@3.1.1))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -1811,7 +1889,7 @@ snapshots: std-env: 3.8.1 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.1.1(@types/node@22.13.13)(@vitest/ui@3.1.1) + vitest: 3.1.1(@types/node@22.14.1)(@vitest/ui@3.1.1) transitivePeerDependencies: - supports-color @@ -1822,13 +1900,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.1(vite@5.4.15(@types/node@22.13.13))': + '@vitest/mocker@3.1.1(vite@5.4.15(@types/node@22.14.1))': dependencies: '@vitest/spy': 3.1.1 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 5.4.15(@types/node@22.13.13) + vite: 5.4.15(@types/node@22.14.1) '@vitest/pretty-format@3.1.1': dependencies: @@ -1858,7 +1936,7 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.12 tinyrainbow: 2.0.0 - vitest: 3.1.1(@types/node@22.13.13)(@vitest/ui@3.1.1) + vitest: 3.1.1(@types/node@22.14.1)(@vitest/ui@3.1.1) '@vitest/utils@3.1.1': dependencies: @@ -1964,7 +2042,7 @@ snapshots: deep-is@0.1.4: {} - dotenv@16.4.7: {} + dotenv@16.5.0: {} eastasianwidth@0.2.0: {} @@ -2006,9 +2084,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.1(eslint@9.23.0): + eslint-config-prettier@10.1.2(eslint@9.24.0): dependencies: - eslint: 9.23.0 + eslint: 9.24.0 eslint-scope@8.3.0: dependencies: @@ -2019,15 +2097,15 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.23.0: + eslint@9.24.0: dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0) + '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.2 + '@eslint/config-array': 0.20.0 '@eslint/config-helpers': 0.2.0 '@eslint/core': 0.12.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.23.0 + '@eslint/js': 9.24.0 '@eslint/plugin-kit': 0.2.7 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 @@ -2518,60 +2596,60 @@ snapshots: totalist@3.0.1: {} - ts-api-utils@2.1.0(typescript@5.8.2): + ts-api-utils@2.1.0(typescript@5.8.3): dependencies: - typescript: 5.8.2 + typescript: 5.8.3 type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - typedoc-material-theme@1.3.0(typedoc@0.27.9(typescript@5.8.2)): + typedoc-material-theme@1.4.0(typedoc@0.28.2(typescript@5.8.3)): dependencies: '@material/material-color-utilities': 0.3.0 - typedoc: 0.27.9(typescript@5.8.2) + typedoc: 0.28.2(typescript@5.8.3) - typedoc-plugin-rename-defaults@0.7.3(typedoc@0.27.9(typescript@5.8.2)): + typedoc-plugin-rename-defaults@0.7.3(typedoc@0.28.2(typescript@5.8.3)): dependencies: camelcase: 8.0.0 - typedoc: 0.27.9(typescript@5.8.2) + typedoc: 0.28.2(typescript@5.8.3) - typedoc@0.27.9(typescript@5.8.2): + typedoc@0.28.2(typescript@5.8.3): dependencies: - '@gerrit0/mini-shiki': 1.27.2 + '@gerrit0/mini-shiki': 3.2.3 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 - typescript: 5.8.2 - yaml: 2.7.0 + typescript: 5.8.3 + yaml: 2.7.1 - typescript-eslint@8.28.0(eslint@9.23.0)(typescript@5.8.2): + typescript-eslint@8.29.1(eslint@9.24.0)(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2) - '@typescript-eslint/parser': 8.28.0(eslint@9.23.0)(typescript@5.8.2) - '@typescript-eslint/utils': 8.28.0(eslint@9.23.0)(typescript@5.8.2) - eslint: 9.23.0 - typescript: 5.8.2 + '@typescript-eslint/eslint-plugin': 8.29.1(@typescript-eslint/parser@8.29.1(eslint@9.24.0)(typescript@5.8.3))(eslint@9.24.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.29.1(eslint@9.24.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.29.1(eslint@9.24.0)(typescript@5.8.3) + eslint: 9.24.0 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - typescript@5.8.2: {} + typescript@5.8.3: {} uc.micro@2.1.0: {} - undici-types@6.20.0: {} + undici-types@6.21.0: {} uri-js@4.4.1: dependencies: punycode: 2.3.1 - vite-node@3.1.1(@types/node@22.13.13): + vite-node@3.1.1(@types/node@22.14.1): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 5.4.15(@types/node@22.13.13) + vite: 5.4.15(@types/node@22.14.1) transitivePeerDependencies: - '@types/node' - less @@ -2583,19 +2661,19 @@ snapshots: - supports-color - terser - vite@5.4.15(@types/node@22.13.13): + vite@5.4.15(@types/node@22.14.1): dependencies: esbuild: 0.21.5 postcss: 8.5.3 rollup: 4.37.0 optionalDependencies: - '@types/node': 22.13.13 + '@types/node': 22.14.1 fsevents: 2.3.3 - vitest@3.1.1(@types/node@22.13.13)(@vitest/ui@3.1.1): + vitest@3.1.1(@types/node@22.14.1)(@vitest/ui@3.1.1): dependencies: '@vitest/expect': 3.1.1 - '@vitest/mocker': 3.1.1(vite@5.4.15(@types/node@22.13.13)) + '@vitest/mocker': 3.1.1(vite@5.4.15(@types/node@22.14.1)) '@vitest/pretty-format': 3.1.1 '@vitest/runner': 3.1.1 '@vitest/snapshot': 3.1.1 @@ -2611,11 +2689,11 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 5.4.15(@types/node@22.13.13) - vite-node: 3.1.1(@types/node@22.13.13) + vite: 5.4.15(@types/node@22.14.1) + vite-node: 3.1.1(@types/node@22.14.1) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.13.13 + '@types/node': 22.14.1 '@vitest/ui': 3.1.1(vitest@3.1.1) transitivePeerDependencies: - less @@ -2663,6 +2741,6 @@ snapshots: xmlbuilder@11.0.1: {} - yaml@2.7.0: {} + yaml@2.7.1: {} yocto-queue@0.1.0: {} From 9aacbf7e654a19402d2a9b6ac9622a757c72769b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 14 Apr 2025 08:46:30 +0000 Subject: [PATCH 015/124] chore(deps): update dependency globals to v16 (#667) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 85aa6d317..0e60ea2db 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "dotenv": "^16.5.0", "eslint": "^9.24.0", "eslint-config-prettier": "^10.1.2", - "globals": "^15.15.0", + "globals": "^16.0.0", "prettier": "^3.5.3", "typedoc": "^0.28.2", "typedoc-material-theme": "^1.4.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4dd933885..5af6e1c54 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -55,8 +55,8 @@ importers: specifier: ^10.1.2 version: 10.1.2(eslint@9.24.0) globals: - specifier: ^15.15.0 - version: 15.15.0 + specifier: ^16.0.0 + version: 16.0.0 prettier: specifier: ^3.5.3 version: 3.5.3 @@ -902,8 +902,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.15.0: - resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + globals@16.0.0: + resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==} engines: {node: '>=18'} graphemer@1.4.0: @@ -2236,7 +2236,7 @@ snapshots: globals@14.0.0: {} - globals@15.15.0: {} + globals@16.0.0: {} graphemer@1.4.0: {} From e4edcd3b1686bf95bb908a3c65edfcbdfdf63456 Mon Sep 17 00:00:00 2001 From: Jacob Date: Mon, 14 Apr 2025 17:51:43 +0800 Subject: [PATCH 016/124] fix possible null when decoding --- .../Inventory/SkyBlockInventoryItem.ts | 37 +++++++++++++++++++ .../Armor/SkyBlockMemberInventoriesArmor.ts | 2 +- .../SkyBlockMemberInventoriesBackpack.ts | 4 +- .../SkyBlockMemberInventoriesBagsTalisman.ts | 2 +- .../SkyBlockMemberInventoriesEquipment.ts | 2 +- .../SkyBlockMemberInventoriesInventory.ts | 2 +- src/Types/SkyBlock.ts | 6 ++- src/Utils/Constants.ts | 1 + 8 files changed, 48 insertions(+), 8 deletions(-) diff --git a/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.ts b/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.ts index caa1f63d1..d17940fd2 100644 --- a/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.ts +++ b/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.ts @@ -5,6 +5,42 @@ import SkyBlockPotionEffect from '../Potion/SkyBlockPotionEffect.js'; import type { Rarity } from '../../../Types/SkyBlock.js'; import type { UUID } from '../../../Types/Global.js'; +import { readFileSync, writeFileSync } from 'fs'; + +function mergeJson(masterJson: any, newJson: any): any { + for (const key in newJson) { + if (Array.isArray(newJson[key])) { + if (Array.isArray(masterJson[key])) { + const existingArray = masterJson[key]; + const newArray = newJson[key]; + + for (const item of newArray) { + if (!existingArray.some((existingItem: any) => JSON.stringify(existingItem) === JSON.stringify(item))) { + existingArray.push(item); + } + } + } else { + masterJson[key] = [...newJson[key]]; + } + } else if ('object' === typeof newJson[key] && null !== newJson[key] && !Array.isArray(newJson[key])) { + if (!masterJson[key] || 'object' !== typeof masterJson[key]) { + masterJson[key] = {}; + } + mergeJson(masterJson[key], newJson[key]); + } else { + masterJson[key] = newJson[key]; + } + } + + return masterJson; +} + +export function handle(data: Record) { + const oldData = JSON.parse(readFileSync('data.json', 'utf-8')); + const newJson = mergeJson(oldData, data); + writeFileSync('data.json', JSON.stringify(newJson)); +} + class SkyBlockInventoryItem { minecraftItemId: number; itemCount: number; @@ -76,6 +112,7 @@ class SkyBlockInventoryItem { rarity: Rarity; raw: Record; constructor(data: Record) { + handle(data); this.minecraftItemId = data?.id || 0; this.itemCount = data?.count || 1; this.itemDamage = data?.Damage || 0; diff --git a/src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmor.ts b/src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmor.ts index e75aa12c2..27129e2e7 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmor.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmor.ts @@ -4,7 +4,7 @@ import { decode } from '../../../../../Utils/SkyBlockUtils.js'; class SkyBlockMemberInventoriesArmor extends SkyBlockMemberInventoriesBaseInventory { override async decodeData(): Promise { - if (this.base64 === undefined) return null; + if (undefined === this.base64 || null === this.base64) return null; const decoded = await decode(this.base64); return new SkyBlockMemberInventoriesArmorDecoded(decoded); } diff --git a/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.ts b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.ts index 974dffd71..ab30a08b7 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.ts @@ -10,8 +10,8 @@ class SkyBlockMemberInventoriesBackpack { } async decodeData(): Promise { - if (this.backpackItemBase64 === undefined) return null; - if (this.backpackContentsBase64 === undefined) return null; + if (undefined === this.backpackItemBase64 || null === this.backpackItemBase64) return null; + if (undefined === this.backpackContentsBase64 || null === this.backpackContentsBase64) return null; const backpackIconDecoded = await decode(this.backpackItemBase64); const backpackItemsDecoded = await decode(this.backpackContentsBase64); return new SkyBlockMemberInventoriesBackpackDecoded({ backpackIconDecoded, backpackItemsDecoded }); diff --git a/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalisman.ts b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalisman.ts index 7df1f6a18..c706c6920 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalisman.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalisman.ts @@ -4,7 +4,7 @@ import { decode } from '../../../../../Utils/SkyBlockUtils.js'; class SkyBlockMemberInventoriesBagsTalisman extends SkyBlockMemberInventoriesBaseInventory { override async decodeData(): Promise { - if (this.base64 === undefined) return null; + if (undefined === this.base64 || null === this.base64) return null; const decoded = await decode(this.base64); return new SkyBlockMemberInventoriesBagsTalismanDecoded(decoded); } diff --git a/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipment.ts b/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipment.ts index 5b128ac1d..d3c05f8a0 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipment.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipment.ts @@ -4,7 +4,7 @@ import { decode } from '../../../../../Utils/SkyBlockUtils.js'; class SkyBlockMemberInventoriesEquipment extends SkyBlockMemberInventoriesBaseInventory { override async decodeData(): Promise { - if (this.base64 === undefined) return null; + if (undefined === this.base64 || null === this.base64) return null; const decoded = await decode(this.base64); return new SkyBlockMemberInventoriesEquipmentDecoded(decoded); } diff --git a/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventory.ts b/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventory.ts index 6a3b217dd..536649d71 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventory.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventory.ts @@ -4,7 +4,7 @@ import { decode } from '../../../../../Utils/SkyBlockUtils.js'; class SkyBlockMemberInventoriesInventory extends SkyBlockMemberInventoriesBaseInventory { override async decodeData(): Promise { - if (this.base64 === undefined) return null; + if (undefined === this.base64 || null === this.base64) return null; const decoded = await decode(this.base64); return new SkyBlockMemberInventoriesInventoryDecoded(decoded); } diff --git a/src/Types/SkyBlock.ts b/src/Types/SkyBlock.ts index c940d2ac8..bb7f97c37 100644 --- a/src/Types/SkyBlock.ts +++ b/src/Types/SkyBlock.ts @@ -348,7 +348,8 @@ export type MiningForgeItemId = | 'TUNGSTEN_KEY' | 'UMBER_KEY' | 'SKELETON_KEY' - | 'PORTABLE_CAMPFIRE'; + | 'PORTABLE_CAMPFIRE' + | 'PET'; export type MiningForgeItemName = | 'Refined Diamond' @@ -527,7 +528,8 @@ export type SkyBlockMemberPower = | 'Strong' | 'Bubba' | 'Crumbly' - | 'Scorching'; + | 'Scorching' + | 'PET'; export type JacobCrops = | 'INK_SACK:3' diff --git a/src/Utils/Constants.ts b/src/Utils/Constants.ts index 6bcf32c6f..b5c0ca83b 100644 --- a/src/Utils/Constants.ts +++ b/src/Utils/Constants.ts @@ -295,6 +295,7 @@ export const MiningForgeItems: MiningForgeItemsData = { UMBER_KEY: { name: 'Umber Key', duration: 1800000 }, SKELETON_KEY: { name: 'Skeleton Key', duration: 1800000 }, PORTABLE_CAMPFIRE: { name: 'Portable Campfire', duration: 1800000 }, + PET: { name: 'PET', duration: 0 }, UNKNOWN: { name: 'UNKNOWN', duration: 0 } }; From 9f4528aa17a0d23fe7935586c974df8ed50be3b1 Mon Sep 17 00:00:00 2001 From: Jacob Date: Mon, 14 Apr 2025 19:15:53 +0800 Subject: [PATCH 017/124] remove testing code --- .../Inventory/SkyBlockInventoryItem.ts | 37 ------------------- 1 file changed, 37 deletions(-) diff --git a/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.ts b/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.ts index d17940fd2..caa1f63d1 100644 --- a/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.ts +++ b/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.ts @@ -5,42 +5,6 @@ import SkyBlockPotionEffect from '../Potion/SkyBlockPotionEffect.js'; import type { Rarity } from '../../../Types/SkyBlock.js'; import type { UUID } from '../../../Types/Global.js'; -import { readFileSync, writeFileSync } from 'fs'; - -function mergeJson(masterJson: any, newJson: any): any { - for (const key in newJson) { - if (Array.isArray(newJson[key])) { - if (Array.isArray(masterJson[key])) { - const existingArray = masterJson[key]; - const newArray = newJson[key]; - - for (const item of newArray) { - if (!existingArray.some((existingItem: any) => JSON.stringify(existingItem) === JSON.stringify(item))) { - existingArray.push(item); - } - } - } else { - masterJson[key] = [...newJson[key]]; - } - } else if ('object' === typeof newJson[key] && null !== newJson[key] && !Array.isArray(newJson[key])) { - if (!masterJson[key] || 'object' !== typeof masterJson[key]) { - masterJson[key] = {}; - } - mergeJson(masterJson[key], newJson[key]); - } else { - masterJson[key] = newJson[key]; - } - } - - return masterJson; -} - -export function handle(data: Record) { - const oldData = JSON.parse(readFileSync('data.json', 'utf-8')); - const newJson = mergeJson(oldData, data); - writeFileSync('data.json', JSON.stringify(newJson)); -} - class SkyBlockInventoryItem { minecraftItemId: number; itemCount: number; @@ -112,7 +76,6 @@ class SkyBlockInventoryItem { rarity: Rarity; raw: Record; constructor(data: Record) { - handle(data); this.minecraftItemId = data?.id || 0; this.itemCount = data?.count || 1; this.itemDamage = data?.Damage || 0; From 805204b0a622a842c32b6d957604664c73438df8 Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 16 Apr 2025 15:17:12 +0800 Subject: [PATCH 018/124] Repo Updates --- .gitignore | 6 ++---- .npmignore | 11 +++++------ .prettierignore | 8 +++++--- README.md | 27 +++++++++++---------------- package.json | 18 +++++++++--------- 5 files changed, 32 insertions(+), 38 deletions(-) diff --git a/.gitignore b/.gitignore index 0899c99e7..8b4dbe91a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,6 @@ node_modules/ -oldreborn/ -.env -dist/ -.eslintcache coverage/ .github/coverageData.xml documentation/ +dist/ +.env diff --git a/.npmignore b/.npmignore index 9d11b2ea3..1c334e7b0 100644 --- a/.npmignore +++ b/.npmignore @@ -1,9 +1,8 @@ node_modules/ -oldreborn/ -.env -.eslintcache -.git -.gitignore coverage/ -.github/coverageData.xml +.github/ documentation/ +.git/ +.vscode/ +.gitignore +.env diff --git a/.prettierignore b/.prettierignore index b7bf0c868..f2487af9c 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,6 +1,8 @@ -node_modules -coverage -dist +node_modules/ +coverage/ +documentation/ +dist/ +.env .env .env.example pnpm-lock.yaml diff --git a/README.md b/README.md index 86a7779be..6d8b17238 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,20 @@
- -

Hypixel API • Reborn

- - - - - - - - -

A feature-rich Hypixel API wrapper for Node.js

-
+ +

Hypixel API • Reborn

+ + + + +

A feature-rich Hypixel API wrapper for Node.js

### Links -[Discord Support](https://discord.gg/NSEBNMM) | [Documentation](https://hypixel-api-reborn.github.io/) | -[NPM](https://www.npmjs.com/package/hypixel-api-reborn) | -[GitHub](https://github.com/Hypixel-API-Reborn/hypixel-api-reborn) | +[Discord Support](https://discord.gg/NSEBNMM) | [Documentation](https://hypixel-api-reborn.github.io/hypixel-api-reborn) +| [NPM](https://www.npmjs.com/package/hypixel-api-reborn) | +[GitHub](https://github.com/Hypixel-API-Reborn/hypixel-api-reborn) -#### Requirements +### Requirements **For Node.js users >= v20.16.0**
**For TypeScript users >= v5.5.4** diff --git a/package.json b/package.json index 0e60ea2db..d1abf451d 100644 --- a/package.json +++ b/package.json @@ -17,15 +17,15 @@ "url": "https://github.com/Hypixel-API-Reborn/hypixel-api-reborn/issues" }, "scripts": { - "lint:check": "npx eslint src/", - "lint": "npx eslint src/ --fix", - "prettier:check": "npx prettier --check .", - "prettier": "npx prettier --write .", - "build": "npx tsc", - "test": "npx vitest run", - "test:coverage": "npx vitest run --coverage", - "test:ui": "npx vitest --ui --coverage", - "docgen": "npx typedoc" + "lint:check": "pnpm exec eslint src/", + "lint": "pnpm exec eslint src/ --fix", + "prettier:check": "pnpm exec prettier --check .", + "prettier": "pnpm exec prettier --write .", + "build": "pnpm exec tsc", + "test": "pnpm exec vitest run", + "test:coverage": "pnpm exec vitest run --coverage", + "test:ui": "pnpm exec vitest --ui --coverage", + "docgen": "pnpm exec typedoc" }, "engines": { "node": ">=20.16.0" From 184b63dcc8781d1e722c5512142c30c7a3d61305 Mon Sep 17 00:00:00 2001 From: Jacob Date: Fri, 18 Apr 2025 11:10:24 +0800 Subject: [PATCH 019/124] Fix build --- src/Types/SkyBlock.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Types/SkyBlock.ts b/src/Types/SkyBlock.ts index bb7f97c37..f29c36a47 100644 --- a/src/Types/SkyBlock.ts +++ b/src/Types/SkyBlock.ts @@ -467,7 +467,8 @@ export type MiningForgeItemName = | 'Tungsten Key' | 'Umber Key' | 'Skeleton Key' - | 'Portable Campfire'; + | 'Portable Campfire' + | 'PET'; export type MiningForgeItemsData = { [key in MiningForgeItemId | 'UNKNOWN']: { From e3914cf299002d600ffaf7805d61a6d740b5ff2f Mon Sep 17 00:00:00 2001 From: Jacob Date: Fri, 18 Apr 2025 11:12:45 +0800 Subject: [PATCH 020/124] downgrade typedoc to fix docs compile --- package.json | 2 +- pnpm-lock.yaml | 72 ++++++++++++++++++++------------------------------ 2 files changed, 29 insertions(+), 45 deletions(-) diff --git a/package.json b/package.json index d1abf451d..97d96bceb 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "eslint-config-prettier": "^10.1.2", "globals": "^16.0.0", "prettier": "^3.5.3", - "typedoc": "^0.28.2", + "typedoc": "^0.27.9", "typedoc-material-theme": "^1.4.0", "typedoc-plugin-rename-defaults": "^0.7.3", "typescript": "^5.8.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5af6e1c54..77879cd81 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,7 +23,7 @@ importers: devDependencies: '@8hobbies/typedoc-plugin-404': specifier: ^3.2.1 - version: 3.2.1(typedoc@0.28.2(typescript@5.8.3)) + version: 3.2.1(typedoc@0.27.9(typescript@5.8.3)) '@eslint/js': specifier: ^9.24.0 version: 9.24.0 @@ -61,14 +61,14 @@ importers: specifier: ^3.5.3 version: 3.5.3 typedoc: - specifier: ^0.28.2 - version: 0.28.2(typescript@5.8.3) + specifier: ^0.27.9 + version: 0.27.9(typescript@5.8.3) typedoc-material-theme: specifier: ^1.4.0 - version: 1.4.0(typedoc@0.28.2(typescript@5.8.3)) + version: 1.4.0(typedoc@0.27.9(typescript@5.8.3)) typedoc-plugin-rename-defaults: specifier: ^0.7.3 - version: 0.7.3(typedoc@0.28.2(typescript@5.8.3)) + version: 0.7.3(typedoc@0.27.9(typescript@5.8.3)) typescript: specifier: ^5.8.3 version: 5.8.3 @@ -291,8 +291,8 @@ packages: resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@gerrit0/mini-shiki@3.2.3': - resolution: {integrity: sha512-yemSYr0Oiqk5NAQRfbD5DKUTlThiZw1MxTMx/YpQTg6m4QRJDtV2JTYSuNevgx1ayy/O7x+uwDjh3IgECGFY/Q==} + '@gerrit0/mini-shiki@1.27.2': + resolution: {integrity: sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==} '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} @@ -465,17 +465,11 @@ packages: cpu: [x64] os: [win32] - '@shikijs/engine-oniguruma@3.2.2': - resolution: {integrity: sha512-vyXRnWVCSvokwbaUD/8uPn6Gqsf5Hv7XwcW4AgiU4Z2qwy19sdr6VGzMdheKKN58tJOOe5MIKiNb901bgcUXYQ==} + '@shikijs/engine-oniguruma@1.29.2': + resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} - '@shikijs/langs@3.2.2': - resolution: {integrity: sha512-NY0Urg2dV9ETt3JIOWoMPuoDNwte3geLZ4M1nrPHbkDS8dWMpKcEwlqiEIGqtwZNmt5gKyWpR26ln2Bg2ecPgw==} - - '@shikijs/themes@3.2.2': - resolution: {integrity: sha512-Zuq4lgAxVKkb0FFdhHSdDkALuRpsj1so1JdihjKNQfgM78EHxV2JhO10qPsMrm01FkE3mDRTdF68wfmsqjt6HA==} - - '@shikijs/types@3.2.2': - resolution: {integrity: sha512-a5TiHk7EH5Lso8sHcLHbVNNhWKP0Wi3yVnXnu73g86n3WoDgEra7n3KszyeCGuyoagspQ2fzvy4cpSc8pKhb0A==} + '@shikijs/types@1.29.2': + resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} @@ -1306,9 +1300,9 @@ packages: peerDependencies: typedoc: '>=0.22.x <0.29.x' - typedoc@0.28.2: - resolution: {integrity: sha512-9Giuv+eppFKnJ0oi+vxqLM817b/IrIsEMYgy3jj6zdvppAfDqV3d6DXL2vXUg2TnlL62V48th25Zf/tcQKAJdg==} - engines: {node: '>= 18', pnpm: '>= 10'} + typedoc@0.27.9: + resolution: {integrity: sha512-/z585740YHURLl9DN2jCWe6OW7zKYm6VoQ93H0sxZ1cwHQEQrUn5BJrEnkWhfzUdyO+BLGjnKUZ9iz9hKloFDw==} + engines: {node: '>= 18'} hasBin: true peerDependencies: typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x @@ -1443,9 +1437,9 @@ packages: snapshots: - '@8hobbies/typedoc-plugin-404@3.2.1(typedoc@0.28.2(typescript@5.8.3))': + '@8hobbies/typedoc-plugin-404@3.2.1(typedoc@0.27.9(typescript@5.8.3))': dependencies: - typedoc: 0.28.2(typescript@5.8.3) + typedoc: 0.27.9(typescript@5.8.3) '@ampproject/remapping@2.3.0': dependencies: @@ -1580,12 +1574,10 @@ snapshots: '@eslint/core': 0.12.0 levn: 0.4.1 - '@gerrit0/mini-shiki@3.2.3': + '@gerrit0/mini-shiki@1.27.2': dependencies: - '@shikijs/engine-oniguruma': 3.2.2 - '@shikijs/langs': 3.2.2 - '@shikijs/themes': 3.2.2 - '@shikijs/types': 3.2.2 + '@shikijs/engine-oniguruma': 1.29.2 + '@shikijs/types': 1.29.2 '@shikijs/vscode-textmate': 10.0.2 '@humanfs/core@0.19.1': {} @@ -1716,20 +1708,12 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.37.0': optional: true - '@shikijs/engine-oniguruma@3.2.2': + '@shikijs/engine-oniguruma@1.29.2': dependencies: - '@shikijs/types': 3.2.2 + '@shikijs/types': 1.29.2 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@3.2.2': - dependencies: - '@shikijs/types': 3.2.2 - - '@shikijs/themes@3.2.2': - dependencies: - '@shikijs/types': 3.2.2 - - '@shikijs/types@3.2.2': + '@shikijs/types@1.29.2': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -2604,19 +2588,19 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typedoc-material-theme@1.4.0(typedoc@0.28.2(typescript@5.8.3)): + typedoc-material-theme@1.4.0(typedoc@0.27.9(typescript@5.8.3)): dependencies: '@material/material-color-utilities': 0.3.0 - typedoc: 0.28.2(typescript@5.8.3) + typedoc: 0.27.9(typescript@5.8.3) - typedoc-plugin-rename-defaults@0.7.3(typedoc@0.28.2(typescript@5.8.3)): + typedoc-plugin-rename-defaults@0.7.3(typedoc@0.27.9(typescript@5.8.3)): dependencies: camelcase: 8.0.0 - typedoc: 0.28.2(typescript@5.8.3) + typedoc: 0.27.9(typescript@5.8.3) - typedoc@0.28.2(typescript@5.8.3): + typedoc@0.27.9(typescript@5.8.3): dependencies: - '@gerrit0/mini-shiki': 3.2.3 + '@gerrit0/mini-shiki': 1.27.2 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 From c28e6ec5571e84500b141a977b6d8ebad75f1b11 Mon Sep 17 00:00:00 2001 From: Jacob Date: Sat, 13 Sep 2025 20:24:35 +0800 Subject: [PATCH 021/124] feat(player): rewrite --- src/API/getPlayer.test.ts | 664 -------------- src/API/getSkyBlockProfiles.test.ts | 2 +- src/Private/RequestHandler.ts | 2 +- src/Structures/Housing.ts | 42 - src/Structures/Player/Cosmetics.test.ts | 35 - src/Structures/Player/Cosmetics.ts | 56 -- src/Structures/Player/Gifting.test.ts | 25 - src/Structures/Player/MonthlyCrate.test.ts | 21 - src/Structures/Player/MonthlyCrate.ts | 18 - src/Structures/Player/Parkour.test.ts | 17 - src/Structures/Player/Pet.test.ts | 43 - src/Structures/Player/PetConsumables.test.ts | 90 -- src/Structures/Player/Pets.test.ts | 19 - src/Structures/Player/Pets.ts | 17 - src/Structures/Player/Player.test.ts | 184 ---- src/Structures/Player/Player.ts | 275 +++--- .../Player/PlayerAchievements.test.ts | 23 - .../PlayerAchievements.ts | 10 +- .../PlayerAchievementsRewards.ts | 0 .../PlayerAchivementsTotem.ts | 20 + .../Player/PlayerAchievementsRewards.test.ts | 9 - .../PlayerAdventRewards.ts | 60 ++ .../PlayerAdventRewardsDay.ts | 14 + .../Pets/PlayerCosmeticsPet.ts} | 17 +- .../Pets/PlayerCosmeticsPets.ts | 17 + .../Pets/PlayerCosmeticsPetsConsumables.ts} | 74 +- .../Player/PlayerCosmetics/PlayerCosmetics.ts | 83 ++ .../Player/{Gifting.ts => PlayerGifting.ts} | 4 +- .../Player/PlayerHousing/PlayerHousing.ts | 31 + .../PlayerHousingGivenCookies.ts | 10 + .../PlayerHousingPlayerSettings.ts | 22 + .../Player/{Parkour.ts => PlayerParkour.ts} | 11 +- .../{Quests => PlayerQuests}/PlayerQuest.ts | 0 .../PlayerQuestCompletion.ts | 0 .../PlayerQuestCompletions.ts | 0 .../{Quests => PlayerQuests}/PlayerQuests.ts | 5 +- src/Structures/Player/PlayerRankPurchase.ts | 22 + .../Player/PlayerRewards/PlayerRewards.ts | 30 + .../PlayerRewardsMonthlyCrate.ts | 18 + src/Structures/Player/PlayerScorpiusBribe.ts | 12 + .../Christmas/PlayerSeasonalChristmasYear.ts | 17 + ...layerSeasonalChristmasYearAdventRewards.ts | 56 ++ .../PlayerSeasonalChristmasYearLeveling.ts | 8 + src/Structures/Player/PlayerSocialMedia.ts | 22 + src/Structures/Player/PlayerStats.ts | 73 ++ .../Player/PlayerTourney/PlayerTourney.ts | 24 + .../Player/PlayerTourney/PlayerTourneyData.ts | 18 + .../Player/Quests/PlayerQuest.test.ts | 14 - .../Quests/PlayerQuestCompletion.test.ts | 15 - .../Quests/PlayerQuestCompletions.test.ts | 15 - .../Player/Quests/PlayerQuests.test.ts | 14 - src/Structures/Player/Rewards.test.ts | 28 - src/Structures/Player/Rewards.ts | 29 - src/Structures/Player/Seasonal/Season.test.ts | 15 - src/Structures/Player/Seasonal/Season.ts | 14 - .../Player/Seasonal/SeasonBingo.test.ts | 16 - src/Structures/Player/Seasonal/SeasonBingo.ts | 14 - .../Player/Seasonal/SeasonBingoTier.test.ts | 13 - .../Player/Seasonal/SeasonBingoTier.ts | 10 - .../Player/Seasonal/SeasonYear.test.ts | 22 - src/Structures/Player/Seasonal/SeasonYear.ts | 20 - .../Player/Seasonal/Seasonal.test.ts | 23 - src/Structures/Player/Seasonal/Seasonal.ts | 20 - src/Structures/Player/SocialMedia.test.ts | 14 - src/Structures/Player/SocialMedia.ts | 18 - src/Structures/Player/Tourney/Tourney.test.ts | 20 - src/Structures/Player/Tourney/Tourney.ts | 21 - .../Player/Tourney/TourneyData.test.ts | 21 - src/Structures/Player/Tourney/TourneyData.ts | 14 - src/Types/Global.ts | 1 + src/Types/Player.ts | 843 +++++++++++++++--- src/Types/SkyBlock.ts | 4 +- src/Utils/PlayerUtils.test.ts | 82 -- src/Utils/PlayerUtils.ts | 90 -- src/index.ts | 92 +- 75 files changed, 1566 insertions(+), 2156 deletions(-) delete mode 100644 src/API/getPlayer.test.ts delete mode 100644 src/Structures/Housing.ts delete mode 100644 src/Structures/Player/Cosmetics.test.ts delete mode 100644 src/Structures/Player/Cosmetics.ts delete mode 100644 src/Structures/Player/Gifting.test.ts delete mode 100644 src/Structures/Player/MonthlyCrate.test.ts delete mode 100644 src/Structures/Player/MonthlyCrate.ts delete mode 100644 src/Structures/Player/Parkour.test.ts delete mode 100644 src/Structures/Player/Pet.test.ts delete mode 100644 src/Structures/Player/PetConsumables.test.ts delete mode 100644 src/Structures/Player/Pets.test.ts delete mode 100644 src/Structures/Player/Pets.ts delete mode 100644 src/Structures/Player/Player.test.ts delete mode 100644 src/Structures/Player/PlayerAchievements.test.ts rename src/Structures/Player/{ => PlayerAchievements}/PlayerAchievements.ts (55%) rename src/Structures/Player/{ => PlayerAchievements}/PlayerAchievementsRewards.ts (100%) create mode 100644 src/Structures/Player/PlayerAchievements/PlayerAchivementsTotem.ts delete mode 100644 src/Structures/Player/PlayerAchievementsRewards.test.ts create mode 100644 src/Structures/Player/PlayerAdventRewards/PlayerAdventRewards.ts create mode 100644 src/Structures/Player/PlayerAdventRewards/PlayerAdventRewardsDay.ts rename src/Structures/Player/{Pet.ts => PlayerCosmetics/Pets/PlayerCosmeticsPet.ts} (73%) create mode 100644 src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPets.ts rename src/Structures/Player/{PetConsumables.ts => PlayerCosmetics/Pets/PlayerCosmeticsPetsConsumables.ts} (92%) create mode 100644 src/Structures/Player/PlayerCosmetics/PlayerCosmetics.ts rename src/Structures/Player/{Gifting.ts => PlayerGifting.ts} (91%) create mode 100644 src/Structures/Player/PlayerHousing/PlayerHousing.ts create mode 100644 src/Structures/Player/PlayerHousing/PlayerHousingGivenCookies.ts create mode 100644 src/Structures/Player/PlayerHousing/PlayerHousingPlayerSettings.ts rename src/Structures/Player/{Parkour.ts => PlayerParkour.ts} (60%) rename src/Structures/Player/{Quests => PlayerQuests}/PlayerQuest.ts (100%) rename src/Structures/Player/{Quests => PlayerQuests}/PlayerQuestCompletion.ts (100%) rename src/Structures/Player/{Quests => PlayerQuests}/PlayerQuestCompletions.ts (100%) rename src/Structures/Player/{Quests => PlayerQuests}/PlayerQuests.ts (66%) create mode 100644 src/Structures/Player/PlayerRankPurchase.ts create mode 100644 src/Structures/Player/PlayerRewards/PlayerRewards.ts create mode 100644 src/Structures/Player/PlayerRewards/PlayerRewardsMonthlyCrate.ts create mode 100644 src/Structures/Player/PlayerScorpiusBribe.ts create mode 100644 src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYear.ts create mode 100644 src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYearAdventRewards.ts create mode 100644 src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYearLeveling.ts create mode 100644 src/Structures/Player/PlayerSocialMedia.ts create mode 100644 src/Structures/Player/PlayerStats.ts create mode 100644 src/Structures/Player/PlayerTourney/PlayerTourney.ts create mode 100644 src/Structures/Player/PlayerTourney/PlayerTourneyData.ts delete mode 100644 src/Structures/Player/Quests/PlayerQuest.test.ts delete mode 100644 src/Structures/Player/Quests/PlayerQuestCompletion.test.ts delete mode 100644 src/Structures/Player/Quests/PlayerQuestCompletions.test.ts delete mode 100644 src/Structures/Player/Quests/PlayerQuests.test.ts delete mode 100644 src/Structures/Player/Rewards.test.ts delete mode 100644 src/Structures/Player/Rewards.ts delete mode 100644 src/Structures/Player/Seasonal/Season.test.ts delete mode 100644 src/Structures/Player/Seasonal/Season.ts delete mode 100644 src/Structures/Player/Seasonal/SeasonBingo.test.ts delete mode 100644 src/Structures/Player/Seasonal/SeasonBingo.ts delete mode 100644 src/Structures/Player/Seasonal/SeasonBingoTier.test.ts delete mode 100644 src/Structures/Player/Seasonal/SeasonBingoTier.ts delete mode 100644 src/Structures/Player/Seasonal/SeasonYear.test.ts delete mode 100644 src/Structures/Player/Seasonal/SeasonYear.ts delete mode 100644 src/Structures/Player/Seasonal/Seasonal.test.ts delete mode 100644 src/Structures/Player/Seasonal/Seasonal.ts delete mode 100644 src/Structures/Player/SocialMedia.test.ts delete mode 100644 src/Structures/Player/SocialMedia.ts delete mode 100644 src/Structures/Player/Tourney/Tourney.test.ts delete mode 100644 src/Structures/Player/Tourney/Tourney.ts delete mode 100644 src/Structures/Player/Tourney/TourneyData.test.ts delete mode 100644 src/Structures/Player/Tourney/TourneyData.ts delete mode 100644 src/Utils/PlayerUtils.test.ts delete mode 100644 src/Utils/PlayerUtils.ts diff --git a/src/API/getPlayer.test.ts b/src/API/getPlayer.test.ts deleted file mode 100644 index 3f074c41c..000000000 --- a/src/API/getPlayer.test.ts +++ /dev/null @@ -1,664 +0,0 @@ -import Arcade from '../Structures/MiniGames/Arcade/Arcade.js'; -import ArenaBrawl from '../Structures/MiniGames/ArenaBrawl/ArenaBrawl.js'; -import BedWars from '../Structures/MiniGames/BedWars/BedWars.js'; -import BlitzSurvivalGames from '../Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.js'; -import BuildBattle from '../Structures/MiniGames/BuildBattle.js'; -import Client from '../Client.js'; -import Color from '../Structures/Color.js'; -import CopsAndCrims from '../Structures/MiniGames/CopsAndCrims/CopsAndCrims.js'; -import Cosmetics from '../Structures/Player/Cosmetics.js'; -import Duels from '../Structures/MiniGames/Duels/Duels.js'; -import Gifting from '../Structures/Player/Gifting.js'; -import Guild from '../Structures/Guild/Guild.js'; -import House from '../Structures/House.js'; -import Housing from '../Structures/Housing.js'; -import MegaWalls from '../Structures/MiniGames/MegaWalls/MegaWalls.js'; -import MurderMystery from '../Structures/MiniGames/MurderMystery/MurderMystery.js'; -import Paintball from '../Structures/MiniGames/Paintball.js'; -import Parkour from '../Structures/Player/Parkour.js'; -import Pit from '../Structures/MiniGames/Pit/Pit.js'; -import Player from '../Structures/Player/Player.js'; -import PlayerAchievements from '../Structures/Player/PlayerAchievements.js'; -import PlayerQuests from '../Structures/Player/Quests/PlayerQuests.js'; -import Quakecraft from '../Structures/MiniGames/Quakecraft/Quakecraft.js'; -import RecentGame from '../Structures/RecentGame.js'; -import RequestData from '../Private/RequestData.js'; -import Rewards from '../Structures/Player/Rewards.js'; -import Seasonal from '../Structures/Player/Seasonal/Seasonal.js'; -import SkyWars from '../Structures/MiniGames/SkyWars/SkyWars.js'; -import SmashHeroes from '../Structures/MiniGames/SmashHeroes/SmashHeroes.js'; -import SocialMedia from '../Structures/Player/SocialMedia.js'; -import SpeedUHC from '../Structures/MiniGames/SpeedUHC/SpeedUHC.js'; -import TNTGames from '../Structures/MiniGames/TNTGames/TNTGames.js'; -import Tourney from '../Structures/Player/Tourney/Tourney.js'; -import TurboKartRacers from '../Structures/MiniGames/TurboKartRacers/TurboKartRacers.js'; -import UHC from '../Structures/MiniGames/UHC/UHC.js'; -import VampireZ from '../Structures/MiniGames/VampireZ/VampireZ.js'; -import Walls from '../Structures/MiniGames/Walls.js'; -import Warlords from '../Structures/MiniGames/Warlords/Warlords.js'; -import WoolGames from '../Structures/MiniGames/WoolGames/WoolGames.js'; -import { defaultRequestData } from '../../vitest.setup.js'; -import { expect, expectTypeOf, test, vi } from 'vitest'; -import type { ChatChannel, Language, LevelProgress, PlayerRank, PlayerStats, ScorpiusBribe } from '../Types/Player.js'; - -test('getPlayer (never joined hypixel)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - vi.spyOn(global, 'fetch').mockResolvedValue({ - ...defaultRequestData, - json: () => Promise.resolve({ success: true }) - } as any); - - await expect(() => client.getPlayer('14727faefbdc4aff848cd2713eb9939e')).rejects.toThrowError( - client.errors.PLAYER_HAS_NEVER_LOGGED - ); - vi.restoreAllMocks(); - client.destroy(); -}); - -test('getPlayer (no input)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - await expect(() => client.getPlayer()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); - client.destroy(); -}); - -test('getPLayer (raw)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - const data = await client.getPlayer('4855c53ee4fb4100997600a92fc50984', { raw: true }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(RequestData); - expectTypeOf(data).toEqualTypeOf(); - client.destroy(); -}); - -test('getPlayer (guild)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getPlayer('28667672039044989b0019b14a2c34d6', { guild: true }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(Player); - expectTypeOf(data).toEqualTypeOf(); - data = data as Player; - expect(data.uuid).toBeDefined(); - expectTypeOf(data.uuid).toEqualTypeOf(); - expect(data.nickname).toBeDefined(); - expectTypeOf(data.nickname).toEqualTypeOf(); - expect(data.rank).toBeDefined(); - expectTypeOf(data.rank).toEqualTypeOf(); - expect(data.mvpPlusColor).toBeDefined(); - expectTypeOf(data.mvpPlusColor).toEqualTypeOf(); - expect(data.mvpPlusPlusColor).toBeDefined(); - expectTypeOf(data.mvpPlusPlusColor).toEqualTypeOf(); - expect(data.gifting).toBeDefined(); - expectTypeOf(data.gifting).toEqualTypeOf(); - expect(data.socialMedia).toBeDefined(); - expectTypeOf(data.socialMedia).toEqualTypeOf(); - expect(data.firstLoginTimestamp).toBeDefined(); - expect(data.firstLoginTimestamp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.firstLoginTimestamp).toEqualTypeOf(); - expect(data.firstLoginAt).toBeDefined(); - expectTypeOf(data.firstLoginAt).toEqualTypeOf(); - expect(data.lastLoginTimestamp).toBeDefined(); - expectTypeOf(data.lastLoginTimestamp).toEqualTypeOf(); - expect(data.lastLoginAt).toBeDefined(); - expectTypeOf(data.lastLoginAt).toEqualTypeOf(); - expect(data.achievements).toBeDefined(); - expectTypeOf(data.achievements).toEqualTypeOf(); - expect(data.language).toBeDefined(); - expectTypeOf(data.language).toEqualTypeOf(); - expect(data.channel).toBeDefined(); - expectTypeOf(data.channel).toEqualTypeOf(); - expect(data.exp).toBeDefined(); - expect(data.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.exp).toEqualTypeOf(); - expect(data.level).toBeDefined(); - expectTypeOf(data.level).toEqualTypeOf(); - expect(data.seasonal).toBeDefined(); - expectTypeOf(data.seasonal).toEqualTypeOf(); - expect(data.karma).toBeDefined(); - expect(data.karma).toBeGreaterThanOrEqual(0); - expectTypeOf(data.karma).toEqualTypeOf(); - expect(data.freeSkyBlockCookie).toBeDefined(); - expectTypeOf(data.freeSkyBlockCookie).toEqualTypeOf(); - expect(data.tourney).toBeDefined(); - expectTypeOf(data.tourney).toEqualTypeOf(); - expect(data.rewards).toBeDefined(); - expectTypeOf(data.rewards).toEqualTypeOf(); - expect(data.challenges).toBeDefined(); - expectTypeOf(data.challenges).toEqualTypeOf(); - expect(data.parkour).toBeDefined(); - expectTypeOf(data.parkour).toEqualTypeOf(); - expect(data.housing).toBeDefined(); - expectTypeOf(data.housing).toEqualTypeOf(); - expect(data.cosmetics).toBeDefined(); - expectTypeOf(data.cosmetics).toEqualTypeOf(); - expect(data.scorpiusBribes).toBeDefined(); - expectTypeOf(data.scorpiusBribes).toEqualTypeOf(); - expect(data.quests).toBeDefined(); - expectTypeOf(data.quests).toEqualTypeOf(); - expect(data.guild).toBeDefined(); - expect(data.guild).toBeInstanceOf(Guild); - expectTypeOf(data.guild).toEqualTypeOf(); - expect(data.houses).toBeDefined(); - expect(data.houses).toBeNull(); - expectTypeOf(data.houses).toEqualTypeOf(); - expect(data.recentGames).toBeDefined(); - expect(data.recentGames).toBeNull(); - expectTypeOf(data.recentGames).toEqualTypeOf(); - expect(data.stats).toBeDefined(); - expectTypeOf(data.stats).toEqualTypeOf(); - expect(data.stats.Arcade).toBeDefined(); - expect(data.stats.Arcade).toBeInstanceOf(Arcade); - expectTypeOf(data.stats.Arcade).toEqualTypeOf(); - expect(data.stats.ArenaBrawl).toBeDefined(); - expect(data.stats.ArenaBrawl).toBeInstanceOf(ArenaBrawl); - expectTypeOf(data.stats.ArenaBrawl).toEqualTypeOf(); - expect(data.stats.BedWars).toBeDefined(); - expect(data.stats.BedWars).toBeInstanceOf(BedWars); - expectTypeOf(data.stats.BedWars).toEqualTypeOf(); - expect(data.stats.BlitzSurvivalGames).toBeDefined(); - expect(data.stats.BlitzSurvivalGames).toBeInstanceOf(BlitzSurvivalGames); - expectTypeOf(data.stats.BlitzSurvivalGames).toEqualTypeOf(); - expect(data.stats.BuildBattle).toBeDefined(); - expect(data.stats.BuildBattle).toBeInstanceOf(BuildBattle); - expectTypeOf(data.stats.BuildBattle).toEqualTypeOf(); - expect(data.stats.CopsAndCrims).toBeDefined(); - expect(data.stats.CopsAndCrims).toBeInstanceOf(CopsAndCrims); - expectTypeOf(data.stats.CopsAndCrims).toEqualTypeOf(); - expect(data.stats.Duels).toBeDefined(); - expect(data.stats.Duels).toBeInstanceOf(Duels); - expectTypeOf(data.stats.Duels).toEqualTypeOf(); - expect(data.stats.MegaWalls).toBeDefined(); - expect(data.stats.MegaWalls).toBeInstanceOf(MegaWalls); - expectTypeOf(data.stats.MegaWalls).toEqualTypeOf(); - expect(data.stats.MurderMystery).toBeDefined(); - expect(data.stats.MurderMystery).toBeInstanceOf(MurderMystery); - expectTypeOf(data.stats.MurderMystery).toEqualTypeOf(); - expect(data.stats.Paintball).toBeDefined(); - expect(data.stats.Paintball).toBeInstanceOf(Paintball); - expectTypeOf(data.stats.Paintball).toEqualTypeOf(); - expect(data.stats.Pit).toBeDefined(); - expect(data.stats.Pit).toBeInstanceOf(Pit); - expectTypeOf(data.stats.Pit).toEqualTypeOf(); - expect(data.stats.QuakeCraft).toBeDefined(); - expect(data.stats.QuakeCraft).toBeInstanceOf(Quakecraft); - expectTypeOf(data.stats.QuakeCraft).toEqualTypeOf(); - expect(data.stats.SkyWars).toBeDefined(); - expect(data.stats.SkyWars).toBeInstanceOf(SkyWars); - expectTypeOf(data.stats.SkyWars).toEqualTypeOf(); - expect(data.stats.SmashHeroes).toBeDefined(); - expect(data.stats.SmashHeroes).toBeInstanceOf(SmashHeroes); - expectTypeOf(data.stats.SmashHeroes).toEqualTypeOf(); - expect(data.stats.SpeedUHC).toBeDefined(); - expect(data.stats.SpeedUHC).toBeInstanceOf(SpeedUHC); - expectTypeOf(data.stats.SpeedUHC).toEqualTypeOf(); - expect(data.stats.TNTGames).toBeDefined(); - expect(data.stats.TNTGames).toBeInstanceOf(TNTGames); - expectTypeOf(data.stats.TNTGames).toEqualTypeOf(); - expect(data.stats.TurboKartRacers).toBeDefined(); - expect(data.stats.TurboKartRacers).toBeInstanceOf(TurboKartRacers); - expectTypeOf(data.stats.TurboKartRacers).toEqualTypeOf(); - expect(data.stats.UHC).toBeDefined(); - expect(data.stats.UHC).toBeInstanceOf(UHC); - expectTypeOf(data.stats.UHC).toEqualTypeOf(); - expect(data.stats.VampireZ).toBeDefined(); - expect(data.stats.VampireZ).toBeInstanceOf(VampireZ); - expectTypeOf(data.stats.VampireZ).toEqualTypeOf(); - expect(data.stats.Walls).toBeDefined(); - expect(data.stats.Walls).toBeInstanceOf(Walls); - expectTypeOf(data.stats.Walls).toEqualTypeOf(); - expect(data.stats.Warlords).toBeDefined(); - expect(data.stats.Warlords).toBeInstanceOf(Warlords); - expectTypeOf(data.stats.Warlords).toEqualTypeOf(); - expect(data.stats.WoolGames).toBeDefined(); - expect(data.stats.WoolGames).toBeInstanceOf(WoolGames); - expectTypeOf(data.stats.WoolGames).toEqualTypeOf(); - client.destroy(); -}); - -test('getPlayer (houses)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getPlayer('618a96fec8b0493fa89427891049550b', { houses: true }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(Player); - expectTypeOf(data).toEqualTypeOf(); - data = data as Player; - expect(data.houses).toBeDefined(); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(Player); - expectTypeOf(data).toEqualTypeOf(); - expect(data.uuid).toBeDefined(); - expectTypeOf(data.uuid).toEqualTypeOf(); - expect(data.nickname).toBeDefined(); - expectTypeOf(data.nickname).toEqualTypeOf(); - expect(data.rank).toBeDefined(); - expectTypeOf(data.rank).toEqualTypeOf(); - expect(data.mvpPlusColor).toBeDefined(); - expectTypeOf(data.mvpPlusColor).toEqualTypeOf(); - expect(data.mvpPlusPlusColor).toBeDefined(); - expectTypeOf(data.mvpPlusPlusColor).toEqualTypeOf(); - expect(data.gifting).toBeDefined(); - expectTypeOf(data.gifting).toEqualTypeOf(); - expect(data.socialMedia).toBeDefined(); - expectTypeOf(data.socialMedia).toEqualTypeOf(); - expect(data.firstLoginTimestamp).toBeDefined(); - expect(data.firstLoginTimestamp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.firstLoginTimestamp).toEqualTypeOf(); - expect(data.firstLoginAt).toBeDefined(); - expectTypeOf(data.firstLoginAt).toEqualTypeOf(); - expect(data.lastLoginTimestamp).toBeDefined(); - expectTypeOf(data.lastLoginTimestamp).toEqualTypeOf(); - expect(data.lastLoginAt).toBeDefined(); - expectTypeOf(data.lastLoginAt).toEqualTypeOf(); - expect(data.achievements).toBeDefined(); - expectTypeOf(data.achievements).toEqualTypeOf(); - expect(data.language).toBeDefined(); - expectTypeOf(data.language).toEqualTypeOf(); - expect(data.channel).toBeDefined(); - expectTypeOf(data.channel).toEqualTypeOf(); - expect(data.exp).toBeDefined(); - expect(data.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.exp).toEqualTypeOf(); - expect(data.level).toBeDefined(); - expectTypeOf(data.level).toEqualTypeOf(); - expect(data.seasonal).toBeDefined(); - expectTypeOf(data.seasonal).toEqualTypeOf(); - expect(data.karma).toBeDefined(); - expect(data.karma).toBeGreaterThanOrEqual(0); - expectTypeOf(data.karma).toEqualTypeOf(); - expect(data.freeSkyBlockCookie).toBeDefined(); - expectTypeOf(data.freeSkyBlockCookie).toEqualTypeOf(); - expect(data.tourney).toBeDefined(); - expectTypeOf(data.tourney).toEqualTypeOf(); - expect(data.rewards).toBeDefined(); - expectTypeOf(data.rewards).toEqualTypeOf(); - expect(data.challenges).toBeDefined(); - expectTypeOf(data.challenges).toEqualTypeOf(); - expect(data.parkour).toBeDefined(); - expectTypeOf(data.parkour).toEqualTypeOf(); - expect(data.housing).toBeDefined(); - expectTypeOf(data.housing).toEqualTypeOf(); - expect(data.cosmetics).toBeDefined(); - expectTypeOf(data.cosmetics).toEqualTypeOf(); - expect(data.scorpiusBribes).toBeDefined(); - expectTypeOf(data.scorpiusBribes).toEqualTypeOf(); - expect(data.quests).toBeDefined(); - expectTypeOf(data.quests).toEqualTypeOf(); - expect(data.guild).toBeDefined(); - expect(data.guild).toBeNull(); - expectTypeOf(data.guild).toEqualTypeOf(); - expectTypeOf(data.houses).toEqualTypeOf(); - if (data.houses) { - data.houses.forEach((house: House) => { - expect(house).toBeDefined(); - expect(house).toBeInstanceOf(House); - expectTypeOf(house).toEqualTypeOf(); - }); - } - expect(data.recentGames).toBeDefined(); - expect(data.recentGames).toBeNull(); - expectTypeOf(data.recentGames).toEqualTypeOf(); - expect(data.stats).toBeDefined(); - expectTypeOf(data.stats).toEqualTypeOf(); - expect(data.stats.Arcade).toBeDefined(); - expect(data.stats.Arcade).toBeInstanceOf(Arcade); - expectTypeOf(data.stats.Arcade).toEqualTypeOf(); - expect(data.stats.ArenaBrawl).toBeDefined(); - expect(data.stats.ArenaBrawl).toBeInstanceOf(ArenaBrawl); - expectTypeOf(data.stats.ArenaBrawl).toEqualTypeOf(); - expect(data.stats.BedWars).toBeDefined(); - expect(data.stats.BedWars).toBeInstanceOf(BedWars); - expectTypeOf(data.stats.BedWars).toEqualTypeOf(); - expect(data.stats.BlitzSurvivalGames).toBeDefined(); - expect(data.stats.BlitzSurvivalGames).toBeInstanceOf(BlitzSurvivalGames); - expectTypeOf(data.stats.BlitzSurvivalGames).toEqualTypeOf(); - expect(data.stats.BuildBattle).toBeDefined(); - expect(data.stats.BuildBattle).toBeInstanceOf(BuildBattle); - expectTypeOf(data.stats.BuildBattle).toEqualTypeOf(); - expect(data.stats.CopsAndCrims).toBeDefined(); - expect(data.stats.CopsAndCrims).toBeInstanceOf(CopsAndCrims); - expectTypeOf(data.stats.CopsAndCrims).toEqualTypeOf(); - expect(data.stats.Duels).toBeDefined(); - expect(data.stats.Duels).toBeInstanceOf(Duels); - expectTypeOf(data.stats.Duels).toEqualTypeOf(); - expect(data.stats.MegaWalls).toBeDefined(); - expect(data.stats.MegaWalls).toBeInstanceOf(MegaWalls); - expectTypeOf(data.stats.MegaWalls).toEqualTypeOf(); - expect(data.stats.MurderMystery).toBeDefined(); - expect(data.stats.MurderMystery).toBeInstanceOf(MurderMystery); - expectTypeOf(data.stats.MurderMystery).toEqualTypeOf(); - expect(data.stats.Paintball).toBeDefined(); - expect(data.stats.Paintball).toBeInstanceOf(Paintball); - expectTypeOf(data.stats.Paintball).toEqualTypeOf(); - expect(data.stats.Pit).toBeDefined(); - expect(data.stats.Pit).toBeInstanceOf(Pit); - expectTypeOf(data.stats.Pit).toEqualTypeOf(); - expect(data.stats.QuakeCraft).toBeDefined(); - expect(data.stats.QuakeCraft).toBeInstanceOf(Quakecraft); - expectTypeOf(data.stats.QuakeCraft).toEqualTypeOf(); - expect(data.stats.SkyWars).toBeDefined(); - expect(data.stats.SkyWars).toBeInstanceOf(SkyWars); - expectTypeOf(data.stats.SkyWars).toEqualTypeOf(); - expect(data.stats.SmashHeroes).toBeDefined(); - expect(data.stats.SmashHeroes).toBeInstanceOf(SmashHeroes); - expectTypeOf(data.stats.SmashHeroes).toEqualTypeOf(); - expect(data.stats.SpeedUHC).toBeDefined(); - expect(data.stats.SpeedUHC).toBeInstanceOf(SpeedUHC); - expectTypeOf(data.stats.SpeedUHC).toEqualTypeOf(); - expect(data.stats.TNTGames).toBeDefined(); - expect(data.stats.TNTGames).toBeInstanceOf(TNTGames); - expectTypeOf(data.stats.TNTGames).toEqualTypeOf(); - expect(data.stats.TurboKartRacers).toBeDefined(); - expect(data.stats.TurboKartRacers).toBeInstanceOf(TurboKartRacers); - expectTypeOf(data.stats.TurboKartRacers).toEqualTypeOf(); - expect(data.stats.UHC).toBeDefined(); - expect(data.stats.UHC).toBeInstanceOf(UHC); - expectTypeOf(data.stats.UHC).toEqualTypeOf(); - expect(data.stats.VampireZ).toBeDefined(); - expect(data.stats.VampireZ).toBeInstanceOf(VampireZ); - expectTypeOf(data.stats.VampireZ).toEqualTypeOf(); - expect(data.stats.Walls).toBeDefined(); - expect(data.stats.Walls).toBeInstanceOf(Walls); - expectTypeOf(data.stats.Walls).toEqualTypeOf(); - expect(data.stats.Warlords).toBeDefined(); - expect(data.stats.Warlords).toBeInstanceOf(Warlords); - expectTypeOf(data.stats.Warlords).toEqualTypeOf(); - expect(data.stats.WoolGames).toBeDefined(); - expect(data.stats.WoolGames).toBeInstanceOf(WoolGames); - expectTypeOf(data.stats.WoolGames).toEqualTypeOf(); - client.destroy(); -}); - -test('getPlayer (recent games)', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getPlayer('37501e7512b845ab8796e2baf9e9677a', { recentGames: true }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(Player); - expectTypeOf(data).toEqualTypeOf(); - data = data as Player; - expect(data.uuid).toBeDefined(); - expectTypeOf(data.uuid).toEqualTypeOf(); - expect(data.nickname).toBeDefined(); - expectTypeOf(data.nickname).toEqualTypeOf(); - expect(data.rank).toBeDefined(); - expectTypeOf(data.rank).toEqualTypeOf(); - expect(data.mvpPlusColor).toBeDefined(); - expectTypeOf(data.mvpPlusColor).toEqualTypeOf(); - expect(data.mvpPlusPlusColor).toBeDefined(); - expectTypeOf(data.mvpPlusPlusColor).toEqualTypeOf(); - expect(data.gifting).toBeDefined(); - expectTypeOf(data.gifting).toEqualTypeOf(); - expect(data.socialMedia).toBeDefined(); - expectTypeOf(data.socialMedia).toEqualTypeOf(); - expect(data.firstLoginTimestamp).toBeDefined(); - expect(data.firstLoginTimestamp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.firstLoginTimestamp).toEqualTypeOf(); - expect(data.firstLoginAt).toBeDefined(); - expectTypeOf(data.firstLoginAt).toEqualTypeOf(); - expect(data.lastLoginTimestamp).toBeDefined(); - expectTypeOf(data.lastLoginTimestamp).toEqualTypeOf(); - expect(data.lastLoginAt).toBeDefined(); - expectTypeOf(data.lastLoginAt).toEqualTypeOf(); - expect(data.achievements).toBeDefined(); - expectTypeOf(data.achievements).toEqualTypeOf(); - expect(data.language).toBeDefined(); - expectTypeOf(data.language).toEqualTypeOf(); - expect(data.channel).toBeDefined(); - expectTypeOf(data.channel).toEqualTypeOf(); - expect(data.exp).toBeDefined(); - expect(data.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.exp).toEqualTypeOf(); - expect(data.level).toBeDefined(); - expectTypeOf(data.level).toEqualTypeOf(); - expect(data.seasonal).toBeDefined(); - expectTypeOf(data.seasonal).toEqualTypeOf(); - expect(data.karma).toBeDefined(); - expect(data.karma).toBeGreaterThanOrEqual(0); - expectTypeOf(data.karma).toEqualTypeOf(); - expect(data.freeSkyBlockCookie).toBeDefined(); - expectTypeOf(data.freeSkyBlockCookie).toEqualTypeOf(); - expect(data.tourney).toBeDefined(); - expectTypeOf(data.tourney).toEqualTypeOf(); - expect(data.rewards).toBeDefined(); - expectTypeOf(data.rewards).toEqualTypeOf(); - expect(data.challenges).toBeDefined(); - expectTypeOf(data.challenges).toEqualTypeOf(); - expect(data.parkour).toBeDefined(); - expectTypeOf(data.parkour).toEqualTypeOf(); - expect(data.housing).toBeDefined(); - expectTypeOf(data.housing).toEqualTypeOf(); - expect(data.cosmetics).toBeDefined(); - expectTypeOf(data.cosmetics).toEqualTypeOf(); - expect(data.scorpiusBribes).toBeDefined(); - expectTypeOf(data.scorpiusBribes).toEqualTypeOf(); - expect(data.quests).toBeDefined(); - expectTypeOf(data.quests).toEqualTypeOf(); - expect(data.guild).toBeDefined(); - expect(data.guild).toBeNull(); - expectTypeOf(data.guild).toEqualTypeOf(); - expect(data.houses).toBeDefined(); - expect(data.houses).toBeNull(); - expectTypeOf(data.houses).toEqualTypeOf(); - expect(data.recentGames).toBeDefined(); - expectTypeOf(data.recentGames).toEqualTypeOf(); - if (data.recentGames) { - data.recentGames.forEach((game: RecentGame) => { - expect(game).toBeDefined(); - expect(game).toBeInstanceOf(RecentGame); - expectTypeOf(game).toEqualTypeOf(); - }); - } - expect(data.stats).toBeDefined(); - expectTypeOf(data.stats).toEqualTypeOf(); - expect(data.stats.Arcade).toBeDefined(); - expect(data.stats.Arcade).toBeInstanceOf(Arcade); - expectTypeOf(data.stats.Arcade).toEqualTypeOf(); - expect(data.stats.ArenaBrawl).toBeDefined(); - expect(data.stats.ArenaBrawl).toBeInstanceOf(ArenaBrawl); - expectTypeOf(data.stats.ArenaBrawl).toEqualTypeOf(); - expect(data.stats.BedWars).toBeDefined(); - expect(data.stats.BedWars).toBeInstanceOf(BedWars); - expectTypeOf(data.stats.BedWars).toEqualTypeOf(); - expect(data.stats.BlitzSurvivalGames).toBeDefined(); - expect(data.stats.BlitzSurvivalGames).toBeInstanceOf(BlitzSurvivalGames); - expectTypeOf(data.stats.BlitzSurvivalGames).toEqualTypeOf(); - expect(data.stats.BuildBattle).toBeDefined(); - expect(data.stats.BuildBattle).toBeInstanceOf(BuildBattle); - expectTypeOf(data.stats.BuildBattle).toEqualTypeOf(); - expect(data.stats.CopsAndCrims).toBeDefined(); - expect(data.stats.CopsAndCrims).toBeInstanceOf(CopsAndCrims); - expectTypeOf(data.stats.CopsAndCrims).toEqualTypeOf(); - expect(data.stats.Duels).toBeDefined(); - expect(data.stats.Duels).toBeInstanceOf(Duels); - expectTypeOf(data.stats.Duels).toEqualTypeOf(); - expect(data.stats.MegaWalls).toBeDefined(); - expect(data.stats.MegaWalls).toBeInstanceOf(MegaWalls); - expectTypeOf(data.stats.MegaWalls).toEqualTypeOf(); - expect(data.stats.MurderMystery).toBeDefined(); - expect(data.stats.MurderMystery).toBeInstanceOf(MurderMystery); - expectTypeOf(data.stats.MurderMystery).toEqualTypeOf(); - expect(data.stats.Paintball).toBeDefined(); - expect(data.stats.Paintball).toBeInstanceOf(Paintball); - expectTypeOf(data.stats.Paintball).toEqualTypeOf(); - expect(data.stats.Pit).toBeDefined(); - expect(data.stats.Pit).toBeInstanceOf(Pit); - expectTypeOf(data.stats.Pit).toEqualTypeOf(); - expect(data.stats.QuakeCraft).toBeDefined(); - expect(data.stats.QuakeCraft).toBeInstanceOf(Quakecraft); - expectTypeOf(data.stats.QuakeCraft).toEqualTypeOf(); - expect(data.stats.SkyWars).toBeDefined(); - expect(data.stats.SkyWars).toBeInstanceOf(SkyWars); - expectTypeOf(data.stats.SkyWars).toEqualTypeOf(); - expect(data.stats.SmashHeroes).toBeDefined(); - expect(data.stats.SmashHeroes).toBeInstanceOf(SmashHeroes); - expectTypeOf(data.stats.SmashHeroes).toEqualTypeOf(); - expect(data.stats.SpeedUHC).toBeDefined(); - expect(data.stats.SpeedUHC).toBeInstanceOf(SpeedUHC); - expectTypeOf(data.stats.SpeedUHC).toEqualTypeOf(); - expect(data.stats.TNTGames).toBeDefined(); - expect(data.stats.TNTGames).toBeInstanceOf(TNTGames); - expectTypeOf(data.stats.TNTGames).toEqualTypeOf(); - expect(data.stats.TurboKartRacers).toBeDefined(); - expect(data.stats.TurboKartRacers).toBeInstanceOf(TurboKartRacers); - expectTypeOf(data.stats.TurboKartRacers).toEqualTypeOf(); - expect(data.stats.UHC).toBeDefined(); - expect(data.stats.UHC).toBeInstanceOf(UHC); - expectTypeOf(data.stats.UHC).toEqualTypeOf(); - expect(data.stats.VampireZ).toBeDefined(); - expect(data.stats.VampireZ).toBeInstanceOf(VampireZ); - expectTypeOf(data.stats.VampireZ).toEqualTypeOf(); - expect(data.stats.Walls).toBeDefined(); - expect(data.stats.Walls).toBeInstanceOf(Walls); - expectTypeOf(data.stats.Walls).toEqualTypeOf(); - expect(data.stats.Warlords).toBeDefined(); - expect(data.stats.Warlords).toBeInstanceOf(Warlords); - expectTypeOf(data.stats.Warlords).toEqualTypeOf(); - expect(data.stats.WoolGames).toBeDefined(); - expect(data.stats.WoolGames).toBeInstanceOf(WoolGames); - expectTypeOf(data.stats.WoolGames).toEqualTypeOf(); - client.destroy(); -}); - -test('getPlayer', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getPlayer('14727faefbdc4aff848cd2713eb9939e'); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(Player); - expectTypeOf(data).toEqualTypeOf(); - data = data as Player; - expect(data.uuid).toBeDefined(); - expectTypeOf(data.uuid).toEqualTypeOf(); - expect(data.nickname).toBeDefined(); - expectTypeOf(data.nickname).toEqualTypeOf(); - expect(data.rank).toBeDefined(); - expectTypeOf(data.rank).toEqualTypeOf(); - expect(data.mvpPlusColor).toBeDefined(); - expectTypeOf(data.mvpPlusColor).toEqualTypeOf(); - expect(data.mvpPlusPlusColor).toBeDefined(); - expectTypeOf(data.mvpPlusPlusColor).toEqualTypeOf(); - expect(data.gifting).toBeDefined(); - expectTypeOf(data.gifting).toEqualTypeOf(); - expect(data.socialMedia).toBeDefined(); - expectTypeOf(data.socialMedia).toEqualTypeOf(); - expect(data.firstLoginTimestamp).toBeDefined(); - expect(data.firstLoginTimestamp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.firstLoginTimestamp).toEqualTypeOf(); - expect(data.firstLoginAt).toBeDefined(); - expectTypeOf(data.firstLoginAt).toEqualTypeOf(); - expect(data.lastLoginTimestamp).toBeDefined(); - expectTypeOf(data.lastLoginTimestamp).toEqualTypeOf(); - expect(data.lastLoginAt).toBeDefined(); - expectTypeOf(data.lastLoginAt).toEqualTypeOf(); - expect(data.achievements).toBeDefined(); - expectTypeOf(data.achievements).toEqualTypeOf(); - expect(data.language).toBeDefined(); - expectTypeOf(data.language).toEqualTypeOf(); - expect(data.channel).toBeDefined(); - expectTypeOf(data.channel).toEqualTypeOf(); - expect(data.exp).toBeDefined(); - expect(data.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.exp).toEqualTypeOf(); - expect(data.level).toBeDefined(); - expectTypeOf(data.level).toEqualTypeOf(); - expect(data.seasonal).toBeDefined(); - expectTypeOf(data.seasonal).toEqualTypeOf(); - expect(data.karma).toBeDefined(); - expect(data.karma).toBeGreaterThanOrEqual(0); - expectTypeOf(data.karma).toEqualTypeOf(); - expect(data.freeSkyBlockCookie).toBeDefined(); - expectTypeOf(data.freeSkyBlockCookie).toEqualTypeOf(); - expect(data.tourney).toBeDefined(); - expectTypeOf(data.tourney).toEqualTypeOf(); - expect(data.rewards).toBeDefined(); - expectTypeOf(data.rewards).toEqualTypeOf(); - expect(data.challenges).toBeDefined(); - expectTypeOf(data.challenges).toEqualTypeOf(); - expect(data.parkour).toBeDefined(); - expectTypeOf(data.parkour).toEqualTypeOf(); - expect(data.housing).toBeDefined(); - expectTypeOf(data.housing).toEqualTypeOf(); - expect(data.cosmetics).toBeDefined(); - expectTypeOf(data.cosmetics).toEqualTypeOf(); - expect(data.scorpiusBribes).toBeDefined(); - expectTypeOf(data.scorpiusBribes).toEqualTypeOf(); - expect(data.quests).toBeDefined(); - expectTypeOf(data.quests).toEqualTypeOf(); - expect(data.guild).toBeDefined(); - expect(data.guild).toBeNull(); - expectTypeOf(data.guild).toEqualTypeOf(); - expect(data.houses).toBeDefined(); - expect(data.houses).toBeNull(); - expectTypeOf(data.houses).toEqualTypeOf(); - expect(data.recentGames).toBeDefined(); - expect(data.recentGames).toBeNull(); - expectTypeOf(data.recentGames).toEqualTypeOf(); - expect(data.stats).toBeDefined(); - expectTypeOf(data.stats).toEqualTypeOf(); - expect(data.stats.Arcade).toBeDefined(); - expect(data.stats.Arcade).toBeInstanceOf(Arcade); - expectTypeOf(data.stats.Arcade).toEqualTypeOf(); - expect(data.stats.ArenaBrawl).toBeDefined(); - expect(data.stats.ArenaBrawl).toBeInstanceOf(ArenaBrawl); - expectTypeOf(data.stats.ArenaBrawl).toEqualTypeOf(); - expect(data.stats.BedWars).toBeDefined(); - expect(data.stats.BedWars).toBeInstanceOf(BedWars); - expectTypeOf(data.stats.BedWars).toEqualTypeOf(); - expect(data.stats.BlitzSurvivalGames).toBeDefined(); - expect(data.stats.BlitzSurvivalGames).toBeInstanceOf(BlitzSurvivalGames); - expectTypeOf(data.stats.BlitzSurvivalGames).toEqualTypeOf(); - expect(data.stats.BuildBattle).toBeDefined(); - expect(data.stats.BuildBattle).toBeInstanceOf(BuildBattle); - expectTypeOf(data.stats.BuildBattle).toEqualTypeOf(); - expect(data.stats.CopsAndCrims).toBeDefined(); - expect(data.stats.CopsAndCrims).toBeInstanceOf(CopsAndCrims); - expectTypeOf(data.stats.CopsAndCrims).toEqualTypeOf(); - expect(data.stats.Duels).toBeDefined(); - expect(data.stats.Duels).toBeInstanceOf(Duels); - expectTypeOf(data.stats.Duels).toEqualTypeOf(); - expect(data.stats.MegaWalls).toBeDefined(); - expect(data.stats.MegaWalls).toBeInstanceOf(MegaWalls); - expectTypeOf(data.stats.MegaWalls).toEqualTypeOf(); - expect(data.stats.MurderMystery).toBeDefined(); - expect(data.stats.MurderMystery).toBeInstanceOf(MurderMystery); - expectTypeOf(data.stats.MurderMystery).toEqualTypeOf(); - expect(data.stats.Paintball).toBeDefined(); - expect(data.stats.Paintball).toBeInstanceOf(Paintball); - expectTypeOf(data.stats.Paintball).toEqualTypeOf(); - expect(data.stats.Pit).toBeDefined(); - expect(data.stats.Pit).toBeInstanceOf(Pit); - expectTypeOf(data.stats.Pit).toEqualTypeOf(); - expect(data.stats.QuakeCraft).toBeDefined(); - expect(data.stats.QuakeCraft).toBeInstanceOf(Quakecraft); - expectTypeOf(data.stats.QuakeCraft).toEqualTypeOf(); - expect(data.stats.SkyWars).toBeDefined(); - expect(data.stats.SkyWars).toBeInstanceOf(SkyWars); - expectTypeOf(data.stats.SkyWars).toEqualTypeOf(); - expect(data.stats.SmashHeroes).toBeDefined(); - expect(data.stats.SmashHeroes).toBeInstanceOf(SmashHeroes); - expectTypeOf(data.stats.SmashHeroes).toEqualTypeOf(); - expect(data.stats.SpeedUHC).toBeDefined(); - expect(data.stats.SpeedUHC).toBeInstanceOf(SpeedUHC); - expectTypeOf(data.stats.SpeedUHC).toEqualTypeOf(); - expect(data.stats.TNTGames).toBeDefined(); - expect(data.stats.TNTGames).toBeInstanceOf(TNTGames); - expectTypeOf(data.stats.TNTGames).toEqualTypeOf(); - expect(data.stats.TurboKartRacers).toBeDefined(); - expect(data.stats.TurboKartRacers).toBeInstanceOf(TurboKartRacers); - expectTypeOf(data.stats.TurboKartRacers).toEqualTypeOf(); - expect(data.stats.UHC).toBeDefined(); - expect(data.stats.UHC).toBeInstanceOf(UHC); - expectTypeOf(data.stats.UHC).toEqualTypeOf(); - expect(data.stats.VampireZ).toBeDefined(); - expect(data.stats.VampireZ).toBeInstanceOf(VampireZ); - expectTypeOf(data.stats.VampireZ).toEqualTypeOf(); - expect(data.stats.Walls).toBeDefined(); - expect(data.stats.Walls).toBeInstanceOf(Walls); - expectTypeOf(data.stats.Walls).toEqualTypeOf(); - expect(data.stats.Warlords).toBeDefined(); - expect(data.stats.Warlords).toBeInstanceOf(Warlords); - expectTypeOf(data.stats.Warlords).toEqualTypeOf(); - expect(data.stats.WoolGames).toBeDefined(); - expect(data.stats.WoolGames).toBeInstanceOf(WoolGames); - expectTypeOf(data.stats.WoolGames).toEqualTypeOf(); - client.destroy(); -}); diff --git a/src/API/getSkyBlockProfiles.test.ts b/src/API/getSkyBlockProfiles.test.ts index d99709524..ec5ead71f 100644 --- a/src/API/getSkyBlockProfiles.test.ts +++ b/src/API/getSkyBlockProfiles.test.ts @@ -28,7 +28,7 @@ test('getSkyBlockProfiles (no input)', async () => { test('getSkyBlockProfiles (no profiles)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - await expect(() => client.getSkyBlockProfiles('b45add7b081443909fb00aa9a3e15eb0')).rejects.toThrowError( + await expect(() => client.getSkyBlockProfiles('b491990d53fd4c5fa61e19d58cc7eddf')).rejects.toThrowError( client.errors.NO_SKYBLOCK_PROFILES ); client.destroy(); diff --git a/src/Private/RequestHandler.ts b/src/Private/RequestHandler.ts index 320704e53..9f14e2279 100644 --- a/src/Private/RequestHandler.ts +++ b/src/Private/RequestHandler.ts @@ -1,4 +1,4 @@ -const BASE_URL = 'https://api.hypixel.net/v2'; +const BASE_URL = 'http://localhost:3000/hypixel'; import Client from '../Client.js'; import RequestData from './RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; diff --git a/src/Structures/Housing.ts b/src/Structures/Housing.ts deleted file mode 100644 index 758dd8e8d..000000000 --- a/src/Structures/Housing.ts +++ /dev/null @@ -1,42 +0,0 @@ -class HousingGivenCookies { - date: string; - houses: string[]; - constructor(date: string, houses: string[]) { - this.date = date; - this.houses = houses; - } -} - -class Housing { - allowedBlocks: string[]; - playerVisibility: number; - showBorder: boolean; - showTips: boolean; - tutorialStage: string; - packages: string[]; - firstHouseJoinTimestamp: number; - firstHouseJoinAt: Date; - plotSize: number; - givenCookies: HousingGivenCookies[]; - constructor(data: Record) { - this.allowedBlocks = data.allowedBlocks; - this.playerVisibility = data?.playerSettings?.VISIBILITY - ? Number(data?.playerSettings?.VISIBILITY.split('-')[1]) - : 4; - this.showBorder = data?.playerSettings?.BORDER ? Boolean(data?.playerSettings?.BORDER.split('-')[1]) : true; - this.showTips = data?.playerSettings?.TIPS ? Boolean(data?.playerSettings?.TIPS.split('-')[1]) : false; - this.tutorialStage = data.tutorialStep; - this.packages = data.packages; - this.firstHouseJoinTimestamp = data.firstHouseJoinMs; - this.firstHouseJoinAt = new Date(this.firstHouseJoinTimestamp); - this.plotSize = data.plotSize; - this.givenCookies = []; - Object.keys(data) - .filter((key) => key.startsWith('given_cookies_')) - .map((key) => { - this.givenCookies.push(new HousingGivenCookies(key, data[key])); - }); - } -} - -export default Housing; diff --git a/src/Structures/Player/Cosmetics.test.ts b/src/Structures/Player/Cosmetics.test.ts deleted file mode 100644 index ffb3170f8..000000000 --- a/src/Structures/Player/Cosmetics.test.ts +++ /dev/null @@ -1,35 +0,0 @@ -import Cosmetics from './Cosmetics.js'; -import Pets from './Pets.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('Cosmetics', () => { - const data = new Cosmetics({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(Cosmetics); - expectTypeOf(data).toEqualTypeOf(); - expect(data.cosmetics).toBeDefined(); - expectTypeOf(data.cosmetics).toEqualTypeOf(); - expect(data.currentGadget).toBeDefined(); - expectTypeOf(data.currentGadget).toEqualTypeOf(); - expect(data.pets).toBeDefined(); - expect(data.pets).toBeInstanceOf(Pets); - expectTypeOf(data.pets).toEqualTypeOf(); - expect(data.suits).toBeDefined(); - expectTypeOf(data.suits).toEqualTypeOf(); - expect(data.hats).toBeDefined(); - expectTypeOf(data.hats).toEqualTypeOf(); - expect(data.gadgets).toBeDefined(); - expectTypeOf(data.gadgets).toEqualTypeOf(); - expect(data.morphs).toBeDefined(); - expectTypeOf(data.morphs).toEqualTypeOf(); - expect(data.cloaks).toBeDefined(); - expectTypeOf(data.cloaks).toEqualTypeOf(); - expect(data.taunts).toBeDefined(); - expectTypeOf(data.taunts).toEqualTypeOf(); - expect(data.rankColors).toBeDefined(); - expectTypeOf(data.rankColors).toEqualTypeOf(); - expect(data.particlePacks).toBeDefined(); - expectTypeOf(data.particlePacks).toEqualTypeOf(); - expect(data.clickEffects).toBeDefined(); - expectTypeOf(data.clickEffects).toEqualTypeOf(); -}); diff --git a/src/Structures/Player/Cosmetics.ts b/src/Structures/Player/Cosmetics.ts deleted file mode 100644 index d647ba8a1..000000000 --- a/src/Structures/Player/Cosmetics.ts +++ /dev/null @@ -1,56 +0,0 @@ -import Pets from './Pets.js'; -import { RemoveSnakeCaseString } from '../../Utils/RemoveSnakeCase.js'; - -class Cosmetics { - cosmetics: string[]; - currentGadget: string | null; - pets: Pets; - suits: string[]; - hats: string[]; - gadgets: string[]; - morphs: string[]; - cloaks: string[]; - taunts: string[]; - rankColors: string[]; - particlePacks: string[]; - clickEffects: string[]; - constructor(data: Record) { - this.cosmetics = data?.vanityMeta?.packages || []; - this.currentGadget = data?.currentGadget || null; - this.pets = new Pets( - data, - this.cosmetics.filter((x) => x.startsWith('pet_')) - ); - this.suits = - this.cosmetics.filter((x) => x.startsWith('suit_')).map((x) => RemoveSnakeCaseString(x.replace('suit_', ''))) || - []; - this.hats = - this.cosmetics.filter((x) => x.startsWith('hat_')).map((x) => RemoveSnakeCaseString(x.replace('hat_', ''))) || []; - this.gadgets = - this.cosmetics - .filter((x) => x.startsWith('gadget_')) - .map((x) => RemoveSnakeCaseString(x.replace('gadget_', ''))) || []; - this.morphs = - this.cosmetics.filter((x) => x.startsWith('morph_')).map((x) => RemoveSnakeCaseString(x.replace('morph_', ''))) || - []; - this.cloaks = - this.cosmetics.filter((x) => x.startsWith('cloak_')).map((x) => RemoveSnakeCaseString(x.replace('cloak_', ''))) || - []; - this.taunts = - this.cosmetics.filter((x) => x.startsWith('taunt_')).map((x) => RemoveSnakeCaseString(x.replace('taunt_', ''))) || - []; - this.rankColors = - this.cosmetics - .filter((x) => x.startsWith('rankcolor_')) - .map((x) => RemoveSnakeCaseString(x.replace('rankcolor_', ''))) || []; - this.particlePacks = - this.cosmetics - .filter((x) => x.startsWith('particlepack_')) - .map((x) => RemoveSnakeCaseString(x.replace('particlepack_', ''))) || []; - this.clickEffects = - this.cosmetics - .filter((x) => x.startsWith('clickeffects_')) - .map((x) => RemoveSnakeCaseString(x.replace('clickeffects_', ''))) || []; - } -} -export default Cosmetics; diff --git a/src/Structures/Player/Gifting.test.ts b/src/Structures/Player/Gifting.test.ts deleted file mode 100644 index a5a9d79df..000000000 --- a/src/Structures/Player/Gifting.test.ts +++ /dev/null @@ -1,25 +0,0 @@ -import Gifting from './Gifting.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('Gifting', () => { - const data = new Gifting({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(Gifting); - expectTypeOf(data).toEqualTypeOf(); - expect(data.bundlesReceived).toBeDefined(); - expect(data.bundlesReceived).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bundlesReceived).toEqualTypeOf(); - expect(data.bundlesGiven).toBeDefined(); - expect(data.bundlesGiven).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bundlesGiven).toEqualTypeOf(); - expect(data.milestones).toBeDefined(); - expectTypeOf(data.milestones).toEqualTypeOf(); - expect(data.giftsGiven).toBeDefined(); - expect(data.giftsGiven).toBeGreaterThanOrEqual(0); - expectTypeOf(data.giftsGiven).toEqualTypeOf(); - expect(data.ranksGiven).toBeDefined(); - expect(data.ranksGiven).toBeGreaterThanOrEqual(0); - expectTypeOf(data.ranksGiven).toEqualTypeOf(); - expect(data.ranksGivenMilestones).toBeDefined(); - expectTypeOf(data.ranksGivenMilestones).toEqualTypeOf(); -}); diff --git a/src/Structures/Player/MonthlyCrate.test.ts b/src/Structures/Player/MonthlyCrate.test.ts deleted file mode 100644 index 85595ee3f..000000000 --- a/src/Structures/Player/MonthlyCrate.test.ts +++ /dev/null @@ -1,21 +0,0 @@ -import MonthlyCrate from './MonthlyCrate.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('MonthlyCrate', () => { - const data = new MonthlyCrate({ stats: 'meow' }, 'meow'); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(MonthlyCrate); - expectTypeOf(data).toEqualTypeOf(); - expect(data.date).toBeDefined(); - expectTypeOf(data.date).toEqualTypeOf(); - expect(data.REGULAR).toBeDefined(); - expectTypeOf(data.REGULAR).toEqualTypeOf(); - expect(data.VIP).toBeDefined(); - expectTypeOf(data.VIP).toEqualTypeOf(); - expect(data.VIP_PLUS).toBeDefined(); - expectTypeOf(data.VIP_PLUS).toEqualTypeOf(); - expect(data.MVP).toBeDefined(); - expectTypeOf(data.MVP).toEqualTypeOf(); - expect(data.MVP_PLUS).toBeDefined(); - expectTypeOf(data.MVP_PLUS).toEqualTypeOf(); -}); diff --git a/src/Structures/Player/MonthlyCrate.ts b/src/Structures/Player/MonthlyCrate.ts deleted file mode 100644 index 55e06e7c0..000000000 --- a/src/Structures/Player/MonthlyCrate.ts +++ /dev/null @@ -1,18 +0,0 @@ -class MonthlyCrate { - date: string; - REGULAR: boolean; - VIP: boolean; - VIP_PLUS: boolean; - MVP: boolean; - MVP_PLUS: boolean; - constructor(data: Record, date: string) { - this.date = date; - this.REGULAR = data.REGULAR || false; - this.VIP = data.VIP || false; - this.VIP_PLUS = data.VIP_PLUS || false; - this.MVP = data.MVP || false; - this.MVP_PLUS = data.MVP_PLUS || false; - } -} - -export default MonthlyCrate; diff --git a/src/Structures/Player/Parkour.test.ts b/src/Structures/Player/Parkour.test.ts deleted file mode 100644 index 2a166c318..000000000 --- a/src/Structures/Player/Parkour.test.ts +++ /dev/null @@ -1,17 +0,0 @@ -import Parkour from './Parkour.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('Parkour', () => { - const data = new Parkour({ stats: 'meow' }, { stats: 'meow' }, 'meow'); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(Parkour); - expectTypeOf(data).toEqualTypeOf(); - expect(data.location).toBeDefined(); - expectTypeOf(data.location).toEqualTypeOf(); - expect(data.timeStart).toBeDefined(); - expectTypeOf(data.timeStart).toEqualTypeOf(); - expect(data.timeTook).toBeDefined(); - expectTypeOf(data.timeTook).toEqualTypeOf(); - expect(data.checkPoints).toBeDefined(); - expectTypeOf(data.checkPoints).toEqualTypeOf(); -}); diff --git a/src/Structures/Player/Pet.test.ts b/src/Structures/Player/Pet.test.ts deleted file mode 100644 index f9ddc9dc6..000000000 --- a/src/Structures/Player/Pet.test.ts +++ /dev/null @@ -1,43 +0,0 @@ -import Pet from './Pet.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('Pet', () => { - const data = new Pet('meow', { stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(Pet); - expectTypeOf(data).toEqualTypeOf(); - expect(data.isFavorite).toBeDefined(); - expectTypeOf(data.isFavorite).toEqualTypeOf(); - expect(data.name).toBeDefined(); - expectTypeOf(data.name).toEqualTypeOf(); - expect(data.active).toBeDefined(); - expectTypeOf(data.active).toEqualTypeOf(); - expect(data.hunger).toBeDefined(); - expect(data.hunger).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hunger).toEqualTypeOf(); - expect(data.lastFed).toBeDefined(); - expectTypeOf(data.lastFed).toEqualTypeOf(); - expect(data.lastFedAt).toBeDefined(); - expectTypeOf(data.lastFedAt).toEqualTypeOf(); - expect(data.thirst).toBeDefined(); - expect(data.thirst).toBeGreaterThanOrEqual(0); - expectTypeOf(data.thirst).toEqualTypeOf(); - expect(data.lastDrank).toBeDefined(); - expectTypeOf(data.lastDrank).toEqualTypeOf(); - expect(data.lastDrankAt).toBeDefined(); - expectTypeOf(data.lastDrankAt).toEqualTypeOf(); - expect(data.exercise).toBeDefined(); - expect(data.exercise).toBeGreaterThanOrEqual(0); - expectTypeOf(data.exercise).toEqualTypeOf(); - expect(data.lastExercised).toBeDefined(); - expectTypeOf(data.lastExercised).toEqualTypeOf(); - expect(data.lastExercisedAt).toBeDefined(); - expectTypeOf(data.lastExercisedAt).toEqualTypeOf(); - expect(data.rawNickname).toBeDefined(); - expectTypeOf(data.rawNickname).toEqualTypeOf(); - expect(data.nickname).toBeDefined(); - expectTypeOf(data.nickname).toEqualTypeOf(); - expect(data.experience).toBeDefined(); - expect(data.experience).toBeGreaterThanOrEqual(0); - expectTypeOf(data.experience).toEqualTypeOf(); -}); diff --git a/src/Structures/Player/PetConsumables.test.ts b/src/Structures/Player/PetConsumables.test.ts deleted file mode 100644 index ceeebce18..000000000 --- a/src/Structures/Player/PetConsumables.test.ts +++ /dev/null @@ -1,90 +0,0 @@ -import PetConsumables from './PetConsumables.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('Pet Consumables', () => { - const data = new PetConsumables({ stats: 0 }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(PetConsumables); - expectTypeOf(data).toEqualTypeOf(); - expect(data.bakedPotato).toBeDefined(); - expect(data.bakedPotato).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bakedPotato).toEqualTypeOf(); - expect(data.cookie).toBeDefined(); - expect(data.cookie).toBeGreaterThanOrEqual(0); - expectTypeOf(data.cookie).toEqualTypeOf(); - expect(data.feather).toBeDefined(); - expect(data.feather).toBeGreaterThanOrEqual(0); - expectTypeOf(data.feather).toEqualTypeOf(); - expect(data.hayBlock).toBeDefined(); - expect(data.hayBlock).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hayBlock).toEqualTypeOf(); - expect(data.slimeBall).toBeDefined(); - expect(data.slimeBall).toBeGreaterThanOrEqual(0); - expectTypeOf(data.slimeBall).toEqualTypeOf(); - expect(data.cookedBeef).toBeDefined(); - expect(data.cookedBeef).toBeGreaterThanOrEqual(0); - expectTypeOf(data.cookedBeef).toEqualTypeOf(); - expect(data.redRose).toBeDefined(); - expect(data.redRose).toBeGreaterThanOrEqual(0); - expectTypeOf(data.redRose).toEqualTypeOf(); - expect(data.waterBucket).toBeDefined(); - expect(data.waterBucket).toBeGreaterThanOrEqual(0); - expectTypeOf(data.waterBucket).toEqualTypeOf(); - expect(data.melon).toBeDefined(); - expect(data.melon).toBeGreaterThanOrEqual(0); - expectTypeOf(data.melon).toEqualTypeOf(); - expect(data.stick).toBeDefined(); - expect(data.stick).toBeGreaterThanOrEqual(0); - expectTypeOf(data.stick).toEqualTypeOf(); - expect(data.woodSword).toBeDefined(); - expect(data.woodSword).toBeGreaterThanOrEqual(0); - expectTypeOf(data.woodSword).toEqualTypeOf(); - expect(data.milkBucket).toBeDefined(); - expect(data.milkBucket).toBeGreaterThanOrEqual(0); - expectTypeOf(data.milkBucket).toEqualTypeOf(); - expect(data.goldRecord).toBeDefined(); - expect(data.goldRecord).toBeGreaterThanOrEqual(0); - expectTypeOf(data.goldRecord).toEqualTypeOf(); - expect(data.leash).toBeDefined(); - expect(data.leash).toBeGreaterThanOrEqual(0); - expectTypeOf(data.leash).toEqualTypeOf(); - expect(data.lavaBucket).toBeDefined(); - expect(data.lavaBucket).toBeGreaterThanOrEqual(0); - expectTypeOf(data.lavaBucket).toEqualTypeOf(); - expect(data.bone).toBeDefined(); - expect(data.bone).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bone).toEqualTypeOf(); - expect(data.magmaCream).toBeDefined(); - expect(data.magmaCream).toBeGreaterThanOrEqual(0); - expectTypeOf(data.magmaCream).toEqualTypeOf(); - expect(data.wheat).toBeDefined(); - expect(data.wheat).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wheat).toEqualTypeOf(); - expect(data.mushroomSoup).toBeDefined(); - expect(data.mushroomSoup).toBeGreaterThanOrEqual(0); - expectTypeOf(data.mushroomSoup).toEqualTypeOf(); - expect(data.bread).toBeDefined(); - expect(data.bread).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bread).toEqualTypeOf(); - expect(data.pumpkinPie).toBeDefined(); - expect(data.pumpkinPie).toBeGreaterThanOrEqual(0); - expectTypeOf(data.pumpkinPie).toEqualTypeOf(); - expect(data.apple).toBeDefined(); - expect(data.apple).toBeGreaterThanOrEqual(0); - expectTypeOf(data.apple).toEqualTypeOf(); - expect(data.carrot).toBeDefined(); - expect(data.carrot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.carrot).toEqualTypeOf(); - expect(data.rawFish).toBeDefined(); - expect(data.rawFish).toBeGreaterThanOrEqual(0); - expectTypeOf(data.rawFish).toEqualTypeOf(); - expect(data.pork).toBeDefined(); - expect(data.pork).toBeGreaterThanOrEqual(0); - expectTypeOf(data.pork).toEqualTypeOf(); - expect(data.cake).toBeDefined(); - expect(data.cake).toBeGreaterThanOrEqual(0); - expectTypeOf(data.cake).toEqualTypeOf(); - expect(data.rottenFlesh).toBeDefined(); - expect(data.rottenFlesh).toBeGreaterThanOrEqual(0); - expectTypeOf(data.rottenFlesh).toEqualTypeOf(); -}); diff --git a/src/Structures/Player/Pets.test.ts b/src/Structures/Player/Pets.test.ts deleted file mode 100644 index d781fb7a2..000000000 --- a/src/Structures/Player/Pets.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -import Pet from './Pet.js'; -import PetConsumables from './PetConsumables.js'; -import Pets from './Pets.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('Pets', () => { - const data = new Pets({ stats: 'meow' }, ['meow']); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(Pets); - expectTypeOf(data).toEqualTypeOf(); - expect(data.pets).toBeDefined(); - expectTypeOf(data.pets).toEqualTypeOf(); - expect(data.lastJourneyTimestamp).toBeDefined(); - expectTypeOf(data.lastJourneyTimestamp).toEqualTypeOf(); - expect(data.lastJourneyAt).toBeDefined(); - expectTypeOf(data.lastJourneyAt).toEqualTypeOf(); - expect(data.petConsumables).toBeDefined(); - expectTypeOf(data.petConsumables).toEqualTypeOf(); -}); diff --git a/src/Structures/Player/Pets.ts b/src/Structures/Player/Pets.ts deleted file mode 100644 index 4f4031055..000000000 --- a/src/Structures/Player/Pets.ts +++ /dev/null @@ -1,17 +0,0 @@ -import Pet from './Pet.js'; -import PetConsumables from './PetConsumables.js'; - -class Pets { - pets: Pet[]; - lastJourneyTimestamp: number | null; - lastJourneyAt: Date | null; - petConsumables: PetConsumables; - constructor(data: Record, pets: string[]) { - this.pets = pets.map((x) => new Pet(x, data)); - this.lastJourneyTimestamp = data.petJourneyTimestamp || null; - this.lastJourneyAt = this.lastJourneyTimestamp ? new Date(this.lastJourneyTimestamp) : null; - this.petConsumables = new PetConsumables(data?.petConsumables || {}); - } -} - -export default Pets; diff --git a/src/Structures/Player/Player.test.ts b/src/Structures/Player/Player.test.ts deleted file mode 100644 index 4fe7ac361..000000000 --- a/src/Structures/Player/Player.test.ts +++ /dev/null @@ -1,184 +0,0 @@ -import Arcade from '../MiniGames/Arcade/Arcade.js'; -import ArenaBrawl from '../MiniGames/ArenaBrawl/ArenaBrawl.js'; -import BedWars from '../MiniGames/BedWars/BedWars.js'; -import BlitzSurvivalGames from '../MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.js'; -import BuildBattle from '../MiniGames/BuildBattle.js'; -import Color from '../Color.js'; -import CopsAndCrims from '../MiniGames/CopsAndCrims/CopsAndCrims.js'; -import Cosmetics from './Cosmetics.js'; -import Duels from '../MiniGames/Duels/Duels.js'; -import Gifting from './Gifting.js'; -import Guild from '../Guild/Guild.js'; -import House from '../House.js'; -import Housing from '../Housing.js'; -import MegaWalls from '../MiniGames/MegaWalls/MegaWalls.js'; -import MurderMystery from '../MiniGames/MurderMystery/MurderMystery.js'; -import Paintball from '../MiniGames/Paintball.js'; -import Parkour from './Parkour.js'; -import Pit from '../MiniGames/Pit/Pit.js'; -import Player from './Player.js'; -import PlayerAchievements from './PlayerAchievements.js'; -import PlayerQuests from './Quests/PlayerQuests.js'; -import Quakecraft from '../MiniGames/Quakecraft/Quakecraft.js'; -import RecentGame from '../RecentGame.js'; -import Rewards from './Rewards.js'; -import Seasonal from './Seasonal/Seasonal.js'; -import SkyWars from '../MiniGames/SkyWars/SkyWars.js'; -import SmashHeroes from '../MiniGames/SmashHeroes/SmashHeroes.js'; -import SocialMedia from './SocialMedia.js'; -import SpeedUHC from '../MiniGames/SpeedUHC/SpeedUHC.js'; -import TNTGames from '../MiniGames/TNTGames/TNTGames.js'; -import Tourney from './Tourney/Tourney.js'; -import TurboKartRacers from '../MiniGames/TurboKartRacers/TurboKartRacers.js'; -import UHC from '../MiniGames/UHC/UHC.js'; -import VampireZ from '../MiniGames/VampireZ/VampireZ.js'; -import Walls from '../MiniGames/Walls.js'; -import Warlords from '../MiniGames/Warlords/Warlords.js'; -import WoolGames from '../MiniGames/WoolGames/WoolGames.js'; -import { expect, expectTypeOf, test } from 'vitest'; -import type { - ChatChannel, - Language, - LevelProgress, - PlayerRank, - PlayerStats, - ScorpiusBribe -} from '../../Types/Player.js'; - -test('Player', () => { - const data = new Player({ stats: 'meow' }, { guild: null, houses: null, recentGames: null }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(Player); - expectTypeOf(data).toEqualTypeOf(); - expect(data.uuid).toBeDefined(); - expectTypeOf(data.uuid).toEqualTypeOf(); - expect(data.nickname).toBeDefined(); - expectTypeOf(data.nickname).toEqualTypeOf(); - expect(data.rank).toBeDefined(); - expectTypeOf(data.rank).toEqualTypeOf(); - expect(data.mvpPlusColor).toBeDefined(); - expectTypeOf(data.mvpPlusColor).toEqualTypeOf(); - expect(data.mvpPlusPlusColor).toBeDefined(); - expectTypeOf(data.mvpPlusPlusColor).toEqualTypeOf(); - expect(data.gifting).toBeDefined(); - expectTypeOf(data.gifting).toEqualTypeOf(); - expect(data.socialMedia).toBeDefined(); - expectTypeOf(data.socialMedia).toEqualTypeOf(); - expect(data.firstLoginTimestamp).toBeDefined(); - expect(data.firstLoginTimestamp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.firstLoginTimestamp).toEqualTypeOf(); - expect(data.firstLoginAt).toBeDefined(); - expectTypeOf(data.firstLoginAt).toEqualTypeOf(); - expect(data.lastLoginTimestamp).toBeDefined(); - expectTypeOf(data.lastLoginTimestamp).toEqualTypeOf(); - expect(data.lastLoginAt).toBeDefined(); - expectTypeOf(data.lastLoginAt).toEqualTypeOf(); - expect(data.achievements).toBeDefined(); - expectTypeOf(data.achievements).toEqualTypeOf(); - expect(data.language).toBeDefined(); - expectTypeOf(data.language).toEqualTypeOf(); - expect(data.channel).toBeDefined(); - expectTypeOf(data.channel).toEqualTypeOf(); - expect(data.exp).toBeDefined(); - expect(data.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.exp).toEqualTypeOf(); - expect(data.level).toBeDefined(); - expectTypeOf(data.level).toEqualTypeOf(); - expect(data.seasonal).toBeDefined(); - expectTypeOf(data.seasonal).toEqualTypeOf(); - expect(data.karma).toBeDefined(); - expect(data.karma).toBeGreaterThanOrEqual(0); - expectTypeOf(data.karma).toEqualTypeOf(); - expect(data.freeSkyBlockCookie).toBeDefined(); - expectTypeOf(data.freeSkyBlockCookie).toEqualTypeOf(); - expect(data.tourney).toBeDefined(); - expectTypeOf(data.tourney).toEqualTypeOf(); - expect(data.rewards).toBeDefined(); - expectTypeOf(data.rewards).toEqualTypeOf(); - expect(data.challenges).toBeDefined(); - expectTypeOf(data.challenges).toEqualTypeOf(); - expect(data.parkour).toBeDefined(); - expectTypeOf(data.parkour).toEqualTypeOf(); - expect(data.housing).toBeDefined(); - expectTypeOf(data.housing).toEqualTypeOf(); - expect(data.cosmetics).toBeDefined(); - expectTypeOf(data.cosmetics).toEqualTypeOf(); - expect(data.scorpiusBribes).toBeDefined(); - expectTypeOf(data.scorpiusBribes).toEqualTypeOf(); - expect(data.quests).toBeDefined(); - expectTypeOf(data.quests).toEqualTypeOf(); - expect(data.guild).toBeDefined(); - expectTypeOf(data.guild).toEqualTypeOf(); - expect(data.houses).toBeDefined(); - expectTypeOf(data.houses).toEqualTypeOf(); - expect(data.recentGames).toBeDefined(); - expectTypeOf(data.recentGames).toEqualTypeOf(); - expect(data.stats).toBeDefined(); - expectTypeOf(data.stats).toEqualTypeOf(); - expect(data.stats.Arcade).toBeDefined(); - expect(data.stats.Arcade).toBeInstanceOf(Arcade); - expectTypeOf(data.stats.Arcade).toEqualTypeOf(); - expect(data.stats.ArenaBrawl).toBeDefined(); - expect(data.stats.ArenaBrawl).toBeInstanceOf(ArenaBrawl); - expectTypeOf(data.stats.ArenaBrawl).toEqualTypeOf(); - expect(data.stats.BedWars).toBeDefined(); - expect(data.stats.BedWars).toBeInstanceOf(BedWars); - expectTypeOf(data.stats.BedWars).toEqualTypeOf(); - expect(data.stats.BlitzSurvivalGames).toBeDefined(); - expect(data.stats.BlitzSurvivalGames).toBeInstanceOf(BlitzSurvivalGames); - expectTypeOf(data.stats.BlitzSurvivalGames).toEqualTypeOf(); - expect(data.stats.BuildBattle).toBeDefined(); - expect(data.stats.BuildBattle).toBeInstanceOf(BuildBattle); - expectTypeOf(data.stats.BuildBattle).toEqualTypeOf(); - expect(data.stats.CopsAndCrims).toBeDefined(); - expect(data.stats.CopsAndCrims).toBeInstanceOf(CopsAndCrims); - expectTypeOf(data.stats.CopsAndCrims).toEqualTypeOf(); - expect(data.stats.Duels).toBeDefined(); - expect(data.stats.Duels).toBeInstanceOf(Duels); - expectTypeOf(data.stats.Duels).toEqualTypeOf(); - expect(data.stats.MegaWalls).toBeDefined(); - expect(data.stats.MegaWalls).toBeInstanceOf(MegaWalls); - expectTypeOf(data.stats.MegaWalls).toEqualTypeOf(); - expect(data.stats.MurderMystery).toBeDefined(); - expect(data.stats.MurderMystery).toBeInstanceOf(MurderMystery); - expectTypeOf(data.stats.MurderMystery).toEqualTypeOf(); - expect(data.stats.Paintball).toBeDefined(); - expect(data.stats.Paintball).toBeInstanceOf(Paintball); - expectTypeOf(data.stats.Paintball).toEqualTypeOf(); - expect(data.stats.Pit).toBeDefined(); - expect(data.stats.Pit).toBeInstanceOf(Pit); - expectTypeOf(data.stats.Pit).toEqualTypeOf(); - expect(data.stats.QuakeCraft).toBeDefined(); - expect(data.stats.QuakeCraft).toBeInstanceOf(Quakecraft); - expectTypeOf(data.stats.QuakeCraft).toEqualTypeOf(); - expect(data.stats.SkyWars).toBeDefined(); - expect(data.stats.SkyWars).toBeInstanceOf(SkyWars); - expectTypeOf(data.stats.SkyWars).toEqualTypeOf(); - expect(data.stats.SmashHeroes).toBeDefined(); - expect(data.stats.SmashHeroes).toBeInstanceOf(SmashHeroes); - expectTypeOf(data.stats.SmashHeroes).toEqualTypeOf(); - expect(data.stats.SpeedUHC).toBeDefined(); - expect(data.stats.SpeedUHC).toBeInstanceOf(SpeedUHC); - expectTypeOf(data.stats.SpeedUHC).toEqualTypeOf(); - expect(data.stats.TNTGames).toBeDefined(); - expect(data.stats.TNTGames).toBeInstanceOf(TNTGames); - expectTypeOf(data.stats.TNTGames).toEqualTypeOf(); - expect(data.stats.TurboKartRacers).toBeDefined(); - expect(data.stats.TurboKartRacers).toBeInstanceOf(TurboKartRacers); - expectTypeOf(data.stats.TurboKartRacers).toEqualTypeOf(); - expect(data.stats.UHC).toBeDefined(); - expect(data.stats.UHC).toBeInstanceOf(UHC); - expectTypeOf(data.stats.UHC).toEqualTypeOf(); - expect(data.stats.VampireZ).toBeDefined(); - expect(data.stats.VampireZ).toBeInstanceOf(VampireZ); - expectTypeOf(data.stats.VampireZ).toEqualTypeOf(); - expect(data.stats.Walls).toBeDefined(); - expect(data.stats.Walls).toBeInstanceOf(Walls); - expectTypeOf(data.stats.Walls).toEqualTypeOf(); - expect(data.stats.Warlords).toBeDefined(); - expect(data.stats.Warlords).toBeInstanceOf(Warlords); - expectTypeOf(data.stats.Warlords).toEqualTypeOf(); - expect(data.stats.WoolGames).toBeDefined(); - expect(data.stats.WoolGames).toBeInstanceOf(WoolGames); - expectTypeOf(data.stats.WoolGames).toEqualTypeOf(); -}); diff --git a/src/Structures/Player/Player.ts b/src/Structures/Player/Player.ts index 765d41c2f..bebc138cb 100644 --- a/src/Structures/Player/Player.ts +++ b/src/Structures/Player/Player.ts @@ -1,152 +1,175 @@ -import Arcade from '../MiniGames/Arcade/Arcade.js'; -import ArenaBrawl from '../MiniGames/ArenaBrawl/ArenaBrawl.js'; -import BedWars from '../MiniGames/BedWars/BedWars.js'; -import BlitzSurvivalGames from '../MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.js'; -import BuildBattle from '../MiniGames/BuildBattle.js'; -import Color from '../Color.js'; -import CopsAndCrims from '../MiniGames/CopsAndCrims/CopsAndCrims.js'; -import Cosmetics from './Cosmetics.js'; -import Duels from '../MiniGames/Duels/Duels.js'; -import Gifting from './Gifting.js'; import Guild from '../Guild/Guild.js'; import House from '../House.js'; -import Housing from '../Housing.js'; -import MegaWalls from '../MiniGames/MegaWalls/MegaWalls.js'; -import MurderMystery from '../MiniGames/MurderMystery/MurderMystery.js'; -import Paintball from '../MiniGames/Paintball.js'; -import Parkour from './Parkour.js'; -import Pit from '../MiniGames/Pit/Pit.js'; -import PlayerAchievements from './PlayerAchievements.js'; -import PlayerQuests from './Quests/PlayerQuests.js'; -import Quakecraft from '../MiniGames/Quakecraft/Quakecraft.js'; +import PlayerAchievements from './PlayerAchievements/PlayerAchievements.js'; +import PlayerAdventRewards from './PlayerAdventRewards/PlayerAdventRewards.js'; +import PlayerCosmetics from './PlayerCosmetics/PlayerCosmetics.js'; +import PlayerGifting from './PlayerGifting.js'; +import PlayerHousing from './PlayerHousing/PlayerHousing.js'; +import PlayerParkour from './PlayerParkour.js'; +import PlayerQuests from './PlayerQuests/PlayerQuests.js'; +import PlayerRankPurchase from './PlayerRankPurchase.js'; +import PlayerRewards from './PlayerRewards/PlayerRewards.js'; +import PlayerScorpiusBribe from './PlayerScorpiusBribe.js'; +import PlayerSocialMedia from './PlayerSocialMedia.js'; +import PlayerStats from './PlayerStats.js'; import RecentGame from '../RecentGame.js'; -import Rewards from './Rewards.js'; -import Seasonal from './Seasonal/Seasonal.js'; -import SkyWars from '../MiniGames/SkyWars/SkyWars.js'; -import SmashHeroes from '../MiniGames/SmashHeroes/SmashHeroes.js'; -import SocialMedia, { parseSocialMedia } from './SocialMedia.js'; -import SpeedUHC from '../MiniGames/SpeedUHC/SpeedUHC.js'; -import TNTGames from '../MiniGames/TNTGames/TNTGames.js'; -import Tourney from './Tourney/Tourney.js'; -import TurboKartRacers from '../MiniGames/TurboKartRacers/TurboKartRacers.js'; -import UHC from '../MiniGames/UHC/UHC.js'; -import VampireZ from '../MiniGames/VampireZ/VampireZ.js'; -import Walls from '../MiniGames/Walls.js'; -import Warlords from '../MiniGames/Warlords/Warlords.js'; -import WoolGames from '../MiniGames/WoolGames/WoolGames.js'; -import { getRank, playerLevelProgress } from '../../Utils/PlayerUtils.js'; -import type { - ChatChannel, - Language, - LevelProgress, - PlayerRank, - PlayerStats, - ScorpiusBribe -} from '../../Types/Player.js'; -import type { UUID } from '../../Types/Global.js'; +import type { ChatChannel, Language, LevelProgress, PlayerRank } from '../../Types/Player.js'; class Player { - uuid: UUID; nickname: string; + uuid: string; rank: PlayerRank; - mvpPlusColor: Color | null; - mvpPlusPlusColor: Color | null; - gifting: Gifting; - socialMedia: SocialMedia[]; - firstLoginTimestamp: number; - firstLoginAt: Date; - lastLoginTimestamp: number | null; + firstLoginAt: Date | null; lastLoginAt: Date | null; + lastLogoutAt: Date | null; achievements: PlayerAchievements; - language: Language; - channel: ChatChannel; - exp: number; - level: LevelProgress; - seasonal: Seasonal; karma: number; - freeSkyBlockCookie: number | null; - tourney: Tourney; - rewards: Rewards; - challenges: object; - parkour: Parkour[]; - housing: Housing; - cosmetics: Cosmetics; - scorpiusBribes: ScorpiusBribe[]; + stats: PlayerStats; + level: LevelProgress; + claimedCenturyCakeAt: Date | null; + language: Language; + cosmetics: PlayerCosmetics; + rankPurchase: PlayerRankPurchase; + challenges: Record>; quests: PlayerQuests; + rewards: PlayerRewards; + parkour: PlayerParkour[]; + channel: ChatChannel; + skyBlockFreeCookieAt: Date | null; + housing: PlayerHousing; + adventRewards: PlayerAdventRewards[]; + gifting: PlayerGifting; + socialMedia: PlayerSocialMedia; + scorpiusBribes: PlayerScorpiusBribe[]; + guild: Guild | null; houses: House[] | null; recentGames: RecentGame[] | null; - stats: PlayerStats; constructor( data: Record, extra: { guild: Guild | null; houses: House[] | null; recentGames: RecentGame[] | null } ) { - this.uuid = data.uuid || ''; - this.nickname = data.displayname || ''; - this.rank = getRank(data); - this.mvpPlusColor = data.rankPlusColor ? new Color(data.rankPlusColor) : null; - this.mvpPlusPlusColor = data.monthlyRankColor ? new Color(data.monthlyRankColor) : null; - this.gifting = new Gifting(data?.giftingMeta || {}); - this.socialMedia = parseSocialMedia(data?.socialMedia?.links || {}); - this.firstLoginTimestamp = data?.firstLogin || 0; - this.firstLoginAt = new Date(this.firstLoginTimestamp); - this.lastLoginTimestamp = data?.lastLogin || null; - this.lastLoginAt = this.lastLoginTimestamp ? new Date(this.lastLoginTimestamp) : null; - this.achievements = new PlayerAchievements(data); - this.language = data?.userLanguage || 'ENGLISH'; - this.channel = data.channel || 'ALL'; - this.exp = data?.networkExp || 0; - this.level = playerLevelProgress(this.exp); - this.seasonal = new Seasonal(data?.seasonal || {}); + this.nickname = data?.displayname || 'UNKNOWN'; + this.uuid = data?.uuid || 'UNKNOWN'; + this.rank = this.getRank(data); + this.firstLoginAt = data?.firstLogin ? new Date(data?.firstLogin) : null; + this.lastLoginAt = data?.lastLogin ? new Date(data?.lastLogin) : null; + this.lastLogoutAt = data?.lastLogout ? new Date(data?.lastLogout) : null; + this.achievements = new PlayerAchievements(data || {}); this.karma = data?.karma || 0; - this.freeSkyBlockCookie = data?.skyblock_free_cookie || null; - this.tourney = new Tourney(data?.tourney || {}); - this.rewards = new Rewards(data); + this.stats = new PlayerStats(data?.stats || {}); + this.level = this.getPlayerLevelProgress(data?.networkExp || 0); + this.claimedCenturyCakeAt = data?.claimed_century_cake ? new Date(data?.claimed_century_cake) : null; + this.language = data?.userLanguage || 'ENGLISH'; + this.cosmetics = new PlayerCosmetics(data || {}); + this.rankPurchase = new PlayerRankPurchase(data || {}); this.challenges = data?.challenges || {}; - this.parkour = []; - Object.keys(data?.parkourCompletions || {}).map((location) => { - this.parkour.push(new Parkour(data?.parkourCompletions || {}, data?.parkourCheckpointBests || {}, location)); - }); - this.housing = new Housing(data?.housingMeta || {}); - this.cosmetics = new Cosmetics(data); - this.scorpiusBribes = []; - Object.keys(data) - .filter((key) => key.startsWith('scorpius_bribe_')) - .forEach((key) => { - this.scorpiusBribes.push({ year: Number(key), timestamp: data[key] }); - }); this.quests = new PlayerQuests(data?.quests || {}, data?.questSettings?.autoActivate || false); - this.guild = extra.guild || null; - this.houses = extra.houses || null; - this.recentGames = extra.recentGames || null; - this.stats = { - Arcade: new Arcade(data?.stats?.Arcade), - ArenaBrawl: new ArenaBrawl(data?.stats?.Arena), - BedWars: new BedWars(data?.stats?.Bedwars), - BlitzSurvivalGames: new BlitzSurvivalGames(data?.stats?.HungerGames), - BuildBattle: new BuildBattle(data?.stats?.BuildBattle), - CopsAndCrims: new CopsAndCrims(data?.stats?.MCGO), - Duels: new Duels(data?.stats?.Duels), - MegaWalls: new MegaWalls(data?.stats?.Walls3), - MurderMystery: new MurderMystery(data?.stats?.MurderMystery), - Paintball: new Paintball(data?.stats?.Paintball), - Pit: new Pit(data?.stats?.Pit), - QuakeCraft: new Quakecraft(data?.stats?.Quake), - SkyWars: new SkyWars(data?.stats?.SkyWars), - SmashHeroes: new SmashHeroes(data?.stats?.SuperSmash), - SpeedUHC: new SpeedUHC(data?.stats?.SpeedUHC), - TNTGames: new TNTGames(data?.stats?.TNTGames), - TurboKartRacers: new TurboKartRacers(data?.stats?.GingerBread), - UHC: new UHC(data?.stats?.UHC), - VampireZ: new VampireZ(data?.stats?.VampireZ), - Walls: new Walls(data?.stats?.Walls), - Warlords: new Warlords(data?.stats?.Battleground), - WoolGames: new WoolGames(data?.stats?.WoolGames) - }; + this.rewards = new PlayerRewards(data || {}); + this.parkour = Object.keys(data?.parkourCompletions || {}).map( + (location) => new PlayerParkour(data?.parkourCompletions || {}, data?.parkourCheckpointBests || {}, location) + ); + this.channel = data?.channel || 'ALL'; + this.skyBlockFreeCookieAt = data?.skyblock_free_cookie ? new Date(data?.skyblock_free_cookie) : null; + this.housing = new PlayerHousing(data?.housingMeta || {}); + this.adventRewards = Object.keys(data) + .filter((key) => key.startsWith('adventRewards')) + .map( + (adventReward) => + new PlayerAdventRewards(data[adventReward], adventReward.split('adventRewards')[1] || 'UNKNOWN') + ); + this.gifting = new PlayerGifting(data?.giftingMeta || {}); + this.socialMedia = new PlayerSocialMedia(data?.socialMedia?.links || {}); + this.scorpiusBribes = + Object.keys(data) + .filter((key) => key.startsWith('scorpius_bribe_')) + .map((bribe) => new PlayerScorpiusBribe(data[bribe], bribe.split('scorpius_bribe_')[1] || 'UNKNOWN')) || []; + + this.guild = extra.guild; + this.houses = extra.houses; + this.recentGames = extra.recentGames; + } + + private getRank(player: Record): PlayerRank { + if (player.prefix) { + switch (player.prefix.replace(/§[0-9|a-z]|\[|\]/g, '')) { + case 'EVENTS': + return 'Events'; + case 'MOJANG': + return 'Mojang'; + case 'PIG+++': + return 'PIG+++'; + case 'INNIT': + return 'Innit'; + default: + return null; + } + } else if (player.rank) { + switch (player.rank) { + case 'ADMIN': + return 'Admin'; + case 'GAME_MASTER': + return 'Game Master'; + default: + return null; + } + } else { + switch (player.newPackageRank) { + case 'MVP_PLUS': + return 'SUPERSTAR' !== player.monthlyPackageRank ? 'MVP+' : 'MVP++'; + case 'MVP': + return 'MVP'; + case 'VIP_PLUS': + return 'VIP+'; + case 'VIP': + return 'VIP'; + default: + return null; + } + } + } + + private getPlayerLevel(exp: number): number { + const base = 10000; + const growth = 2500; + const reversePqPrefix = -(base - 0.5 * growth) / growth; + const reverseConst = reversePqPrefix * reversePqPrefix; + const growthDivides2 = 2 / growth; + const num = 1 + reversePqPrefix + Math.sqrt(reverseConst + growthDivides2 * exp); + const level = Math.round(num * 100) / 100; + return level; } - toString(): string { - return this.nickname; + private xpToNextLevel(xp: number): number { + const lvl = this.getPlayerLevel(xp); + const xpToNext = 2500 * Math.floor(lvl) + 5000; + if (10000 > xp) return 10000; + return xpToNext; + } + + private levelToXP(xp: number): number { + let level = Number(Math.floor(this.getPlayerLevel(xp))); + level = level - 1; + return 1250 * level ** 2 + 8750 * level; + } + + private getPlayerLevelProgress(totalXp: number): LevelProgress { + const xpFromLevel = this.levelToXP(totalXp); + let currentXP = totalXp - xpFromLevel; + const xpToNext = this.xpToNextLevel(totalXp); + const remainingXP = xpToNext - currentXP + 2500; + currentXP = currentXP - 2500; + const percent = Math.round((currentXP / xpToNext) * 100 * 100) / 100; + const percentRemaining = Math.round((100 - percent) * 100) / 100; + return { + level: this.getPlayerLevel(totalXp), + totalXp, + xpToNext, + remainingXP, + currentXP, + percent, + percentRemaining + }; } } diff --git a/src/Structures/Player/PlayerAchievements.test.ts b/src/Structures/Player/PlayerAchievements.test.ts deleted file mode 100644 index f766ec04f..000000000 --- a/src/Structures/Player/PlayerAchievements.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import PlayerAchievements from './PlayerAchievements.js'; -import PlayerAchievementsRewards from './PlayerAchievementsRewards.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('PlayerAchievements', () => { - const data = new PlayerAchievements({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(PlayerAchievements); - expectTypeOf(data).toEqualTypeOf(); - expect(data.points).toBeDefined(); - expect(data.points).toBeGreaterThanOrEqual(0); - expectTypeOf(data.points).toEqualTypeOf(); - expect(data.rewards).toBeDefined(); - expectTypeOf(data.rewards).toEqualTypeOf(); - expect(data.tracking).toBeDefined(); - expectTypeOf(data.tracking).toEqualTypeOf(); - expect(data.achievements).toBeDefined(); - expectTypeOf(data.achievements).toEqualTypeOf>(); - expect(data.oneTime).toBeDefined(); - expectTypeOf(data.oneTime).toEqualTypeOf(); - expect(data.totem).toBeDefined(); - expectTypeOf(data.totem).toEqualTypeOf>(); -}); diff --git a/src/Structures/Player/PlayerAchievements.ts b/src/Structures/Player/PlayerAchievements/PlayerAchievements.ts similarity index 55% rename from src/Structures/Player/PlayerAchievements.ts rename to src/Structures/Player/PlayerAchievements/PlayerAchievements.ts index 8e6bc15c1..abcd322e4 100644 --- a/src/Structures/Player/PlayerAchievements.ts +++ b/src/Structures/Player/PlayerAchievements/PlayerAchievements.ts @@ -1,4 +1,6 @@ import PlayerAchievementsRewards from './PlayerAchievementsRewards.js'; +import PlayerAchievementsTotem from './PlayerAchivementsTotem.js'; +import type { PlayerAchievementsOneTimeSort } from '../../../Types/Player.js'; class PlayerAchievements { points: number; @@ -6,14 +8,16 @@ class PlayerAchievements { tracking: string[]; achievements: Record; oneTime: string[]; - totem: Record; + oneTimeAchievementMenuSort: PlayerAchievementsOneTimeSort; + totem: PlayerAchievementsTotem; constructor(data: Record) { this.points = data?.achievementPoints || 0; this.rewards = new PlayerAchievementsRewards(data?.achievementRewardsNew || {}); this.tracking = data?.achievementTracking || []; this.achievements = data?.achievements || {}; - this.oneTime = data.achievementsOneTime || []; - this.totem = data?.achievementTotem || {}; + this.oneTime = data?.achievementsOneTime || []; + this.oneTimeAchievementMenuSort = data?.onetime_achievement_menu_sort || 'a_to_z'; + this.totem = new PlayerAchievementsTotem(data?.achievementTotem || {}); } } diff --git a/src/Structures/Player/PlayerAchievementsRewards.ts b/src/Structures/Player/PlayerAchievements/PlayerAchievementsRewards.ts similarity index 100% rename from src/Structures/Player/PlayerAchievementsRewards.ts rename to src/Structures/Player/PlayerAchievements/PlayerAchievementsRewards.ts diff --git a/src/Structures/Player/PlayerAchievements/PlayerAchivementsTotem.ts b/src/Structures/Player/PlayerAchievements/PlayerAchivementsTotem.ts new file mode 100644 index 000000000..6315ab90e --- /dev/null +++ b/src/Structures/Player/PlayerAchievements/PlayerAchivementsTotem.ts @@ -0,0 +1,20 @@ +import type { PlayerAchievementsTotemColors, PlayerAchievementsTotemParts } from '../../../Types/Player.js'; + +class PlayerAchievementsTotem { + canCustomize: boolean; + allowedMaxHeight: number; + unlockedParts: PlayerAchievementsTotemParts[]; + selectedParts: Record; + unlockedColors: PlayerAchievementsTotemColors[]; + selectedColors: Record; + constructor(data: Record) { + this.canCustomize = data?.canCustomize || false; + this.allowedMaxHeight = data?.allowed_max_height || 0; + this.unlockedParts = data?.unlockedParts || []; + this.selectedParts = data?.selectedParts || {}; + this.unlockedColors = data?.unlockedColors || []; + this.selectedColors = data?.selectedColors || {}; + } +} + +export default PlayerAchievementsTotem; diff --git a/src/Structures/Player/PlayerAchievementsRewards.test.ts b/src/Structures/Player/PlayerAchievementsRewards.test.ts deleted file mode 100644 index 902e500a0..000000000 --- a/src/Structures/Player/PlayerAchievementsRewards.test.ts +++ /dev/null @@ -1,9 +0,0 @@ -import PlayerAchievementsRewards from './PlayerAchievementsRewards.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('PlayerAchievementsRewards', () => { - const data = new PlayerAchievementsRewards({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(PlayerAchievementsRewards); - expectTypeOf(data).toEqualTypeOf(); -}); diff --git a/src/Structures/Player/PlayerAdventRewards/PlayerAdventRewards.ts b/src/Structures/Player/PlayerAdventRewards/PlayerAdventRewards.ts new file mode 100644 index 000000000..d76c3643a --- /dev/null +++ b/src/Structures/Player/PlayerAdventRewards/PlayerAdventRewards.ts @@ -0,0 +1,60 @@ +import PlayerAdventRewardsDay from './PlayerAdventRewardsDay.js'; + +class PlayerAdventRewards { + year: number; + day1: PlayerAdventRewardsDay; + day2: PlayerAdventRewardsDay; + day3: PlayerAdventRewardsDay; + day4: PlayerAdventRewardsDay; + day5: PlayerAdventRewardsDay; + day6: PlayerAdventRewardsDay; + day7: PlayerAdventRewardsDay; + day8: PlayerAdventRewardsDay; + day9: PlayerAdventRewardsDay; + day10: PlayerAdventRewardsDay; + day11: PlayerAdventRewardsDay; + day12: PlayerAdventRewardsDay; + day13: PlayerAdventRewardsDay; + day14: PlayerAdventRewardsDay; + day15: PlayerAdventRewardsDay; + day16: PlayerAdventRewardsDay; + day17: PlayerAdventRewardsDay; + day18: PlayerAdventRewardsDay; + day19: PlayerAdventRewardsDay; + day20: PlayerAdventRewardsDay; + day21: PlayerAdventRewardsDay; + day22: PlayerAdventRewardsDay; + day23: PlayerAdventRewardsDay; + day24: PlayerAdventRewardsDay; + day25: PlayerAdventRewardsDay; + constructor(data: Record, year: string) { + this.year = Number(year); + this.day1 = new PlayerAdventRewardsDay(data, '1'); + this.day2 = new PlayerAdventRewardsDay(data, '2'); + this.day3 = new PlayerAdventRewardsDay(data, '3'); + this.day4 = new PlayerAdventRewardsDay(data, '4'); + this.day5 = new PlayerAdventRewardsDay(data, '5'); + this.day6 = new PlayerAdventRewardsDay(data, '6'); + this.day7 = new PlayerAdventRewardsDay(data, '7'); + this.day8 = new PlayerAdventRewardsDay(data, '8'); + this.day9 = new PlayerAdventRewardsDay(data, '9'); + this.day10 = new PlayerAdventRewardsDay(data, '10'); + this.day11 = new PlayerAdventRewardsDay(data, '11'); + this.day12 = new PlayerAdventRewardsDay(data, '12'); + this.day13 = new PlayerAdventRewardsDay(data, '13'); + this.day14 = new PlayerAdventRewardsDay(data, '14'); + this.day15 = new PlayerAdventRewardsDay(data, '15'); + this.day16 = new PlayerAdventRewardsDay(data, '16'); + this.day17 = new PlayerAdventRewardsDay(data, '17'); + this.day18 = new PlayerAdventRewardsDay(data, '18'); + this.day19 = new PlayerAdventRewardsDay(data, '19'); + this.day20 = new PlayerAdventRewardsDay(data, '20'); + this.day21 = new PlayerAdventRewardsDay(data, '21'); + this.day22 = new PlayerAdventRewardsDay(data, '22'); + this.day23 = new PlayerAdventRewardsDay(data, '23'); + this.day24 = new PlayerAdventRewardsDay(data, '24'); + this.day25 = new PlayerAdventRewardsDay(data, '25'); + } +} + +export default PlayerAdventRewards; diff --git a/src/Structures/Player/PlayerAdventRewards/PlayerAdventRewardsDay.ts b/src/Structures/Player/PlayerAdventRewards/PlayerAdventRewardsDay.ts new file mode 100644 index 000000000..45eb769ee --- /dev/null +++ b/src/Structures/Player/PlayerAdventRewards/PlayerAdventRewardsDay.ts @@ -0,0 +1,14 @@ +class PlayerAdventRewardsDay { + day: number; + claimed: boolean; + claimedTimestamp: number | null; + claimedAt: Date | null; + constructor(data: Record, day: string) { + this.day = Number(day); + this.claimed = Boolean(data?.[`day${day}`]); + this.claimedTimestamp = this.claimed ? data?.[`day${day}`] : null; + this.claimedAt = this.claimedTimestamp ? new Date(this.claimedTimestamp) : null; + } +} + +export default PlayerAdventRewardsDay; diff --git a/src/Structures/Player/Pet.ts b/src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPet.ts similarity index 73% rename from src/Structures/Player/Pet.ts rename to src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPet.ts index 6a9fb6fff..afdd9fb71 100644 --- a/src/Structures/Player/Pet.ts +++ b/src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPet.ts @@ -1,8 +1,8 @@ -import { recursive } from '../../Utils/RemoveSnakeCase.js'; +import type { PlayerCosmeticsPetName } from '../../../../Types/Player.js'; -class Pet { +class PlayerCosmeticsPet { isFavorite: boolean; - name: string | null; + name: PlayerCosmeticsPetName | 'UNKNOWN'; active: boolean; hunger: number; lastFed: number | null; @@ -13,14 +13,12 @@ class Pet { exercise: number; lastExercised: number | null; lastExercisedAt: Date | null; - rawNickname: string; nickname: string; experience: number; - constructor(name: string, data: Record) { - this.isFavorite = data?.vanityFavorites ? Boolean(data?.vanityFavorites.includes(name.toUpperCase())) : false; + this.isFavorite = data?.vanityFavorites ? Boolean(name.toUpperCase() === data?.vanityFavorites) : false; name = name.replace('pet_', ''); - this.name = recursive(name) || null; + this.name = name as PlayerCosmeticsPetName; this.active = data?.currentPet === name.toUpperCase(); const stats = data?.petStats?.[name.toUpperCase()] || {}; this.hunger = stats?.HUNGER?.value || 0; @@ -32,10 +30,9 @@ class Pet { this.exercise = stats?.EXERCISE?.value || 0; this.lastExercised = stats?.EXERCISE ? stats?.EXERCISE?.timestamp : null; this.lastExercisedAt = this.lastExercised ? new Date(this.lastExercised) : null; - this.rawNickname = stats?.name || ''; - this.nickname = this.rawNickname.replace(/§([0-9]|[a-f])|§/gm, ''); + this.nickname = stats?.name || ''; this.experience = stats?.experience || 0; } } -export default Pet; +export default PlayerCosmeticsPet; diff --git a/src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPets.ts b/src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPets.ts new file mode 100644 index 000000000..0d406af6d --- /dev/null +++ b/src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPets.ts @@ -0,0 +1,17 @@ +import PlayerCosmeticsPet from './PlayerCosmeticsPet.js'; +import PlayerCosmeticsPetsConsumables from './PlayerCosmeticsPetsConsumables.js'; + +class PlayerCosmeticsPets { + lastJourney: number | null; + lastJourneyAt: Date | null; + consumables: PlayerCosmeticsPetsConsumables; + pets: PlayerCosmeticsPet[]; + constructor(data: Record, pets: string[]) { + this.lastJourney = data.petJourneyTimestamp || null; + this.lastJourneyAt = this.lastJourney ? new Date(this.lastJourney) : null; + this.consumables = new PlayerCosmeticsPetsConsumables(data?.petConsumables || {}); + this.pets = pets.map((petName) => new PlayerCosmeticsPet(petName, data)); + } +} + +export default PlayerCosmeticsPets; diff --git a/src/Structures/Player/PetConsumables.ts b/src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPetsConsumables.ts similarity index 92% rename from src/Structures/Player/PetConsumables.ts rename to src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPetsConsumables.ts index 90b194542..3af428562 100644 --- a/src/Structures/Player/PetConsumables.ts +++ b/src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPetsConsumables.ts @@ -1,60 +1,60 @@ -class PetConsumables { - bakedPotato: number; +class PlayerCosmeticsPetsConsumables { + cake: number; cookie: number; feather: number; - hayBlock: number; - slimeBall: number; - cookedBeef: number; - redRose: number; - waterBucket: number; - melon: number; - stick: number; - woodSword: number; - milkBucket: number; goldRecord: number; - leash: number; + hayBlock: number; lavaBucket: number; - bone: number; + leash: number; magmaCream: number; - wheat: number; + melon: number; + milkBucket: number; mushroomSoup: number; - bread: number; + pork: number; pumpkinPie: number; + rawFish: number; + slimeBall: number; + stick: number; + waterBucket: number; + woodSword: number; apple: number; + bakedPotato: number; + cookedBeef: number; + redRose: number; + wheat: number; + bread: number; carrot: number; - rawFish: number; - pork: number; - cake: number; rottenFlesh: number; - constructor(data: Record) { - this.bakedPotato = data?.BAKED_POTATO || 0; + bone: number; + constructor(data: Record) { + this.cake = data?.CAKE || 0; this.cookie = data?.COOKIE || 0; this.feather = data?.FEATHER || 0; - this.hayBlock = data?.HAY_BLOCK || 0; - this.slimeBall = data?.SLIME_BALL || 0; - this.cookedBeef = data?.COOKED_BEEF || 0; - this.redRose = data?.RED_ROSE || 0; - this.waterBucket = data?.WATER_BUCKET || 0; - this.melon = data?.MELON || 0; - this.stick = data?.STICK || 0; - this.woodSword = data?.WOOD_SWORD || 0; - this.milkBucket = data?.MILK_BUCKET || 0; this.goldRecord = data?.GOLD_RECORD || 0; - this.leash = data?.LEASH || 0; + this.hayBlock = data?.HAY_BLOCK || 0; this.lavaBucket = data?.LAVA_BUCKET || 0; - this.bone = data?.BONE || 0; + this.leash = data?.LEASH || 0; this.magmaCream = data?.MAGMA_CREAM || 0; - this.wheat = data?.WHEAT || 0; + this.melon = data?.MELON || 0; + this.milkBucket = data?.MILK_BUCKET || 0; this.mushroomSoup = data?.MUSHROOM_SOUP || 0; - this.bread = data?.BREAD || 0; + this.pork = data?.PORK || 0; this.pumpkinPie = data?.PUMPKIN_PIE || 0; + this.rawFish = data?.RAW_FISH || 0; + this.slimeBall = data?.SLIME_BALL || 0; + this.stick = data?.STICK || 0; + this.waterBucket = data?.WATER_BUCKET || 0; + this.woodSword = data?.WOOD_SWORD || 0; this.apple = data?.APPLE || 0; + this.bakedPotato = data?.BAKED_POTATO || 0; + this.cookedBeef = data?.COOKED_BEEF || 0; + this.redRose = data?.RED_ROSE || 0; + this.wheat = data?.WHEAT || 0; + this.bread = data?.BREAD || 0; this.carrot = data?.CARROT_ITEM || 0; - this.rawFish = data?.RAW_FISH || 0; - this.pork = data?.PORK || 0; - this.cake = data?.CAKE || 0; this.rottenFlesh = data?.ROTTEN_FLESH || 0; + this.bone = data?.BONE || 0; } } -export default PetConsumables; +export default PlayerCosmeticsPetsConsumables; diff --git a/src/Structures/Player/PlayerCosmetics/PlayerCosmetics.ts b/src/Structures/Player/PlayerCosmetics/PlayerCosmetics.ts new file mode 100644 index 000000000..8a27fe022 --- /dev/null +++ b/src/Structures/Player/PlayerCosmetics/PlayerCosmetics.ts @@ -0,0 +1,83 @@ +import Color from '../../Color.js'; +import PlayerCosmeticsPets from './Pets/PlayerCosmeticsPets.js'; +import type { + PlayerCosmeticsClickEffects, + PlayerCosmeticsCloak, + PlayerCosmeticsGadget, + PlayerCosmeticsHat, + PlayerCosmeticsMorph, + PlayerCosmeticsParticlePack, + PlayerCosmeticsRankColor, + PlayerCosmeticsSuit, + PlayerCosmeticsTaunt +} from '../../../Types/Player.js'; +import type { SortName } from '../../../Types/Global.js'; + +class PlayerCosmetics { + menuSort: SortName | 'UNKNOWN'; + rankPlusColor: Color | null; + monthlyRankColor: Color | null; + cosmetics: string[]; + pets: PlayerCosmeticsPets; + unlockedSuits: PlayerCosmeticsSuit[]; + unlockedHats: PlayerCosmeticsHat[]; + selectedGadget: PlayerCosmeticsGadget | null; + unlockedGadgets: PlayerCosmeticsGadget[]; + unlockedMorphs: PlayerCosmeticsMorph[]; + unlockedCloaks: PlayerCosmeticsCloak[]; + unlockedTaunts: PlayerCosmeticsTaunt[]; + unlockedRankColors: PlayerCosmeticsRankColor[]; + selectedParticlePack: PlayerCosmeticsParticlePack | 'UNKNOWN'; + unlockedParticlePacks: PlayerCosmeticsParticlePack[]; + unlockedClickEffects: PlayerCosmeticsClickEffects[]; + constructor(data: Record) { + this.menuSort = data?.collectibles_menu_sort || 'UNKNOWN'; + this.rankPlusColor = data?.rankPlusColor ? new Color(data?.rankPlusColor) : null; + this.monthlyRankColor = data?.monthlyRankColor ? new Color(data?.monthlyRankColor) : null; + this.cosmetics = data?.vanityMeta?.packages || []; + this.pets = new PlayerCosmeticsPets( + data, + this.cosmetics.filter((x) => x.startsWith('pet_')) + ); + + this.unlockedSuits = (this.cosmetics || []) + .filter((x) => x.startsWith('suit_')) + .map((x) => x.replace('suit_', '') as PlayerCosmeticsSuit); + + this.unlockedHats = (this.cosmetics || []) + .filter((x) => x.startsWith('hat_')) + .map((x) => x.replace('hat_', '') as PlayerCosmeticsHat); + + this.selectedGadget = data?.currentGadget || null; + this.unlockedGadgets = (this.cosmetics || []) + .filter((x) => x.startsWith('gadget_')) + .map((x) => x.replace('gadget_', '') as PlayerCosmeticsGadget); + + this.unlockedMorphs = (this.cosmetics || []) + .filter((x) => x.startsWith('morph_')) + .map((x) => x.replace('morph_', '') as PlayerCosmeticsMorph); + + this.unlockedCloaks = (this.cosmetics || []) + .filter((x) => x.startsWith('cloak_')) + .map((x) => x.replace('cloak_', '') as PlayerCosmeticsCloak); + + this.unlockedTaunts = (this.cosmetics || []) + .filter((x) => x.startsWith('taunt_')) + .map((x) => x.replace('taunt_', '') as PlayerCosmeticsTaunt); + + this.unlockedRankColors = (this.cosmetics || []) + .filter((x) => x.startsWith('rankcolor_')) + .map((x) => x.replace('rankcolor_', '') as PlayerCosmeticsRankColor); + + this.selectedParticlePack = data?.particlePack || null; + this.unlockedParticlePacks = (this.cosmetics || []) + .filter((x) => x.startsWith('particlepack_')) + .map((x) => x.replace('particlepack_', '') as PlayerCosmeticsParticlePack); + + this.unlockedClickEffects = (this.cosmetics || []) + .filter((x) => x.startsWith('clickeffects_')) + .map((x) => x.replace('clickeffects_', '') as PlayerCosmeticsClickEffects); + } +} + +export default PlayerCosmetics; diff --git a/src/Structures/Player/Gifting.ts b/src/Structures/Player/PlayerGifting.ts similarity index 91% rename from src/Structures/Player/Gifting.ts rename to src/Structures/Player/PlayerGifting.ts index 5392b5efe..55051f69b 100644 --- a/src/Structures/Player/Gifting.ts +++ b/src/Structures/Player/PlayerGifting.ts @@ -1,4 +1,4 @@ -class Gifting { +class PlayerGifting { bundlesReceived: number; bundlesGiven: number; milestones: string[]; @@ -15,4 +15,4 @@ class Gifting { } } -export default Gifting; +export default PlayerGifting; diff --git a/src/Structures/Player/PlayerHousing/PlayerHousing.ts b/src/Structures/Player/PlayerHousing/PlayerHousing.ts new file mode 100644 index 000000000..7f047d06c --- /dev/null +++ b/src/Structures/Player/PlayerHousing/PlayerHousing.ts @@ -0,0 +1,31 @@ +import PlayerHousingGivenCookies from './PlayerHousingGivenCookies.js'; +import PlayerHousingPlayerSettings from './PlayerHousingPlayerSettings.js'; +import type { PlayerHousingPlotSize, PlayerHousingTutorialStage } from '../../../Types/Player.js'; + +class PlayerHousing { + allowedBlocks: string[]; + packages: string[]; + tutorialStage: PlayerHousingTutorialStage | 'UNKNOWN'; + firstHouseJoinTimestamp: number | null; + firstHouseJoinAt: Date | null; + plotSize: PlayerHousingPlotSize | 'UNKNOWN'; + playerSettings: PlayerHousingPlayerSettings; + givenCookies: PlayerHousingGivenCookies[]; + constructor(data: Record) { + this.allowedBlocks = data?.allowedBlocks || []; + this.packages = data?.packages || []; + this.playerSettings = new PlayerHousingPlayerSettings(data?.playerSettings || {}); + this.tutorialStage = data?.tutorialStep || 'UNKNOWN'; + this.firstHouseJoinTimestamp = data.firstHouseJoinMs || null; + this.firstHouseJoinAt = this.firstHouseJoinTimestamp ? new Date(this.firstHouseJoinTimestamp) : null; + this.plotSize = data?.plotSize || 'UNKNOWN'; + this.givenCookies = []; + Object.keys(data) + .filter((key) => key.startsWith('given_cookies_')) + .map((key) => { + this.givenCookies.push(new PlayerHousingGivenCookies(key, data[key])); + }); + } +} + +export default PlayerHousing; diff --git a/src/Structures/Player/PlayerHousing/PlayerHousingGivenCookies.ts b/src/Structures/Player/PlayerHousing/PlayerHousingGivenCookies.ts new file mode 100644 index 000000000..2f8eb33e2 --- /dev/null +++ b/src/Structures/Player/PlayerHousing/PlayerHousingGivenCookies.ts @@ -0,0 +1,10 @@ +class PlayerHousingGivenCookies { + date: string; + houses: string[]; + constructor(date: string, houses: string[]) { + this.date = date; + this.houses = houses; + } +} + +export default PlayerHousingGivenCookies; diff --git a/src/Structures/Player/PlayerHousing/PlayerHousingPlayerSettings.ts b/src/Structures/Player/PlayerHousing/PlayerHousingPlayerSettings.ts new file mode 100644 index 000000000..06e2e2743 --- /dev/null +++ b/src/Structures/Player/PlayerHousing/PlayerHousingPlayerSettings.ts @@ -0,0 +1,22 @@ +import type { PlayerHousingSettingsTextInputType } from '../../../Types/Player.js'; + +class PlayerHousingPlayerSettings { + playerVisibility: number; + showBorder: boolean; + playJukeboxMusic: boolean; + showTips: boolean; + showProToolsParticles: boolean; + showHousingPlusPrefix: boolean; + textInputType: PlayerHousingSettingsTextInputType | 'UNKNOWN'; + constructor(data: Record) { + this.playerVisibility = data?.VISIBILITY ? Number(data?.VISIBILITY.split('-')[1]) : 4; + this.showBorder = data?.BORDER ? Boolean(data?.BORDER.split('-')[1]) : true; + this.playJukeboxMusic = data?.JUKEBOX_MUSIC ? Boolean(data?.JUKEBOX_MUSIC.split('-')[1]) : true; + this.showTips = data?.TIPS ? Boolean(data?.TIPS.split('-')[1]) : false; + this.showProToolsParticles = data?.PRO_TOOLS_PARTICLES ? Boolean(data?.PRO_TOOLS_PARTICLES.split('-')[1]) : false; + this.showHousingPlusPrefix = data?.HOUSING_PLUS_PREFIX ? Boolean(data?.HOUSING_PLUS_PREFIX.split('-')[1]) : false; + this.textInputType = data?.TEXT_INPUT_TYPE ? data?.TEXT_INPUT_TYPE.split('-')[1] : 'UNKNOWN'; + } +} + +export default PlayerHousingPlayerSettings; diff --git a/src/Structures/Player/Parkour.ts b/src/Structures/Player/PlayerParkour.ts similarity index 60% rename from src/Structures/Player/Parkour.ts rename to src/Structures/Player/PlayerParkour.ts index ddd4c2d47..d69d578ae 100644 --- a/src/Structures/Player/Parkour.ts +++ b/src/Structures/Player/PlayerParkour.ts @@ -1,4 +1,4 @@ -class Parkour { +class PlayerParkour { location: string; timeStart: number; timeTook: number; @@ -7,11 +7,10 @@ class Parkour { this.location = location; this.timeStart = data?.[location]?.[0].timeStart || 0; this.timeTook = data?.[location]?.[0].timeTook || 0; - this.checkPoints = []; - Object.keys(checkPoints?.[location] || {}).map((checkPoint: string) => { - this.checkPoints.push(checkPoints?.[location]?.[checkPoint]); - }); + this.checkPoints = Object.keys(checkPoints?.[location] || {}).map( + (checkPoint: string) => checkPoints?.[location]?.[checkPoint] + ); } } -export default Parkour; +export default PlayerParkour; diff --git a/src/Structures/Player/Quests/PlayerQuest.ts b/src/Structures/Player/PlayerQuests/PlayerQuest.ts similarity index 100% rename from src/Structures/Player/Quests/PlayerQuest.ts rename to src/Structures/Player/PlayerQuests/PlayerQuest.ts diff --git a/src/Structures/Player/Quests/PlayerQuestCompletion.ts b/src/Structures/Player/PlayerQuests/PlayerQuestCompletion.ts similarity index 100% rename from src/Structures/Player/Quests/PlayerQuestCompletion.ts rename to src/Structures/Player/PlayerQuests/PlayerQuestCompletion.ts diff --git a/src/Structures/Player/Quests/PlayerQuestCompletions.ts b/src/Structures/Player/PlayerQuests/PlayerQuestCompletions.ts similarity index 100% rename from src/Structures/Player/Quests/PlayerQuestCompletions.ts rename to src/Structures/Player/PlayerQuests/PlayerQuestCompletions.ts diff --git a/src/Structures/Player/Quests/PlayerQuests.ts b/src/Structures/Player/PlayerQuests/PlayerQuests.ts similarity index 66% rename from src/Structures/Player/Quests/PlayerQuests.ts rename to src/Structures/Player/PlayerQuests/PlayerQuests.ts index 46e606568..8f3eee02c 100644 --- a/src/Structures/Player/Quests/PlayerQuests.ts +++ b/src/Structures/Player/PlayerQuests/PlayerQuests.ts @@ -4,10 +4,7 @@ class PlayerQuests { quests: PlayerQuest[]; autoActivate: boolean; constructor(data: Record, autoActivate: boolean = false) { - this.quests = []; - Object.keys(data).forEach((quest) => { - this.quests.push(new PlayerQuest(data[quest], quest)); - }); + this.quests = Object.keys(data).map((quest) => new PlayerQuest(data[quest], quest)); this.autoActivate = autoActivate; } } diff --git a/src/Structures/Player/PlayerRankPurchase.ts b/src/Structures/Player/PlayerRankPurchase.ts new file mode 100644 index 000000000..deac4dcb9 --- /dev/null +++ b/src/Structures/Player/PlayerRankPurchase.ts @@ -0,0 +1,22 @@ +class PlayerRankPurchase { + vip: number | null; + vipAt: Date | null; + vipPlus: number | null; + vipPlusAt: Date | null; + mvp: number | null; + mvpAt: Date | null; + mvpPlus: number | null; + mvpPlusAt: Date | null; + constructor(data: Record) { + this.vip = data?.levelUp_VIP || null; + this.vipAt = this.vip ? new Date(this.vip) : null; + this.vipPlus = data?.levelUp_VIP_PLUS || null; + this.vipPlusAt = this.vipPlus ? new Date(this.vipPlus) : null; + this.mvp = data?.levelUp_MVP || null; + this.mvpAt = this.mvp ? new Date(this.mvp) : null; + this.mvpPlus = data?.levelUp_MVP_PLUS || null; + this.mvpPlusAt = this.mvpPlus ? new Date(this.mvpPlus) : null; + } +} + +export default PlayerRankPurchase; diff --git a/src/Structures/Player/PlayerRewards/PlayerRewards.ts b/src/Structures/Player/PlayerRewards/PlayerRewards.ts new file mode 100644 index 000000000..b6c6031b5 --- /dev/null +++ b/src/Structures/Player/PlayerRewards/PlayerRewards.ts @@ -0,0 +1,30 @@ +import PlayerRewardsMonthlyCrate from './PlayerRewardsMonthlyCrate.js'; + +class PlayerRewards { + adsenseTokens: number; + lastAdsenseGenerateTimeAt: Date | null; + lastClaimedReward: number; + rewardHighScore: number; + rewardScore: number; + rewardStreak: number; + rewardTokens: number; + totalDailyRewards: number; + totalRewards: number; + monthlyCrates: PlayerRewardsMonthlyCrate[]; + constructor(data: Record) { + this.adsenseTokens = data?.adsense_tokens || 0; + this.lastAdsenseGenerateTimeAt = data?.lastAdsenseGenerateTime ? new Date(data?.lastAdsenseGenerateTime) : null; + this.lastClaimedReward = data?.lastClaimedReward || 0; + this.rewardHighScore = data?.rewardHighScore || 0; + this.rewardScore = data?.rewardScore || 0; + this.rewardStreak = data?.rewardStreak || 0; + this.rewardTokens = data?.adsence_tokens || 0; + this.totalDailyRewards = data?.totalDailyRewards || 0; + this.totalRewards = data?.totalRewards || 0; + this.monthlyCrates = Object.keys(data?.monthlycrates || {}).map( + (key) => new PlayerRewardsMonthlyCrate(data?.monthlycrates?.[key], key) + ); + } +} + +export default PlayerRewards; diff --git a/src/Structures/Player/PlayerRewards/PlayerRewardsMonthlyCrate.ts b/src/Structures/Player/PlayerRewards/PlayerRewardsMonthlyCrate.ts new file mode 100644 index 000000000..537c1f641 --- /dev/null +++ b/src/Structures/Player/PlayerRewards/PlayerRewardsMonthlyCrate.ts @@ -0,0 +1,18 @@ +class PlayerRewardsMonthlyCrate { + date: string; + REGULAR: boolean; + VIP: boolean; + VIP_PLUS: boolean; + MVP: boolean; + MVP_PLUS: boolean; + constructor(data: Record, date: string) { + this.date = date; + this.REGULAR = data?.REGULAR || data?.NORMAL || false; + this.VIP = data?.VIP || false; + this.VIP_PLUS = data?.VIP_PLUS || false; + this.MVP = data?.MVP || false; + this.MVP_PLUS = data?.MVP_PLUS || false; + } +} + +export default PlayerRewardsMonthlyCrate; diff --git a/src/Structures/Player/PlayerScorpiusBribe.ts b/src/Structures/Player/PlayerScorpiusBribe.ts new file mode 100644 index 000000000..59b90c465 --- /dev/null +++ b/src/Structures/Player/PlayerScorpiusBribe.ts @@ -0,0 +1,12 @@ +class PlayerScorpiusBribe { + year: number; + claimedTimestamp: number; + claimedAt: Date; + constructor(timestamp: number, year: string) { + this.year = Number(year); + this.claimedTimestamp = timestamp; + this.claimedAt = new Date(this.claimedTimestamp); + } +} + +export default PlayerScorpiusBribe; diff --git a/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYear.ts b/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYear.ts new file mode 100644 index 000000000..6529da5d7 --- /dev/null +++ b/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYear.ts @@ -0,0 +1,17 @@ +import PlayerSeasonalChristmasYearAdventRewards from './PlayerSeasonalChristmasYearAdventRewards.js'; +import PlayerSeasonalChristmasYearLeveling from './PlayerSeasonalChristmasYearLeveling.js'; + +class PlayerSeasonalChristmasYear { + year: number; + adventRewards: PlayerSeasonalChristmasYearAdventRewards; + presents: Record; + leveling: PlayerSeasonalChristmasYearLeveling; + constructor(data: Record, year: number) { + this.year = year; + this.adventRewards = new PlayerSeasonalChristmasYearAdventRewards(data?.adventRewards || {}); + this.presents = data?.presents || {}; + this.leveling = new PlayerSeasonalChristmasYearLeveling(data?.leveling || {}); + } +} + +export default PlayerSeasonalChristmasYear; diff --git a/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYearAdventRewards.ts b/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYearAdventRewards.ts new file mode 100644 index 000000000..b6834b927 --- /dev/null +++ b/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYearAdventRewards.ts @@ -0,0 +1,56 @@ +class PlayerSeasonalChristmasYearAdventRewards { + day1: Date | null; + day2: Date | null; + day3: Date | null; + day4: Date | null; + day5: Date | null; + day6: Date | null; + day7: Date | null; + day8: Date | null; + day9: Date | null; + day10: Date | null; + day11: Date | null; + day12: Date | null; + day13: Date | null; + day14: Date | null; + day15: Date | null; + day16: Date | null; + day17: Date | null; + day18: Date | null; + day19: Date | null; + day20: Date | null; + day21: Date | null; + day22: Date | null; + day23: Date | null; + day24: Date | null; + day25: Date | null; + constructor(data: Record) { + this.day1 = data.day1 ? new Date(data?.day1) : null; + this.day2 = data.day2 ? new Date(data?.day2) : null; + this.day3 = data.day3 ? new Date(data?.day3) : null; + this.day4 = data.day4 ? new Date(data?.day4) : null; + this.day5 = data.day5 ? new Date(data?.day5) : null; + this.day6 = data.day6 ? new Date(data?.day6) : null; + this.day7 = data.day7 ? new Date(data?.day7) : null; + this.day8 = data.day8 ? new Date(data?.day8) : null; + this.day9 = data.day9 ? new Date(data?.day9) : null; + this.day10 = data.day10 ? new Date(data?.day10) : null; + this.day11 = data.day11 ? new Date(data?.day11) : null; + this.day12 = data.day12 ? new Date(data?.day12) : null; + this.day13 = data.day13 ? new Date(data?.day13) : null; + this.day14 = data.day14 ? new Date(data?.day14) : null; + this.day15 = data.day15 ? new Date(data?.day15) : null; + this.day16 = data.day16 ? new Date(data?.day16) : null; + this.day17 = data.day17 ? new Date(data?.day17) : null; + this.day18 = data.day18 ? new Date(data?.day18) : null; + this.day19 = data.day19 ? new Date(data?.day19) : null; + this.day20 = data.day20 ? new Date(data?.day20) : null; + this.day21 = data.day21 ? new Date(data?.day21) : null; + this.day22 = data.day22 ? new Date(data?.day22) : null; + this.day23 = data.day23 ? new Date(data?.day23) : null; + this.day24 = data.day24 ? new Date(data?.day24) : null; + this.day25 = data.day25 ? new Date(data?.day25) : null; + } +} + +export default PlayerSeasonalChristmasYearAdventRewards; diff --git a/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYearLeveling.ts b/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYearLeveling.ts new file mode 100644 index 000000000..e0f4cc61c --- /dev/null +++ b/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYearLeveling.ts @@ -0,0 +1,8 @@ +class PlayerSeasonalChristmasYearLeveling { + experience: number; + constructor(data: Record) { + this.experience = data?.experience || 0; + } +} + +export default PlayerSeasonalChristmasYearLeveling; diff --git a/src/Structures/Player/PlayerSocialMedia.ts b/src/Structures/Player/PlayerSocialMedia.ts new file mode 100644 index 000000000..129c40668 --- /dev/null +++ b/src/Structures/Player/PlayerSocialMedia.ts @@ -0,0 +1,22 @@ +import type { UserInput } from '../../Types/Global.js'; + +class PlayerSocialMedia { + discord: UserInput | null; + youtube: UserInput | null; + twitch: UserInput | null; + hypixel: UserInput | null; + twitter: UserInput | null; + instagram: UserInput | null; + tiktok: UserInput | null; + constructor(data: Record) { + this.discord = data?.DISCORD || null; + this.youtube = data?.YOUTUBE || null; + this.twitch = data?.TWITCH || null; + this.hypixel = data?.HYPIXEL || null; + this.twitter = data?.TWITTER || null; + this.instagram = data?.INSTAGRAM || null; + this.tiktok = data?.TIKTOK || null; + } +} + +export default PlayerSocialMedia; diff --git a/src/Structures/Player/PlayerStats.ts b/src/Structures/Player/PlayerStats.ts new file mode 100644 index 000000000..2e47f23d4 --- /dev/null +++ b/src/Structures/Player/PlayerStats.ts @@ -0,0 +1,73 @@ +import Arcade from '../MiniGames/Arcade/Arcade.js'; +import ArenaBrawl from '../MiniGames/ArenaBrawl/ArenaBrawl.js'; +import BedWars from '../MiniGames/BedWars/BedWars.js'; +import BlitzSurvivalGames from '../MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.js'; +import BuildBattle from '../MiniGames/BuildBattle.js'; +import CopsAndCrims from '../MiniGames/CopsAndCrims/CopsAndCrims.js'; +import Duels from '../MiniGames/Duels/Duels.js'; +import MegaWalls from '../MiniGames/MegaWalls/MegaWalls.js'; +import MurderMystery from '../MiniGames/MurderMystery/MurderMystery.js'; +import Paintball from '../MiniGames/Paintball.js'; +import Pit from '../MiniGames/Pit/Pit.js'; +import Quakecraft from '../MiniGames/Quakecraft/Quakecraft.js'; +import SkyWars from '../MiniGames/SkyWars/SkyWars.js'; +import SmashHeroes from '../MiniGames/SmashHeroes/SmashHeroes.js'; +import SpeedUHC from '../MiniGames/SpeedUHC/SpeedUHC.js'; +import TNTGames from '../MiniGames/TNTGames/TNTGames.js'; +import TurboKartRacers from '../MiniGames/TurboKartRacers/TurboKartRacers.js'; +import UHC from '../MiniGames/UHC/UHC.js'; +import VampireZ from '../MiniGames/VampireZ/VampireZ.js'; +import Walls from '../MiniGames/Walls.js'; +import Warlords from '../MiniGames/Warlords/Warlords.js'; +import WoolGames from '../MiniGames/WoolGames/WoolGames.js'; + +class PlayerStats { + Arcade: Arcade; + ArenaBrawl: ArenaBrawl; + BedWars: BedWars; + BlitzSurvivalGames: BlitzSurvivalGames; + BuildBattle: BuildBattle; + CopsAndCrims: CopsAndCrims; + Duels: Duels; + MegaWalls: MegaWalls; + MurderMystery: MurderMystery; + Paintball: Paintball; + Pit: Pit; + QuakeCraft: Quakecraft; + SkyWars: SkyWars; + SmashHeroes: SmashHeroes; + SpeedUHC: SpeedUHC; + TNTGames: TNTGames; + TurboKartRacers: TurboKartRacers; + UHC: UHC; + VampireZ: VampireZ; + Walls: Walls; + Warlords: Warlords; + WoolGames: WoolGames; + constructor(data: Record) { + this.Arcade = new Arcade(data?.Arcade); + this.ArenaBrawl = new ArenaBrawl(data?.Arena); + this.BedWars = new BedWars(data?.Bedwars); + this.BlitzSurvivalGames = new BlitzSurvivalGames(data?.HungerGames); + this.BuildBattle = new BuildBattle(data?.BuildBattle); + this.CopsAndCrims = new CopsAndCrims(data?.MCGO); + this.Duels = new Duels(data?.Duels); + this.MegaWalls = new MegaWalls(data?.Walls3); + this.MurderMystery = new MurderMystery(data?.MurderMystery); + this.Paintball = new Paintball(data?.Paintball); + this.Pit = new Pit(data?.Pit); + this.QuakeCraft = new Quakecraft(data?.Quake); + this.SkyWars = new SkyWars(data?.SkyWars); + this.SmashHeroes = new SmashHeroes(data?.SuperSmash); + this.SpeedUHC = new SpeedUHC(data?.SpeedUHC); + this.TNTGames = new TNTGames(data?.TNTGames); + this.TurboKartRacers = new TurboKartRacers(data?.GingerBread); + this.UHC = new UHC(data?.UHC); + this.VampireZ = new VampireZ(data?.VampireZ); + this.Walls = new Walls(data?.Walls); + this.Warlords = new Warlords(data?.Battleground); + this.WoolGames = new WoolGames(data?.WoolGames); + } +} + +export default PlayerStats; diff --git a/src/Structures/Player/PlayerTourney/PlayerTourney.ts b/src/Structures/Player/PlayerTourney/PlayerTourney.ts new file mode 100644 index 000000000..fd632a97a --- /dev/null +++ b/src/Structures/Player/PlayerTourney/PlayerTourney.ts @@ -0,0 +1,24 @@ +import PlayerTourneyData from './PlayerTourneyData.js'; +import type { PlayerTourneyShopSort } from '../../../Types/Player.js'; + +class PlayerTourney { + firstJoinLobbyTimestamp: number | null; + firstJoinLobbyAt: Date | null; + totalTributes: number; + shopSort: PlayerTourneyShopSort | 'UNKNOWN'; + hidePurchased: boolean; + tourneyData: PlayerTourneyData[]; + constructor(data: Record) { + this.firstJoinLobbyTimestamp = data?.first_join_lobby || null; + this.firstJoinLobbyAt = this.firstJoinLobbyTimestamp ? new Date(this.firstJoinLobbyTimestamp) : null; + this.totalTributes = data?.total_tributes || 0; + this.shopSort = data?.shop_sort || 'UNKNOWN'; + this.hidePurchased = data?.hide_purchased || false; + this.tourneyData = []; + Object.keys(data) + .filter((key) => ['first_join_lobby', 'total_tributes', 'shop_sort', 'hide_purchased'].includes(key)) + .forEach((key) => this.tourneyData.push(new PlayerTourneyData(data[key], key))); + } +} + +export default PlayerTourney; diff --git a/src/Structures/Player/PlayerTourney/PlayerTourneyData.ts b/src/Structures/Player/PlayerTourney/PlayerTourneyData.ts new file mode 100644 index 000000000..a7cd2e634 --- /dev/null +++ b/src/Structures/Player/PlayerTourney/PlayerTourneyData.ts @@ -0,0 +1,18 @@ +class PlayerTourneyData { + tourneyName: string; + playtime: number; + tributes: number; + firstWinTimestamp: number | null; + firstWinAt: Date | null; + claimedReward: number; + constructor(data: Record, tourneyName: string) { + this.tourneyName = tourneyName; + this.playtime = data?.playtime || 0; + this.tributes = data?.tributes_earned || 0; + this.firstWinTimestamp = data?.first_win || null; + this.firstWinAt = this.firstWinTimestamp ? new Date(this.firstWinTimestamp) : null; + this.claimedReward = data?.claimed_ranking_reward || 0; + } +} + +export default PlayerTourneyData; diff --git a/src/Structures/Player/Quests/PlayerQuest.test.ts b/src/Structures/Player/Quests/PlayerQuest.test.ts deleted file mode 100644 index 10f84f7c0..000000000 --- a/src/Structures/Player/Quests/PlayerQuest.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import PlayerQuest from './PlayerQuest.js'; -import PlayerQuestCompletions from './PlayerQuestCompletions.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('PlayerQuest', () => { - const data = new PlayerQuest({ stats: 'meow' }, 'meow'); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(PlayerQuest); - expectTypeOf(data).toEqualTypeOf(); - expect(data.name).toBeDefined(); - expectTypeOf(data.name).toEqualTypeOf(); - expect(data.completions).toBeDefined(); - expectTypeOf(data.completions).toEqualTypeOf(); -}); diff --git a/src/Structures/Player/Quests/PlayerQuestCompletion.test.ts b/src/Structures/Player/Quests/PlayerQuestCompletion.test.ts deleted file mode 100644 index ec9359c02..000000000 --- a/src/Structures/Player/Quests/PlayerQuestCompletion.test.ts +++ /dev/null @@ -1,15 +0,0 @@ -import PlayerQuestCompletion from './PlayerQuestCompletion.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('PlayerQuestCompletion', () => { - const data = new PlayerQuestCompletion({ time: 1688570159583 }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(PlayerQuestCompletion); - expectTypeOf(data).toEqualTypeOf(); - expect(data.amount).toBeDefined(); - expectTypeOf(data.amount).toEqualTypeOf(); - expect(data.timestamp).toBeDefined(); - expectTypeOf(data.timestamp).toEqualTypeOf(); - expect(data.timestampAt).toBeDefined(); - expectTypeOf(data.timestampAt).toEqualTypeOf(); -}); diff --git a/src/Structures/Player/Quests/PlayerQuestCompletions.test.ts b/src/Structures/Player/Quests/PlayerQuestCompletions.test.ts deleted file mode 100644 index 265d77dea..000000000 --- a/src/Structures/Player/Quests/PlayerQuestCompletions.test.ts +++ /dev/null @@ -1,15 +0,0 @@ -import PlayerQuestCompletion from './PlayerQuestCompletion.js'; -import PlayerQuestCompletions from './PlayerQuestCompletions.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('PlayerQuestCompletions', () => { - const data = new PlayerQuestCompletions([{ time: 1688570159583 }]); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(PlayerQuestCompletions); - expectTypeOf(data).toEqualTypeOf(); - expect(data.amount).toBeDefined(); - expect(data.amount).toBeGreaterThanOrEqual(0); - expectTypeOf(data.amount).toEqualTypeOf(); - expect(data.completions).toBeDefined(); - expectTypeOf(data.completions).toEqualTypeOf(); -}); diff --git a/src/Structures/Player/Quests/PlayerQuests.test.ts b/src/Structures/Player/Quests/PlayerQuests.test.ts deleted file mode 100644 index c350fce2c..000000000 --- a/src/Structures/Player/Quests/PlayerQuests.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import PlayerQuest from './PlayerQuest.js'; -import PlayerQuests from './PlayerQuests.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('PlayerQuests', () => { - const data = new PlayerQuests({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(PlayerQuests); - expectTypeOf(data).toEqualTypeOf(); - expect(data.quests).toBeDefined(); - expectTypeOf(data.quests).toEqualTypeOf(); - expect(data.autoActivate).toBeDefined(); - expectTypeOf(data.autoActivate).toEqualTypeOf(); -}); diff --git a/src/Structures/Player/Rewards.test.ts b/src/Structures/Player/Rewards.test.ts deleted file mode 100644 index bc0d5095a..000000000 --- a/src/Structures/Player/Rewards.test.ts +++ /dev/null @@ -1,28 +0,0 @@ -import MonthlyCrate from './MonthlyCrate.js'; -import Rewards from './Rewards.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('Rewards', () => { - const data = new Rewards({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(Rewards); - expectTypeOf(data).toEqualTypeOf(); - expect(data.lastAdsenseGenerateTime).toBeDefined(); - expectTypeOf(data.lastAdsenseGenerateTime).toEqualTypeOf(); - expect(data.lastClaimedReward).toBeDefined(); - expectTypeOf(data.lastClaimedReward).toEqualTypeOf(); - expect(data.rewardHighScore).toBeDefined(); - expectTypeOf(data.rewardHighScore).toEqualTypeOf(); - expect(data.rewardScore).toBeDefined(); - expectTypeOf(data.rewardScore).toEqualTypeOf(); - expect(data.rewardStreak).toBeDefined(); - expectTypeOf(data.rewardStreak).toEqualTypeOf(); - expect(data.rewardTokens).toBeDefined(); - expectTypeOf(data.rewardTokens).toEqualTypeOf(); - expect(data.totalDailyRewards).toBeDefined(); - expectTypeOf(data.totalDailyRewards).toEqualTypeOf(); - expect(data.totalRewards).toBeDefined(); - expectTypeOf(data.totalRewards).toEqualTypeOf(); - expect(data.monthlyCrates).toBeDefined(); - expectTypeOf(data.monthlyCrates).toEqualTypeOf(); -}); diff --git a/src/Structures/Player/Rewards.ts b/src/Structures/Player/Rewards.ts deleted file mode 100644 index d20902efb..000000000 --- a/src/Structures/Player/Rewards.ts +++ /dev/null @@ -1,29 +0,0 @@ -import MonthlyCrate from './MonthlyCrate.js'; - -class Rewards { - lastAdsenseGenerateTime: number; - lastClaimedReward: number; - rewardHighScore: number; - rewardScore: number; - rewardStreak: number; - rewardTokens: number; - totalDailyRewards: number; - totalRewards: number; - monthlyCrates: MonthlyCrate[]; - constructor(data: Record) { - this.lastAdsenseGenerateTime = data.lastAdsenseGenerateTime || 0; - this.lastClaimedReward = data.lastClaimedReward || 0; - this.rewardHighScore = data.rewardHighScore || 0; - this.rewardScore = data.rewardScore || 0; - this.rewardStreak = data.rewardStreak || 0; - this.rewardTokens = data.adsence_tokens || 0; - this.totalDailyRewards = data.totalDailyRewards || 0; - this.totalRewards = data.totalRewards || 0; - this.monthlyCrates = []; - Object.keys(data?.monthlycrates || {}).forEach((key) => - this.monthlyCrates.push(new MonthlyCrate(data?.monthlycrates?.[key], key)) - ); - } -} - -export default Rewards; diff --git a/src/Structures/Player/Seasonal/Season.test.ts b/src/Structures/Player/Seasonal/Season.test.ts deleted file mode 100644 index 7234c324a..000000000 --- a/src/Structures/Player/Seasonal/Season.test.ts +++ /dev/null @@ -1,15 +0,0 @@ -import Season from './Season.js'; -import SeasonYear from './SeasonYear.js'; -import { expect, expectTypeOf, test } from 'vitest'; -import type { SeasonName } from '../../../Types/Player.js'; - -test('Season', () => { - const data = new Season({ stats: 'meow' }, 'anniversary'); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(Season); - expectTypeOf(data).toEqualTypeOf(); - expect(data.season).toBeDefined(); - expectTypeOf(data.season).toEqualTypeOf(); - expect(data.years).toBeDefined(); - expectTypeOf(data.years).toEqualTypeOf(); -}); diff --git a/src/Structures/Player/Seasonal/Season.ts b/src/Structures/Player/Seasonal/Season.ts deleted file mode 100644 index 2bbc4741e..000000000 --- a/src/Structures/Player/Seasonal/Season.ts +++ /dev/null @@ -1,14 +0,0 @@ -import SeasonYear from './SeasonYear.js'; -import type { SeasonName } from '../../../Types/Player.js'; - -class Season { - season: SeasonName; - years: SeasonYear[]; - constructor(data: Record, season: SeasonName) { - this.season = season; - this.years = []; - Object.keys(data).forEach((key) => this.years.push(new SeasonYear(data?.[key], key))); - } -} - -export default Season; diff --git a/src/Structures/Player/Seasonal/SeasonBingo.test.ts b/src/Structures/Player/Seasonal/SeasonBingo.test.ts deleted file mode 100644 index 5be9e7411..000000000 --- a/src/Structures/Player/Seasonal/SeasonBingo.test.ts +++ /dev/null @@ -1,16 +0,0 @@ -import SeasonBingo from './SeasonBingo.js'; -import SeasonBingoTier from './SeasonBingoTier.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('SeasonBingo', () => { - const data = new SeasonBingo({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(SeasonBingo); - expectTypeOf(data).toEqualTypeOf(); - expect(data.easy).toBeDefined(); - expectTypeOf(data.easy).toEqualTypeOf(); - expect(data.medium).toBeDefined(); - expectTypeOf(data.medium).toEqualTypeOf(); - expect(data.hard).toBeDefined(); - expectTypeOf(data.hard).toEqualTypeOf(); -}); diff --git a/src/Structures/Player/Seasonal/SeasonBingo.ts b/src/Structures/Player/Seasonal/SeasonBingo.ts deleted file mode 100644 index a935a3208..000000000 --- a/src/Structures/Player/Seasonal/SeasonBingo.ts +++ /dev/null @@ -1,14 +0,0 @@ -import SeasonBingoTier from './SeasonBingoTier.js'; - -class SeasonBingo { - easy: SeasonBingoTier | null; - medium: SeasonBingoTier | null; - hard: SeasonBingoTier | null; - constructor(data: Record) { - this.easy = data.easy ? new SeasonBingoTier(data.easy) : null; - this.medium = data.medium ? new SeasonBingoTier(data.medium) : null; - this.hard = data.hard ? new SeasonBingoTier(data.hard) : null; - } -} - -export default SeasonBingo; diff --git a/src/Structures/Player/Seasonal/SeasonBingoTier.test.ts b/src/Structures/Player/Seasonal/SeasonBingoTier.test.ts deleted file mode 100644 index 917cafd95..000000000 --- a/src/Structures/Player/Seasonal/SeasonBingoTier.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -import SeasonBingoTier from './SeasonBingoTier.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('SeasonBingoTier', () => { - const data = new SeasonBingoTier({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(SeasonBingoTier); - expectTypeOf(data).toEqualTypeOf(); - expect(data.objectives).toBeDefined(); - expectTypeOf(data.objectives).toEqualTypeOf>(); - expect(data.rewards).toBeDefined(); - expectTypeOf(data.rewards).toEqualTypeOf(); -}); diff --git a/src/Structures/Player/Seasonal/SeasonBingoTier.ts b/src/Structures/Player/Seasonal/SeasonBingoTier.ts deleted file mode 100644 index 7e9786b9e..000000000 --- a/src/Structures/Player/Seasonal/SeasonBingoTier.ts +++ /dev/null @@ -1,10 +0,0 @@ -class SeasonBingoTier { - objectives: Record; - rewards: string[]; - constructor(data: Record) { - this.objectives = data.objectives || {}; - this.rewards = data.rewards || []; - } -} - -export default SeasonBingoTier; diff --git a/src/Structures/Player/Seasonal/SeasonYear.test.ts b/src/Structures/Player/Seasonal/SeasonYear.test.ts deleted file mode 100644 index 0cf1c7b5a..000000000 --- a/src/Structures/Player/Seasonal/SeasonYear.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -import SeasonBingo from './SeasonBingo.js'; -import SeasonYear from './SeasonYear.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('SeasonYear', () => { - const data = new SeasonYear({ stats: 'meow' }, '100'); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(SeasonYear); - expectTypeOf(data).toEqualTypeOf(); - expect(data.year).toBeDefined(); - expectTypeOf(data.year).toEqualTypeOf(); - expect(data.experience).toBeDefined(); - expectTypeOf(data.experience).toEqualTypeOf(); - expect(data.season).toBeDefined(); - expectTypeOf(data.season).toEqualTypeOf>(); - expect(data.bingo).toBeDefined(); - expectTypeOf(data.bingo).toEqualTypeOf(); - expect(data.adventRewards).toBeDefined(); - expectTypeOf(data.adventRewards).toEqualTypeOf | null>(); - expect(data.presents).toBeDefined(); - expectTypeOf(data.presents).toEqualTypeOf | null>(); -}); diff --git a/src/Structures/Player/Seasonal/SeasonYear.ts b/src/Structures/Player/Seasonal/SeasonYear.ts deleted file mode 100644 index 18be4b36c..000000000 --- a/src/Structures/Player/Seasonal/SeasonYear.ts +++ /dev/null @@ -1,20 +0,0 @@ -import SeasonBingo from './SeasonBingo.js'; - -class SeasonYear { - year: number; - experience: number; - season: Record; - bingo: SeasonBingo | null; - adventRewards: Record | null; - presents: Record | null; - constructor(data: Record, year: string) { - this.year = Number(year); - this.experience = data?.leveling?.experience || 0; - this.season = data.season || {}; - this.bingo = data.bingo ? new SeasonBingo(data.bingo) : null; - this.adventRewards = data.adventRewards ? data.adventRewards : null; - this.presents = data.presents ? data.presents : null; - } -} - -export default SeasonYear; diff --git a/src/Structures/Player/Seasonal/Seasonal.test.ts b/src/Structures/Player/Seasonal/Seasonal.test.ts deleted file mode 100644 index 3c7399d34..000000000 --- a/src/Structures/Player/Seasonal/Seasonal.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import Season from './Season.js'; -import Seasonal from './Seasonal.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('Seasonal', () => { - const data = new Seasonal({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(Seasonal); - expectTypeOf(data).toEqualTypeOf(); - expect(data.silver).toBeDefined(); - expect(data.silver).toBeGreaterThanOrEqual(0); - expectTypeOf(data.silver).toEqualTypeOf(); - expect(data.anniversary).toBeDefined(); - expectTypeOf(data.anniversary).toEqualTypeOf(); - expect(data.christmas).toBeDefined(); - expectTypeOf(data.christmas).toEqualTypeOf(); - expect(data.easter).toBeDefined(); - expectTypeOf(data.easter).toEqualTypeOf(); - expect(data.halloween).toBeDefined(); - expectTypeOf(data.halloween).toEqualTypeOf(); - expect(data.summer).toBeDefined(); - expectTypeOf(data.summer).toEqualTypeOf(); -}); diff --git a/src/Structures/Player/Seasonal/Seasonal.ts b/src/Structures/Player/Seasonal/Seasonal.ts deleted file mode 100644 index c11dbb8fb..000000000 --- a/src/Structures/Player/Seasonal/Seasonal.ts +++ /dev/null @@ -1,20 +0,0 @@ -import Season from './Season.js'; - -class Seasonal { - silver: number; - anniversary: Season; - christmas: Season; - easter: Season; - halloween: Season; - summer: Season; - constructor(data: Record) { - this.silver = data.silver || 0; - this.anniversary = new Season(data?.anniversary || {}, 'anniversary'); - this.christmas = new Season(data?.christmas || {}, 'christmas'); - this.easter = new Season(data?.easter || {}, 'easter'); - this.halloween = new Season(data?.halloween || {}, 'halloween'); - this.summer = new Season(data?.summer || {}, 'summer'); - } -} - -export default Seasonal; diff --git a/src/Structures/Player/SocialMedia.test.ts b/src/Structures/Player/SocialMedia.test.ts deleted file mode 100644 index 09c4d1f43..000000000 --- a/src/Structures/Player/SocialMedia.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import SocialMedia from './SocialMedia.js'; -import { expect, expectTypeOf, test } from 'vitest'; -import type { SocialMediaId } from '../../Types/Player.js'; - -test('SocialMedia', () => { - const data = new SocialMedia({ id: 'DISCORD', link: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(SocialMedia); - expectTypeOf(data).toEqualTypeOf(); - expect(data.id).toBeDefined(); - expectTypeOf(data.id).toEqualTypeOf(); - expect(data.link).toBeDefined(); - expectTypeOf(data.link).toEqualTypeOf(); -}); diff --git a/src/Structures/Player/SocialMedia.ts b/src/Structures/Player/SocialMedia.ts deleted file mode 100644 index a8d86439d..000000000 --- a/src/Structures/Player/SocialMedia.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { SocialMediaId } from '../../Types/Player.js'; - -class SocialMedia { - id: SocialMediaId; - link: string; - constructor(data: { id: SocialMediaId; link: string }) { - this.id = data.id; - this.link = data.link; - } -} - -export function parseSocialMedia(data: Record): SocialMedia[] { - return Object.keys(data).map( - (media) => new SocialMedia({ id: media as SocialMediaId, link: data[media as SocialMediaId] }) - ); -} - -export default SocialMedia; diff --git a/src/Structures/Player/Tourney/Tourney.test.ts b/src/Structures/Player/Tourney/Tourney.test.ts deleted file mode 100644 index 11f4ff444..000000000 --- a/src/Structures/Player/Tourney/Tourney.test.ts +++ /dev/null @@ -1,20 +0,0 @@ -import Tourney from './Tourney.js'; -import TourneyData from './TourneyData.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('Tourney', () => { - const data = new Tourney({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(Tourney); - expectTypeOf(data).toEqualTypeOf(); - expect(data.firstJoinLobby).toBeDefined(); - expectTypeOf(data.firstJoinLobby).toEqualTypeOf(); - expect(data.totalTributes).toBeDefined(); - expectTypeOf(data.totalTributes).toEqualTypeOf(); - expect(data.shopSort).toBeDefined(); - expectTypeOf(data.shopSort).toEqualTypeOf(); - expect(data.hidePurchased).toBeDefined(); - expectTypeOf(data.hidePurchased).toEqualTypeOf(); - expect(data.tourneyData).toBeDefined(); - expectTypeOf(data.tourneyData).toEqualTypeOf(); -}); diff --git a/src/Structures/Player/Tourney/Tourney.ts b/src/Structures/Player/Tourney/Tourney.ts deleted file mode 100644 index 052ffe550..000000000 --- a/src/Structures/Player/Tourney/Tourney.ts +++ /dev/null @@ -1,21 +0,0 @@ -import TourneyData from './TourneyData.js'; - -class Tourney { - firstJoinLobby: string | null; - totalTributes: number; - shopSort: string; - hidePurchased: boolean; - tourneyData: TourneyData[]; - constructor(data: Record) { - this.firstJoinLobby = data.first_join_lobby || null; - this.totalTributes = data.total_tributes || 0; - this.shopSort = data.shop_sort || ''; - this.hidePurchased = data.hide_purchased || false; - this.tourneyData = []; - Object.keys(data) - .filter((key) => ['first_join_lobby', 'total_tributes', 'shop_sort', 'hide_purchased'].includes(key)) - .forEach((key) => this.tourneyData.push(new TourneyData(data[key]))); - } -} - -export default Tourney; diff --git a/src/Structures/Player/Tourney/TourneyData.test.ts b/src/Structures/Player/Tourney/TourneyData.test.ts deleted file mode 100644 index 1cacbc73e..000000000 --- a/src/Structures/Player/Tourney/TourneyData.test.ts +++ /dev/null @@ -1,21 +0,0 @@ -import TourneyData from './TourneyData.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('TourneyData', () => { - const data = new TourneyData({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(TourneyData); - expectTypeOf(data).toEqualTypeOf(); - expect(data.playtime).toBeDefined(); - expect(data.playtime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.playtime).toEqualTypeOf(); - expect(data.tributes).toBeDefined(); - expect(data.tributes).toBeGreaterThanOrEqual(0); - expectTypeOf(data.tributes).toEqualTypeOf(); - expect(data.firstWin).toBeDefined(); - expect(data.firstWin).toBeGreaterThanOrEqual(0); - expectTypeOf(data.firstWin).toEqualTypeOf(); - expect(data.claimedReward).toBeDefined(); - expect(data.claimedReward).toBeGreaterThanOrEqual(0); - expectTypeOf(data.claimedReward).toEqualTypeOf(); -}); diff --git a/src/Structures/Player/Tourney/TourneyData.ts b/src/Structures/Player/Tourney/TourneyData.ts deleted file mode 100644 index 047f032ed..000000000 --- a/src/Structures/Player/Tourney/TourneyData.ts +++ /dev/null @@ -1,14 +0,0 @@ -class TourneyData { - playtime: number; - tributes: number; - firstWin: number; - claimedReward: number; - constructor(data: Record) { - this.playtime = data.playtime || 0; - this.tributes = data.tributes_earned || 0; - this.firstWin = data.first_win || 0; - this.claimedReward = data.claimed_ranking_reward || 0; - } -} - -export default TourneyData; diff --git a/src/Types/Global.ts b/src/Types/Global.ts index 834ecc01a..c4b2f0f7e 100644 --- a/src/Types/Global.ts +++ b/src/Types/Global.ts @@ -2,3 +2,4 @@ export type UUID = string; export type UserInput = string; +export type SortName = 'a_to_z' | 'z_to_a'; diff --git a/src/Types/Player.ts b/src/Types/Player.ts index 9033e4cad..d18fc92bc 100644 --- a/src/Types/Player.ts +++ b/src/Types/Player.ts @@ -1,58 +1,14 @@ /* v8 ignore next 10000 */ // Credits: Pixelic: https://github.com/pixelicc - Most types in player -import Arcade from '../Structures/MiniGames/Arcade/Arcade.js'; -import ArenaBrawl from '../Structures/MiniGames/ArenaBrawl/ArenaBrawl.js'; -import BedWars from '../Structures/MiniGames/BedWars/BedWars.js'; -import BlitzSurvivalGames from '../Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.js'; -import BuildBattle from '../Structures/MiniGames/BuildBattle.js'; -import CopsAndCrims from '../Structures/MiniGames/CopsAndCrims/CopsAndCrims.js'; -import Duels from '../Structures/MiniGames/Duels/Duels.js'; -import MegaWalls from '../Structures/MiniGames/MegaWalls/MegaWalls.js'; -import MurderMystery from '../Structures/MiniGames/MurderMystery/MurderMystery.js'; -import Paintball from '../Structures/MiniGames/Paintball.js'; -import Pit from '../Structures/MiniGames/Pit/Pit.js'; import PitInventoryItem from '../Structures/MiniGames/Pit/PitInventoryItem.js'; -import Quakecraft from '../Structures/MiniGames/Quakecraft/Quakecraft.js'; -import SkyWars from '../Structures/MiniGames/SkyWars/SkyWars.js'; -import SmashHeroes from '../Structures/MiniGames/SmashHeroes/SmashHeroes.js'; -import SpeedUHC from '../Structures/MiniGames/SpeedUHC/SpeedUHC.js'; -import TNTGames from '../Structures/MiniGames/TNTGames/TNTGames.js'; -import TurboKartRacers from '../Structures/MiniGames/TurboKartRacers/TurboKartRacers.js'; -import UHC from '../Structures/MiniGames/UHC/UHC.js'; -import VampireZ from '../Structures/MiniGames/VampireZ/VampireZ.js'; -import Walls from '../Structures/MiniGames/Walls.js'; -import Warlords from '../Structures/MiniGames/Warlords/Warlords.js'; -import WoolGames from '../Structures/MiniGames/WoolGames/WoolGames.js'; +import type { SortName } from './Global.js'; -export type Language = - | 'CHINESE_SIMPLIFIED' - | 'CHINESE_TRADITIONAL' - | 'CZECH' - | 'DANISH' - | 'DUTCH' - | 'ENGLISH' - | 'FINNISH' - | 'FRENCH' - | 'GERMAN' - | 'GREEK' - | 'HUNGARIAN' - | 'ITALIAN' - | 'JAPANESE' - | 'KOREAN' - | 'NORWEGIAN' - | 'POLISH' - | 'PORTUGUESE_BR' - | 'PORTUGUESE_PT' - | 'PIRATE' - | 'ROMANIAN' - | 'RUSSIAN' - | 'SERBIAN_CYRILLIC' - | 'SPANISH' - | 'SWEDISH' - | 'TURKISH' - | 'UKRAINIAN'; -export type ChatChannel = 'ALL' | 'PARTY' | 'GUILD' | 'OFFICER' | 'PM' | 'SKYBLOCK_COOP'; +export type PlayerHousingSettingsTextInputType = 'CHAT'; +export type PlayerHousingPlotSize = 'SMALL' | 'MEDIUM' | 'LARGE' | 'MASSIVE' | 'EXTREME'; +export type PlayerHousingTutorialStage = 'WAITING_FOR_INTERACTION' | 'GIVING_KIT' | 'FINISHED' | 'FINISH_FINISHED'; +export type PlayerTourneyShopSort = 'highest_cost' | SortName; +export type PlayerAchievementsOneTimeSort = 'highest_points' | SortName; export type SeasonName = 'christmas' | 'easter' | 'summer' | 'halloween' | 'anniversary'; export type SocialMediaId = 'DISCORD' | 'TWITTER' | 'YOUTUBE' | 'INSTAGRAM' | 'TIKTOK' | 'TWITCH' | 'HYPIXEL'; export type ZombiesMaps = 'deadend' | 'badblood' | 'alienarcadium' | 'prison'; @@ -416,56 +372,6 @@ export type CopsAndCrimsGuns = | 'bullpup' | 'knife'; -export interface LevelProgress { - level: number; - xpToNext: number; - remainingXP: number; - currentXP: number; - percent: number; - percentRemaining: number; -} - -export interface PlayerStats { - Arcade: Arcade; - ArenaBrawl: ArenaBrawl; - BedWars: BedWars; - BlitzSurvivalGames: BlitzSurvivalGames; - BuildBattle: BuildBattle; - CopsAndCrims: CopsAndCrims; - Duels: Duels; - MegaWalls: MegaWalls; - MurderMystery: MurderMystery; - Paintball: Paintball; - Pit: Pit; - QuakeCraft: Quakecraft; - SkyWars: SkyWars; - SmashHeroes: SmashHeroes; - SpeedUHC: SpeedUHC; - TNTGames: TNTGames; - TurboKartRacers: TurboKartRacers; - UHC: UHC; - VampireZ: VampireZ; - Walls: Walls; - Warlords: Warlords; - WoolGames: WoolGames; -} - -export type PlayerRank = - | null - | 'VIP' - | 'VIP+' - | 'MVP' - | 'MVP+' - | 'MVP++' - | 'Game Master' - | 'Admin' - | 'YouTube' - | 'Events' - | 'Mojang' - | 'Owner' - | 'PIG+++' - | 'Innit'; - export interface RanksPurchaseTime { VIP: Date | null; VIP_PLUS: Date | null; @@ -593,3 +499,740 @@ export interface PitArmor { leggings: PitInventoryItem | null; boots: PitInventoryItem | null; } + +export type PlayerAchievementsTotemColors = 'blue' | 'purple' | 'overgrown' | 'yellow' | 'green' | 'steampunk' | 'red'; +export type PlayerAchievementsTotemParts = + | 'birdy' + | 'happy' + | 'arrow' + | 'snake' + | 'pong' + | 'corner' + | 'weird' + | 'window' + | 'grumpy' + | 'grizzly' + | 'sad' + | 'connection' + | 'cube' + | 'cat'; + +export type PlayerRank = + | null + | 'VIP' + | 'VIP+' + | 'MVP' + | 'MVP+' + | 'MVP++' + | 'Game Master' + | 'Admin' + | 'YouTube' + | 'Events' + | 'Mojang' + | 'Owner' + | 'PIG+++' + | 'Innit'; + +export interface LevelProgress { + level: number; + totalXp: number; + xpToNext: number; + remainingXP: number; + currentXP: number; + percent: number; + percentRemaining: number; +} + +export type Language = + | 'CHINESE_SIMPLIFIED' + | 'CHINESE_TRADITIONAL' + | 'CZECH' + | 'DANISH' + | 'DUTCH' + | 'ENGLISH' + | 'FINNISH' + | 'FRENCH' + | 'GERMAN' + | 'GREEK' + | 'HUNGARIAN' + | 'ITALIAN' + | 'JAPANESE' + | 'KOREAN' + | 'NORWEGIAN' + | 'POLISH' + | 'PORTUGUESE_BR' + | 'PORTUGUESE_PT' + | 'PIRATE' + | 'ROMANIAN' + | 'RUSSIAN' + | 'SERBIAN_CYRILLIC' + | 'SPANISH' + | 'SWEDISH' + | 'TURKISH' + | 'UKRAINIAN'; + +export type PlayerCosmeticsPetName = + | 'sheep_white' + | 'pig' + | 'mule' + | 'black_rabbit' + | 'sheep_blue_baby' + | 'cat_black' + | 'frozen_skeleton' + | 'brown_horse_baby' + | 'silverfish' + | 'wolf' + | 'sheep_magenta' + | 'sheep_silver' + | 'sheep_gray' + | 'zombie_baby' + | 'horse_grey' + | 'sheep_brown' + | 'cat_red_baby' + | 'zombie' + | 'chicken' + | 'sheep_light_blue' + | 'magma_cube_small' + | 'cow' + | 'chicken_baby' + | 'magma_cube_big' + | 'zombie_villager' + | 'horse_black' + | 'horse_dark_brown_baby' + | 'cat_siamese' + | 'horse_creamy' + | 'horse_chestnut_baby' + | 'horse_white' + | 'cat_black_baby' + | 'slime_big' + | 'horse_brown' + | 'pig_baby' + | 'brown_rabbit' + | 'horse_chestnut' + | 'sheep_blue' + | 'pig_zombie' + | 'sheep_white_baby' + | 'sheep_red_baby' + | 'slime_small' + | 'slime_tiny' + | 'magma_cube_tiny' + | 'totem' + | 'sheep_red' + | 'cat_siamese_baby' + | 'cat_red' + | 'wolf_baby' + | 'pig_zombie_baby' + | 'sheep_green' + | 'sheep_black_baby' + | 'sheep_yellow' + | 'donkey' + | 'mooshroom_baby' + | 'mooshroom' + | 'cow_baby' + | 'spider_jockey' + | 'villager_butcher' + | 'villager_priest' + | 'spider' + | 'white_rabbit' + | 'skeleton' + | 'sheep_black' + | 'sheep_yellow_baby' + | 'villager_farmer' + | 'enderman' + | 'horse_undead' + | 'gold_rabbit' + | 'salt_pepper_rabbit' + | 'black_white_rabbit' + | 'villager_butcher_baby' + | 'villager_priest_baby' + | 'creeper' + | 'villager_blacksmith_baby' + | 'villager_blacksmith' + | 'villager_farmer_baby' + | 'villager_librarian' + | 'villager_librarian_baby' + | 'cave_spider' + | 'horse_dark_brown' + | 'bat' + | 'horse_creamy_baby' + | 'iron_golem' + | 'creeper_powered' + | 'fish' + | 'frozen_zombie' + | 'sheep_lime' + | 'sheep_rainbow' + | 'enderman_snow_block' + | 'sheep_cyan' + | 'sheep_purple' + | 'herobrine' + | 'sheep_pink_baby' + | 'sheep_orange' + | 'witch' + | 'merry_sheep' + | 'sheep_orange_baby' + | 'clownfish' + | 'sheep_silver_baby' + | 'sheep_gray_baby' + | 'rabbit_jockey' + | 'endermite' + | 'black_pug' + | 'sheep_pink' + | 'specter' + | 'enderman_pumpkin' + | 'snowman' + | 'red_helper' + | 'green_helper' + | 'horse_gray_baby' + | 'sheep_lime_baby' + | 'white_pug' + | 'sheep_magenta_baby' + | 'sheep_cyan_baby' + | 'growing_zombie' + | 'bee' + | 'smoldering_skeleton' + | 'mini_wither' + | 'zombie_villager_baby' + | 'sheep_brown_baby' + | 'sheep_purple_baby' + | 'snowman_jockey' + | 'sheep_light_blue_baby' + | 'sheep_green_baby' + | 'flying_squid' + | 'bouncy_sheep' + | 'little_you' + | 'duck' + | 'frog' + | 'elephant' + | 'panda' + | 'gorrila' + | 'chimp' + | 'sloth' + | 'horse_skeleton' + | 'killer_rabbit' + | 'enderman_hay_bale' + | 'chicken_jockey' + | 'burning_zombie' + | 'bouncy_spider' + | 'colorbox' + | 'guardian' + | 'hp8'; + +export type PlayerCosmeticsSuit = + | 'mermaid_leggings' + | 'bumblebee_boots' + | 'spiderman_boots' + | 'frog_chestplate' + | 'baker_chestplate' + | 'elf_leggings' + | 'grinch_leggings' + | 'elf_boots' + | 'grinch_helmet' + | 'plumber_boots' + | 'chicken_chestplate' + | 'chicken_helmet' + | 'chicken_boots' + | 'ghost_boots' + | 'flash_boots' + | 'warrior_boots' + | 'ghost_leggings' + | 'death_angel_boots' + | 'arctic_leggings' + | 'frog_leggings' + | 'necromancer_leggings' + | 'mermaid_boots' + | 'baker_leggings' + | 'baker_boots' + | 'thor_boots' + | 'necromancer_boots' + | 'mermaid_chestplate' + | 'warrior_leggings' + | 'death_angel_leggings' + | 'fireman_helmet' + | 'arctic_boots' + | 'ninja_boots' + | 'dragon_breath_helmet' + | 'pirate_boots' + | 'necromancer_helmet' + | 'solar_chestplate' + | 'arctic_chestplate' + | 'soccer_boots' + | 'pirate_helmet' + | 'wolf_leggings' + | 'warrior_chestplate' + | 'bumblebee_helmet' + | 'frog_boots' + | 'costume_helmet' + | 'disco_leggings' + | 'flash_helmet' + | 'costume_boots' + | 'vampire_boots' + | 'costume_leggings' + | 'costume_chestplate' + | 'magma_boss_leggings' + | 'headless_horseman_chestplate' + | 'vampire_leggings' + | 'skeleton_samurai_chestplate' + | 'disco_boots' + | 'flash_leggings' + | 'plumber_leggings' + | 'fireman_boots' + | 'new_years_boots' + | 'santa_boots' + | 'disco_helmet' + | 'new_years_leggings' + | 'santa_chestplate' + | 'thor_leggings' + | 'mermaid_helmet' + | 'ninja_helmet' + | 'flash_chestplate' + | 'baker_helmet' + | 'spiderman_leggings' + | 'plumber_chestplate' + | 'ghost_chestplate' + | 'thor_chestplate' + | 'easter_egg_chestplate' + | 'warrior_helmet' + | 'bumblebee_leggings' + | 'ninja_leggings' + | 'yeti_leggings' + | 'new_years_chestplate' + | 'frog_helmet' + | 'death_angel_helmet' + | 'tnt_boots' + | 'tnt_chestplate' + | 'tnt_helmet' + | 'tnt_leggings' + | 'dragon_breath_chestplate' + | 'dragon_breath_leggings' + | 'dragon_breath_boots' + | 'solar_boots' + | 'solar_leggings' + | 'solar_helmet' + | 'elf_helmet' + | 'elf_chestplate' + | 'thor_helmet' + | 'bumblebee_chestplate' + | 'pumpkin_helmet' + | 'skeleton_samurai_boots' + | 'skeleton_samurai_helmet' + | 'yeti_chestplate' + | 'yeti_boots' + | 'arctic_helmet' + | 'grinch_boots' + | 'disco_chestplate' + | 'fireman_leggings' + | 'easter_egg_boots' + | 'easter_egg_leggings' + | 'chicken_leggings' + | 'headless_horseman_boots' + | 'magma_boss_boots' + | 'ghost_helmet' + | 'necromancer_chestplate' + | 'death_angel_chestplate' + | 'plumber_helmet' + | 'pirate_leggings' + | 'ninja_chestplate' + | 'spiderman_chestplate' + | 'spiderman_helmet' + | 'fireman_chestplate' + | 'toy_chestplate' + | 'toy_leggings' + | 'santa_leggings' + | 'grinch_chestplate' + | 'soccer_helmet' + | 'vampire_chestplate' + | 'soccer_leggings' + | 'wolf_helmet' + | 'wolf_chestplate' + | 'pumpkin_boots' + | 'vampire_helmet' + | 'toy_boots' + | 'pirate_chestplate' + | 'new_years_helmet' + | 'easter_egg_helmet' + | 'treasure_boots' + | 'toy_helmet' + | 'wolf_boots' + | 'headless_horseman_helmet' + | 'headless_horseman_leggings' + | 'yeti_helmet' + | 'soccer_chestplate' + | 'pumpkin_chestplate' + | 'treasure_helmet' + | 'magma_boss_chestplate' + | 'pumpkin_leggings' + | 'santa_helmet' + | 'magma_boss_helmet' + | 'skeleton_samurai_leggings' + | 'treasure_chestplate' + | 'treasure_leggings' + | 'phoenix_helmet'; + +export type PlayerCosmeticsHat = + | 'bee' + | 'number_5' + | 'letter_r' + | 'letter_g' + | 'letter_plus' + | 'clownfish' + | 'earth' + | 'letter_v' + | 'festive_zombie' + | 'festive_skeleton' + | 'festive_villager' + | 'festive_squid' + | 'festive_herobrine' + | 'rainbow_present' + | 'wood_elf' + | 'lady_bug' + | 'number_1' + | 'chick' + | 'toaster' + | 'letter_a' + | 'koala' + | 'beach_ball' + | 'chocolate_egg' + | 'golden_knight' + | 'orc' + | 'letter_x' + | 'duckling' + | 'bird' + | 'burger' + | 'cactus' + | 'polar_bear' + | 'ferret' + | 'demon_knight' + | 'mars' + | 'letter_u' + | 'letter_h' + | 'letter_q' + | 'letter_z' + | 'letter_k' + | 'letter_d' + | 'letter_y' + | 'letter_p' + | 'letter_n' + | 'groopo' + | 'evil_eye' + | 'aqua_orb' + | 'letter_question' + | 'fire_demon' + | 'forester' + | 'number_2' + | 'vintage' + | 'number_9' + | 'letter_w' + | 'panda' + | 'broken_tv' + | 'number_4' + | 'squid' + | 'elephant' + | 'letter_o' + | 'elf_princess' + | 'letter_l' + | 'letter_j' + | 'cheese' + | 'number_8' + | 'owl' + | 'assassin' + | 'egyptian_queen' + | 'halloween_pig_zombie' + | 'halloween_skull' + | 'mummy' + | 'jason' + | 'sloth' + | 'letter_b' + | 'duck' + | 'rainbow_glitch' + | 'number_3' + | 'football_star' + | 'letter_exclaimation' + | 'miner' + | 'letter_e' + | 'dead_pirate' + | 'frog' + | 'egg_head' + | 'ginger_bread' + | 'elfgirl' + | 'bell' + | 'pug_black' + | 'horse' + | 'otter' + | 'letter_s' + | 'letter_hashtag' + | 'number_7' + | 'alien_slug' + | 'skull_king_banner' + | 'fox' + | 'monkey' + | 'number_6' + | 'letter_t' + | 'easter_egg' + | 'snowglobe' + | 'penguin' + | 'snow_globe' + | 'candy_cane' + | 'present_hat' + | 'grinch' + | 'decoration_ball' + | 'lucky_dragon' + | 'monk' + | 'sandwich' + | 'monitor' + | 'unlock_machine' + | 'parrot' + | 'golem' + | 'snowball' + | 'rabbit' + | 'letter_i' + | 'odin' + | 'scavenger' + | 'space' + | 'mage' + | 'astronaut' + | 'wood_steve' + | 'ender_dragon' + | 'clown' + | 'scarecrow2' + | 'halloween_ghast' + | 'walrus' + | 'stone_steve' + | 'gingerbread' + | 'snowman' + | 'white_wizard' + | 'turtle' + | 'cauldron' + | 'elfboy' + | 'letter_c' + | 'dinosaur' + | 'letter_f' + | 'minotaur' + | 'hp8' + | 'number_0' + | 'reindeer' + | 'robo_bird' + | 'pug_white' + | 'basketball' + | 'letter_m' + | 'scarecrow' + | 'hypixel_h' + | 'magic_dog' + | 'easter_basket' + | 'bauble' + | 'joe_penguin' + | 'gingerbread_man' + | 'ghost' + | 'santa' + | 'comet_reindeer' + | 'siren' + | 'halloween_marionette' + | 'clown2' + | 'doge' + | 'werewolf' + | 'stocking' + | 'derpy_snowman' + | 'halloween_evil_pumpkin' + | 'crown' + | 'gorilla' + | 'shibe' + | 'eater' + | 'devourer' + | 'pumpkin' + | 'iron_steve' + | 'traffic_light' + | 'ice_mage' + | 'spooked_pufferfish' + | 'gold_steve'; + +export type PlayerCosmeticsGadget = + | 'explosive_bow' + | 'snowman' + | 'holiday_tree' + | 'advent_proof' + | 'christmas_cracker' + | 'exploding_sheep' + | 'tree_planter' + | 'flaming_egg_launcher' + | 'bunny_party' + | 'magic_carpet' + | 'parachute' + | 'paintball_gun' + | 'fortune_cookie' + | 'fire_trail' + | 'rush_pearl' + | 'rocket' + | 'wizardwand' + | 'jetpack' + | 'horror_movie' + | 'bbq_grill' + | 'flower_giver' + | 'tic_tac_toe' + | 'paint_trail' + | 'volleyball' + | 'secret_service' + | 'dice' + | 'swarm' + | 'party_popper' + | 'tnt_fountain' + | 'hype_train' + | 'teleporter' + | 'grappling_hook' + | 'ghosts' + | 'tetherball' + | 'hot_potato' + | 'radio' + | 'rock_paper_shears' + | 'meteorite' + | 'disco_ball' + | 'latte' + | 'sled' + | 'new_year_countdown' + | 'tidal_wave' + | 'pinata' + | 'tennis_ball' + | 'water_balloon' + | 'creeper_astronaut' + | 'poop_bomb' + | 'rainbow' + | 'chicken_cannon' + | 'bat_launcher' + | 'firework_launcher' + | 'treat_fountain' + | 'holiday_choir' + | 'snow_globe' + | 'flammable_grappling_hook' + | 'cornucopia' + | 'trampoline' + | 'anniversary_trampoline' + | 'diving_board' + | 'dreidel' + | 'let_snow' + | 'pong' + | 'giant_skeleton' + | 'levitation_gun' + | 'new_year' + | 'swing' + | 'pocket_beach' + | 'trick_or_treat' + | 'pumpkin_cannon' + | 'duels_banner' + | 'sand_castle' + | 'scare_crow' + | 'ice_skating' + | 'ice_cream_stand' + | 'anniversary_knight' + | 'corrupted' + | 'pumpkin_rain' + | 'graveyard' + | 'skywars_banner' + | 'tournament_banner' + | 'tournament_banner_grinch_simulator_0' + | 'frisbee' + | 'dj_booth' + | 'witch_cauldron' + | 'golden_chicken_statue'; + +export type PlayerCosmeticsMorph = + | 'rabbit' + | 'spider' + | 'pig' + | 'sheep' + | 'chicken' + | 'zombie' + | 'creeper' + | 'cow' + | 'guardian' + | 'iron_golem' + | 'enderman' + | 'skeleton' + | 'wither_skeleton' + | 'blaze' + | 'snow_morph' + | 'grinch' + | 'cave_spider' + | 'witch'; + +export type PlayerCosmeticsCloak = + | 'monarch_wings' + | 'easter_egg' + | 'sweetwings' + | 'scanner' + | 'firewings' + | 'rose' + | 'clover' + | 'achievement_points' + | 'mystical' + | 'downpour' + | 'comets' + | 'frozen_dragon_wings' + | 'superhero' + | 'bone_wings' + | 'acid_rain' + | 'dark_angel' + | 'shimmering_wings' + | 'shaman' + | 'icy_wings' + | 'frosty_cloak' + | 'vampire_wings' + | 'menorah' + | 'rainy_day' + | 'egg_scanner' + | 'dark_energy' + | 'storm' + | 'blizzard' + | 'snowball' + | 'candy_cane' + | 'spooky_wings' + | 'twisted' + | 'colorbox' + | 'candy_spiral' + | 'lovely'; + +export type PlayerCosmeticsTaunt = + | 'goodbye' + | 'hype_dance' + | 'victory' + | 'clapping' + | 'wave_dance' + | 'cool_dance' + | 'hula' + | 'mind' + | 'jump' + | 'snowball_toss' + | 'can' + | 'zombie_dance' + | 'possessed' + | 'hi_5' + | 'sun' + | 'karaoke' + | 'graduation' + | 'ballet' + | 'treasure' + | 'crab_dance'; + +export type PlayerCosmeticsRankColor = + | 'gold' + | 'green' + | 'yellow' + | 'light_purple' + | 'white' + | 'blue' + | 'dark_green' + | 'dark_red' + | 'dark_aqua' + | 'dark_purple' + | 'dark_gray' + | 'black'; + +export type PlayerCosmeticsParticlePack = + | 'frozen' + | 'spring' + | 'huge_explosion' + | 'snow_trail' + | 'tinsel' + | 'spooky' + | 'red_dust' + | 'splash'; + +export type PlayerCosmeticsClickEffects = 'skull' | 'blizzard' | 'easter_egg' | 'holiday_firework' | 'hypixel'; +export type ChatChannel = 'ALL' | 'PARTY' | 'GUILD' | 'OFFICER' | 'PM' | 'SKYBLOCK_COOP'; diff --git a/src/Types/SkyBlock.ts b/src/Types/SkyBlock.ts index f29c36a47..584fcb867 100644 --- a/src/Types/SkyBlock.ts +++ b/src/Types/SkyBlock.ts @@ -1,5 +1,7 @@ /* v8 ignore next 10000 */ +import type { SortName } from './Global.js'; + export interface RawAbiphoneData { talked_to?: boolean; completed_quest?: boolean; @@ -126,7 +128,7 @@ export type MiningSkyMallEffect = | 'pickaxe_ability_cooldown' | 'goblin_chance' | 'titanium_ore_multiplier'; -export type TaskLevelingSort = 'unlocked' | 'earned' | 'available' | 'a_to_z' | 'z_to_a'; +export type TaskLevelingSort = 'unlocked' | 'earned' | 'available' | SortName; export type SkyBlockProfileType = 'bingo' | 'island' | 'ironman'; export type CrimsonIsleFaction = 'mages' | 'barbarians'; export type CrimsonIsleBelt = 'White' | 'Yellow' | 'Green' | 'Blue' | 'Brown' | 'Black'; diff --git a/src/Utils/PlayerUtils.test.ts b/src/Utils/PlayerUtils.test.ts deleted file mode 100644 index a340c3512..000000000 --- a/src/Utils/PlayerUtils.test.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { describe, expect, test } from 'vitest'; -import { - getPlayerLevel, - getRank, - levelToXP, - parseClaimedRewards, - playerLevelProgress, - xpToNextLevel -} from './PlayerUtils.js'; - -test('getRank', () => { - expect(getRank({ prefix: '[EVENTS]' })).toBe('Events'); - expect(getRank({ prefix: '[MOJANG]' })).toBe('Mojang'); - expect(getRank({ prefix: '[PIG+++]' })).toBe('PIG+++'); - expect(getRank({ prefix: '[INNIT]' })).toBe('Innit'); - expect(getRank({ prefix: '[meow]' })).toBeNull(); - - expect(getRank({ rank: 'ADMIN' })).toBe('Admin'); - expect(getRank({ rank: 'GAME_MASTER' })).toBe('Game Master'); - expect(getRank({ rank: 'Meow' })).toBeNull(); - - expect(getRank({ newPackageRank: 'MVP_PLUS', monthlyPackageRank: 'SUPERSTAR' })).toBe('MVP++'); - expect(getRank({ newPackageRank: 'MVP_PLUS', monthlyPackageRank: 'Meow' })).toBe('MVP+'); - expect(getRank({ newPackageRank: 'MVP' })).toBe('MVP'); - expect(getRank({ newPackageRank: 'VIP_PLUS' })).toBe('VIP+'); - expect(getRank({ newPackageRank: 'VIP' })).toBe('VIP'); - expect(getRank({ newPackageRank: 'meow' })).toBeNull(); -}); - -test('getPlayerLevel', () => { - describe('should calculate the player level correctly', () => { - const exp = 10000; - expect(getPlayerLevel(exp)).toBe(1); - }); -}); - -test('xpToNextLevel', () => { - describe('should calculate the XP required for the next level correctly', () => { - const xp = 10000; - expect(xpToNextLevel(xp)).toBe(25000); - }); - - describe('should return 10000 if the XP is less than 10000', () => { - const xp = 5000; - expect(xpToNextLevel(xp)).toBe(10000); - }); -}); - -test('levelToXP', () => { - describe('should calculate the XP required for a given level correctly', () => { - const level = 2; - expect(levelToXP(level)).toBe(20000); - }); -}); - -test('playerLevelProgress', () => { - describe('should calculate the player level progress correctly', () => { - const xp = 15000; - const expectedProgress = { - xpToNext: 37500, - remainingXP: 22500, - currentXP: 12500, - percent: 33.33, - percentRemaining: 66.67 - }; - expect(playerLevelProgress(xp)).toEqual(expectedProgress); - }); -}); - -test('parseClaimedRewards', () => { - describe('should parse the claimed rewards correctly', () => { - /* eslint-disable camelcase */ - const data = { - levelingReward_1: true, - levelingReward_3: true, - levelingReward_5: true - }; - /* eslint-enable camelcase */ - const expectedRewards = [1, 3, 5]; - expect(parseClaimedRewards(data)).toEqual(expectedRewards); - }); -}); diff --git a/src/Utils/PlayerUtils.ts b/src/Utils/PlayerUtils.ts deleted file mode 100644 index 54d666ac7..000000000 --- a/src/Utils/PlayerUtils.ts +++ /dev/null @@ -1,90 +0,0 @@ -import type { LevelProgress, PlayerRank } from '../Types/Player.js'; - -export function getRank(player: Record): PlayerRank { - if (player.prefix) { - switch (player.prefix.replace(/§[0-9|a-z]|\[|\]/g, '')) { - case 'EVENTS': - return 'Events'; - case 'MOJANG': - return 'Mojang'; - case 'PIG+++': - return 'PIG+++'; - case 'INNIT': - return 'Innit'; - default: - return null; - } - } else if (player.rank) { - switch (player.rank) { - case 'ADMIN': - return 'Admin'; - case 'GAME_MASTER': - return 'Game Master'; - default: - return null; - } - } else { - switch (player.newPackageRank) { - case 'MVP_PLUS': - return 'SUPERSTAR' !== player.monthlyPackageRank ? 'MVP+' : 'MVP++'; - case 'MVP': - return 'MVP'; - case 'VIP_PLUS': - return 'VIP+'; - case 'VIP': - return 'VIP'; - default: - return null; - } - } -} - -export function getPlayerLevel(exp: number): number { - const base = 10000; - const growth = 2500; - const reversePqPrefix = -(base - 0.5 * growth) / growth; - const reverseConst = reversePqPrefix * reversePqPrefix; - const growthDivides2 = 2 / growth; - const num = 1 + reversePqPrefix + Math.sqrt(reverseConst + growthDivides2 * exp); - const level = Math.round(num * 100) / 100; - return level; -} - -export function xpToNextLevel(xp: number): number { - const lvl = getPlayerLevel(xp); - const xpToNext = 2500 * Math.floor(lvl) + 5000; - if (10000 > xp) return 10000; - return xpToNext; -} - -export function levelToXP(xp: number): number { - let level = Number(Math.floor(getPlayerLevel(xp))); - level = level - 1; - return 1250 * level ** 2 + 8750 * level; -} - -export function playerLevelProgress(xp: number): LevelProgress { - const xpFromLevel = levelToXP(xp); - let currentXP = xp - xpFromLevel; - const xpToNext = xpToNextLevel(xp); - const remainingXP = xpToNext - currentXP + 2500; - currentXP = currentXP - 2500; - const percent = Math.round((currentXP / xpToNext) * 100 * 100) / 100; - const percentRemaining = Math.round((100 - percent) * 100) / 100; - return { - level: getPlayerLevel(xp), - xpToNext, - remainingXP, - currentXP, - percent, - percentRemaining - }; -} - -export function parseClaimedRewards(data: Record): number[] { - return Object.keys(data) - .map((x) => x.match(/levelingReward_(\d+)/)) - .filter((x) => x) - .map((x) => (x ? parseInt(x?.[1] || '0', 10) : null)) - .filter((x) => null !== x); -} diff --git a/src/index.ts b/src/index.ts index bc589c4d4..10352a2c3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -49,7 +49,6 @@ import Color from './Structures/Color.js'; import CopsAndCrims from './Structures/MiniGames/CopsAndCrims/CopsAndCrims.js'; import CopsAndCrimsGamemode from './Structures/MiniGames/CopsAndCrims/CopsAndCrimsGamemode.js'; import CopsAndCrimsGun from './Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.js'; -import Cosmetics from './Structures/Player/Cosmetics.js'; import DragonWars from './Structures/MiniGames/Arcade/DragonWars.js'; import Dropper from './Structures/MiniGames/Arcade/Dropper.js'; import DropperMap from './Structures/MiniGames/Arcade/DropperMap.js'; @@ -69,7 +68,6 @@ import GameAchievements from './Structures/Static/Achievements/GameAchievements. import GameChallenges from './Structures/Static/GameChallenges.js'; import GameCounts from './Structures/GameCounts.js'; import GameQuests from './Structures/Static/GameQuests.js'; -import Gifting from './Structures/Player/Gifting.js'; import Guild from './Structures/Guild/Guild.js'; import GuildAchievements from './Structures/Static/Achievements/GuildAchievements.js'; import GuildMember from './Structures/Guild/GuildMember.js'; @@ -77,7 +75,6 @@ import GuildRank from './Structures/Guild/GuildRank.js'; import HideAndSeek from './Structures/MiniGames/Arcade/HideAndSeek.js'; import HoleInTheWall from './Structures/MiniGames/Arcade/HoleInTheWall.js'; import House from './Structures/House.js'; -import Housing from './Structures/Housing.js'; import HypixelSays from './Structures/MiniGames/Arcade/HypixelSays.js'; import ItemBytes from './Structures/ItemBytes.js'; import Leaderboard from './Structures/Leaderboard.js'; @@ -85,29 +82,47 @@ import MegaWalls from './Structures/MiniGames/MegaWalls/MegaWalls.js'; import MegaWallsKitStats from './Structures/MiniGames/MegaWalls/MegaWallsKitStats.js'; import MegaWallsModeStats from './Structures/MiniGames/MegaWalls/MegaWallsModeStats.js'; import MiniWalls from './Structures/MiniGames/Arcade/MiniWalls.js'; -import MonthlyCrate from './Structures/Player/MonthlyCrate.js'; import MurderMystery from './Structures/MiniGames/MurderMystery/MurderMystery.js'; import MurderMysteryModeStats from './Structures/MiniGames/MurderMystery/MurderMysteryModeStats.js'; import OneTimeAchievement from './Structures/Static/Achievements/OneTimeAchievement.js'; import PVPRun from './Structures/MiniGames/TNTGames/PVPRun.js'; import Paintball from './Structures/MiniGames/Paintball.js'; -import Parkour from './Structures/Player/Parkour.js'; import PartyGames from './Structures/MiniGames/Arcade/PartyGames.js'; import PartyPooper from './Structures/MiniGames/Arcade/PartyPooper.js'; -import Pet from './Structures/Player/Pet.js'; -import PetConsumables from './Structures/Player/PetConsumables.js'; -import Pets from './Structures/Player/Pets.js'; import Pit from './Structures/MiniGames/Pit/Pit.js'; import PitInventoryItem from './Structures/MiniGames/Pit/PitInventoryItem.js'; import PixelParty from './Structures/MiniGames/Arcade/PixelParty.js'; import PixelPartyGameMode from './Structures/MiniGames/Arcade/PixelPartyGameMode.js'; import Player from './Structures/Player/Player.js'; -import PlayerAchievements from './Structures/Player/PlayerAchievements.js'; -import PlayerAchievementsRewards from './Structures/Player/PlayerAchievementsRewards.js'; -import PlayerQuest from './Structures/Player/Quests/PlayerQuest.js'; -import PlayerQuestCompletion from './Structures/Player/Quests/PlayerQuestCompletion.js'; -import PlayerQuestCompletions from './Structures/Player/Quests/PlayerQuestCompletions.js'; -import PlayerQuests from './Structures/Player/Quests/PlayerQuests.js'; +import PlayerAchievements from './Structures/Player/PlayerAchievements/PlayerAchievements.js'; +import PlayerAchievementsRewards from './Structures/Player/PlayerAchievements/PlayerAchievementsRewards.js'; +import PlayerAchivementsTotem from './Structures/Player/PlayerAchievements/PlayerAchivementsTotem.js'; +import PlayerAdventRewards from './Structures/Player/PlayerAdventRewards/PlayerAdventRewards.js'; +import PlayerAdventRewardsDay from './Structures/Player/PlayerAdventRewards/PlayerAdventRewardsDay.js'; +import PlayerCosmetics from './Structures/Player/PlayerCosmetics/PlayerCosmetics.js'; +import PlayerCosmeticsPet from './Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPet.js'; +import PlayerCosmeticsPets from './Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPets.js'; +import PlayerCosmeticsPetsConsumables from './Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPetsConsumables.js'; +import PlayerGifting from './Structures/Player/PlayerGifting.js'; +import PlayerHousing from './Structures/Player/PlayerHousing/PlayerHousing.js'; +import PlayerHousingGivenCookies from './Structures/Player/PlayerHousing/PlayerHousingGivenCookies.js'; +import PlayerHousingPlayerSettings from './Structures/Player/PlayerHousing/PlayerHousingPlayerSettings.js'; +import PlayerParkour from './Structures/Player/PlayerParkour.js'; +import PlayerQuest from './Structures/Player/PlayerQuests/PlayerQuest.js'; +import PlayerQuestCompletion from './Structures/Player/PlayerQuests/PlayerQuestCompletion.js'; +import PlayerQuestCompletions from './Structures/Player/PlayerQuests/PlayerQuestCompletions.js'; +import PlayerQuests from './Structures/Player/PlayerQuests/PlayerQuests.js'; +import PlayerRankPurchase from './Structures/Player/PlayerRankPurchase.js'; +import PlayerRewards from './Structures/Player/PlayerRewards/PlayerRewards.js'; +import PlayerRewardsMonthlyCrate from './Structures/Player/PlayerRewards/PlayerRewardsMonthlyCrate.js'; +import PlayerScorpiusBribe from './Structures/Player/PlayerScorpiusBribe.js'; +import PlayerSeasonalChristmasYear from './Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYear.js'; +import PlayerSeasonalChristmasYearAdventRewards from './Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYearAdventRewards.js'; +import PlayerSeasonalChristmasYearLeveling from './Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYearLeveling.js'; +import PlayerSocialMedia from './Structures/Player/PlayerSocialMedia.js'; +import PlayerStats from './Structures/Player/PlayerStats.js'; +import PlayerTourney from './Structures/Player/PlayerTourney/PlayerTourney.js'; +import PlayerTourneyData from './Structures/Player/PlayerTourney/PlayerTourneyData.js'; import PropHunt from './Structures/MiniGames/Arcade/PropHunt.js'; import Quakecraft from './Structures/MiniGames/Quakecraft/Quakecraft.js'; import QuakecraftMode from './Structures/MiniGames/Quakecraft/QuakecraftMode.js'; @@ -115,12 +130,6 @@ import Quest from './Structures/Static/Quest.js'; import QuestObjective from './Structures/Static/QuestObjective.js'; import Quests from './Structures/Static/Quests.js'; import RecentGame from './Structures/RecentGame.js'; -import Rewards from './Structures/Player/Rewards.js'; -import Season from './Structures/Player/Seasonal/Season.js'; -import SeasonBingo from './Structures/Player/Seasonal/SeasonBingo.js'; -import SeasonBingoTier from './Structures/Player/Seasonal/SeasonBingoTier.js'; -import SeasonYear from './Structures/Player/Seasonal/SeasonYear.js'; -import Seasonal from './Structures/Player/Seasonal/Seasonal.js'; import SheepWars from './Structures/MiniGames/WoolGames/SheepWars.js'; import SkyBlockAuction from './Structures/SkyBlock/Auctions/SkyBlockAuction.js'; import SkyBlockAuctionBid from './Structures/SkyBlock/Auctions/SkyBlockAuctionBid.js'; @@ -288,7 +297,6 @@ import SkyWarsPackages from './Structures/MiniGames/SkyWars/SkyWarsPackages.js'; import SmashHeoresHero from './Structures/MiniGames/SmashHeroes/SmashHeoresHero.js'; import SmashHeroes from './Structures/MiniGames/SmashHeroes/SmashHeroes.js'; import SmashHeroesMode from './Structures/MiniGames/SmashHeroes/SmashHeroesMode.js'; -import SocialMedia from './Structures/Player/SocialMedia.js'; import SpeedUHC from './Structures/MiniGames/SpeedUHC/SpeedUHC.js'; import SpeedUHCMode from './Structures/MiniGames/SpeedUHC/SpeedUHCMode.js'; import Status from './Structures/Status.js'; @@ -298,8 +306,6 @@ import TNTTag from './Structures/MiniGames/TNTGames/TNTTag.js'; import TNTWizards from './Structures/MiniGames/TNTGames/TNTWizards.js'; import ThrowOut from './Structures/MiniGames/Arcade/ThrowOut.js'; import TieredAchievement from './Structures/Static/Achievements/TieredAchievement.js'; -import Tourney from './Structures/Player/Tourney/Tourney.js'; -import TourneyData from './Structures/Player/Tourney/TourneyData.js'; import TurboKartRacers from './Structures/MiniGames/TurboKartRacers/TurboKartRacers.js'; import TurboKartRacersMap from './Structures/MiniGames/TurboKartRacers/TurboKartRacersMap.js'; import UHC from './Structures/MiniGames/UHC/UHC.js'; @@ -353,7 +359,6 @@ export default { CopsAndCrims, CopsAndCrimsGamemode, CopsAndCrimsGun, - Cosmetics, DragonWars, Dropper, DropperMap, @@ -373,7 +378,6 @@ export default { GameChallenges, GameCounts, GameQuests, - Gifting, Guild, GuildAchievements, GuildMember, @@ -381,7 +385,6 @@ export default { HideAndSeek, HoleInTheWall, House, - Housing, HypixelSays, ItemBytes, Leaderboard, @@ -389,18 +392,13 @@ export default { MegaWallsKitStats, MegaWallsModeStats, MiniWalls, - MonthlyCrate, MurderMystery, MurderMysteryModeStats, OneTimeAchievement, PVPRun, Paintball, - Parkour, PartyGames, PartyPooper, - Pet, - PetConsumables, - Pets, Pit, PitInventoryItem, PixelParty, @@ -408,10 +406,33 @@ export default { Player, PlayerAchievements, PlayerAchievementsRewards, + PlayerAchivementsTotem, + PlayerAdventRewards, + PlayerAdventRewardsDay, + PlayerCosmetics, + PlayerCosmeticsPet, + PlayerCosmeticsPets, + PlayerCosmeticsPetsConsumables, + PlayerGifting, + PlayerHousing, + PlayerHousingGivenCookies, + PlayerHousingPlayerSettings, + PlayerParkour, PlayerQuest, PlayerQuestCompletion, PlayerQuestCompletions, PlayerQuests, + PlayerRankPurchase, + PlayerRewards, + PlayerRewardsMonthlyCrate, + PlayerScorpiusBribe, + PlayerSeasonalChristmasYear, + PlayerSeasonalChristmasYearAdventRewards, + PlayerSeasonalChristmasYearLeveling, + PlayerSocialMedia, + PlayerStats, + PlayerTourney, + PlayerTourneyData, PropHunt, Quakecraft, QuakecraftMode, @@ -419,12 +440,6 @@ export default { QuestObjective, Quests, RecentGame, - Rewards, - Season, - SeasonBingo, - SeasonBingoTier, - SeasonYear, - Seasonal, SheepWars, SkyBlockAuction, SkyBlockAuctionBid, @@ -592,7 +607,6 @@ export default { SmashHeoresHero, SmashHeroes, SmashHeroesMode, - SocialMedia, SpeedUHC, SpeedUHCMode, Status, @@ -602,8 +616,6 @@ export default { TNTWizards, ThrowOut, TieredAchievement, - Tourney, - TourneyData, TurboKartRacers, TurboKartRacersMap, UHC, From 80141f6c3594c3b6e29f0de34ddae4f3db5d0a49 Mon Sep 17 00:00:00 2001 From: Jacob Date: Sat, 13 Sep 2025 20:34:01 +0800 Subject: [PATCH 022/124] fix(request handler): base url --- src/Private/RequestHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Private/RequestHandler.ts b/src/Private/RequestHandler.ts index 9f14e2279..320704e53 100644 --- a/src/Private/RequestHandler.ts +++ b/src/Private/RequestHandler.ts @@ -1,4 +1,4 @@ -const BASE_URL = 'http://localhost:3000/hypixel'; +const BASE_URL = 'https://api.hypixel.net/v2'; import Client from '../Client.js'; import RequestData from './RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; From 2e2dcb6bbc74905249e2ace8df7e2b0226aedb41 Mon Sep 17 00:00:00 2001 From: Jacob Date: Sun, 14 Sep 2025 09:24:23 +0800 Subject: [PATCH 023/124] change tsconfig --- .npmignore | 1 + tsconfig.json | 11 +++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.npmignore b/.npmignore index 1c334e7b0..0f7e40163 100644 --- a/.npmignore +++ b/.npmignore @@ -6,3 +6,4 @@ documentation/ .vscode/ .gitignore .env +src diff --git a/tsconfig.json b/tsconfig.json index 4d8e1ecab..5836dc33e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,15 +15,18 @@ "module": "NodeNext", "moduleResolution": "NodeNext", - "outDir": "dist", + "outDir": "./dist", "rootDir": "src", "sourceMap": true, "declaration": true, + "declarationMap": true, "forceConsistentCasingInFileNames": true, "noUnusedLocals": true, - "noFallthroughCasesInSwitch": true + "noFallthroughCasesInSwitch": true, + "allowArbitraryExtensions": false, + "rewriteRelativeImportExtensions": true }, - "include": ["src/**/*"], - "exclude": ["node_modules/", "src/**/*.test.ts"] + "include": ["./src"], + "exclude": ["**/*/*.test.*"] } From 06214c207c7f485c73c68cb83332ee5ac1e106ed Mon Sep 17 00:00:00 2001 From: Jacob Date: Sun, 14 Sep 2025 09:26:39 +0800 Subject: [PATCH 024/124] Release 12.0.0-7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 97d96bceb..2f77100c9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hypixel-api-reborn", - "version": "12.0.0-6", + "version": "12.0.0-7", "description": "Feature-rich Hypixel API wrapper for Node.js", "main": "dist/index.js", "types": "dist/index.d.ts", From abe6d560ea85861e9d9865b38f35d4616cc19cfc Mon Sep 17 00:00:00 2001 From: Jacob Date: Sun, 14 Sep 2025 12:04:05 +0800 Subject: [PATCH 025/124] fix(skyblockUtils) --- src/Utils/SkyBlockUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Utils/SkyBlockUtils.ts b/src/Utils/SkyBlockUtils.ts index 2d4f74241..b68c02855 100644 --- a/src/Utils/SkyBlockUtils.ts +++ b/src/Utils/SkyBlockUtils.ts @@ -193,7 +193,7 @@ export function getLevelByXp(xp: number, extra: Extra = { type: 'default' }): Sk const xpForNext = ( level < maxLevel - ? Math.ceil(xpTable[level + 1] ?? 0 ?? Object.values(xpTable).at(-1)) + ? Math.ceil(xpTable[level + 1] ?? Object.values(xpTable).at(-1) ?? 0) : isInfiniteLevelAble ? Object.values(xpTable).at(-1) : Infinity From a1327478c1808220ce145628045aa79e37a2164b Mon Sep 17 00:00:00 2001 From: Jacob Date: Sun, 14 Sep 2025 13:14:10 +0800 Subject: [PATCH 026/124] refactor(gen-index-script) --- .github/scripts/generateIndexFile.ts | 26 +- package.json | 2 +- .../PlayerAchievements/PlayerAchievements.ts | 2 +- ...ntsTotem.ts => PlayerAchievementsTotem.ts} | 2 +- src/index.ts | 316 +++++++++++++++++- 5 files changed, 332 insertions(+), 16 deletions(-) rename src/Structures/Player/PlayerAchievements/{PlayerAchivementsTotem.ts => PlayerAchievementsTotem.ts} (94%) diff --git a/.github/scripts/generateIndexFile.ts b/.github/scripts/generateIndexFile.ts index 82f4ae60b..d264d736f 100644 --- a/.github/scripts/generateIndexFile.ts +++ b/.github/scripts/generateIndexFile.ts @@ -1,7 +1,8 @@ /* v8 ignore next 1000 */ +import { format } from 'prettier'; +import { readFileSync, writeFileSync } from 'fs'; import { readdir } from 'fs/promises'; -import { writeFileSync } from 'fs'; async function scanDirectory(directoryPath: string, goDeep: boolean = true): Promise { const filePaths: string[] = []; @@ -22,6 +23,8 @@ async function scanDirectory(directoryPath: string, goDeep: boolean = true): Pro return filePaths; } +const prettierConfig = JSON.parse(readFileSync('.prettierrc').toString('utf-8')); + async function generateBaseIndex() { const lines: string[] = [ '/* v8 ignore next 1000 */', @@ -29,12 +32,9 @@ async function generateBaseIndex() { '', '', "import Client from './Client.js';", - "import Errors from './Errors.js';", - '' + "import Errors from './Errors.js';" ]; - const importNames: string[] = []; - const typesPaths = await scanDirectory('./src/Types/'); typesPaths.forEach((path) => { const fixedPath = path.replaceAll('.ts', '.js'); @@ -45,6 +45,7 @@ async function generateBaseIndex() { const structuresPaths = await scanDirectory('./src/Structures/'); const fixedStructuresPaths: string[] = []; + const importNames: string[] = []; structuresPaths.forEach((path) => { const importName = path.split('.ts')[0].split('/')[path.split('.ts')[0].split('/').length - 1]; @@ -56,16 +57,22 @@ async function generateBaseIndex() { fixedStructuresPaths.sort().forEach((path) => lines.push(path)); lines.push(''); - lines.push('export default {'); + lines.push('export {'); lines.push('Client,'); lines.push('Errors,'); + importNames.sort().forEach((importName) => lines.push(`${importName},`)); + lines.push('};'); + lines.push(''); + lines.push('export default {'); + lines.push('Client,'); + lines.push('Errors,'); importNames.sort().forEach((importName) => lines.push(`${importName},`)); lines.push('};'); - lines.push(''); - writeFileSync('./src/index.ts', lines.join('\n')); + const formatted = await format(lines.join('\n'), { ...prettierConfig, filepath: './src/index.ts' }); + writeFileSync('./src/index.ts', formatted); } async function generateAPIIndex() { @@ -91,7 +98,8 @@ async function generateAPIIndex() { lines.push('};'); lines.push(''); - writeFileSync('./src/API/index.ts', lines.join('\n')); + const formatted = await format(lines.join('\n'), { ...prettierConfig, filepath: './src/API/index.ts' }); + writeFileSync('./src/API/index.ts', formatted); } generateBaseIndex(); diff --git a/package.json b/package.json index 2f77100c9..66e4df3ab 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "rss-parser": "^3.13.0" }, "license": "MIT", - "readme": "https://github.com/Hypixel-API-Reborn/hypixel-api-reborn?tab=readme-ov-file#hypixel-api--reborn", + "readme": "https://github.com/Hypixel-API-Reborn/hypixel-api-reborn?tab=readme-ov-file#hypixel-api-reborn", "repository": { "url": "git+https://github.com/Hypixel-API-Reborn/hypixel-api-reborn.git" }, diff --git a/src/Structures/Player/PlayerAchievements/PlayerAchievements.ts b/src/Structures/Player/PlayerAchievements/PlayerAchievements.ts index abcd322e4..19acef290 100644 --- a/src/Structures/Player/PlayerAchievements/PlayerAchievements.ts +++ b/src/Structures/Player/PlayerAchievements/PlayerAchievements.ts @@ -1,5 +1,5 @@ import PlayerAchievementsRewards from './PlayerAchievementsRewards.js'; -import PlayerAchievementsTotem from './PlayerAchivementsTotem.js'; +import PlayerAchievementsTotem from './PlayerAchievementsTotem.js'; import type { PlayerAchievementsOneTimeSort } from '../../../Types/Player.js'; class PlayerAchievements { diff --git a/src/Structures/Player/PlayerAchievements/PlayerAchivementsTotem.ts b/src/Structures/Player/PlayerAchievements/PlayerAchievementsTotem.ts similarity index 94% rename from src/Structures/Player/PlayerAchievements/PlayerAchivementsTotem.ts rename to src/Structures/Player/PlayerAchievements/PlayerAchievementsTotem.ts index 6315ab90e..9b1ee9186 100644 --- a/src/Structures/Player/PlayerAchievements/PlayerAchivementsTotem.ts +++ b/src/Structures/Player/PlayerAchievements/PlayerAchievementsTotem.ts @@ -1,4 +1,4 @@ -import type { PlayerAchievementsTotemColors, PlayerAchievementsTotemParts } from '../../../Types/Player.js'; +import type { PlayerAchievementsTotemColors, PlayerAchievementsTotemParts } from '../../../Types/Player.ts'; class PlayerAchievementsTotem { canCustomize: boolean; diff --git a/src/index.ts b/src/index.ts index 10352a2c3..a695385df 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,7 +3,6 @@ import Client from './Client.js'; import Errors from './Errors.js'; - export * from './Types/API.js'; export * from './Types/Booster.js'; export * from './Types/Client.js'; @@ -96,7 +95,7 @@ import PixelPartyGameMode from './Structures/MiniGames/Arcade/PixelPartyGameMode import Player from './Structures/Player/Player.js'; import PlayerAchievements from './Structures/Player/PlayerAchievements/PlayerAchievements.js'; import PlayerAchievementsRewards from './Structures/Player/PlayerAchievements/PlayerAchievementsRewards.js'; -import PlayerAchivementsTotem from './Structures/Player/PlayerAchievements/PlayerAchivementsTotem.js'; +import PlayerAchievementsTotem from './Structures/Player/PlayerAchievements/PlayerAchievementsTotem.js'; import PlayerAdventRewards from './Structures/Player/PlayerAdventRewards/PlayerAdventRewards.js'; import PlayerAdventRewardsDay from './Structures/Player/PlayerAdventRewards/PlayerAdventRewardsDay.js'; import PlayerCosmetics from './Structures/Player/PlayerCosmetics/PlayerCosmetics.js'; @@ -322,10 +321,319 @@ import WoolWarsClass from './Structures/MiniGames/WoolGames/WoolWarsClass.js'; import Zombies from './Structures/MiniGames/Arcade/Zombies.js'; import ZombiesStats from './Structures/MiniGames/Arcade/ZombiesStats.js'; -export default { +export { Client, Errors, + Achievements, + Arcade, + ArenaBrawl, + ArenaBrawlMode, + BaseAchievement, + BedWars, + BedWarsBeds, + BedWarsCollectedItems, + BedWarsDreamMode, + BedWarsDreamStats, + BedWarsMode, + BedWarsPracticeBase, + BedWarsPracticeBaseBlocksPlaced, + BedWarsPracticeBridging, + BedWarsPracticeBridgingRecords, + BedWarsPracticeModeAttempts, + BedWarsPracticeRecord, + BedWarsPracticeRecordElevation, + BedWarsPracticeStats, + BlitzSurvivalGames, + BlitzSurvivalGamesKit, + BlockingDead, + Booster, + BountyHunters, + BowSpleef, + BuildBattle, + CaptureTheWool, + Challenge, + Challenges, + Color, + CopsAndCrims, + CopsAndCrimsGamemode, + CopsAndCrimsGun, + DragonWars, + Dropper, + DropperMap, + Duels, + DuelsBridge, + DuelsGamemode, + DuelsMegaWalls, + DuelsOP, + DuelsSkyWars, + DuelsUHC, + EnderSpleef, + FarmHunt, + Football, + GalaxyWars, + Game, + GameAchievements, + GameChallenges, + GameCounts, + GameQuests, + Guild, + GuildAchievements, + GuildMember, + GuildRank, + HideAndSeek, + HoleInTheWall, + House, + HypixelSays, + ItemBytes, + Leaderboard, + MegaWalls, + MegaWallsKitStats, + MegaWallsModeStats, + MiniWalls, + MurderMystery, + MurderMysteryModeStats, + OneTimeAchievement, + PVPRun, + Paintball, + PartyGames, + PartyPooper, + Pit, + PitInventoryItem, + PixelParty, + PixelPartyGameMode, + Player, + PlayerAchievements, + PlayerAchievementsRewards, + PlayerAchievementsTotem, + PlayerAdventRewards, + PlayerAdventRewardsDay, + PlayerCosmetics, + PlayerCosmeticsPet, + PlayerCosmeticsPets, + PlayerCosmeticsPetsConsumables, + PlayerGifting, + PlayerHousing, + PlayerHousingGivenCookies, + PlayerHousingPlayerSettings, + PlayerParkour, + PlayerQuest, + PlayerQuestCompletion, + PlayerQuestCompletions, + PlayerQuests, + PlayerRankPurchase, + PlayerRewards, + PlayerRewardsMonthlyCrate, + PlayerScorpiusBribe, + PlayerSeasonalChristmasYear, + PlayerSeasonalChristmasYearAdventRewards, + PlayerSeasonalChristmasYearLeveling, + PlayerSocialMedia, + PlayerStats, + PlayerTourney, + PlayerTourneyData, + PropHunt, + Quakecraft, + QuakecraftMode, + Quest, + QuestObjective, + Quests, + RecentGame, + SheepWars, + SkyBlockAuction, + SkyBlockAuctionBid, + SkyBlockAuctionInfo, + SkyBlockBaseAuction, + SkyBlockBaseAuctionInfo, + SkyBlockBazaar, + SkyBlockBazaarProduct, + SkyBlockBazaarProductOrder, + SkyBlockBazaarQuickStatus, + SkyBlockBingo, + SkyBlockBingoGoal, + SkyBlockCollection, + SkyBlockCollectionTier, + SkyBlockCollections, + SkyBlockElection, + SkyBlockElectionCandidate, + SkyBlockElectionCandidatePerk, + SkyBlockElectionData, + SkyBlockFireSale, + SkyBlockGarden, + SkyBlockGardenActiveVisitor, + SkyBlockGardenActiveVisitorRequirement, + SkyBlockGardenComposter, + SkyBlockGardenComposterUpgrades, + SkyBlockGardenCropMilestones, + SkyBlockGardenCropsUpgrades, + SkyBlockGardenVisitors, + SkyBlockInventoryItem, + SkyBlockInventoryItemAttribute, + SkyBlockInventoryItemEnchantment, + SkyBlockInventoryItemRune, + SkyBlockItem, + SkyBlockMember, + SkyBlockMemberAccessoryBag, + SkyBlockMemberAccessoryBagTuning, + SkyBlockMemberAccessoryBagTuningSlot, + SkyBlockMemberBestiary, + SkyBlockMemberChocolateFactory, + SkyBlockMemberChocolateFactoryEggs, + SkyBlockMemberChocolateFactoryEmployees, + SkyBlockMemberChocolateFactoryHitmen, + SkyBlockMemberChocolateFactoryTimeTower, + SkyBlockMemberChocolateFactoryUpgrades, + SkyBlockMemberCrimsonIsle, + SkyBlockMemberCrimsonIsleAbiphone, + SkyBlockMemberCrimsonIsleDojo, + SkyBlockMemberCrimsonIsleDojoMinigame, + SkyBlockMemberCrimsonIsleKuudra, + SkyBlockMemberCrimsonIsleKuudraPartyFinder, + SkyBlockMemberCrimsonIsleMatriarch, + SkyBlockMemberCrimsonIsleTrophyFish, + SkyBlockMemberCrimsonIsleTrophyFishFish, + SkyBlockMemberCurrencies, + SkyBlockMemberDungeons, + SkyBlockMemberDungeonsClasses, + SkyBlockMemberDungeonsFloor, + SkyBlockMemberDungeonsFloorRun, + SkyBlockMemberDungeonsMode, + SkyBlockMemberDungeonsTreasureRun, + SkyBlockMemberDungeonsTreasuresChest, + SkyBlockMemberFairySouls, + SkyBlockMemberInventories, + SkyBlockMemberInventoriesArmor, + SkyBlockMemberInventoriesArmorDecoded, + SkyBlockMemberInventoriesBackpack, + SkyBlockMemberInventoriesBackpackDecoded, + SkyBlockMemberInventoriesBackpacks, + SkyBlockMemberInventoriesBags, + SkyBlockMemberInventoriesBagsTalisman, + SkyBlockMemberInventoriesBagsTalismanDecoded, + SkyBlockMemberInventoriesBaseInventory, + SkyBlockMemberInventoriesEquipment, + SkyBlockMemberInventoriesEquipmentDecoded, + SkyBlockMemberInventoriesInventory, + SkyBlockMemberInventoriesInventoryDecoded, + SkyBlockMemberJacobContest, + SkyBlockMemberJacobContests, + SkyBlockMemberJacobContestsMedals, + SkyBlockMemberJacobContestsPerks, + SkyBlockMemberJacobContestsUniqueBrackets, + SkyBlockMemberLeveling, + SkyBlockMemberMining, + SkyBlockMemberMiningCrystal, + SkyBlockMemberMiningHotm, + SkyBlockMemberMiningHotmForge, + SkyBlockMemberMiningHotmForgeItem, + SkyBlockMemberMiningPowder, + SkyBlockMemberMiningPowders, + SkyBlockMemberObjectives, + SkyBlockMemberPet, + SkyBlockMemberPets, + SkyBlockMemberPetsAutoPetRule, + SkyBlockMemberPetsAutoPets, + SkyBlockMemberPetsCare, + SkyBlockMemberPlayerData, + SkyBlockMemberPlayerDataActiveEffect, + SkyBlockMemberPlayerDataMinion, + SkyBlockMemberPlayerDataMinions, + SkyBlockMemberPlayerDataSkills, + SkyBlockMemberPlayerStats, + SkyBlockMemberPlayerStatsAuctions, + SkyBlockMemberPlayerStatsAuctionsStats, + SkyBlockMemberPlayerStatsCandy, + SkyBlockMemberPlayerStatsEndIsland, + SkyBlockMemberPlayerStatsEndIslandDragonFight, + SkyBlockMemberPlayerStatsEndIslandDragonFightDragon, + SkyBlockMemberPlayerStatsFishing, + SkyBlockMemberPlayerStatsGifts, + SkyBlockMemberPlayerStatsMythos, + SkyBlockMemberPlayerStatsSpookyFestival, + SkyBlockMemberPlayerStatsWinter, + SkyBlockMemberProfile, + SkyBlockMemberQuests, + SkyBlockMemberQuestsHarp, + SkyBlockMemberQuestsHarpSong, + SkyBlockMemberQuestsTrapper, + SkyBlockMemberRift, + SkyBlockMemberRiftAccess, + SkyBlockMemberRiftBlackLagoon, + SkyBlockMemberRiftCastle, + SkyBlockMemberRiftDeadCats, + SkyBlockMemberRiftDreamFarm, + SkyBlockMemberRiftEnigma, + SkyBlockMemberRiftGallery, + SkyBlockMemberRiftGallerySecuredTrophy, + SkyBlockMemberRiftInventory, + SkyBlockMemberRiftVillagePlaza, + SkyBlockMemberRiftVillagePlazaBarry, + SkyBlockMemberRiftVillagePlazaCowboy, + SkyBlockMemberRiftVillagePlazaMurder, + SkyBlockMemberRiftWestVillage, + SkyBlockMemberRiftWestVillageCrazyKloon, + SkyBlockMemberRiftWestVillageGlyphs, + SkyBlockMemberRiftWestVillageKatHouse, + SkyBlockMemberRiftWestVillageMirrorverse, + SkyBlockMemberRiftWitherCage, + SkyBlockMemberRiftWizardTower, + SkyBlockMemberRiftWyldWoods, + SkyBlockMemberSlayer, + SkyBlockMemberSlayerClaimedLevels, + SkyBlockMemberSlayers, + SkyBlockMemberSlayersQuest, + SkyBlockMuseum, + SkyBlockMuseumItem, + SkyBlockMuseumMember, + SkyBlockNews, + SkyBlockPotionEffect, + SkyBlockProfile, + SkyBlockProfileBanking, + SkyBlockProfileCommunityUpgrades, + SkyBlockProfileCommunityUpgradesUpgrade, + SkyBlockProfileCommunityUpgradesUpgraded, + SkyBlockProfileCommunityUpgradesUpgrading, + SkyBlockProfilesBankingTransaction, + SkyBlockSkill, + SkyBlockSkillLevel, + SkyBlockSkills, + SkyWars, + SkyWarsKit, + SkyWarsKits, + SkyWarsMode, + SkyWarsModeStats, + SkyWarsPackages, + SmashHeoresHero, + SmashHeroes, + SmashHeroesMode, + SpeedUHC, + SpeedUHCMode, + Status, + TNTGames, + TNTRun, + TNTTag, + TNTWizards, + ThrowOut, + TieredAchievement, + TurboKartRacers, + TurboKartRacersMap, + UHC, + UHCGamemode, + VampireZ, + VampireZRole, + Walls, + Warlords, + WarlordsClass, + WatchdogStats, + WoolGames, + WoolWars, + WoolWarsClass, + Zombies, + ZombiesStats +}; +export default { + Client, + Errors, Achievements, Arcade, ArenaBrawl, @@ -406,7 +714,7 @@ export default { Player, PlayerAchievements, PlayerAchievementsRewards, - PlayerAchivementsTotem, + PlayerAchievementsTotem, PlayerAdventRewards, PlayerAdventRewardsDay, PlayerCosmetics, From c09fc45909d05591bb1027988e7758a57edfe626 Mon Sep 17 00:00:00 2001 From: Jacob Date: Sun, 14 Sep 2025 13:17:46 +0800 Subject: [PATCH 027/124] Release 12.0.0-8 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 66e4df3ab..aaa2c1715 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hypixel-api-reborn", - "version": "12.0.0-7", + "version": "12.0.0-8", "description": "Feature-rich Hypixel API wrapper for Node.js", "main": "dist/index.js", "types": "dist/index.d.ts", From 1d7cffa1a65587a4152cae5f45eccaa01f7aaccd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 14:19:50 +0800 Subject: [PATCH 028/124] chore(deps): Update all non-major dependencies (#668) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 28 +- pnpm-lock.yaml | 768 +++++++++++++++++++++++++++++-------------------- 2 files changed, 468 insertions(+), 328 deletions(-) diff --git a/package.json b/package.json index aaa2c1715..d9065bec4 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "packageManager": "pnpm@9.7.1", "author": "Kathund", "dependencies": { - "minecraft-data": "^3.85.0", + "minecraft-data": "^3.98.0", "node-cache": "^5.1.2", "prismarine-nbt": "^2.7.0", "rss-parser": "^3.13.0" @@ -50,24 +50,24 @@ "publisher": "Kathund", "devDependencies": { "@8hobbies/typedoc-plugin-404": "^3.2.1", - "@eslint/js": "^9.24.0", + "@eslint/js": "^9.35.0", "@j4cobi/eslint-plugin-sort-imports": "^1.0.2", "@types/eslint": "^9.6.1", - "@types/node": "^22.14.1", + "@types/node": "^22.18.3", "@types/xml2js": "^0.4.14", - "@vitest/coverage-v8": "^3.1.1", - "@vitest/ui": "^3.1.1", - "dotenv": "^16.5.0", - "eslint": "^9.24.0", - "eslint-config-prettier": "^10.1.2", - "globals": "^16.0.0", - "prettier": "^3.5.3", - "typedoc": "^0.27.9", + "@vitest/coverage-v8": "^3.2.4", + "@vitest/ui": "^3.2.4", + "dotenv": "^16.6.1", + "eslint": "^9.35.0", + "eslint-config-prettier": "^10.1.8", + "globals": "^16.4.0", + "prettier": "^3.6.2", + "typedoc": "^0.28.13", "typedoc-material-theme": "^1.4.0", "typedoc-plugin-rename-defaults": "^0.7.3", - "typescript": "^5.8.3", - "typescript-eslint": "^8.29.1", - "vitest": "^3.1.1", + "typescript": "^5.9.2", + "typescript-eslint": "^8.43.0", + "vitest": "^3.2.4", "xml2js": "^0.6.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 77879cd81..31d63db9e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: minecraft-data: - specifier: ^3.85.0 - version: 3.85.0 + specifier: ^3.98.0 + version: 3.98.0 node-cache: specifier: ^5.1.2 version: 5.1.2 @@ -23,61 +23,61 @@ importers: devDependencies: '@8hobbies/typedoc-plugin-404': specifier: ^3.2.1 - version: 3.2.1(typedoc@0.27.9(typescript@5.8.3)) + version: 3.2.1(typedoc@0.28.13(typescript@5.9.2)) '@eslint/js': - specifier: ^9.24.0 - version: 9.24.0 + specifier: ^9.35.0 + version: 9.35.0 '@j4cobi/eslint-plugin-sort-imports': specifier: ^1.0.2 - version: 1.0.2(eslint@9.24.0)(typescript@5.8.3) + version: 1.0.2(eslint@9.35.0)(typescript@5.9.2) '@types/eslint': specifier: ^9.6.1 version: 9.6.1 '@types/node': - specifier: ^22.14.1 - version: 22.14.1 + specifier: ^22.18.3 + version: 22.18.3 '@types/xml2js': specifier: ^0.4.14 version: 0.4.14 '@vitest/coverage-v8': - specifier: ^3.1.1 - version: 3.1.1(vitest@3.1.1(@types/node@22.14.1)(@vitest/ui@3.1.1)) + specifier: ^3.2.4 + version: 3.2.4(vitest@3.2.4(@types/node@22.18.3)(@vitest/ui@3.2.4)) '@vitest/ui': - specifier: ^3.1.1 - version: 3.1.1(vitest@3.1.1) + specifier: ^3.2.4 + version: 3.2.4(vitest@3.2.4) dotenv: - specifier: ^16.5.0 - version: 16.5.0 + specifier: ^16.6.1 + version: 16.6.1 eslint: - specifier: ^9.24.0 - version: 9.24.0 + specifier: ^9.35.0 + version: 9.35.0 eslint-config-prettier: - specifier: ^10.1.2 - version: 10.1.2(eslint@9.24.0) + specifier: ^10.1.8 + version: 10.1.8(eslint@9.35.0) globals: - specifier: ^16.0.0 - version: 16.0.0 + specifier: ^16.4.0 + version: 16.4.0 prettier: - specifier: ^3.5.3 - version: 3.5.3 + specifier: ^3.6.2 + version: 3.6.2 typedoc: - specifier: ^0.27.9 - version: 0.27.9(typescript@5.8.3) + specifier: ^0.28.13 + version: 0.28.13(typescript@5.9.2) typedoc-material-theme: specifier: ^1.4.0 - version: 1.4.0(typedoc@0.27.9(typescript@5.8.3)) + version: 1.4.0(typedoc@0.28.13(typescript@5.9.2)) typedoc-plugin-rename-defaults: specifier: ^0.7.3 - version: 0.7.3(typedoc@0.27.9(typescript@5.8.3)) + version: 0.7.3(typedoc@0.28.13(typescript@5.9.2)) typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.2 + version: 5.9.2 typescript-eslint: - specifier: ^8.29.1 - version: 8.29.1(eslint@9.24.0)(typescript@5.8.3) + specifier: ^8.43.0 + version: 8.43.0(eslint@9.35.0)(typescript@5.9.2) vitest: - specifier: ^3.1.1 - version: 3.1.1(@types/node@22.14.1)(@vitest/ui@3.1.1) + specifier: ^3.2.4 + version: 3.2.4(@types/node@22.18.3)(@vitest/ui@3.2.4) xml2js: specifier: ^0.6.2 version: 0.6.2 @@ -259,40 +259,46 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/regexpp@4.12.1': resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.20.0': - resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} + '@eslint/config-array@0.21.0': + resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.2.0': - resolution: {integrity: sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==} + '@eslint/config-helpers@0.3.1': + resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.12.0': - resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} + '@eslint/core@0.15.2': + resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.24.0': - resolution: {integrity: sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==} + '@eslint/js@9.35.0': + resolution: {integrity: sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.7': - resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} + '@eslint/plugin-kit@0.3.5': + resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@gerrit0/mini-shiki@1.27.2': - resolution: {integrity: sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==} + '@gerrit0/mini-shiki@3.12.2': + resolution: {integrity: sha512-HKZPmO8OSSAAo20H2B3xgJdxZaLTwtlMwxg0967scnrDlPwe6j5+ULGHyIqwgTbFCn9yv/ff8CmfWZLE9YKBzA==} '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} @@ -343,6 +349,9 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@material/material-color-utilities@0.3.0': resolution: {integrity: sha512-ztmtTd6xwnuh2/xu+Vb01btgV8SQWYCaK56CkRK8gEkWe5TuDyBcYJ0wgkMRn+2VcE9KUmhvkz+N9GHrqw/C0g==} @@ -465,15 +474,27 @@ packages: cpu: [x64] os: [win32] - '@shikijs/engine-oniguruma@1.29.2': - resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} + '@shikijs/engine-oniguruma@3.12.2': + resolution: {integrity: sha512-hozwnFHsLvujK4/CPVHNo3Bcg2EsnG8krI/ZQ2FlBlCRpPZW4XAEQmEwqegJsypsTAN9ehu2tEYe30lYKSZW/w==} + + '@shikijs/langs@3.12.2': + resolution: {integrity: sha512-bVx5PfuZHDSHoBal+KzJZGheFuyH4qwwcwG/n+MsWno5cTlKmaNtTsGzJpHYQ8YPbB5BdEdKU1rga5/6JGY8ww==} - '@shikijs/types@1.29.2': - resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} + '@shikijs/themes@3.12.2': + resolution: {integrity: sha512-fTR3QAgnwYpfGczpIbzPjlRnxyONJOerguQv1iwpyQZ9QXX4qy/XFQqXlf17XTsorxnHoJGbH/LXBvwtqDsF5A==} + + '@shikijs/types@3.12.2': + resolution: {integrity: sha512-K5UIBzxCyv0YoxN3LMrKB9zuhp1bV+LgewxuVwHdl4Gz5oePoUFrr9EfgJlGlDeXCU1b/yhdnXeuRvAnz8HN8Q==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} @@ -489,8 +510,8 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@22.14.1': - resolution: {integrity: sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==} + '@types/node@22.18.3': + resolution: {integrity: sha512-gTVM8js2twdtqM+AE2PdGEe9zGQY4UvmFjan9rZcVb6FGdStfjWoWejdmy4CfWVO9rh5MiYQGZloKAGkJt8lMw==} '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -498,42 +519,54 @@ packages: '@types/xml2js@0.4.14': resolution: {integrity: sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==} - '@typescript-eslint/eslint-plugin@8.29.1': - resolution: {integrity: sha512-ba0rr4Wfvg23vERs3eB+P3lfj2E+2g3lhWcCVukUuhtcdUx5lSIFZlGFEBHKr+3zizDa/TvZTptdNHVZWAkSBg==} + '@typescript-eslint/eslint-plugin@8.43.0': + resolution: {integrity: sha512-8tg+gt7ENL7KewsKMKDHXR1vm8tt9eMxjJBYINf6swonlWgkYn5NwyIgXpbbDxTNU5DgpDFfj95prcTq2clIQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + '@typescript-eslint/parser': ^8.43.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.29.1': - resolution: {integrity: sha512-zczrHVEqEaTwh12gWBIJWj8nx+ayDcCJs06yoNMY0kwjMWDM6+kppljY+BxWI06d2Ja+h4+WdufDcwMnnMEWmg==} + '@typescript-eslint/parser@8.43.0': + resolution: {integrity: sha512-B7RIQiTsCBBmY+yW4+ILd6mF5h1FUwJsVvpqkrgpszYifetQ2Ke+Z4u6aZh0CblkUGIdR59iYVyXqqZGkZ3aBw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.43.0': + resolution: {integrity: sha512-htB/+D/BIGoNTQYffZw4uM4NzzuolCoaA/BusuSIcC8YjmBYQioew5VUZAYdAETPjeed0hqCaW7EHg+Robq8uw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/scope-manager@8.28.0': resolution: {integrity: sha512-u2oITX3BJwzWCapoZ/pXw6BCOl8rJP4Ij/3wPoGvY8XwvXflOzd1kLrDUUUAIEdJSFh+ASwdTHqtan9xSg8buw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.29.1': - resolution: {integrity: sha512-2nggXGX5F3YrsGN08pw4XpMLO1Rgtnn4AzTegC2MDesv6q3QaTU5yU7IbS1tf1IwCR0Hv/1EFygLn9ms6LIpDA==} + '@typescript-eslint/scope-manager@8.43.0': + resolution: {integrity: sha512-daSWlQ87ZhsjrbMLvpuuMAt3y4ba57AuvadcR7f3nl8eS3BjRc8L9VLxFLk92RL5xdXOg6IQ+qKjjqNEimGuAg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.29.1': - resolution: {integrity: sha512-DkDUSDwZVCYN71xA4wzySqqcZsHKic53A4BLqmrWFFpOpNSoxX233lwGu/2135ymTCR04PoKiEEEvN1gFYg4Tw==} + '@typescript-eslint/tsconfig-utils@8.43.0': + resolution: {integrity: sha512-ALC2prjZcj2YqqL5X/bwWQmHA2em6/94GcbB/KKu5SX3EBDOsqztmmX1kMkvAJHzxk7TazKzJfFiEIagNV3qEA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.43.0': + resolution: {integrity: sha512-qaH1uLBpBuBBuRf8c1mLJ6swOfzCXryhKND04Igr4pckzSEW9JX5Aw9AgW00kwfjWJF0kk0ps9ExKTfvXfw4Qg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/types@8.28.0': resolution: {integrity: sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.29.1': - resolution: {integrity: sha512-VT7T1PuJF1hpYC3AGm2rCgJBjHL3nc+A/bhOp9sGMKfi5v0WufsX/sHCFBfNTx2F+zA6qBc/PD0/kLRLjdt8mQ==} + '@typescript-eslint/types@8.43.0': + resolution: {integrity: sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@8.28.0': @@ -542,11 +575,11 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/typescript-estree@8.29.1': - resolution: {integrity: sha512-l1enRoSaUkQxOQnbi0KPUtqeZkSiFlqrx9/3ns2rEDhGKfTa+88RmXqedC1zmVTOWrLc2e6DEJrTA51C9iLH5g==} + '@typescript-eslint/typescript-estree@8.43.0': + resolution: {integrity: sha512-7Vv6zlAhPb+cvEpP06WXXy/ZByph9iL6BQRBDj4kmBsW98AqEeQHlj/13X+sZOrKSo9/rNKH4Ul4f6EICREFdw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/utils@8.28.0': resolution: {integrity: sha512-OELa9hbTYciYITqgurT1u/SzpQVtDLmQMFzy/N8pQE+tefOyCWT79jHsav294aTqV1q1u+VzqDGbuujvRYaeSQ==} @@ -555,63 +588,63 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.29.1': - resolution: {integrity: sha512-QAkFEbytSaB8wnmB+DflhUPz6CLbFWE2SnSCrRMEa+KnXIzDYbpsn++1HGvnfAsUY44doDXmvRkO5shlM/3UfA==} + '@typescript-eslint/utils@8.43.0': + resolution: {integrity: sha512-S1/tEmkUeeswxd0GGcnwuVQPFWo8NzZTOMxCvw8BX7OMxnNae+i8Tm7REQen/SwUIPoPqfKn7EaZ+YLpiB3k9g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/visitor-keys@8.28.0': resolution: {integrity: sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.29.1': - resolution: {integrity: sha512-RGLh5CRaUEf02viP5c1Vh1cMGffQscyHe7HPAzGpfmfflFg1wUz2rYxd+OZqwpeypYvZ8UxSxuIpF++fmOzEcg==} + '@typescript-eslint/visitor-keys@8.43.0': + resolution: {integrity: sha512-T+S1KqRD4sg/bHfLwrpF/K3gQLBM1n7Rp7OjjikjTEssI2YJzQpi5WXoynOaQ93ERIuq3O8RBTOUYDKszUCEHw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitest/coverage-v8@3.1.1': - resolution: {integrity: sha512-MgV6D2dhpD6Hp/uroUoAIvFqA8AuvXEFBC2eepG3WFc1pxTfdk1LEqqkWoWhjz+rytoqrnUUCdf6Lzco3iHkLQ==} + '@vitest/coverage-v8@3.2.4': + resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==} peerDependencies: - '@vitest/browser': 3.1.1 - vitest: 3.1.1 + '@vitest/browser': 3.2.4 + vitest: 3.2.4 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@3.1.1': - resolution: {integrity: sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA==} + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} - '@vitest/mocker@3.1.1': - resolution: {integrity: sha512-bmpJJm7Y7i9BBELlLuuM1J1Q6EQ6K5Ye4wcyOpOMXMcePYKSIYlpcrCm4l/O6ja4VJA5G2aMJiuZkZdnxlC3SA==} + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@3.1.1': - resolution: {integrity: sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==} + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@vitest/runner@3.1.1': - resolution: {integrity: sha512-X/d46qzJuEDO8ueyjtKfxffiXraPRfmYasoC4i5+mlLEJ10UvPb0XH5M9C3gWuxd7BAQhpK42cJgJtq53YnWVA==} + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} - '@vitest/snapshot@3.1.1': - resolution: {integrity: sha512-bByMwaVWe/+1WDf9exFxWWgAixelSdiwo2p33tpqIlM14vW7PRV5ppayVXtfycqze4Qhtwag5sVhX400MLBOOw==} + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} - '@vitest/spy@3.1.1': - resolution: {integrity: sha512-+EmrUOOXbKzLkTDwlsc/xrwOlPDXyVk3Z6P6K4oiCndxz7YLpp/0R0UsWVOKT0IXWjjBJuSMk6D27qipaupcvQ==} + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} - '@vitest/ui@3.1.1': - resolution: {integrity: sha512-2HpiRIYg3dlvAJBV9RtsVswFgUSJK4Sv7QhpxoP0eBGkYwzGIKP34PjaV00AULQi9Ovl6LGyZfsetxDWY5BQdQ==} + '@vitest/ui@3.2.4': + resolution: {integrity: sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA==} peerDependencies: - vitest: 3.1.1 + vitest: 3.2.4 - '@vitest/utils@3.1.1': - resolution: {integrity: sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==} + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} @@ -622,8 +655,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true @@ -653,6 +686,9 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + ast-v8-to-istanbul@0.3.5: + resolution: {integrity: sha512-9SdXjNheSiE8bALAQCQQuT6fgQaoxJh7IRYrRGZ8/9nv8WhJeC1aXAwN8TbaOssGOukUvyvnkgD9+Yuykvl1aA==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -723,6 +759,15 @@ packages: supports-color: optional: true + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -730,8 +775,8 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dotenv@16.5.0: - resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} eastasianwidth@0.2.0: @@ -750,8 +795,8 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - es-module-lexer@1.6.0: - resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} @@ -762,14 +807,14 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-prettier@10.1.2: - resolution: {integrity: sha512-Epgp/EofAUeEpIdZkW60MHKvPyru1ruQJxPL+WIycnaPApuseK0Zpkrh/FwL9oIpQvIhJwV7ptOy0DWUjTlCiA==} + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} hasBin: true peerDependencies: eslint: '>=7.0.0' - eslint-scope@8.3.0: - resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: @@ -780,8 +825,12 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.24.0: - resolution: {integrity: sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.35.0: + resolution: {integrity: sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -790,8 +839,8 @@ packages: jiti: optional: true - espree@10.3.0: - resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esquery@1.6.0: @@ -821,8 +870,8 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - expect-type@1.2.0: - resolution: {integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==} + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} engines: {node: '>=12.0.0'} fast-deep-equal@3.1.3: @@ -841,8 +890,9 @@ packages: fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - fdir@6.4.3: - resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -896,8 +946,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@16.0.0: - resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==} + globals@16.4.0: + resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} engines: {node: '>=18'} graphemer@1.4.0: @@ -917,6 +967,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -963,6 +1017,9 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -1003,6 +1060,9 @@ packages: loupe@3.1.3: resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -1034,8 +1094,8 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - minecraft-data@3.85.0: - resolution: {integrity: sha512-7RhCjMuvO6ZwhTB7eNymCj4TAZY1Xqkg4XYv6ieLeWjmW1Lc1PGCG6BhR4/xN3zYRVqMNKiBOtAQoGqkVTKECg==} + minecraft-data@3.98.0: + resolution: {integrity: sha512-JAPqJ/TZoxMUlAPPdWUh1v5wdqvYGFSZ4rW9bUtmaKBkGpomDSjw4V02ocBqbxKJvcTtmc5nM/LfN9/0DDqHrQ==} minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1116,6 +1176,10 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + postcss@8.5.3: resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} @@ -1124,8 +1188,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.5.3: - resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} engines: {node: '>=14'} hasBin: true @@ -1215,8 +1279,8 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@3.8.1: - resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==} + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -1241,6 +1305,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -1255,20 +1322,20 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.12: - resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - tinypool@1.0.2: - resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} tinyrainbow@2.0.0: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} - tinyspy@3.0.2: - resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + tinyspy@4.0.3: + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} engines: {node: '>=14.0.0'} to-regex-range@5.0.1: @@ -1300,22 +1367,22 @@ packages: peerDependencies: typedoc: '>=0.22.x <0.29.x' - typedoc@0.27.9: - resolution: {integrity: sha512-/z585740YHURLl9DN2jCWe6OW7zKYm6VoQ93H0sxZ1cwHQEQrUn5BJrEnkWhfzUdyO+BLGjnKUZ9iz9hKloFDw==} - engines: {node: '>= 18'} + typedoc@0.28.13: + resolution: {integrity: sha512-dNWY8msnYB2a+7Audha+aTF1Pu3euiE7ySp53w8kEsXoYw7dMouV5A1UsTUY345aB152RHnmRMDiovuBi7BD+w==} + engines: {node: '>= 18', pnpm: '>= 10'} hasBin: true peerDependencies: - typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x + typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x - typescript-eslint@8.29.1: - resolution: {integrity: sha512-f8cDkvndhbQMPcysk6CUSGBWV+g1utqdn71P5YKwMumVMOG/5k7cHq0KyG4O52nB0oKS4aN2Tp5+wB4APJGC+w==} + typescript-eslint@8.43.0: + resolution: {integrity: sha512-FyRGJKUGvcFekRRcBKFBlAhnp4Ng8rhe8tuvvkR9OiU0gfd4vyvTRQHEckO6VDlH57jbeUQem2IpqPq9kLJH+w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} engines: {node: '>=14.17'} hasBin: true @@ -1328,8 +1395,8 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - vite-node@3.1.1: - resolution: {integrity: sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w==} + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true @@ -1364,16 +1431,16 @@ packages: terser: optional: true - vitest@3.1.1: - resolution: {integrity: sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==} + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.1.1 - '@vitest/ui': 3.1.1 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -1426,9 +1493,9 @@ packages: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} - yaml@2.7.1: - resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} - engines: {node: '>= 14'} + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} hasBin: true yocto-queue@0.1.0: @@ -1437,9 +1504,9 @@ packages: snapshots: - '@8hobbies/typedoc-plugin-404@3.2.1(typedoc@0.27.9(typescript@5.8.3))': + '@8hobbies/typedoc-plugin-404@3.2.1(typedoc@0.28.13(typescript@5.9.2))': dependencies: - typedoc: 0.27.9(typescript@5.8.3) + typedoc: 0.28.13(typescript@5.9.2) '@ampproject/remapping@2.3.0': dependencies: @@ -1530,14 +1597,19 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.5.1(eslint@9.24.0)': + '@eslint-community/eslint-utils@4.5.1(eslint@9.35.0)': dependencies: - eslint: 9.24.0 + eslint: 9.35.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/eslint-utils@4.9.0(eslint@9.35.0)': + dependencies: + eslint: 9.35.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.20.0': + '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6 debug: 4.4.0 @@ -1545,9 +1617,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.2.0': {} + '@eslint/config-helpers@0.3.1': {} - '@eslint/core@0.12.0': + '@eslint/core@0.15.2': dependencies: '@types/json-schema': 7.0.15 @@ -1555,7 +1627,7 @@ snapshots: dependencies: ajv: 6.12.6 debug: 4.4.0 - espree: 10.3.0 + espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 @@ -1565,19 +1637,21 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.24.0': {} + '@eslint/js@9.35.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.7': + '@eslint/plugin-kit@0.3.5': dependencies: - '@eslint/core': 0.12.0 + '@eslint/core': 0.15.2 levn: 0.4.1 - '@gerrit0/mini-shiki@1.27.2': + '@gerrit0/mini-shiki@3.12.2': dependencies: - '@shikijs/engine-oniguruma': 1.29.2 - '@shikijs/types': 1.29.2 + '@shikijs/engine-oniguruma': 3.12.2 + '@shikijs/langs': 3.12.2 + '@shikijs/themes': 3.12.2 + '@shikijs/types': 3.12.2 '@shikijs/vscode-textmate': 10.0.2 '@humanfs/core@0.19.1': {} @@ -1604,9 +1678,9 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@j4cobi/eslint-plugin-sort-imports@1.0.2(eslint@9.24.0)(typescript@5.8.3)': + '@j4cobi/eslint-plugin-sort-imports@1.0.2(eslint@9.35.0)(typescript@5.9.2)': dependencies: - '@typescript-eslint/utils': 8.28.0(eslint@9.24.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.28.0(eslint@9.35.0)(typescript@5.9.2) transitivePeerDependencies: - eslint - supports-color @@ -1629,6 +1703,11 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + '@material/material-color-utilities@0.3.0': {} '@nodelib/fs.scandir@2.1.5': @@ -1708,18 +1787,32 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.37.0': optional: true - '@shikijs/engine-oniguruma@1.29.2': + '@shikijs/engine-oniguruma@3.12.2': dependencies: - '@shikijs/types': 1.29.2 + '@shikijs/types': 3.12.2 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/types@1.29.2': + '@shikijs/langs@3.12.2': + dependencies: + '@shikijs/types': 3.12.2 + + '@shikijs/themes@3.12.2': + dependencies: + '@shikijs/types': 3.12.2 + + '@shikijs/types@3.12.2': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 '@shikijs/vscode-textmate@10.0.2': {} + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + + '@types/deep-eql@4.0.2': {} + '@types/eslint@9.6.1': dependencies: '@types/estree': 1.0.7 @@ -1735,7 +1828,7 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@22.14.1': + '@types/node@22.18.3': dependencies: undici-types: 6.21.0 @@ -1743,34 +1836,43 @@ snapshots: '@types/xml2js@0.4.14': dependencies: - '@types/node': 22.14.1 + '@types/node': 22.18.3 - '@typescript-eslint/eslint-plugin@8.29.1(@typescript-eslint/parser@8.29.1(eslint@9.24.0)(typescript@5.8.3))(eslint@9.24.0)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.9.2))(eslint@9.35.0)(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.29.1(eslint@9.24.0)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.29.1 - '@typescript-eslint/type-utils': 8.29.1(eslint@9.24.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.29.1(eslint@9.24.0)(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.29.1 - eslint: 9.24.0 + '@typescript-eslint/parser': 8.43.0(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.43.0 + '@typescript-eslint/type-utils': 8.43.0(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/utils': 8.43.0(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.43.0 + eslint: 9.35.0 graphemer: 1.4.0 - ignore: 5.3.2 + ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.29.1(eslint@9.24.0)(typescript@5.8.3)': + '@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.9.2)': dependencies: - '@typescript-eslint/scope-manager': 8.29.1 - '@typescript-eslint/types': 8.29.1 - '@typescript-eslint/typescript-estree': 8.29.1(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.29.1 + '@typescript-eslint/scope-manager': 8.43.0 + '@typescript-eslint/types': 8.43.0 + '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.43.0 debug: 4.4.0 - eslint: 9.24.0 - typescript: 5.8.3 + eslint: 9.35.0 + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.43.0(typescript@5.9.2)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.9.2) + '@typescript-eslint/types': 8.43.0 + debug: 4.4.0 + typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -1779,27 +1881,32 @@ snapshots: '@typescript-eslint/types': 8.28.0 '@typescript-eslint/visitor-keys': 8.28.0 - '@typescript-eslint/scope-manager@8.29.1': + '@typescript-eslint/scope-manager@8.43.0': dependencies: - '@typescript-eslint/types': 8.29.1 - '@typescript-eslint/visitor-keys': 8.29.1 + '@typescript-eslint/types': 8.43.0 + '@typescript-eslint/visitor-keys': 8.43.0 - '@typescript-eslint/type-utils@8.29.1(eslint@9.24.0)(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.43.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/typescript-estree': 8.29.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.29.1(eslint@9.24.0)(typescript@5.8.3) + typescript: 5.9.2 + + '@typescript-eslint/type-utils@8.43.0(eslint@9.35.0)(typescript@5.9.2)': + dependencies: + '@typescript-eslint/types': 8.43.0 + '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.43.0(eslint@9.35.0)(typescript@5.9.2) debug: 4.4.0 - eslint: 9.24.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + eslint: 9.35.0 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.28.0': {} - '@typescript-eslint/types@8.29.1': {} + '@typescript-eslint/types@8.43.0': {} - '@typescript-eslint/typescript-estree@8.28.0(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.28.0(typescript@5.9.2)': dependencies: '@typescript-eslint/types': 8.28.0 '@typescript-eslint/visitor-keys': 8.28.0 @@ -1808,44 +1915,46 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.1 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.29.1(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.43.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/types': 8.29.1 - '@typescript-eslint/visitor-keys': 8.29.1 + '@typescript-eslint/project-service': 8.43.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.9.2) + '@typescript-eslint/types': 8.43.0 + '@typescript-eslint/visitor-keys': 8.43.0 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.1 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.28.0(eslint@9.24.0)(typescript@5.8.3)': + '@typescript-eslint/utils@8.28.0(eslint@9.35.0)(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0) + '@eslint-community/eslint-utils': 4.5.1(eslint@9.35.0) '@typescript-eslint/scope-manager': 8.28.0 '@typescript-eslint/types': 8.28.0 - '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.3) - eslint: 9.24.0 - typescript: 5.8.3 + '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.9.2) + eslint: 9.35.0 + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.29.1(eslint@9.24.0)(typescript@5.8.3)': + '@typescript-eslint/utils@8.43.0(eslint@9.35.0)(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0) - '@typescript-eslint/scope-manager': 8.29.1 - '@typescript-eslint/types': 8.29.1 - '@typescript-eslint/typescript-estree': 8.29.1(typescript@5.8.3) - eslint: 9.24.0 - typescript: 5.8.3 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0) + '@typescript-eslint/scope-manager': 8.43.0 + '@typescript-eslint/types': 8.43.0 + '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.9.2) + eslint: 9.35.0 + typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -1854,89 +1963,92 @@ snapshots: '@typescript-eslint/types': 8.28.0 eslint-visitor-keys: 4.2.0 - '@typescript-eslint/visitor-keys@8.29.1': + '@typescript-eslint/visitor-keys@8.43.0': dependencies: - '@typescript-eslint/types': 8.29.1 - eslint-visitor-keys: 4.2.0 + '@typescript-eslint/types': 8.43.0 + eslint-visitor-keys: 4.2.1 - '@vitest/coverage-v8@3.1.1(vitest@3.1.1(@types/node@22.14.1)(@vitest/ui@3.1.1))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@22.18.3)(@vitest/ui@3.2.4))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 - debug: 4.4.0 + ast-v8-to-istanbul: 0.3.5 + debug: 4.4.3 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.1.7 magic-string: 0.30.17 magicast: 0.3.5 - std-env: 3.8.1 + std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.1.1(@types/node@22.14.1)(@vitest/ui@3.1.1) + vitest: 3.2.4(@types/node@22.18.3)(@vitest/ui@3.2.4) transitivePeerDependencies: - supports-color - '@vitest/expect@3.1.1': + '@vitest/expect@3.2.4': dependencies: - '@vitest/spy': 3.1.1 - '@vitest/utils': 3.1.1 + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.1(vite@5.4.15(@types/node@22.14.1))': + '@vitest/mocker@3.2.4(vite@5.4.15(@types/node@22.18.3))': dependencies: - '@vitest/spy': 3.1.1 + '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 5.4.15(@types/node@22.14.1) + vite: 5.4.15(@types/node@22.18.3) - '@vitest/pretty-format@3.1.1': + '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.1.1': + '@vitest/runner@3.2.4': dependencies: - '@vitest/utils': 3.1.1 + '@vitest/utils': 3.2.4 pathe: 2.0.3 + strip-literal: 3.0.0 - '@vitest/snapshot@3.1.1': + '@vitest/snapshot@3.2.4': dependencies: - '@vitest/pretty-format': 3.1.1 + '@vitest/pretty-format': 3.2.4 magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/spy@3.1.1': + '@vitest/spy@3.2.4': dependencies: - tinyspy: 3.0.2 + tinyspy: 4.0.3 - '@vitest/ui@3.1.1(vitest@3.1.1)': + '@vitest/ui@3.2.4(vitest@3.2.4)': dependencies: - '@vitest/utils': 3.1.1 + '@vitest/utils': 3.2.4 fflate: 0.8.2 flatted: 3.3.3 pathe: 2.0.3 sirv: 3.0.1 - tinyglobby: 0.2.12 + tinyglobby: 0.2.15 tinyrainbow: 2.0.0 - vitest: 3.1.1(@types/node@22.14.1)(@vitest/ui@3.1.1) + vitest: 3.2.4(@types/node@22.18.3)(@vitest/ui@3.2.4) - '@vitest/utils@3.1.1': + '@vitest/utils@3.2.4': dependencies: - '@vitest/pretty-format': 3.1.1 - loupe: 3.1.3 + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.1 tinyrainbow: 2.0.0 abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 - acorn-jsx@5.3.2(acorn@8.14.1): + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - acorn: 8.14.1 + acorn: 8.15.0 - acorn@8.14.1: {} + acorn@8.15.0: {} ajv@6.12.6: dependencies: @@ -1959,6 +2071,12 @@ snapshots: assertion-error@2.0.1: {} + ast-v8-to-istanbul@0.3.5: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + estree-walker: 3.0.3 + js-tokens: 9.0.1 + balanced-match@1.0.2: {} base64-js@1.5.1: {} @@ -2022,11 +2140,15 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.3: + dependencies: + ms: 2.1.3 + deep-eql@5.0.2: {} deep-is@0.1.4: {} - dotenv@16.5.0: {} + dotenv@16.6.1: {} eastasianwidth@0.2.0: {} @@ -2038,7 +2160,7 @@ snapshots: entities@4.5.0: {} - es-module-lexer@1.6.0: {} + es-module-lexer@1.7.0: {} esbuild@0.21.5: optionalDependencies: @@ -2068,11 +2190,11 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.2(eslint@9.24.0): + eslint-config-prettier@10.1.8(eslint@9.35.0): dependencies: - eslint: 9.24.0 + eslint: 9.35.0 - eslint-scope@8.3.0: + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 @@ -2081,16 +2203,18 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.24.0: + eslint-visitor-keys@4.2.1: {} + + eslint@9.35.0: dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.20.0 - '@eslint/config-helpers': 0.2.0 - '@eslint/core': 0.12.0 + '@eslint/config-array': 0.21.0 + '@eslint/config-helpers': 0.3.1 + '@eslint/core': 0.15.2 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.24.0 - '@eslint/plugin-kit': 0.2.7 + '@eslint/js': 9.35.0 + '@eslint/plugin-kit': 0.3.5 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.2 @@ -2101,9 +2225,9 @@ snapshots: cross-spawn: 7.0.6 debug: 4.4.0 escape-string-regexp: 4.0.0 - eslint-scope: 8.3.0 - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -2121,11 +2245,11 @@ snapshots: transitivePeerDependencies: - supports-color - espree@10.3.0: + espree@10.4.0: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) - eslint-visitor-keys: 4.2.0 + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 esquery@1.6.0: dependencies: @@ -2147,7 +2271,7 @@ snapshots: events@3.3.0: {} - expect-type@1.2.0: {} + expect-type@1.2.2: {} fast-deep-equal@3.1.3: {} @@ -2167,9 +2291,9 @@ snapshots: dependencies: reusify: 1.1.0 - fdir@6.4.3(picomatch@4.0.2): + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: - picomatch: 4.0.2 + picomatch: 4.0.3 fflate@0.8.2: {} @@ -2220,7 +2344,7 @@ snapshots: globals@14.0.0: {} - globals@16.0.0: {} + globals@16.4.0: {} graphemer@1.4.0: {} @@ -2232,6 +2356,8 @@ snapshots: ignore@5.3.2: {} + ignore@7.0.5: {} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -2262,7 +2388,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: '@jridgewell/trace-mapping': 0.3.25 - debug: 4.4.0 + debug: 4.4.3 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -2278,6 +2404,8 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + js-tokens@9.0.1: {} + js-yaml@4.1.0: dependencies: argparse: 2.0.1 @@ -2313,6 +2441,8 @@ snapshots: loupe@3.1.3: {} + loupe@3.2.1: {} + lru-cache@10.4.3: {} lunr@2.3.9: {} @@ -2349,7 +2479,7 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - minecraft-data@3.85.0: {} + minecraft-data@3.98.0: {} minimatch@3.1.2: dependencies: @@ -2415,6 +2545,8 @@ snapshots: picomatch@4.0.2: {} + picomatch@4.0.3: {} + postcss@8.5.3: dependencies: nanoid: 3.3.11 @@ -2423,7 +2555,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier@3.5.3: {} + prettier@3.6.2: {} prismarine-nbt@2.7.0: dependencies: @@ -2521,7 +2653,7 @@ snapshots: stackback@0.0.2: {} - std-env@3.8.1: {} + std-env@3.9.0: {} string-width@4.2.3: dependencies: @@ -2549,6 +2681,10 @@ snapshots: strip-json-comments@3.1.1: {} + strip-literal@3.0.0: + dependencies: + js-tokens: 9.0.1 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -2563,16 +2699,16 @@ snapshots: tinyexec@0.3.2: {} - tinyglobby@0.2.12: + tinyglobby@0.2.15: dependencies: - fdir: 6.4.3(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 - tinypool@1.0.2: {} + tinypool@1.1.1: {} tinyrainbow@2.0.0: {} - tinyspy@3.0.2: {} + tinyspy@4.0.3: {} to-regex-range@5.0.1: dependencies: @@ -2580,44 +2716,45 @@ snapshots: totalist@3.0.1: {} - ts-api-utils@2.1.0(typescript@5.8.3): + ts-api-utils@2.1.0(typescript@5.9.2): dependencies: - typescript: 5.8.3 + typescript: 5.9.2 type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - typedoc-material-theme@1.4.0(typedoc@0.27.9(typescript@5.8.3)): + typedoc-material-theme@1.4.0(typedoc@0.28.13(typescript@5.9.2)): dependencies: '@material/material-color-utilities': 0.3.0 - typedoc: 0.27.9(typescript@5.8.3) + typedoc: 0.28.13(typescript@5.9.2) - typedoc-plugin-rename-defaults@0.7.3(typedoc@0.27.9(typescript@5.8.3)): + typedoc-plugin-rename-defaults@0.7.3(typedoc@0.28.13(typescript@5.9.2)): dependencies: camelcase: 8.0.0 - typedoc: 0.27.9(typescript@5.8.3) + typedoc: 0.28.13(typescript@5.9.2) - typedoc@0.27.9(typescript@5.8.3): + typedoc@0.28.13(typescript@5.9.2): dependencies: - '@gerrit0/mini-shiki': 1.27.2 + '@gerrit0/mini-shiki': 3.12.2 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 - typescript: 5.8.3 - yaml: 2.7.1 + typescript: 5.9.2 + yaml: 2.8.1 - typescript-eslint@8.29.1(eslint@9.24.0)(typescript@5.8.3): + typescript-eslint@8.43.0(eslint@9.35.0)(typescript@5.9.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.29.1(@typescript-eslint/parser@8.29.1(eslint@9.24.0)(typescript@5.8.3))(eslint@9.24.0)(typescript@5.8.3) - '@typescript-eslint/parser': 8.29.1(eslint@9.24.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.29.1(eslint@9.24.0)(typescript@5.8.3) - eslint: 9.24.0 - typescript: 5.8.3 + '@typescript-eslint/eslint-plugin': 8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.9.2))(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/parser': 8.43.0(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.43.0(eslint@9.35.0)(typescript@5.9.2) + eslint: 9.35.0 + typescript: 5.9.2 transitivePeerDependencies: - supports-color - typescript@5.8.3: {} + typescript@5.9.2: {} uc.micro@2.1.0: {} @@ -2627,13 +2764,13 @@ snapshots: dependencies: punycode: 2.3.1 - vite-node@3.1.1(@types/node@22.14.1): + vite-node@3.2.4(@types/node@22.18.3): dependencies: cac: 6.7.14 - debug: 4.4.0 - es-module-lexer: 1.6.0 + debug: 4.4.3 + es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 5.4.15(@types/node@22.14.1) + vite: 5.4.15(@types/node@22.18.3) transitivePeerDependencies: - '@types/node' - less @@ -2645,40 +2782,43 @@ snapshots: - supports-color - terser - vite@5.4.15(@types/node@22.14.1): + vite@5.4.15(@types/node@22.18.3): dependencies: esbuild: 0.21.5 postcss: 8.5.3 rollup: 4.37.0 optionalDependencies: - '@types/node': 22.14.1 + '@types/node': 22.18.3 fsevents: 2.3.3 - vitest@3.1.1(@types/node@22.14.1)(@vitest/ui@3.1.1): + vitest@3.2.4(@types/node@22.18.3)(@vitest/ui@3.2.4): dependencies: - '@vitest/expect': 3.1.1 - '@vitest/mocker': 3.1.1(vite@5.4.15(@types/node@22.14.1)) - '@vitest/pretty-format': 3.1.1 - '@vitest/runner': 3.1.1 - '@vitest/snapshot': 3.1.1 - '@vitest/spy': 3.1.1 - '@vitest/utils': 3.1.1 + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@5.4.15(@types/node@22.18.3)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 chai: 5.2.0 - debug: 4.4.0 - expect-type: 1.2.0 + debug: 4.4.3 + expect-type: 1.2.2 magic-string: 0.30.17 pathe: 2.0.3 - std-env: 3.8.1 + picomatch: 4.0.2 + std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 - tinypool: 1.0.2 + tinyglobby: 0.2.15 + tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 5.4.15(@types/node@22.14.1) - vite-node: 3.1.1(@types/node@22.14.1) + vite: 5.4.15(@types/node@22.18.3) + vite-node: 3.2.4(@types/node@22.18.3) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.14.1 - '@vitest/ui': 3.1.1(vitest@3.1.1) + '@types/node': 22.18.3 + '@vitest/ui': 3.2.4(vitest@3.2.4) transitivePeerDependencies: - less - lightningcss @@ -2725,6 +2865,6 @@ snapshots: xmlbuilder@11.0.1: {} - yaml@2.7.1: {} + yaml@2.8.1: {} yocto-queue@0.1.0: {} From fb2244c02847768c6a48d49031249f3c1d244418 Mon Sep 17 00:00:00 2001 From: Jacob Date: Mon, 15 Sep 2025 21:22:42 +0800 Subject: [PATCH 029/124] feat(RequestData): isRaw type guard --- src/API/getAchievements.test.ts | 8 +-- src/API/getActiveHouses.test.ts | 11 ++-- src/API/getActiveHouses.ts | 10 +++- src/API/getBoosters.test.ts | 11 ++-- src/API/getBoosters.ts | 10 +++- src/API/getChallenges.test.ts | 6 ++- src/API/getGameCounts.test.ts | 7 ++- src/API/getGuild.test.ts | 20 +++++--- src/API/getGuildAchievements.test.ts | 7 ++- src/API/getHouse.test.ts | 7 ++- src/API/getLeaderboards.test.ts | 12 +++-- src/API/getLeaderboards.ts | 9 +++- src/API/getPlayerHouses.test.ts | 11 ++-- src/API/getPlayerHouses.ts | 10 +++- src/API/getQuests.test.ts | 6 ++- src/API/getRecentGames.test.ts | 12 +++-- src/API/getRecentGames.ts | 10 +++- src/API/getSkyBlockAuction.test.ts | 25 ++++++--- src/API/getSkyBlockAuction.ts | 5 +- src/API/getSkyBlockAuctions.test.ts | 11 ++-- src/API/getSkyBlockAuctions.ts | 13 ++++- src/API/getSkyBlockBazaar.test.ts | 6 ++- src/API/getSkyBlockBingo.test.ts | 6 ++- src/API/getSkyBlockCollections.test.ts | 6 ++- src/API/getSkyBlockElection.test.ts | 6 ++- src/API/getSkyBlockEndedAuctions.test.ts | 6 ++- src/API/getSkyBlockEndedAuctions.ts | 5 +- src/API/getSkyBlockFireSales.test.ts | 11 ++-- src/API/getSkyBlockFireSales.ts | 10 +++- src/API/getSkyBlockGarden.test.ts | 5 +- src/API/getSkyBlockItems.test.ts | 11 ++-- src/API/getSkyBlockItems.ts | 10 +++- src/API/getSkyBlockMuseum.test.ts | 6 ++- src/API/getSkyBlockNews.test.ts | 11 ++-- src/API/getSkyBlockNews.ts | 7 ++- src/API/getSkyBlockProfile.test.ts | 6 ++- src/API/getSkyBlockProfiles.test.ts | 11 ++-- src/API/getSkyBlockProfiles.ts | 11 ++-- src/API/getSkyBlockSkills.test.ts | 6 ++- src/API/getStatus.test.ts | 6 ++- src/API/getWatchdogStats.test.ts | 6 ++- src/Client.ts | 51 ++++++++++--------- src/Private/RequestData.ts | 4 ++ src/Private/RequestHandler.ts | 2 +- src/Structures/Boosters/Booster.ts | 5 ++ src/Structures/GameCounts.ts | 5 ++ src/Structures/Guild/Guild.ts | 5 ++ src/Structures/House.ts | 5 ++ src/Structures/MiniGames/Pit/Pit.test.ts | 6 +-- src/Structures/Player/Player.ts | 5 ++ src/Structures/RecentGame.ts | 5 ++ .../SkyBlock/Bazaar/SkyBlockBazaar.ts | 5 ++ .../SkyBlock/Bingo/SkyBlockBingo.ts | 5 ++ .../Collections/SkyBlockCollections.ts | 5 ++ .../SkyBlock/Election/SkyBlockElectionData.ts | 5 ++ .../SkyBlock/FireSale/SkyBlockFireSale.ts | 6 +++ .../SkyBlock/Garden/SkyBlockGarden.ts | 5 ++ .../SkyBlock/Museum/SkyBlockMuseum.ts | 5 ++ src/Structures/SkyBlock/News/SkyBlockNews.ts | 6 +++ .../SkyBlock/Profile/SkyBlockProfile.ts | 5 ++ .../SkyBlock/Skills/SkyBlockSkills.ts | 5 ++ src/Structures/SkyBlock/SkyBlockItem.ts | 6 +++ .../Static/Achievements/Achievements.ts | 5 ++ .../Static/Achievements/GuildAchievements.ts | 5 ++ src/Structures/Static/Challenges.ts | 5 ++ src/Structures/Static/Quests.ts | 5 ++ src/Structures/Status.ts | 5 ++ src/Structures/WatchdogStats.ts | 6 +++ src/Types/API.ts | 6 ++- 69 files changed, 420 insertions(+), 141 deletions(-) diff --git a/src/API/getAchievements.test.ts b/src/API/getAchievements.test.ts index a91a55416..44c7c60d5 100644 --- a/src/API/getAchievements.test.ts +++ b/src/API/getAchievements.test.ts @@ -13,16 +13,18 @@ test('getAchievements (raw)', async () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); expectTypeOf(data).toEqualTypeOf(); + expect(data.isRaw()).toBe(true); client.destroy(); }); test('getAchievements', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getAchievements(); + const data = await client.getAchievements(); expect(data).toBeDefined(); expect(data).toBeInstanceOf(Achievements); expectTypeOf(data).toEqualTypeOf(); - data = data as Achievements; + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; expect(data.lastUpdatedTimestamp).toBeDefined(); expect(data.lastUpdatedTimestamp).toBeGreaterThanOrEqual(0); expectTypeOf(data.lastUpdatedTimestamp).toEqualTypeOf(); @@ -31,7 +33,7 @@ test('getAchievements', async () => { expect(data.achievementsPerGame).toBeDefined(); expectTypeOf(data.achievementsPerGame).toEqualTypeOf>(); Object.keys(data.achievementsPerGame).forEach((game) => { - const gameData = data.achievementsPerGame[game] as GameAchievements; + const gameData = data.achievementsPerGame[game]; expect(gameData).toBeDefined(); expect(gameData).toBeInstanceOf(GameAchievements); expectTypeOf(gameData).toEqualTypeOf(); diff --git a/src/API/getActiveHouses.test.ts b/src/API/getActiveHouses.test.ts index d39c7498c..aba151e19 100644 --- a/src/API/getActiveHouses.test.ts +++ b/src/API/getActiveHouses.test.ts @@ -1,6 +1,7 @@ import Client from '../Client.js'; import House from '../Structures/House.js'; import RequestData from '../Private/RequestData.js'; +import { WithRaw } from '../Types/API.js'; import { expect, expectTypeOf, test } from 'vitest'; test('getActiveHouses (raw)', async () => { @@ -8,16 +9,18 @@ test('getActiveHouses (raw)', async () => { const data = await client.getActiveHouses({ raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); - expectTypeOf(data).toEqualTypeOf(); + expectTypeOf(data).toEqualTypeOf | RequestData>(); + expect(data.isRaw()).toBe(true); client.destroy(); }); test('getActiveHouses', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getActiveHouses(); + const data = await client.getActiveHouses(); expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf(); - data = data as House[]; + expectTypeOf(data).toEqualTypeOf | RequestData>(); + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; data.forEach((house: House) => { expect(house).toBeDefined(); expect(house).toBeInstanceOf(House); diff --git a/src/API/getActiveHouses.ts b/src/API/getActiveHouses.ts index 57dbcfe12..2ee4ee6e4 100644 --- a/src/API/getActiveHouses.ts +++ b/src/API/getActiveHouses.ts @@ -3,6 +3,7 @@ import Endpoint from '../Private/Endpoint.js'; import House from '../Structures/House.js'; import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; +import type { WithRaw } from '../Types/API.ts'; class getActiveHouses extends Endpoint { override readonly client: Client; @@ -11,10 +12,15 @@ class getActiveHouses extends Endpoint { this.client = client; } - override async execute(options?: RequestOptions): Promise { + override async execute(options?: RequestOptions): Promise | RequestData> { const res = await this.client.requestHandler.request('/housing/active', options); if (res.options.raw) return res; - return res.data.map((b: any) => new House(b)); + const houses = res.data.map((b: any) => new House(b)); + return Object.assign(houses, { + isRaw(): this is RequestData { + return false; + } + }); } } diff --git a/src/API/getBoosters.test.ts b/src/API/getBoosters.test.ts index d71b71630..d9335f39f 100644 --- a/src/API/getBoosters.test.ts +++ b/src/API/getBoosters.test.ts @@ -2,6 +2,7 @@ import Booster from '../Structures/Boosters/Booster.js'; import Client from '../Client.js'; import Game from '../Structures/Game.js'; import RequestData from '../Private/RequestData.js'; +import { WithRaw } from '../Types/API.js'; import { expect, expectTypeOf, test } from 'vitest'; import type { GameCode, GameID, GameString } from '../Types/Game.js'; @@ -10,16 +11,18 @@ test('getBoosters (raw)', async () => { const data = await client.getBoosters({ raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); - expectTypeOf(data).toEqualTypeOf(); + expectTypeOf(data).toEqualTypeOf | RequestData>(); + expect(data.isRaw()).toBe(true); client.destroy(); }); test('getBoosters', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getBoosters(); + const data = await client.getBoosters(); expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf(); - data = data as Booster[]; + expectTypeOf(data).toEqualTypeOf | RequestData>(); + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; data.forEach((booster: Booster) => { expect(booster).toBeDefined(); expect(booster).toBeInstanceOf(Booster); diff --git a/src/API/getBoosters.ts b/src/API/getBoosters.ts index 49565b157..c8e5561a0 100644 --- a/src/API/getBoosters.ts +++ b/src/API/getBoosters.ts @@ -3,6 +3,7 @@ import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; +import type { WithRaw } from '../Types/API.ts'; class getBoosters extends Endpoint { override readonly client: Client; @@ -11,10 +12,15 @@ class getBoosters extends Endpoint { this.client = client; } - override async execute(options?: RequestOptions): Promise { + override async execute(options?: RequestOptions): Promise | RequestData> { const res = await this.client.requestHandler.request('/boosters', options); if (res.options.raw) return res; - return res.data.boosters.map((b: any) => new Booster(b)).reverse(); + const boosters = res.data.boosters.map((b: any) => new Booster(b)).reverse(); + return Object.assign(boosters, { + isRaw(): this is RequestData { + return false; + } + }); } } diff --git a/src/API/getChallenges.test.ts b/src/API/getChallenges.test.ts index 6782cd4ad..b6306a829 100644 --- a/src/API/getChallenges.test.ts +++ b/src/API/getChallenges.test.ts @@ -12,16 +12,18 @@ test('getChallenges (raw)', async () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); expectTypeOf(data).toEqualTypeOf(); + expect(data.isRaw()).toBe(true); client.destroy(); }); test('getChallenges', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getChallenges(); + const data = await client.getChallenges(); expect(data).toBeDefined(); expect(data).toBeInstanceOf(Challenges); expectTypeOf(data).toEqualTypeOf(); - data = data as Challenges; + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; expect(data.lastUpdatedTimestamp).toBeDefined(); expect(data.lastUpdatedTimestamp).toBeGreaterThan(0); expectTypeOf(data.lastUpdatedTimestamp).toEqualTypeOf(); diff --git a/src/API/getGameCounts.test.ts b/src/API/getGameCounts.test.ts index ba28897f8..07ea23dcd 100644 --- a/src/API/getGameCounts.test.ts +++ b/src/API/getGameCounts.test.ts @@ -9,16 +9,19 @@ test('getGameCounts (raw)', async () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); expectTypeOf(data).toEqualTypeOf(); + expect(data.isRaw()).toBe(true); + if (data.isRaw()) return; client.destroy(); }); test('getGameCounts', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getGameCounts(); + const data = await client.getGameCounts(); expect(data).toBeDefined(); expect(data).toBeInstanceOf(GameCounts); expectTypeOf(data).toEqualTypeOf(); - data = data as GameCounts; + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; expect(data.playerCount).toBeDefined(); expectTypeOf(data.playerCount).toEqualTypeOf(); expect(data.toString()).toBeDefined(); diff --git a/src/API/getGuild.test.ts b/src/API/getGuild.test.ts index 506f99bfc..1bd4b9bb8 100644 --- a/src/API/getGuild.test.ts +++ b/src/API/getGuild.test.ts @@ -56,16 +56,20 @@ test('getGuild (raw)', async () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); expectTypeOf(data).toEqualTypeOf(); + if (null === data) return; + expect(data.isRaw()).toBe(true); client.destroy(); }); test('getGuild (Name)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getGuild('name', 'Pixelic'); + const data = await client.getGuild('name', 'Pixelic'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(Guild); expectTypeOf(data).toEqualTypeOf(); - data = data as Guild; + if (null === data) return; + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; expect(data.id).toBeDefined(); expectTypeOf(data.id).toEqualTypeOf(); expect(data.name).toBeDefined(); @@ -243,11 +247,13 @@ test('getGuild (Name)', async () => { test('getGuild (Id)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getGuild('id', '64b54f9d8ea8c96aaedafe84'); + const data = await client.getGuild('id', '64b54f9d8ea8c96aaedafe84'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(Guild); expectTypeOf(data).toEqualTypeOf(); - data = data as Guild; + if (null === data) return; + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; expect(data.id).toBeDefined(); expectTypeOf(data.id).toEqualTypeOf(); expect(data.name).toBeDefined(); @@ -425,11 +431,13 @@ test('getGuild (Id)', async () => { test('getGuild (Player)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getGuild('player', '14727faefbdc4aff848cd2713eb9939e'); + const data = await client.getGuild('player', '14727faefbdc4aff848cd2713eb9939e'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(Guild); expectTypeOf(data).toEqualTypeOf(); - data = data as Guild; + if (null === data) return; + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; expect(data.id).toBeDefined(); expectTypeOf(data.id).toEqualTypeOf(); expect(data.name).toBeDefined(); diff --git a/src/API/getGuildAchievements.test.ts b/src/API/getGuildAchievements.test.ts index 5944c6318..5d42f486d 100644 --- a/src/API/getGuildAchievements.test.ts +++ b/src/API/getGuildAchievements.test.ts @@ -12,15 +12,18 @@ test('getGuildAchievements (raw)', async () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); expectTypeOf(data).toEqualTypeOf(); + expect(data.isRaw()).toBe(true); + if (data.isRaw()) return; client.destroy(); }); test('getGuildAchievements', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getGuildAchievements(); + const data = await client.getGuildAchievements(); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); - data = data as GuildAchievements; + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; expect(data.lastUpdatedTimestamp).toBeDefined(); expectTypeOf(data.lastUpdatedTimestamp).toEqualTypeOf(); expect(data.lastUpdatedAt).toBeDefined(); diff --git a/src/API/getHouse.test.ts b/src/API/getHouse.test.ts index 616abdb85..5c52de8d9 100644 --- a/src/API/getHouse.test.ts +++ b/src/API/getHouse.test.ts @@ -10,6 +10,8 @@ test('getHouse (raw)', async () => { const data = await client.getHouse(houses[0].uuid, { raw: true }); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); + expect(data.isRaw()).toBe(true); + if (data.isRaw()) return; client.destroy(); }); @@ -27,10 +29,11 @@ test('getHouse', async () => { if (undefined === houses[0]) return; expect(houses).toBeDefined(); expectTypeOf(houses).toEqualTypeOf(); - let data = await client.getHouse(houses[0].uuid); + const data = await client.getHouse(houses[0].uuid); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); - data = data as House; + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; expect(data.name).toBeDefined(); expectTypeOf(data.name).toEqualTypeOf(); expect(data.uuid).toBeDefined(); diff --git a/src/API/getLeaderboards.test.ts b/src/API/getLeaderboards.test.ts index 7967eda89..3a1afab28 100644 --- a/src/API/getLeaderboards.test.ts +++ b/src/API/getLeaderboards.test.ts @@ -1,6 +1,7 @@ import Client from '../Client.js'; import Leaderboard from '../Structures/Leaderboard.js'; import RequestData from '../Private/RequestData.js'; +import { WithRaw } from '../Types/API.js'; import { defaultRequestData } from '../../vitest.setup.js'; import { expect, expectTypeOf, test, vi } from 'vitest'; @@ -9,17 +10,20 @@ test('getLeaderboards (raw)', async () => { const data = await client.getLeaderboards({ raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); - expectTypeOf(data).toEqualTypeOf | RequestData>(); + expectTypeOf(data).toEqualTypeOf> | RequestData>(); + expect(data.isRaw()).toBe(true); client.destroy(); }); test('getLeaderboards', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getLeaderboards(); + const data = await client.getLeaderboards(); expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf | RequestData>(); - data = data as Record; + expectTypeOf(data).toEqualTypeOf> | RequestData>(); + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; Object.keys(data).forEach((key) => { + if ('isRaw' === key) return; if (undefined === data[key]) return; expect(data[key]).toBeDefined(); expectTypeOf(data[key]).toEqualTypeOf(); diff --git a/src/API/getLeaderboards.ts b/src/API/getLeaderboards.ts index 5e2623c76..628610da0 100644 --- a/src/API/getLeaderboards.ts +++ b/src/API/getLeaderboards.ts @@ -3,6 +3,7 @@ import Endpoint from '../Private/Endpoint.js'; import Leaderboard from '../Structures/Leaderboard.js'; import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; +import type { WithRaw } from '../Types/API.ts'; class getLeaderboards extends Endpoint { override readonly client: Client; @@ -11,7 +12,7 @@ class getLeaderboards extends Endpoint { this.client = client; } - override async execute(options?: RequestOptions): Promise | RequestData> { + override async execute(options?: RequestOptions): Promise> | RequestData> { const res = await this.client.requestHandler.request('/leaderboards', options); if (res.options.raw) return res; if (!res.data.leaderboards) { @@ -21,7 +22,11 @@ class getLeaderboards extends Endpoint { Object.keys(res.data.leaderboards).forEach((key) => { leaderboards[key] = res.data.leaderboards[key].map((l: Record) => new Leaderboard(l)); }); - return leaderboards; + return Object.assign(leaderboards, { + isRaw(): this is RequestData { + return false; + } + }); } } diff --git a/src/API/getPlayerHouses.test.ts b/src/API/getPlayerHouses.test.ts index 6c7075b86..bea05430d 100644 --- a/src/API/getPlayerHouses.test.ts +++ b/src/API/getPlayerHouses.test.ts @@ -1,6 +1,7 @@ import Client from '../Client.js'; import House from '../Structures/House.js'; import RequestData from '../Private/RequestData.js'; +import { WithRaw } from '../Types/API.js'; import { expect, expectTypeOf, test } from 'vitest'; test('getPlayerHouses (No input)', async () => { @@ -16,16 +17,18 @@ test('getPlayerHouses (raw)', async () => { const data = await client.getPlayerHouses('69e04609da2a4e7dabb83546a971969e', { raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); - expectTypeOf(data).toEqualTypeOf(); + expectTypeOf(data).toEqualTypeOf | RequestData>(); + expect(data.isRaw()).toBe(true); client.destroy(); }); test('getPlayerHouses', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getPlayerHouses('69e04609da2a4e7dabb83546a971969e'); + const data = await client.getPlayerHouses('69e04609da2a4e7dabb83546a971969e'); expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf(); - data = data as House[]; + expectTypeOf(data).toEqualTypeOf | RequestData>(); + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; data.forEach((house: House) => { expect(house).toBeDefined(); expect(house).toBeInstanceOf(House); diff --git a/src/API/getPlayerHouses.ts b/src/API/getPlayerHouses.ts index 3dd6127cb..6de5fda06 100644 --- a/src/API/getPlayerHouses.ts +++ b/src/API/getPlayerHouses.ts @@ -3,6 +3,7 @@ import Endpoint from '../Private/Endpoint.js'; import House from '../Structures/House.js'; import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; +import type { WithRaw } from '../Types/API.ts'; class getPlayerHouses extends Endpoint { override readonly client: Client; @@ -11,12 +12,17 @@ class getPlayerHouses extends Endpoint { this.client = client; } - override async execute(query: string, options?: RequestOptions): Promise { + override async execute(query: string, options?: RequestOptions): Promise | RequestData> { if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); query = await this.client.requestHandler.toUUID(query); const res = await this.client.requestHandler.request(`/housing/houses?player=${query}`, options); if (res.options.raw) return res; - return res.data.map((h: any) => new House(h)); + const houses = res.data.map((h: any) => new House(h)); + return Object.assign(houses, { + isRaw(): this is RequestData { + return false; + } + }); } } diff --git a/src/API/getQuests.test.ts b/src/API/getQuests.test.ts index a54b566b4..ad5c92288 100644 --- a/src/API/getQuests.test.ts +++ b/src/API/getQuests.test.ts @@ -13,16 +13,18 @@ test('getQuests (raw)', async () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); expectTypeOf(data).toEqualTypeOf(); + expect(data.isRaw()).toBe(true); client.destroy(); }); test('getQuests', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getQuests(); + const data = await client.getQuests(); expect(data).toBeDefined(); expect(data).toBeInstanceOf(Quests); expectTypeOf(data).toEqualTypeOf(); - data = data as Quests; + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; expect(data.lastUpdatedTimestamp).toBeDefined(); expectTypeOf(data.lastUpdatedTimestamp).toEqualTypeOf(); expect(data.lastUpdatedTimestamp).toBeGreaterThanOrEqual(0); diff --git a/src/API/getRecentGames.test.ts b/src/API/getRecentGames.test.ts index ec918a3ec..b12cf5201 100644 --- a/src/API/getRecentGames.test.ts +++ b/src/API/getRecentGames.test.ts @@ -2,6 +2,7 @@ import Client from '../Client.js'; import Game from '../Structures/Game.js'; import RecentGame from '../Structures/RecentGame.js'; import RequestData from '../Private/RequestData.js'; +import { WithRaw } from '../Types/API.js'; import { expect, expectTypeOf, test } from 'vitest'; test('getRecentGames (no input)', async () => { @@ -17,16 +18,19 @@ test('getRecentGames (raw)', async () => { const data = await client.getRecentGames('3b76b69ae5134296a730ed49171ad6f8', { raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); - expectTypeOf(data).toEqualTypeOf(); + expectTypeOf(data).toEqualTypeOf | RequestData>(); + expect(data.isRaw()).toBe(true); client.destroy(); }); test('getRecentGames', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getRecentGames('ea805d40e8284d8d8e64e9fc8ac301ca'); + const data = await client.getRecentGames('ea805d40e8284d8d8e64e9fc8ac301ca'); expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf(); - data = data as RecentGame[]; + expectTypeOf(data).toEqualTypeOf | RequestData>(); + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; + data.forEach((game: RecentGame) => { expect(game).toBeDefined(); expectTypeOf(game).toEqualTypeOf(); diff --git a/src/API/getRecentGames.ts b/src/API/getRecentGames.ts index e366e19ee..54d612a2b 100644 --- a/src/API/getRecentGames.ts +++ b/src/API/getRecentGames.ts @@ -3,6 +3,7 @@ import Endpoint from '../Private/Endpoint.js'; import RecentGame from '../Structures/RecentGame.js'; import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; +import type { WithRaw } from '../Types/API.ts'; class getRecentGames extends Endpoint { override readonly client: Client; @@ -11,12 +12,17 @@ class getRecentGames extends Endpoint { this.client = client; } - override async execute(query: string, options?: RequestOptions): Promise { + override async execute(query: string, options?: RequestOptions): Promise | RequestData> { if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); query = await this.client.requestHandler.toUUID(query); const res = await this.client.requestHandler.request(`/recentgames?uuid=${query}`, options); if (res.options.raw) return res; - return res.data.games.map((x: any) => new RecentGame(x)); + const games = res.data.games.map((x: any) => new RecentGame(x)); + return Object.assign(games, { + isRaw(): this is RequestData { + return false; + } + }); } } diff --git a/src/API/getSkyBlockAuction.test.ts b/src/API/getSkyBlockAuction.test.ts index 7495b948b..6a46a94a5 100644 --- a/src/API/getSkyBlockAuction.test.ts +++ b/src/API/getSkyBlockAuction.test.ts @@ -3,17 +3,20 @@ import RequestData from '../Private/RequestData.js'; import SkyBlockAuction from '../Structures/SkyBlock/Auctions/SkyBlockAuction.js'; import SkyBlockBaseAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type { SkyBlockAuctionResult, SkyBlockAuctionsResult } from '../Types/API.js'; +import type { SkyBlockAuctionResult } from '../Types/API.js'; test('getSkyBlockAuction (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - const auctions = (await client.getSkyBlockAuctions(1)) as SkyBlockAuctionsResult; + const auctions = await client.getSkyBlockAuctions(1); + if (auctions.isRaw()) return; if (undefined === auctions.auctions[0]) return; if (!auctions.auctions[0].auctioneerUuid) throw new Error("Something wen't wrong while fetching auctions"); const data = await client.getSkyBlockAuction('AUCTION_ID', auctions.auctions[0].auctionId, { raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); expectTypeOf(data).toEqualTypeOf(); + expect(data.isRaw()).toBe(true); + client.destroy(); }); test('getSkyBlockAuction (No Type Input)', async () => { @@ -42,30 +45,36 @@ test('getSkyBlockAuction (No Query Input)', async () => { test('getSkyBlockAuction (PROFILE)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - const auctions = (await client.getSkyBlockAuctions(1)) as SkyBlockAuctionsResult; + const auctions = await client.getSkyBlockAuctions(1); + if (auctions.isRaw()) return; if (undefined === auctions.auctions[0]) return; if (!auctions.auctions[0].auctioneerUuid) throw new Error("Something wen't wrong while fetching auctions"); - let data = await client.getSkyBlockAuction('PROFILE', auctions.auctions[0].auctioneerProfile); + const data = await client.getSkyBlockAuction('PROFILE', auctions.auctions[0].auctioneerProfile); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); - data = data as SkyBlockAuctionResult; + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; expect(data.info).toBeDefined(); expectTypeOf(data.info).toEqualTypeOf(); expect(data.auctions).toBeDefined(); expectTypeOf(data.auctions).toEqualTypeOf(); + client.destroy(); }); test('getSkyBlockAuction (PLAYER)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - const auctions = (await client.getSkyBlockAuctions(1)) as SkyBlockAuctionsResult; + const auctions = await client.getSkyBlockAuctions(1); + if (auctions.isRaw()) return; if (undefined === auctions.auctions[0]) return; if (!auctions.auctions[0].auctioneerUuid) throw new Error("Something wen't wrong while fetching auctions"); - let data = await client.getSkyBlockAuction('PLAYER', auctions.auctions[0].auctioneerUuid); + const data = await client.getSkyBlockAuction('PLAYER', auctions.auctions[0].auctioneerUuid); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); - data = data as SkyBlockAuctionResult; + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; expect(data.info).toBeDefined(); expectTypeOf(data.info).toEqualTypeOf(); expect(data.auctions).toBeDefined(); expectTypeOf(data.auctions).toEqualTypeOf(); + client.destroy(); }); diff --git a/src/API/getSkyBlockAuction.ts b/src/API/getSkyBlockAuction.ts index 0a567c855..bb2720a98 100644 --- a/src/API/getSkyBlockAuction.ts +++ b/src/API/getSkyBlockAuction.ts @@ -48,7 +48,10 @@ class getSkyBlockAction extends Endpoint { info: new SkyBlockBaseAuctionInfo(res.data), auctions: res.data.auctions.map( (Auction: Record) => new SkyBlockAuction(Auction, options?.includeItemBytes ?? false) - ) + ), + isRaw(): this is RequestData { + return false; + } }; } } diff --git a/src/API/getSkyBlockAuctions.test.ts b/src/API/getSkyBlockAuctions.test.ts index b49799e49..ae596eeaa 100644 --- a/src/API/getSkyBlockAuctions.test.ts +++ b/src/API/getSkyBlockAuctions.test.ts @@ -39,15 +39,17 @@ test('getSkyBlockAuctions (raw)', async () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); expectTypeOf(data).toEqualTypeOf(); + expect(data.isRaw()).toBe(true); client.destroy(); }); test('getSkyBlockAuctions (One Page)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getSkyBlockAuctions(1); + const data = await client.getSkyBlockAuctions(1); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); - data = data as SkyBlockAuctionsResult; + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; expect(data.info).toBeDefined(); expectTypeOf(data.info).toEqualTypeOf(); expect(data.auctions).toBeDefined(); @@ -57,10 +59,11 @@ test('getSkyBlockAuctions (One Page)', async () => { test('getSkyBlockAuctions (All Pages)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getSkyBlockAuctions('*'); + const data = await client.getSkyBlockAuctions('*'); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); - data = data as SkyBlockAuctionsResult; + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; expect(data.info).toBeDefined(); expectTypeOf(data.info).toEqualTypeOf(); expect(data.auctions).toBeDefined(); diff --git a/src/API/getSkyBlockAuctions.ts b/src/API/getSkyBlockAuctions.ts index 8d4f74409..c2bd75204 100644 --- a/src/API/getSkyBlockAuctions.ts +++ b/src/API/getSkyBlockAuctions.ts @@ -36,7 +36,13 @@ class getSkyBlockAuctions extends Endpoint { results.forEach(({ auctions: newAuctions }) => { auctions.push(...newAuctions); }); - return { info, auctions }; + return { + info, + auctions, + isRaw(): this is RequestData { + return false; + } + }; } private async getPage(page: number, options?: AuctionRequestOptions): Promise { @@ -46,7 +52,10 @@ class getSkyBlockAuctions extends Endpoint { info: new SkyBlockAuctionInfo(res.data), auctions: res.data.auctions.map( (Auction: Record) => new SkyBlockAuction(Auction, options?.includeItemBytes || false) - ) + ), + isRaw(): this is RequestData { + return false; + } }; } } diff --git a/src/API/getSkyBlockBazaar.test.ts b/src/API/getSkyBlockBazaar.test.ts index 44d7d4b78..742f3f9ac 100644 --- a/src/API/getSkyBlockBazaar.test.ts +++ b/src/API/getSkyBlockBazaar.test.ts @@ -10,15 +10,17 @@ test('getSkyBlockBazaar (raw)', async () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); expectTypeOf(data).toEqualTypeOf(); + expect(data.isRaw()).toBe(true); client.destroy(); }); test('getSkyBlockBazaar', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getSkyBlockBazaar(); + const data = await client.getSkyBlockBazaar(); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); - data = data as SkyBlockBazaar; + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; expect(data.lastUpdated).toBeDefined(); expectTypeOf(data.lastUpdated).toEqualTypeOf(); expect(data.lastUpdatedAt).toBeDefined(); diff --git a/src/API/getSkyBlockBingo.test.ts b/src/API/getSkyBlockBingo.test.ts index 4dc078da4..a68078a6a 100644 --- a/src/API/getSkyBlockBingo.test.ts +++ b/src/API/getSkyBlockBingo.test.ts @@ -10,15 +10,17 @@ test('getSkyBlockBingo (raw)', async () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); expectTypeOf(data).toEqualTypeOf(); + expect(data.isRaw()).toBe(true); client.destroy(); }); test('getSkyBlockBingo', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getSkyBlockBingo(); + const data = await client.getSkyBlockBingo(); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); - data = data as SkyBlockBingo; + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; expect(data.lastUpdatedTimestamp).toBeDefined(); expectTypeOf(data.lastUpdatedTimestamp).toEqualTypeOf(); expect(data.lastUpdatedAt).toBeDefined(); diff --git a/src/API/getSkyBlockCollections.test.ts b/src/API/getSkyBlockCollections.test.ts index 8efb94395..c643c0469 100644 --- a/src/API/getSkyBlockCollections.test.ts +++ b/src/API/getSkyBlockCollections.test.ts @@ -10,15 +10,17 @@ test('getSkyBlockCollections (raw)', async () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); expectTypeOf(data).toEqualTypeOf(); + expect(data.isRaw()).toBe(true); client.destroy(); }); test('getSkyBlockCollections', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getSkyBlockCollections(); + const data = await client.getSkyBlockCollections(); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); - data = data as SkyBlockCollections; + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; expect(data.lastUpdated).toBeDefined(); expectTypeOf(data.lastUpdated).toEqualTypeOf(); expect(data.lastUpdatedAt).toBeDefined(); diff --git a/src/API/getSkyBlockElection.test.ts b/src/API/getSkyBlockElection.test.ts index 0331ededc..e70268e90 100644 --- a/src/API/getSkyBlockElection.test.ts +++ b/src/API/getSkyBlockElection.test.ts @@ -10,15 +10,17 @@ test('getSkyBlockElection (raw)', async () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); expectTypeOf(data).toEqualTypeOf(); + expect(data.isRaw()).toBe(true); client.destroy(); }); test('getSkyBlockElection', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getSkyBlockElection(); + const data = await client.getSkyBlockElection(); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); - data = data as SkyBlockElectionData; + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; expect(data.lastUpdatedTimestamp).toBeDefined(); expectTypeOf(data.lastUpdatedTimestamp).toEqualTypeOf(); expect(data.lastUpdatedAt).toBeDefined(); diff --git a/src/API/getSkyBlockEndedAuctions.test.ts b/src/API/getSkyBlockEndedAuctions.test.ts index a87188924..32b7b95fa 100644 --- a/src/API/getSkyBlockEndedAuctions.test.ts +++ b/src/API/getSkyBlockEndedAuctions.test.ts @@ -11,15 +11,17 @@ test('getSkyBlockEndedAuctions (raw)', async () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); expectTypeOf(data).toEqualTypeOf(); + expect(data.isRaw()).toBe(true); client.destroy(); }); test('getSkyBlockEndedAuctions', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getSkyBlockEndedAuctions(); + const data = await client.getSkyBlockEndedAuctions(); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); - data = data as SkyBlockAuctionResult; + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; expect(data.info).toBeDefined(); expectTypeOf(data.info).toEqualTypeOf(); expect(data.auctions).toBeDefined(); diff --git a/src/API/getSkyBlockEndedAuctions.ts b/src/API/getSkyBlockEndedAuctions.ts index fe1b9d15b..4ea7e5e27 100644 --- a/src/API/getSkyBlockEndedAuctions.ts +++ b/src/API/getSkyBlockEndedAuctions.ts @@ -18,7 +18,10 @@ class getSkyBlockEndedAuctions extends Endpoint { if (res.options.raw) return res; return { info: new SkyBlockBaseAuctionInfo(res.data), - auctions: res.data.auctions.map((Auction: Record) => new SkyBlockAuction(Auction)) + auctions: res.data.auctions.map((Auction: Record) => new SkyBlockAuction(Auction)), + isRaw(): this is RequestData { + return false; + } }; } } diff --git a/src/API/getSkyBlockFireSales.test.ts b/src/API/getSkyBlockFireSales.test.ts index 5020bcacb..ab7be45fc 100644 --- a/src/API/getSkyBlockFireSales.test.ts +++ b/src/API/getSkyBlockFireSales.test.ts @@ -1,6 +1,7 @@ import Client from '../Client.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockFireSale from '../Structures/SkyBlock/FireSale/SkyBlockFireSale.js'; +import { WithRaw } from '../Types/API.js'; import { defaultRequestData } from '../../vitest.setup.js'; import { expect, expectTypeOf, test, vi } from 'vitest'; @@ -9,7 +10,8 @@ test('getSkyBlockFireSales (raw)', async () => { const data = await client.getSkyBlockFireSales({ raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); - expectTypeOf(data).toEqualTypeOf(); + expectTypeOf(data).toEqualTypeOf | RequestData>(); + expect(data.isRaw()).toBe(true); client.destroy(); }); @@ -29,10 +31,11 @@ test('getSkyBlockFireSales', async () => { /* eslint-enable camelcase */ } as any); - let data = await client.getSkyBlockFireSales(); + const data = await client.getSkyBlockFireSales(); expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf(); - data = data as SkyBlockFireSale[]; + expectTypeOf(data).toEqualTypeOf | RequestData>(); + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; data.forEach((FireSale: SkyBlockFireSale) => { expect(FireSale.itemId).toBeDefined(); expectTypeOf(FireSale.itemId).toEqualTypeOf(); diff --git a/src/API/getSkyBlockFireSales.ts b/src/API/getSkyBlockFireSales.ts index 01045cc7f..246d88ec2 100644 --- a/src/API/getSkyBlockFireSales.ts +++ b/src/API/getSkyBlockFireSales.ts @@ -3,6 +3,7 @@ import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockFireSale from '../Structures/SkyBlock/FireSale/SkyBlockFireSale.js'; import type { RequestOptions } from '../Types/Requests.js'; +import type { WithRaw } from '../Types/API.ts'; class getSkyBlockSkyBlockFireSales extends Endpoint { override readonly client: Client; @@ -11,10 +12,15 @@ class getSkyBlockSkyBlockFireSales extends Endpoint { this.client = client; } - override async execute(options?: RequestOptions): Promise { + override async execute(options?: RequestOptions): Promise | RequestData> { const res = await this.client.requestHandler.request('/skyblock/firesales', options); if (res.options.raw) return res; - return res.data.sales.map((sale: any) => new SkyBlockFireSale(sale)); + const fileSales = res.data.sales.map((sale: any) => new SkyBlockFireSale(sale)); + return Object.assign(fileSales, { + isRaw(): this is RequestData { + return false; + } + }); } } diff --git a/src/API/getSkyBlockGarden.test.ts b/src/API/getSkyBlockGarden.test.ts index a9d1c85af..ed1f9f70d 100644 --- a/src/API/getSkyBlockGarden.test.ts +++ b/src/API/getSkyBlockGarden.test.ts @@ -28,11 +28,12 @@ test('getSkyBlockGarden (raw)', async () => { test('getSkyBlockGarden', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getSkyBlockGarden('ed9b9d6d-d9b7-43b1-9841-5d0c20b55494'); + const data = await client.getSkyBlockGarden('ed9b9d6d-d9b7-43b1-9841-5d0c20b55494'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockGarden); expectTypeOf(data).toEqualTypeOf(); - data = data as SkyBlockGarden; + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; expect(data.level).toBeDefined(); expectTypeOf(data.level).toEqualTypeOf(); expect(data.barnSkin).toBeDefined(); diff --git a/src/API/getSkyBlockItems.test.ts b/src/API/getSkyBlockItems.test.ts index 92465b41b..d81cb4402 100644 --- a/src/API/getSkyBlockItems.test.ts +++ b/src/API/getSkyBlockItems.test.ts @@ -1,6 +1,7 @@ import Client from '../Client.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockItem from '../Structures/SkyBlock/SkyBlockItem.js'; +import { WithRaw } from '../Types/API.js'; import { expect, expectTypeOf, test } from 'vitest'; test('getSkyBlockItems (raw)', async () => { @@ -8,16 +9,18 @@ test('getSkyBlockItems (raw)', async () => { const data = await client.getSkyBlockItems({ raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); - expectTypeOf(data).toEqualTypeOf(); + expectTypeOf(data).toEqualTypeOf | RequestData>(); + expect(data.isRaw()).toBe(true); client.destroy(); }); test('getSkyBlockItems', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getSkyBlockItems(); + const data = await client.getSkyBlockItems(); expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf(); - data = data as SkyBlockItem[]; + expectTypeOf(data).toEqualTypeOf | RequestData>(); + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; data.forEach((item: SkyBlockItem) => { expect(item).toBeDefined(); expect(item).toBeInstanceOf(SkyBlockItem); diff --git a/src/API/getSkyBlockItems.ts b/src/API/getSkyBlockItems.ts index d90bdcd01..c3accd70a 100644 --- a/src/API/getSkyBlockItems.ts +++ b/src/API/getSkyBlockItems.ts @@ -3,6 +3,7 @@ import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockItem from '../Structures/SkyBlock/SkyBlockItem.js'; import type { RequestOptions } from '../Types/Requests.js'; +import type { WithRaw } from '../Types/API.ts'; class getSkyBlockItems extends Endpoint { override readonly client: Client; @@ -11,10 +12,15 @@ class getSkyBlockItems extends Endpoint { this.client = client; } - override async execute(options?: RequestOptions): Promise { + override async execute(options?: RequestOptions): Promise | RequestData> { const res = await this.client.requestHandler.request('/resources/skyblock/items', options); if (res.options.raw) return res; - return res.data.items.map((item: Record) => new SkyBlockItem(item)); + const items = res.data.items.map((item: Record) => new SkyBlockItem(item)); + return Object.assign(items, { + isRaw(): this is RequestData { + return false; + } + }); } } diff --git a/src/API/getSkyBlockMuseum.test.ts b/src/API/getSkyBlockMuseum.test.ts index b5948b165..9049b44aa 100644 --- a/src/API/getSkyBlockMuseum.test.ts +++ b/src/API/getSkyBlockMuseum.test.ts @@ -11,6 +11,7 @@ test('getSkyBlockMuseum (raw)', async () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); expectTypeOf(data).toEqualTypeOf(); + expect(data.isRaw()).toBe(true); client.destroy(); }); @@ -24,10 +25,11 @@ test('getSkyBlockMuseum (No input)', async () => { test('getSkyBlockMuseum', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getSkyBlockMuseum('63fe6f4c-4b06-43b2-abd0-2d15dc303e41'); + const data = await client.getSkyBlockMuseum('63fe6f4c-4b06-43b2-abd0-2d15dc303e41'); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); - data = data as SkyBlockMuseum; + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; expect(data.members).toBeDefined(); expectTypeOf(data.members).toEqualTypeOf>(); client.destroy(); diff --git a/src/API/getSkyBlockNews.test.ts b/src/API/getSkyBlockNews.test.ts index 4caef520a..1fe7e6a5a 100644 --- a/src/API/getSkyBlockNews.test.ts +++ b/src/API/getSkyBlockNews.test.ts @@ -1,6 +1,7 @@ import Client from '../Client.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockNews from '../Structures/SkyBlock/News/SkyBlockNews.js'; +import { WithRaw } from '../Types/API.js'; import { expect, expectTypeOf, test } from 'vitest'; test('getSkyBlockNews (raw)', async () => { @@ -8,16 +9,18 @@ test('getSkyBlockNews (raw)', async () => { const data = await client.getSkyBlockNews({ raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); - expectTypeOf(data).toEqualTypeOf(); + expectTypeOf(data).toEqualTypeOf | RequestData>(); + expect(data.isRaw()).toBe(true); client.destroy(); }); test('getSkyBlockNews', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getSkyBlockNews(); + const data = await client.getSkyBlockNews(); expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf(); - data = data as SkyBlockNews[]; + expectTypeOf(data).toEqualTypeOf | RequestData>(); + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; data.forEach((news: SkyBlockNews) => { expect(news.title).toBeDefined(); expectTypeOf(news.title).toEqualTypeOf(); diff --git a/src/API/getSkyBlockNews.ts b/src/API/getSkyBlockNews.ts index 8015f2ee9..7d2dd7b88 100644 --- a/src/API/getSkyBlockNews.ts +++ b/src/API/getSkyBlockNews.ts @@ -14,7 +14,12 @@ class getSkyBlockNews extends Endpoint { override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/skyblock/news', options); if (res.options.raw) return res; - return res.data.items.map((news: any) => new SkyBlockNews(news)); + const news = res.data.items.map((news: any) => new SkyBlockNews(news)); + return Object.assign(news, { + isRaw(): this is RequestData { + return false; + } + }); } } diff --git a/src/API/getSkyBlockProfile.test.ts b/src/API/getSkyBlockProfile.test.ts index 09efd5b4e..a19660996 100644 --- a/src/API/getSkyBlockProfile.test.ts +++ b/src/API/getSkyBlockProfile.test.ts @@ -15,6 +15,7 @@ test('getSkyBlockProfile (raw)', async () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); expectTypeOf(data).toEqualTypeOf(); + expect(data.isRaw()).toBe(true); client.destroy(); }); @@ -36,10 +37,11 @@ test('getSkyBlockProfile (no profiles)', async () => { test('getSkyBlockProfile', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getSkyBlockProfile('ed9b9d6d-d9b7-43b1-9841-5d0c20b55494'); + const data = await client.getSkyBlockProfile('ed9b9d6d-d9b7-43b1-9841-5d0c20b55494'); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); - data = data as SkyBlockProfile; + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); expect(data.profileId).toBeDefined(); diff --git a/src/API/getSkyBlockProfiles.test.ts b/src/API/getSkyBlockProfiles.test.ts index ec5ead71f..ef1190d48 100644 --- a/src/API/getSkyBlockProfiles.test.ts +++ b/src/API/getSkyBlockProfiles.test.ts @@ -6,6 +6,7 @@ import SkyBlockProfile from '../Structures/SkyBlock/Profile/SkyBlockProfile.js'; import SkyBlockProfileBanking from '../Structures/SkyBlock/Profile/Banking/SkyBlockProfileBanking.js'; // eslint-disable-next-line max-len import SkyBlockProfileCommunityUpgrades from '../Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgrades.js'; +import { WithRaw } from '../Types/API.js'; import { expect, expectTypeOf, test } from 'vitest'; import type { SkyBlockProfileName, SkyBlockProfileType } from '../Types/SkyBlock.js'; @@ -14,7 +15,8 @@ test('getSkyBlockProfiles (raw)', async () => { const data = await client.getSkyBlockProfiles('14727faefbdc4aff848cd2713eb9939e', { raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); - expectTypeOf(data).toEqualTypeOf | RequestData>(); + expectTypeOf(data).toEqualTypeOf> | RequestData>(); + expect(data.isRaw()).toBe(true); client.destroy(); }); @@ -36,10 +38,11 @@ test('getSkyBlockProfiles (no profiles)', async () => { test('getSkyBlockProfiles', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getSkyBlockProfiles('14727faefbdc4aff848cd2713eb9939e'); + const data = await client.getSkyBlockProfiles('14727faefbdc4aff848cd2713eb9939e'); expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf | RequestData>(); - data = data as Map; + expectTypeOf(data).toEqualTypeOf> | RequestData>(); + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; data.forEach((profile) => { expect(profile).toBeDefined(); expectTypeOf(profile).toEqualTypeOf(); diff --git a/src/API/getSkyBlockProfiles.ts b/src/API/getSkyBlockProfiles.ts index b9ba5fcfa..3ac0146cd 100644 --- a/src/API/getSkyBlockProfiles.ts +++ b/src/API/getSkyBlockProfiles.ts @@ -5,7 +5,7 @@ import SkyBlockGarden from '../Structures/SkyBlock/Garden/SkyBlockGarden.js'; import SkyBlockProfile from '../Structures/SkyBlock/Profile/SkyBlockProfile.js'; import type SkyBlockMuseum from '../Structures/SkyBlock/Museum/SkyBlockMuseum.js'; import type { SkyBlockProfileName } from '../Types/SkyBlock.js'; -import type { SkyBlockRequestOptions } from '../Types/API.js'; +import type { SkyBlockRequestOptions, WithRaw } from '../Types/API.js'; class getSkyBlockProfiles extends Endpoint { override readonly client: Client; @@ -17,7 +17,7 @@ class getSkyBlockProfiles extends Endpoint { override async execute( query: string, options?: SkyBlockRequestOptions - ): Promise | RequestData> { + ): Promise> | RequestData> { if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); query = await this.client.requestHandler.toUUID(query); const res = await this.client.requestHandler.request(`/skyblock/profiles?uuid=${query}`, options); @@ -30,7 +30,12 @@ class getSkyBlockProfiles extends Endpoint { const parsedProfile = new SkyBlockProfile(profile, { uuid: query, garden, museum }); profiles.set(parsedProfile.profileName, parsedProfile); } - return profiles; + + return Object.assign(profiles, { + isRaw(): this is RequestData { + return false; + } + }); } private async handleGettingSkyBlockGarden(profileId: string): Promise { diff --git a/src/API/getSkyBlockSkills.test.ts b/src/API/getSkyBlockSkills.test.ts index ae817f605..80ba3f246 100644 --- a/src/API/getSkyBlockSkills.test.ts +++ b/src/API/getSkyBlockSkills.test.ts @@ -10,15 +10,17 @@ test('getSkyBlockSkills (raw)', async () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); expectTypeOf(data).toEqualTypeOf(); + expect(data.isRaw()).toBe(true); client.destroy(); }); test('getSkyBlockSkills', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getSkyBlockSkills(); + const data = await client.getSkyBlockSkills(); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); - data = data as SkyBlockSkills; + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; expect(data.lastUpdated).toBeDefined(); expectTypeOf(data.lastUpdated).toEqualTypeOf(); expect(data.lastUpdatedAt).toBeDefined(); diff --git a/src/API/getStatus.test.ts b/src/API/getStatus.test.ts index d3846693b..57dd438ab 100644 --- a/src/API/getStatus.test.ts +++ b/src/API/getStatus.test.ts @@ -11,16 +11,18 @@ test('getStatus (raw)', async () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); expectTypeOf(data).toEqualTypeOf(); + expect(data.isRaw()).toBe(true); client.destroy(); }); test('getStatus', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getStatus('370d6421b761456fadf28c43fe5c4bcf'); + const data = await client.getStatus('370d6421b761456fadf28c43fe5c4bcf'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(Status); expectTypeOf(data).toEqualTypeOf(); - data = data as Status; + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; expect(data.online).toBeDefined(); expectTypeOf(data.online).toEqualTypeOf(); expect(data.game).toBeDefined(); diff --git a/src/API/getWatchdogStats.test.ts b/src/API/getWatchdogStats.test.ts index 8a6c404a2..912f6736b 100644 --- a/src/API/getWatchdogStats.test.ts +++ b/src/API/getWatchdogStats.test.ts @@ -9,16 +9,18 @@ test('getWatchdogStats (raw)', async () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); expectTypeOf(data).toEqualTypeOf(); + expect(data.isRaw()).toBe(true); client.destroy(); }); test('getWatchdogStats', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getWatchdogStats(); + const data = await client.getWatchdogStats(); expect(data).toBeDefined(); expect(data).toBeInstanceOf(WatchdogStats); expectTypeOf(data).toEqualTypeOf(); - data = data as WatchdogStats; + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; expect(data.byWatchdogTotal).toBeDefined(); expect(data.byWatchdogTotal).toBeGreaterThanOrEqual(0); expectTypeOf(data.byWatchdogTotal).toEqualTypeOf(); diff --git a/src/Client.ts b/src/Client.ts index 6af9384ef..0ab2818b2 100644 --- a/src/Client.ts +++ b/src/Client.ts @@ -1,24 +1,22 @@ import API from './API/index.js'; -import Achievements from './Structures/Static/Achievements/Achievements.js'; -import Booster from './Structures/Boosters/Booster.js'; import CacheHandler from './Private/CacheHandler.js'; -import Challenges from './Structures/Static/Challenges.js'; import Errors from './Errors.js'; import Functions from './Private/Functions.js'; -import GameCounts from './Structures/GameCounts.js'; -import Guild from './Structures/Guild/Guild.js'; -import GuildAchievements from './Structures/Static/Achievements/GuildAchievements.js'; -import House from './Structures/House.js'; -import Leaderboard from './Structures/Leaderboard.js'; -import Player from './Structures/Player/Player.js'; -import Quests from './Structures/Static/Quests.js'; import RateLimit from './Private/RateLimit.js'; -import RecentGame from './Structures/RecentGame.js'; -import RequestData from './Private/RequestData.js'; import RequestHandler from './Private/RequestHandler.js'; -import Status from './Structures/Status.js'; import Updater from './Private/Updater.js'; -import WatchdogStats from './Structures/WatchdogStats.js'; +import type Achievements from './Structures/Static/Achievements/Achievements.js'; +import type Booster from './Structures/Boosters/Booster.js'; +import type Challenges from './Structures/Static/Challenges.js'; +import type GameCounts from './Structures/GameCounts.js'; +import type Guild from './Structures/Guild/Guild.js'; +import type GuildAchievements from './Structures/Static/Achievements/GuildAchievements.js'; +import type House from './Structures/House.js'; +import type Leaderboard from './Structures/Leaderboard.js'; +import type Player from './Structures/Player/Player.js'; +import type Quests from './Structures/Static/Quests.js'; +import type RecentGame from './Structures/RecentGame.js'; +import type RequestData from './Private/RequestData.js'; import type SkyBlockBazaar from './Structures/SkyBlock/Bazaar/SkyBlockBazaar.js'; import type SkyBlockBingo from './Structures/SkyBlock/Bingo/SkyBlockBingo.js'; import type SkyBlockCollections from './Structures/SkyBlock/Collections/SkyBlockCollections.js'; @@ -30,6 +28,8 @@ import type SkyBlockMuseum from './Structures/SkyBlock/Museum/SkyBlockMuseum.js' import type SkyBlockNews from './Structures/SkyBlock/News/SkyBlockNews.js'; import type SkyBlockProfile from './Structures/SkyBlock/Profile/SkyBlockProfile.js'; import type SkyBlockSkills from './Structures/SkyBlock/Skills/SkyBlockSkills.js'; +import type Status from './Structures/Status.js'; +import type WatchdogStats from './Structures/WatchdogStats.js'; import type { AuctionFetchOptions, AuctionRequestOptions, @@ -37,11 +37,12 @@ import type { PlayerRequestOptions, SkyBlockAuctionResult, SkyBlockAuctionsResult, - SkyBlockRequestOptions + SkyBlockRequestOptions, + WithRaw } from './Types/API.js'; import type { ClientOptions } from './Types/Client.js'; import type { RequestOptions } from './Types/Requests.js'; -import type { SkyBlockProfileName } from './Types/SkyBlock.js'; +import type { SkyBlockProfileName } from './Types/SkyBlock.ts'; const clients: Client[] = []; @@ -120,11 +121,11 @@ class Client { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } - public getActiveHouses(options?: RequestOptions): Promise { + public getActiveHouses(options?: RequestOptions): Promise | RequestData> { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } - public getBoosters(options?: RequestOptions): Promise { + public getBoosters(options?: RequestOptions): Promise | RequestData> { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } @@ -152,7 +153,7 @@ class Client { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } - public getLeaderboards(options?: RequestOptions): Promise | RequestData> { + public getLeaderboards(options?: RequestOptions): Promise> | RequestData> { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } @@ -160,7 +161,7 @@ class Client { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } - public getPlayerHouses(query: string, options?: RequestOptions): Promise { + public getPlayerHouses(query: string, options?: RequestOptions): Promise | RequestData> { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } @@ -168,7 +169,7 @@ class Client { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } - public getRecentGames(query: string, options?: RequestOptions): Promise { + public getRecentGames(query: string, options?: RequestOptions): Promise | RequestData> { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } @@ -207,7 +208,7 @@ class Client { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } - public getSkyBlockFireSales(options?: RequestOptions): Promise { + public getSkyBlockFireSales(options?: RequestOptions): Promise | RequestData> { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } @@ -215,7 +216,7 @@ class Client { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } - public getSkyBlockItems(options?: RequestOptions): Promise { + public getSkyBlockItems(options?: RequestOptions): Promise | RequestData> { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } @@ -223,7 +224,7 @@ class Client { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } - public getSkyBlockNews(options?: RequestOptions): Promise { + public getSkyBlockNews(options?: RequestOptions): Promise | RequestData> { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } @@ -237,7 +238,7 @@ class Client { public getSkyBlockProfiles( query: string, options?: SkyBlockRequestOptions - ): Promise | RequestData> { + ): Promise> | RequestData> { throw new Error(this.errors.ENDPOINT_NOT_LOADED); } diff --git a/src/Private/RequestData.ts b/src/Private/RequestData.ts index 0a2592866..93dea40bf 100644 --- a/src/Private/RequestData.ts +++ b/src/Private/RequestData.ts @@ -23,6 +23,10 @@ class RequestData { this.requestUrl = info.url; this.cached = info.cached; } + + isRaw(): this is RequestData { + return true; + } } export default RequestData; diff --git a/src/Private/RequestHandler.ts b/src/Private/RequestHandler.ts index 320704e53..9f14e2279 100644 --- a/src/Private/RequestHandler.ts +++ b/src/Private/RequestHandler.ts @@ -1,4 +1,4 @@ -const BASE_URL = 'https://api.hypixel.net/v2'; +const BASE_URL = 'http://localhost:3000/hypixel'; import Client from '../Client.js'; import RequestData from './RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; diff --git a/src/Structures/Boosters/Booster.ts b/src/Structures/Boosters/Booster.ts index 8e694ca8a..fe878ef02 100644 --- a/src/Structures/Boosters/Booster.ts +++ b/src/Structures/Boosters/Booster.ts @@ -1,4 +1,5 @@ import Game from '../Game.js'; +import type RequestData from '../../Private/RequestData.ts'; import type { BoosterType } from '../../Types/Booster.js'; export function parseType(data: Record): BoosterType { @@ -36,6 +37,10 @@ class Booster { toString(): string { return `${this.purchaser}'s booster in ${this.game}`; } + + isRaw(): this is RequestData { + return false; + } } export default Booster; diff --git a/src/Structures/GameCounts.ts b/src/Structures/GameCounts.ts index 2e319fad8..12a033d74 100644 --- a/src/Structures/GameCounts.ts +++ b/src/Structures/GameCounts.ts @@ -1,5 +1,6 @@ import { MiniGamesString } from '../Utils/Constants.js'; import { RemoveSnakeCaseString, recursive } from '../Utils/RemoveSnakeCase.js'; +import type RequestData from '../Private/RequestData.ts'; class GameCounts { playerCount: number; @@ -19,6 +20,10 @@ class GameCounts { toString(): number { return this.playerCount; } + + isRaw(): this is RequestData { + return false; + } } export default GameCounts; diff --git a/src/Structures/Guild/Guild.ts b/src/Structures/Guild/Guild.ts index 79a50410d..dc5b36080 100644 --- a/src/Structures/Guild/Guild.ts +++ b/src/Structures/Guild/Guild.ts @@ -3,6 +3,7 @@ import Game from '../Game.js'; import GuildMember from './GuildMember.js'; import GuildRank from './GuildRank.js'; import { calculateExpHistory, getGuildLevel, members, ranks, totalWeeklyGEXP } from '../../Utils/Guild.js'; +import type RequestData from '../../Private/RequestData.ts'; import type { ExpHistory } from '../../Types/Guild.js'; class Guild { @@ -63,6 +64,10 @@ class Guild { guildMaster(): GuildMember | undefined { return this.members.find((member) => 'Guild Master' === member.rank); } + + isRaw(): this is RequestData { + return false; + } } export default Guild; diff --git a/src/Structures/House.ts b/src/Structures/House.ts index 0854de3d8..3af8f7e33 100644 --- a/src/Structures/House.ts +++ b/src/Structures/House.ts @@ -1,3 +1,4 @@ +import type RequestData from '../Private/RequestData.ts'; import type { UUID } from '../Types/Global.js'; class House { @@ -21,6 +22,10 @@ class House { toString(): string { return this.name; } + + isRaw(): this is RequestData { + return false; + } } export default House; diff --git a/src/Structures/MiniGames/Pit/Pit.test.ts b/src/Structures/MiniGames/Pit/Pit.test.ts index c75ac93e1..6df400247 100644 --- a/src/Structures/MiniGames/Pit/Pit.test.ts +++ b/src/Structures/MiniGames/Pit/Pit.test.ts @@ -1,7 +1,6 @@ import Client from '../../../Client.js'; import Pit from './Pit.js'; import PitInventoryItem from './PitInventoryItem.js'; -import Player from '../../Player/Player.js'; import { expect, expectTypeOf, test } from 'vitest'; import type { PitArmor } from '../../../Types/Player.js'; @@ -90,8 +89,9 @@ test('Pit', () => { test('Pit Inventory', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - let data = await client.getPlayer('3457688aa57c4d71ab9d22b04f9160db'); - data = data as Player; + const data = await client.getPlayer('3457688aa57c4d71ab9d22b04f9160db'); + expect(data.isRaw()).toBe(false); + if (data.isRaw()) return; expect(data.stats.Pit.getInventory).toBeDefined(); expectTypeOf(data.stats.Pit.getInventory).toEqualTypeOf<() => Promise>(); expect(data.stats.Pit.getInventory).toBeInstanceOf(Function); diff --git a/src/Structures/Player/Player.ts b/src/Structures/Player/Player.ts index bebc138cb..a71f730e7 100644 --- a/src/Structures/Player/Player.ts +++ b/src/Structures/Player/Player.ts @@ -13,6 +13,7 @@ import PlayerScorpiusBribe from './PlayerScorpiusBribe.js'; import PlayerSocialMedia from './PlayerSocialMedia.js'; import PlayerStats from './PlayerStats.js'; import RecentGame from '../RecentGame.js'; +import type RequestData from '../../Private/RequestData.ts'; import type { ChatChannel, Language, LevelProgress, PlayerRank } from '../../Types/Player.js'; class Player { @@ -171,6 +172,10 @@ class Player { percentRemaining }; } + + isRaw(): this is RequestData { + return false; + } } export default Player; diff --git a/src/Structures/RecentGame.ts b/src/Structures/RecentGame.ts index 335ba990f..b62038823 100644 --- a/src/Structures/RecentGame.ts +++ b/src/Structures/RecentGame.ts @@ -1,4 +1,5 @@ import Game from './Game.js'; +import type RequestData from '../Private/RequestData.ts'; class RecentGame { game: Game | null; @@ -23,6 +24,10 @@ class RecentGame { toString(): string | null { return this.mode; } + + isRaw(): this is RequestData { + return false; + } } export default RecentGame; diff --git a/src/Structures/SkyBlock/Bazaar/SkyBlockBazaar.ts b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaar.ts index d7bb6334a..753649b7f 100644 --- a/src/Structures/SkyBlock/Bazaar/SkyBlockBazaar.ts +++ b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaar.ts @@ -1,4 +1,5 @@ import SkyBlockBazaarProduct from './SkyBlockBazaarProduct.js'; +import type RequestData from '../../../Private/RequestData.ts'; class SkyBlockBazaar { lastUpdated: number; @@ -10,6 +11,10 @@ class SkyBlockBazaar { const products = data?.products || {}; this.products = Object.keys(products).map((product) => new SkyBlockBazaarProduct(products[product])); } + + isRaw(): this is RequestData { + return false; + } } export default SkyBlockBazaar; diff --git a/src/Structures/SkyBlock/Bingo/SkyBlockBingo.ts b/src/Structures/SkyBlock/Bingo/SkyBlockBingo.ts index bb390a130..7a77f3dee 100644 --- a/src/Structures/SkyBlock/Bingo/SkyBlockBingo.ts +++ b/src/Structures/SkyBlock/Bingo/SkyBlockBingo.ts @@ -1,4 +1,5 @@ import SkyBlockBingoGoal from './SkyBlockBingoGoal.js'; +import type RequestData from '../../../Private/RequestData.ts'; class SkyBlockBingo { lastUpdatedTimestamp: number; @@ -25,6 +26,10 @@ class SkyBlockBingo { toString(): number | null { return this.id; } + + isRaw(): this is RequestData { + return false; + } } export default SkyBlockBingo; diff --git a/src/Structures/SkyBlock/Collections/SkyBlockCollections.ts b/src/Structures/SkyBlock/Collections/SkyBlockCollections.ts index acc914ee4..2ee9121e5 100644 --- a/src/Structures/SkyBlock/Collections/SkyBlockCollections.ts +++ b/src/Structures/SkyBlock/Collections/SkyBlockCollections.ts @@ -1,4 +1,5 @@ import SkyBlockCollection from './SkyBlockCollection.js'; +import type RequestData from '../../../Private/RequestData.ts'; class SkyBlockCollections { lastUpdated: number; @@ -43,6 +44,10 @@ class SkyBlockCollections { toString(): string { return this.version; } + + isRaw(): this is RequestData { + return false; + } } export default SkyBlockCollections; diff --git a/src/Structures/SkyBlock/Election/SkyBlockElectionData.ts b/src/Structures/SkyBlock/Election/SkyBlockElectionData.ts index 468c6a4dd..cf042fe1b 100644 --- a/src/Structures/SkyBlock/Election/SkyBlockElectionData.ts +++ b/src/Structures/SkyBlock/Election/SkyBlockElectionData.ts @@ -1,4 +1,5 @@ import SkyBlockElection from './SkyBlockElection.js'; +import type RequestData from '../../../Private/RequestData.ts'; class SkyBlockElectionData { lastUpdatedTimestamp: number; @@ -11,6 +12,10 @@ class SkyBlockElectionData { this.lastElectionResults = new SkyBlockElection(data?.mayor?.election || {}); this.currentElection = data?.current ? new SkyBlockElection(data?.current || {}) : null; } + + isRaw(): this is RequestData { + return false; + } } export default SkyBlockElectionData; diff --git a/src/Structures/SkyBlock/FireSale/SkyBlockFireSale.ts b/src/Structures/SkyBlock/FireSale/SkyBlockFireSale.ts index f3c420d6e..caeba4f29 100644 --- a/src/Structures/SkyBlock/FireSale/SkyBlockFireSale.ts +++ b/src/Structures/SkyBlock/FireSale/SkyBlockFireSale.ts @@ -1,3 +1,5 @@ +import type RequestData from '../../../Private/RequestData.ts'; + class SkyBlockFireSale { itemId: string; startTimestamp: number; @@ -19,6 +21,10 @@ class SkyBlockFireSale { toString(): string { return this.itemId; } + + isRaw(): this is RequestData { + return false; + } } export default SkyBlockFireSale; diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGarden.ts b/src/Structures/SkyBlock/Garden/SkyBlockGarden.ts index b4dd419cc..724de47cf 100644 --- a/src/Structures/SkyBlock/Garden/SkyBlockGarden.ts +++ b/src/Structures/SkyBlock/Garden/SkyBlockGarden.ts @@ -4,6 +4,7 @@ import SkyBlockGardenCropMilestones from './SkyBlockGardenCropMilestones.js'; import SkyBlockGardenCropsUpgrades from './SkyBlockGardenCropsUpgrades.js'; import SkyBlockGardenVisitors from './SkyBlockGardenVisitors.js'; import { getLevelByXp } from '../../../Utils/SkyBlockUtils.js'; +import type RequestData from '../../../Private/RequestData.ts'; import type { BarnPlot, BarnSkin, SkillLevelData } from '../../../Types/SkyBlock.js'; class SkyBlockGarden { @@ -33,6 +34,10 @@ class SkyBlockGarden { toString(): number { return this.level.level; } + + isRaw(): this is RequestData { + return false; + } } export default SkyBlockGarden; diff --git a/src/Structures/SkyBlock/Museum/SkyBlockMuseum.ts b/src/Structures/SkyBlock/Museum/SkyBlockMuseum.ts index ac082e13a..75cab2317 100644 --- a/src/Structures/SkyBlock/Museum/SkyBlockMuseum.ts +++ b/src/Structures/SkyBlock/Museum/SkyBlockMuseum.ts @@ -1,4 +1,5 @@ import SkyBlockMuseumMember from './SkyBlockMuseumMember.js'; +import type RequestData from '../../../Private/RequestData.ts'; import type { UUID } from '../../../Types/Global.js'; class SkyBlockMuseum { @@ -10,6 +11,10 @@ class SkyBlockMuseum { return obj; }, {}); } + + isRaw(): this is RequestData { + return false; + } } export default SkyBlockMuseum; diff --git a/src/Structures/SkyBlock/News/SkyBlockNews.ts b/src/Structures/SkyBlock/News/SkyBlockNews.ts index b8d058c33..c573dad91 100644 --- a/src/Structures/SkyBlock/News/SkyBlockNews.ts +++ b/src/Structures/SkyBlock/News/SkyBlockNews.ts @@ -1,3 +1,5 @@ +import type RequestData from '../../../Private/RequestData.ts'; + const dateRegExp = /(\d{1,2})(?:st|nd|rd|th|) ([A-Za-z]+) (\d+)/; const versionRegExp = /v\d+(\.\d+){1,}/; @@ -28,6 +30,10 @@ class SkyBlockNews { toString(): string { return this.title; } + + isRaw(): this is RequestData { + return false; + } } export default SkyBlockNews; diff --git a/src/Structures/SkyBlock/Profile/SkyBlockProfile.ts b/src/Structures/SkyBlock/Profile/SkyBlockProfile.ts index 800087bea..66c91d0cb 100644 --- a/src/Structures/SkyBlock/Profile/SkyBlockProfile.ts +++ b/src/Structures/SkyBlock/Profile/SkyBlockProfile.ts @@ -1,6 +1,7 @@ import SkyBlockMember from '../Member/SkyBlockMember.js'; import SkyBlockProfileBanking from './Banking/SkyBlockProfileBanking.js'; import SkyBlockProfileCommunityUpgrades from './CommunityUpgrades/SkyBlockProfileCommunityUpgrades.js'; +import type RequestData from '../../../Private/RequestData.ts'; import type SkyBlockGarden from '../Garden/SkyBlockGarden.js'; import type SkyBlockMuseum from '../Museum/SkyBlockMuseum.js'; import type { SkyBlockProfileName, SkyBlockProfileType } from '../../../Types/SkyBlock.js'; @@ -41,6 +42,10 @@ class SkyBlockProfile { toString(): SkyBlockProfileName | 'UNKNOWN' { return this.profileName; } + + isRaw(): this is RequestData { + return false; + } } export default SkyBlockProfile; diff --git a/src/Structures/SkyBlock/Skills/SkyBlockSkills.ts b/src/Structures/SkyBlock/Skills/SkyBlockSkills.ts index 56aeaefe9..897f85c02 100644 --- a/src/Structures/SkyBlock/Skills/SkyBlockSkills.ts +++ b/src/Structures/SkyBlock/Skills/SkyBlockSkills.ts @@ -1,4 +1,5 @@ import SkyBlockSkill from './SkyBlockSkill.js'; +import type RequestData from '../../../Private/RequestData.ts'; class SkyBlockSkills { lastUpdated: number; @@ -31,6 +32,10 @@ class SkyBlockSkills { this.social = new SkyBlockSkill(data?.skills?.SOCIAL || {}); this.taming = new SkyBlockSkill(data?.skills?.TAMING || {}); } + + isRaw(): this is RequestData { + return false; + } } export default SkyBlockSkills; diff --git a/src/Structures/SkyBlock/SkyBlockItem.ts b/src/Structures/SkyBlock/SkyBlockItem.ts index f23dfacdd..f72704ec2 100644 --- a/src/Structures/SkyBlock/SkyBlockItem.ts +++ b/src/Structures/SkyBlock/SkyBlockItem.ts @@ -1,3 +1,5 @@ +import type RequestData from '../../Private/RequestData.ts'; + class SkyBlockItem { name: string; material: string; @@ -123,6 +125,10 @@ class SkyBlockItem { toString(): string { return this.name; } + + isRaw(): this is RequestData { + return false; + } } export default SkyBlockItem; diff --git a/src/Structures/Static/Achievements/Achievements.ts b/src/Structures/Static/Achievements/Achievements.ts index 912ec5515..bdb72de3b 100644 --- a/src/Structures/Static/Achievements/Achievements.ts +++ b/src/Structures/Static/Achievements/Achievements.ts @@ -1,4 +1,5 @@ import GameAchievements from './GameAchievements.js'; +import type RequestData from '../../../Private/RequestData.ts'; class Achievements { lastUpdatedTimestamp: number; @@ -12,6 +13,10 @@ class Achievements { this.achievementsPerGame.game = new GameAchievements(game, data.achievements[game]); }); } + + isRaw(): this is RequestData { + return false; + } } export default Achievements; diff --git a/src/Structures/Static/Achievements/GuildAchievements.ts b/src/Structures/Static/Achievements/GuildAchievements.ts index a7b4335c0..a93d11641 100644 --- a/src/Structures/Static/Achievements/GuildAchievements.ts +++ b/src/Structures/Static/Achievements/GuildAchievements.ts @@ -1,5 +1,6 @@ import OneTimeAchievement from './OneTimeAchievement.js'; import TieredAchievement from './TieredAchievement.js'; +import type RequestData from '../../../Private/RequestData.ts'; class GuildAchievements { lastUpdatedTimestamp: number; @@ -16,6 +17,10 @@ class GuildAchievements { (achievementKey) => new TieredAchievement(achievementKey, data.tiered[achievementKey]) ); } + + isRaw(): this is RequestData { + return false; + } } export default GuildAchievements; diff --git a/src/Structures/Static/Challenges.ts b/src/Structures/Static/Challenges.ts index 3967f10e5..f438890f4 100644 --- a/src/Structures/Static/Challenges.ts +++ b/src/Structures/Static/Challenges.ts @@ -1,4 +1,5 @@ import GameChallenges from './GameChallenges.js'; +import type RequestData from '../../Private/RequestData.ts'; class Challenges { lastUpdatedTimestamp: number; @@ -12,6 +13,10 @@ class Challenges { this.challengesPerGame[game] = new GameChallenges(game, data.challenges[game]); }); } + + isRaw(): this is RequestData { + return false; + } } export default Challenges; diff --git a/src/Structures/Static/Quests.ts b/src/Structures/Static/Quests.ts index 38c0d01b5..279d91346 100644 --- a/src/Structures/Static/Quests.ts +++ b/src/Structures/Static/Quests.ts @@ -1,4 +1,5 @@ import GameQuests from './GameQuests.js'; +import type RequestData from '../../Private/RequestData.ts'; class Quests { lastUpdatedTimestamp: number; @@ -12,6 +13,10 @@ class Quests { this.questsPerGame[game] = new GameQuests(game, data.quests[game]); }); } + + isRaw(): this is RequestData { + return false; + } } export default Quests; diff --git a/src/Structures/Status.ts b/src/Structures/Status.ts index f1b1998ed..99d7127ed 100644 --- a/src/Structures/Status.ts +++ b/src/Structures/Status.ts @@ -1,4 +1,5 @@ import Game from './Game.js'; +import type RequestData from '../Private/RequestData.ts'; class Status { online: boolean; @@ -15,6 +16,10 @@ class Status { toString(): 'Online' | 'Offline' { return this.online ? 'Online' : 'Offline'; } + + isRaw(): this is RequestData { + return false; + } } export default Status; diff --git a/src/Structures/WatchdogStats.ts b/src/Structures/WatchdogStats.ts index 0c0df19b5..d467d94c3 100644 --- a/src/Structures/WatchdogStats.ts +++ b/src/Structures/WatchdogStats.ts @@ -1,3 +1,5 @@ +import type RequestData from '../Private/RequestData.ts'; + class WatchdogStats { byWatchdogTotal: number; byWatchdogLastMinute: number; @@ -11,6 +13,10 @@ class WatchdogStats { this.byStaffTotal = data?.staff_total || 0; this.byStaffRollingDay = data?.staff_rollingDaily || 0; } + + isRaw(): this is RequestData { + return false; + } } export default WatchdogStats; diff --git a/src/Types/API.ts b/src/Types/API.ts index 65949cdb1..c6cdd3ba9 100644 --- a/src/Types/API.ts +++ b/src/Types/API.ts @@ -1,6 +1,7 @@ /* v8 ignore next 10000 */ -import SkyBlockAuction from '../Structures/SkyBlock/Auctions/SkyBlockAuction.js'; +import type RequestData from '../Private/RequestData.ts'; +import type SkyBlockAuction from '../Structures/SkyBlock/Auctions/SkyBlockAuction.js'; import type SkyBlockAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockAuctionInfo.js'; import type SkyBlockBaseAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.js'; import type { RequestOptions } from './Requests.js'; @@ -23,12 +24,15 @@ export interface SkyBlockRequestOptions extends RequestOptions { export interface SkyBlockAuctionResult { info: SkyBlockBaseAuctionInfo; auctions: SkyBlockAuction[]; + isRaw(): this is RequestData; } export interface SkyBlockAuctionsResult { info: SkyBlockAuctionInfo; auctions: SkyBlockAuction[]; + isRaw(): this is RequestData; } +export type WithRaw = T & { isRaw(): this is RequestData }; export type GuildFetchOptions = 'id' | 'name' | 'player'; export type AuctionFetchOptions = 'PROFILE' | 'PLAYER' | 'AUCTION_ID'; From 9ff706de9614ee426294153cae808d36cee53745 Mon Sep 17 00:00:00 2001 From: Jacob Date: Mon, 15 Sep 2025 21:28:46 +0800 Subject: [PATCH 030/124] fix(tsbuild) --- src/API/getAchievements.test.ts | 1 + src/API/getActiveHouses.test.ts | 2 +- src/API/getBoosters.test.ts | 2 +- src/API/getLeaderboards.test.ts | 2 +- src/API/getPlayerHouses.test.ts | 2 +- src/API/getRecentGames.test.ts | 2 +- src/API/getSkyBlockFireSales.test.ts | 2 +- src/API/getSkyBlockItems.test.ts | 2 +- src/API/getSkyBlockNews.test.ts | 2 +- src/API/getSkyBlockProfiles.test.ts | 2 +- 10 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/API/getAchievements.test.ts b/src/API/getAchievements.test.ts index 44c7c60d5..b00a98b12 100644 --- a/src/API/getAchievements.test.ts +++ b/src/API/getAchievements.test.ts @@ -34,6 +34,7 @@ test('getAchievements', async () => { expectTypeOf(data.achievementsPerGame).toEqualTypeOf>(); Object.keys(data.achievementsPerGame).forEach((game) => { const gameData = data.achievementsPerGame[game]; + if (!gameData) return; expect(gameData).toBeDefined(); expect(gameData).toBeInstanceOf(GameAchievements); expectTypeOf(gameData).toEqualTypeOf(); diff --git a/src/API/getActiveHouses.test.ts b/src/API/getActiveHouses.test.ts index aba151e19..b84bc9c45 100644 --- a/src/API/getActiveHouses.test.ts +++ b/src/API/getActiveHouses.test.ts @@ -1,8 +1,8 @@ import Client from '../Client.js'; import House from '../Structures/House.js'; import RequestData from '../Private/RequestData.js'; -import { WithRaw } from '../Types/API.js'; import { expect, expectTypeOf, test } from 'vitest'; +import type { WithRaw } from '../Types/API.js'; test('getActiveHouses (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); diff --git a/src/API/getBoosters.test.ts b/src/API/getBoosters.test.ts index d9335f39f..e7a86f65b 100644 --- a/src/API/getBoosters.test.ts +++ b/src/API/getBoosters.test.ts @@ -2,9 +2,9 @@ import Booster from '../Structures/Boosters/Booster.js'; import Client from '../Client.js'; import Game from '../Structures/Game.js'; import RequestData from '../Private/RequestData.js'; -import { WithRaw } from '../Types/API.js'; import { expect, expectTypeOf, test } from 'vitest'; import type { GameCode, GameID, GameString } from '../Types/Game.js'; +import type { WithRaw } from '../Types/API.js'; test('getBoosters (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); diff --git a/src/API/getLeaderboards.test.ts b/src/API/getLeaderboards.test.ts index 3a1afab28..9cab0faf5 100644 --- a/src/API/getLeaderboards.test.ts +++ b/src/API/getLeaderboards.test.ts @@ -1,9 +1,9 @@ import Client from '../Client.js'; import Leaderboard from '../Structures/Leaderboard.js'; import RequestData from '../Private/RequestData.js'; -import { WithRaw } from '../Types/API.js'; import { defaultRequestData } from '../../vitest.setup.js'; import { expect, expectTypeOf, test, vi } from 'vitest'; +import type { WithRaw } from '../Types/API.js'; test('getLeaderboards (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); diff --git a/src/API/getPlayerHouses.test.ts b/src/API/getPlayerHouses.test.ts index bea05430d..4ef8b5343 100644 --- a/src/API/getPlayerHouses.test.ts +++ b/src/API/getPlayerHouses.test.ts @@ -1,8 +1,8 @@ import Client from '../Client.js'; import House from '../Structures/House.js'; import RequestData from '../Private/RequestData.js'; -import { WithRaw } from '../Types/API.js'; import { expect, expectTypeOf, test } from 'vitest'; +import type { WithRaw } from '../Types/API.js'; test('getPlayerHouses (No input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); diff --git a/src/API/getRecentGames.test.ts b/src/API/getRecentGames.test.ts index b12cf5201..4f564e73e 100644 --- a/src/API/getRecentGames.test.ts +++ b/src/API/getRecentGames.test.ts @@ -2,8 +2,8 @@ import Client from '../Client.js'; import Game from '../Structures/Game.js'; import RecentGame from '../Structures/RecentGame.js'; import RequestData from '../Private/RequestData.js'; -import { WithRaw } from '../Types/API.js'; import { expect, expectTypeOf, test } from 'vitest'; +import type { WithRaw } from '../Types/API.js'; test('getRecentGames (no input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); diff --git a/src/API/getSkyBlockFireSales.test.ts b/src/API/getSkyBlockFireSales.test.ts index ab7be45fc..d53aeb54d 100644 --- a/src/API/getSkyBlockFireSales.test.ts +++ b/src/API/getSkyBlockFireSales.test.ts @@ -1,9 +1,9 @@ import Client from '../Client.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockFireSale from '../Structures/SkyBlock/FireSale/SkyBlockFireSale.js'; -import { WithRaw } from '../Types/API.js'; import { defaultRequestData } from '../../vitest.setup.js'; import { expect, expectTypeOf, test, vi } from 'vitest'; +import type { WithRaw } from '../Types/API.js'; test('getSkyBlockFireSales (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); diff --git a/src/API/getSkyBlockItems.test.ts b/src/API/getSkyBlockItems.test.ts index d81cb4402..cbaddcd01 100644 --- a/src/API/getSkyBlockItems.test.ts +++ b/src/API/getSkyBlockItems.test.ts @@ -1,8 +1,8 @@ import Client from '../Client.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockItem from '../Structures/SkyBlock/SkyBlockItem.js'; -import { WithRaw } from '../Types/API.js'; import { expect, expectTypeOf, test } from 'vitest'; +import type { WithRaw } from '../Types/API.js'; test('getSkyBlockItems (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); diff --git a/src/API/getSkyBlockNews.test.ts b/src/API/getSkyBlockNews.test.ts index 1fe7e6a5a..151ded4c2 100644 --- a/src/API/getSkyBlockNews.test.ts +++ b/src/API/getSkyBlockNews.test.ts @@ -1,8 +1,8 @@ import Client from '../Client.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockNews from '../Structures/SkyBlock/News/SkyBlockNews.js'; -import { WithRaw } from '../Types/API.js'; import { expect, expectTypeOf, test } from 'vitest'; +import type { WithRaw } from '../Types/API.js'; test('getSkyBlockNews (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); diff --git a/src/API/getSkyBlockProfiles.test.ts b/src/API/getSkyBlockProfiles.test.ts index ef1190d48..acbade7df 100644 --- a/src/API/getSkyBlockProfiles.test.ts +++ b/src/API/getSkyBlockProfiles.test.ts @@ -6,9 +6,9 @@ import SkyBlockProfile from '../Structures/SkyBlock/Profile/SkyBlockProfile.js'; import SkyBlockProfileBanking from '../Structures/SkyBlock/Profile/Banking/SkyBlockProfileBanking.js'; // eslint-disable-next-line max-len import SkyBlockProfileCommunityUpgrades from '../Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgrades.js'; -import { WithRaw } from '../Types/API.js'; import { expect, expectTypeOf, test } from 'vitest'; import type { SkyBlockProfileName, SkyBlockProfileType } from '../Types/SkyBlock.js'; +import type { WithRaw } from '../Types/API.js'; test('getSkyBlockProfiles (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); From 73f367417ad7210d25c58e36c4626f3722007d65 Mon Sep 17 00:00:00 2001 From: Jacob Date: Mon, 15 Sep 2025 21:34:37 +0800 Subject: [PATCH 031/124] chore(typedoc): 0.28.13 -> 0.27.9 --- package.json | 2 +- pnpm-lock.yaml | 74 ++++++++++++++++++++------------------------------ 2 files changed, 30 insertions(+), 46 deletions(-) diff --git a/package.json b/package.json index d9065bec4..bbb12497b 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "eslint-config-prettier": "^10.1.8", "globals": "^16.4.0", "prettier": "^3.6.2", - "typedoc": "^0.28.13", + "typedoc": "^0.27.9", "typedoc-material-theme": "^1.4.0", "typedoc-plugin-rename-defaults": "^0.7.3", "typescript": "^5.9.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 31d63db9e..d28a63821 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,7 +23,7 @@ importers: devDependencies: '@8hobbies/typedoc-plugin-404': specifier: ^3.2.1 - version: 3.2.1(typedoc@0.28.13(typescript@5.9.2)) + version: 3.2.1(typedoc@0.27.9(typescript@5.9.2)) '@eslint/js': specifier: ^9.35.0 version: 9.35.0 @@ -61,14 +61,14 @@ importers: specifier: ^3.6.2 version: 3.6.2 typedoc: - specifier: ^0.28.13 - version: 0.28.13(typescript@5.9.2) + specifier: ^0.27.9 + version: 0.27.9(typescript@5.9.2) typedoc-material-theme: specifier: ^1.4.0 - version: 1.4.0(typedoc@0.28.13(typescript@5.9.2)) + version: 1.4.0(typedoc@0.27.9(typescript@5.9.2)) typedoc-plugin-rename-defaults: specifier: ^0.7.3 - version: 0.7.3(typedoc@0.28.13(typescript@5.9.2)) + version: 0.7.3(typedoc@0.27.9(typescript@5.9.2)) typescript: specifier: ^5.9.2 version: 5.9.2 @@ -297,8 +297,8 @@ packages: resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@gerrit0/mini-shiki@3.12.2': - resolution: {integrity: sha512-HKZPmO8OSSAAo20H2B3xgJdxZaLTwtlMwxg0967scnrDlPwe6j5+ULGHyIqwgTbFCn9yv/ff8CmfWZLE9YKBzA==} + '@gerrit0/mini-shiki@1.27.2': + resolution: {integrity: sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==} '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} @@ -474,17 +474,11 @@ packages: cpu: [x64] os: [win32] - '@shikijs/engine-oniguruma@3.12.2': - resolution: {integrity: sha512-hozwnFHsLvujK4/CPVHNo3Bcg2EsnG8krI/ZQ2FlBlCRpPZW4XAEQmEwqegJsypsTAN9ehu2tEYe30lYKSZW/w==} + '@shikijs/engine-oniguruma@1.29.2': + resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} - '@shikijs/langs@3.12.2': - resolution: {integrity: sha512-bVx5PfuZHDSHoBal+KzJZGheFuyH4qwwcwG/n+MsWno5cTlKmaNtTsGzJpHYQ8YPbB5BdEdKU1rga5/6JGY8ww==} - - '@shikijs/themes@3.12.2': - resolution: {integrity: sha512-fTR3QAgnwYpfGczpIbzPjlRnxyONJOerguQv1iwpyQZ9QXX4qy/XFQqXlf17XTsorxnHoJGbH/LXBvwtqDsF5A==} - - '@shikijs/types@3.12.2': - resolution: {integrity: sha512-K5UIBzxCyv0YoxN3LMrKB9zuhp1bV+LgewxuVwHdl4Gz5oePoUFrr9EfgJlGlDeXCU1b/yhdnXeuRvAnz8HN8Q==} + '@shikijs/types@1.29.2': + resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} @@ -1367,12 +1361,12 @@ packages: peerDependencies: typedoc: '>=0.22.x <0.29.x' - typedoc@0.28.13: - resolution: {integrity: sha512-dNWY8msnYB2a+7Audha+aTF1Pu3euiE7ySp53w8kEsXoYw7dMouV5A1UsTUY345aB152RHnmRMDiovuBi7BD+w==} - engines: {node: '>= 18', pnpm: '>= 10'} + typedoc@0.27.9: + resolution: {integrity: sha512-/z585740YHURLl9DN2jCWe6OW7zKYm6VoQ93H0sxZ1cwHQEQrUn5BJrEnkWhfzUdyO+BLGjnKUZ9iz9hKloFDw==} + engines: {node: '>= 18'} hasBin: true peerDependencies: - typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x + typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x typescript-eslint@8.43.0: resolution: {integrity: sha512-FyRGJKUGvcFekRRcBKFBlAhnp4Ng8rhe8tuvvkR9OiU0gfd4vyvTRQHEckO6VDlH57jbeUQem2IpqPq9kLJH+w==} @@ -1504,9 +1498,9 @@ packages: snapshots: - '@8hobbies/typedoc-plugin-404@3.2.1(typedoc@0.28.13(typescript@5.9.2))': + '@8hobbies/typedoc-plugin-404@3.2.1(typedoc@0.27.9(typescript@5.9.2))': dependencies: - typedoc: 0.28.13(typescript@5.9.2) + typedoc: 0.27.9(typescript@5.9.2) '@ampproject/remapping@2.3.0': dependencies: @@ -1646,12 +1640,10 @@ snapshots: '@eslint/core': 0.15.2 levn: 0.4.1 - '@gerrit0/mini-shiki@3.12.2': + '@gerrit0/mini-shiki@1.27.2': dependencies: - '@shikijs/engine-oniguruma': 3.12.2 - '@shikijs/langs': 3.12.2 - '@shikijs/themes': 3.12.2 - '@shikijs/types': 3.12.2 + '@shikijs/engine-oniguruma': 1.29.2 + '@shikijs/types': 1.29.2 '@shikijs/vscode-textmate': 10.0.2 '@humanfs/core@0.19.1': {} @@ -1787,20 +1779,12 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.37.0': optional: true - '@shikijs/engine-oniguruma@3.12.2': + '@shikijs/engine-oniguruma@1.29.2': dependencies: - '@shikijs/types': 3.12.2 + '@shikijs/types': 1.29.2 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@3.12.2': - dependencies: - '@shikijs/types': 3.12.2 - - '@shikijs/themes@3.12.2': - dependencies: - '@shikijs/types': 3.12.2 - - '@shikijs/types@3.12.2': + '@shikijs/types@1.29.2': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -2724,19 +2708,19 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typedoc-material-theme@1.4.0(typedoc@0.28.13(typescript@5.9.2)): + typedoc-material-theme@1.4.0(typedoc@0.27.9(typescript@5.9.2)): dependencies: '@material/material-color-utilities': 0.3.0 - typedoc: 0.28.13(typescript@5.9.2) + typedoc: 0.27.9(typescript@5.9.2) - typedoc-plugin-rename-defaults@0.7.3(typedoc@0.28.13(typescript@5.9.2)): + typedoc-plugin-rename-defaults@0.7.3(typedoc@0.27.9(typescript@5.9.2)): dependencies: camelcase: 8.0.0 - typedoc: 0.28.13(typescript@5.9.2) + typedoc: 0.27.9(typescript@5.9.2) - typedoc@0.28.13(typescript@5.9.2): + typedoc@0.27.9(typescript@5.9.2): dependencies: - '@gerrit0/mini-shiki': 3.12.2 + '@gerrit0/mini-shiki': 1.27.2 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 From f2e6b9645a0779cbeb44f13152c2f605ba212a11 Mon Sep 17 00:00:00 2001 From: Yoshy <60155833+Yoshy2002@users.noreply.github.com> Date: Tue, 16 Sep 2025 00:42:42 +0200 Subject: [PATCH 032/124] rename kill tiers (#671) --- .../Member/Slayers/SkyBlockMemberSlayer.test.ts | 4 ++-- .../SkyBlock/Member/Slayers/SkyBlockMemberSlayer.ts | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayer.test.ts b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayer.test.ts index 802e04a0e..286b04fdb 100644 --- a/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayer.test.ts +++ b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayer.test.ts @@ -10,8 +10,6 @@ test('SkyBlockMemberSlayer', () => { expectTypeOf(data).toEqualTypeOf(); expect(data.claimedLevels).toBeDefined(); expectTypeOf(data.claimedLevels).toEqualTypeOf(); - expect(data.tier0Kills).toBeDefined(); - expectTypeOf(data.tier0Kills).toEqualTypeOf(); expect(data.tier1Kills).toBeDefined(); expectTypeOf(data.tier1Kills).toEqualTypeOf(); expect(data.tier2Kills).toBeDefined(); @@ -20,6 +18,8 @@ test('SkyBlockMemberSlayer', () => { expectTypeOf(data.tier3Kills).toEqualTypeOf(); expect(data.tier4Kills).toBeDefined(); expectTypeOf(data.tier4Kills).toEqualTypeOf(); + expect(data.tier5Kills).toBeDefined(); + expectTypeOf(data.tier5Kills).toEqualTypeOf(); expect(data.level).toBeDefined(); expectTypeOf(data.level).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayer.ts b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayer.ts index 11f4e27fd..f70aded69 100644 --- a/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayer.ts +++ b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayer.ts @@ -4,19 +4,19 @@ import type { LevelData, SkyBlockSlayer } from '../../../../Types/SkyBlock.js'; class SkyBlockMemberSlayer { claimedLevels: SkyBlockMemberSlayerClaimedLevels; - tier0Kills: number; tier1Kills: number; tier2Kills: number; tier3Kills: number; tier4Kills: number; + tier5Kills: number; level: LevelData; constructor(data: Record, slayer: SkyBlockSlayer) { this.claimedLevels = new SkyBlockMemberSlayerClaimedLevels(data?.claimed_levels || {}); - this.tier0Kills = data?.boss_kills_tier_0 || 0; - this.tier1Kills = data?.boss_kills_tier_1 || 0; - this.tier2Kills = data?.boss_kills_tier_2 || 0; - this.tier3Kills = data?.boss_kills_tier_3 || 0; - this.tier4Kills = data?.boss_kills_tier_4 || 0; + this.tier1Kills = data?.boss_kills_tier_0 || 0; + this.tier2Kills = data?.boss_kills_tier_1 || 0; + this.tier3Kills = data?.boss_kills_tier_2 || 0; + this.tier4Kills = data?.boss_kills_tier_3 || 0; + this.tier5Kills = data?.boss_kills_tier_4 || 0; this.level = getSlayerLevel(slayer, data?.xp); } From a46b529e9504de814f5288d9201822bb99397411 Mon Sep 17 00:00:00 2001 From: Jacob Date: Tue, 16 Sep 2025 08:13:32 +0800 Subject: [PATCH 033/124] fix(SkyBlockMemberBestiary): not including fishing --- .../SkyBlock/Member/Bestiary/SkyBlockMemberBestiary.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Structures/SkyBlock/Member/Bestiary/SkyBlockMemberBestiary.ts b/src/Structures/SkyBlock/Member/Bestiary/SkyBlockMemberBestiary.ts index f16317b5a..9a05d5fc6 100644 --- a/src/Structures/SkyBlock/Member/Bestiary/SkyBlockMemberBestiary.ts +++ b/src/Structures/SkyBlock/Member/Bestiary/SkyBlockMemberBestiary.ts @@ -28,7 +28,7 @@ class SkyBlockMemberBestiary { this.categories = parsed.categories; } - // Credit: https://github.com/SkyCryptWebsite/SkyCryptv2/blob/06d83b81f3c54c931511432259fbd4fe363e53d6/src/lib/server/stats/bestiary.ts + // Credit: https://github.com/SkyCryptWebsite/SkyCryptv2/blob/d73d449ec52f0af3c8a2fa04b79a969a6734e0b2/src/lib/server/stats/bestiary.ts private getBestiaryMobs(mobList: RawBestiaryMob[]): BestiaryMob[] { const output: BestiaryMob[] = []; for (const mob of mobList) { @@ -55,7 +55,6 @@ class SkyBlockMemberBestiary { private getBestiary(): BestiaryStats { const categories = {} as Record; for (const [category, categoryData] of Object.entries(BestiaryMobs)) { - if ('Fishing' === categoryData.name) continue; categories[category] = { name: categoryData.name, mobs: this.getBestiaryMobs(categoryData.mobs), From 0aef5c2549e4bcc9080e75de6b7717c7b4c7af12 Mon Sep 17 00:00:00 2001 From: Jacob Date: Tue, 16 Sep 2025 08:14:17 +0800 Subject: [PATCH 034/124] chore(SkyBlockMemberBestiary): Update data --- src/Types/SkyBlock.ts | 17 +- src/Utils/Constants.ts | 877 +++++++++++++++++++++-------------------- 2 files changed, 467 insertions(+), 427 deletions(-) diff --git a/src/Types/SkyBlock.ts b/src/Types/SkyBlock.ts index 584fcb867..f95261fea 100644 --- a/src/Types/SkyBlock.ts +++ b/src/Types/SkyBlock.ts @@ -3518,20 +3518,17 @@ export interface BestiaryMobsData { mining_3: RawBestiaryIsland; crystal_hollows: RawBestiaryIsland; foraging_1: RawBestiaryIsland; + foraging_2: RawBestiaryIsland; spooky_festival: RawBestiaryIsland; mythological_creatures: RawBestiaryIsland; jerry: RawBestiaryIsland; kuudra: RawBestiaryIsland; - fishing: { - name: string; - hasSubcategories: boolean; - fishing: RawBestiaryIsland; - lava: RawBestiaryIsland; - spooky_festival: RawBestiaryIsland; - fishing_festival: RawBestiaryIsland; - winter: RawBestiaryIsland; - backwater_bayou: RawBestiaryIsland; - }; + fishing: RawBestiaryIsland; + lava: RawBestiaryIsland; + spooky_festival_fishing: RawBestiaryIsland; + fishing_festival: RawBestiaryIsland; + winter: RawBestiaryIsland; + backwater_bayou: RawBestiaryIsland; catacombs: RawBestiaryIsland; garden: RawBestiaryIsland; } diff --git a/src/Utils/Constants.ts b/src/Utils/Constants.ts index b5c0ca83b..576231703 100644 --- a/src/Utils/Constants.ts +++ b/src/Utils/Constants.ts @@ -1587,7 +1587,7 @@ export const BestiaryMobs: BestiaryMobsData = { bracket: 5 }, { - name: '§aEndstone Protector', + name: '§aEnd Stone Protector', cap: 500, mobs: ['corrupted_protector_100'], bracket: 7 @@ -1659,9 +1659,9 @@ export const BestiaryMobs: BestiaryMobsData = { }, { name: '§aFlare', - cap: 100000, + cap: 10000, mobs: ['flare_90'], - bracket: 1 + bracket: 3 }, { name: '§aGhast', @@ -1985,6 +1985,53 @@ export const BestiaryMobs: BestiaryMobsData = { } ] }, + foraging_2: { + name: 'Galatea', + mobs: [ + { + name: '§aBogged', + cap: 3000, + mobs: ['bogged_10'], + bracket: 4 + }, + { + name: '§aChill', + cap: 1000, + mobs: ['chillblade_31', 'chillshot_31'], + bracket: 4 + }, + { + name: '§aEnt', + cap: 1000, + mobs: ['ent_14'], + bracket: 4 + }, + { + name: '§aStridersurfer', + cap: 1000, + mobs: ['strider_20', 'strider_21'], + bracket: 4 + }, + { + name: '§aTadgang', + cap: 1000, + mobs: ['tadgang_frog_8', 'tadgang_frog_10'], + bracket: 4 + }, + { + name: '§aThe Loch Emperor', + cap: 400, + mobs: ['skeleton_emperor_150', 'guardian_emperor_150'], + bracket: 5 + }, + { + name: '§aTidetot', + cap: 1000, + mobs: ['tidetot_10', 'seacurse_15', 'hydrospear_25'], + bracket: 4 + } + ] + }, spooky_festival: { name: 'Spooky Festival', mobs: [ @@ -2235,420 +2282,416 @@ export const BestiaryMobs: BestiaryMobsData = { }, fishing: { name: 'Fishing', - hasSubcategories: true, - fishing: { - name: 'Fishing', - mobs: [ - { - name: '§aAbyssal Miner', - cap: 250, - mobs: ['zombie_miner_150'], - bracket: 6 - }, - { - name: '§aAgarimoo', - cap: 4000, - mobs: ['agarimoo_35'], - bracket: 3 - }, - { - name: '§aBlue Ringed Octopus', - cap: 400, - mobs: ['blue_ringed_octopus_275'], - bracket: 5 - }, - { - name: '§aCarrot King', - cap: 400, - mobs: ['carrot_king_25'], - bracket: 5 - }, - { - name: '§aCatfish', - cap: 1000, - mobs: ['catfish_23'], - bracket: 4 - }, - { - name: '§aDeep Sea Protector', - cap: 1000, - mobs: ['deep_sea_protector_60'], - bracket: 4 - }, - { - name: '§aFrog Man', - cap: 3000, - mobs: ['frog_man_10'], - bracket: 4 - }, - { - name: '§aGuardian Defender', - cap: 1000, - mobs: ['guardian_defender_45'], - bracket: 4 - }, - { - name: '§aMithril Grubber', - cap: 300, - mobs: [ - 'small_mithril_grubber_15', - 'medium_mithril_grubber_15', - 'large_mithril_grubber_15', - 'bloated_mithril_grubber_15' - ], - bracket: 3 - }, - { - name: '§aNight Squid', - cap: 1000, - mobs: ['night_squid_6'], - bracket: 4 - }, - { - name: '§aOasis Rabbit', - cap: 300, - mobs: ['oasis_rabbit_10'], - bracket: 3 - }, - { - name: '§aOasis Sheep', - cap: 300, - mobs: ['oasis_sheep_10'], - bracket: 3 - }, - { - name: '§aPoisoned Water Worm', - cap: 1000, - mobs: ['poisoned_water_worm_25'], - bracket: 4 - }, - { - name: '§aRider of the Deep', - cap: 4000, - mobs: ['zombie_deep_20', 'chicken_deep_20'], - bracket: 3 - }, - { - name: '§aSea Archer', - cap: 4000, - mobs: ['sea_archer_15'], - bracket: 3 - }, - { - name: '§aSea Guardian', - cap: 4000, - mobs: ['sea_guardian_10'], - bracket: 3 - }, - { - name: '§aSea Leech', - cap: 1000, - mobs: ['sea_leech_30'], - bracket: 4 - }, - { - name: '§aSea Walker', - cap: 4000, - mobs: ['sea_walker_4'], - bracket: 3 - }, - { - name: '§aSea Witch', - cap: 4000, - mobs: ['sea_witch_15'], - bracket: 3 - }, - { - name: '§aSnapping Turtle', - cap: 1000, - mobs: ['snapping_turtle_30'], - bracket: 4 - }, - { - name: '§aSquid', - cap: 10000, - mobs: ['pond_squid_1'], - bracket: 2 - }, - { - name: '§aThe Sea Emperor', - cap: 100, - mobs: ['skeleton_emperor_150', 'guardian_emperor_150'], - bracket: 7 - }, - { - name: '§aWater Hydra', - cap: 400, - mobs: ['water_hydra_100'], - bracket: 5 - }, - { - name: '§aWater Worm', - cap: 1000, - mobs: ['water_worm_20'], - bracket: 4 - }, - { - name: '§aWiki Tiki', - cap: 100, - mobs: ['wiki_tiki_400'], - bracket: 7 - } - ] - }, - lava: { - name: 'Lava', - mobs: [ - { - name: '§aFiery Scuttler', - cap: 400, - mobs: ['fiery_scuttler_475'], - bracket: 5 - }, - { - name: '§aFire Eel', - cap: 1000, - mobs: ['fire_eel_240'], - bracket: 4 - }, - { - name: '§aFireproof Witch', - cap: 1000, - mobs: ['fireproof_witch_75'], - bracket: 4 - }, - { - name: '§aFlaming Worm', - cap: 4000, - mobs: ['flaming_worm_50'], - bracket: 3 - }, - { - name: '§aFried Chicken', - cap: 3000, - mobs: ['fried_chicken_30'], - bracket: 4 - }, - { - name: '§aLava Blaze', - cap: 1000, - mobs: ['lava_blaze_100'], - bracket: 4 - }, - { - name: '§aLava Flame', - cap: 1000, - mobs: ['lava_flame_230'], - bracket: 4 - }, - { - name: '§aLava Leech', - cap: 4000, - mobs: ['lava_leech_220'], - bracket: 3 - }, - { - name: '§aLava Pigman', - cap: 1000, - mobs: ['lava_pigman_100'], - bracket: 4 - }, - { - name: '§aLord Jawbus', - cap: 100, - mobs: ['lord_jawbus_600'], - bracket: 7 - }, - { - name: '§aMagma Slug', - cap: 10000, - mobs: ['magma_slug_200'], - bracket: 2 - }, - { - name: '§aMoogma', - cap: 4000, - mobs: ['moogma_210'], - bracket: 3 - }, - { - name: '§aPlhlegblast', - cap: 7, - mobs: ['pond_squid_300'], - bracket: 7 - }, - { - name: '§aPyroclastic Worm', - cap: 1000, - mobs: ['pyroclastic_worm_240'], - bracket: 4 - }, - { - name: '§aRagnarok', - cap: 100, - mobs: ['ragnarok_666'], - bracket: 7 - }, - { - name: '§aTaurus', - cap: 1000, - mobs: ['pig_rider_250'], - bracket: 4 - }, - { - name: '§aThunder', - cap: 400, - mobs: ['thunder_400'], - bracket: 5 - } - ] - }, - spooky_festival: { - name: 'Spooky Festival', - mobs: [ - { - name: '§aGrim Reaper', - cap: 100, - mobs: ['grim_reaper_190'], - bracket: 7 - }, - { - name: '§aNightmare', - cap: 1000, - mobs: ['nightmare_24'], - bracket: 4 - }, - { - name: '§aPhantom Fisher', - cap: 250, - mobs: ['phantom_fisherman_160'], - bracket: 6 - }, - { - name: '§aScarecrow', - cap: 4000, - mobs: ['scarecrow_9'], - bracket: 3 - }, - { - name: '§aWerewolf', - cap: 1000, - mobs: ['werewolf_50'], - bracket: 4 - } - ] - }, - fishing_festival: { - name: 'Fishing Festival', - mobs: [ - { - name: '§aBlue Shark', - cap: 1000, - mobs: ['blue_shark_20'], - bracket: 4 - }, - { - name: '§aGreat White Shark', - cap: 400, - mobs: ['great_white_shark_180'], - bracket: 5 - }, - { - name: '§aNurse Shark', - cap: 4000, - mobs: ['nurse_shark_6'], - bracket: 3 - }, - { - name: '§aTiger Shark', - cap: 1000, - mobs: ['tiger_shark_50'], - bracket: 4 - } - ] - }, - winter: { - name: 'Winter', - mobs: [ - { - name: '§aFrosty', - cap: 4000, - mobs: ['frosty_the_snowman_13'], - bracket: 3 - }, - { - name: '§aFrozen Steve', - cap: 4000, - mobs: ['frozen_steve_7'], - bracket: 3 - }, - { - name: '§aGrinch', - cap: 250, - mobs: ['grinch_21'], - bracket: 6 - }, - { - name: '§aNutcracker', - cap: 400, - mobs: ['nutcracker_50'], - bracket: 5 - }, - { - name: '§aReindrake', - cap: 100, - mobs: ['reindrake_100'], - bracket: 7 - }, - { - name: '§aYeti', - cap: 250, - mobs: ['yeti_175'], - bracket: 6 - } - ] - }, - backwater_bayou: { - name: 'Backwater Bayou', - mobs: [ - { - name: '§aAlligator', - cap: 400, - mobs: ['alligator_120'], - bracket: 5 - }, - { - name: '§aBanshee', - cap: 1000, - mobs: ['banshee_10'], - bracket: 4 - }, - { - name: '§aBayou Sludge', - cap: 1000, - mobs: ['bayou_sludge_25'], - bracket: 4 - }, - { - name: '§aDumpster Diver', - cap: 1000, - mobs: ['dumpster_diver_15'], - bracket: 4 - }, - { - name: '§aTitanoboa', - cap: 100, - mobs: ['titanoboa_240'], - bracket: 7 - }, - { - name: '§aTrash Gobbler', - cap: 1000, - mobs: ['trash_gobbler_8'], - bracket: 4 - } - ] - } + mobs: [ + { + name: '§aAbyssal Miner', + cap: 250, + mobs: ['zombie_miner_150'], + bracket: 6 + }, + { + name: '§aAgarimoo', + cap: 4000, + mobs: ['agarimoo_35'], + bracket: 3 + }, + { + name: '§aBlue Ringed Octopus', + cap: 400, + mobs: ['blue_ringed_octopus_275'], + bracket: 5 + }, + { + name: '§aCarrot King', + cap: 400, + mobs: ['carrot_king_25'], + bracket: 5 + }, + { + name: '§aCatfish', + cap: 1000, + mobs: ['catfish_23'], + bracket: 4 + }, + { + name: '§aDeep Sea Protector', + cap: 1000, + mobs: ['deep_sea_protector_60'], + bracket: 4 + }, + { + name: '§aFrog Man', + cap: 3000, + mobs: ['frog_man_10'], + bracket: 4 + }, + { + name: '§aGuardian Defender', + cap: 1000, + mobs: ['guardian_defender_45'], + bracket: 4 + }, + { + name: '§aMithril Grubber', + cap: 300, + mobs: [ + 'small_mithril_grubber_15', + 'medium_mithril_grubber_15', + 'large_mithril_grubber_15', + 'bloated_mithril_grubber_15' + ], + bracket: 3 + }, + { + name: '§aNight Squid', + cap: 1000, + mobs: ['night_squid_6'], + bracket: 4 + }, + { + name: '§aOasis Rabbit', + cap: 300, + mobs: ['oasis_rabbit_10'], + bracket: 3 + }, + { + name: '§aOasis Sheep', + cap: 300, + mobs: ['oasis_sheep_10'], + bracket: 3 + }, + { + name: '§aPoisoned Water Worm', + cap: 1000, + mobs: ['poisoned_water_worm_25'], + bracket: 4 + }, + { + name: '§aRider of the Deep', + cap: 4000, + mobs: ['zombie_deep_20', 'chicken_deep_20'], + bracket: 3 + }, + { + name: '§aSea Archer', + cap: 4000, + mobs: ['sea_archer_15'], + bracket: 3 + }, + { + name: '§aSea Guardian', + cap: 4000, + mobs: ['sea_guardian_10'], + bracket: 3 + }, + { + name: '§aSea Leech', + cap: 1000, + mobs: ['sea_leech_30'], + bracket: 4 + }, + { + name: '§aSea Walker', + cap: 4000, + mobs: ['sea_walker_4'], + bracket: 3 + }, + { + name: '§aSea Witch', + cap: 4000, + mobs: ['sea_witch_15'], + bracket: 3 + }, + { + name: '§aSnapping Turtle', + cap: 1000, + mobs: ['snapping_turtle_30'], + bracket: 4 + }, + { + name: '§aSquid', + cap: 10000, + mobs: ['pond_squid_1'], + bracket: 2 + }, + { + name: '§aWater Hydra', + cap: 400, + mobs: ['water_hydra_100'], + bracket: 5 + }, + { + name: '§aWater Worm', + cap: 1000, + mobs: ['water_worm_20'], + bracket: 4 + }, + { + name: '§aWetwing', + cap: 1000, + mobs: ['wetwing_chicken_18'], + bracket: 4 + }, + { + name: '§aWiki Tiki', + cap: 100, + mobs: ['wiki_tiki_400'], + bracket: 7 + } + ] + }, + lava: { + name: 'Lava', + mobs: [ + { + name: '§aFiery Scuttler', + cap: 400, + mobs: ['fiery_scuttler_475'], + bracket: 5 + }, + { + name: '§aFire Eel', + cap: 1000, + mobs: ['fire_eel_240'], + bracket: 4 + }, + { + name: '§aFireproof Witch', + cap: 1000, + mobs: ['fireproof_witch_75'], + bracket: 4 + }, + { + name: '§aFlaming Worm', + cap: 4000, + mobs: ['flaming_worm_50'], + bracket: 3 + }, + { + name: '§aFried Chicken', + cap: 3000, + mobs: ['fried_chicken_30'], + bracket: 4 + }, + { + name: '§aLava Blaze', + cap: 1000, + mobs: ['lava_blaze_100'], + bracket: 4 + }, + { + name: '§aLava Flame', + cap: 1000, + mobs: ['lava_flame_230'], + bracket: 4 + }, + { + name: '§aLava Leech', + cap: 4000, + mobs: ['lava_leech_220'], + bracket: 3 + }, + { + name: '§aLava Pigman', + cap: 1000, + mobs: ['lava_pigman_100'], + bracket: 4 + }, + { + name: '§aLord Jawbus', + cap: 100, + mobs: ['lord_jawbus_600'], + bracket: 7 + }, + { + name: '§aMagma Slug', + cap: 10000, + mobs: ['magma_slug_200'], + bracket: 2 + }, + { + name: '§aMoogma', + cap: 4000, + mobs: ['moogma_210'], + bracket: 3 + }, + { + name: '§aPlhlegblast', + cap: 7, + mobs: ['pond_squid_300'], + bracket: 7 + }, + { + name: '§aPyroclastic Worm', + cap: 1000, + mobs: ['pyroclastic_worm_240'], + bracket: 4 + }, + { + name: '§aRagnarok', + cap: 100, + mobs: ['ragnarok_666'], + bracket: 7 + }, + { + name: '§aTaurus', + cap: 1000, + mobs: ['pig_rider_250'], + bracket: 4 + }, + { + name: '§aThunder', + cap: 400, + mobs: ['thunder_400'], + bracket: 5 + } + ] + }, + spooky_festival_fishing: { + name: 'Spooky Festival Fishing', + mobs: [ + { + name: '§aGrim Reaper', + cap: 100, + mobs: ['grim_reaper_190'], + bracket: 7 + }, + { + name: '§aNightmare', + cap: 1000, + mobs: ['nightmare_24'], + bracket: 4 + }, + { + name: '§aPhantom Fisher', + cap: 250, + mobs: ['phantom_fisherman_160'], + bracket: 6 + }, + { + name: '§aScarecrow', + cap: 4000, + mobs: ['scarecrow_9'], + bracket: 3 + }, + { + name: '§aWerewolf', + cap: 1000, + mobs: ['werewolf_50'], + bracket: 4 + } + ] + }, + fishing_festival: { + name: 'Fishing Festival', + mobs: [ + { + name: '§aBlue Shark', + cap: 1000, + mobs: ['blue_shark_20'], + bracket: 4 + }, + { + name: '§aGreat White Shark', + cap: 400, + mobs: ['great_white_shark_180'], + bracket: 5 + }, + { + name: '§aNurse Shark', + cap: 4000, + mobs: ['nurse_shark_6'], + bracket: 3 + }, + { + name: '§aTiger Shark', + cap: 1000, + mobs: ['tiger_shark_50'], + bracket: 4 + } + ] + }, + winter: { + name: 'Winter', + mobs: [ + { + name: '§aFrosty', + cap: 4000, + mobs: ['frosty_the_snowman_13'], + bracket: 3 + }, + { + name: '§aFrozen Steve', + cap: 4000, + mobs: ['frozen_steve_7'], + bracket: 3 + }, + { + name: '§aGrinch', + cap: 250, + mobs: ['grinch_21'], + bracket: 6 + }, + { + name: '§aNutcracker', + cap: 400, + mobs: ['nutcracker_50'], + bracket: 5 + }, + { + name: '§aReindrake', + cap: 100, + mobs: ['reindrake_100'], + bracket: 7 + }, + { + name: '§aYeti', + cap: 250, + mobs: ['yeti_175'], + bracket: 6 + } + ] + }, + backwater_bayou: { + name: 'Backwater Bayou', + mobs: [ + { + name: '§aAlligator', + cap: 400, + mobs: ['alligator_120'], + bracket: 5 + }, + { + name: '§aBanshee', + cap: 1000, + mobs: ['banshee_10'], + bracket: 4 + }, + { + name: '§aBayou Sludge', + cap: 1000, + mobs: ['bayou_sludge_25'], + bracket: 4 + }, + { + name: '§aDumpster Diver', + cap: 1000, + mobs: ['dumpster_diver_15'], + bracket: 4 + }, + { + name: '§aTitanoboa', + cap: 100, + mobs: ['titanoboa_240'], + bracket: 7 + }, + { + name: '§aTrash Gobbler', + cap: 1000, + mobs: ['trash_gobbler_8'], + bracket: 4 + } + ] }, catacombs: { name: 'Catacombs', From 0107f4474ca511ea62374b2d0986e5e0adaf5128 Mon Sep 17 00:00:00 2001 From: Jacob Date: Tue, 16 Sep 2025 08:14:44 +0800 Subject: [PATCH 035/124] fix(RequestHandler): BASE_URL --- src/Private/RequestHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Private/RequestHandler.ts b/src/Private/RequestHandler.ts index 9f14e2279..320704e53 100644 --- a/src/Private/RequestHandler.ts +++ b/src/Private/RequestHandler.ts @@ -1,4 +1,4 @@ -const BASE_URL = 'http://localhost:3000/hypixel'; +const BASE_URL = 'https://api.hypixel.net/v2'; import Client from '../Client.js'; import RequestData from './RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; From bd58175944f8c8a79c75950dfd57da41c2ba90ae Mon Sep 17 00:00:00 2001 From: Jacob Date: Tue, 16 Sep 2025 08:18:02 +0800 Subject: [PATCH 036/124] chore(renovate): ignore typedoc --- .github/renovate.json | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.github/renovate.json b/.github/renovate.json index a770a0491..6ec7b0b6b 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -2,7 +2,7 @@ "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": ["config:recommended", "group:allNonMajor"], "rebaseWhen": "behind-base-branch", - "ignoreDeps": ["pnpm", "node"], + "ignoreDeps": ["pnpm", "node", "typedoc"], "semanticCommits": "enabled", "labels": ["dependencies"], "schedule": ["* 0 * * *"], @@ -13,11 +13,6 @@ "prHourlyLimit": 0, "timezone": "UTC", "packageRules": [ - { - "matchPackageNames": ["skyhelper-networth"], - "matchUpdateTypes": ["minor"], - "automerge": true - }, { "matchUpdateTypes": ["minor", "patch"], "matchCurrentVersion": "!/^0/", From 05d90ca5d8911f8f913149dad9f1afdb2b221547 Mon Sep 17 00:00:00 2001 From: Jacob Date: Tue, 16 Sep 2025 08:40:25 +0800 Subject: [PATCH 037/124] fix(BedWarsBeds): Incorrect values being pased in for BLRatio --- src/Structures/MiniGames/BedWars/BedWarsBeds.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Structures/MiniGames/BedWars/BedWarsBeds.ts b/src/Structures/MiniGames/BedWars/BedWarsBeds.ts index 260a52ec3..0e08709f3 100644 --- a/src/Structures/MiniGames/BedWars/BedWarsBeds.ts +++ b/src/Structures/MiniGames/BedWars/BedWarsBeds.ts @@ -9,7 +9,7 @@ class BedWarsBeds { mode = mode ? `${mode}_` : ''; this.broken = data?.[`${mode}beds_broken_bedwars`] || 0; this.lost = data?.[`${mode}beds_lost_bedwars`] || 0; - this.BLRatio = Divide(data?.[`${mode}beds_broken_bedwars`], data?.[`${mode}_beds_lost_bedwars`]); + this.BLRatio = Divide(this.broken, this.lost); } } From 7cf4c2ef9e0541c9e20b2d4a27ecf7b8760b0948 Mon Sep 17 00:00:00 2001 From: Jacob Date: Tue, 16 Sep 2025 08:41:14 +0800 Subject: [PATCH 038/124] feat(BedWars): One Block mode --- src/Structures/MiniGames/BedWars/BedWars.ts | 2 ++ src/Types/Player.ts | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Structures/MiniGames/BedWars/BedWars.ts b/src/Structures/MiniGames/BedWars/BedWars.ts index 810dd28c8..d9a86ff8b 100644 --- a/src/Structures/MiniGames/BedWars/BedWars.ts +++ b/src/Structures/MiniGames/BedWars/BedWars.ts @@ -106,6 +106,7 @@ class BedWars { '4v4': BedWarsMode; dream: BedWarsDreamStats; castle: BedWarsMode; + oneBlock: BedWarsMode; practice: BedWarsPracticeStats; slumberTickets: number; totalSlumberTicket: number; @@ -134,6 +135,7 @@ class BedWars { this['4v4'] = new BedWarsMode(data, 'two_four'); this.dream = new BedWarsDreamStats(data); this.castle = new BedWarsMode(data, 'castle'); + this.oneBlock = new BedWarsMode(data, 'eight_one_oneblock'); this.practice = new BedWarsPracticeStats(data); this.slumberTickets = data?.slumber?.tickets || 0; this.totalSlumberTicket = data?.slumber?.total_tickets || 0; diff --git a/src/Types/Player.ts b/src/Types/Player.ts index d18fc92bc..01a4abec0 100644 --- a/src/Types/Player.ts +++ b/src/Types/Player.ts @@ -49,7 +49,8 @@ export type BedWarsGamemodeName = | 'eight_two_lucky' | 'four_four_lucky' | 'eight_two_voidless' - | 'four_four_voidless'; + | 'four_four_voidless' + | 'eight_one_oneblock'; export type BlitzSurvivalGamesKits = | 'archer' From 397a3b5db9ecadf307c3c75bbe27be0c213f82b6 Mon Sep 17 00:00:00 2001 From: Jacob Date: Tue, 16 Sep 2025 10:08:55 +0800 Subject: [PATCH 039/124] feat(Player): tests --- src/Structures/Player/Player.test.ts | 97 +++++++++++++++++++ .../PlayerAchievements.test.ts | 28 ++++++ .../PlayerAchievementsRewards.test.ts | 9 ++ .../PlayerAchievementsTotem.test.ts | 31 ++++++ .../PlayerAdventRewards.test.ts | 87 +++++++++++++++++ .../PlayerAdventRewardsDay.test.ts | 17 ++++ .../Pets/PlayerCosmeticsPet.test.ts | 42 ++++++++ .../Pets/PlayerCosmeticsPets.test.ts | 24 +++++ .../PlayerCosmeticsPetsConsumables.test.ts | 90 +++++++++++++++++ .../PlayerCosmetics/PlayerCosmetics.test.ts | 91 +++++++++++++++++ src/Structures/Player/PlayerGifting.test.ts | 31 ++++++ .../PlayerHousing/PlayerHousing.test.ts | 34 +++++++ .../PlayerHousingGivenCookies.test.ts | 13 +++ .../PlayerHousingPlayerSettings.test.ts | 24 +++++ src/Structures/Player/PlayerParkour.test.ts | 24 +++++ .../Player/PlayerQuests/PlayerQuest.test.ts | 16 +++ .../PlayerQuestCompletion.test.ts | 15 +++ .../PlayerQuests/PlayerQuestCompletion.ts | 8 +- .../PlayerQuestCompletions.test.ts | 20 ++++ .../Player/PlayerQuests/PlayerQuests.test.ts | 19 ++++ .../Player/PlayerQuests/PlayerQuests.ts | 2 +- .../Player/PlayerRankPurchase.test.ts | 25 +++++ .../PlayerRewards/PlayerRewards.test.ts | 42 ++++++++ .../PlayerRewardsMonthlyCrate.test.ts | 22 +++++ .../Player/PlayerScorpiusBribe.test.ts | 17 ++++ .../PlayerSeasonalChristmasYear.test.ts | 23 +++++ ...SeasonalChristmasYearAdventRewards.test.ts | 84 ++++++++++++++++ ...layerSeasonalChristmasYearLeveling.test.ts | 12 +++ .../Player/PlayerSocialMedia.test.ts | 24 +++++ src/Structures/Player/PlayerStats.test.ts | 97 +++++++++++++++++++ .../PlayerTourney/PlayerTourney.test.ts | 31 ++++++ .../PlayerTourney/PlayerTourneyData.test.ts | 26 +++++ 32 files changed, 1120 insertions(+), 5 deletions(-) create mode 100644 src/Structures/Player/Player.test.ts create mode 100644 src/Structures/Player/PlayerAchievements/PlayerAchievements.test.ts create mode 100644 src/Structures/Player/PlayerAchievements/PlayerAchievementsRewards.test.ts create mode 100644 src/Structures/Player/PlayerAchievements/PlayerAchievementsTotem.test.ts create mode 100644 src/Structures/Player/PlayerAdventRewards/PlayerAdventRewards.test.ts create mode 100644 src/Structures/Player/PlayerAdventRewards/PlayerAdventRewardsDay.test.ts create mode 100644 src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPet.test.ts create mode 100644 src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPets.test.ts create mode 100644 src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPetsConsumables.test.ts create mode 100644 src/Structures/Player/PlayerCosmetics/PlayerCosmetics.test.ts create mode 100644 src/Structures/Player/PlayerGifting.test.ts create mode 100644 src/Structures/Player/PlayerHousing/PlayerHousing.test.ts create mode 100644 src/Structures/Player/PlayerHousing/PlayerHousingGivenCookies.test.ts create mode 100644 src/Structures/Player/PlayerHousing/PlayerHousingPlayerSettings.test.ts create mode 100644 src/Structures/Player/PlayerParkour.test.ts create mode 100644 src/Structures/Player/PlayerQuests/PlayerQuest.test.ts create mode 100644 src/Structures/Player/PlayerQuests/PlayerQuestCompletion.test.ts create mode 100644 src/Structures/Player/PlayerQuests/PlayerQuestCompletions.test.ts create mode 100644 src/Structures/Player/PlayerQuests/PlayerQuests.test.ts create mode 100644 src/Structures/Player/PlayerRankPurchase.test.ts create mode 100644 src/Structures/Player/PlayerRewards/PlayerRewards.test.ts create mode 100644 src/Structures/Player/PlayerRewards/PlayerRewardsMonthlyCrate.test.ts create mode 100644 src/Structures/Player/PlayerScorpiusBribe.test.ts create mode 100644 src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYear.test.ts create mode 100644 src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYearAdventRewards.test.ts create mode 100644 src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYearLeveling.test.ts create mode 100644 src/Structures/Player/PlayerSocialMedia.test.ts create mode 100644 src/Structures/Player/PlayerStats.test.ts create mode 100644 src/Structures/Player/PlayerTourney/PlayerTourney.test.ts create mode 100644 src/Structures/Player/PlayerTourney/PlayerTourneyData.test.ts diff --git a/src/Structures/Player/Player.test.ts b/src/Structures/Player/Player.test.ts new file mode 100644 index 000000000..eecac6106 --- /dev/null +++ b/src/Structures/Player/Player.test.ts @@ -0,0 +1,97 @@ +import Player from './Player.js'; +import PlayerCosmetics from './PlayerCosmetics/PlayerCosmetics.js'; +import PlayerGifting from './PlayerGifting.js'; +import PlayerHousing from './PlayerHousing/PlayerHousing.js'; +import PlayerQuests from './PlayerQuests/PlayerQuests.js'; +import PlayerRankPurchase from './PlayerRankPurchase.js'; +import PlayerRewards from './PlayerRewards/PlayerRewards.js'; +import PlayerSocialMedia from './PlayerSocialMedia.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type Guild from '../Guild/Guild.js'; +import type House from '../House.js'; +import type PlayerAchievements from './PlayerAchievements/PlayerAchievements.js'; +import type PlayerAdventRewards from './PlayerAdventRewards/PlayerAdventRewards.js'; +import type PlayerParkour from './PlayerParkour.js'; +import type PlayerScorpiusBribe from './PlayerScorpiusBribe.js'; +import type PlayerStats from './PlayerStats.js'; +import type RecentGame from '../RecentGame.js'; +import type { ChatChannel, Language, LevelProgress, PlayerRank } from '../../Types/Player.js'; + +test('Player', () => { + const data = new Player({ stats: 'meow' }, { guild: null, houses: null, recentGames: null }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Player); + expectTypeOf(data).toEqualTypeOf(); + expect(data.nickname).toBeDefined(); + expectTypeOf(data.nickname).toEqualTypeOf(); + expect(data.uuid).toBeDefined(); + expectTypeOf(data.uuid).toEqualTypeOf(); + expect(data.rank).toBeDefined(); + expect(data.rank).toBeNull(); + expectTypeOf(data.rank).toEqualTypeOf(); + expect(data.firstLoginAt).toBeDefined(); + expect(data.firstLoginAt).toBeNull(); + expectTypeOf(data.firstLoginAt).toEqualTypeOf(); + expect(data.lastLoginAt).toBeDefined(); + expect(data.lastLoginAt).toBeNull(); + expectTypeOf(data.lastLoginAt).toEqualTypeOf(); + expect(data.lastLogoutAt).toBeDefined(); + expect(data.lastLogoutAt).toBeNull(); + expectTypeOf(data.lastLogoutAt).toEqualTypeOf(); + expect(data.achievements).toBeDefined(); + expectTypeOf(data.achievements).toEqualTypeOf(); + expect(data.karma).toBeDefined(); + expect(data.karma).toBeGreaterThanOrEqual(0); + expectTypeOf(data.karma).toEqualTypeOf(); + expect(data.stats).toBeDefined(); + expectTypeOf(data.stats).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.claimedCenturyCakeAt).toBeDefined(); + expect(data.claimedCenturyCakeAt).toBeNull(); + expectTypeOf(data.claimedCenturyCakeAt).toEqualTypeOf(); + expect(data.language).toBeDefined(); + expectTypeOf(data.language).toEqualTypeOf(); + expect(data.cosmetics).toBeDefined(); + expect(data.cosmetics).toBeInstanceOf(PlayerCosmetics); + expectTypeOf(data.cosmetics).toEqualTypeOf(); + expect(data.rankPurchase).toBeDefined(); + expect(data.rankPurchase).toBeInstanceOf(PlayerRankPurchase); + expectTypeOf(data.rankPurchase).toEqualTypeOf(); + expect(data.challenges).toBeDefined(); + expectTypeOf(data.challenges).toEqualTypeOf>>(); + expect(data.quests).toBeDefined(); + expect(data.quests).toBeInstanceOf(PlayerQuests); + expectTypeOf(data.quests).toEqualTypeOf(); + expect(data.rewards).toBeDefined(); + expect(data.rewards).toBeInstanceOf(PlayerRewards); + expectTypeOf(data.rewards).toEqualTypeOf(); + expect(data.parkour).toBeDefined(); + expectTypeOf(data.parkour).toEqualTypeOf(); + expect(data.channel).toBeDefined(); + expectTypeOf(data.channel).toEqualTypeOf(); + expect(data.skyBlockFreeCookieAt).toBeDefined(); + expectTypeOf(data.skyBlockFreeCookieAt).toEqualTypeOf(); + expect(data.housing).toBeDefined(); + expect(data.housing).toBeInstanceOf(PlayerHousing); + expectTypeOf(data.housing).toEqualTypeOf(); + expect(data.adventRewards).toBeDefined(); + expectTypeOf(data.adventRewards).toEqualTypeOf(); + expect(data.gifting).toBeDefined(); + expect(data.gifting).toBeInstanceOf(PlayerGifting); + expectTypeOf(data.gifting).toEqualTypeOf(); + expect(data.socialMedia).toBeDefined(); + expect(data.socialMedia).toBeInstanceOf(PlayerSocialMedia); + expectTypeOf(data.socialMedia).toEqualTypeOf(); + expect(data.scorpiusBribes).toBeDefined(); + expectTypeOf(data.scorpiusBribes).toEqualTypeOf(); + expect(data.guild).toBeDefined(); + expect(data.guild).toBeNull(); + expectTypeOf(data.guild).toEqualTypeOf(); + expect(data.houses).toBeDefined(); + expect(data.houses).toBeNull(); + expectTypeOf(data.houses).toEqualTypeOf(); + expect(data.recentGames).toBeDefined(); + expect(data.recentGames).toBeNull(); + expectTypeOf(data.recentGames).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerAchievements/PlayerAchievements.test.ts b/src/Structures/Player/PlayerAchievements/PlayerAchievements.test.ts new file mode 100644 index 000000000..a24b52848 --- /dev/null +++ b/src/Structures/Player/PlayerAchievements/PlayerAchievements.test.ts @@ -0,0 +1,28 @@ +import PlayerAchievements from './PlayerAchievements.js'; +import PlayerAchievementsRewards from './PlayerAchievementsRewards.js'; +import PlayerAchievementsTotem from './PlayerAchievementsTotem.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { PlayerAchievementsOneTimeSort } from '../../../Types/Player.js'; + +test('PlayerAchievements', () => { + const data = new PlayerAchievements({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerAchievements); + expectTypeOf(data).toEqualTypeOf(); + expect(data.points).toBeDefined(); + expectTypeOf(data.points).toEqualTypeOf(); + expect(data.rewards).toBeDefined(); + expect(data.rewards).toBeInstanceOf(PlayerAchievementsRewards); + expectTypeOf(data.rewards).toEqualTypeOf(); + expect(data.tracking).toBeDefined(); + expectTypeOf(data.tracking).toEqualTypeOf(); + expect(data.achievements).toBeDefined(); + expectTypeOf(data.achievements).toEqualTypeOf>(); + expect(data.oneTime).toBeDefined(); + expectTypeOf(data.oneTime).toEqualTypeOf(); + expect(data.oneTimeAchievementMenuSort).toBeDefined(); + expectTypeOf(data.oneTimeAchievementMenuSort).toEqualTypeOf(); + expect(data.totem).toBeDefined(); + expect(data.totem).toBeInstanceOf(PlayerAchievementsTotem); + expectTypeOf(data.totem).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerAchievements/PlayerAchievementsRewards.test.ts b/src/Structures/Player/PlayerAchievements/PlayerAchievementsRewards.test.ts new file mode 100644 index 000000000..902e500a0 --- /dev/null +++ b/src/Structures/Player/PlayerAchievements/PlayerAchievementsRewards.test.ts @@ -0,0 +1,9 @@ +import PlayerAchievementsRewards from './PlayerAchievementsRewards.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerAchievementsRewards', () => { + const data = new PlayerAchievementsRewards({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerAchievementsRewards); + expectTypeOf(data).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerAchievements/PlayerAchievementsTotem.test.ts b/src/Structures/Player/PlayerAchievements/PlayerAchievementsTotem.test.ts new file mode 100644 index 000000000..452657fd2 --- /dev/null +++ b/src/Structures/Player/PlayerAchievements/PlayerAchievementsTotem.test.ts @@ -0,0 +1,31 @@ +import PlayerAchievementsTotem from './PlayerAchievementsTotem.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { PlayerAchievementsTotemColors, PlayerAchievementsTotemParts } from '../../../Types/Player.ts'; + +test('PlayerAchievementsTotem', () => { + const data = new PlayerAchievementsTotem({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerAchievementsTotem); + expectTypeOf(data).toEqualTypeOf(); + expect(data.canCustomize).toBeDefined(); + expectTypeOf(data.canCustomize).toEqualTypeOf(); + expect(data.allowedMaxHeight).toBeDefined(); + expect(data.allowedMaxHeight).toBeGreaterThanOrEqual(0); + expectTypeOf(data.allowedMaxHeight).toEqualTypeOf(); + expect(data.unlockedParts).toBeDefined(); + data.unlockedParts.forEach((unlockedPart) => { + expect(unlockedPart).toBeDefined(); + expectTypeOf(unlockedPart).toEqualTypeOf(); + }); + expectTypeOf(data.unlockedParts).toEqualTypeOf(); + expect(data.selectedParts).toBeDefined(); + expectTypeOf(data.selectedParts).toEqualTypeOf>(); + expect(data.unlockedColors).toBeDefined(); + data.unlockedColors.forEach((unlockedColor) => { + expect(unlockedColor).toBeDefined(); + expectTypeOf(unlockedColor).toEqualTypeOf(); + }); + expectTypeOf(data.unlockedColors).toEqualTypeOf(); + expect(data.selectedColors).toBeDefined(); + expectTypeOf(data.selectedColors).toEqualTypeOf>(); +}); diff --git a/src/Structures/Player/PlayerAdventRewards/PlayerAdventRewards.test.ts b/src/Structures/Player/PlayerAdventRewards/PlayerAdventRewards.test.ts new file mode 100644 index 000000000..50e94200c --- /dev/null +++ b/src/Structures/Player/PlayerAdventRewards/PlayerAdventRewards.test.ts @@ -0,0 +1,87 @@ +import PlayerAdventRewards from './PlayerAdventRewards.js'; +import PlayerAdventRewardsDay from './PlayerAdventRewardsDay.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerAdventRewards', () => { + const data = new PlayerAdventRewards({ stats: 'meow' }, '2000'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerAdventRewards); + expectTypeOf(data).toEqualTypeOf(); + expect(data.year).toBeDefined(); + expectTypeOf(data.year).toEqualTypeOf(); + expect(data.day1).toBeDefined(); + expect(data.day1).toBeInstanceOf(PlayerAdventRewardsDay); + expectTypeOf(data.day1).toEqualTypeOf(); + expect(data.day2).toBeDefined(); + expect(data.day2).toBeInstanceOf(PlayerAdventRewardsDay); + expectTypeOf(data.day2).toEqualTypeOf(); + expect(data.day3).toBeDefined(); + expect(data.day3).toBeInstanceOf(PlayerAdventRewardsDay); + expectTypeOf(data.day3).toEqualTypeOf(); + expect(data.day4).toBeDefined(); + expect(data.day4).toBeInstanceOf(PlayerAdventRewardsDay); + expectTypeOf(data.day4).toEqualTypeOf(); + expect(data.day5).toBeDefined(); + expect(data.day5).toBeInstanceOf(PlayerAdventRewardsDay); + expectTypeOf(data.day5).toEqualTypeOf(); + expect(data.day6).toBeDefined(); + expect(data.day6).toBeInstanceOf(PlayerAdventRewardsDay); + expectTypeOf(data.day6).toEqualTypeOf(); + expect(data.day7).toBeDefined(); + expect(data.day7).toBeInstanceOf(PlayerAdventRewardsDay); + expectTypeOf(data.day7).toEqualTypeOf(); + expect(data.day8).toBeDefined(); + expect(data.day8).toBeInstanceOf(PlayerAdventRewardsDay); + expectTypeOf(data.day8).toEqualTypeOf(); + expect(data.day9).toBeDefined(); + expect(data.day9).toBeInstanceOf(PlayerAdventRewardsDay); + expectTypeOf(data.day9).toEqualTypeOf(); + expect(data.day10).toBeDefined(); + expect(data.day10).toBeInstanceOf(PlayerAdventRewardsDay); + expectTypeOf(data.day10).toEqualTypeOf(); + expect(data.day11).toBeDefined(); + expect(data.day11).toBeInstanceOf(PlayerAdventRewardsDay); + expectTypeOf(data.day11).toEqualTypeOf(); + expect(data.day12).toBeDefined(); + expect(data.day12).toBeInstanceOf(PlayerAdventRewardsDay); + expectTypeOf(data.day12).toEqualTypeOf(); + expect(data.day13).toBeDefined(); + expect(data.day13).toBeInstanceOf(PlayerAdventRewardsDay); + expectTypeOf(data.day13).toEqualTypeOf(); + expect(data.day14).toBeDefined(); + expect(data.day14).toBeInstanceOf(PlayerAdventRewardsDay); + expectTypeOf(data.day14).toEqualTypeOf(); + expect(data.day15).toBeDefined(); + expect(data.day15).toBeInstanceOf(PlayerAdventRewardsDay); + expectTypeOf(data.day15).toEqualTypeOf(); + expect(data.day16).toBeDefined(); + expect(data.day16).toBeInstanceOf(PlayerAdventRewardsDay); + expectTypeOf(data.day16).toEqualTypeOf(); + expect(data.day17).toBeDefined(); + expect(data.day17).toBeInstanceOf(PlayerAdventRewardsDay); + expectTypeOf(data.day17).toEqualTypeOf(); + expect(data.day18).toBeDefined(); + expect(data.day18).toBeInstanceOf(PlayerAdventRewardsDay); + expectTypeOf(data.day18).toEqualTypeOf(); + expect(data.day19).toBeDefined(); + expect(data.day19).toBeInstanceOf(PlayerAdventRewardsDay); + expectTypeOf(data.day19).toEqualTypeOf(); + expect(data.day20).toBeDefined(); + expect(data.day20).toBeInstanceOf(PlayerAdventRewardsDay); + expectTypeOf(data.day20).toEqualTypeOf(); + expect(data.day21).toBeDefined(); + expect(data.day21).toBeInstanceOf(PlayerAdventRewardsDay); + expectTypeOf(data.day21).toEqualTypeOf(); + expect(data.day22).toBeDefined(); + expect(data.day22).toBeInstanceOf(PlayerAdventRewardsDay); + expectTypeOf(data.day22).toEqualTypeOf(); + expect(data.day23).toBeDefined(); + expect(data.day23).toBeInstanceOf(PlayerAdventRewardsDay); + expectTypeOf(data.day23).toEqualTypeOf(); + expect(data.day24).toBeDefined(); + expect(data.day24).toBeInstanceOf(PlayerAdventRewardsDay); + expectTypeOf(data.day24).toEqualTypeOf(); + expect(data.day25).toBeDefined(); + expect(data.day25).toBeInstanceOf(PlayerAdventRewardsDay); + expectTypeOf(data.day25).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerAdventRewards/PlayerAdventRewardsDay.test.ts b/src/Structures/Player/PlayerAdventRewards/PlayerAdventRewardsDay.test.ts new file mode 100644 index 000000000..eb774eb3e --- /dev/null +++ b/src/Structures/Player/PlayerAdventRewards/PlayerAdventRewardsDay.test.ts @@ -0,0 +1,17 @@ +import PlayerAdventRewardsDay from './PlayerAdventRewardsDay.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerAdventRewardsDay', () => { + const data = new PlayerAdventRewardsDay({ stats: 'meow' }, 'meow'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerAdventRewardsDay); + expectTypeOf(data).toEqualTypeOf(); + expect(data.day).toBeDefined(); + expectTypeOf(data.day).toEqualTypeOf(); + expect(data.claimed).toBeDefined(); + expectTypeOf(data.claimed).toEqualTypeOf(); + expect(data.claimedTimestamp).toBeDefined(); + expectTypeOf(data.claimedTimestamp).toEqualTypeOf(); + expect(data.claimedAt).toBeDefined(); + expectTypeOf(data.claimedAt).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPet.test.ts b/src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPet.test.ts new file mode 100644 index 000000000..4de59607c --- /dev/null +++ b/src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPet.test.ts @@ -0,0 +1,42 @@ +import PlayerCosmeticsPet from './PlayerCosmeticsPet.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { PlayerCosmeticsPetName } from '../../../../Types/Player.js'; + +test('PlayerCosmeticsPet', () => { + const data = new PlayerCosmeticsPet('meow', { stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerCosmeticsPet); + expectTypeOf(data).toEqualTypeOf(); + expect(data.isFavorite).toBeDefined(); + expectTypeOf(data.isFavorite).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.active).toBeDefined(); + expectTypeOf(data.active).toEqualTypeOf(); + expect(data.hunger).toBeDefined(); + expect(data.hunger).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hunger).toEqualTypeOf(); + expect(data.lastFed).toBeDefined(); + expectTypeOf(data.lastFed).toEqualTypeOf(); + expect(data.lastFedAt).toBeDefined(); + expectTypeOf(data.lastFedAt).toEqualTypeOf(); + expect(data.thirst).toBeDefined(); + expect(data.thirst).toBeGreaterThanOrEqual(0); + expectTypeOf(data.thirst).toEqualTypeOf(); + expect(data.lastDrank).toBeDefined(); + expectTypeOf(data.lastDrank).toEqualTypeOf(); + expect(data.lastDrankAt).toBeDefined(); + expectTypeOf(data.lastDrankAt).toEqualTypeOf(); + expect(data.exercise).toBeDefined(); + expect(data.exercise).toBeGreaterThanOrEqual(0); + expectTypeOf(data.exercise).toEqualTypeOf(); + expect(data.lastExercised).toBeDefined(); + expectTypeOf(data.lastExercised).toEqualTypeOf(); + expect(data.lastExercisedAt).toBeDefined(); + expectTypeOf(data.lastExercisedAt).toEqualTypeOf(); + expect(data.nickname).toBeDefined(); + expectTypeOf(data.nickname).toEqualTypeOf(); + expect(data.experience).toBeDefined(); + expect(data.experience).toBeGreaterThanOrEqual(0); + expectTypeOf(data.experience).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPets.test.ts b/src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPets.test.ts new file mode 100644 index 000000000..13b830610 --- /dev/null +++ b/src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPets.test.ts @@ -0,0 +1,24 @@ +import PlayerCosmeticsPet from './PlayerCosmeticsPet.js'; +import PlayerCosmeticsPets from './PlayerCosmeticsPets.js'; +import PlayerCosmeticsPetsConsumables from './PlayerCosmeticsPetsConsumables.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerCosmeticsPets', () => { + const data = new PlayerCosmeticsPets({ stats: 'meow' }, ['meow']); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerCosmeticsPets); + expectTypeOf(data).toEqualTypeOf(); + expect(data.lastJourney).toBeDefined(); + expectTypeOf(data.lastJourney).toEqualTypeOf(); + expect(data.lastJourneyAt).toBeDefined(); + expectTypeOf(data.lastJourneyAt).toEqualTypeOf(); + expect(data.consumables).toBeDefined(); + expect(data.consumables).toBeInstanceOf(PlayerCosmeticsPetsConsumables); + expectTypeOf(data.consumables).toEqualTypeOf(); + expect(data.pets).toBeDefined(); + data.pets.forEach((pet) => { + expect(pet).toBeDefined(); + expectTypeOf(pet).toEqualTypeOf(); + }); + expectTypeOf(data.pets).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPetsConsumables.test.ts b/src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPetsConsumables.test.ts new file mode 100644 index 000000000..7802a1bc1 --- /dev/null +++ b/src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPetsConsumables.test.ts @@ -0,0 +1,90 @@ +import PlayerCosmeticsPetsConsumables from './PlayerCosmeticsPetsConsumables.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerCosmeticsPetsConsumables', () => { + const data = new PlayerCosmeticsPetsConsumables({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerCosmeticsPetsConsumables); + expectTypeOf(data).toEqualTypeOf(); + expect(data.cake).toBeDefined(); + expect(data.cake).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cake).toEqualTypeOf(); + expect(data.cookie).toBeDefined(); + expect(data.cookie).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cookie).toEqualTypeOf(); + expect(data.feather).toBeDefined(); + expect(data.feather).toBeGreaterThanOrEqual(0); + expectTypeOf(data.feather).toEqualTypeOf(); + expect(data.goldRecord).toBeDefined(); + expect(data.goldRecord).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goldRecord).toEqualTypeOf(); + expect(data.hayBlock).toBeDefined(); + expect(data.hayBlock).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hayBlock).toEqualTypeOf(); + expect(data.lavaBucket).toBeDefined(); + expect(data.lavaBucket).toBeGreaterThanOrEqual(0); + expectTypeOf(data.lavaBucket).toEqualTypeOf(); + expect(data.leash).toBeDefined(); + expect(data.leash).toBeGreaterThanOrEqual(0); + expectTypeOf(data.leash).toEqualTypeOf(); + expect(data.magmaCream).toBeDefined(); + expect(data.magmaCream).toBeGreaterThanOrEqual(0); + expectTypeOf(data.magmaCream).toEqualTypeOf(); + expect(data.melon).toBeDefined(); + expect(data.melon).toBeGreaterThanOrEqual(0); + expectTypeOf(data.melon).toEqualTypeOf(); + expect(data.milkBucket).toBeDefined(); + expect(data.milkBucket).toBeGreaterThanOrEqual(0); + expectTypeOf(data.milkBucket).toEqualTypeOf(); + expect(data.mushroomSoup).toBeDefined(); + expect(data.mushroomSoup).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mushroomSoup).toEqualTypeOf(); + expect(data.pork).toBeDefined(); + expect(data.pork).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pork).toEqualTypeOf(); + expect(data.pumpkinPie).toBeDefined(); + expect(data.pumpkinPie).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pumpkinPie).toEqualTypeOf(); + expect(data.rawFish).toBeDefined(); + expect(data.rawFish).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rawFish).toEqualTypeOf(); + expect(data.slimeBall).toBeDefined(); + expect(data.slimeBall).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slimeBall).toEqualTypeOf(); + expect(data.stick).toBeDefined(); + expect(data.stick).toBeGreaterThanOrEqual(0); + expectTypeOf(data.stick).toEqualTypeOf(); + expect(data.waterBucket).toBeDefined(); + expect(data.waterBucket).toBeGreaterThanOrEqual(0); + expectTypeOf(data.waterBucket).toEqualTypeOf(); + expect(data.woodSword).toBeDefined(); + expect(data.woodSword).toBeGreaterThanOrEqual(0); + expectTypeOf(data.woodSword).toEqualTypeOf(); + expect(data.apple).toBeDefined(); + expect(data.apple).toBeGreaterThanOrEqual(0); + expectTypeOf(data.apple).toEqualTypeOf(); + expect(data.bakedPotato).toBeDefined(); + expect(data.bakedPotato).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bakedPotato).toEqualTypeOf(); + expect(data.cookedBeef).toBeDefined(); + expect(data.cookedBeef).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cookedBeef).toEqualTypeOf(); + expect(data.redRose).toBeDefined(); + expect(data.redRose).toBeGreaterThanOrEqual(0); + expectTypeOf(data.redRose).toEqualTypeOf(); + expect(data.wheat).toBeDefined(); + expect(data.wheat).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wheat).toEqualTypeOf(); + expect(data.bread).toBeDefined(); + expect(data.bread).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bread).toEqualTypeOf(); + expect(data.carrot).toBeDefined(); + expect(data.carrot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.carrot).toEqualTypeOf(); + expect(data.rottenFlesh).toBeDefined(); + expect(data.rottenFlesh).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rottenFlesh).toEqualTypeOf(); + expect(data.bone).toBeDefined(); + expect(data.bone).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bone).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerCosmetics/PlayerCosmetics.test.ts b/src/Structures/Player/PlayerCosmetics/PlayerCosmetics.test.ts new file mode 100644 index 000000000..c62ab9202 --- /dev/null +++ b/src/Structures/Player/PlayerCosmetics/PlayerCosmetics.test.ts @@ -0,0 +1,91 @@ +import Color from '../../Color.js'; +import PlayerCosmetics from './PlayerCosmetics.js'; +import PlayerCosmeticsPets from './Pets/PlayerCosmeticsPets.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { + PlayerCosmeticsClickEffects, + PlayerCosmeticsCloak, + PlayerCosmeticsGadget, + PlayerCosmeticsHat, + PlayerCosmeticsMorph, + PlayerCosmeticsParticlePack, + PlayerCosmeticsRankColor, + PlayerCosmeticsSuit, + PlayerCosmeticsTaunt +} from '../../../Types/Player.js'; +import type { SortName } from '../../../Types/Global.js'; + +test('PlayerCosmetics', () => { + const data = new PlayerCosmetics({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerCosmetics); + expectTypeOf(data).toEqualTypeOf(); + expect(data.menuSort).toBeDefined(); + expectTypeOf(data.menuSort).toEqualTypeOf(); + expect(data.rankPlusColor).toBeDefined(); + expectTypeOf(data.rankPlusColor).toEqualTypeOf(); + expect(data.monthlyRankColor).toBeDefined(); + expectTypeOf(data.monthlyRankColor).toEqualTypeOf(); + expect(data.cosmetics).toBeDefined(); + expectTypeOf(data.cosmetics).toEqualTypeOf(); + expect(data.pets).toBeDefined(); + expectTypeOf(data.pets).toEqualTypeOf(); + expect(data.unlockedSuits).toBeDefined(); + data.unlockedSuits.forEach((unlockedSuit) => { + expect(unlockedSuit).toBeDefined(); + expectTypeOf(unlockedSuit).toEqualTypeOf(); + }); + expectTypeOf(data.unlockedSuits).toEqualTypeOf(); + expect(data.unlockedHats).toBeDefined(); + data.unlockedHats.forEach((unlockedHat) => { + expect(unlockedHat).toBeDefined(); + expectTypeOf(unlockedHat).toEqualTypeOf(); + }); + expectTypeOf(data.unlockedHats).toEqualTypeOf(); + expect(data.selectedGadget).toBeDefined(); + expectTypeOf(data.selectedGadget).toEqualTypeOf(); + expect(data.unlockedGadgets).toBeDefined(); + data.unlockedGadgets.forEach((unlockedGadget) => { + expect(unlockedGadget).toBeDefined(); + expectTypeOf(unlockedGadget).toEqualTypeOf(); + }); + expectTypeOf(data.unlockedGadgets).toEqualTypeOf(); + expect(data.unlockedMorphs).toBeDefined(); + data.unlockedMorphs.forEach((unlockedMorph) => { + expect(unlockedMorph).toBeDefined(); + expectTypeOf(unlockedMorph).toEqualTypeOf(); + }); + expectTypeOf(data.unlockedMorphs).toEqualTypeOf(); + expect(data.unlockedCloaks).toBeDefined(); + data.unlockedCloaks.forEach((unlockedCloak) => { + expect(unlockedCloak).toBeDefined(); + expectTypeOf(unlockedCloak).toEqualTypeOf(); + }); + expectTypeOf(data.unlockedCloaks).toEqualTypeOf(); + expect(data.unlockedTaunts).toBeDefined(); + data.unlockedTaunts.forEach((unlockedTaunt) => { + expect(unlockedTaunt).toBeDefined(); + expectTypeOf(unlockedTaunt).toEqualTypeOf(); + }); + expectTypeOf(data.unlockedTaunts).toEqualTypeOf(); + expect(data.unlockedRankColors).toBeDefined(); + data.unlockedRankColors.forEach((unlockedRankColor) => { + expect(unlockedRankColor).toBeDefined(); + expectTypeOf(unlockedRankColor).toEqualTypeOf(); + }); + expectTypeOf(data.unlockedRankColors).toEqualTypeOf(); + expect(data.selectedParticlePack).toBeDefined(); + expectTypeOf(data.selectedParticlePack).toEqualTypeOf(); + expect(data.unlockedParticlePacks).toBeDefined(); + data.unlockedParticlePacks.forEach((unlockedParticlePack) => { + expect(unlockedParticlePack).toBeDefined(); + expectTypeOf(unlockedParticlePack).toEqualTypeOf(); + }); + expectTypeOf(data.unlockedParticlePacks).toEqualTypeOf(); + expect(data.unlockedClickEffects).toBeDefined(); + data.unlockedClickEffects.forEach((unlockedClickEffect) => { + expect(unlockedClickEffect).toBeDefined(); + expectTypeOf(unlockedClickEffect).toEqualTypeOf(); + }); + expectTypeOf(data.unlockedClickEffects).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerGifting.test.ts b/src/Structures/Player/PlayerGifting.test.ts new file mode 100644 index 000000000..d1af5a5d3 --- /dev/null +++ b/src/Structures/Player/PlayerGifting.test.ts @@ -0,0 +1,31 @@ +import PlayerGifting from './PlayerGifting.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerGifting', () => { + const data = new PlayerGifting({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerGifting); + expectTypeOf(data).toEqualTypeOf(); + expect(data.bundlesReceived).toBeDefined(); + expect(data.bundlesReceived).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bundlesReceived).toEqualTypeOf(); + expect(data.bundlesGiven).toBeDefined(); + expect(data.bundlesGiven).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bundlesGiven).toEqualTypeOf(); + expect(data.milestones).toBeDefined(); + data.milestones.forEach((milestone) => { + expect(milestone).toBeDefined(); + }); + expectTypeOf(data.milestones).toEqualTypeOf(); + expect(data.giftsGiven).toBeDefined(); + expect(data.giftsGiven).toBeGreaterThanOrEqual(0); + expectTypeOf(data.giftsGiven).toEqualTypeOf(); + expect(data.ranksGiven).toBeDefined(); + expect(data.ranksGiven).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ranksGiven).toEqualTypeOf(); + expect(data.ranksGivenMilestones).toBeDefined(); + data.ranksGivenMilestones.forEach((ranksGivenMilestone) => { + expect(ranksGivenMilestone).toBeDefined(); + }); + expectTypeOf(data.ranksGivenMilestones).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerHousing/PlayerHousing.test.ts b/src/Structures/Player/PlayerHousing/PlayerHousing.test.ts new file mode 100644 index 000000000..02c5c8da6 --- /dev/null +++ b/src/Structures/Player/PlayerHousing/PlayerHousing.test.ts @@ -0,0 +1,34 @@ +import PlayerHousing from './PlayerHousing.js'; +import PlayerHousingGivenCookies from './PlayerHousingGivenCookies.js'; +import PlayerHousingPlayerSettings from './PlayerHousingPlayerSettings.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { PlayerHousingPlotSize, PlayerHousingTutorialStage } from '../../../Types/Player.js'; + +test('PlayerHousing', () => { + const data = new PlayerHousing({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerHousing); + expectTypeOf(data).toEqualTypeOf(); + expect(data.allowedBlocks).toBeDefined(); + expectTypeOf(data.allowedBlocks).toEqualTypeOf(); + expect(data.packages).toBeDefined(); + expectTypeOf(data.packages).toEqualTypeOf(); + expect(data.tutorialStage).toBeDefined(); + expectTypeOf(data.tutorialStage).toEqualTypeOf(); + expect(data.firstHouseJoinTimestamp).toBeDefined(); + expectTypeOf(data.firstHouseJoinTimestamp).toEqualTypeOf(); + expect(data.firstHouseJoinAt).toBeDefined(); + expectTypeOf(data.firstHouseJoinAt).toEqualTypeOf(); + expect(data.plotSize).toBeDefined(); + expectTypeOf(data.plotSize).toEqualTypeOf(); + expect(data.playerSettings).toBeDefined(); + expect(data.playerSettings).toBeInstanceOf(PlayerHousingPlayerSettings); + expectTypeOf(data.playerSettings).toEqualTypeOf(); + expect(data.givenCookies).toBeDefined(); + data.givenCookies.forEach((cookie) => { + expect(cookie).toBeDefined(); + expect(cookie).toBeInstanceOf(PlayerHousingGivenCookies); + expectTypeOf(cookie).toEqualTypeOf(); + }); + expectTypeOf(data.givenCookies).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerHousing/PlayerHousingGivenCookies.test.ts b/src/Structures/Player/PlayerHousing/PlayerHousingGivenCookies.test.ts new file mode 100644 index 000000000..e6f0834c1 --- /dev/null +++ b/src/Structures/Player/PlayerHousing/PlayerHousingGivenCookies.test.ts @@ -0,0 +1,13 @@ +import PlayerHousingGivenCookies from './PlayerHousingGivenCookies.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerHousingGivenCookies', () => { + const data = new PlayerHousingGivenCookies('meow', ['meow']); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerHousingGivenCookies); + expectTypeOf(data).toEqualTypeOf(); + expect(data.date).toBeDefined(); + expectTypeOf(data.date).toEqualTypeOf(); + expect(data.houses).toBeDefined(); + expectTypeOf(data.houses).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerHousing/PlayerHousingPlayerSettings.test.ts b/src/Structures/Player/PlayerHousing/PlayerHousingPlayerSettings.test.ts new file mode 100644 index 000000000..2bbb74f96 --- /dev/null +++ b/src/Structures/Player/PlayerHousing/PlayerHousingPlayerSettings.test.ts @@ -0,0 +1,24 @@ +import PlayerHousingPlayerSettings from './PlayerHousingPlayerSettings.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { PlayerHousingSettingsTextInputType } from '../../../Types/Player.js'; + +test('PlayerHousingPlayerSettings', () => { + const data = new PlayerHousingPlayerSettings({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerHousingPlayerSettings); + expectTypeOf(data).toEqualTypeOf(); + expect(data.playerVisibility).toBeDefined(); + expectTypeOf(data.playerVisibility).toEqualTypeOf(); + expect(data.showBorder).toBeDefined(); + expectTypeOf(data.showBorder).toEqualTypeOf(); + expect(data.playJukeboxMusic).toBeDefined(); + expectTypeOf(data.playJukeboxMusic).toEqualTypeOf(); + expect(data.showTips).toBeDefined(); + expectTypeOf(data.showTips).toEqualTypeOf(); + expect(data.showProToolsParticles).toBeDefined(); + expectTypeOf(data.showProToolsParticles).toEqualTypeOf(); + expect(data.showHousingPlusPrefix).toBeDefined(); + expectTypeOf(data.showHousingPlusPrefix).toEqualTypeOf(); + expect(data.textInputType).toBeDefined(); + expectTypeOf(data.textInputType).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerParkour.test.ts b/src/Structures/Player/PlayerParkour.test.ts new file mode 100644 index 000000000..7def3e967 --- /dev/null +++ b/src/Structures/Player/PlayerParkour.test.ts @@ -0,0 +1,24 @@ +import PlayerParkour from './PlayerParkour.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerParkour', () => { + const data = new PlayerParkour({ stats: 'meow' }, { stats: 'meow' }, 'meow'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerParkour); + expectTypeOf(data).toEqualTypeOf(); + expect(data.location).toBeDefined(); + expect(data.location).toBe('meow'); + expectTypeOf(data.location).toEqualTypeOf(); + expect(data.timeStart).toBeDefined(); + expect(data.timeStart).toBeGreaterThanOrEqual(0); + expectTypeOf(data.timeStart).toEqualTypeOf(); + expect(data.timeTook).toBeDefined(); + expect(data.timeTook).toBeGreaterThanOrEqual(0); + expectTypeOf(data.timeTook).toEqualTypeOf(); + expect(data.checkPoints).toBeDefined(); + expectTypeOf(data.checkPoints).toEqualTypeOf(); + data.checkPoints.forEach((checkPoint) => { + expect(checkPoint).toBeDefined(); + expect(checkPoint).toBeGreaterThanOrEqual(0); + }); +}); diff --git a/src/Structures/Player/PlayerQuests/PlayerQuest.test.ts b/src/Structures/Player/PlayerQuests/PlayerQuest.test.ts new file mode 100644 index 000000000..14f662418 --- /dev/null +++ b/src/Structures/Player/PlayerQuests/PlayerQuest.test.ts @@ -0,0 +1,16 @@ +import PlayerQuest from './PlayerQuest.js'; +import PlayerQuestCompletions from './PlayerQuestCompletions.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerQuest', () => { + const data = new PlayerQuest({ stats: 'meow' }, 'meow'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerQuest); + expectTypeOf(data).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expect(data.name).toBe('meow'); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.completions).toBeDefined(); + expect(data.completions).toBeInstanceOf(PlayerQuestCompletions); + expectTypeOf(data.completions).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerQuests/PlayerQuestCompletion.test.ts b/src/Structures/Player/PlayerQuests/PlayerQuestCompletion.test.ts new file mode 100644 index 000000000..5d3e8672e --- /dev/null +++ b/src/Structures/Player/PlayerQuests/PlayerQuestCompletion.test.ts @@ -0,0 +1,15 @@ +import PlayerQuestCompletion from './PlayerQuestCompletion.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerQuestCompletion', () => { + const data = new PlayerQuestCompletion({ stats: 0 }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerQuestCompletion); + expectTypeOf(data).toEqualTypeOf(); + expect(data.amount).toBeDefined(); + expectTypeOf(data.amount).toEqualTypeOf(); + expect(data.timestamp).toBeDefined(); + expectTypeOf(data.timestamp).toEqualTypeOf(); + expect(data.timestampAt).toBeDefined(); + expectTypeOf(data.timestampAt).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerQuests/PlayerQuestCompletion.ts b/src/Structures/Player/PlayerQuests/PlayerQuestCompletion.ts index 94508be72..d477ba924 100644 --- a/src/Structures/Player/PlayerQuests/PlayerQuestCompletion.ts +++ b/src/Structures/Player/PlayerQuests/PlayerQuestCompletion.ts @@ -1,11 +1,11 @@ class PlayerQuestCompletion { amount: number; - timestamp: number; - timestampAt: Date; + timestamp: number | null; + timestampAt: Date | null; constructor(data: Record) { this.amount = data.length || 0; - this.timestamp = data?.time || 0; - this.timestampAt = new Date(this.timestamp); + this.timestamp = data?.time ? data.time : null; + this.timestampAt = this.timestamp ? new Date(this.timestamp) : null; } } diff --git a/src/Structures/Player/PlayerQuests/PlayerQuestCompletions.test.ts b/src/Structures/Player/PlayerQuests/PlayerQuestCompletions.test.ts new file mode 100644 index 000000000..3293e0546 --- /dev/null +++ b/src/Structures/Player/PlayerQuests/PlayerQuestCompletions.test.ts @@ -0,0 +1,20 @@ +import PlayerQuestCompletion from './PlayerQuestCompletion.js'; +import PlayerQuestCompletions from './PlayerQuestCompletions.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerQuestCompletions', () => { + const data = new PlayerQuestCompletions([{ stats: 0 }]); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerQuestCompletions); + expectTypeOf(data).toEqualTypeOf(); + expect(data.amount).toBeDefined(); + expect(data.amount).toBeGreaterThanOrEqual(0); + expectTypeOf(data.amount).toEqualTypeOf(); + expect(data.completions).toBeDefined(); + data.completions.forEach((completion) => { + expect(completion).toBeDefined(); + expect(completion).toBeInstanceOf(PlayerQuestCompletion); + expectTypeOf(completion).toEqualTypeOf(); + }); + expectTypeOf(data.completions).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerQuests/PlayerQuests.test.ts b/src/Structures/Player/PlayerQuests/PlayerQuests.test.ts new file mode 100644 index 000000000..f259b9e53 --- /dev/null +++ b/src/Structures/Player/PlayerQuests/PlayerQuests.test.ts @@ -0,0 +1,19 @@ +import PlayerQuest from './PlayerQuest.js'; +import PlayerQuests from './PlayerQuests.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerQuests', () => { + const data = new PlayerQuests({ stats: 'meow' }, false); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerQuests); + expectTypeOf(data).toEqualTypeOf(); + expect(data.quests).toBeDefined(); + data.quests.forEach((quest) => { + expect(quest).toBeDefined(); + expect(quest).toBeInstanceOf(PlayerQuest); + expectTypeOf(quest).toEqualTypeOf(); + }); + expectTypeOf(data.quests).toEqualTypeOf(); + expect(data.autoActivate).toBeDefined(); + expectTypeOf(data.autoActivate).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerQuests/PlayerQuests.ts b/src/Structures/Player/PlayerQuests/PlayerQuests.ts index 8f3eee02c..9761ed434 100644 --- a/src/Structures/Player/PlayerQuests/PlayerQuests.ts +++ b/src/Structures/Player/PlayerQuests/PlayerQuests.ts @@ -3,7 +3,7 @@ import PlayerQuest from './PlayerQuest.js'; class PlayerQuests { quests: PlayerQuest[]; autoActivate: boolean; - constructor(data: Record, autoActivate: boolean = false) { + constructor(data: Record, autoActivate: boolean) { this.quests = Object.keys(data).map((quest) => new PlayerQuest(data[quest], quest)); this.autoActivate = autoActivate; } diff --git a/src/Structures/Player/PlayerRankPurchase.test.ts b/src/Structures/Player/PlayerRankPurchase.test.ts new file mode 100644 index 000000000..622ad9862 --- /dev/null +++ b/src/Structures/Player/PlayerRankPurchase.test.ts @@ -0,0 +1,25 @@ +import PlayerRankPurchase from './PlayerRankPurchase.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerRankPurchase', () => { + const data = new PlayerRankPurchase({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerRankPurchase); + expectTypeOf(data).toEqualTypeOf(); + expect(data.vip).toBeDefined(); + expectTypeOf(data.vip).toEqualTypeOf(); + expect(data.vipAt).toBeDefined(); + expectTypeOf(data.vipAt).toEqualTypeOf(); + expect(data.vipPlus).toBeDefined(); + expectTypeOf(data.vipPlus).toEqualTypeOf(); + expect(data.vipPlusAt).toBeDefined(); + expectTypeOf(data.vipPlusAt).toEqualTypeOf(); + expect(data.mvp).toBeDefined(); + expectTypeOf(data.mvp).toEqualTypeOf(); + expect(data.mvpAt).toBeDefined(); + expectTypeOf(data.mvpAt).toEqualTypeOf(); + expect(data.mvpPlus).toBeDefined(); + expectTypeOf(data.mvpPlus).toEqualTypeOf(); + expect(data.mvpPlusAt).toBeDefined(); + expectTypeOf(data.mvpPlusAt).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerRewards/PlayerRewards.test.ts b/src/Structures/Player/PlayerRewards/PlayerRewards.test.ts new file mode 100644 index 000000000..70856aa09 --- /dev/null +++ b/src/Structures/Player/PlayerRewards/PlayerRewards.test.ts @@ -0,0 +1,42 @@ +import PlayerRewards from './PlayerRewards.js'; +import PlayerRewardsMonthlyCrate from './PlayerRewardsMonthlyCrate.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerRewards', () => { + const data = new PlayerRewards({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerRewards); + expectTypeOf(data).toEqualTypeOf(); + expect(data.adsenseTokens).toBeDefined(); + expect(data.adsenseTokens).toBeGreaterThanOrEqual(0); + expectTypeOf(data.adsenseTokens).toEqualTypeOf(); + expect(data.lastAdsenseGenerateTimeAt).toBeDefined(); + expectTypeOf(data.lastAdsenseGenerateTimeAt).toEqualTypeOf(); + expect(data.lastClaimedReward).toBeDefined(); + expect(data.lastClaimedReward).toBeGreaterThanOrEqual(0); + expectTypeOf(data.lastClaimedReward).toEqualTypeOf(); + expect(data.rewardHighScore).toBeDefined(); + expect(data.rewardHighScore).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rewardHighScore).toEqualTypeOf(); + expect(data.rewardScore).toBeDefined(); + expect(data.rewardScore).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rewardScore).toEqualTypeOf(); + expect(data.rewardStreak).toBeDefined(); + expect(data.rewardStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rewardStreak).toEqualTypeOf(); + expect(data.rewardTokens).toBeDefined(); + expect(data.rewardTokens).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rewardTokens).toEqualTypeOf(); + expect(data.totalDailyRewards).toBeDefined(); + expect(data.totalDailyRewards).toBeGreaterThanOrEqual(0); + expectTypeOf(data.totalDailyRewards).toEqualTypeOf(); + expect(data.totalRewards).toBeDefined(); + expect(data.totalRewards).toBeGreaterThanOrEqual(0); + expectTypeOf(data.totalRewards).toEqualTypeOf(); + expect(data.monthlyCrates).toBeDefined(); + data.monthlyCrates.forEach((crate) => { + expect(crate).toBeDefined(); + expectTypeOf(crate).toEqualTypeOf(); + }); + expectTypeOf(data.monthlyCrates).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerRewards/PlayerRewardsMonthlyCrate.test.ts b/src/Structures/Player/PlayerRewards/PlayerRewardsMonthlyCrate.test.ts new file mode 100644 index 000000000..66e8367e0 --- /dev/null +++ b/src/Structures/Player/PlayerRewards/PlayerRewardsMonthlyCrate.test.ts @@ -0,0 +1,22 @@ +import PlayerRewardsMonthlyCrate from './PlayerRewardsMonthlyCrate.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerRewardsMonthlyCrate', () => { + const data = new PlayerRewardsMonthlyCrate({ stats: 'meow' }, 'meow'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerRewardsMonthlyCrate); + expectTypeOf(data).toEqualTypeOf(); + expect(data.date).toBeDefined(); + expect(data.date).toBe('meow'); + expectTypeOf(data.date).toEqualTypeOf(); + expect(data.REGULAR).toBeDefined(); + expectTypeOf(data.REGULAR).toEqualTypeOf(); + expect(data.VIP).toBeDefined(); + expectTypeOf(data.VIP).toEqualTypeOf(); + expect(data.VIP_PLUS).toBeDefined(); + expectTypeOf(data.VIP_PLUS).toEqualTypeOf(); + expect(data.MVP).toBeDefined(); + expectTypeOf(data.MVP).toEqualTypeOf(); + expect(data.MVP_PLUS).toBeDefined(); + expectTypeOf(data.MVP_PLUS).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerScorpiusBribe.test.ts b/src/Structures/Player/PlayerScorpiusBribe.test.ts new file mode 100644 index 000000000..2870af14a --- /dev/null +++ b/src/Structures/Player/PlayerScorpiusBribe.test.ts @@ -0,0 +1,17 @@ +import PlayerScorpiusBribe from './PlayerScorpiusBribe.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerScorpiusBribe', () => { + const data = new PlayerScorpiusBribe(0, '2000'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerScorpiusBribe); + expectTypeOf(data).toEqualTypeOf(); + expect(data.year).toBeDefined(); + expect(data.year).toBeGreaterThanOrEqual(0); + expectTypeOf(data.year).toEqualTypeOf(); + expect(data.claimedTimestamp).toBeDefined(); + expect(data.claimedTimestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.claimedTimestamp).toEqualTypeOf(); + expect(data.claimedAt).toBeDefined(); + expectTypeOf(data.claimedAt).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYear.test.ts b/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYear.test.ts new file mode 100644 index 000000000..b4d9a4855 --- /dev/null +++ b/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYear.test.ts @@ -0,0 +1,23 @@ +import PlayerSeasonalChristmasYear from './PlayerSeasonalChristmasYear.js'; +import PlayerSeasonalChristmasYearAdventRewards from './PlayerSeasonalChristmasYearAdventRewards.js'; +import PlayerSeasonalChristmasYearLeveling from './PlayerSeasonalChristmasYearLeveling.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerSeasonalChristmasYear', () => { + const data = new PlayerSeasonalChristmasYear({ stats: 'meow' }, 2000); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerSeasonalChristmasYear); + expectTypeOf(data).toEqualTypeOf(); + expect(data.year).toBeDefined(); + expect(data.year).toBe(2000); + expect(data.year).toBeGreaterThanOrEqual(0); + expectTypeOf(data.year).toEqualTypeOf(); + expect(data.adventRewards).toBeDefined(); + expect(data.adventRewards).toBeInstanceOf(PlayerSeasonalChristmasYearAdventRewards); + expectTypeOf(data.adventRewards).toEqualTypeOf(); + expect(data.presents).toBeDefined(); + expectTypeOf(data.presents).toEqualTypeOf>(); + expect(data.leveling).toBeDefined(); + expect(data.leveling).toBeInstanceOf(PlayerSeasonalChristmasYearLeveling); + expectTypeOf(data.leveling).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYearAdventRewards.test.ts b/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYearAdventRewards.test.ts new file mode 100644 index 000000000..2e5629b95 --- /dev/null +++ b/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYearAdventRewards.test.ts @@ -0,0 +1,84 @@ +import PlayerSeasonalChristmasYearAdventRewards from './PlayerSeasonalChristmasYearAdventRewards.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerSeasonalChristmasYearAdventRewards', () => { + const data = new PlayerSeasonalChristmasYearAdventRewards({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerSeasonalChristmasYearAdventRewards); + expectTypeOf(data).toEqualTypeOf(); + expect(data.day1).toBeDefined(); + expect(data.day1).toBeNull(); + expectTypeOf(data.day1).toEqualTypeOf(); + expect(data.day2).toBeDefined(); + expect(data.day2).toBeNull(); + expectTypeOf(data.day2).toEqualTypeOf(); + expect(data.day3).toBeDefined(); + expect(data.day3).toBeNull(); + expectTypeOf(data.day3).toEqualTypeOf(); + expect(data.day4).toBeDefined(); + expect(data.day4).toBeNull(); + expectTypeOf(data.day4).toEqualTypeOf(); + expect(data.day5).toBeDefined(); + expect(data.day5).toBeNull(); + expectTypeOf(data.day5).toEqualTypeOf(); + expect(data.day6).toBeDefined(); + expect(data.day6).toBeNull(); + expectTypeOf(data.day6).toEqualTypeOf(); + expect(data.day7).toBeDefined(); + expect(data.day7).toBeNull(); + expectTypeOf(data.day7).toEqualTypeOf(); + expect(data.day8).toBeDefined(); + expect(data.day8).toBeNull(); + expectTypeOf(data.day8).toEqualTypeOf(); + expect(data.day9).toBeDefined(); + expect(data.day9).toBeNull(); + expectTypeOf(data.day9).toEqualTypeOf(); + expect(data.day10).toBeDefined(); + expect(data.day10).toBeNull(); + expectTypeOf(data.day10).toEqualTypeOf(); + expect(data.day11).toBeDefined(); + expect(data.day11).toBeNull(); + expectTypeOf(data.day11).toEqualTypeOf(); + expect(data.day12).toBeDefined(); + expect(data.day12).toBeNull(); + expectTypeOf(data.day12).toEqualTypeOf(); + expect(data.day13).toBeDefined(); + expect(data.day13).toBeNull(); + expectTypeOf(data.day13).toEqualTypeOf(); + expect(data.day14).toBeDefined(); + expect(data.day14).toBeNull(); + expectTypeOf(data.day14).toEqualTypeOf(); + expect(data.day15).toBeDefined(); + expect(data.day15).toBeNull(); + expectTypeOf(data.day15).toEqualTypeOf(); + expect(data.day16).toBeDefined(); + expect(data.day16).toBeNull(); + expectTypeOf(data.day16).toEqualTypeOf(); + expect(data.day17).toBeDefined(); + expect(data.day17).toBeNull(); + expectTypeOf(data.day17).toEqualTypeOf(); + expect(data.day18).toBeDefined(); + expect(data.day18).toBeNull(); + expectTypeOf(data.day18).toEqualTypeOf(); + expect(data.day19).toBeDefined(); + expect(data.day19).toBeNull(); + expectTypeOf(data.day19).toEqualTypeOf(); + expect(data.day20).toBeDefined(); + expect(data.day20).toBeNull(); + expectTypeOf(data.day20).toEqualTypeOf(); + expect(data.day21).toBeDefined(); + expect(data.day21).toBeNull(); + expectTypeOf(data.day21).toEqualTypeOf(); + expect(data.day22).toBeDefined(); + expect(data.day22).toBeNull(); + expectTypeOf(data.day22).toEqualTypeOf(); + expect(data.day23).toBeDefined(); + expect(data.day23).toBeNull(); + expectTypeOf(data.day23).toEqualTypeOf(); + expect(data.day24).toBeDefined(); + expect(data.day24).toBeNull(); + expectTypeOf(data.day24).toEqualTypeOf(); + expect(data.day25).toBeDefined(); + expect(data.day25).toBeNull(); + expectTypeOf(data.day25).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYearLeveling.test.ts b/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYearLeveling.test.ts new file mode 100644 index 000000000..d5b4513f1 --- /dev/null +++ b/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYearLeveling.test.ts @@ -0,0 +1,12 @@ +import PlayerSeasonalChristmasYearLeveling from './PlayerSeasonalChristmasYearLeveling.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerSeasonalChristmasYearLeveling', () => { + const data = new PlayerSeasonalChristmasYearLeveling({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerSeasonalChristmasYearLeveling); + expectTypeOf(data).toEqualTypeOf(); + expect(data.experience).toBeDefined(); + expect(data.experience).toBeGreaterThanOrEqual(0); + expectTypeOf(data.experience).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerSocialMedia.test.ts b/src/Structures/Player/PlayerSocialMedia.test.ts new file mode 100644 index 000000000..aa031c5c9 --- /dev/null +++ b/src/Structures/Player/PlayerSocialMedia.test.ts @@ -0,0 +1,24 @@ +import PlayerSocialMedia from './PlayerSocialMedia.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { UserInput } from '../../Types/Global.js'; + +test('PlayerSocialMedia', () => { + const data = new PlayerSocialMedia({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerSocialMedia); + expectTypeOf(data).toEqualTypeOf(); + expect(data.discord).toBeDefined(); + expectTypeOf(data.discord).toEqualTypeOf(); + expect(data.youtube).toBeDefined(); + expectTypeOf(data.youtube).toEqualTypeOf(); + expect(data.twitch).toBeDefined(); + expectTypeOf(data.twitch).toEqualTypeOf(); + expect(data.hypixel).toBeDefined(); + expectTypeOf(data.hypixel).toEqualTypeOf(); + expect(data.twitter).toBeDefined(); + expectTypeOf(data.twitter).toEqualTypeOf(); + expect(data.instagram).toBeDefined(); + expectTypeOf(data.instagram).toEqualTypeOf(); + expect(data.tiktok).toBeDefined(); + expectTypeOf(data.tiktok).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerStats.test.ts b/src/Structures/Player/PlayerStats.test.ts new file mode 100644 index 000000000..0cf817399 --- /dev/null +++ b/src/Structures/Player/PlayerStats.test.ts @@ -0,0 +1,97 @@ +import Arcade from '../MiniGames/Arcade/Arcade.js'; +import ArenaBrawl from '../MiniGames/ArenaBrawl/ArenaBrawl.js'; +import BedWars from '../MiniGames/BedWars/BedWars.js'; +import BlitzSurvivalGames from '../MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.js'; +import BuildBattle from '../MiniGames/BuildBattle.js'; +import CopsAndCrims from '../MiniGames/CopsAndCrims/CopsAndCrims.js'; +import Duels from '../MiniGames/Duels/Duels.js'; +import MegaWalls from '../MiniGames/MegaWalls/MegaWalls.js'; +import MurderMystery from '../MiniGames/MurderMystery/MurderMystery.js'; +import Paintball from '../MiniGames/Paintball.js'; +import Pit from '../MiniGames/Pit/Pit.js'; +import PlayerStats from './PlayerStats.js'; +import Quakecraft from '../MiniGames/Quakecraft/Quakecraft.js'; +import SkyWars from '../MiniGames/SkyWars/SkyWars.js'; +import SmashHeroes from '../MiniGames/SmashHeroes/SmashHeroes.js'; +import SpeedUHC from '../MiniGames/SpeedUHC/SpeedUHC.js'; +import TNTGames from '../MiniGames/TNTGames/TNTGames.js'; +import TurboKartRacers from '../MiniGames/TurboKartRacers/TurboKartRacers.js'; +import UHC from '../MiniGames/UHC/UHC.js'; +import VampireZ from '../MiniGames/VampireZ/VampireZ.js'; +import Walls from '../MiniGames/Walls.js'; +import Warlords from '../MiniGames/Warlords/Warlords.js'; +import WoolGames from '../MiniGames/WoolGames/WoolGames.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerStats', () => { + const data = new PlayerStats({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerStats); + expectTypeOf(data).toEqualTypeOf(); + expect(data.Arcade).toBeDefined(); + expect(data.Arcade).toBeInstanceOf(Arcade); + expectTypeOf(data.Arcade).toEqualTypeOf(); + expect(data.ArenaBrawl).toBeDefined(); + expect(data.ArenaBrawl).toBeInstanceOf(ArenaBrawl); + expectTypeOf(data.ArenaBrawl).toEqualTypeOf(); + expect(data.BedWars).toBeDefined(); + expect(data.BedWars).toBeInstanceOf(BedWars); + expectTypeOf(data.BedWars).toEqualTypeOf(); + expect(data.BlitzSurvivalGames).toBeDefined(); + expect(data.BlitzSurvivalGames).toBeInstanceOf(BlitzSurvivalGames); + expectTypeOf(data.BlitzSurvivalGames).toEqualTypeOf(); + expect(data.BuildBattle).toBeDefined(); + expect(data.BuildBattle).toBeInstanceOf(BuildBattle); + expectTypeOf(data.BuildBattle).toEqualTypeOf(); + expect(data.CopsAndCrims).toBeDefined(); + expect(data.CopsAndCrims).toBeInstanceOf(CopsAndCrims); + expectTypeOf(data.CopsAndCrims).toEqualTypeOf(); + expect(data.Duels).toBeDefined(); + expect(data.Duels).toBeInstanceOf(Duels); + expectTypeOf(data.Duels).toEqualTypeOf(); + expect(data.MegaWalls).toBeDefined(); + expect(data.MegaWalls).toBeInstanceOf(MegaWalls); + expectTypeOf(data.MegaWalls).toEqualTypeOf(); + expect(data.MurderMystery).toBeDefined(); + expect(data.MurderMystery).toBeInstanceOf(MurderMystery); + expectTypeOf(data.MurderMystery).toEqualTypeOf(); + expect(data.Paintball).toBeDefined(); + expect(data.Paintball).toBeInstanceOf(Paintball); + expectTypeOf(data.Paintball).toEqualTypeOf(); + expect(data.Pit).toBeDefined(); + expect(data.Pit).toBeInstanceOf(Pit); + expectTypeOf(data.Pit).toEqualTypeOf(); + expect(data.QuakeCraft).toBeDefined(); + expect(data.QuakeCraft).toBeInstanceOf(Quakecraft); + expectTypeOf(data.QuakeCraft).toEqualTypeOf(); + expect(data.SkyWars).toBeDefined(); + expect(data.SkyWars).toBeInstanceOf(SkyWars); + expectTypeOf(data.SkyWars).toEqualTypeOf(); + expect(data.SmashHeroes).toBeDefined(); + expect(data.SmashHeroes).toBeInstanceOf(SmashHeroes); + expectTypeOf(data.SmashHeroes).toEqualTypeOf(); + expect(data.SpeedUHC).toBeDefined(); + expect(data.SpeedUHC).toBeInstanceOf(SpeedUHC); + expectTypeOf(data.SpeedUHC).toEqualTypeOf(); + expect(data.TNTGames).toBeDefined(); + expect(data.TNTGames).toBeInstanceOf(TNTGames); + expectTypeOf(data.TNTGames).toEqualTypeOf(); + expect(data.TurboKartRacers).toBeDefined(); + expect(data.TurboKartRacers).toBeInstanceOf(TurboKartRacers); + expectTypeOf(data.TurboKartRacers).toEqualTypeOf(); + expect(data.UHC).toBeDefined(); + expect(data.UHC).toBeInstanceOf(UHC); + expectTypeOf(data.UHC).toEqualTypeOf(); + expect(data.VampireZ).toBeDefined(); + expect(data.VampireZ).toBeInstanceOf(VampireZ); + expectTypeOf(data.VampireZ).toEqualTypeOf(); + expect(data.Walls).toBeDefined(); + expect(data.Walls).toBeInstanceOf(Walls); + expectTypeOf(data.Walls).toEqualTypeOf(); + expect(data.Warlords).toBeDefined(); + expect(data.Warlords).toBeInstanceOf(Warlords); + expectTypeOf(data.Warlords).toEqualTypeOf(); + expect(data.WoolGames).toBeDefined(); + expect(data.WoolGames).toBeInstanceOf(WoolGames); + expectTypeOf(data.WoolGames).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerTourney/PlayerTourney.test.ts b/src/Structures/Player/PlayerTourney/PlayerTourney.test.ts new file mode 100644 index 000000000..5fbb7e47a --- /dev/null +++ b/src/Structures/Player/PlayerTourney/PlayerTourney.test.ts @@ -0,0 +1,31 @@ +import PlayerTourney from './PlayerTourney.js'; +import PlayerTourneyData from './PlayerTourneyData.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { PlayerTourneyShopSort } from '../../../Types/Player.js'; + +test('PlayerTourney', () => { + const data = new PlayerTourney({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerTourney); + expectTypeOf(data).toEqualTypeOf(); + expect(data.firstJoinLobbyTimestamp).toBeDefined(); + expect(data.firstJoinLobbyTimestamp).toBeNull(); + expectTypeOf(data.firstJoinLobbyTimestamp).toEqualTypeOf(); + expect(data.firstJoinLobbyAt).toBeDefined(); + expect(data.firstJoinLobbyAt).toBeNull(); + expectTypeOf(data.firstJoinLobbyAt).toEqualTypeOf(); + expect(data.totalTributes).toBeDefined(); + expect(data.totalTributes).toBeGreaterThanOrEqual(0); + expectTypeOf(data.totalTributes).toEqualTypeOf(); + expect(data.shopSort).toBeDefined(); + expectTypeOf(data.shopSort).toEqualTypeOf(); + expect(data.hidePurchased).toBeDefined(); + expectTypeOf(data.hidePurchased).toEqualTypeOf(); + expect(data.tourneyData).toBeDefined(); + data.tourneyData.forEach((tourney) => { + expect(tourney).toBeDefined(); + expect(tourney).toBeInstanceOf(PlayerTourneyData); + expectTypeOf(tourney).toEqualTypeOf(); + }); + expectTypeOf(data.tourneyData).toEqualTypeOf(); +}); diff --git a/src/Structures/Player/PlayerTourney/PlayerTourneyData.test.ts b/src/Structures/Player/PlayerTourney/PlayerTourneyData.test.ts new file mode 100644 index 000000000..466a1e856 --- /dev/null +++ b/src/Structures/Player/PlayerTourney/PlayerTourneyData.test.ts @@ -0,0 +1,26 @@ +import PlayerTourneyData from './PlayerTourneyData.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PlayerTourneyData', () => { + const data = new PlayerTourneyData({ stats: 'meow' }, 'meow'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PlayerTourneyData); + expectTypeOf(data).toEqualTypeOf(); + expect(data.tourneyName).toBeDefined(); + expectTypeOf(data.tourneyName).toEqualTypeOf(); + expect(data.playtime).toBeDefined(); + expect(data.playtime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playtime).toEqualTypeOf(); + expect(data.tributes).toBeDefined(); + expect(data.tributes).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tributes).toEqualTypeOf(); + expect(data.firstWinTimestamp).toBeDefined(); + expect(data.firstWinTimestamp).toBeNull(); + expectTypeOf(data.firstWinTimestamp).toEqualTypeOf(); + expect(data.firstWinAt).toBeDefined(); + expect(data.firstWinAt).toBeNull(); + expectTypeOf(data.firstWinAt).toEqualTypeOf(); + expect(data.claimedReward).toBeDefined(); + expect(data.claimedReward).toBeGreaterThanOrEqual(0); + expectTypeOf(data.claimedReward).toEqualTypeOf(); +}); From 72cb5a5ac763b4a53d5abb93b2a38aa68fd9d887 Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 17 Sep 2025 10:38:40 +0800 Subject: [PATCH 040/124] refactor(Errors); Move errors to be static --- src/API/getGuild.test.ts | 11 +++-- src/API/getGuild.ts | 9 ++-- src/API/getHouse.test.ts | 3 +- src/API/getHouse.ts | 3 +- src/API/getLeaderboards.test.ts | 3 +- src/API/getLeaderboards.ts | 3 +- src/API/getPlayer.ts | 5 ++- src/API/getPlayerHouses.test.ts | 3 +- src/API/getPlayerHouses.ts | 3 +- src/API/getRecentGames.test.ts | 3 +- src/API/getRecentGames.ts | 3 +- src/API/getSkyBlockAuction.test.ts | 7 +-- src/API/getSkyBlockAuction.ts | 7 +-- src/API/getSkyBlockAuctions.test.ts | 9 ++-- src/API/getSkyBlockAuctions.ts | 7 +-- src/API/getSkyBlockGarden.test.ts | 3 +- src/API/getSkyBlockGarden.ts | 3 +- src/API/getSkyBlockMuseum.test.ts | 3 +- src/API/getSkyBlockMuseum.ts | 3 +- src/API/getSkyBlockProfile.test.ts | 8 ++-- src/API/getSkyBlockProfile.ts | 5 ++- src/API/getSkyBlockProfiles.test.ts | 8 ++-- src/API/getSkyBlockProfiles.ts | 5 ++- src/Client.test.ts | 11 +---- src/Client.ts | 66 ++++++++++++++--------------- src/Errors.ts | 53 +++++++++++------------ src/Private/Endpoint.test.ts | 3 +- src/Private/Endpoint.ts | 3 +- src/Private/RateLimit.test.ts | 3 +- src/Private/RateLimit.ts | 3 +- src/Private/RequestHandler.test.ts | 19 ++++----- src/Private/RequestHandler.ts | 35 +++++++-------- src/Private/Updater.test.ts | 3 +- src/Private/Updater.ts | 3 +- 34 files changed, 165 insertions(+), 154 deletions(-) diff --git a/src/API/getGuild.test.ts b/src/API/getGuild.test.ts index 1bd4b9bb8..3d429ac74 100644 --- a/src/API/getGuild.test.ts +++ b/src/API/getGuild.test.ts @@ -1,5 +1,6 @@ import Client from '../Client.js'; import Color from '../Structures/Color.js'; +import Errors from '../Errors.ts'; import Game from '../Structures/Game.js'; import Guild from '../Structures/Guild/Guild.js'; import GuildMember from '../Structures/Guild/GuildMember.js'; @@ -14,23 +15,21 @@ test('Invalid Guild Type', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - await expect(() => client.getGuild('invalid', 'invalid')).rejects.toThrowError( - client.errors.INVALID_GUILD_SEARCH_PARAMETER - ); + await expect(() => client.getGuild('invalid', 'invalid')).rejects.toThrowError(Errors.INVALID_GUILD_SEARCH_PARAMETER); client.destroy(); }); test('Invalid Guild', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); await expect(() => client.getGuild('name', 'this guild dose not exist')).rejects.toThrowError( - client.errors.GUILD_DOES_NOT_EXIST + Errors.GUILD_DOES_NOT_EXIST ); client.destroy(); }); test('Invalid Guild ID', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - await expect(() => client.getGuild('id', 'invalid guild id')).rejects.toThrowError(client.errors.INVALID_GUILD_ID); + await expect(() => client.getGuild('id', 'invalid guild id')).rejects.toThrowError(Errors.INVALID_GUILD_ID); client.destroy(); }); @@ -38,7 +37,7 @@ test('No Guild Query', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - await expect(() => client.getGuild('id')).rejects.toThrowError(client.errors.NO_GUILD_QUERY); + await expect(() => client.getGuild('id')).rejects.toThrowError(Errors.NO_GUILD_QUERY); client.destroy(); }); diff --git a/src/API/getGuild.ts b/src/API/getGuild.ts index e326cb289..0a87c09c6 100644 --- a/src/API/getGuild.ts +++ b/src/API/getGuild.ts @@ -1,5 +1,6 @@ import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; +import Errors from '../Errors.ts'; import Guild from '../Structures/Guild/Guild.js'; import RequestData from '../Private/RequestData.js'; import type { GuildFetchOptions } from '../Types/API.js'; @@ -17,19 +18,19 @@ class getGuild extends Endpoint { query: string, options?: RequestOptions ): Promise { - if (!query) throw new Error(this.client.errors.NO_GUILD_QUERY); + if (!query) throw new Error(Errors.NO_GUILD_QUERY); if ('id' === searchParameter && !this.client.functions.isGuildID(query)) { - throw new Error(this.client.errors.INVALID_GUILD_ID); + throw new Error(Errors.INVALID_GUILD_ID); } const isPlayerQuery = 'player' === searchParameter; if (isPlayerQuery) query = await this.client.requestHandler.toUUID(query); if (!['id', 'name', 'player'].includes(searchParameter)) { - throw new Error(this.client.errors.INVALID_GUILD_SEARCH_PARAMETER); + throw new Error(Errors.INVALID_GUILD_SEARCH_PARAMETER); } const res = await this.client.requestHandler.request(`/guild?${searchParameter}=${encodeURI(query)}`, options); if (res.options.raw) return res; if (!res.data.guild && 'player' !== searchParameter) { - throw new Error(this.client.errors.GUILD_DOES_NOT_EXIST); + throw new Error(Errors.GUILD_DOES_NOT_EXIST); } return res.data.guild ? new Guild(res.data.guild, isPlayerQuery ? query : undefined) : null; } diff --git a/src/API/getHouse.test.ts b/src/API/getHouse.test.ts index 5c52de8d9..9aa1a2d88 100644 --- a/src/API/getHouse.test.ts +++ b/src/API/getHouse.test.ts @@ -1,4 +1,5 @@ import Client from '../Client.js'; +import Errors from '../Errors.ts'; import House from '../Structures/House.js'; import RequestData from '../Private/RequestData.js'; import { expect, expectTypeOf, test } from 'vitest'; @@ -19,7 +20,7 @@ test('getHouse (no input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - await expect(() => client.getHouse()).rejects.toThrowError(client.errors.NO_UUID); + await expect(() => client.getHouse()).rejects.toThrowError(Errors.NO_UUID); client.destroy(); }); diff --git a/src/API/getHouse.ts b/src/API/getHouse.ts index bdd1d5269..8df3b7c5d 100644 --- a/src/API/getHouse.ts +++ b/src/API/getHouse.ts @@ -1,5 +1,6 @@ import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; +import Errors from '../Errors.ts'; import House from '../Structures/House.js'; import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; @@ -12,7 +13,7 @@ class getHouse extends Endpoint { } override async execute(query: string, options?: RequestOptions): Promise { - if (!query) throw new Error(this.client.errors.NO_UUID); + if (!query) throw new Error(Errors.NO_UUID); const res = await this.client.requestHandler.request(`/housing/house?house=${query}`, options); if (res.options.raw) return res; return new House(res.data); diff --git a/src/API/getLeaderboards.test.ts b/src/API/getLeaderboards.test.ts index 9cab0faf5..080b06af5 100644 --- a/src/API/getLeaderboards.test.ts +++ b/src/API/getLeaderboards.test.ts @@ -1,4 +1,5 @@ import Client from '../Client.js'; +import Errors from '../Errors.ts'; import Leaderboard from '../Structures/Leaderboard.js'; import RequestData from '../Private/RequestData.js'; import { defaultRequestData } from '../../vitest.setup.js'; @@ -62,7 +63,7 @@ test('getLeaderboards (Missing Data)', async () => { } as any); await expect(() => client.getLeaderboards()).rejects.toThrowError( - client.errors.SOMETHING_WENT_WRONG.replace(/{cause}/, 'Try again.') + Errors.SOMETHING_WENT_WRONG.replace(/{cause}/, 'Try again.') ); vi.restoreAllMocks(); client.destroy(); diff --git a/src/API/getLeaderboards.ts b/src/API/getLeaderboards.ts index 628610da0..02f6a5d16 100644 --- a/src/API/getLeaderboards.ts +++ b/src/API/getLeaderboards.ts @@ -1,5 +1,6 @@ import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; +import Errors from '../Errors.ts'; import Leaderboard from '../Structures/Leaderboard.js'; import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; @@ -16,7 +17,7 @@ class getLeaderboards extends Endpoint { const res = await this.client.requestHandler.request('/leaderboards', options); if (res.options.raw) return res; if (!res.data.leaderboards) { - throw new Error(this.client.errors.SOMETHING_WENT_WRONG.replace(/{cause}/, 'Try again.')); + throw new Error(Errors.SOMETHING_WENT_WRONG.replace(/{cause}/, 'Try again.')); } const leaderboards: Record = {}; Object.keys(res.data.leaderboards).forEach((key) => { diff --git a/src/API/getPlayer.ts b/src/API/getPlayer.ts index 7bf0df843..991b6b43b 100644 --- a/src/API/getPlayer.ts +++ b/src/API/getPlayer.ts @@ -1,5 +1,6 @@ import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; +import Errors from '../Errors.ts'; import Guild from '../Structures/Guild/Guild.js'; import House from '../Structures/House.js'; import Player from '../Structures/Player/Player.js'; @@ -15,11 +16,11 @@ class getPlayer extends Endpoint { } override async execute(query: string, options?: PlayerRequestOptions): Promise { - if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); + if (!query) throw new Error(Errors.NO_NICKNAME_UUID); query = await this.client.requestHandler.toUUID(query); const res = await this.client.requestHandler.request(`/player?uuid=${query}`, options); if (res.options.raw) return res; - if (query && !res.data.player) throw new Error(this.client.errors.PLAYER_HAS_NEVER_LOGGED); + if (query && !res.data.player) throw new Error(Errors.PLAYER_HAS_NEVER_LOGGED); return new Player(res.data.player, { guild: options?.guild ? ((await this.client.getGuild('player', query)) as Guild) : null, houses: options?.houses ? ((await this.client.getPlayerHouses(query)) as House[]) : null, diff --git a/src/API/getPlayerHouses.test.ts b/src/API/getPlayerHouses.test.ts index 4ef8b5343..4a53f053a 100644 --- a/src/API/getPlayerHouses.test.ts +++ b/src/API/getPlayerHouses.test.ts @@ -1,4 +1,5 @@ import Client from '../Client.js'; +import Errors from '../Errors.js'; import House from '../Structures/House.js'; import RequestData from '../Private/RequestData.js'; import { expect, expectTypeOf, test } from 'vitest'; @@ -8,7 +9,7 @@ test('getPlayerHouses (No input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - await expect(() => client.getPlayerHouses()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); + await expect(() => client.getPlayerHouses()).rejects.toThrowError(Errors.NO_NICKNAME_UUID); client.destroy(); }); diff --git a/src/API/getPlayerHouses.ts b/src/API/getPlayerHouses.ts index 6de5fda06..7a09c30c6 100644 --- a/src/API/getPlayerHouses.ts +++ b/src/API/getPlayerHouses.ts @@ -1,5 +1,6 @@ import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; +import Errors from '../Errors.ts'; import House from '../Structures/House.js'; import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; @@ -13,7 +14,7 @@ class getPlayerHouses extends Endpoint { } override async execute(query: string, options?: RequestOptions): Promise | RequestData> { - if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); + if (!query) throw new Error(Errors.NO_NICKNAME_UUID); query = await this.client.requestHandler.toUUID(query); const res = await this.client.requestHandler.request(`/housing/houses?player=${query}`, options); if (res.options.raw) return res; diff --git a/src/API/getRecentGames.test.ts b/src/API/getRecentGames.test.ts index 4f564e73e..ccffb9268 100644 --- a/src/API/getRecentGames.test.ts +++ b/src/API/getRecentGames.test.ts @@ -1,4 +1,5 @@ import Client from '../Client.js'; +import Errors from '../Errors.ts'; import Game from '../Structures/Game.js'; import RecentGame from '../Structures/RecentGame.js'; import RequestData from '../Private/RequestData.js'; @@ -9,7 +10,7 @@ test('getRecentGames (no input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - await expect(() => client.getRecentGames()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); + await expect(() => client.getRecentGames()).rejects.toThrowError(Errors.NO_NICKNAME_UUID); client.destroy(); }); diff --git a/src/API/getRecentGames.ts b/src/API/getRecentGames.ts index 54d612a2b..a10786df4 100644 --- a/src/API/getRecentGames.ts +++ b/src/API/getRecentGames.ts @@ -1,5 +1,6 @@ import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; +import Errors from '../Errors.ts'; import RecentGame from '../Structures/RecentGame.js'; import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; @@ -13,7 +14,7 @@ class getRecentGames extends Endpoint { } override async execute(query: string, options?: RequestOptions): Promise | RequestData> { - if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); + if (!query) throw new Error(Errors.NO_NICKNAME_UUID); query = await this.client.requestHandler.toUUID(query); const res = await this.client.requestHandler.request(`/recentgames?uuid=${query}`, options); if (res.options.raw) return res; diff --git a/src/API/getSkyBlockAuction.test.ts b/src/API/getSkyBlockAuction.test.ts index 6a46a94a5..7b1cd3d2f 100644 --- a/src/API/getSkyBlockAuction.test.ts +++ b/src/API/getSkyBlockAuction.test.ts @@ -1,4 +1,5 @@ import Client from '../Client.js'; +import Errors from '../Errors.ts'; import RequestData from '../Private/RequestData.js'; import SkyBlockAuction from '../Structures/SkyBlock/Auctions/SkyBlockAuction.js'; import SkyBlockBaseAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.js'; @@ -23,7 +24,7 @@ test('getSkyBlockAuction (No Type Input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - await expect(() => client.getSkyBlockAuction()).rejects.toThrowError(client.errors.BAD_AUCTION_FILTER); + await expect(() => client.getSkyBlockAuction()).rejects.toThrowError(Errors.BAD_AUCTION_FILTER); client.destroy(); }); @@ -31,7 +32,7 @@ test('getSkyBlockAuction (Bad Type Input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - await expect(() => client.getSkyBlockAuction('meow', 'meow')).rejects.toThrowError(client.errors.BAD_AUCTION_FILTER); + await expect(() => client.getSkyBlockAuction('meow', 'meow')).rejects.toThrowError(Errors.BAD_AUCTION_FILTER); client.destroy(); }); @@ -39,7 +40,7 @@ test('getSkyBlockAuction (No Query Input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - await expect(() => client.getSkyBlockAuction('AUCTION_ID')).rejects.toThrowError(client.errors.NO_UUID); + await expect(() => client.getSkyBlockAuction('AUCTION_ID')).rejects.toThrowError(Errors.NO_UUID); client.destroy(); }); diff --git a/src/API/getSkyBlockAuction.ts b/src/API/getSkyBlockAuction.ts index bb2720a98..3c6059dd5 100644 --- a/src/API/getSkyBlockAuction.ts +++ b/src/API/getSkyBlockAuction.ts @@ -1,5 +1,6 @@ import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; +import Errors from '../Errors.ts'; import RequestData from '../Private/RequestData.js'; import SkyBlockAuction from '../Structures/SkyBlock/Auctions/SkyBlockAuction.js'; import SkyBlockBaseAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.js'; @@ -18,8 +19,8 @@ class getSkyBlockAction extends Endpoint { options?: AuctionRequestOptions ): Promise { let filter: string | null; - if (type === undefined) throw new Error(this.client.errors.BAD_AUCTION_FILTER); - if (query === undefined) throw new Error(this.client.errors.NO_UUID); + if (type === undefined) throw new Error(Errors.BAD_AUCTION_FILTER); + if (query === undefined) throw new Error(Errors.NO_UUID); switch (type) { case 'PROFILE': { @@ -40,7 +41,7 @@ class getSkyBlockAction extends Endpoint { } } - if (null === filter) throw new Error(this.client.errors.BAD_AUCTION_FILTER); + if (null === filter) throw new Error(Errors.BAD_AUCTION_FILTER); const res = await this.client.requestHandler.request(`/skyblock/auction?${filter}=${query}`, options); if (res.options.raw) return res; diff --git a/src/API/getSkyBlockAuctions.test.ts b/src/API/getSkyBlockAuctions.test.ts index ae596eeaa..5216e19db 100644 --- a/src/API/getSkyBlockAuctions.test.ts +++ b/src/API/getSkyBlockAuctions.test.ts @@ -1,4 +1,5 @@ import Client from '../Client.js'; +import Errors from '../Errors.ts'; import RequestData from '../Private/RequestData.js'; import SkyBlockAuction from '../Structures/SkyBlock/Auctions/SkyBlockAuction.js'; import { expect, expectTypeOf, test } from 'vitest'; @@ -9,19 +10,19 @@ test('getSkyBlockAuctions (No Input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - await expect(() => client.getSkyBlockAuctions()).rejects.toThrowError(client.errors.INVALID_OPTION_VALUE); + await expect(() => client.getSkyBlockAuctions()).rejects.toThrowError(Errors.INVALID_OPTION_VALUE); client.destroy(); }); test('getSkyBlockAuctions (Negative Input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - await expect(() => client.getSkyBlockAuctions(-1)).rejects.toThrowError(client.errors.INVALID_OPTION_VALUE); + await expect(() => client.getSkyBlockAuctions(-1)).rejects.toThrowError(Errors.INVALID_OPTION_VALUE); client.destroy(); }); test('getSkyBlockAuctions (Page 0)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - await expect(() => client.getSkyBlockAuctions(0)).rejects.toThrowError(client.errors.INVALID_OPTION_VALUE); + await expect(() => client.getSkyBlockAuctions(0)).rejects.toThrowError(Errors.INVALID_OPTION_VALUE); client.destroy(); }); @@ -29,7 +30,7 @@ test('getSkyBlockAuctions (String Input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - await expect(() => client.getSkyBlockAuctions('hi')).rejects.toThrowError(client.errors.INVALID_OPTION_VALUE); + await expect(() => client.getSkyBlockAuctions('hi')).rejects.toThrowError(Errors.INVALID_OPTION_VALUE); client.destroy(); }); diff --git a/src/API/getSkyBlockAuctions.ts b/src/API/getSkyBlockAuctions.ts index c2bd75204..f0b58876e 100644 --- a/src/API/getSkyBlockAuctions.ts +++ b/src/API/getSkyBlockAuctions.ts @@ -1,5 +1,6 @@ import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; +import Errors from '../Errors.ts'; import SkyBlockAuction from '../Structures/SkyBlock/Auctions/SkyBlockAuction.js'; import SkyBlockAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockAuctionInfo.js'; import type RequestData from '../Private/RequestData.js'; @@ -17,9 +18,9 @@ class getSkyBlockAuctions extends Endpoint { query: number | '*', options?: AuctionRequestOptions ): Promise { - if (!query) throw new Error(this.client.errors.INVALID_OPTION_VALUE); - if ('number' === typeof query && 0 >= query) throw new Error(this.client.errors.INVALID_OPTION_VALUE); - if ('number' !== typeof query && '*' !== query) throw new Error(this.client.errors.INVALID_OPTION_VALUE); + if (!query) throw new Error(Errors.INVALID_OPTION_VALUE); + if ('number' === typeof query && 0 >= query) throw new Error(Errors.INVALID_OPTION_VALUE); + if ('number' !== typeof query && '*' !== query) throw new Error(Errors.INVALID_OPTION_VALUE); if ('*' === query) return await this.getAllPages(); return await this.getPage(query, options); } diff --git a/src/API/getSkyBlockGarden.test.ts b/src/API/getSkyBlockGarden.test.ts index ed1f9f70d..f601ff04b 100644 --- a/src/API/getSkyBlockGarden.test.ts +++ b/src/API/getSkyBlockGarden.test.ts @@ -1,4 +1,5 @@ import Client from '../Client.js'; +import Errors from '../Errors.ts'; import RequestData from '../Private/RequestData.js'; import SkyBlockGarden from '../Structures/SkyBlock/Garden/SkyBlockGarden.js'; import SkyBlockGardenActiveVisitor from '../Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitor.js'; @@ -13,7 +14,7 @@ test('getSkyBlockGarden (no input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - await expect(() => client.getSkyBlockGarden()).rejects.toThrowError(client.errors.NO_UUID); + await expect(() => client.getSkyBlockGarden()).rejects.toThrowError(Errors.NO_UUID); client.destroy(); }); diff --git a/src/API/getSkyBlockGarden.ts b/src/API/getSkyBlockGarden.ts index a15e0a2fa..cf21ccab3 100644 --- a/src/API/getSkyBlockGarden.ts +++ b/src/API/getSkyBlockGarden.ts @@ -1,5 +1,6 @@ import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; +import Errors from '../Errors.ts'; import RequestData from '../Private/RequestData.js'; import SkyBlockGarden from '../Structures/SkyBlock/Garden/SkyBlockGarden.js'; import type { RequestOptions } from '../Types/Requests.js'; @@ -12,7 +13,7 @@ class getSkyBlockGarden extends Endpoint { } override async execute(profileId: string, options?: RequestOptions): Promise { - if (!profileId) throw new Error(this.client.errors.NO_UUID); + if (!profileId) throw new Error(Errors.NO_UUID); const res = await this.client.requestHandler.request(`/skyblock/garden?profile=${profileId}`, options); if (res.options.raw) return res; return new SkyBlockGarden(res.data.garden); diff --git a/src/API/getSkyBlockMuseum.test.ts b/src/API/getSkyBlockMuseum.test.ts index 9049b44aa..7a6cad78a 100644 --- a/src/API/getSkyBlockMuseum.test.ts +++ b/src/API/getSkyBlockMuseum.test.ts @@ -1,4 +1,5 @@ import Client from '../Client.js'; +import Errors from '../Errors.ts'; import RequestData from '../Private/RequestData.js'; import SkyBlockMuseum from '../Structures/SkyBlock/Museum/SkyBlockMuseum.js'; import SkyBlockMuseumMember from '../Structures/SkyBlock/Museum/SkyBlockMuseumMember.js'; @@ -19,7 +20,7 @@ test('getSkyBlockMuseum (No input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - await expect(() => client.getSkyBlockMuseum()).rejects.toThrowError(client.errors.NO_UUID); + await expect(() => client.getSkyBlockMuseum()).rejects.toThrowError(Errors.NO_UUID); client.destroy(); }); diff --git a/src/API/getSkyBlockMuseum.ts b/src/API/getSkyBlockMuseum.ts index d7f5ca72c..afbf9af5e 100644 --- a/src/API/getSkyBlockMuseum.ts +++ b/src/API/getSkyBlockMuseum.ts @@ -1,5 +1,6 @@ import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; +import Errors from '../Errors.ts'; import RequestData from '../Private/RequestData.js'; import SkyBlockMuseum from '../Structures/SkyBlock/Museum/SkyBlockMuseum.js'; import type { RequestOptions } from '../Types/Requests.js'; @@ -12,7 +13,7 @@ class getSkyBlockMuseum extends Endpoint { } override async execute(profileId: string, options?: RequestOptions): Promise { - if (!profileId) throw new Error(this.client.errors.NO_UUID); + if (!profileId) throw new Error(Errors.NO_UUID); const res = await this.client.requestHandler.request(`/skyblock/museum?profile=${profileId}`, options); if (res.options.raw) return res; return new SkyBlockMuseum(res.data); diff --git a/src/API/getSkyBlockProfile.test.ts b/src/API/getSkyBlockProfile.test.ts index a19660996..c53c3b6a3 100644 --- a/src/API/getSkyBlockProfile.test.ts +++ b/src/API/getSkyBlockProfile.test.ts @@ -1,13 +1,15 @@ +/* eslint-disable max-len */ import Client from '../Client.js'; +import Errors from '../Errors.ts'; import RequestData from '../Private/RequestData.js'; import SkyBlockGarden from '../Structures/SkyBlock/Garden/SkyBlockGarden.js'; import SkyBlockMember from '../Structures/SkyBlock/Member/SkyBlockMember.js'; import SkyBlockProfile from '../Structures/SkyBlock/Profile/SkyBlockProfile.js'; import SkyBlockProfileBanking from '../Structures/SkyBlock/Profile/Banking/SkyBlockProfileBanking.js'; -// eslint-disable-next-line max-len import SkyBlockProfileCommunityUpgrades from '../Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgrades.js'; import { expect, expectTypeOf, test } from 'vitest'; import type { SkyBlockProfileName, SkyBlockProfileType } from '../Types/SkyBlock.js'; +/* eslint-enable max-len */ test('getSkyBlockProfile (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); @@ -23,14 +25,14 @@ test('getSkyBlockProfile (no input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - await expect(() => client.getSkyBlockProfile()).rejects.toThrowError(client.errors.NO_UUID); + await expect(() => client.getSkyBlockProfile()).rejects.toThrowError(Errors.NO_UUID); client.destroy(); }); test('getSkyBlockProfile (no profiles)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); await expect(() => client.getSkyBlockProfile('ce6685dd-78dd-4418-9f6f-b01cf9778daa')).rejects.toThrowError( - client.errors.NO_SKYBLOCK_PROFILES + Errors.NO_SKYBLOCK_PROFILES ); client.destroy(); }); diff --git a/src/API/getSkyBlockProfile.ts b/src/API/getSkyBlockProfile.ts index ac9a96918..1ce92593c 100644 --- a/src/API/getSkyBlockProfile.ts +++ b/src/API/getSkyBlockProfile.ts @@ -1,5 +1,6 @@ import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; +import Errors from '../Errors.ts'; import RequestData from '../Private/RequestData.js'; import SkyBlockGarden from '../Structures/SkyBlock/Garden/SkyBlockGarden.js'; import SkyBlockProfile from '../Structures/SkyBlock/Profile/SkyBlockProfile.js'; @@ -14,10 +15,10 @@ class getSkyBlockProfile extends Endpoint { } override async execute(profileId: string, options?: SkyBlockRequestOptions): Promise { - if (!profileId) throw new Error(this.client.errors.NO_UUID); + if (!profileId) throw new Error(Errors.NO_UUID); const res = await this.client.requestHandler.request(`/skyblock/profile?profile=${profileId}`, options); if (res.options.raw) return res; - if (!res.data.profile) throw new Error(this.client.errors.NO_SKYBLOCK_PROFILES); + if (!res.data.profile) throw new Error(Errors.NO_SKYBLOCK_PROFILES); const garden = await this.handleGettingSkyBlockGarden(res.data.profile.profile_id); const museum = await this.handleGettingSkyBlockMuseum(res.data.profile.profile_id); const parsedProfile = new SkyBlockProfile(res.data.profile, { uuid: null, garden, museum }); diff --git a/src/API/getSkyBlockProfiles.test.ts b/src/API/getSkyBlockProfiles.test.ts index acbade7df..17e2dce7e 100644 --- a/src/API/getSkyBlockProfiles.test.ts +++ b/src/API/getSkyBlockProfiles.test.ts @@ -1,14 +1,16 @@ +/* eslint-disable max-len */ import Client from '../Client.js'; +import Errors from '../Errors.ts'; import RequestData from '../Private/RequestData.js'; import SkyBlockGarden from '../Structures/SkyBlock/Garden/SkyBlockGarden.js'; import SkyBlockMember from '../Structures/SkyBlock/Member/SkyBlockMember.js'; import SkyBlockProfile from '../Structures/SkyBlock/Profile/SkyBlockProfile.js'; import SkyBlockProfileBanking from '../Structures/SkyBlock/Profile/Banking/SkyBlockProfileBanking.js'; -// eslint-disable-next-line max-len import SkyBlockProfileCommunityUpgrades from '../Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgrades.js'; import { expect, expectTypeOf, test } from 'vitest'; import type { SkyBlockProfileName, SkyBlockProfileType } from '../Types/SkyBlock.js'; import type { WithRaw } from '../Types/API.js'; +/* eslint-enable max-len */ test('getSkyBlockProfiles (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); @@ -24,14 +26,14 @@ test('getSkyBlockProfiles (no input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - await expect(() => client.getSkyBlockProfiles()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); + await expect(() => client.getSkyBlockProfiles()).rejects.toThrowError(Errors.NO_NICKNAME_UUID); client.destroy(); }); test('getSkyBlockProfiles (no profiles)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); await expect(() => client.getSkyBlockProfiles('b491990d53fd4c5fa61e19d58cc7eddf')).rejects.toThrowError( - client.errors.NO_SKYBLOCK_PROFILES + Errors.NO_SKYBLOCK_PROFILES ); client.destroy(); }); diff --git a/src/API/getSkyBlockProfiles.ts b/src/API/getSkyBlockProfiles.ts index 3ac0146cd..f49804d6d 100644 --- a/src/API/getSkyBlockProfiles.ts +++ b/src/API/getSkyBlockProfiles.ts @@ -1,5 +1,6 @@ import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; +import Errors from '../Errors.ts'; import RequestData from '../Private/RequestData.js'; import SkyBlockGarden from '../Structures/SkyBlock/Garden/SkyBlockGarden.js'; import SkyBlockProfile from '../Structures/SkyBlock/Profile/SkyBlockProfile.js'; @@ -18,11 +19,11 @@ class getSkyBlockProfiles extends Endpoint { query: string, options?: SkyBlockRequestOptions ): Promise> | RequestData> { - if (!query) throw new Error(this.client.errors.NO_NICKNAME_UUID); + if (!query) throw new Error(Errors.NO_NICKNAME_UUID); query = await this.client.requestHandler.toUUID(query); const res = await this.client.requestHandler.request(`/skyblock/profiles?uuid=${query}`, options); if (res.options.raw) return res; - if (!res.data.profiles || !res.data.profiles.length) throw new Error(this.client.errors.NO_SKYBLOCK_PROFILES); + if (!res.data.profiles || !res.data.profiles.length) throw new Error(Errors.NO_SKYBLOCK_PROFILES); const profiles: Map = new Map(); for (const profile of res.data.profiles) { const garden = await this.handleGettingSkyBlockGarden(profile.profile_id); diff --git a/src/Client.test.ts b/src/Client.test.ts index 4f6f1004d..ba098d668 100644 --- a/src/Client.test.ts +++ b/src/Client.test.ts @@ -5,10 +5,9 @@ import RequestHandler from './Private/RequestHandler.js'; import Updater from './Private/Updater.js'; import { expect, expectTypeOf, test } from 'vitest'; import type { ClientOptions } from './Types/Client.js'; -const errors = new Errors(); test('Client (No Key)', () => { - expect(() => new Client('')).toThrowError(errors.NO_API_KEY); + expect(() => new Client('')).toThrowError(Errors.NO_API_KEY); }); test('Client (No Options)', () => { @@ -68,10 +67,6 @@ test('Client (No Options)', () => { expect(client.updater).toBeInstanceOf(Updater); expectTypeOf(client.updater).toEqualTypeOf(); - expect(client.errors).toBeDefined(); - expect(client.errors).toBeInstanceOf(Errors); - expectTypeOf(client.errors).toEqualTypeOf(); - client.destroy(); }); @@ -141,9 +136,5 @@ test('Client (Options)', () => { expect(client.updater).toBeInstanceOf(Updater); expectTypeOf(client.updater).toEqualTypeOf(); - expect(client.errors).toBeDefined(); - expect(client.errors).toBeInstanceOf(Errors); - expectTypeOf(client.errors).toEqualTypeOf(); - client.destroy(); }); diff --git a/src/Client.ts b/src/Client.ts index 0ab2818b2..2bfc98234 100644 --- a/src/Client.ts +++ b/src/Client.ts @@ -52,14 +52,12 @@ class Client { declare cacheHandler: CacheHandler; declare functions: Functions; declare updater: Updater; - declare errors: Errors; declare rateLimit: RateLimit; readonly key: string; declare interval: NodeJS.Timeout; constructor(key: string, options?: ClientOptions) { this.key = key; - this.errors = new Errors(); - if (!this.key.length) throw new Error(this.errors.NO_API_KEY); + if (!this.key.length) throw new Error(Errors.NO_API_KEY); this.options = this.parasOptions(options); this.requestHandler = new RequestHandler(this); this.cacheHandler = new CacheHandler(this); @@ -77,7 +75,7 @@ class Client { } if (clients.find((x) => x.key === key)) { // eslint-disable-next-line no-console - console.warn(this.errors.MULTIPLE_INSTANCES); + console.warn(Errors.MULTIPLE_INSTANCES); const found = clients.find((x) => x.key === key); if (found) { this.destroy(); @@ -118,23 +116,23 @@ class Client { /* v8 ignore next 140 */ public getAchievements(options?: RequestOptions): Promise { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getActiveHouses(options?: RequestOptions): Promise | RequestData> { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getBoosters(options?: RequestOptions): Promise | RequestData> { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getChallenges(options?: RequestOptions): Promise { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getGameCounts(options?: RequestOptions): Promise { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getGuild( @@ -142,35 +140,35 @@ class Client { query: string, options?: RequestOptions ): Promise { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getGuildAchievements(options?: RequestOptions): Promise { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getHouse(query: string, options?: RequestOptions): Promise { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getLeaderboards(options?: RequestOptions): Promise> | RequestData> { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getPlayer(query: string, options?: PlayerRequestOptions): Promise { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getPlayerHouses(query: string, options?: RequestOptions): Promise | RequestData> { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getQuests(options?: RequestOptions): Promise { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getRecentGames(query: string, options?: RequestOptions): Promise | RequestData> { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getSkyBlockAuction( @@ -178,80 +176,80 @@ class Client { query: string, options?: AuctionRequestOptions ): Promise { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getSkyBlockAuctions( query: number | '*', options?: AuctionRequestOptions ): Promise { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getSkyBlockBazaar(options?: RequestOptions): Promise { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getSkyBlockBingo(options?: RequestOptions): Promise { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getSkyBlockCollections(options?: RequestOptions): Promise { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getSkyBlockElection(options?: RequestOptions): Promise { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getSkyBlockEndedAuctions(options?: AuctionRequestOptions): Promise { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getSkyBlockFireSales(options?: RequestOptions): Promise | RequestData> { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getSkyBlockGarden(profileId: string, options?: RequestOptions): Promise { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getSkyBlockItems(options?: RequestOptions): Promise | RequestData> { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getSkyBlockMuseum(profileId: string, options?: RequestOptions): Promise { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getSkyBlockNews(options?: RequestOptions): Promise | RequestData> { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getSkyBlockProfile( profileId: string, options?: SkyBlockRequestOptions ): Promise { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getSkyBlockProfiles( query: string, options?: SkyBlockRequestOptions ): Promise> | RequestData> { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getSkyBlockSkills(options?: RequestOptions): Promise { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getStatus(query: string, options?: RequestOptions): Promise { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } public getWatchdogStats(options?: RequestOptions): Promise { - throw new Error(this.errors.ENDPOINT_NOT_LOADED); + throw new Error(Errors.ENDPOINT_NOT_LOADED); } } diff --git a/src/Errors.ts b/src/Errors.ts index c41135754..b9a612797 100644 --- a/src/Errors.ts +++ b/src/Errors.ts @@ -1,45 +1,46 @@ /* eslint-disable max-len */ class Errors { - INVALID_API_KEY: string = + static INVALID_API_KEY: string = '[Hypixel-API-Reborn] Invalid API Key! For help join our Discord Server https://discord.gg/NSEBNMM'; - NO_API_KEY: string = + static NO_API_KEY: string = '[Hypixel-API-Reborn] No API Key specified! For help join our Discord Server https://discord.gg/NSEBNMM'; - ERROR_CODE_CAUSE: string = + static ERROR_CODE_CAUSE: string = '[Hypixel-API-Reborn] Code: {code} - {cause}! For help join our Discord Server https://discord.gg/NSEBNMM'; - ERROR_STATUSTEXT: string = + static ERROR_STATUSTEXT: string = '[Hypixel-API-Reborn] {statustext}! For help join our Discord Server https://discord.gg/NSEBNMM'; - NO_NICKNAME_UUID: string = '[Hypixel-API-Reborn] No nickname or uuid specified.'; - NO_UUID: string = '[Hypixel-API-Reborn] No uuid specified.'; - UUID_NICKNAME_MUST_BE_A_STRING: string = '[Hypixel-API-Reborn] Nickname or uuid must be a string.'; - MALFORMED_UUID: string = '[Hypixel-API-Reborn] Malformed UUID!'; - PLAYER_HAS_NEVER_LOGGED: string = '[Hypixel-API-Reborn] Player has never logged into Hypixel.'; - NO_GUILD_QUERY: string = '[Hypixel-API-Reborn] No guild search query specified.'; - INVALID_GUILD_ID: string = '[Hypixel-API-Reborn] Specified Guild ID is invalid.'; - INVALID_GUILD_SEARCH_PARAMETER: string = + static NO_NICKNAME_UUID: string = '[Hypixel-API-Reborn] No nickname or uuid specified.'; + static NO_UUID: string = '[Hypixel-API-Reborn] No uuid specified.'; + static UUID_NICKNAME_MUST_BE_A_STRING: string = '[Hypixel-API-Reborn] Nickname or uuid must be a string.'; + static MALFORMED_UUID: string = '[Hypixel-API-Reborn] Malformed UUID!'; + static PLAYER_HAS_NEVER_LOGGED: string = '[Hypixel-API-Reborn] Player has never logged into Hypixel.'; + static NO_GUILD_QUERY: string = '[Hypixel-API-Reborn] No guild search query specified.'; + static INVALID_GUILD_ID: string = '[Hypixel-API-Reborn] Specified Guild ID is invalid.'; + static INVALID_GUILD_SEARCH_PARAMETER: string = "[Hypixel-API-Reborn] getGuild() searchParameter must be 'id'; 'guild' or 'player'."; - SOMETHING_WENT_WRONG: string = '[Hypixel-API-Reborn] Something went wrong. {cause}'; - GUILD_DOES_NOT_EXIST: string = '[Hypixel-API-Reborn] Guild does not exist.'; - PAGE_INDEX_ERROR: string = + static SOMETHING_WENT_WRONG: string = '[Hypixel-API-Reborn] Something went wrong. {cause}'; + static GUILD_DOES_NOT_EXIST: string = '[Hypixel-API-Reborn] Guild does not exist.'; + static PAGE_INDEX_ERROR: string = '[Hypixel-API-Reborn] Invalid page index. Must be an integer, an array of 2 integers, or a keyword. For help join our Discord Server https://discord.gg/NSEBNMM'; - INVALID_OPTION_VALUE: string = + static INVALID_OPTION_VALUE: string = '[Hypixel-API-Reborn] Invalid option value! For help join our Discord Server https://discord.gg/NSEBNMM'; - UPDATER_REQUEST_NOT_OK: string = '[Hypixel-API-Reborn] Something went wrong while checking for updates.'; - MULTIPLE_INSTANCES: string = + static UPDATER_REQUEST_NOT_OK: string = '[Hypixel-API-Reborn] Something went wrong while checking for updates.'; + static MULTIPLE_INSTANCES: string = '[Hypixel-API-Reborn] Multiple instances of hypixel-api-reborn are found so we merged them for you. Please refrain from spawning multiple instances in the future. For more information, join our Discord Server https://discord.gg/NSEBNMM.'; - UNEXPECTED_ERROR: string = + static UNEXPECTED_ERROR: string = "[Hypixel-API-Reborn] The data provided to hypixel API is malformed and thus not recognized by hypixel, but this shouldn't be your fault. Please report this error in our Discord Server https://discord.gg/NSEBNMM or GitHub. "; - RATE_LIMIT_EXCEEDED: string = + static RATE_LIMIT_EXCEEDED: string = "[Hypixel-API-Reborn] The rate limitations on your API Key has been exceeded. There might be an outage (Check Hypixel's status page), or you simply did too many requests in a short time. Hint: Enable rate limit options! They can help you avoid this error! For help join our Discord Server https://discord.gg/NSEBNMM"; - RECENT_REQUEST: string = + static RECENT_REQUEST: string = '[Hypixel-API-Reborn] You have requested that player recently. Try turning on cache. For help join our Discord Server https://discord.gg/NSEBNMM'; - NO_SKYBLOCK_PROFILES: string = '[Hypixel-API-Reborn] The player has no SkyBlock profiles.'; - BAD_AUCTION_FILTER: string = + static NO_SKYBLOCK_PROFILES: string = '[Hypixel-API-Reborn] The player has no SkyBlock profiles.'; + static BAD_AUCTION_FILTER: string = '[Hypixel-API-Reborn] Unexpected filter for Client#getSkyBlockAuction. Expected one of "PROFILE", "PLAYER", "AUCTION_ID", but got something else.'; - NOT_IMPLEMENTED: string = + static NOT_IMPLEMENTED: string = '[Hypixel-API-Reborn] Endpoint execute method is not implemented yet! Please report this https://discord.gg/NSEBNMM'; - RATE_LIMIT_INIT_ERROR: string = + static RATE_LIMIT_INIT_ERROR: string = '[hypixel-api-reborn] An error happened whilst initializing rate limit. We strongly recommend restarting the code as this can lead to de-synchronization.'; - ENDPOINT_NOT_LOADED: string = '[hypixel-api-reborn] This endpoint has not been loaded yet. Please restart your code'; + static ENDPOINT_NOT_LOADED: string = + '[hypixel-api-reborn] This endpoint has not been loaded yet. Please restart your code'; } export default Errors; diff --git a/src/Private/Endpoint.test.ts b/src/Private/Endpoint.test.ts index 9520145dd..38fbeeba3 100644 --- a/src/Private/Endpoint.test.ts +++ b/src/Private/Endpoint.test.ts @@ -1,5 +1,6 @@ import Client from '../Client.js'; import Endpoint from './Endpoint.js'; +import Errors from '../Errors.ts'; import { expect, expectTypeOf, test } from 'vitest'; test('Endpoint', () => { @@ -17,7 +18,7 @@ test('Endpoint', () => { expect(endpoint.execute).toBeDefined(); expectTypeOf(endpoint.execute).toBeFunction(); - expect(() => endpoint.execute()).toThrowError(client.errors.NOT_IMPLEMENTED); + expect(() => endpoint.execute()).toThrowError(Errors.NOT_IMPLEMENTED); client.destroy(); }); diff --git a/src/Private/Endpoint.ts b/src/Private/Endpoint.ts index 87b35258f..e15066ec8 100644 --- a/src/Private/Endpoint.ts +++ b/src/Private/Endpoint.ts @@ -1,4 +1,5 @@ import Client from '../Client.js'; +import Errors from '../Errors.ts'; class Endpoint { readonly client: Client; @@ -7,7 +8,7 @@ class Endpoint { } execute(...args: any[]): Promise | any { - throw new Error(this.client.errors.NOT_IMPLEMENTED); + throw new Error(Errors.NOT_IMPLEMENTED); } } diff --git a/src/Private/RateLimit.test.ts b/src/Private/RateLimit.test.ts index 074f89d40..0e164dc65 100644 --- a/src/Private/RateLimit.test.ts +++ b/src/Private/RateLimit.test.ts @@ -1,4 +1,5 @@ import Client from '../Client.js'; +import Errors from '../Errors.ts'; import RateLimit from './RateLimit.js'; import { defaultRequestData } from '../../vitest.setup.js'; import { expect, expectTypeOf, test, vi } from 'vitest'; @@ -86,7 +87,7 @@ test('Ratelimit (Bad Sync Data)', async () => { ...defaultRequestData, headers: new Headers({ hello: '100' }) } as any); - await expect(() => client.rateLimit.sync()).rejects.toThrowError(client.errors.RATE_LIMIT_INIT_ERROR); + await expect(() => client.rateLimit.sync()).rejects.toThrowError(Errors.RATE_LIMIT_INIT_ERROR); vi.restoreAllMocks(); client.destroy(); }); diff --git a/src/Private/RateLimit.ts b/src/Private/RateLimit.ts index 9d83934dd..e9ae831f2 100644 --- a/src/Private/RateLimit.ts +++ b/src/Private/RateLimit.ts @@ -1,4 +1,5 @@ import Client from '../Client.js'; +import Errors from '../Errors.ts'; class RateLimit { readonly client: Client; @@ -17,7 +18,7 @@ class RateLimit { async sync() { const { headers } = await this.client.requestHandler.request('/boosters', { raw: true }); if (headers?.['ratelimit-limit'] === undefined || headers?.['ratelimit-remaining'] === undefined) { - throw new Error(this.client.errors.RATE_LIMIT_INIT_ERROR); + throw new Error(Errors.RATE_LIMIT_INIT_ERROR); } this.requests = headers['ratelimit-limit'] - headers['ratelimit-remaining']; this.limit = Number(headers['ratelimit-limit']); diff --git a/src/Private/RequestHandler.test.ts b/src/Private/RequestHandler.test.ts index fc8255eed..8336e45ee 100644 --- a/src/Private/RequestHandler.test.ts +++ b/src/Private/RequestHandler.test.ts @@ -1,4 +1,5 @@ import Client from '../Client.js'; +import Errors from '../Errors.ts'; import RequestHandler from './RequestHandler.js'; import { defaultRequestData } from '../../vitest.setup.js'; import { expect, expectTypeOf, test, vi } from 'vitest'; @@ -17,12 +18,10 @@ test('RequestHandler', async () => { expect(data).toBe('14727faefbdc4aff848cd2713eb9939e'); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - await expect(() => client.requestHandler.toUUID()).rejects.toThrowError(client.errors.NO_NICKNAME_UUID); + await expect(() => client.requestHandler.toUUID()).rejects.toThrowError(Errors.NO_NICKNAME_UUID); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - await expect(() => client.requestHandler.toUUID(-1)).rejects.toThrowError( - client.errors.UUID_NICKNAME_MUST_BE_A_STRING - ); + await expect(() => client.requestHandler.toUUID(-1)).rejects.toThrowError(Errors.UUID_NICKNAME_MUST_BE_A_STRING); client.destroy(); }); @@ -36,7 +35,7 @@ test('RequestHandler (Invalid API Key)', async () => { status: 403, json: () => Promise.resolve({ success: false }) } as any); - await expect(() => client.requestHandler.request('/boosters')).rejects.toThrowError(client.errors.INVALID_API_KEY); + await expect(() => client.requestHandler.request('/boosters')).rejects.toThrowError(Errors.INVALID_API_KEY); vi.restoreAllMocks(); client.destroy(); }); @@ -51,7 +50,7 @@ test('RequestHandler (400 Bad Request)', async () => { json: () => Promise.resolve({ success: false, cause: 'meow' }) } as any); await expect(() => client.requestHandler.request('/boosters')).rejects.toThrowError( - client.errors.ERROR_CODE_CAUSE.replace(/{code}/, '400 Bad Request').replace(/{cause}/, 'meow') + Errors.ERROR_CODE_CAUSE.replace(/{code}/, '400 Bad Request').replace(/{cause}/, 'meow') ); vi.restoreAllMocks(); client.destroy(); @@ -67,7 +66,7 @@ test('RequestHandler (400 Bad Request No Cause)', async () => { json: () => Promise.resolve({ success: false }) } as any); await expect(() => client.requestHandler.request('/boosters')).rejects.toThrowError( - client.errors.ERROR_CODE_CAUSE.replace(/{code}/, '400 Bad Request').replace(/{cause}/, 'Unknown') + Errors.ERROR_CODE_CAUSE.replace(/{code}/, '400 Bad Request').replace(/{cause}/, 'Unknown') ); vi.restoreAllMocks(); client.destroy(); @@ -82,7 +81,7 @@ test('RequestHandler (Unprocessable Entity)', async () => { status: 422, json: () => Promise.resolve({ success: false }) } as any); - await expect(() => client.requestHandler.request('/boosters')).rejects.toThrowError(client.errors.UNEXPECTED_ERROR); + await expect(() => client.requestHandler.request('/boosters')).rejects.toThrowError(Errors.UNEXPECTED_ERROR); vi.restoreAllMocks(); client.destroy(); }); @@ -96,9 +95,7 @@ test('RequestHandler (Rate Limited)', async () => { status: 429, json: () => Promise.resolve({ success: false }) } as any); - await expect(() => client.requestHandler.request('/boosters')).rejects.toThrowError( - client.errors.RATE_LIMIT_EXCEEDED - ); + await expect(() => client.requestHandler.request('/boosters')).rejects.toThrowError(Errors.RATE_LIMIT_EXCEEDED); vi.restoreAllMocks(); client.destroy(); }); diff --git a/src/Private/RequestHandler.ts b/src/Private/RequestHandler.ts index 320704e53..09e597bbc 100644 --- a/src/Private/RequestHandler.ts +++ b/src/Private/RequestHandler.ts @@ -1,5 +1,6 @@ const BASE_URL = 'https://api.hypixel.net/v2'; import Client from '../Client.js'; +import Errors from '../Errors.ts'; import RequestData from './RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; @@ -24,32 +25,29 @@ class RequestHandler { const res = await fetch(BASE_URL + endpoint, { headers: { 'API-Key': this.client.key } }); if (500 <= res.status && 528 > res.status) { throw new Error( - this.client.errors.ERROR_STATUSTEXT.replace(/{statustext}/, `Server Error : ${res.status} ${res.statusText}`) + Errors.ERROR_STATUSTEXT.replace(/{statustext}/, `Server Error : ${res.status} ${res.statusText}`) ); } const parsedRes = (await res.json()) as Record; if (400 === res.status) { throw new Error( - this.client.errors.ERROR_CODE_CAUSE.replace(/{code}/, '400 Bad Request').replace( - /{cause}/, - parsedRes.cause || 'Unknown' - ) + Errors.ERROR_CODE_CAUSE.replace(/{code}/, '400 Bad Request').replace(/{cause}/, parsedRes.cause || 'Unknown') ); } - if (403 === res.status) throw new Error(this.client.errors.INVALID_API_KEY); - if (422 === res.status) throw new Error(this.client.errors.UNEXPECTED_ERROR); + if (403 === res.status) throw new Error(Errors.INVALID_API_KEY); + if (422 === res.status) throw new Error(Errors.UNEXPECTED_ERROR); if ( 429 === res.status && 'You have already looked up this player too recently, please try again shortly' === parsedRes.cause ) { - throw new Error(this.client.errors.RECENT_REQUEST); + throw new Error(Errors.RECENT_REQUEST); } - if (429 === res.status) throw new Error(this.client.errors.RATE_LIMIT_EXCEEDED); + if (429 === res.status) throw new Error(Errors.RATE_LIMIT_EXCEEDED); if (200 !== res.status) { - throw new Error(this.client.errors.ERROR_STATUSTEXT.replace(/{statustext}/, res.statusText)); + throw new Error(Errors.ERROR_STATUSTEXT.replace(/{statustext}/, res.statusText)); } if (!parsedRes.success && !endpoint.startsWith('/housing')) { - throw new Error(this.client.errors.SOMETHING_WENT_WRONG.replace(/{cause}/, res.statusText)); + throw new Error(Errors.SOMETHING_WENT_WRONG.replace(/{cause}/, res.statusText)); } this.client.rateLimit.requests++; const headers: Record = {}; @@ -68,8 +66,8 @@ class RequestHandler { } async toUUID(input: string): Promise { - if (!input) throw new Error(this.client.errors.NO_NICKNAME_UUID); - if ('string' !== typeof input) throw new Error(this.client.errors.UUID_NICKNAME_MUST_BE_A_STRING); + if (!input) throw new Error(Errors.NO_NICKNAME_UUID); + if ('string' !== typeof input) throw new Error(Errors.UUID_NICKNAME_MUST_BE_A_STRING); if (this.client.functions.isUUID(input)) return input.replace(/-/g, ''); const url = `https://mowojang.matdoes.dev/${input}`; if (this.client.cacheHandler.has(url)) { @@ -78,23 +76,20 @@ class RequestHandler { const res = await fetch(url); if (500 <= res.status && 528 > res.status) { throw new Error( - this.client.errors.ERROR_STATUSTEXT.replace(/{statustext}/, `Server Error : ${res.status} ${res.statusText}`) + Errors.ERROR_STATUSTEXT.replace(/{statustext}/, `Server Error : ${res.status} ${res.statusText}`) ); } const parsedRes = (await res.json()) as Record; if (400 === res.status) { throw new Error( - this.client.errors.ERROR_CODE_CAUSE.replace(/{code}/, '400 Bad Request').replace( - /{cause}/, - parsedRes.cause || '' - ) + Errors.ERROR_CODE_CAUSE.replace(/{code}/, '400 Bad Request').replace(/{cause}/, parsedRes.cause || '') ); } if (200 !== res.status) { - throw new Error(this.client.errors.ERROR_STATUSTEXT.replace(/{statustext}/, res.statusText)); + throw new Error(Errors.ERROR_STATUSTEXT.replace(/{statustext}/, res.statusText)); } if ('string' !== typeof parsedRes.id || 'string' !== typeof parsedRes.name) { - throw new Error(this.client.errors.MALFORMED_UUID); + throw new Error(Errors.MALFORMED_UUID); } if (this.client.options.cache) { this.client.cacheHandler.set(url, parsedRes.id); diff --git a/src/Private/Updater.test.ts b/src/Private/Updater.test.ts index 705331970..0b447def3 100644 --- a/src/Private/Updater.test.ts +++ b/src/Private/Updater.test.ts @@ -1,4 +1,5 @@ import Client from '../Client.js'; +import Errors from '../Errors.ts'; import Updater from './Updater.js'; import packageJSON from '../../package.json' with { type: 'json' }; import { defaultRequestData } from '../../vitest.setup.js'; @@ -54,7 +55,7 @@ test('Updater (getLatestVersion error)', async () => { status: 404, json: () => Promise.resolve({ 'dist-tags': { latest: '1.0.0' } }) } as any); - await expect(() => client.updater.getLatestVersion()).rejects.toThrowError(client.errors.UPDATER_REQUEST_NOT_OK); + await expect(() => client.updater.getLatestVersion()).rejects.toThrowError(Errors.UPDATER_REQUEST_NOT_OK); vi.restoreAllMocks(); client.destroy(); }); diff --git a/src/Private/Updater.ts b/src/Private/Updater.ts index de820e9f9..f93405a7b 100644 --- a/src/Private/Updater.ts +++ b/src/Private/Updater.ts @@ -1,5 +1,6 @@ /* eslint-disable no-console */ import Client from '../Client.js'; +import Errors from '../Errors.ts'; import packageJson from '../../package.json' with { type: 'json' }; class Updater { @@ -26,7 +27,7 @@ class Updater { async getLatestVersion(): Promise { const request = await this.client.requestHandler.fetchExternalData('https://registry.npmjs.org/hypixel-api-reborn'); - if (200 !== request.statusCode) throw new Error(this.client.errors.UPDATER_REQUEST_NOT_OK); + if (200 !== request.statusCode) throw new Error(Errors.UPDATER_REQUEST_NOT_OK); return request.data['dist-tags'].latest; } From 2481f9dc20b9c5f5cc128b9f31cb266879d14d74 Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 17 Sep 2025 10:50:18 +0800 Subject: [PATCH 041/124] fix(API-Endpoints): Remove redeclaring client --- src/API/getAchievements.ts | 7 ------- src/API/getActiveHouses.ts | 7 ------- src/API/getBoosters.ts | 7 ------- src/API/getChallenges.ts | 7 ------- src/API/getGameCounts.ts | 7 ------- src/API/getGuild.ts | 7 ------- src/API/getGuildAchievements.ts | 7 ------- src/API/getHouse.ts | 7 ------- src/API/getLeaderboards.ts | 7 ------- src/API/getPlayer.ts | 7 ------- src/API/getPlayerHouses.ts | 7 ------- src/API/getQuests.ts | 7 ------- src/API/getRecentGames.ts | 7 ------- src/API/getSkyBlockAuction.ts | 7 ------- src/API/getSkyBlockAuctions.ts | 8 -------- src/API/getSkyBlockBazaar.ts | 7 ------- src/API/getSkyBlockBingo.ts | 7 ------- src/API/getSkyBlockCollections.ts | 7 ------- src/API/getSkyBlockElection.ts | 7 ------- src/API/getSkyBlockEndedAuctions.ts | 8 -------- src/API/getSkyBlockFireSales.ts | 7 ------- src/API/getSkyBlockGarden.ts | 7 ------- src/API/getSkyBlockItems.ts | 7 ------- src/API/getSkyBlockMuseum.ts | 7 ------- src/API/getSkyBlockNews.ts | 7 ------- src/API/getSkyBlockProfile.ts | 7 ------- src/API/getSkyBlockProfiles.ts | 7 ------- src/API/getSkyBlockSkills.ts | 7 ------- src/API/getStatus.ts | 7 ------- src/API/getWatchdogStats.ts | 7 ------- 30 files changed, 212 deletions(-) diff --git a/src/API/getAchievements.ts b/src/API/getAchievements.ts index b92ec2772..86879ff2e 100644 --- a/src/API/getAchievements.ts +++ b/src/API/getAchievements.ts @@ -1,16 +1,9 @@ import Achievements from '../Structures/Static/Achievements/Achievements.js'; -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; class getAchievements extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/resources/achievements', options); if (res.options.raw) return res; diff --git a/src/API/getActiveHouses.ts b/src/API/getActiveHouses.ts index 2ee4ee6e4..45f896be6 100644 --- a/src/API/getActiveHouses.ts +++ b/src/API/getActiveHouses.ts @@ -1,4 +1,3 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import House from '../Structures/House.js'; import RequestData from '../Private/RequestData.js'; @@ -6,12 +5,6 @@ import type { RequestOptions } from '../Types/Requests.js'; import type { WithRaw } from '../Types/API.ts'; class getActiveHouses extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute(options?: RequestOptions): Promise | RequestData> { const res = await this.client.requestHandler.request('/housing/active', options); if (res.options.raw) return res; diff --git a/src/API/getBoosters.ts b/src/API/getBoosters.ts index c8e5561a0..d48e5121b 100644 --- a/src/API/getBoosters.ts +++ b/src/API/getBoosters.ts @@ -1,17 +1,10 @@ import Booster from '../Structures/Boosters/Booster.js'; -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; import type { WithRaw } from '../Types/API.ts'; class getBoosters extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute(options?: RequestOptions): Promise | RequestData> { const res = await this.client.requestHandler.request('/boosters', options); if (res.options.raw) return res; diff --git a/src/API/getChallenges.ts b/src/API/getChallenges.ts index 639095a30..4fd0b2680 100644 --- a/src/API/getChallenges.ts +++ b/src/API/getChallenges.ts @@ -1,16 +1,9 @@ import Challenges from '../Structures/Static/Challenges.js'; -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; class getChallenges extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/resources/challenges', options); if (res.options.raw) return res; diff --git a/src/API/getGameCounts.ts b/src/API/getGameCounts.ts index c72a58964..619508d1f 100644 --- a/src/API/getGameCounts.ts +++ b/src/API/getGameCounts.ts @@ -1,16 +1,9 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import GameCounts from '../Structures/GameCounts.js'; import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; class getGameCounts extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/counts', options); if (res.options.raw) return res; diff --git a/src/API/getGuild.ts b/src/API/getGuild.ts index 0a87c09c6..a3baa21d7 100644 --- a/src/API/getGuild.ts +++ b/src/API/getGuild.ts @@ -1,4 +1,3 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import Errors from '../Errors.ts'; import Guild from '../Structures/Guild/Guild.js'; @@ -7,12 +6,6 @@ import type { GuildFetchOptions } from '../Types/API.js'; import type { RequestOptions } from '../Types/Requests.js'; class getGuild extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute( searchParameter: GuildFetchOptions, query: string, diff --git a/src/API/getGuildAchievements.ts b/src/API/getGuildAchievements.ts index e6a1f8cf3..bb87ca8cf 100644 --- a/src/API/getGuildAchievements.ts +++ b/src/API/getGuildAchievements.ts @@ -1,16 +1,9 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import GuildAchievements from '../Structures/Static/Achievements/GuildAchievements.js'; import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; class getGuildAchievements extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/resources/guilds/achievements', options); if (res.options.raw) return res; diff --git a/src/API/getHouse.ts b/src/API/getHouse.ts index 8df3b7c5d..1a4d42ef4 100644 --- a/src/API/getHouse.ts +++ b/src/API/getHouse.ts @@ -1,4 +1,3 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import Errors from '../Errors.ts'; import House from '../Structures/House.js'; @@ -6,12 +5,6 @@ import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; class getHouse extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute(query: string, options?: RequestOptions): Promise { if (!query) throw new Error(Errors.NO_UUID); const res = await this.client.requestHandler.request(`/housing/house?house=${query}`, options); diff --git a/src/API/getLeaderboards.ts b/src/API/getLeaderboards.ts index 02f6a5d16..cd4bb2924 100644 --- a/src/API/getLeaderboards.ts +++ b/src/API/getLeaderboards.ts @@ -1,4 +1,3 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import Errors from '../Errors.ts'; import Leaderboard from '../Structures/Leaderboard.js'; @@ -7,12 +6,6 @@ import type { RequestOptions } from '../Types/Requests.js'; import type { WithRaw } from '../Types/API.ts'; class getLeaderboards extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute(options?: RequestOptions): Promise> | RequestData> { const res = await this.client.requestHandler.request('/leaderboards', options); if (res.options.raw) return res; diff --git a/src/API/getPlayer.ts b/src/API/getPlayer.ts index 991b6b43b..35db54845 100644 --- a/src/API/getPlayer.ts +++ b/src/API/getPlayer.ts @@ -1,4 +1,3 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import Errors from '../Errors.ts'; import Guild from '../Structures/Guild/Guild.js'; @@ -9,12 +8,6 @@ import RequestData from '../Private/RequestData.js'; import type { PlayerRequestOptions } from '../Types/API.js'; class getPlayer extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute(query: string, options?: PlayerRequestOptions): Promise { if (!query) throw new Error(Errors.NO_NICKNAME_UUID); query = await this.client.requestHandler.toUUID(query); diff --git a/src/API/getPlayerHouses.ts b/src/API/getPlayerHouses.ts index 7a09c30c6..7d66bf971 100644 --- a/src/API/getPlayerHouses.ts +++ b/src/API/getPlayerHouses.ts @@ -1,4 +1,3 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import Errors from '../Errors.ts'; import House from '../Structures/House.js'; @@ -7,12 +6,6 @@ import type { RequestOptions } from '../Types/Requests.js'; import type { WithRaw } from '../Types/API.ts'; class getPlayerHouses extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute(query: string, options?: RequestOptions): Promise | RequestData> { if (!query) throw new Error(Errors.NO_NICKNAME_UUID); query = await this.client.requestHandler.toUUID(query); diff --git a/src/API/getQuests.ts b/src/API/getQuests.ts index ae8a0511d..dcc7120f9 100644 --- a/src/API/getQuests.ts +++ b/src/API/getQuests.ts @@ -1,16 +1,9 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import Quests from '../Structures/Static/Quests.js'; import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; class getQuests extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/resources/quests', options); if (res.options.raw) return res; diff --git a/src/API/getRecentGames.ts b/src/API/getRecentGames.ts index a10786df4..0d30b0995 100644 --- a/src/API/getRecentGames.ts +++ b/src/API/getRecentGames.ts @@ -1,4 +1,3 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import Errors from '../Errors.ts'; import RecentGame from '../Structures/RecentGame.js'; @@ -7,12 +6,6 @@ import type { RequestOptions } from '../Types/Requests.js'; import type { WithRaw } from '../Types/API.ts'; class getRecentGames extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute(query: string, options?: RequestOptions): Promise | RequestData> { if (!query) throw new Error(Errors.NO_NICKNAME_UUID); query = await this.client.requestHandler.toUUID(query); diff --git a/src/API/getSkyBlockAuction.ts b/src/API/getSkyBlockAuction.ts index 3c6059dd5..1de093a29 100644 --- a/src/API/getSkyBlockAuction.ts +++ b/src/API/getSkyBlockAuction.ts @@ -1,4 +1,3 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import Errors from '../Errors.ts'; import RequestData from '../Private/RequestData.js'; @@ -7,12 +6,6 @@ import SkyBlockBaseAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockBas import type { AuctionFetchOptions, AuctionRequestOptions, SkyBlockAuctionResult } from '../Types/API.js'; class getSkyBlockAction extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute( type: AuctionFetchOptions, query: string, diff --git a/src/API/getSkyBlockAuctions.ts b/src/API/getSkyBlockAuctions.ts index f0b58876e..1df8bb28b 100644 --- a/src/API/getSkyBlockAuctions.ts +++ b/src/API/getSkyBlockAuctions.ts @@ -1,4 +1,3 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import Errors from '../Errors.ts'; import SkyBlockAuction from '../Structures/SkyBlock/Auctions/SkyBlockAuction.js'; @@ -7,13 +6,6 @@ import type RequestData from '../Private/RequestData.js'; import type { AuctionRequestOptions, SkyBlockAuctionsResult } from '../Types/API.js'; class getSkyBlockAuctions extends Endpoint { - override readonly client: Client; - declare options: AuctionRequestOptions; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute( query: number | '*', options?: AuctionRequestOptions diff --git a/src/API/getSkyBlockBazaar.ts b/src/API/getSkyBlockBazaar.ts index 8bbcedeb8..e183aefad 100644 --- a/src/API/getSkyBlockBazaar.ts +++ b/src/API/getSkyBlockBazaar.ts @@ -1,16 +1,9 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockBazaar from '../Structures/SkyBlock/Bazaar/SkyBlockBazaar.js'; import type { RequestOptions } from '../Types/Requests.js'; class getSkyBlockBazaar extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/skyblock/bazaar', options); if (res.options.raw) return res; diff --git a/src/API/getSkyBlockBingo.ts b/src/API/getSkyBlockBingo.ts index 9ecb6b6ba..1369770fb 100644 --- a/src/API/getSkyBlockBingo.ts +++ b/src/API/getSkyBlockBingo.ts @@ -1,16 +1,9 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockBingo from '../Structures/SkyBlock/Bingo/SkyBlockBingo.js'; import type { RequestOptions } from '../Types/Requests.js'; class getSkyBlockBingo extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/resources/skyblock/bingo', options); if (res.options.raw) return res; diff --git a/src/API/getSkyBlockCollections.ts b/src/API/getSkyBlockCollections.ts index 6a5c3e7e8..de7d73797 100644 --- a/src/API/getSkyBlockCollections.ts +++ b/src/API/getSkyBlockCollections.ts @@ -1,16 +1,9 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockCollections from '../Structures/SkyBlock/Collections/SkyBlockCollections.js'; import type { RequestOptions } from '../Types/Requests.js'; class getSkyBlockCollections extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/resources/skyblock/items', options); if (res.options.raw) return res; diff --git a/src/API/getSkyBlockElection.ts b/src/API/getSkyBlockElection.ts index 467165a65..eb8e0282c 100644 --- a/src/API/getSkyBlockElection.ts +++ b/src/API/getSkyBlockElection.ts @@ -1,16 +1,9 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockElectionData from '../Structures/SkyBlock/Election/SkyBlockElectionData.js'; import type { RequestOptions } from '../Types/Requests.js'; class getSkyBlockElection extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/resources/skyblock/election', options); if (res.options.raw) return res; diff --git a/src/API/getSkyBlockEndedAuctions.ts b/src/API/getSkyBlockEndedAuctions.ts index 4ea7e5e27..b48e7eb6c 100644 --- a/src/API/getSkyBlockEndedAuctions.ts +++ b/src/API/getSkyBlockEndedAuctions.ts @@ -1,4 +1,3 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import SkyBlockAuction from '../Structures/SkyBlock/Auctions/SkyBlockAuction.js'; import SkyBlockBaseAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.js'; @@ -6,13 +5,6 @@ import type RequestData from '../Private/RequestData.js'; import type { AuctionRequestOptions, SkyBlockAuctionResult } from '../Types/API.js'; class getSkyBlockEndedAuctions extends Endpoint { - override readonly client: Client; - declare options: AuctionRequestOptions; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute(options?: AuctionRequestOptions): Promise { const res = await this.client.requestHandler.request('/skyblock/auctions_ended', options); if (res.options.raw) return res; diff --git a/src/API/getSkyBlockFireSales.ts b/src/API/getSkyBlockFireSales.ts index 246d88ec2..9e2d58f0f 100644 --- a/src/API/getSkyBlockFireSales.ts +++ b/src/API/getSkyBlockFireSales.ts @@ -1,4 +1,3 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockFireSale from '../Structures/SkyBlock/FireSale/SkyBlockFireSale.js'; @@ -6,12 +5,6 @@ import type { RequestOptions } from '../Types/Requests.js'; import type { WithRaw } from '../Types/API.ts'; class getSkyBlockSkyBlockFireSales extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute(options?: RequestOptions): Promise | RequestData> { const res = await this.client.requestHandler.request('/skyblock/firesales', options); if (res.options.raw) return res; diff --git a/src/API/getSkyBlockGarden.ts b/src/API/getSkyBlockGarden.ts index cf21ccab3..9388e4bb8 100644 --- a/src/API/getSkyBlockGarden.ts +++ b/src/API/getSkyBlockGarden.ts @@ -1,4 +1,3 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import Errors from '../Errors.ts'; import RequestData from '../Private/RequestData.js'; @@ -6,12 +5,6 @@ import SkyBlockGarden from '../Structures/SkyBlock/Garden/SkyBlockGarden.js'; import type { RequestOptions } from '../Types/Requests.js'; class getSkyBlockGarden extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute(profileId: string, options?: RequestOptions): Promise { if (!profileId) throw new Error(Errors.NO_UUID); const res = await this.client.requestHandler.request(`/skyblock/garden?profile=${profileId}`, options); diff --git a/src/API/getSkyBlockItems.ts b/src/API/getSkyBlockItems.ts index c3accd70a..21bbba61e 100644 --- a/src/API/getSkyBlockItems.ts +++ b/src/API/getSkyBlockItems.ts @@ -1,4 +1,3 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockItem from '../Structures/SkyBlock/SkyBlockItem.js'; @@ -6,12 +5,6 @@ import type { RequestOptions } from '../Types/Requests.js'; import type { WithRaw } from '../Types/API.ts'; class getSkyBlockItems extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute(options?: RequestOptions): Promise | RequestData> { const res = await this.client.requestHandler.request('/resources/skyblock/items', options); if (res.options.raw) return res; diff --git a/src/API/getSkyBlockMuseum.ts b/src/API/getSkyBlockMuseum.ts index afbf9af5e..4d38d2bf7 100644 --- a/src/API/getSkyBlockMuseum.ts +++ b/src/API/getSkyBlockMuseum.ts @@ -1,4 +1,3 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import Errors from '../Errors.ts'; import RequestData from '../Private/RequestData.js'; @@ -6,12 +5,6 @@ import SkyBlockMuseum from '../Structures/SkyBlock/Museum/SkyBlockMuseum.js'; import type { RequestOptions } from '../Types/Requests.js'; class getSkyBlockMuseum extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute(profileId: string, options?: RequestOptions): Promise { if (!profileId) throw new Error(Errors.NO_UUID); const res = await this.client.requestHandler.request(`/skyblock/museum?profile=${profileId}`, options); diff --git a/src/API/getSkyBlockNews.ts b/src/API/getSkyBlockNews.ts index 7d2dd7b88..550efdca2 100644 --- a/src/API/getSkyBlockNews.ts +++ b/src/API/getSkyBlockNews.ts @@ -1,16 +1,9 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockNews from '../Structures/SkyBlock/News/SkyBlockNews.js'; import type { RequestOptions } from '../Types/Requests.js'; class getSkyBlockNews extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/skyblock/news', options); if (res.options.raw) return res; diff --git a/src/API/getSkyBlockProfile.ts b/src/API/getSkyBlockProfile.ts index 1ce92593c..7fc48dff7 100644 --- a/src/API/getSkyBlockProfile.ts +++ b/src/API/getSkyBlockProfile.ts @@ -1,4 +1,3 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import Errors from '../Errors.ts'; import RequestData from '../Private/RequestData.js'; @@ -8,12 +7,6 @@ import type SkyBlockMuseum from '../Structures/SkyBlock/Museum/SkyBlockMuseum.js import type { SkyBlockRequestOptions } from '../Types/API.js'; class getSkyBlockProfile extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute(profileId: string, options?: SkyBlockRequestOptions): Promise { if (!profileId) throw new Error(Errors.NO_UUID); const res = await this.client.requestHandler.request(`/skyblock/profile?profile=${profileId}`, options); diff --git a/src/API/getSkyBlockProfiles.ts b/src/API/getSkyBlockProfiles.ts index f49804d6d..75de125ee 100644 --- a/src/API/getSkyBlockProfiles.ts +++ b/src/API/getSkyBlockProfiles.ts @@ -1,4 +1,3 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import Errors from '../Errors.ts'; import RequestData from '../Private/RequestData.js'; @@ -9,12 +8,6 @@ import type { SkyBlockProfileName } from '../Types/SkyBlock.js'; import type { SkyBlockRequestOptions, WithRaw } from '../Types/API.js'; class getSkyBlockProfiles extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute( query: string, options?: SkyBlockRequestOptions diff --git a/src/API/getSkyBlockSkills.ts b/src/API/getSkyBlockSkills.ts index c5057d98b..c84892ad3 100644 --- a/src/API/getSkyBlockSkills.ts +++ b/src/API/getSkyBlockSkills.ts @@ -1,16 +1,9 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockSkills from '../Structures/SkyBlock/Skills/SkyBlockSkills.js'; import type { RequestOptions } from '../Types/Requests.js'; class getSkyBlockSkills extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/resources/skyblock/skills', options); if (res.options.raw) return res; diff --git a/src/API/getStatus.ts b/src/API/getStatus.ts index 40c288b43..c4ac62d84 100644 --- a/src/API/getStatus.ts +++ b/src/API/getStatus.ts @@ -1,16 +1,9 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; import Status from '../Structures/Status.js'; import type { RequestOptions } from '../Types/Requests.js'; class getStatus extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute(query: string, options?: RequestOptions): Promise { query = await this.client.requestHandler.toUUID(query); const res = await this.client.requestHandler.request(`/status?uuid=${query}`, options); diff --git a/src/API/getWatchdogStats.ts b/src/API/getWatchdogStats.ts index 53fa6efe3..e9e5706a2 100644 --- a/src/API/getWatchdogStats.ts +++ b/src/API/getWatchdogStats.ts @@ -1,16 +1,9 @@ -import Client from '../Client.js'; import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; import WatchdogStats from '../Structures/WatchdogStats.js'; import type { RequestOptions } from '../Types/Requests.js'; class getWatchdogStats extends Endpoint { - override readonly client: Client; - constructor(client: Client) { - super(client); - this.client = client; - } - override async execute(options?: RequestOptions): Promise { const res = await this.client.requestHandler.request('/punishmentstats', options); if (res.options.raw) return res; From 8412f14669894db8e820c9f921c7d0a90d4a97a2 Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 17 Sep 2025 10:59:30 +0800 Subject: [PATCH 042/124] Release 12.0.0-9 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bbb12497b..b92979813 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hypixel-api-reborn", - "version": "12.0.0-8", + "version": "12.0.0-9", "description": "Feature-rich Hypixel API wrapper for Node.js", "main": "dist/index.js", "types": "dist/index.d.ts", From a186abd29a431875b1e091e4d0891e53bbc4148b Mon Sep 17 00:00:00 2001 From: Jacob Date: Thu, 18 Sep 2025 11:22:53 +0800 Subject: [PATCH 043/124] refactor(prettier) --- .github/renovate.json | 6 +- .prettierrc | 1 + .vscode/settings.json | 8 +- eslint.config.js | 9 +- src/Private/RateLimit.test.ts | 5 +- ...kMemberInventoriesInventoryDecoded.test.ts | 5 +- src/Types/SkyBlock.ts | 12 +- src/Utils/Constants.ts | 1325 +++-------------- src/Utils/SkyBlockUtils.ts | 30 +- 9 files changed, 198 insertions(+), 1203 deletions(-) diff --git a/.github/renovate.json b/.github/renovate.json index 6ec7b0b6b..499c15526 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -13,10 +13,6 @@ "prHourlyLimit": 0, "timezone": "UTC", "packageRules": [ - { - "matchUpdateTypes": ["minor", "patch"], - "matchCurrentVersion": "!/^0/", - "commitMessagePrefix": "chore(deps):" - } + { "matchUpdateTypes": ["minor", "patch"], "matchCurrentVersion": "!/^0/", "commitMessagePrefix": "chore(deps):" } ] } diff --git a/.prettierrc b/.prettierrc index 155ef4c65..5e20592d6 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,4 +1,5 @@ { + "objectWrap": "collapse", "bracketSameLine": true, "trailingComma": "none", "arrowParens": "always", diff --git a/.vscode/settings.json b/.vscode/settings.json index a4aca83c3..1c367cfa4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,12 +5,8 @@ "files.trimTrailingWhitespace": true, "editor.trimAutoWhitespace": true, "editor.formatOnSave": true, - "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit" - }, - "[typescript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, + "editor.codeActionsOnSave": { "source.fixAll.eslint": "explicit" }, + "[typescript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }, "typescript.format.semicolons": "insert", "typescript.preferences.quoteStyle": "single" } diff --git a/eslint.config.js b/eslint.config.js index 646370d79..495a33996 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -8,14 +8,7 @@ export default [ prettier, { ignores: ['**/node_modules/', '**/build/', '**/pnpm-lock.yaml'], - languageOptions: { - ecmaVersion: 2022, - sourceType: 'module', - globals: { - ...globals.es2022, - ...globals.node - } - }, + languageOptions: { ecmaVersion: 2022, sourceType: 'module', globals: { ...globals.es2022, ...globals.node } }, plugins: { 'sort-imports': sortImports }, rules: { 'sort-imports/sort-imports': [ diff --git a/src/Private/RateLimit.test.ts b/src/Private/RateLimit.test.ts index 0e164dc65..3280fd7c7 100644 --- a/src/Private/RateLimit.test.ts +++ b/src/Private/RateLimit.test.ts @@ -83,10 +83,7 @@ test('Ratelimit (Sync)', async () => { test('Ratelimit (Bad Sync Data)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? ''); client.updater.currentVersion = '1.0.0'; - vi.spyOn(global, 'fetch').mockResolvedValue({ - ...defaultRequestData, - headers: new Headers({ hello: '100' }) - } as any); + vi.spyOn(global, 'fetch').mockResolvedValue({ ...defaultRequestData, headers: new Headers({ hello: '100' }) } as any); await expect(() => client.rateLimit.sync()).rejects.toThrowError(Errors.RATE_LIMIT_INIT_ERROR); vi.restoreAllMocks(); client.destroy(); diff --git a/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventoryDecoded.test.ts b/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventoryDecoded.test.ts index 3eedd9540..baf919d94 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventoryDecoded.test.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventoryDecoded.test.ts @@ -56,10 +56,7 @@ test('SkyBlockMemberInventoriesInventoryDecoded', () => { modifier: 'withered', art_of_war_count: 1, upgrade_level: 10, - enchantments: { - impaling: 3, - champion: 10 - }, + enchantments: { impaling: 3, champion: 10 }, uuid: '89dd6816-0a32-4dcf-808b-ba558c793c91', hot_potato_count: 15, gems: { diff --git a/src/Types/SkyBlock.ts b/src/Types/SkyBlock.ts index f95261fea..5d64008ab 100644 --- a/src/Types/SkyBlock.ts +++ b/src/Types/SkyBlock.ts @@ -473,10 +473,7 @@ export type MiningForgeItemName = | 'PET'; export type MiningForgeItemsData = { - [key in MiningForgeItemId | 'UNKNOWN']: { - name: MiningForgeItemName | 'UNKNOWN'; - duration: number; - }; + [key in MiningForgeItemId | 'UNKNOWN']: { name: MiningForgeItemName | 'UNKNOWN'; duration: number }; }; export type SkyBlockArea = @@ -3477,12 +3474,7 @@ export type BestiaryMob = { maxTier: number; }; -export type BestiaryCategory = { - name: string; - mobs: BestiaryMob[]; - mobsUnlocked: number; - mobsMaxed: number; -}; +export type BestiaryCategory = { name: string; mobs: BestiaryMob[]; mobsUnlocked: number; mobsMaxed: number }; export type BestiaryStats = { level: number; diff --git a/src/Utils/Constants.ts b/src/Utils/Constants.ts index 576231703..87acdab74 100644 --- a/src/Utils/Constants.ts +++ b/src/Utils/Constants.ts @@ -402,74 +402,16 @@ export const CustomPetLeveling: CustomPetLevelingData = { VERY_SPECIAL: 0 } }, - REINDEER: { - xpMultiplier: 2 - } + REINDEER: { xpMultiplier: 2 } }; export const SLAYER_XP: { [key in SkyBlockSlayer]: Record } = { - zombie: { - 1: 5, - 2: 15, - 3: 200, - 4: 1000, - 5: 5000, - 6: 20000, - 7: 100000, - 8: 400000, - 9: 1000000 - }, - spider: { - 1: 5, - 2: 25, - 3: 200, - 4: 1000, - 5: 5000, - 6: 20000, - 7: 100000, - 8: 400000, - 9: 1000000 - }, - wolf: { - 1: 10, - 2: 30, - 3: 250, - 4: 1500, - 5: 5000, - 6: 20000, - 7: 100000, - 8: 400000, - 9: 1000000 - }, - enderman: { - 1: 10, - 2: 30, - 3: 250, - 4: 1500, - 5: 5000, - 6: 20000, - 7: 100000, - 8: 400000, - 9: 1000000 - }, - blaze: { - 1: 10, - 2: 30, - 3: 250, - 4: 1500, - 5: 5000, - 6: 20000, - 7: 100000, - 8: 400000, - 9: 1000000 - }, - vampire: { - 1: 20, - 2: 75, - 3: 240, - 4: 840, - 5: 2400 - } + zombie: { 1: 5, 2: 15, 3: 200, 4: 1000, 5: 5000, 6: 20000, 7: 100000, 8: 400000, 9: 1000000 }, + spider: { 1: 5, 2: 25, 3: 200, 4: 1000, 5: 5000, 6: 20000, 7: 100000, 8: 400000, 9: 1000000 }, + wolf: { 1: 10, 2: 30, 3: 250, 4: 1500, 5: 5000, 6: 20000, 7: 100000, 8: 400000, 9: 1000000 }, + enderman: { 1: 10, 2: 30, 3: 250, 4: 1500, 5: 5000, 6: 20000, 7: 100000, 8: 400000, 9: 1000000 }, + blaze: { 1: 10, 2: 30, 3: 250, 4: 1500, 5: 5000, 6: 20000, 7: 100000, 8: 400000, 9: 1000000 }, + vampire: { 1: 20, 2: 75, 3: 240, 4: 840, 5: 2400 } }; export const DEFAULT_SKILL_CAPS: { [key in SkyBlockXPTables]: number } = { @@ -1230,18 +1172,8 @@ export const BestiaryMobs: BestiaryMobsData = { dynamic: { name: 'Private Island', mobs: [ - { - name: '§aBat', - cap: 200, - mobs: ['forest_island_bat_3'], - bracket: 1 - }, - { - name: '§aCreeper', - cap: 200, - mobs: ['creeper_1'], - bracket: 1 - }, + { name: '§aBat', cap: 200, mobs: ['forest_island_bat_3'], bracket: 1 }, + { name: '§aCreeper', cap: 200, mobs: ['creeper_1'], bracket: 1 }, { name: '§aEnderman', cap: 200, @@ -1379,130 +1311,40 @@ export const BestiaryMobs: BestiaryMobsData = { hub: { name: 'Hub', mobs: [ - { - name: '§aCrypt Ghoul', - cap: 40000, - mobs: ['unburried_zombie_30'], - bracket: 1 - }, - { - name: '§6Golden Ghoul', - cap: 4000, - mobs: ['unburried_zombie_60'], - bracket: 3 - }, - { - name: '§aGraveyard Zombie', - cap: 200, - mobs: ['graveyard_zombie_1'], - bracket: 1 - }, - { - name: '§aOld Wolf', - cap: 4000, - mobs: ['old_wolf_50'], - bracket: 3 - }, - { - name: '§aWolf', - cap: 40000, - mobs: ['ruin_wolf_15'], - bracket: 1 - }, - { - name: '§aZombie Villager', - cap: 1000, - mobs: ['zombie_villager_1'], - bracket: 4 - } + { name: '§aCrypt Ghoul', cap: 40000, mobs: ['unburried_zombie_30'], bracket: 1 }, + { name: '§6Golden Ghoul', cap: 4000, mobs: ['unburried_zombie_60'], bracket: 3 }, + { name: '§aGraveyard Zombie', cap: 200, mobs: ['graveyard_zombie_1'], bracket: 1 }, + { name: '§aOld Wolf', cap: 4000, mobs: ['old_wolf_50'], bracket: 3 }, + { name: '§aWolf', cap: 40000, mobs: ['ruin_wolf_15'], bracket: 1 }, + { name: '§aZombie Villager', cap: 1000, mobs: ['zombie_villager_1'], bracket: 4 } ] }, farming_1: { name: 'The Farming Islands', mobs: [ - { - name: '§aChicken', - cap: 200, - mobs: ['farming_chicken_1'], - bracket: 1 - }, - { - name: '§aCow', - cap: 200, - mobs: ['farming_cow_1'], - bracket: 1 - }, - { - name: '§aMushroom Cow', - cap: 200, - mobs: ['mushroom_cow_1'], - bracket: 1 - }, - { - name: '§aPig', - cap: 200, - mobs: ['farming_pig_1'], - bracket: 1 - }, - { - name: '§aRabbit', - cap: 200, - mobs: ['farming_rabbit_1'], - bracket: 1 - }, - { - name: '§aSheep', - cap: 200, - mobs: ['farming_sheep_1'], - bracket: 1 - } + { name: '§aChicken', cap: 200, mobs: ['farming_chicken_1'], bracket: 1 }, + { name: '§aCow', cap: 200, mobs: ['farming_cow_1'], bracket: 1 }, + { name: '§aMushroom Cow', cap: 200, mobs: ['mushroom_cow_1'], bracket: 1 }, + { name: '§aPig', cap: 200, mobs: ['farming_pig_1'], bracket: 1 }, + { name: '§aRabbit', cap: 200, mobs: ['farming_rabbit_1'], bracket: 1 }, + { name: '§aSheep', cap: 200, mobs: ['farming_sheep_1'], bracket: 1 } ] }, combat_1: { name: "Spider's Den", mobs: [ - { - name: '§aArachne', - cap: 500, - mobs: ['arachne_500', 'arachne_300'], - bracket: 7 - }, - { - name: "§aArachne's Brood", - cap: 1000, - mobs: ['arachne_brood_200', 'arachne_brood_100'], - bracket: 4 - }, - { - name: "§aArachne's Keeper", - cap: 400, - mobs: ['arachne_keeper_100'], - bracket: 5 - }, - { - name: '§aBroodmother', - cap: 400, - mobs: ['brood_mother_spider_12'], - bracket: 5 - }, + { name: '§aArachne', cap: 500, mobs: ['arachne_500', 'arachne_300'], bracket: 7 }, + { name: "§aArachne's Brood", cap: 1000, mobs: ['arachne_brood_200', 'arachne_brood_100'], bracket: 4 }, + { name: "§aArachne's Keeper", cap: 400, mobs: ['arachne_keeper_100'], bracket: 5 }, + { name: '§aBroodmother', cap: 400, mobs: ['brood_mother_spider_12'], bracket: 5 }, { name: '§aDasher Spider', cap: 10000, mobs: ['dasher_spider_50', 'dasher_spider_45', 'dasher_spider_42', 'dasher_spider_4', 'dasher_spider_6'], bracket: 2 }, - { - name: '§aGravel Skeleton', - cap: 4000, - mobs: ['respawning_skeleton_2'], - bracket: 3 - }, - { - name: '§aRain Slime', - cap: 1000, - mobs: ['random_slime_8', 'random_slime_20'], - bracket: 4 - }, + { name: '§aGravel Skeleton', cap: 4000, mobs: ['respawning_skeleton_2'], bracket: 3 }, + { name: '§aRain Slime', cap: 1000, mobs: ['random_slime_8', 'random_slime_20'], bracket: 4 }, { name: '§aSilverfish', cap: 10000, @@ -1574,267 +1416,67 @@ export const BestiaryMobs: BestiaryMobsData = { ], bracket: 5 }, - { - name: '§aEnderman', - cap: 25000, - mobs: ['enderman_50', 'enderman_45', 'enderman_42'], - bracket: 4 - }, - { - name: '§aEndermite', - cap: 10000, - mobs: ['nest_endermite_50', 'endermite_37', 'endermite_40'], - bracket: 5 - }, - { - name: '§aEnd Stone Protector', - cap: 500, - mobs: ['corrupted_protector_100'], - bracket: 7 - }, - { - name: '§aObsidian Defender', - cap: 10000, - mobs: ['obsidian_wither_55'], - bracket: 5 - }, - { - name: '§a§dVoidling Extremist', - cap: 4000, - mobs: ['voidling_extremist_100'], - bracket: 3 - }, - { - name: '§aVoidling Fanatic', - cap: 25000, - mobs: ['voidling_fanatic_85'], - bracket: 4 - }, - { - name: '§aWatcher', - cap: 10000, - mobs: ['watcher_55'], - bracket: 5 - }, - { - name: '§aZealot', - cap: 25000, - mobs: ['zealot_bruiser_100', 'zealot_enderman_55'], - bracket: 4 - } + { name: '§aEnderman', cap: 25000, mobs: ['enderman_50', 'enderman_45', 'enderman_42'], bracket: 4 }, + { name: '§aEndermite', cap: 10000, mobs: ['nest_endermite_50', 'endermite_37', 'endermite_40'], bracket: 5 }, + { name: '§aEnd Stone Protector', cap: 500, mobs: ['corrupted_protector_100'], bracket: 7 }, + { name: '§aObsidian Defender', cap: 10000, mobs: ['obsidian_wither_55'], bracket: 5 }, + { name: '§a§dVoidling Extremist', cap: 4000, mobs: ['voidling_extremist_100'], bracket: 3 }, + { name: '§aVoidling Fanatic', cap: 25000, mobs: ['voidling_fanatic_85'], bracket: 4 }, + { name: '§aWatcher', cap: 10000, mobs: ['watcher_55'], bracket: 5 }, + { name: '§aZealot', cap: 25000, mobs: ['zealot_bruiser_100', 'zealot_enderman_55'], bracket: 4 } ] }, crimson_isle: { name: 'Crimson Isle', mobs: [ - { - name: '§aAshfang', - cap: 500, - mobs: ['ashfang_200'], - bracket: 7 - }, - { - name: '§aBarbarian Duke X', - cap: 500, - mobs: ['barbarian_duke_x_200'], - bracket: 7 - }, - { - name: '§aBladesoul', - cap: 500, - mobs: ['bladesoul_200'], - bracket: 7 - }, - { - name: '§aBlaze', - cap: 3000, - mobs: ['blaze_25', 'blaze_70', 'bezal_80', 'mutated_blaze_70'], - bracket: 4 - }, - { - name: '§aFlaming Spider', - cap: 10000, - mobs: ['flaming_spider_80'], - bracket: 3 - }, - { - name: '§aFlare', - cap: 10000, - mobs: ['flare_90'], - bracket: 3 - }, - { - name: '§aGhast', - cap: 3000, - mobs: ['ghast_85', 'dive_ghast_90'], - bracket: 4 - }, - { - name: '§aKada Knight', - cap: 3000, - mobs: ['kada_knight_90'], - bracket: 4 - }, - { - name: '§5§lMage Outlaw', - cap: 500, - mobs: ['mage_outlaw_200'], - bracket: 7 - }, - { - name: '§a§4§lMagma Boss', - cap: 500, - mobs: ['magma_boss_500'], - bracket: 7 - }, + { name: '§aAshfang', cap: 500, mobs: ['ashfang_200'], bracket: 7 }, + { name: '§aBarbarian Duke X', cap: 500, mobs: ['barbarian_duke_x_200'], bracket: 7 }, + { name: '§aBladesoul', cap: 500, mobs: ['bladesoul_200'], bracket: 7 }, + { name: '§aBlaze', cap: 3000, mobs: ['blaze_25', 'blaze_70', 'bezal_80', 'mutated_blaze_70'], bracket: 4 }, + { name: '§aFlaming Spider', cap: 10000, mobs: ['flaming_spider_80'], bracket: 3 }, + { name: '§aFlare', cap: 10000, mobs: ['flare_90'], bracket: 3 }, + { name: '§aGhast', cap: 3000, mobs: ['ghast_85', 'dive_ghast_90'], bracket: 4 }, + { name: '§aKada Knight', cap: 3000, mobs: ['kada_knight_90'], bracket: 4 }, + { name: '§5§lMage Outlaw', cap: 500, mobs: ['mage_outlaw_200'], bracket: 7 }, + { name: '§a§4§lMagma Boss', cap: 500, mobs: ['magma_boss_500'], bracket: 7 }, { name: '§aMagma Cube', cap: 10000, mobs: ['pack_magma_cube_90', 'magma_cube_75', 'fireball_magma_cube_75'], bracket: 3 }, - { - name: '§aMagma Cube Rider', - cap: 3000, - mobs: ['magma_cube_rider_90'], - bracket: 4 - }, - { - name: '§aMatcho', - cap: 400, - mobs: ['matcho_100'], - bracket: 5 - }, - { - name: '§4Millennia-Aged Blaze', - cap: 4000, - mobs: ['old_blaze_110'], - bracket: 3 - }, - { - name: '§aMushroom Bull', - cap: 10000, - mobs: ['charging_mushroom_cow_80'], - bracket: 3 - }, - { - name: '§aSmoldering Blaze', - cap: 25000, - mobs: ['smoldering_blaze_95'], - bracket: 2 - }, - { - name: '§aTentacle', - cap: 1000, - mobs: ['hellwisp_100'], - bracket: 5 - }, - { - name: '§5Vanquisher', - cap: 1000, - mobs: ['vanquisher_100'], - bracket: 5 - }, - { - name: '§aWither Skeleton', - cap: 3000, - mobs: ['wither_skeleton_70'], - bracket: 4 - }, - { - name: '§aWither Spectre', - cap: 10000, - mobs: ['wither_spectre_70'], - bracket: 3 - } + { name: '§aMagma Cube Rider', cap: 3000, mobs: ['magma_cube_rider_90'], bracket: 4 }, + { name: '§aMatcho', cap: 400, mobs: ['matcho_100'], bracket: 5 }, + { name: '§4Millennia-Aged Blaze', cap: 4000, mobs: ['old_blaze_110'], bracket: 3 }, + { name: '§aMushroom Bull', cap: 10000, mobs: ['charging_mushroom_cow_80'], bracket: 3 }, + { name: '§aSmoldering Blaze', cap: 25000, mobs: ['smoldering_blaze_95'], bracket: 2 }, + { name: '§aTentacle', cap: 1000, mobs: ['hellwisp_100'], bracket: 5 }, + { name: '§5Vanquisher', cap: 1000, mobs: ['vanquisher_100'], bracket: 5 }, + { name: '§aWither Skeleton', cap: 3000, mobs: ['wither_skeleton_70'], bracket: 4 }, + { name: '§aWither Spectre', cap: 10000, mobs: ['wither_spectre_70'], bracket: 3 } ] }, mining_2: { name: 'Deep Caverns', mobs: [ - { - name: '§aEmerald Slime', - cap: 3000, - mobs: ['emerald_slime_5', 'emerald_slime_10'], - bracket: 1 - }, - { - name: '§aLapis Zombie', - cap: 3000, - mobs: ['lapis_zombie_7'], - bracket: 1 - }, - { - name: '§aMiner Skeleton', - cap: 3000, - mobs: ['diamond_skeleton_15', 'diamond_skeleton_20'], - bracket: 1 - }, - { - name: '§aMiner Zombie', - cap: 3000, - mobs: ['diamond_zombie_15', 'diamond_zombie_20'], - bracket: 1 - }, - { - name: '§aRedstone Pigman', - cap: 3000, - mobs: ['redstone_pigman_10'], - bracket: 1 - }, - { - name: '§aSneaky Creeper', - cap: 300, - mobs: ['invisible_creeper_3'], - bracket: 3 - } + { name: '§aEmerald Slime', cap: 3000, mobs: ['emerald_slime_5', 'emerald_slime_10'], bracket: 1 }, + { name: '§aLapis Zombie', cap: 3000, mobs: ['lapis_zombie_7'], bracket: 1 }, + { name: '§aMiner Skeleton', cap: 3000, mobs: ['diamond_skeleton_15', 'diamond_skeleton_20'], bracket: 1 }, + { name: '§aMiner Zombie', cap: 3000, mobs: ['diamond_zombie_15', 'diamond_zombie_20'], bracket: 1 }, + { name: '§aRedstone Pigman', cap: 3000, mobs: ['redstone_pigman_10'], bracket: 1 }, + { name: '§aSneaky Creeper', cap: 300, mobs: ['invisible_creeper_3'], bracket: 3 } ] }, mining_3: { name: 'Dwarven Mines', mobs: [ - { - name: '§aDiamond Goblin', - cap: 100, - mobs: ['goblin_500'], - bracket: 7 - }, - { - name: '§aGhost', - cap: 100000, - mobs: ['caverns_ghost_250'], - bracket: 3 - }, - { - name: '§aGlacite Bowman', - cap: 1000, - mobs: ['glacite_bowman_165'], - bracket: 4 - }, - { - name: '§aGlacite Caver', - cap: 1000, - mobs: ['glacite_caver_200'], - bracket: 4 - }, - { - name: '§aGlacite Mage', - cap: 1000, - mobs: ['glacite_mage_155'], - bracket: 4 - }, - { - name: '§aGlacite Mutt', - cap: 1000, - mobs: ['glacite_mutt_180'], - bracket: 4 - }, - { - name: '§aGlacite Walker', - cap: 10000, - mobs: ['ice_walker_45'], - bracket: 2 - }, + { name: '§aDiamond Goblin', cap: 100, mobs: ['goblin_500'], bracket: 7 }, + { name: '§aGhost', cap: 100000, mobs: ['caverns_ghost_250'], bracket: 3 }, + { name: '§aGlacite Bowman', cap: 1000, mobs: ['glacite_bowman_165'], bracket: 4 }, + { name: '§aGlacite Caver', cap: 1000, mobs: ['glacite_caver_200'], bracket: 4 }, + { name: '§aGlacite Mage', cap: 1000, mobs: ['glacite_mage_155'], bracket: 4 }, + { name: '§aGlacite Mutt', cap: 1000, mobs: ['glacite_mutt_180'], bracket: 4 }, + { name: '§aGlacite Walker', cap: 10000, mobs: ['ice_walker_45'], bracket: 2 }, { name: '§aGoblin', cap: 25000, @@ -1866,59 +1508,19 @@ export const BestiaryMobs: BestiaryMobsData = { ], bracket: 4 }, - { - name: '§aGolden Goblin', - cap: 400, - mobs: ['goblin_50'], - bracket: 5 - }, - { - name: '§aPowder Ghast', - cap: 200, - mobs: ['powder_ghast_1'], - bracket: 1 - }, - { - name: '§5Star Sentry', - cap: 1000, - mobs: ['crystal_sentry_50'], - bracket: 4 - }, - { - name: '§aTreasure Hoarder', - cap: 1000, - mobs: ['treasure_hoarder_70'], - bracket: 4 - } + { name: '§aGolden Goblin', cap: 400, mobs: ['goblin_50'], bracket: 5 }, + { name: '§aPowder Ghast', cap: 200, mobs: ['powder_ghast_1'], bracket: 1 }, + { name: '§5Star Sentry', cap: 1000, mobs: ['crystal_sentry_50'], bracket: 4 }, + { name: '§aTreasure Hoarder', cap: 1000, mobs: ['treasure_hoarder_70'], bracket: 4 } ] }, crystal_hollows: { name: 'Crystal Hollows', mobs: [ - { - name: '§aAutomaton', - cap: 10000, - mobs: ['automaton_100', 'automaton_150'], - bracket: 2 - }, - { - name: '§c§lBal', - cap: 250, - mobs: ['bal_boss_100'], - bracket: 6 - }, - { - name: '§aBoss Corleone', - cap: 100, - mobs: ['team_treasurite_corleone_200'], - bracket: 7 - }, - { - name: '§eButterfly', - cap: 1000, - mobs: ['butterfly_100'], - bracket: 4 - }, + { name: '§aAutomaton', cap: 10000, mobs: ['automaton_100', 'automaton_150'], bracket: 2 }, + { name: '§c§lBal', cap: 250, mobs: ['bal_boss_100'], bracket: 6 }, + { name: '§aBoss Corleone', cap: 100, mobs: ['team_treasurite_corleone_200'], bracket: 7 }, + { name: '§eButterfly', cap: 1000, mobs: ['butterfly_100'], bracket: 4 }, { name: '§aGrunt', cap: 4000, @@ -1930,188 +1532,58 @@ export const BestiaryMobs: BestiaryMobsData = { ], bracket: 3 }, - { - name: '§aKey Guardian', - cap: 250, - mobs: ['key_guardian_100'], - bracket: 6 - }, - { - name: '§aSludge', - cap: 10000, - mobs: ['sludge_5', 'sludge_10', 'sludge_100'], - bracket: 2 - }, - { - name: '§aThyst', - cap: 4000, - mobs: ['thyst_20'], - bracket: 3 - }, - { - name: '§aWorm', - cap: 400, - mobs: ['worm_5', 'scatha_10'], - bracket: 5 - }, - { - name: '§aYog', - cap: 4000, - mobs: ['yog_100'], - bracket: 3 - } + { name: '§aKey Guardian', cap: 250, mobs: ['key_guardian_100'], bracket: 6 }, + { name: '§aSludge', cap: 10000, mobs: ['sludge_5', 'sludge_10', 'sludge_100'], bracket: 2 }, + { name: '§aThyst', cap: 4000, mobs: ['thyst_20'], bracket: 3 }, + { name: '§aWorm', cap: 400, mobs: ['worm_5', 'scatha_10'], bracket: 5 }, + { name: '§aYog', cap: 4000, mobs: ['yog_100'], bracket: 3 } ] }, foraging_1: { name: 'The Park', mobs: [ - { - name: '§bHowling Spirit', - cap: 10000, - mobs: ['howling_spirit_35'], - bracket: 2 - }, - { - name: '§bPack Spirit', - cap: 10000, - mobs: ['pack_spirit_30'], - bracket: 2 - }, - { - name: '§bSoul of the Alpha', - cap: 1000, - mobs: ['soul_of_the_alpha_55'], - bracket: 4 - } + { name: '§bHowling Spirit', cap: 10000, mobs: ['howling_spirit_35'], bracket: 2 }, + { name: '§bPack Spirit', cap: 10000, mobs: ['pack_spirit_30'], bracket: 2 }, + { name: '§bSoul of the Alpha', cap: 1000, mobs: ['soul_of_the_alpha_55'], bracket: 4 } ] }, foraging_2: { name: 'Galatea', mobs: [ - { - name: '§aBogged', - cap: 3000, - mobs: ['bogged_10'], - bracket: 4 - }, - { - name: '§aChill', - cap: 1000, - mobs: ['chillblade_31', 'chillshot_31'], - bracket: 4 - }, - { - name: '§aEnt', - cap: 1000, - mobs: ['ent_14'], - bracket: 4 - }, - { - name: '§aStridersurfer', - cap: 1000, - mobs: ['strider_20', 'strider_21'], - bracket: 4 - }, - { - name: '§aTadgang', - cap: 1000, - mobs: ['tadgang_frog_8', 'tadgang_frog_10'], - bracket: 4 - }, - { - name: '§aThe Loch Emperor', - cap: 400, - mobs: ['skeleton_emperor_150', 'guardian_emperor_150'], - bracket: 5 - }, - { - name: '§aTidetot', - cap: 1000, - mobs: ['tidetot_10', 'seacurse_15', 'hydrospear_25'], - bracket: 4 - } + { name: '§aBogged', cap: 3000, mobs: ['bogged_10'], bracket: 4 }, + { name: '§aChill', cap: 1000, mobs: ['chillblade_31', 'chillshot_31'], bracket: 4 }, + { name: '§aEnt', cap: 1000, mobs: ['ent_14'], bracket: 4 }, + { name: '§aStridersurfer', cap: 1000, mobs: ['strider_20', 'strider_21'], bracket: 4 }, + { name: '§aTadgang', cap: 1000, mobs: ['tadgang_frog_8', 'tadgang_frog_10'], bracket: 4 }, + { name: '§aThe Loch Emperor', cap: 400, mobs: ['skeleton_emperor_150', 'guardian_emperor_150'], bracket: 5 }, + { name: '§aTidetot', cap: 1000, mobs: ['tidetot_10', 'seacurse_15', 'hydrospear_25'], bracket: 4 } ] }, spooky_festival: { name: 'Spooky Festival', mobs: [ - { - name: '§8Crazy Witch', - cap: 750, - mobs: ['batty_witch_60'], - bracket: 2 - }, - { - name: '§6Headless Horseman', - cap: 500, - mobs: ['horseman_horse_100'], - bracket: 7 - }, - { - name: '§cPhantom Spirit', - cap: 750, - mobs: ['phantom_spirit_35'], - bracket: 2 - }, - { - name: '§6Scary Jerry', - cap: 750, - mobs: ['scary_jerry_30'], - bracket: 2 - }, - { - name: '§eTrick or Treater', - cap: 750, - mobs: ['trick_or_treater_30'], - bracket: 2 - }, - { - name: '§6Wither Gourd', - cap: 750, - mobs: ['wither_gourd_40'], - bracket: 2 - }, - { - name: '§8Wraith', - cap: 750, - mobs: ['wraith_50'], - bracket: 2 - } + { name: '§8Crazy Witch', cap: 750, mobs: ['batty_witch_60'], bracket: 2 }, + { name: '§6Headless Horseman', cap: 500, mobs: ['horseman_horse_100'], bracket: 7 }, + { name: '§cPhantom Spirit', cap: 750, mobs: ['phantom_spirit_35'], bracket: 2 }, + { name: '§6Scary Jerry', cap: 750, mobs: ['scary_jerry_30'], bracket: 2 }, + { name: '§eTrick or Treater', cap: 750, mobs: ['trick_or_treater_30'], bracket: 2 }, + { name: '§6Wither Gourd', cap: 750, mobs: ['wither_gourd_40'], bracket: 2 }, + { name: '§8Wraith', cap: 750, mobs: ['wraith_50'], bracket: 2 } ] }, mythological_creatures: { name: 'Mythological Creatures', mobs: [ - { - name: '§aGaia Construct', - cap: 3000, - mobs: ['gaia_construct_140', 'gaia_construct_260'], - bracket: 4 - }, - { - name: '§aMinos Champion', - cap: 1000, - mobs: ['minos_champion_175', 'minos_champion_310'], - bracket: 5 - }, + { name: '§aGaia Construct', cap: 3000, mobs: ['gaia_construct_140', 'gaia_construct_260'], bracket: 4 }, + { name: '§aMinos Champion', cap: 1000, mobs: ['minos_champion_175', 'minos_champion_310'], bracket: 5 }, { name: '§aMinos Hunter', cap: 1000, mobs: ['minos_hunter_125', 'minos_hunter_15', 'minos_hunter_60'], bracket: 5 }, - { - name: '§aMinos Inquisitor', - cap: 500, - mobs: ['minos_inquisitor_750'], - bracket: 7 - }, - { - name: '§aMinotaur', - cap: 3000, - mobs: ['minotaur_45', 'minotaur_120', 'minotaur_210'], - bracket: 4 - }, + { name: '§aMinos Inquisitor', cap: 500, mobs: ['minos_inquisitor_750'], bracket: 7 }, + { name: '§aMinotaur', cap: 3000, mobs: ['minotaur_45', 'minotaur_120', 'minotaur_210'], bracket: 4 }, { name: '§aSiamese Lynx', cap: 3000, @@ -2123,30 +1595,10 @@ export const BestiaryMobs: BestiaryMobsData = { jerry: { name: 'Jerry', mobs: [ - { - name: '§9Blue Jerry', - cap: 30, - mobs: ['mayor_jerry_blue_2'], - bracket: 5 - }, - { - name: '§6Golden Jerry', - cap: 20, - mobs: ['mayor_jerry_golden_5'], - bracket: 7 - }, - { - name: '§aGreen Jerry', - cap: 75, - mobs: ['mayor_jerry_green_1'], - bracket: 4 - }, - { - name: '§5Purple Jerry', - cap: 25, - mobs: ['mayor_jerry_purple_3'], - bracket: 6 - } + { name: '§9Blue Jerry', cap: 30, mobs: ['mayor_jerry_blue_2'], bracket: 5 }, + { name: '§6Golden Jerry', cap: 20, mobs: ['mayor_jerry_golden_5'], bracket: 7 }, + { name: '§aGreen Jerry', cap: 75, mobs: ['mayor_jerry_green_1'], bracket: 4 }, + { name: '§5Purple Jerry', cap: 25, mobs: ['mayor_jerry_purple_3'], bracket: 6 } ] }, kuudra: { @@ -2283,54 +1735,14 @@ export const BestiaryMobs: BestiaryMobsData = { fishing: { name: 'Fishing', mobs: [ - { - name: '§aAbyssal Miner', - cap: 250, - mobs: ['zombie_miner_150'], - bracket: 6 - }, - { - name: '§aAgarimoo', - cap: 4000, - mobs: ['agarimoo_35'], - bracket: 3 - }, - { - name: '§aBlue Ringed Octopus', - cap: 400, - mobs: ['blue_ringed_octopus_275'], - bracket: 5 - }, - { - name: '§aCarrot King', - cap: 400, - mobs: ['carrot_king_25'], - bracket: 5 - }, - { - name: '§aCatfish', - cap: 1000, - mobs: ['catfish_23'], - bracket: 4 - }, - { - name: '§aDeep Sea Protector', - cap: 1000, - mobs: ['deep_sea_protector_60'], - bracket: 4 - }, - { - name: '§aFrog Man', - cap: 3000, - mobs: ['frog_man_10'], - bracket: 4 - }, - { - name: '§aGuardian Defender', - cap: 1000, - mobs: ['guardian_defender_45'], - bracket: 4 - }, + { name: '§aAbyssal Miner', cap: 250, mobs: ['zombie_miner_150'], bracket: 6 }, + { name: '§aAgarimoo', cap: 4000, mobs: ['agarimoo_35'], bracket: 3 }, + { name: '§aBlue Ringed Octopus', cap: 400, mobs: ['blue_ringed_octopus_275'], bracket: 5 }, + { name: '§aCarrot King', cap: 400, mobs: ['carrot_king_25'], bracket: 5 }, + { name: '§aCatfish', cap: 1000, mobs: ['catfish_23'], bracket: 4 }, + { name: '§aDeep Sea Protector', cap: 1000, mobs: ['deep_sea_protector_60'], bracket: 4 }, + { name: '§aFrog Man', cap: 3000, mobs: ['frog_man_10'], bracket: 4 }, + { name: '§aGuardian Defender', cap: 1000, mobs: ['guardian_defender_45'], bracket: 4 }, { name: '§aMithril Grubber', cap: 300, @@ -2342,355 +1754,85 @@ export const BestiaryMobs: BestiaryMobsData = { ], bracket: 3 }, - { - name: '§aNight Squid', - cap: 1000, - mobs: ['night_squid_6'], - bracket: 4 - }, - { - name: '§aOasis Rabbit', - cap: 300, - mobs: ['oasis_rabbit_10'], - bracket: 3 - }, - { - name: '§aOasis Sheep', - cap: 300, - mobs: ['oasis_sheep_10'], - bracket: 3 - }, - { - name: '§aPoisoned Water Worm', - cap: 1000, - mobs: ['poisoned_water_worm_25'], - bracket: 4 - }, - { - name: '§aRider of the Deep', - cap: 4000, - mobs: ['zombie_deep_20', 'chicken_deep_20'], - bracket: 3 - }, - { - name: '§aSea Archer', - cap: 4000, - mobs: ['sea_archer_15'], - bracket: 3 - }, - { - name: '§aSea Guardian', - cap: 4000, - mobs: ['sea_guardian_10'], - bracket: 3 - }, - { - name: '§aSea Leech', - cap: 1000, - mobs: ['sea_leech_30'], - bracket: 4 - }, - { - name: '§aSea Walker', - cap: 4000, - mobs: ['sea_walker_4'], - bracket: 3 - }, - { - name: '§aSea Witch', - cap: 4000, - mobs: ['sea_witch_15'], - bracket: 3 - }, - { - name: '§aSnapping Turtle', - cap: 1000, - mobs: ['snapping_turtle_30'], - bracket: 4 - }, - { - name: '§aSquid', - cap: 10000, - mobs: ['pond_squid_1'], - bracket: 2 - }, - { - name: '§aWater Hydra', - cap: 400, - mobs: ['water_hydra_100'], - bracket: 5 - }, - { - name: '§aWater Worm', - cap: 1000, - mobs: ['water_worm_20'], - bracket: 4 - }, - { - name: '§aWetwing', - cap: 1000, - mobs: ['wetwing_chicken_18'], - bracket: 4 - }, - { - name: '§aWiki Tiki', - cap: 100, - mobs: ['wiki_tiki_400'], - bracket: 7 - } + { name: '§aNight Squid', cap: 1000, mobs: ['night_squid_6'], bracket: 4 }, + { name: '§aOasis Rabbit', cap: 300, mobs: ['oasis_rabbit_10'], bracket: 3 }, + { name: '§aOasis Sheep', cap: 300, mobs: ['oasis_sheep_10'], bracket: 3 }, + { name: '§aPoisoned Water Worm', cap: 1000, mobs: ['poisoned_water_worm_25'], bracket: 4 }, + { name: '§aRider of the Deep', cap: 4000, mobs: ['zombie_deep_20', 'chicken_deep_20'], bracket: 3 }, + { name: '§aSea Archer', cap: 4000, mobs: ['sea_archer_15'], bracket: 3 }, + { name: '§aSea Guardian', cap: 4000, mobs: ['sea_guardian_10'], bracket: 3 }, + { name: '§aSea Leech', cap: 1000, mobs: ['sea_leech_30'], bracket: 4 }, + { name: '§aSea Walker', cap: 4000, mobs: ['sea_walker_4'], bracket: 3 }, + { name: '§aSea Witch', cap: 4000, mobs: ['sea_witch_15'], bracket: 3 }, + { name: '§aSnapping Turtle', cap: 1000, mobs: ['snapping_turtle_30'], bracket: 4 }, + { name: '§aSquid', cap: 10000, mobs: ['pond_squid_1'], bracket: 2 }, + { name: '§aWater Hydra', cap: 400, mobs: ['water_hydra_100'], bracket: 5 }, + { name: '§aWater Worm', cap: 1000, mobs: ['water_worm_20'], bracket: 4 }, + { name: '§aWetwing', cap: 1000, mobs: ['wetwing_chicken_18'], bracket: 4 }, + { name: '§aWiki Tiki', cap: 100, mobs: ['wiki_tiki_400'], bracket: 7 } ] }, lava: { name: 'Lava', mobs: [ - { - name: '§aFiery Scuttler', - cap: 400, - mobs: ['fiery_scuttler_475'], - bracket: 5 - }, - { - name: '§aFire Eel', - cap: 1000, - mobs: ['fire_eel_240'], - bracket: 4 - }, - { - name: '§aFireproof Witch', - cap: 1000, - mobs: ['fireproof_witch_75'], - bracket: 4 - }, - { - name: '§aFlaming Worm', - cap: 4000, - mobs: ['flaming_worm_50'], - bracket: 3 - }, - { - name: '§aFried Chicken', - cap: 3000, - mobs: ['fried_chicken_30'], - bracket: 4 - }, - { - name: '§aLava Blaze', - cap: 1000, - mobs: ['lava_blaze_100'], - bracket: 4 - }, - { - name: '§aLava Flame', - cap: 1000, - mobs: ['lava_flame_230'], - bracket: 4 - }, - { - name: '§aLava Leech', - cap: 4000, - mobs: ['lava_leech_220'], - bracket: 3 - }, - { - name: '§aLava Pigman', - cap: 1000, - mobs: ['lava_pigman_100'], - bracket: 4 - }, - { - name: '§aLord Jawbus', - cap: 100, - mobs: ['lord_jawbus_600'], - bracket: 7 - }, - { - name: '§aMagma Slug', - cap: 10000, - mobs: ['magma_slug_200'], - bracket: 2 - }, - { - name: '§aMoogma', - cap: 4000, - mobs: ['moogma_210'], - bracket: 3 - }, - { - name: '§aPlhlegblast', - cap: 7, - mobs: ['pond_squid_300'], - bracket: 7 - }, - { - name: '§aPyroclastic Worm', - cap: 1000, - mobs: ['pyroclastic_worm_240'], - bracket: 4 - }, - { - name: '§aRagnarok', - cap: 100, - mobs: ['ragnarok_666'], - bracket: 7 - }, - { - name: '§aTaurus', - cap: 1000, - mobs: ['pig_rider_250'], - bracket: 4 - }, - { - name: '§aThunder', - cap: 400, - mobs: ['thunder_400'], - bracket: 5 - } + { name: '§aFiery Scuttler', cap: 400, mobs: ['fiery_scuttler_475'], bracket: 5 }, + { name: '§aFire Eel', cap: 1000, mobs: ['fire_eel_240'], bracket: 4 }, + { name: '§aFireproof Witch', cap: 1000, mobs: ['fireproof_witch_75'], bracket: 4 }, + { name: '§aFlaming Worm', cap: 4000, mobs: ['flaming_worm_50'], bracket: 3 }, + { name: '§aFried Chicken', cap: 3000, mobs: ['fried_chicken_30'], bracket: 4 }, + { name: '§aLava Blaze', cap: 1000, mobs: ['lava_blaze_100'], bracket: 4 }, + { name: '§aLava Flame', cap: 1000, mobs: ['lava_flame_230'], bracket: 4 }, + { name: '§aLava Leech', cap: 4000, mobs: ['lava_leech_220'], bracket: 3 }, + { name: '§aLava Pigman', cap: 1000, mobs: ['lava_pigman_100'], bracket: 4 }, + { name: '§aLord Jawbus', cap: 100, mobs: ['lord_jawbus_600'], bracket: 7 }, + { name: '§aMagma Slug', cap: 10000, mobs: ['magma_slug_200'], bracket: 2 }, + { name: '§aMoogma', cap: 4000, mobs: ['moogma_210'], bracket: 3 }, + { name: '§aPlhlegblast', cap: 7, mobs: ['pond_squid_300'], bracket: 7 }, + { name: '§aPyroclastic Worm', cap: 1000, mobs: ['pyroclastic_worm_240'], bracket: 4 }, + { name: '§aRagnarok', cap: 100, mobs: ['ragnarok_666'], bracket: 7 }, + { name: '§aTaurus', cap: 1000, mobs: ['pig_rider_250'], bracket: 4 }, + { name: '§aThunder', cap: 400, mobs: ['thunder_400'], bracket: 5 } ] }, spooky_festival_fishing: { name: 'Spooky Festival Fishing', mobs: [ - { - name: '§aGrim Reaper', - cap: 100, - mobs: ['grim_reaper_190'], - bracket: 7 - }, - { - name: '§aNightmare', - cap: 1000, - mobs: ['nightmare_24'], - bracket: 4 - }, - { - name: '§aPhantom Fisher', - cap: 250, - mobs: ['phantom_fisherman_160'], - bracket: 6 - }, - { - name: '§aScarecrow', - cap: 4000, - mobs: ['scarecrow_9'], - bracket: 3 - }, - { - name: '§aWerewolf', - cap: 1000, - mobs: ['werewolf_50'], - bracket: 4 - } + { name: '§aGrim Reaper', cap: 100, mobs: ['grim_reaper_190'], bracket: 7 }, + { name: '§aNightmare', cap: 1000, mobs: ['nightmare_24'], bracket: 4 }, + { name: '§aPhantom Fisher', cap: 250, mobs: ['phantom_fisherman_160'], bracket: 6 }, + { name: '§aScarecrow', cap: 4000, mobs: ['scarecrow_9'], bracket: 3 }, + { name: '§aWerewolf', cap: 1000, mobs: ['werewolf_50'], bracket: 4 } ] }, fishing_festival: { name: 'Fishing Festival', mobs: [ - { - name: '§aBlue Shark', - cap: 1000, - mobs: ['blue_shark_20'], - bracket: 4 - }, - { - name: '§aGreat White Shark', - cap: 400, - mobs: ['great_white_shark_180'], - bracket: 5 - }, - { - name: '§aNurse Shark', - cap: 4000, - mobs: ['nurse_shark_6'], - bracket: 3 - }, - { - name: '§aTiger Shark', - cap: 1000, - mobs: ['tiger_shark_50'], - bracket: 4 - } + { name: '§aBlue Shark', cap: 1000, mobs: ['blue_shark_20'], bracket: 4 }, + { name: '§aGreat White Shark', cap: 400, mobs: ['great_white_shark_180'], bracket: 5 }, + { name: '§aNurse Shark', cap: 4000, mobs: ['nurse_shark_6'], bracket: 3 }, + { name: '§aTiger Shark', cap: 1000, mobs: ['tiger_shark_50'], bracket: 4 } ] }, winter: { name: 'Winter', mobs: [ - { - name: '§aFrosty', - cap: 4000, - mobs: ['frosty_the_snowman_13'], - bracket: 3 - }, - { - name: '§aFrozen Steve', - cap: 4000, - mobs: ['frozen_steve_7'], - bracket: 3 - }, - { - name: '§aGrinch', - cap: 250, - mobs: ['grinch_21'], - bracket: 6 - }, - { - name: '§aNutcracker', - cap: 400, - mobs: ['nutcracker_50'], - bracket: 5 - }, - { - name: '§aReindrake', - cap: 100, - mobs: ['reindrake_100'], - bracket: 7 - }, - { - name: '§aYeti', - cap: 250, - mobs: ['yeti_175'], - bracket: 6 - } + { name: '§aFrosty', cap: 4000, mobs: ['frosty_the_snowman_13'], bracket: 3 }, + { name: '§aFrozen Steve', cap: 4000, mobs: ['frozen_steve_7'], bracket: 3 }, + { name: '§aGrinch', cap: 250, mobs: ['grinch_21'], bracket: 6 }, + { name: '§aNutcracker', cap: 400, mobs: ['nutcracker_50'], bracket: 5 }, + { name: '§aReindrake', cap: 100, mobs: ['reindrake_100'], bracket: 7 }, + { name: '§aYeti', cap: 250, mobs: ['yeti_175'], bracket: 6 } ] }, backwater_bayou: { name: 'Backwater Bayou', mobs: [ - { - name: '§aAlligator', - cap: 400, - mobs: ['alligator_120'], - bracket: 5 - }, - { - name: '§aBanshee', - cap: 1000, - mobs: ['banshee_10'], - bracket: 4 - }, - { - name: '§aBayou Sludge', - cap: 1000, - mobs: ['bayou_sludge_25'], - bracket: 4 - }, - { - name: '§aDumpster Diver', - cap: 1000, - mobs: ['dumpster_diver_15'], - bracket: 4 - }, - { - name: '§aTitanoboa', - cap: 100, - mobs: ['titanoboa_240'], - bracket: 7 - }, - { - name: '§aTrash Gobbler', - cap: 1000, - mobs: ['trash_gobbler_8'], - bracket: 4 - } + { name: '§aAlligator', cap: 400, mobs: ['alligator_120'], bracket: 5 }, + { name: '§aBanshee', cap: 1000, mobs: ['banshee_10'], bracket: 4 }, + { name: '§aBayou Sludge', cap: 1000, mobs: ['bayou_sludge_25'], bracket: 4 }, + { name: '§aDumpster Diver', cap: 1000, mobs: ['dumpster_diver_15'], bracket: 4 }, + { name: '§aTitanoboa', cap: 100, mobs: ['titanoboa_240'], bracket: 7 }, + { name: '§aTrash Gobbler', cap: 1000, mobs: ['trash_gobbler_8'], bracket: 4 } ] }, catacombs: { @@ -2723,12 +1865,7 @@ export const BestiaryMobs: BestiaryMobsData = { ], bracket: 7 }, - { - name: '§aBat', - cap: 1000, - mobs: ['dungeon_secret_bat_1'], - bracket: 4 - }, + { name: '§aBat', cap: 1000, mobs: ['dungeon_secret_bat_1'], bracket: 4 }, { name: '§aCellar Spider', cap: 1000, @@ -2857,12 +1994,7 @@ export const BestiaryMobs: BestiaryMobsData = { ], bracket: 5 }, - { - name: '§aGolem', - cap: 1000, - mobs: ['sadan_golem_1', 'master_sadan_golem_1'], - bracket: 4 - }, + { name: '§aGolem', cap: 1000, mobs: ['sadan_golem_1', 'master_sadan_golem_1'], bracket: 4 }, { name: '§a§d§lKing Midas', cap: 750, @@ -3032,12 +2164,7 @@ export const BestiaryMobs: BestiaryMobsData = { ], bracket: 3 }, - { - name: '§aSkeleton Lord', - cap: 1000, - mobs: ['skeleton_lord_150', 'master_skeleton_lord_150'], - bracket: 5 - }, + { name: '§aSkeleton Lord', cap: 1000, mobs: ['skeleton_lord_150', 'master_skeleton_lord_150'], bracket: 5 }, { name: '§aSkeleton Master', cap: 25000, @@ -3179,12 +2306,7 @@ export const BestiaryMobs: BestiaryMobsData = { ], bracket: 3 }, - { - name: '§aTerracotta', - cap: 40000, - mobs: ['sadan_statue_1', 'master_sadan_statue_1'], - bracket: 1 - }, + { name: '§aTerracotta', cap: 40000, mobs: ['sadan_statue_1', 'master_sadan_statue_1'], bracket: 1 }, { name: '§a§4§lUndead', cap: 10000, @@ -3232,24 +2354,9 @@ export const BestiaryMobs: BestiaryMobsData = { ], bracket: 4 }, - { - name: '§aWither Guard', - cap: 10000, - mobs: ['wither_guard_100', 'master_wither_guard_100'], - bracket: 5 - }, - { - name: '§aWither Husk', - cap: 10000, - mobs: ['master_wither_husk_100'], - bracket: 5 - }, - { - name: '§aWither Miner', - cap: 25000, - mobs: ['wither_miner_100', 'master_wither_miner_100'], - bracket: 4 - }, + { name: '§aWither Guard', cap: 10000, mobs: ['wither_guard_100', 'master_wither_guard_100'], bracket: 5 }, + { name: '§aWither Husk', cap: 10000, mobs: ['master_wither_husk_100'], bracket: 5 }, + { name: '§aWither Miner', cap: 25000, mobs: ['wither_miner_100', 'master_wither_miner_100'], bracket: 4 }, { name: '§aWithermancer', cap: 25000, @@ -3308,12 +2415,7 @@ export const BestiaryMobs: BestiaryMobsData = { ], bracket: 5 }, - { - name: '§aZombie Lord', - cap: 1000, - mobs: ['zombie_lord_150', 'master_zombie_lord_150'], - bracket: 5 - }, + { name: '§aZombie Lord', cap: 1000, mobs: ['zombie_lord_150', 'master_zombie_lord_150'], bracket: 5 }, { name: '§aZombie Soldier', cap: 40000, @@ -3336,72 +2438,17 @@ export const BestiaryMobs: BestiaryMobsData = { garden: { name: 'Garden', mobs: [ - { - name: '§aBeetle', - cap: 250, - mobs: ['pest_beetle_1'], - bracket: 6 - }, - { - name: '§aCricket', - cap: 250, - mobs: ['pest_cricket_1'], - bracket: 6 - }, - { - name: '§aEarthworm', - cap: 250, - mobs: ['pest_worm_1'], - bracket: 6 - }, - { - name: '§aField Mouse', - cap: 100, - mobs: ['pest_mouse_1'], - bracket: 7 - }, - { - name: '§aFly', - cap: 250, - mobs: ['pest_fly_1'], - bracket: 6 - }, - { - name: '§aLocust', - cap: 250, - mobs: ['pest_locust_1'], - bracket: 6 - }, - { - name: '§aMite', - cap: 250, - mobs: ['pest_mite_1'], - bracket: 6 - }, - { - name: '§aMosquito', - cap: 250, - mobs: ['pest_mosquito_1'], - bracket: 6 - }, - { - name: '§aMoth', - cap: 250, - mobs: ['pest_moth_1'], - bracket: 6 - }, - { - name: '§aRat', - cap: 250, - mobs: ['pest_rat_1'], - bracket: 6 - }, - { - name: '§aSlug', - cap: 250, - mobs: ['pest_slug_1'], - bracket: 6 - } + { name: '§aBeetle', cap: 250, mobs: ['pest_beetle_1'], bracket: 6 }, + { name: '§aCricket', cap: 250, mobs: ['pest_cricket_1'], bracket: 6 }, + { name: '§aEarthworm', cap: 250, mobs: ['pest_worm_1'], bracket: 6 }, + { name: '§aField Mouse', cap: 100, mobs: ['pest_mouse_1'], bracket: 7 }, + { name: '§aFly', cap: 250, mobs: ['pest_fly_1'], bracket: 6 }, + { name: '§aLocust', cap: 250, mobs: ['pest_locust_1'], bracket: 6 }, + { name: '§aMite', cap: 250, mobs: ['pest_mite_1'], bracket: 6 }, + { name: '§aMosquito', cap: 250, mobs: ['pest_mosquito_1'], bracket: 6 }, + { name: '§aMoth', cap: 250, mobs: ['pest_moth_1'], bracket: 6 }, + { name: '§aRat', cap: 250, mobs: ['pest_rat_1'], bracket: 6 }, + { name: '§aSlug', cap: 250, mobs: ['pest_slug_1'], bracket: 6 } ] } }; diff --git a/src/Utils/SkyBlockUtils.ts b/src/Utils/SkyBlockUtils.ts index b68c02855..7e6c4aae4 100644 --- a/src/Utils/SkyBlockUtils.ts +++ b/src/Utils/SkyBlockUtils.ts @@ -70,16 +70,7 @@ export function getPetLevel(petExp: number, type: SkyBlockPetId | 'UNKNOWN', rar const xpForNext: number | null = levels[level - 1] ?? null; const progress = null !== xpForNext ? (isNaN(currentXp / xpForNext) ? 0 : currentXp / xpForNext) : 0; - return { - xp: petExp, - level, - xpForNext, - progress, - maxed: maxLevel === level, - maxLevel, - xpMaxLevel, - currentXp - }; + return { xp: petExp, level, xpForNext, progress, maxed: maxLevel === level, maxLevel, xpMaxLevel, currentXp }; } // CREDITS: https://github.com/SkyCryptWebsite/SkyCryptv2/blob/2d4d0317b1f7a9f27e59d25afd4df24c0e49b0da/src/lib/server/stats/slayer.ts#L24-L59 (modified) @@ -112,14 +103,7 @@ export function getSlayerLevel(slayer: SkyBlockSlayer, xp: number): LevelData { } } - return { - xp, - xpForNext: 0, - level: 0, - maxLevel, - maxed: false, - progress: 0 - }; + return { xp, xpForNext: 0, level: 0, maxLevel, maxed: false, progress: 0 }; } function getXpTable(type: SkyBlockXPTables): Record { @@ -202,13 +186,5 @@ export function getLevelByXp(xp: number, extra: Extra = { type: 'default' }): Sk const progress = level >= maxLevel && !isInfiniteLevelAble ? 0 : Math.max(0, Math.min(currentXp / xpForNext, 1)); const maxed = level >= maxLevel; - return { - xp, - level, - xpForNext, - progress, - maxed, - maxLevel, - currentXp - }; + return { xp, level, xpForNext, progress, maxed, maxLevel, currentXp }; } From efe693e7cf6844fba33675b557e273725193348b Mon Sep 17 00:00:00 2001 From: Jacob Date: Thu, 18 Sep 2025 11:44:53 +0800 Subject: [PATCH 044/124] refactor(eslint) --- .github/scripts/generateIndexFile.ts | 2 +- eslint.config.js | 76 +- package.json | 2 + pnpm-lock.yaml | 1181 +++++++++++++++++ src/API/getGuild.test.ts | 14 +- src/API/getGuild.ts | 6 +- src/API/getLeaderboards.test.ts | 2 +- src/API/getSkyBlockAuction.ts | 2 +- src/API/getSkyBlockAuctions.ts | 6 +- src/API/getSkyBlockProfile.test.ts | 4 +- src/API/getSkyBlockProfiles.test.ts | 4 +- src/Client.ts | 6 +- src/Errors.ts | 2 +- src/Private/Functions.ts | 2 +- src/Private/RateLimit.ts | 2 +- src/Private/RequestHandler.ts | 26 +- src/Private/Updater.ts | 6 +- src/Structures/Boosters/Booster.ts | 4 +- src/Structures/Game.ts | 2 +- src/Structures/Guild/Guild.ts | 2 +- src/Structures/Guild/GuildMember.ts | 2 +- src/Structures/MiniGames/BedWars/BedWars.ts | 8 +- .../MiniGames/CopsAndCrims/CopsAndCrims.ts | 8 +- src/Structures/MiniGames/Pit/Pit.test.ts | 8 +- src/Structures/MiniGames/Pit/Pit.ts | 4 +- src/Structures/MiniGames/SkyWars/SkyWars.ts | 28 +- src/Structures/MiniGames/UHC/UHC.ts | 2 +- .../MiniGames/WoolGames/WoolGames.ts | 2 +- src/Structures/Player/Player.ts | 4 +- .../Inventory/SkyBlockInventoryItem.ts | 28 +- .../Member/Bestiary/SkyBlockMemberBestiary.ts | 4 +- .../SkyBlockMemberChocolateFactory.ts | 2 +- .../SkyBlockMemberCrimsonIsleDojo.ts | 10 +- .../SkyBlockMemberCrimsonIsleDojoMinigame.ts | 10 +- .../Dungeons/SkyBlockMemberDungeonsMode.ts | 2 +- .../SkyBlockMemberDungeonsTreasuresChest.ts | 2 +- .../Armor/SkyBlockMemberInventoriesArmor.ts | 2 +- .../SkyBlockMemberInventoriesBackpack.test.ts | 4 +- .../SkyBlockMemberInventoriesBackpack.ts | 4 +- .../SkyBlockMemberInventoriesBags.test.ts | 4 +- ...BlockMemberInventoriesBagsTalisman.test.ts | 2 +- .../SkyBlockMemberInventoriesBagsTalisman.ts | 2 +- ...ockMemberInventoriesBagsTalismanDecoded.ts | 4 +- ...SkyBlockMemberInventoriesEquipment.test.ts | 2 +- .../SkyBlockMemberInventoriesEquipment.ts | 2 +- ...SkyBlockMemberInventoriesInventory.test.ts | 2 +- .../SkyBlockMemberInventoriesInventory.ts | 2 +- .../Mining/SkyBlockMemberMiningCrystal.ts | 2 +- .../Member/Pets/SkyBlockMemberPets.ts | 6 +- .../PlayerStats/SkyBlockMemberPlayerStats.ts | 4 +- ...ckMemberPlayerStatsEndIslandDragonFight.ts | 2 +- ...yerStatsEndIslandDragonFightDragon.test.ts | 2 +- .../Member/SkyBlockMemberObjectives.ts | 2 +- .../SkyBlock/Profile/SkyBlockProfile.ts | 2 +- src/Structures/Static/Quest.ts | 2 +- src/Structures/Static/QuestObjective.ts | 2 +- src/Utils/Constants.ts | 343 ++++- src/Utils/Guild.ts | 33 +- src/Utils/RemoveSnakeCase.ts | 2 +- src/Utils/SkyBlockUtils.ts | 10 +- src/index.ts | 2 +- 61 files changed, 1733 insertions(+), 186 deletions(-) diff --git a/.github/scripts/generateIndexFile.ts b/.github/scripts/generateIndexFile.ts index d264d736f..fba871691 100644 --- a/.github/scripts/generateIndexFile.ts +++ b/.github/scripts/generateIndexFile.ts @@ -28,7 +28,7 @@ const prettierConfig = JSON.parse(readFileSync('.prettierrc').toString('utf-8')) async function generateBaseIndex() { const lines: string[] = [ '/* v8 ignore next 1000 */', - '/* eslint-disable max-len */', + '/* eslint-disable @stylistic/max-len */', '', '', "import Client from './Client.js';", diff --git a/eslint.config.js b/eslint.config.js index 495a33996..d3aa24366 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,37 +1,95 @@ +/* eslint-disable */ import globals from 'globals'; import prettier from 'eslint-config-prettier'; import sortImports from '@j4cobi/eslint-plugin-sort-imports'; import ts from 'typescript-eslint'; +import stylistic from '@stylistic/eslint-plugin'; +import { globalIgnores } from 'eslint/config'; export default [ ...ts.configs.recommended, prettier, + globalIgnores(['./dist/', './coverage/', './documentation/']), { - ignores: ['**/node_modules/', '**/build/', '**/pnpm-lock.yaml'], + files: ['**/*.ts', '**/*.js'], languageOptions: { ecmaVersion: 2022, sourceType: 'module', globals: { ...globals.es2022, ...globals.node } }, - plugins: { 'sort-imports': sortImports }, + plugins: { '@stylistic': stylistic, 'sort-imports': sortImports }, rules: { 'sort-imports/sort-imports': [ 'error', { ignoreCase: false, ignoreMemberSort: false, memberSyntaxSortOrder: ['all', 'single', 'multiple', 'none'] } ], - 'max-len': ['error', { code: 120, ignoreUrls: true, ignoreComments: true }], + '@stylistic/max-len': [ + 'error', + { code: 120, tabWidth: 2, ignoreComments: true, ignoreUrls: true, ignoreRegExpLiterals: true } + ], + '@stylistic/space-before-function-paren': ['error', { anonymous: 'never', named: 'never', catch: 'always' }], + '@stylistic/function-call-argument-newline': ['error', 'consistent'], '@typescript-eslint/no-unused-vars': ['error', { args: 'none' }], + '@stylistic/quotes': ['error', 'single', { avoidEscape: true }], + '@stylistic/array-bracket-newline': ['error', 'consistent'], + '@stylistic/array-element-newline': ['warn', 'consistent'], 'no-constant-condition': ['error', { checkLoops: false }], + 'no-extend-native': ['warn', { exceptions: ['Object'] }], + '@stylistic/nonblock-statement-body-position': 'error', + '@stylistic/object-curly-spacing': ['error', 'always'], + '@stylistic/no-whitespace-before-property': 'error', + '@stylistic/one-var-declaration-per-line': 'error', 'prefer-const': ['warn', { destructuring: 'all' }], + '@stylistic/dot-location': ['error', 'property'], + '@stylistic/computed-property-spacing': 'error', + '@stylistic/no-mixed-spaces-and-tabs': 'error', + '@stylistic/type-named-tuple-spacing': 'error', curly: ['warn', 'multi-line', 'consistent'], + '@stylistic/no-multiple-empty-lines': 'error', + '@stylistic/max-statements-per-line': 'error', + '@stylistic/type-annotation-spacing': 'error', + '@stylistic/member-delimiter-style': 'error', + '@stylistic/template-curly-spacing': 'error', '@typescript-eslint/no-explicit-any': 'off', + '@stylistic/line-comment-position': 'error', + '@stylistic/object-curly-newline': 'error', + '@stylistic/array-bracket-spacing': 'warn', + '@stylistic/switch-colon-spacing': 'error', + '@stylistic/type-generic-spacing': 'error', + '@stylistic/rest-spread-spacing': 'error', + '@stylistic/no-floating-decimal': 'error', + '@stylistic/space-before-blocks': 'error', + '@stylistic/no-trailing-spaces': 'error', + '@stylistic/no-confusing-arrow': 'error', 'logical-assignment-operators': 'warn', 'no-template-curly-in-string': 'error', + '@stylistic/space-in-parens': 'error', + '@stylistic/space-infix-ops': 'error', + '@stylistic/no-multi-spaces': 'error', + '@stylistic/keyword-spacing': 'error', + '@stylistic/linebreak-style': 'error', 'quote-props': ['error', 'as-needed'], - 'comma-dangle': ['error', 'never'], + '@stylistic/spaced-comment': 'error', + '@stylistic/no-extra-semi': 'error', + '@stylistic/arrow-spacing': 'error', + '@stylistic/block-spacing': 'error', + '@stylistic/comma-spacing': 'error', + '@stylistic/curly-newline': 'error', + '@stylistic/semi-spacing': 'error', + '@stylistic/arrow-parens': 'error', + '@stylistic/comma-dangle': 'error', + '@stylistic/brace-style': 'error', + '@stylistic/indent': ['error', 2], + '@stylistic/key-spacing': 'error', + '@stylistic/comma-style': 'error', 'no-useless-constructor': 'error', + '@stylistic/semi-style': 'error', + '@stylistic/wrap-regex': 'error', + '@stylistic/new-parens': 'error', 'no-useless-assignment': 'error', 'no-inner-declarations': 'error', 'no-implicit-coercion': 'error', + '@stylistic/eol-last': 'error', 'no-use-before-define': 'warn', 'no-underscore-dangle': 'warn', 'no-unneeded-ternary': 'error', + '@stylistic/no-tabs': 'error', 'default-param-last': 'error', 'one-var': ['warn', 'never'], 'no-inline-comments': 'warn', @@ -40,27 +98,25 @@ export default [ 'no-useless-rename': 'warn', 'no-useless-concat': 'warn', 'no-throw-literal': 'error', - 'no-extend-native': 'error', 'default-case-last': 'warn', + '@stylistic/semi': 'error', 'no-self-compare': 'error', 'no-new-wrappers': 'error', + yoda: ['error', 'never'], + '@stylistic/semi': 'error', 'no-lone-blocks': 'error', 'no-undef-init': 'error', 'no-else-return': 'warn', - 'no-extra-semi': 'error', 'require-await': 'warn', - yoda: ['error', 'always'], 'default-case': 'error', 'dot-notation': 'error', 'no-sequences': 'warn', 'no-multi-str': 'warn', 'no-lonely-if': 'warn', 'no-new-func': 'error', - 'no-console': 'error', camelcase: 'warn', 'no-var': 'warn', - eqeqeq: 'warn', - semi: 'error' + eqeqeq: 'warn' } } ]; diff --git a/package.json b/package.json index b92979813..ef416ffc7 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "@8hobbies/typedoc-plugin-404": "^3.2.1", "@eslint/js": "^9.35.0", "@j4cobi/eslint-plugin-sort-imports": "^1.0.2", + "@stylistic/eslint-plugin": "^5.3.1", "@types/eslint": "^9.6.1", "@types/node": "^22.18.3", "@types/xml2js": "^0.4.14", @@ -60,6 +61,7 @@ "dotenv": "^16.6.1", "eslint": "^9.35.0", "eslint-config-prettier": "^10.1.8", + "eslint-plugin-import": "^2.32.0", "globals": "^16.4.0", "prettier": "^3.6.2", "typedoc": "^0.27.9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d28a63821..4df915e7f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,6 +30,9 @@ importers: '@j4cobi/eslint-plugin-sort-imports': specifier: ^1.0.2 version: 1.0.2(eslint@9.35.0)(typescript@5.9.2) + '@stylistic/eslint-plugin': + specifier: ^5.3.1 + version: 5.3.1(eslint@9.35.0) '@types/eslint': specifier: ^9.6.1 version: 9.6.1 @@ -54,6 +57,9 @@ importers: eslint-config-prettier: specifier: ^10.1.8 version: 10.1.8(eslint@9.35.0) + eslint-plugin-import: + specifier: ^2.32.0 + version: 2.32.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.9.2))(eslint@9.35.0) globals: specifier: ^16.4.0 version: 16.4.0 @@ -474,6 +480,9 @@ packages: cpu: [x64] os: [win32] + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + '@shikijs/engine-oniguruma@1.29.2': resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} @@ -483,6 +492,12 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@stylistic/eslint-plugin@5.3.1': + resolution: {integrity: sha512-Ykums1VYonM0TgkD0VteVq9mrlO2FhF48MDJnPyv3MktIB2ydtuhlO0AfWm7xnW1kyf5bjOqA6xc7JjviuVTxg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=9.0.0' + '@types/chai@5.2.2': resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} @@ -504,6 +519,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/node@22.18.3': resolution: {integrity: sha512-gTVM8js2twdtqM+AE2PdGEe9zGQY4UvmFjan9rZcVb6FGdStfjWoWejdmy4CfWVO9rh5MiYQGZloKAGkJt8lMw==} @@ -676,6 +694,30 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -683,6 +725,14 @@ packages: ast-v8-to-istanbul@0.3.5: resolution: {integrity: sha512-9SdXjNheSiE8bALAQCQQuT6fgQaoxJh7IRYrRGZ8/9nv8WhJeC1aXAwN8TbaOssGOukUvyvnkgD9+Yuykvl1aA==} + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -706,6 +756,18 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -744,6 +806,26 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -769,10 +851,26 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dotenv@16.6.1: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -789,9 +887,37 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} @@ -807,6 +933,40 @@ packages: peerDependencies: eslint: '>=7.0.0' + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-module-utils@2.12.1: + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint-scope@8.4.0: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -915,6 +1075,10 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} @@ -924,6 +1088,28 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -944,13 +1130,44 @@ packages: resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} engines: {node: '>=18'} + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -973,22 +1190,117 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -1027,6 +1339,10 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -1077,6 +1393,10 @@ packages: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} @@ -1098,6 +1418,9 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} @@ -1121,10 +1444,38 @@ packages: resolution: {integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==} engines: {node: '>= 8.0.0'} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -1148,6 +1499,9 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@1.11.1: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} @@ -1174,6 +1528,10 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + postcss@8.5.3: resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} @@ -1217,10 +1575,23 @@ packages: resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -1236,17 +1607,45 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + sax@1.4.1: resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + semver@7.7.1: resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} engines: {node: '>=10'} hasBin: true + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1255,6 +1654,22 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -1276,6 +1691,10 @@ packages: std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -1284,6 +1703,18 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -1295,6 +1726,10 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -1306,6 +1741,10 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + test-exclude@7.0.1: resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} engines: {node: '>=18'} @@ -1346,10 +1785,29 @@ packages: peerDependencies: typescript: '>=4.8.4' + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + typedoc-material-theme@1.4.0: resolution: {integrity: sha512-TBoBpX/4zWO6l74/wBLivXHC2rIiD70KXMliYrw1KhcqdybyxkVBLP5z8KiJuNV8aQIeS+rK2QG6GSucQHJQDQ==} engines: {node: '>=18.0.0', npm: '>=8.6.0'} @@ -1383,6 +1841,10 @@ packages: uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} @@ -1453,6 +1915,22 @@ packages: jsdom: optional: true + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -1779,6 +2257,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.37.0': optional: true + '@rtsao/scc@1.1.0': {} + '@shikijs/engine-oniguruma@1.29.2': dependencies: '@shikijs/types': 1.29.2 @@ -1791,6 +2271,16 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} + '@stylistic/eslint-plugin@5.3.1(eslint@9.35.0)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0) + '@typescript-eslint/types': 8.43.0 + eslint: 9.35.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + estraverse: 5.3.0 + picomatch: 4.0.3 + '@types/chai@5.2.2': dependencies: '@types/deep-eql': 4.0.2 @@ -1812,6 +2302,8 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/json5@0.0.29': {} + '@types/node@22.18.3': dependencies: undici-types: 6.21.0 @@ -2053,6 +2545,56 @@ snapshots: argparse@2.0.1: {} + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-includes@3.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + + array.prototype.findlastindex@1.2.6: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + assertion-error@2.0.1: {} ast-v8-to-istanbul@0.3.5: @@ -2061,6 +2603,12 @@ snapshots: estree-walker: 3.0.3 js-tokens: 9.0.1 + async-function@1.0.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + balanced-match@1.0.2: {} base64-js@1.5.1: {} @@ -2085,6 +2633,23 @@ snapshots: cac@6.7.14: {} + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + callsites@3.1.0: {} camelcase@8.0.0: {} @@ -2120,6 +2685,28 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + debug@4.4.0: dependencies: ms: 2.1.3 @@ -2132,8 +2719,30 @@ snapshots: deep-is@0.1.4: {} + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + dotenv@16.6.1: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + eastasianwidth@0.2.0: {} emoji-regex@8.0.0: {} @@ -2144,8 +2753,90 @@ snapshots: entities@4.5.0: {} + es-abstract@1.24.0: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + es-module-lexer@1.7.0: {} + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -2178,6 +2869,53 @@ snapshots: dependencies: eslint: 9.35.0 + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.35.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 8.43.0(eslint@9.35.0)(typescript@5.9.2) + eslint: 9.35.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.9.2))(eslint@9.35.0): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.35.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.35.0) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 8.43.0(eslint@9.35.0)(typescript@5.9.2) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 @@ -2301,6 +3039,10 @@ snapshots: flatted@3.3.3: {} + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 @@ -2309,6 +3051,43 @@ snapshots: fsevents@2.3.3: optional: true + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -2330,10 +3109,37 @@ snapshots: globals@16.4.0: {} + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + gopd@1.2.0: {} + graphemer@1.4.0: {} + has-bigints@1.1.0: {} + has-flag@4.0.0: {} + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + html-escaper@2.0.2: {} ieee754@1.2.1: {} @@ -2349,16 +3155,123 @@ snapshots: imurmurhash@0.1.4: {} + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-extglob@2.1.1: {} + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + is-fullwidth-code-point@3.0.0: {} + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-number@7.0.0: {} + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + isarray@2.0.5: {} + isexe@2.0.0: {} istanbul-lib-coverage@3.2.2: {} @@ -2400,6 +3313,10 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} + json5@1.0.2: + dependencies: + minimist: 1.2.8 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -2454,6 +3371,8 @@ snapshots: punycode.js: 2.3.1 uc.micro: 2.1.0 + math-intrinsics@1.1.0: {} + mdurl@2.0.0: {} merge2@1.4.1: {} @@ -2473,6 +3392,8 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimist@1.2.8: {} + minipass@7.1.2: {} mrmime@2.0.1: {} @@ -2487,6 +3408,39 @@ snapshots: dependencies: clone: 2.1.2 + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -2496,6 +3450,12 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -2514,6 +3474,8 @@ snapshots: path-key@3.1.1: {} + path-parse@1.0.7: {} + path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 @@ -2531,6 +3493,8 @@ snapshots: picomatch@4.0.3: {} + possible-typed-array-names@1.1.0: {} + postcss@8.5.3: dependencies: nanoid: 3.3.11 @@ -2572,8 +3536,34 @@ snapshots: process: 0.11.10 string_decoder: 1.3.0 + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + resolve-from@4.0.0: {} + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + reusify@1.1.0: {} rollup@4.37.0: @@ -2611,18 +3601,89 @@ snapshots: dependencies: queue-microtask: 1.2.3 + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + safe-buffer@5.2.1: {} + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + sax@1.4.1: {} + semver@6.3.1: {} + semver@7.7.1: {} + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} signal-exit@4.1.0: {} @@ -2639,6 +3700,11 @@ snapshots: std-env@3.9.0: {} + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -2651,6 +3717,29 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -2663,6 +3752,8 @@ snapshots: dependencies: ansi-regex: 6.1.0 + strip-bom@3.0.0: {} + strip-json-comments@3.1.1: {} strip-literal@3.0.0: @@ -2673,6 +3764,8 @@ snapshots: dependencies: has-flag: 4.0.0 + supports-preserve-symlinks-flag@1.0.0: {} + test-exclude@7.0.1: dependencies: '@istanbuljs/schema': 0.1.3 @@ -2704,10 +3797,50 @@ snapshots: dependencies: typescript: 5.9.2 + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + typedoc-material-theme@1.4.0(typedoc@0.27.9(typescript@5.9.2)): dependencies: '@material/material-color-utilities': 0.3.0 @@ -2742,6 +3875,13 @@ snapshots: uc.micro@2.1.0: {} + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + undici-types@6.21.0: {} uri-js@4.4.1: @@ -2814,6 +3954,47 @@ snapshots: - supports-color - terser + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + which@2.0.2: dependencies: isexe: 2.0.0 diff --git a/src/API/getGuild.test.ts b/src/API/getGuild.test.ts index 3d429ac74..ab8375c16 100644 --- a/src/API/getGuild.test.ts +++ b/src/API/getGuild.test.ts @@ -55,7 +55,7 @@ test('getGuild (raw)', async () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); expectTypeOf(data).toEqualTypeOf(); - if (null === data) return; + if (data === null) return; expect(data.isRaw()).toBe(true); client.destroy(); }); @@ -66,7 +66,7 @@ test('getGuild (Name)', async () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(Guild); expectTypeOf(data).toEqualTypeOf(); - if (null === data) return; + if (data === null) return; expect(data.isRaw()).toBe(false); if (data.isRaw()) return; expect(data.id).toBeDefined(); @@ -110,7 +110,7 @@ test('getGuild (Name)', async () => { }); expect(data.me).toBeDefined(); expectTypeOf(data.me).toEqualTypeOf(); - if (null !== data.me) { + if (data.me !== null) { expect(data.me).toBeDefined(); expectTypeOf(data.me).toEqualTypeOf(); expect(data.me.uuid).toBeDefined(); @@ -250,7 +250,7 @@ test('getGuild (Id)', async () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(Guild); expectTypeOf(data).toEqualTypeOf(); - if (null === data) return; + if (data === null) return; expect(data.isRaw()).toBe(false); if (data.isRaw()) return; expect(data.id).toBeDefined(); @@ -294,7 +294,7 @@ test('getGuild (Id)', async () => { }); expect(data.me).toBeDefined(); expectTypeOf(data.me).toEqualTypeOf(); - if (null !== data.me) { + if (data.me !== null) { expect(data.me).toBeDefined(); expectTypeOf(data.me).toEqualTypeOf(); expect(data.me.uuid).toBeDefined(); @@ -434,7 +434,7 @@ test('getGuild (Player)', async () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(Guild); expectTypeOf(data).toEqualTypeOf(); - if (null === data) return; + if (data === null) return; expect(data.isRaw()).toBe(false); if (data.isRaw()) return; expect(data.id).toBeDefined(); @@ -478,7 +478,7 @@ test('getGuild (Player)', async () => { }); expect(data.me).toBeDefined(); expectTypeOf(data.me).toEqualTypeOf(); - if (null !== data.me) { + if (data.me !== null) { expect(data.me).toBeDefined(); expectTypeOf(data.me).toEqualTypeOf(); expect(data.me.uuid).toBeDefined(); diff --git a/src/API/getGuild.ts b/src/API/getGuild.ts index a3baa21d7..b12aa9068 100644 --- a/src/API/getGuild.ts +++ b/src/API/getGuild.ts @@ -12,17 +12,17 @@ class getGuild extends Endpoint { options?: RequestOptions ): Promise { if (!query) throw new Error(Errors.NO_GUILD_QUERY); - if ('id' === searchParameter && !this.client.functions.isGuildID(query)) { + if (searchParameter === 'id' && !this.client.functions.isGuildID(query)) { throw new Error(Errors.INVALID_GUILD_ID); } - const isPlayerQuery = 'player' === searchParameter; + const isPlayerQuery = searchParameter === 'player'; if (isPlayerQuery) query = await this.client.requestHandler.toUUID(query); if (!['id', 'name', 'player'].includes(searchParameter)) { throw new Error(Errors.INVALID_GUILD_SEARCH_PARAMETER); } const res = await this.client.requestHandler.request(`/guild?${searchParameter}=${encodeURI(query)}`, options); if (res.options.raw) return res; - if (!res.data.guild && 'player' !== searchParameter) { + if (!res.data.guild && searchParameter !== 'player') { throw new Error(Errors.GUILD_DOES_NOT_EXIST); } return res.data.guild ? new Guild(res.data.guild, isPlayerQuery ? query : undefined) : null; diff --git a/src/API/getLeaderboards.test.ts b/src/API/getLeaderboards.test.ts index 080b06af5..04421dc45 100644 --- a/src/API/getLeaderboards.test.ts +++ b/src/API/getLeaderboards.test.ts @@ -24,7 +24,7 @@ test('getLeaderboards', async () => { expect(data.isRaw()).toBe(false); if (data.isRaw()) return; Object.keys(data).forEach((key) => { - if ('isRaw' === key) return; + if (key === 'isRaw') return; if (undefined === data[key]) return; expect(data[key]).toBeDefined(); expectTypeOf(data[key]).toEqualTypeOf(); diff --git a/src/API/getSkyBlockAuction.ts b/src/API/getSkyBlockAuction.ts index 1de093a29..f992e3ec3 100644 --- a/src/API/getSkyBlockAuction.ts +++ b/src/API/getSkyBlockAuction.ts @@ -34,7 +34,7 @@ class getSkyBlockAction extends Endpoint { } } - if (null === filter) throw new Error(Errors.BAD_AUCTION_FILTER); + if (filter === null) throw new Error(Errors.BAD_AUCTION_FILTER); const res = await this.client.requestHandler.request(`/skyblock/auction?${filter}=${query}`, options); if (res.options.raw) return res; diff --git a/src/API/getSkyBlockAuctions.ts b/src/API/getSkyBlockAuctions.ts index 1df8bb28b..6fff864c0 100644 --- a/src/API/getSkyBlockAuctions.ts +++ b/src/API/getSkyBlockAuctions.ts @@ -11,9 +11,9 @@ class getSkyBlockAuctions extends Endpoint { options?: AuctionRequestOptions ): Promise { if (!query) throw new Error(Errors.INVALID_OPTION_VALUE); - if ('number' === typeof query && 0 >= query) throw new Error(Errors.INVALID_OPTION_VALUE); - if ('number' !== typeof query && '*' !== query) throw new Error(Errors.INVALID_OPTION_VALUE); - if ('*' === query) return await this.getAllPages(); + if (typeof query === 'number' && query <= 0) throw new Error(Errors.INVALID_OPTION_VALUE); + if (typeof query !== 'number' && query !== '*') throw new Error(Errors.INVALID_OPTION_VALUE); + if (query === '*') return await this.getAllPages(); return await this.getPage(query, options); } diff --git a/src/API/getSkyBlockProfile.test.ts b/src/API/getSkyBlockProfile.test.ts index c53c3b6a3..77d4469bf 100644 --- a/src/API/getSkyBlockProfile.test.ts +++ b/src/API/getSkyBlockProfile.test.ts @@ -1,4 +1,4 @@ -/* eslint-disable max-len */ +/* eslint-disable @stylistic/max-len */ import Client from '../Client.js'; import Errors from '../Errors.ts'; import RequestData from '../Private/RequestData.js'; @@ -9,7 +9,7 @@ import SkyBlockProfileBanking from '../Structures/SkyBlock/Profile/Banking/SkyBl import SkyBlockProfileCommunityUpgrades from '../Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgrades.js'; import { expect, expectTypeOf, test } from 'vitest'; import type { SkyBlockProfileName, SkyBlockProfileType } from '../Types/SkyBlock.js'; -/* eslint-enable max-len */ +/* eslint-enable @stylistic/max-len */ test('getSkyBlockProfile (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); diff --git a/src/API/getSkyBlockProfiles.test.ts b/src/API/getSkyBlockProfiles.test.ts index 17e2dce7e..9f8620c0f 100644 --- a/src/API/getSkyBlockProfiles.test.ts +++ b/src/API/getSkyBlockProfiles.test.ts @@ -1,4 +1,4 @@ -/* eslint-disable max-len */ +/* eslint-disable @stylistic/max-len */ import Client from '../Client.js'; import Errors from '../Errors.ts'; import RequestData from '../Private/RequestData.js'; @@ -10,7 +10,7 @@ import SkyBlockProfileCommunityUpgrades from '../Structures/SkyBlock/Profile/Com import { expect, expectTypeOf, test } from 'vitest'; import type { SkyBlockProfileName, SkyBlockProfileType } from '../Types/SkyBlock.js'; import type { WithRaw } from '../Types/API.js'; -/* eslint-enable max-len */ +/* eslint-enable @stylistic/max-len */ test('getSkyBlockProfiles (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); diff --git a/src/Client.ts b/src/Client.ts index 2bfc98234..7d630de07 100644 --- a/src/Client.ts +++ b/src/Client.ts @@ -64,7 +64,7 @@ class Client { this.functions = new Functions(this); this.updater = new Updater(this); this.rateLimit = new RateLimit(this); - if ('NONE' !== this.options.rateLimit) this.rateLimit.initialize(); + if (this.options.rateLimit !== 'NONE') this.rateLimit.initialize(); for (const func in API) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error @@ -74,7 +74,7 @@ class Client { this[func] = endpoint.execute.bind(endpoint); } if (clients.find((x) => x.key === key)) { - // eslint-disable-next-line no-console + console.warn(Errors.MULTIPLE_INSTANCES); const found = clients.find((x) => x.key === key); if (found) { @@ -96,7 +96,7 @@ class Client { destroy() { const clientIndex = clients.findIndex((client) => client.key === this.key); - if (-1 !== clientIndex) clients.splice(clientIndex, 1); + if (clientIndex !== -1) clients.splice(clientIndex, 1); if (this.interval) clearInterval(this.interval); if (this.rateLimit.interval) clearInterval(this.rateLimit.interval); } diff --git a/src/Errors.ts b/src/Errors.ts index b9a612797..d40d1cd7c 100644 --- a/src/Errors.ts +++ b/src/Errors.ts @@ -1,4 +1,4 @@ -/* eslint-disable max-len */ +/* eslint-disable @stylistic/max-len */ class Errors { static INVALID_API_KEY: string = '[Hypixel-API-Reborn] Invalid API Key! For help join our Discord Server https://discord.gg/NSEBNMM'; diff --git a/src/Private/Functions.ts b/src/Private/Functions.ts index 2322a632c..8cda06708 100644 --- a/src/Private/Functions.ts +++ b/src/Private/Functions.ts @@ -13,7 +13,7 @@ class Functions { } isGuildID(id: string): boolean { - return 24 === id.length; + return id.length === 24; } } diff --git a/src/Private/RateLimit.ts b/src/Private/RateLimit.ts index e9ae831f2..0cc404c2e 100644 --- a/src/Private/RateLimit.ts +++ b/src/Private/RateLimit.ts @@ -25,7 +25,7 @@ class RateLimit { } reset() { - if (false === this.initialized) return; + if (this.initialized === false) return; this.requests = 0; } diff --git a/src/Private/RequestHandler.ts b/src/Private/RequestHandler.ts index 09e597bbc..2cc864590 100644 --- a/src/Private/RequestHandler.ts +++ b/src/Private/RequestHandler.ts @@ -23,27 +23,27 @@ class RequestHandler { }); } const res = await fetch(BASE_URL + endpoint, { headers: { 'API-Key': this.client.key } }); - if (500 <= res.status && 528 > res.status) { + if (res.status >= 500 && res.status < 528) { throw new Error( Errors.ERROR_STATUSTEXT.replace(/{statustext}/, `Server Error : ${res.status} ${res.statusText}`) ); } const parsedRes = (await res.json()) as Record; - if (400 === res.status) { + if (res.status === 400) { throw new Error( Errors.ERROR_CODE_CAUSE.replace(/{code}/, '400 Bad Request').replace(/{cause}/, parsedRes.cause || 'Unknown') ); } - if (403 === res.status) throw new Error(Errors.INVALID_API_KEY); - if (422 === res.status) throw new Error(Errors.UNEXPECTED_ERROR); + if (res.status === 403) throw new Error(Errors.INVALID_API_KEY); + if (res.status === 422) throw new Error(Errors.UNEXPECTED_ERROR); if ( - 429 === res.status && - 'You have already looked up this player too recently, please try again shortly' === parsedRes.cause + res.status === 429 && + parsedRes.cause === 'You have already looked up this player too recently, please try again shortly' ) { throw new Error(Errors.RECENT_REQUEST); } - if (429 === res.status) throw new Error(Errors.RATE_LIMIT_EXCEEDED); - if (200 !== res.status) { + if (res.status === 429) throw new Error(Errors.RATE_LIMIT_EXCEEDED); + if (res.status !== 200) { throw new Error(Errors.ERROR_STATUSTEXT.replace(/{statustext}/, res.statusText)); } if (!parsedRes.success && !endpoint.startsWith('/housing')) { @@ -67,28 +67,28 @@ class RequestHandler { async toUUID(input: string): Promise { if (!input) throw new Error(Errors.NO_NICKNAME_UUID); - if ('string' !== typeof input) throw new Error(Errors.UUID_NICKNAME_MUST_BE_A_STRING); + if (typeof input !== 'string') throw new Error(Errors.UUID_NICKNAME_MUST_BE_A_STRING); if (this.client.functions.isUUID(input)) return input.replace(/-/g, ''); const url = `https://mowojang.matdoes.dev/${input}`; if (this.client.cacheHandler.has(url)) { return this.client.cacheHandler.get(url); } const res = await fetch(url); - if (500 <= res.status && 528 > res.status) { + if (res.status >= 500 && res.status < 528) { throw new Error( Errors.ERROR_STATUSTEXT.replace(/{statustext}/, `Server Error : ${res.status} ${res.statusText}`) ); } const parsedRes = (await res.json()) as Record; - if (400 === res.status) { + if (res.status === 400) { throw new Error( Errors.ERROR_CODE_CAUSE.replace(/{code}/, '400 Bad Request').replace(/{cause}/, parsedRes.cause || '') ); } - if (200 !== res.status) { + if (res.status !== 200) { throw new Error(Errors.ERROR_STATUSTEXT.replace(/{statustext}/, res.statusText)); } - if ('string' !== typeof parsedRes.id || 'string' !== typeof parsedRes.name) { + if (typeof parsedRes.id !== 'string' || typeof parsedRes.name !== 'string') { throw new Error(Errors.MALFORMED_UUID); } if (this.client.options.cache) { diff --git a/src/Private/Updater.ts b/src/Private/Updater.ts index f93405a7b..e5e40050b 100644 --- a/src/Private/Updater.ts +++ b/src/Private/Updater.ts @@ -1,4 +1,4 @@ -/* eslint-disable no-console */ + import Client from '../Client.js'; import Errors from '../Errors.ts'; import packageJson from '../../package.json' with { type: 'json' }; @@ -27,14 +27,14 @@ class Updater { async getLatestVersion(): Promise { const request = await this.client.requestHandler.fetchExternalData('https://registry.npmjs.org/hypixel-api-reborn'); - if (200 !== request.statusCode) throw new Error(Errors.UPDATER_REQUEST_NOT_OK); + if (request.statusCode !== 200) throw new Error(Errors.UPDATER_REQUEST_NOT_OK); return request.data['dist-tags'].latest; } compareVersions(a: string, b: string): boolean { const pa = a.split('.'); const pb = b.split('.'); - for (let i = 0; 3 > i; i++) { + for (let i = 0; i < 3; i++) { const na = Number(pa[i]); const nb = Number(pb[i]); if (isNaN(na) || isNaN(nb)) return false; diff --git a/src/Structures/Boosters/Booster.ts b/src/Structures/Boosters/Booster.ts index fe878ef02..7004eebda 100644 --- a/src/Structures/Boosters/Booster.ts +++ b/src/Structures/Boosters/Booster.ts @@ -3,7 +3,7 @@ import type RequestData from '../../Private/RequestData.ts'; import type { BoosterType } from '../../Types/Booster.js'; export function parseType(data: Record): BoosterType { - if (true === data.stacked) return 'STACKED'; + if (data.stacked === true) return 'STACKED'; if (!data.stacked) return 'QUEUED'; return 'ACTIVE'; } @@ -31,7 +31,7 @@ class Booster { this.isActive = Array.isArray(data.stacked); this.type = parseType(data); this.stackers = Array.isArray(data.stacked) ? Array.from(data.stacked) : []; - this.expired = 0 > data.length; + this.expired = data.length < 0; } toString(): string { diff --git a/src/Structures/Game.ts b/src/Structures/Game.ts index d6dca3e62..f5938d0ac 100644 --- a/src/Structures/Game.ts +++ b/src/Structures/Game.ts @@ -19,7 +19,7 @@ class Game { this.id = result?.id || null; this.code = result?.code || null; this.name = result?.name || null; - this.found = null !== result; + this.found = result !== null; } toString(): GameString | null { diff --git a/src/Structures/Guild/Guild.ts b/src/Structures/Guild/Guild.ts index dc5b36080..6d4ce98a0 100644 --- a/src/Structures/Guild/Guild.ts +++ b/src/Structures/Guild/Guild.ts @@ -62,7 +62,7 @@ class Guild { } guildMaster(): GuildMember | undefined { - return this.members.find((member) => 'Guild Master' === member.rank); + return this.members.find((member) => member.rank === 'Guild Master'); } isRaw(): this is RequestData { diff --git a/src/Structures/Guild/GuildMember.ts b/src/Structures/Guild/GuildMember.ts index dc3437e50..e0529b697 100644 --- a/src/Structures/Guild/GuildMember.ts +++ b/src/Structures/Guild/GuildMember.ts @@ -20,7 +20,7 @@ class GuildMember { this.rank = data?.rank || 'Member'; this.mutedUntilTimestamp = data?.mutedTill || null; this.mutedUntil = this.mutedUntilTimestamp ? new Date(this.mutedUntilTimestamp) : null; - const xpCheck = data.expHistory && 'number' === typeof Object.values(data.expHistory)[0]; + const xpCheck = data.expHistory && typeof Object.values(data.expHistory)[0] === 'number'; this.expHistory = parseHistory(data?.expHistory || {}); this.weeklyExperience = xpCheck ? Number(Object.values(data.expHistory).reduce((pV: any, cV: any) => pV + cV, 0)) diff --git a/src/Structures/MiniGames/BedWars/BedWars.ts b/src/Structures/MiniGames/BedWars/BedWars.ts index d9a86ff8b..1d3a1b857 100644 --- a/src/Structures/MiniGames/BedWars/BedWars.ts +++ b/src/Structures/MiniGames/BedWars/BedWars.ts @@ -9,13 +9,13 @@ import type { BedWarsPrestige } from '../../../Types/Player.js'; function getBedWarsLevel(xp: number): number { let level = Math.floor(xp / 487000) * 100; xp = xp % 487000; - if (500 > xp) return level + xp / 500; + if (xp < 500) return level + xp / 500; level++; - if (1500 > xp) return level + (xp - 500) / 1000; + if (xp < 1500) return level + (xp - 500) / 1000; level++; - if (3500 > xp) return level + (xp - 1500) / 2000; + if (xp < 3500) return level + (xp - 1500) / 2000; level++; - if (7000 > xp) return level + (xp - 3500) / 3500; + if (xp < 7000) return level + (xp - 3500) / 3500; level++; xp -= 7000; return level + xp / 5000; diff --git a/src/Structures/MiniGames/CopsAndCrims/CopsAndCrims.ts b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrims.ts index ca56703c3..64a0581f8 100644 --- a/src/Structures/MiniGames/CopsAndCrims/CopsAndCrims.ts +++ b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrims.ts @@ -86,10 +86,10 @@ class CopsAndCrims { this.winsOnRuins = data?.game_wins_ruins || 0; this.winsOnRiviera = data?.game_wins_riviera || 0; this.winsOnHarbor = data?.game_wins_harbor || 0; - this.winsOnAtomicV1 = data?.[`game_wins_atomic v1`] || 0; - this.winsOnAtomicV2 = data?.[`game_wins_atomic v2`] || 0; - this.winsOnMelonFactory = data?.[`game_wins_melon factory`] || 0; - this.winsOnMelonFactoryV2 = data?.[`game_wins_melon factory v2`] || 0; + this.winsOnAtomicV1 = data?.['game_wins_atomic v1'] || 0; + this.winsOnAtomicV2 = data?.['game_wins_atomic v2'] || 0; + this.winsOnMelonFactory = data?.['game_wins_melon factory'] || 0; + this.winsOnMelonFactoryV2 = data?.['game_wins_melon factory v2'] || 0; this.wins = data?.game_wins || 0; this.gamesPlayed = data?.game_plays || 0; this.losses = this.gamesPlayed - this.wins; diff --git a/src/Structures/MiniGames/Pit/Pit.test.ts b/src/Structures/MiniGames/Pit/Pit.test.ts index 6df400247..c3e240b87 100644 --- a/src/Structures/MiniGames/Pit/Pit.test.ts +++ b/src/Structures/MiniGames/Pit/Pit.test.ts @@ -144,7 +144,7 @@ test('Pit Inventory', async () => { expectTypeOf(pitArmor).toEqualTypeOf(); expect(pitArmor.helmet).toBeDefined(); expectTypeOf(pitArmor.helmet).toEqualTypeOf(); - if (null !== pitArmor.helmet) { + if (pitArmor.helmet !== null) { expect(pitArmor.helmet).toBeDefined(); expect(pitArmor.helmet).toBeInstanceOf(PitInventoryItem); expectTypeOf(pitArmor.helmet).toEqualTypeOf(); @@ -163,7 +163,7 @@ test('Pit Inventory', async () => { } expect(pitArmor.chestplate).toBeDefined(); expectTypeOf(pitArmor.chestplate).toEqualTypeOf(); - if (null !== pitArmor.chestplate) { + if (pitArmor.chestplate !== null) { expect(pitArmor.chestplate).toBeDefined(); expect(pitArmor.chestplate).toBeInstanceOf(PitInventoryItem); expectTypeOf(pitArmor.chestplate).toEqualTypeOf(); @@ -182,7 +182,7 @@ test('Pit Inventory', async () => { } expect(pitArmor.leggings).toBeDefined(); expectTypeOf(pitArmor.leggings).toEqualTypeOf(); - if (null !== pitArmor.leggings) { + if (pitArmor.leggings !== null) { expect(pitArmor.leggings).toBeDefined(); expect(pitArmor.leggings).toBeInstanceOf(PitInventoryItem); expectTypeOf(pitArmor.leggings).toEqualTypeOf(); @@ -201,7 +201,7 @@ test('Pit Inventory', async () => { } expect(pitArmor.boots).toBeDefined(); expectTypeOf(pitArmor.boots).toEqualTypeOf(); - if (null !== pitArmor.boots) { + if (pitArmor.boots !== null) { expect(pitArmor.boots).toBeDefined(); expect(pitArmor.boots).toBeInstanceOf(PitInventoryItem); expectTypeOf(pitArmor.boots).toEqualTypeOf(); diff --git a/src/Structures/MiniGames/Pit/Pit.ts b/src/Structures/MiniGames/Pit/Pit.ts index 09310ac65..fe92c99d7 100644 --- a/src/Structures/MiniGames/Pit/Pit.ts +++ b/src/Structures/MiniGames/Pit/Pit.ts @@ -40,7 +40,7 @@ class Pit { this.level = this.calcLevel( this.prestige, - 0 < this.prestige + this.prestige > 0 ? this.xp - (pit?.Prestiges?.[this.prestige - 1] ? pit?.Prestiges?.[this.prestige - 1]?.SumXp || 0 : 0) : this.xp ) ?? 0; @@ -110,7 +110,7 @@ class Pit { private calcLevel(prestige: number, xp: number): number { const multiplier = pit?.Prestiges[prestige]?.Multiplier || 0; let level = 0; - while (0 < xp && 120 > level) { + while (xp > 0 && level < 120) { const levelXp = pit?.Levels?.[Math.floor(level / 10)]?.Xp || 0 * multiplier; if (xp >= levelXp * 10) { xp -= levelXp * 10; diff --git a/src/Structures/MiniGames/SkyWars/SkyWars.ts b/src/Structures/MiniGames/SkyWars/SkyWars.ts index eaf05230e..d7a9e8e11 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWars.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWars.ts @@ -5,7 +5,7 @@ import SkyWarsPackages from './SkyWarsPackages.js'; import type { SkyWarsPrestige } from '../../../Types/Player.js'; function getSkyWarsPrestige(level: number): SkyWarsPrestige { - if (60 <= level) return 'Mythic'; + if (level >= 60) return 'Mythic'; return (['Iron', 'Iron', 'Gold', 'Diamond', 'Emerald', 'Sapphire', 'Ruby', 'Crystal', 'Opal', 'Amethyst', 'Rainbow'][ Math.floor(level / 5) ] || 'Iron') as SkyWarsPrestige; @@ -13,10 +13,10 @@ function getSkyWarsPrestige(level: number): SkyWarsPrestige { function getSkyWarsLevel(xp: number): number { const totalXp = [0, 2, 7, 15, 25, 50, 100, 200, 350, 600, 1000, 1500]; - if (0 === xp) return 0; - if (15000 <= xp) return Math.floor((xp - 15000) / 10000 + 12); - const level = totalXp.findIndex((x) => 0 < x * 10 - xp); - return -1 === level ? 0 : level; + if (xp === 0) return 0; + if (xp >= 15000) return Math.floor((xp - 15000) / 10000 + 12); + const level = totalXp.findIndex((x) => x * 10 - xp > 0); + return level === -1 ? 0 : level; } function getSkyWarsLevelProgress(xp: number) { @@ -25,22 +25,22 @@ function getSkyWarsLevelProgress(xp: number) { let percent; let xpToNextLevel; let currentLevelXp = xp; - if (15000 <= xp) { + if (xp >= 15000) { currentLevelXp -= 15000; - if (0 === currentLevelXp) return { currentLevelXp: 0, xpToNextLevel: 10000, percent: 0, xpNextLevel: 10000 }; - if (10000 < currentLevelXp) { + if (currentLevelXp === 0) return { currentLevelXp: 0, xpToNextLevel: 10000, percent: 0, xpNextLevel: 10000 }; + if (currentLevelXp > 10000) { do { currentLevelXp -= 10000; - } while (10000 <= currentLevelXp); + } while (currentLevelXp >= 10000); } xpToNextLevel = 10000 - currentLevelXp; percent = Math.round(currentLevelXp) / 100; const percentRemaining = Math.round((100 - percent) * 100) / 100; return { currentLevelXp, xpToNextLevel, percent, xpNextLevel: 10000, percentRemaining }; } - const totalXpToNextLevel = (xpToNextLvl?.[totalXp.findIndex((x) => 0 < x * 10 - xp)] || 0) * 10; + const totalXpToNextLevel = (xpToNextLvl?.[totalXp.findIndex((x) => x * 10 - xp > 0)] || 0) * 10; for (let i = 0; i < xpToNextLvl.length; i++) { - if (0 > currentLevelXp - (xpToNextLvl?.[i] || 0) * 10) break; + if (currentLevelXp - (xpToNextLvl?.[i] || 0) * 10 < 0) break; currentLevelXp -= (xpToNextLvl?.[i] || 0) * 10; } xpToNextLevel = totalXpToNextLevel - currentLevelXp; @@ -104,9 +104,9 @@ class SkyWars { this.levelProgress = getSkyWarsLevelProgress(data?.skywars_experience); this.levelFormatted = data?.levelFormatted ? data?.levelFormatted - ?.replace(/§l/gm, '**') - ?.replace(/§([a-f]|[1-9])/gm, '') - ?.replace(/§r/gm, '') + ?.replace(/§l/gm, '**') + ?.replace(/§([a-f]|[1-9])/gm, '') + ?.replace(/§r/gm, '') : null; this.prestige = getSkyWarsPrestige(this.level); this.opals = data?.opals || 0; diff --git a/src/Structures/MiniGames/UHC/UHC.ts b/src/Structures/MiniGames/UHC/UHC.ts index 2da7f95eb..8d0edfce1 100644 --- a/src/Structures/MiniGames/UHC/UHC.ts +++ b/src/Structures/MiniGames/UHC/UHC.ts @@ -6,7 +6,7 @@ function getStarLevel(kills: number, wins: number): number { const sum = kills + wins * 10; let starLevel = 1; const sums = [0, 1, 6, 21, 46, 96, 171, 271, 521, 1021, 1321, 1621, 1921, 2221, 2521, Infinity]; - starLevel += sums.map((x) => x * 10 - sum).findIndex((x) => 0 < x) - 1; + starLevel += sums.map((x) => x * 10 - sum).findIndex((x) => x > 0) - 1; return starLevel; } diff --git a/src/Structures/MiniGames/WoolGames/WoolGames.ts b/src/Structures/MiniGames/WoolGames/WoolGames.ts index 1dee05e64..af73f9f12 100644 --- a/src/Structures/MiniGames/WoolGames/WoolGames.ts +++ b/src/Structures/MiniGames/WoolGames/WoolGames.ts @@ -36,7 +36,7 @@ class WoolGames { const expToLevel100 = 49e4; if (exp < baseExp) return minimalExp?.findIndex((x) => exp < x); const theoreticalLevel = (exp - baseExp) / 5e3 + baseLevel; - if (100 < theoreticalLevel) return 100 + this.convertXPToLevel(exp - expToLevel100); + if (theoreticalLevel > 100) return 100 + this.convertXPToLevel(exp - expToLevel100); return theoreticalLevel; } } diff --git a/src/Structures/Player/Player.ts b/src/Structures/Player/Player.ts index a71f730e7..6f07693ab 100644 --- a/src/Structures/Player/Player.ts +++ b/src/Structures/Player/Player.ts @@ -117,7 +117,7 @@ class Player { } else { switch (player.newPackageRank) { case 'MVP_PLUS': - return 'SUPERSTAR' !== player.monthlyPackageRank ? 'MVP+' : 'MVP++'; + return player.monthlyPackageRank !== 'SUPERSTAR' ? 'MVP+' : 'MVP++'; case 'MVP': return 'MVP'; case 'VIP_PLUS': @@ -144,7 +144,7 @@ class Player { private xpToNextLevel(xp: number): number { const lvl = this.getPlayerLevel(xp); const xpToNext = 2500 * Math.floor(lvl) + 5000; - if (10000 > xp) return 10000; + if (xp < 10000) return 10000; return xpToNext; } diff --git a/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.ts b/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.ts index caa1f63d1..72f54ceaa 100644 --- a/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.ts +++ b/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.ts @@ -88,20 +88,20 @@ class SkyBlockInventoryItem { this.statsBook = data?.tag?.ExtraAttributes?.stats_book || null; this.runes = data?.tag?.ExtraAttributes?.runes ? Object.keys(data?.tag?.ExtraAttributes?.runes).map( - (rune) => new SkyBlockInventoryItemRune({ id: rune, tier: data?.tag?.ExtraAttributes?.runes?.[rune] }) - ) + (rune) => new SkyBlockInventoryItemRune({ id: rune, tier: data?.tag?.ExtraAttributes?.runes?.[rune] }) + ) : null; this.reforge = data?.tag?.ExtraAttributes?.modifier || 'none'; this.hasArtOfWar = Boolean(data?.tag?.ExtraAttributes?.art_of_war_count || 0); this.starCount = data?.tag?.ExtraAttributes?.upgrade_level || 0; this.enchantments = data?.tag?.ExtraAttributes?.enchantments ? Object.keys(data?.tag?.ExtraAttributes?.enchantments).map( - (enchantment) => - new SkyBlockInventoryItemEnchantment({ - id: enchantment, - level: data?.tag?.ExtraAttributes?.enchantments?.[enchantment] - }) - ) + (enchantment) => + new SkyBlockInventoryItemEnchantment({ + id: enchantment, + level: data?.tag?.ExtraAttributes?.enchantments?.[enchantment] + }) + ) : null; this.uuid = data?.tag?.ExtraAttributes?.uuid || null; this.hotPotatoBookCount = data?.tag?.ExtraAttributes?.hot_potato_count || null; @@ -126,12 +126,12 @@ class SkyBlockInventoryItem { this.isShiny = Boolean(data?.tag?.ExtraAttributes?.is_shiny || 0); this.attributes = data?.tag?.ExtraAttributes?.attributes ? Object.keys(data?.tag?.ExtraAttributes?.attributes).map( - (attribute) => - new SkyBlockInventoryItemAttribute({ - id: attribute, - level: data?.tag?.ExtraAttributes?.attributes[attribute] - }) - ) + (attribute) => + new SkyBlockInventoryItemAttribute({ + id: attribute, + level: data?.tag?.ExtraAttributes?.attributes[attribute] + }) + ) : null; this.jalapenoCount = data?.tag?.ExtraAttributes?.jalapeono_count || null; this.hecatombSRuns = data?.tag?.ExtraAttributes?.hecatomb_s_runs || null; diff --git a/src/Structures/SkyBlock/Member/Bestiary/SkyBlockMemberBestiary.ts b/src/Structures/SkyBlock/Member/Bestiary/SkyBlockMemberBestiary.ts index 9a05d5fc6..68e065db3 100644 --- a/src/Structures/SkyBlock/Member/Bestiary/SkyBlockMemberBestiary.ts +++ b/src/Structures/SkyBlock/Member/Bestiary/SkyBlockMemberBestiary.ts @@ -63,7 +63,7 @@ class SkyBlockMemberBestiary { }; categories[category].mobsUnlocked = categories[category].mobs.reduce( - (acc, mob) => acc + (0 < mob.kills ? 1 : 0), + (acc, mob) => acc + (mob.kills > 0 ? 1 : 0), 0 ); categories[category].mobsMaxed = categories[category].mobs.reduce( @@ -76,7 +76,7 @@ class SkyBlockMemberBestiary { const maxMilestone = mobs.map((mob) => mob.maxTier).reduce((acc, cur) => acc + cur, 0); const milestone = mobs.map((mob) => mob.tier).reduce((acc, cur) => acc + cur, 0); const familiesMaxed = mobs.filter((mob) => mob.tier === mob.maxTier).length; - const familiesUnlocked = mobs.filter((mob) => 0 < mob.kills).length; + const familiesUnlocked = mobs.filter((mob) => mob.kills > 0).length; const totalFamilies = mobs.length; return { diff --git a/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactory.ts b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactory.ts index b60856a3f..8c786706e 100644 --- a/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactory.ts +++ b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactory.ts @@ -36,7 +36,7 @@ class SkyBlockMemberChocolateFactory { this.supremeChocolateBars = data?.supreme_chocolate_bars || 0; this.eggs = new SkyBlockMemberChocolateFactoryEggs(data?.rabbits?.collected_eggs || {}); this.foundRabbits = Object.keys(data?.rabbits || {}) - .filter((key) => 'collected_eggs' !== key && 'collected_locations' !== key) + .filter((key) => key !== 'collected_eggs' && key !== 'collected_locations') .reduce((obj: Record, key: string) => { obj[key] = data.rabbits[key]; return obj; diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojo.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojo.ts index f4f09fff8..637e596ee 100644 --- a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojo.ts +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojo.ts @@ -34,15 +34,15 @@ class SkyBlockMemberCrimsonIsleDojo { } private getBelt(points: number): CrimsonIsleBelt { - if (7000 <= points) { + if (points >= 7000) { return 'Black'; - } else if (6000 <= points) { + } else if (points >= 6000) { return 'Brown'; - } else if (4000 <= points) { + } else if (points >= 4000) { return 'Blue'; - } else if (2000 <= points) { + } else if (points >= 2000) { return 'Green'; - } else if (1000 <= points) { + } else if (points >= 1000) { return 'Yellow'; } return 'White'; diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojoMinigame.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojoMinigame.ts index 578babbbf..4c36edce3 100644 --- a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojoMinigame.ts +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojoMinigame.ts @@ -15,15 +15,15 @@ class SkyBlockMemberCrimsonIsleDojoMinigame { } private getScore(points: number): CrimsonIsleDojoRank { - if (1000 <= points) { + if (points >= 1000) { return 'S'; - } else if (800 <= points) { + } else if (points >= 800) { return 'A'; - } else if (600 <= points) { + } else if (points >= 600) { return 'B'; - } else if (400 <= points) { + } else if (points >= 400) { return 'C'; - } else if (200 <= points) { + } else if (points >= 200) { return 'D'; } return 'F'; diff --git a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsMode.ts b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsMode.ts index c5e6b7320..3fe409740 100644 --- a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsMode.ts +++ b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsMode.ts @@ -13,7 +13,7 @@ class SkyBlockMemberDungeonsMode { floor7: SkyBlockMemberDungeonsFloor; constructor(data: Record, type: DungeonGamemode) { this.highestFloorCompleted = data?.[type]?.highest_tier_completed || 0; - this.floor0 = 'catacombs' === type ? new SkyBlockMemberDungeonsFloor(data?.[type] || {}, '0') : null; + this.floor0 = type === 'catacombs' ? new SkyBlockMemberDungeonsFloor(data?.[type] || {}, '0') : null; this.floor1 = new SkyBlockMemberDungeonsFloor(data?.[type] || {}, '1'); this.floor2 = new SkyBlockMemberDungeonsFloor(data?.[type] || {}, '2'); this.floor3 = new SkyBlockMemberDungeonsFloor(data?.[type] || {}, '3'); diff --git a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasuresChest.ts b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasuresChest.ts index f3025a4bf..e2fe6a993 100644 --- a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasuresChest.ts +++ b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasuresChest.ts @@ -19,7 +19,7 @@ class SkyBlockMemberDungeonsTreasuresChest { this.quality = data?.quality || 0; this.shinyEligible = data?.shiny_eligible || false; this.paid = data?.paid || false; - this.rerolls = 0 !== (data?.rerolls || 0); + this.rerolls = (data?.rerolls || 0) !== 0; } toString(): string { diff --git a/src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmor.ts b/src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmor.ts index 27129e2e7..2c100f3fb 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmor.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmor.ts @@ -4,7 +4,7 @@ import { decode } from '../../../../../Utils/SkyBlockUtils.js'; class SkyBlockMemberInventoriesArmor extends SkyBlockMemberInventoriesBaseInventory { override async decodeData(): Promise { - if (undefined === this.base64 || null === this.base64) return null; + if (undefined === this.base64 || this.base64 === null) return null; const decoded = await decode(this.base64); return new SkyBlockMemberInventoriesArmorDecoded(decoded); } diff --git a/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.test.ts b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.test.ts index 76b65e4b5..bdd89f23f 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.test.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.test.ts @@ -3,7 +3,7 @@ import { expect, expectTypeOf, test } from 'vitest'; test('SkyBlockMemberInventoriesBackpack', () => { /* eslint-disable quote-props */ - /* eslint-disable max-len */ + /* eslint-disable @stylistic/max-len */ const data = new SkyBlockMemberInventoriesBackpack( { backpackIcons: { @@ -20,7 +20,7 @@ test('SkyBlockMemberInventoriesBackpack', () => { '0' ); /* eslint-enable quote-props */ - /* eslint-enable max-len */ + /* eslint-enable @stylistic/max-len */ expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberInventoriesBackpack); expectTypeOf(data).toEqualTypeOf(); diff --git a/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.ts b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.ts index ab30a08b7..9736eb503 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.ts @@ -10,8 +10,8 @@ class SkyBlockMemberInventoriesBackpack { } async decodeData(): Promise { - if (undefined === this.backpackItemBase64 || null === this.backpackItemBase64) return null; - if (undefined === this.backpackContentsBase64 || null === this.backpackContentsBase64) return null; + if (undefined === this.backpackItemBase64 || this.backpackItemBase64 === null) return null; + if (undefined === this.backpackContentsBase64 || this.backpackContentsBase64 === null) return null; const backpackIconDecoded = await decode(this.backpackItemBase64); const backpackItemsDecoded = await decode(this.backpackContentsBase64); return new SkyBlockMemberInventoriesBackpackDecoded({ backpackIconDecoded, backpackItemsDecoded }); diff --git a/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBags.test.ts b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBags.test.ts index e755e0f7f..f476fb8e9 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBags.test.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBags.test.ts @@ -4,7 +4,7 @@ import SkyBlockMemberInventoriesInventory from '../Inventory/SkyBlockMemberInven import { expect, expectTypeOf, test } from 'vitest'; test('SkyBlockMemberInventoriesBags', () => { - /* eslint-disable max-len */ + /* eslint-disable @stylistic/max-len */ /* eslint-disable camelcase */ const data = new SkyBlockMemberInventoriesBags({ potion_bag: { @@ -23,7 +23,7 @@ test('SkyBlockMemberInventoriesBags', () => { data: 'H4sIAAAAAAAA/+3WzW7TQBAH8EmatomFaEVPSIC2El8SULUSafm44CapciAJcoUQJ7S1J7Ylx668m5a+AS/B2e/hR+FBEGMHBBUVhV64/H2I4t2d8f5/p3GIOtSIHSJ60qRmHDRWGrTcy+apvePQktVhh1qc+hFVzxJ1hnHAB4kOjbx+dWg1iM1xos/k1Oss57asrtJ6Wez19UyH/EKVhf+oK6u3y2L3jTYmPpHFPk85Naw8Dua+jbOUdqVkGFuj4jCVPlKmu/fkdy+bKqvzkO0DUy1++fzpR7Vsbknjm2Xx7NBqKdVBwIE6jThVJsrsZnWP52WReK43UK7nTd61qTXWM6YN2XDzWZabKJcSN8+zU3JobfDR5tq1No+P5pZNuwKhddcbTbzDoTfof6i7EDVpZZGPqv/n1F5BDWpQgxrUoAY1qEENalCDGtSgBjWoQQ1qUIMa1KAGNahBDWpQgxrUoAY1qEENalCDGtSg9v/U/kqq9ZvUzp8D3SiLqQTqTUajyfh8pOuydZDEqb0kzTIiIAIiIAIiIMK/RXh5xYHAuXAg2Ph1INiX/v7ZJt2Vg/U9jYr0CSstx7m7XU8CfqRTn5XN6Ja8HVUV1ZvSaWYjzr+PCVt0X3brfmzU/Lg6IZ98WnVYnDCPFWu5/8OfXQLWQhRWB3cWY0fCxqigvvJVh4w12VjkuoT+2v7k7bj3/qLhQp5v1qQw2WIwAAA=' } }); - /* eslint-enable max-len */ + /* eslint-enable @stylistic/max-len */ /* eslint-enable camelcase */ expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberInventoriesBags); diff --git a/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalisman.test.ts b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalisman.test.ts index c39076232..2478ffb82 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalisman.test.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalisman.test.ts @@ -4,7 +4,7 @@ import { expect, expectTypeOf, test } from 'vitest'; test('SkyBlockMemberInventoriesBagsTalisman', () => { const data = new SkyBlockMemberInventoriesBagsTalisman({ - // eslint-disable-next-line max-len + // eslint-disable-next-line @stylistic/max-len data: 'H4sIAAAAAAAA/9S9S+zsWH7f9x9JlmZGj5E0lmU7CvJX4rGjlErF90OAFiy+iqwiWcVH8ZHFNd/vR5GsYpHZRLJjIDDklQ1kYSdaGBgD8S4IYgQJYswuAQJkEyRIFhG0CAIkyCKb7Iyc+t/bfe/c7r7qmdstdBr9v1V1eHjO4Sny9znf3/mdU999evrO07fy7z49fet7P/P0M3n0rT/+1tNfYttrM37ru08/O/rpzz59Z5dHsVD56fD09PSvvvv0XaO8VpU2NXH/7aefkaKnv4GHIUH6MLKmCD9eo1Hor4MAT9ZQHAYwguMRBMPfevrVbO7ye1wd2+5a+WMcgRq+e+zbLu7HPB6+8/TtMb6P1z4eQHOevvXtp+8Yedr4j5Sf+ef7o5T0WXA3G3ohJuR4CDS3ysn5sPFuJNoSEjZlt2MCd22HDjk1ptguJO5I25aT78ci712PPWmJQYKdZLVMKeu0DDZyMNC9esmuDAPR7iDlGC20fbGPjnU6ocyO4OXGjyMNEqsc34nLVMarUdnM4yabIIxAfDUyatTcCd65lVa3iKhqVmo7ZyZv95NqdIi937b2fLf3y6qPdt4kojvC0zvFhSXFL6rhdNvT1lEVwiXbqXBktuJ4d/SxVfzuHITnsC5iFMZOxnVUQ4zYUu2qpG5J7UMxE6R3qVM77aJ0KH9rebdi9eNySoLMd/eT2+z3/CQdeSuXi3zu6f7cF1pzyO6YGnnT3ao9m0NL+55Qt7w9k7dyipiEvxP6pNkZeuiW+z3E5fhWQ9spEW+UVmTNSQoxna6zlBjdIGB8V0pz73LJqAK3nau84gentjy53cpU7OsHeudg2SEUsdbZ5/g2EHEbOUpHEbmNNzGuula7WtomGjhdDyt2oI3xPJJdtkIKJYsXJYZWkSFv1QgnKCVFrZAi6Uo9CLp5bEXVzieMivQ76jElPcf0aiFGguVhQhQHLxZZbSyZXmeoiWLZHqNvLgKhdH8TRNMvrl1/2dI7G9Q8hKq5SQ9nea9vZFJEI3fJVZm+tznR+Ld7Man3Vtz7l/zIdDcdyyL+5pamevdUy0CdrLV2cErvdhdi4xdnNj9cAin9g28//aWzX13jb/3TeGpTiZUh34arENWzwGFyiWtTxXRhpVAW1TxNiskgGjvtJZbJw5188+pq8KyqlHKGkFhp0cwU10Qh1zihVgoLUuvTXROl2UX4u2LysMLppSdasMJKA5szqdRs5wDxukA8ay6o9005mFvIhWs+zrEmVQTngFcpf1MvUjVBLUCRI1dWfb5HdjV79umlrdFOhj3jdb5IPGPR7jx7jvJy7PX1gTrBF2NY2I+nPfI78vC6frmNduDeyqnbO2VcA7u6erY6u7YHHWq8ilga8pzspR2H5bQotlqqyLlURQtya3dSEWXxRK/UbDlTuRJTFwbzzHBRRAvR7BOmcOD9cs682svcWrkr9QlTEa8G/Tx7hZdpXJq/9BG7pR+vyamjga357tMvRPnQVf78naefO7R9/G2Q+AtPv/ejH5JsO4zD849+iMJ/9i/+wbPRXqukaieQQAKz9YwPz3nzHLZ14I+///TbINuf/eEfPw6KPkj/0Q/DFQL92X/6Xz8Lcd+G+TiDYn8dHOUbP6ji6PcfObQkefprP/phrOdpNq7DKg/L57EF/6dpFf82OAH+0Q/9H/2w+tEPS/DSP7/+ZKmspiia+sywLG8Ymu4+v8327aefU/06fvorIGnnN9H8vK3aNnpmMx8UH4PL/R5/H3ufGcc+D65jPPzs0/d6vwcNfHXt0t6P4uG1BQZAePr+jlE599X2oGncK3bHHCSWBzVcr+DY34iCgCYTLFjTUUStMTwJ137o4+skocgIC2M0QJKfe/rOmNfxMPp1B0r9o//in/2zP3l6+pmnn+f82k/jp599+unJE+AolfgwtU5ojFyjeEyv6Rjx10QSJQQSwHBMBB9JHmcyxag4FdpwPIfQbDNVyDcQbZOJWEgsXt/x1LYZFrHuvLw/LTBj58uRc+jFOhQbbRG2Luow20u3N/mdMDmSfWA8izkQp1tBqrbXY1O6x0j/cuuSZVRmMuywLTy7xCnoI10Ssamvz7EYCtJq6G/yxs81XdjDJRTuiBYKaX67QQ0RW5nVRcVKeWpJbNpiakmTpt3SJ0VArvbF8MyiZdp+x4BnwRGNsaOMxj2gREFdq5u0O8gbQggdazPq2SjsJgaY4dSYpgX29SKinMKDON46DHNm2E5Qly5VZ7oBBfRqONhTJvsa4wb3jTkCEFZ4r3LVimhZ0d7SWyUXry1pwTZSA94K9oWjhYGElS7f5QiH30zpJjnqtKULhl3NgEaN2fqX6nDXG6tS4oswNgnJ3AZS6WlDQ1eCc1rFd6OgjSBzS5fA2/PmuMtTeB5vZ2suaeV60JHYgNTVhZ/KnL6qFFQolx3i0GIBnbI+0kTP1xnrzl2JQ175+X7jIRre4rsuxmKKdFIjIko6DkVBt2I+CKowdKlrzXu0VB9PxhZGtJVx3R59XJKOF3+H1k6+X6Ja39kA0khR+AHD3FzI3fPhyc+W80XUVniXYplNhfgJRySUhPdz4p+0+RaTN/uMLx55Sg+ek0TnXgiIzDjN1+Os37tu3vYxt0BGuMi4LcRozzdRYliry5WXzOHYc2p8Jnu42jr78C15/uQD5MGVJUQfBFK5EFG+kDwysLwuppnMrNjKHVAH8grhYUFRjTvNKvewqCGqihLk5R8ij3xybbx0Hf1miPTkGZ/kVTsPwbMXEpzlKnTOXVifX9e90+fItt7k06t4p8Pg2PL62LB/TRfZNKBK+/G0R/7zHLBSquVM7u90KOTa2wF9W8ahhrugPhdhLdQRi1895/SWSAaFqAWgzLItPJNZXBPQ1j5Xqgiut1BzF3Fn0CeLCsitPdK4CvSRmqsIP4M+RbyinN2FR9RFzTyTXwC1AGklREpfEzE5gdcdtE9Of/AHXx11/uZnqBOsYAj6s3/8D56lZoyrKk/jBlj9v1D0/HWQdGzDMh6f+aEDhnVonxU/zPLmJ8XPbx41ds+br3jjqD+qe6Uw7E5S3yIIxUmUinx0HYQwChAEJWsKCaE1jeNUSEIQBYfw+wj6z/79/+FPvzIEAYlDYxQN6kfhNUrjAIYgbY2TMU74SRzSBPqRCFJP0RHZFO3C5V2r93Im2GJrr7Z50K9M45iY1k13py5zRGwI5YVcsRB3RfsNS3R0jqjp5bo1WOYu7vdT12MqqxyOaVXzYlU4jirfW/OA2ERXdMT5NjnsPdc35BHd1ZfNKbn5tELHLNU1xWmXsxrKnZzMhhABg/YjId7F2JI1m7qXm8guL34xiMyl33sUBvU11CjUcq0ygWNPqx22Sa8UaZHKMjWCm1tiRifHkNyrnASfZMez5pxrIWum74YsSde0l+6NruvbNDof9BVR6NbuUrgOot328+gUB4O8pWNxCzy97eqqSdTDdTVsg1uIOCx6vt9Fw93hfS0LZ567JMhlq273mHIRoitzD4uML2RGxVdQYCVQxfN82SgzriH5kd3l7iWgfbXZl86hsu9tibvna3/LIDODc5vQHBMyNwlsl1vdMb1+JpWICpazs5+3sD6w7MovkPoOxtzwHtcGjw0wO1LIhnNPV1aINH+RhrEmdWcD7Z2WPegA7Tf+Sl1HA450IKKO8rAxY65wD75ljIq6O+wtseULhLuMJ6PdhYgckViPx8pOl0ua1ijD2epM1J9qcgokhz1ulXTRz+IB7QoODFKOHhq1x5I55upBArrJ07mdilwnJW0G+Twa2YKf1bwycj6nLxxcm4Z8v+WrvWIfL91y7ZGQkUEPIJtVvKL6SaeB3T5sc6dzfFGGyGxVBdloQac79A6C/vGHEKSZFqYWYABfuIuSfzGClCICA30FdWvpMcCHgKmFNNMF51kwEEWZCwQAEAGw9kHxI/OufceDeszcbzR+6FxBhMoDosWt1QwIRMTjAHrNclbEE6wgcuWaQu2ZJ4BludBE9+4VygRQBPJZKMDSpAIkewXoD5tf3IKZNVOtfxL8/NLTvwEg8aMfUnzT52EWR89TPmbPLDDOz29s5dNDV5DvpLywZAX/4OlfB+nbtrkOz0dgah9yA3DncdRfEdAPwIl/86VskvWb5yB+vg6geMCb+AVJz23/DNrzePv0OyDT3F4fxEH+9D//k+fPFPqAHTDm4++BQn/tx6nma82HoYb86IfEj0Ht8enAi7zKMYBl71KN+KygIh6tyAAhAIcZYLoTPxx/AqJ9fwQSbKj95lX80sF13IxP3wtBzjz0q1fRS4e+0V1H3jB3lmry+itGNyWBYc1PoRdCJOKTAbomQzxaYySErH2YINZYgAYhFRFImETvQe/v/8//zeMb/mqgB5M4keABvcYDklqjRBCtA2Dz13hC+AgZUwlNxx8Jvet0cZDr3se9gtCJQvMZ94pywm4jwNXlaOhS2BpbYdy54WaeEjAwOqQuvsyFB49oRLpHS3OXezzAyGEOdSesrIDQt9dD0aGbo9vkp4iLvJ2I0d4OCDoB2WoyLWthr5AGuz+EqMvJ5Nj5fWavmCnkid3O6PPU4aWhdC+rDmFbpfLp9gDEWzAr06avMDy2ULsqncX11JUqHvdTNtRDztehUVDbwoyOrdDdTyZ/KYVjctvwaTasmBvN7lbwBZ9niEOM5uhxN74mYofd78mN04wucT7f2qYcgqZgdlp43Ln0ojBtR6yImUVWfnua0ptQwu183BLzoOY30bOxCmPyWwNuVaHEb7vdmCnCNpa6JuPK08TmU+Xp4x0eDf3S1tW2w719jGwsuR5PJncu83Bm/VQi5tVt2g0DnLj+dtpMxmbTT9qKZ/AsPYbiSkuw632/D1pVpfTDhdUJ8ybIweIUyn4lM2SrZ3d9b0Bas0x26bD6tF82YVcUXgSrDE+wF5fVrLSmFGJabHnVw4ezb0zBXkRvTe31kt1bKxX154JFA1/WBWa21M0h9TQh9bZczd2vECGnNWYRmxip/OF6DKQbLtf78JiE8gFyLPeCgDTyRhL7CBNgVCtPEHtH6SYxvVJKsm2W1ro3TYG8zXhNDbiyH1K1IVYn2MMvSXYOpuFMbTKRj+Vi4/T9/WaP+GWzSuoo81RFxgnsLfT+jw9AD9I4HlU5C1G49P4Bjx+umFmmcBKumhbuiSfIRSzELXigLwAM7QcIzrVbnO7Kh3UX69lnxLPvt1A8z99wTx+iicrdq3nINaW7C169QkI9Uc2VZZu5QHt5tZArol4ohZwptgV5tVpr9rlUAAgV+4S6Zjh59TlXuKgGQERd28oPzNv2BfYZcm09i0T+/bY/vq8xQPTqE3CHyL0LDOlTqL+A80sC9Nc/BqBPT38LHHmotr4BnFheEw2FKfh3MQR9VwqCrEBiEUyQVwAyv/+s3eL+RSIqfuM/P/0AFGNncfNcxf4tb9I3YvF3wWsDco7P1w4Q8Wn90lQUe19k5g0gJjhAQNB/988/LfvpF0HSo3yQ46cB7+vaqE8rSvq2fvZfrgDA4DkfnqMeCFjQZY8jj7Kol0FA/k5/PIOm/t7HQfw3QNKnbTCugEUhEMlfD8N/3dCsg3DQ7FeGdeR1lj8c3iI8QnEcD8M1luDYGqNQf00lQLfCdADTNAHDPv0+wv/o3/0f/+HzV4VwLIIQMsDiNUqGxBqN/GhNIySxhmIfR8Hgwodp6iMRHms3J9ema3QZAprmItO6b673frNxiJXUz8ZdnBAIYBze2Wd414sbmvK0vkCv0bbZVZzOhU1sDnmO2SgLx3eFP7PQSjGOQFPv3OAQRbB8O4QUhALm+5v5FKE8Gu9xXx+6jRWvjqWxOeZF6WuSZmvOLe2dPeM3dYbJQDjvjLEWGBuXahoXTXwiDHQg7sxVQM7ibnuSEg4YKf5GcjTFODQ53FyyF8AoobN844iiZJFwN1Idcvd89Jh4ufmcNAJFpEGnS6nDqjVfdmd6vnKo7gZmXPdXO/HtYxJtiRzygj0TA8Om8XawgYK7SXLqaVrgRQlDbw+bORlHcGICVlXkzW036kC2VrwlzhStW2jIH8+EK6EWL5BNnm5Vh7HozWCsoixhkPOWvLsEzx5hiJoH06k2YSV7ys5QZLgEysJ3+wgRtIC7wM1qODaQ0zJ3++CxejGfiiAOTyye1BuiYT0KzzaAMsNKJVj4mOqlrGjO3sZu7q0gO/eK3agWmvYVr3p6JPdQVrF9o2fG4Vhf7tmGgpWBVfiQFmj0eoN9/r534IN6I5Cd620stna1Q9Iy1CzISpbunPjeeANEUEzX00GdgXHOCqZLo4zraSS8/QU8tmdW9BvLo5O9Fhkc7vO6vF2OWBMrAiwym6vgBwUaJRd6hNw55sGQQzZM4UxCLDOeN/qKkm1001sMw3KEQGH5xS3wcsCOzFuE/8MPTdqpXAjwnKKqmSKK8YUIBzpVz7zCAjpOLlVTgTQbINyUYMUGepfzSnfJKrcIkT/HderFjnz7RqP7oUltoXIX4TEhB/pnWwMtelfFc6XWcqVwPKyIQg2GNJVSpIuyqCC/tKj1CQVDGdB+ZVZNNXcXHlIWAaAcnCOevvQk3S9/DG7/MkhX/DQPn4W8ec2wFQzy/9V3yXr0+3F+NoEV/u3nF9/sWyfr+y7WBzqnLH9o2eb5ga4XDmexD4gG1G3sh9mzUc7bqgVonGO/f2T6W7f46VdBtiAGuH5cHcD1g3CPxmnB+ALER9NiBEIQkA5wFv4Y+R6fzjxAnXHkWYk5PO8Y8y39wvfoB78kBczl6oNe8oPnnT8+t8kzG1dx0PtjDpq+fn7U9cxH+ePjV03Gn336le7Rp68yf3z16IWnp1/437/99L23iWFbtf3Tz/mgjZ/4gIEAdl+BC3vF6sz2FaNKCmPy3KcsxQM4wvAIXtMRDq0xHAVyFKGpdUBgmB8SWEjG8Xss/cP07/9XX9k0ZBJTMIT5+JoO/WCNoiH2mAYl1jABJQgdoX6Ekx/JUku3aWXwqmPIj1dm5M2rM+OwL4WsY0odUCvXK4VeV+LZT+yWjnWK0IdjWUYBoZ3CfUxQtXAeOWwfDErgcsWOxFDx0jK7lHdcbYSpzXavk3Bu4B3VZdOGs+yzgB7zESPusIr0Wt3IBUNdjpcSPV3iMryc+P15HjiLj/q7GvecsaPy/hrSEwlzqxxILO7amecT7CJA7pCMTYz54uFgcCiK+2aD98Qt6ZUUbVxNQOhgqauE03WraG7lqG69Q9RhGwhOR5u5UsS+wwOnVlyH829Yt5XJyj/Go7Wf8CKVgybO8EJpehl299Eo7ovKBRSZ+ozBuJm+3+s+gi+9IKnO3Bx1d9VRubmCFERMIx0tiFPK+s1+aWaSrnI0p2/9DBfGsZjr4nxEVnC6XZCVbt7QjjzwxFaxOH10ekuXKzQBIxZsc5m9hYkLUWL8okxWaC9i4oYkbjJ1wE7wdktySEsh/WUirnRw2Rk105tUPrDMpdMplNT299SIlyNz1jdzcSlwZ6PwJbOJc0K3yaUwpizEo/heJ5GWONgl3pmCtWd2Wh3c4IjoYWeFn/wNihKG7ug2vt1n1tX1WC50Sn3nHZvYdfHbqmYubo2JyECfl7Nx2xcu3jVNeYG1yqR6cbXUe+pcUdvTxnfUYbNB/KLD6h4i5n4fSKxqxqm130LtKQOanFxi32Laa9gFhzgHXwpsKpp/Oesr/Ka8Zen/9SGWPqYSFSD3FM6FlfkLfcC1amalZz84WoH3DKQU0qyJLpDR0qwU/N3jgCw0T5M7f5ClcNB4VdDoXVQ/pOAdvD+9kYjy4tvR1XVefLSG5wiwD9jmvcjBLRQ25+pNvk+5F84vx8jXnGJyCxplM/+xtEd+UN70cr1SDc7bMcRhpt8pAx99G69cVM685nQNQLve+oqtG+BhrS5gxGaeFg9IYAURShdcv1ecII8D0rcoJ9fMcs1+9FG6eFy5eKZQaJwKJHO5uIs7uYsO+u4hrfVKsRX40z56I3s9B4xTRAFyjffbDv5q+OaJ50/GBksgVuMnvuRP2PxlGP3tj5PE0Gun8a6tooeSHTMgFP03nldQUlU9AwQ144OlD4Ij94eb+aFRb+34OKFrp/ghIoE0ngGF+SoOH1gbHpJ086MfRj8G08cnxTV3EvtjGjL6rCM4+sT7+0LPthn79msSkd//xPv7ShNesZpq6tpbFemDATtE+yTQjniwxqKQfDhi0TVB0QQGhRBG4dR75Pvj//bVf/+/fFXkg/wQQvEIqFggWNcojAXrAIvidUKSNBnRUAIRxEeST1m5u3mXZEbII1caDL94MhRrColtHnIvm9CnV5uIXVaO2Qc0JPe70GAXacVY4xj72RZNN/doQuyqlw6rs8ywsclcqptusgYJlboTHKqRG0xFtugrkzXBzbgn2/hinMmicUvbqc/kFXBo7x3uK/qeSVkltigryuohQuAjc4iRAGaJJswQ/H4etyEWzTY0jr7Fj9ta59pLd8kqLG78u5OZXUYwN/FsJQqcTQaZnzo/a/RbVdQOuwALrg7YbQcvR5FCUWoidmkwH7aKwTaNZjlEOE4HRC38q1/ZB9VmppXO8GQTk8hdIMuV64z1atNVGZwWQRRchwU+M4VSrAavI4fNEPdZOfm2zNQMZXW+r5xb4nLYnMvYm9GqxTBvPB1jWC/bYberdsfs0tqurO9xBJmhgBSzQNbrbYNhdiUixSEdEkpy7Vagz14RTCpfc9mRqJyRE5asuzUjt+hp5gTyJjBwrDhfrgy7sNPKsShf5/ylO8ztQpeMSWAwFKPoThyIjYTkVEZ7eT0QqOwbsnwmuQWl00nj+etYLivqagArR/tw3LNzcLcJLOtFohKIy04Ze3azz820nfBLfJYD6FKxo1LLZ9m4nxT1NlwVjIWtYZJKpW4vmrtCtii0KkW8hzFVmyufHLgTbOyC6Lgzg9wm2DRyOnAjZRybG4qzUnFvq9wvWSc6F+K8IHUvnYONFOoBq8Fn6ssF4MwKd0IUk5nAK/rFKlJ+hHsCtSnkmumVQFVBD+fnw9GpLipI29aaKGGKac3Kh8lXu0DhBei58Dl+ehsm+k2cAaXmx6hA5dIJEB1THiGehVxp4mMmmAe022YKotcuckLd2kI8c1t6ooK6xcMpbi2aeUI9oLQ9LgTEPCEP6gHlPf8kM6Df+ThaPTSgHkfXMB4AquLn14b8efRLIO9e/Jqv3aAk30QAS1zvp4BF4PPvPn+SWOeAGy8pfhM9/dY72QEknoP5hXL4D954YX9ahP0KSHrdBj2u8vDrQdcv8irH6690/iCxbwN2EpSEgS5bowECuEEm6JqCyWAd4jRJoTFOE9T7ATt/73deuZ83d/n0H7+HLPBFAiWePT3++yy+vmoHwtPTvw2OMNexrf2Xi6/mZ8CsZngOAdgefgKQHve5Xw0v1eSv3QJgMHIDfdb28/OLpx3cJ3n/Ep31aDsYy8QvDoP68fX+1mc96mHbJHkK0PgYwYBiKa4FN1vTjm8GQqzfd6B4ULpz/JhBzl8HSce4H9rGr8AIp+7AYAcMoEgIgn6Cu+XbdRvlSR4DQd+0Dejz77R9nuaN6adA1/O6oanMAQxrlCMY4Wj6q0fxn94qCUJEAUwSYDjxcJTDQFfTcQQ+4mQAowEMJTH+rXeK4fgD/ygEFCWdeVD7r3dvLuBV+PoCXkFPf4VX2R2jmjz3imP0/SuN2b86aOKXvrE/Wyby9Jfflqny5o7XdYbdf15W+OnX32YFT4dhao9Yts9mpN4tc8fo3KsvzEq+m5VhGVZiXl/Qa9/JF/Xx9z/bOPDFshrIuj1on9987N2qjKNusfybvvtsYfDTb7zNy2rb7YH/wktA3+0W/VE2o3Kfl5F4+rW3Gd98c+8Zi/4f3f6fv/155+JPv2gcJIV/fXnvmpOnN+bkNz/WnHz348zJ73zGnERxFY/x89DFIXiKwmfAhnp4fnjlHsGgwCJcuy9jJn5aG/BX37UB3KMtP7kFePtFRK8LAM/gdwT+8OrIM/pbJQOhARoRGLEmfchfYwl4FyREsE6ogCDQOMR8JP6Sz/on9WBPv2Ls32TbapppvHuffpIJ3Ke/CBpi7l4Zj8fs88pBn355yzOmpIqvdo+sn1sMBDJplsq6IM9B4c2fwp58Uhby9MtnyWQUSQVXyZi7z8sDDAlnqSKvqeAR0PlXRwb0zOdlpJ6+96ZdB14UwTUYn5eLfPqlN7nedNRns4BH79Pe/FBR+NP3gEqVLf3RX4atPfr08XD9xme+utd26LMl0E+/9qYx7A7YjOOBMfn3HvK/M/+v/8mffs4j/FOJWHBvxUmAEAAuFLZGH7ee//DhknTg46RP0RBOf6SIZbjoEDRxfMWSinEzQVrlYyGQM4zY2qnSNSS6MR7X7wzz0Eq+DqMd2oR9t2pxXaYajzltBDJ3eQvFciTmkw3NYHQnqN60neuimZWbvFARrLDYOFp2o5regB/OZ7tDYG3cIWwjMsOVISBrn8NHWjmumEX2kfx8cGj5UhxDbcudmMHa7exmmS77ImtYhlf4IWE6e7D5s2FIdFXbKzhpogyR9gvlWRp3H5fqvj3l4cEefIev/X5266uPyPedsNk0I6ptFMYJTQjxlRqTsjw2O/fMHq7TqYmxntcE71yWzTQJE3bc7AM7IG7KvczTqC9DkUoPXQKu9rqPfUxKTG5CEfIqivckF1jPpjfBBTc7ojoNtq+qjh5CGB4LTWDCnklugki5INv4jsyqeAjr9nC328Ldm9hpVyFxpN70lL4HxMRtQ8EeT/4Ks6caCQaYO7L8AajV9KCd9PPKXJGX2RqxhJ0VhrVJ7sb7W8+8jgOdbvcKKQysd8ZP7NBJR1wJdtuTc+GZ1ar36cgRKgfBNxeoc8SzG7ccc4U9p2BKBzZhd2IHqqX2ytyWub6VYoVOQkGxLGNWm34plwzdknCfcoFcip2+O6xItE5W2W7b5gfLr0Vjr1fnjbJMyKaU0hWqrxwYaw4XXb31DqNfhgQdGa8rmOpmesgthWqH0qBmIz5mkT1LFzgj6fgb7R7sqLeQJuE5QWK04a2I/Y8+FM30MgW6uLNmpnf1i0UsEKo8riBqrhTlotgSpCDCY20e/AhbVQsggh/TqY/Ing+L2Bzo+MG1x+qbPR3KT4+1iiqiQMpioWrtYkCMgnYB4V5Ljz5D1UJ/rE/MwXvMq5XH9c9qIaHKAoTuY+qUq0qvqHK3Bv30WGFThF96OvRLide/9nnDD/z3SPwxAkEfM5wPGTG8ng6FfvB6EjH8s3/yT593sV+NGcjxUKafpv/hY9gSGmMfN+nro68nQV+vgFT84RErq7RRDA49/RL4h7s2aQxU72PgQn5gYPKGb3/uAOVNFS9m/Xn9bAKx8Ux+Tb5YhTEeAbnG3jocXpkSeEu+o1ZoDIZ8ZA0hCb3GUB9aA34gazjwsQCOSYxAofcw9h/8y/Vv/e2vLCgXR6DIx9B1HCfRGsXoGAhrGlnTOJVEcRj6gf+xK1Ha2UXmkrIs/zbtXNHwutHLMcGICfrsXoJodaWYmWH0LiJOg6k74Z6dy5E5E0buiu1hNXstQ075XauCOpfsM7pb5Yfc8rmR6Vd3yKNJSL5tAu564ll2v+oG/pZUTXNK6+s2QkgLRVi/EHnu5sREt4fjrp+wfSFerk2Fhni296IzsaVQjSJTBxG2lqniVCMvVargThVGTR+l2lHPA4WFwmwwgkt+CCZ2xqJmlHf9cUTPWO3L3a43z+0Sn2S/q5WztNKUQ3mq2fm24GkrK64UuPdMtpgBTmv0uK2C0KCGY7LvBw7yVyQVLNiuUoWSMXFnEfYbdSTsnc3g2GHMqKWrI6ae4b6CtbRMuiuCD+J+lmvztPXvV5RDY96UJY66oyZ+TqEudCxydyKWYhrqaefTd9M+lXdttqL94E+LtlXLY0033kLfOaLiqSM1GnopyQifqBiP0tWMYrsdckal7KSP9DVIJ50lT/SgmtW1qsebp5Q8OQ35XQ04dtdKUIhuhgOBusu2ktP5mJs8fcC7Fh2uEwVtOGm/KaaTsrWxYY8p12msSFWEV44hbWQ73SkHxd02/Zg015CCb7O2aShTR6+UI5NmvGehhJQD/7CrJMAca7xPLXVt+zJfxfpBUGROqW3ipG/5k5qpWccTZVZKR8vA+X27vRN7q05QTkWEE3ra3VgwIiB22+mO3yOYnHNWOdgXVXbr8sth7K5wDDC5j9UoKfzFQblypi5RqdYnBJjlQrN5SF1c1DUFkG7BauHeNbOq3NrFPxyUK00aLws6Z32jZx41M4SVIss1joe9mr8rtZ6pnF57nFAoovuYjcyUGmCdUyC3BhCrT7hmRrn3QHyh5+4iPAJ2SxcRyseKFsU+Fyr7JqB2B+1fUNZAX5cP9t96xwf7Gf/r8/56jXr/4d0ihbaqHrODwxuvKvGpVxXoaQqQ5t95fhOwGgBT/CDeS+JHqenX1T9/UvXX6X39jb1lcTrzStAOB3DLvu+HhQM6wCgoXFNBhKwxDMXWdIIia8oPENQnYDJEiPdw9R/+i//yf/qXXxWuUBhFIBxofQoACqguAlr7CQHoSVDUY9kmAePYR+Kq8GgCy7bGDsLvqpBSF8afbzF/UoytTPn3fHc2eIFcyQuW2zt4vrLaLtBD298I824/G6i0jCtUxE7nhuzYw6x5TX3Z9vB+tPfwinN2UXq86qlT92RgR8WKQ1zUmlExcQs28MswmkYbviy0shXNXIntZhIGc8NzGnRLdbHUnWV7v9rTibu4xtUzRpY71mRjcRVfkLzvzwYFRfertqq9zZ4xpXLkFFbl8tNtw/IxhjbostKa0Okw9l4d7cYw1Et6DQ5m3MRNo+a5b2b6kG/GyzHELE9L3VRa1eyAoqd4ExgMMStNyt8mOz1dkwYubeuoNfyRA4+dYRbp4ptW6qcRtkLQ2bgaGnO5wLqahfQ+6BtruyVYceVphTieZsa75gW5nNjudpxYPruejBn32c3F6FW/PztnSc7jTcHQ4eriyInPYbo02eTAn+oCo5DTFdPhItBwrcsVm+7NTt80+sHab/1CRa57upA6Jt5fMm9/iXQD4vPMP8t8jEtNX9FDwFElomv3gyCYnHNSMTXXz4LTWDsrv2wNq2I7sVcXydjmOO5hFaM52jliFp4RdrRnyvnZVjebKyUXG33Ug8q08uVyrrWOClgxtNtDx5tbvTCzOyRt0qD1pFUHPxasbhL5EPpqQw2Jfkkm8lZm3X4vklx9E/vjxKHseM+TXhnGg7dyPKkJck+67sTs4QhY0Osd0Xq5S+EWw75cAOqkFMzLjjBq8Zj2+2LVBRRK6YmPQBl+dpcU0oDycs0qV7hyBqYb1jgGVszT/OFdY2QzEnTkG624lqx2CwlRbQVzEQVRTPDHuYtb6JVb8DBA++TV1v3x59oSqi4gX7EFqLIgjwPnmSdcEcFx2wV9BDAHjgH19hcTgPoaVW/klv8MPyQTDEHP4etFjmP7HAHF9XL6yxnQixojX9v4B6Z+8Lpus7/Gz1V7ix+LKMb2mmaPc5O8iX73GcDkhWaPT49wGNCKLAfVPcJlMr+PHt7hf+0FmJdrDqzo8+X6WGfZ9W36WLb/Mc5jIDSjQ5zGTeT387P+qL1Nng+gnV8P737F5jnu4XR88TzSb0EXxRAM4+QaR6jwdYyMH9LwGqEpGiUh1Pfh92Nk/vBf/d8/85XpMioIKShA/XUUJcEajelgHYQxaAQe07FPBX7kf+xiyfutwuSaGGxoScvNPkWhCbY2/DnaLDfptEHC+H6ENsadwVQbxQ9EgM1YXp1Q83y/NbuOZzOKizwtonwnWh1LblOb+1UdokJj9kg6w+CCbGz0dkTcONuYj8o9mmBXpc5kESvO10ROiXG/N/cLUdqb0qMvfGD3Zzy8ORAds9UNrYV6f2G2yH624AwmYgJXq7ozzyu4podOlZod0Gu78HjpsnAbwgMQKUZNwxi6MDvGxQYSYzBc2UFHDeqDFTCB11a6CnBX5qJiQlBbGCe/giiKCO735Eou7ngM5hNQBhxEF5oxX/EClpdghTOrvdtBZd9NF9IeVrNoXOE5hu37BR67FRCP8hxJidhRebC7L3ElFLfzdR8eg53hJ5GylJosO3p3RoqwXCLowIWrlUnrVT2gOJlbUkpcZF5eGHjsz2iS37K2hwMn89iMabyx1oBR3mt3KAl1dlhlNMlbVXUTq+7MLgIcaedSF6K0Xg6magWivDRcrJ7NzqhYB+LEdoLSjhfjc3HbakdPFyEFo2ixJsVNddit7itSy09snUy+qaqoft628XmoMNJekdYBPl424YlC9hIOU6aJ09ktDyacveyHjKthIOb6wG47uxPM6STWLF0wykaH+BK+TsqOWSQ/FmxaIbcRb467FsVhS64ipFo0BDnq0TYdzJtyZIPjlZrM+4ZCTe1Gkrxr2uZBmA/beN7eE4L/cjEyiGY+XGFAZxWnWf1C0El3ZYlqpUhRpbAmzeQhr35sdcZAHoClW6SYYgMA2DzifnilxTVA5dG17x2A3NWbv8kxMnTmPvTWYyVKrZeaKYO/8P4yKAB6TLGBPjWZ+2vI68Vjox6Ne+yW4JVKraCKKdfqklWq7U4ep5eumT5WtUw/SYzMR0Z0Eq9DWt4spPBXCP6CtRqU/livx7Z58/A+kq+djKhRPoI8neNjweHDPfmi4tI8GYePiX/5DZAktlX0LIKSns03kPmalgGK2oF7JUqC+cpkDpKhMOrbAE6fxKiIxtdIHAVrDKeoNRXH4doPiDj2IzIM4/eXAf7d//d/s7+ylfwYHAEVhiaAhiG6RsMQBiowStYQRYQYDpMJiXzs3Jcs9QVTHTiy14TDSCDQ5Ge1v2kgBiGO9/R4OUFo2bOLp4R+PALL6djwDs5ORRUgtktU29QMRSZYvHvqbx3NNa+GH2OtJkou0FZN23I2fI24Pc7xuh3UecGR6ma4NMS+T1MVwaN2EQ4dR7p1P41ni8E11DplMrGsnOEo9OosnxzE3fUb1WMLTLiCr2SP9PyO6FoJxnbwbhldOKLQDBpGYd4YxeFIXHBi5bTydkdZhL7AbVfQIsHz8wqnVpmjn46byJ/y23USPecuBhvk2JMT5YS8K7rLKlqczYLqdMt1RbNvr6V8PVj1vi4VhT4hY7GhK+Eme6tt3U2idI5CVjzIx3QVNoGayNTG9jZKqG3IdGLTLcLfNCu9BSyqTPttmcnOYqKRv0WgxcVuoTvsqELYaKFcjkpGQJRNuXG1JZyq7VEk2mgWzg6VuhV90cfucbECWsUqdmLpkbCIusnB6Dd6gybD/oh1pg7DI4x6A4lU2xZjBaMi2a1VZMsIsQLChdB2l1JKJMtAWOoOWudmE4S9skLv0eAc3WRCYUvotlWvVOHRtw4b9cRmU5gLHEpyGzPF4L2Hw+JiXe1zmlK+cvQFLYm5aj9nFQaNFkfumVkS7t4sWLiTR0GshYIdX7dm2SfIFrWcrBRpm6RwQyMFeuQKHL7MXiPPmWD33DaAQwgPLsK148oNsfL3qnySy2s533hm4365lfyLUoSzwvGzYqaI+sVOw/yxHYtqppO78He3BoqjUHONk4AxViCgQsrHTmEqUGd/zjLAo1d7nYtUWSDecaMcvtHOQwUBqop7LEsA8BYtAJ9t7iI6gPS5VkUeUWseVxG5BIptURYLUmoL9h5zYA9no8nDbvFYGqggblHiQLViHlBzqvH/s2ULj7Xxr2fL3iwrhF7i+47x+Hy4huXbtYZfj6Px+yBJ9sM2uA7Pepzmj/mxrwdtvyozrLa1jFc6L0qPqbFPwYYFgGsRhq+xAPbXGAqha5+M8DUUUxCOIxGMh+/Phv3d4Z+oX5l7MSBIIkahF6dmtEYDAlrTEIoAzuEJSgQBBGMfuym1uvEsuj05TWkznXO+A8NHyAraBomEE6eTR05gMBMMyN5qSDOaCnblFraykS1LlBFRGg1uHvZNfYX0CIVxXbkRyRRILnrQiQ3brty9SZ41m7xDnKufTkpcB7OrXidvUqCzfeqHSvcJpqBjMZ7SdHdEoaNpIMe4j0KZ7ZQTwSR3NlDzVQ2dmBMz3Qw8aCBOuFoJK12Pw9Zxspog4XDCRSItdwMzyxC9dO4lQRORKKmbGB78yhjmJICs0AuWFJV8PhwmGOgNHD0vtLuvUDRcuSi8zXt9m4w3ol5MAsl80KHHGkcSqU23wkwFql/s02LcwizEowqa33e8e51cwpXIYwAdaxjq8ilgQsksDLRIs1pAM6O5aHGPwtVW3GhtP+EQG+/AsLiAtyS/mQ54dbVvhaDUQcxvFpm7TlM2pyyLdZchvFnXZUVLFh8b4engovyRcdtxnLnW3ErJFPXkLdqLh4GyNAPV7/FxxnDryBQ7JM3bzTlslLsXMAAURQ5piskx98pyI+EW3JYkim6JzY++cRq2AQZUgYInQXbscwnipAqRvFtmdXfClpIbHO/sa7KDN12VI6x2PWr5ojX37FRSZXvO4b2MsbbcLPiEFoeQJrxily4nncn7E73hLhvT3LYlVDILBgY/hlT2kKLWiY1j+EYs2LnerAyRjeMd6KUev4XjPpMVnfHJfmW5VjHUbpfqHBJ+uU2p37gX3bu6MPgHViZUHmctnnjCFFOvH/uyuaZavHa5ubBi64Vb86iKWIj658yGvV4Fwb/MwoG/l/ffbHejAq5LKD0zy4DSnFUznDTOq92Cx9TisT7vtLgLOGY+trQB8LKlCeTBXmbDzBRSFtC/j9lGk0dBH4F+lu6gn760u/GjoPSr70EJf/oeSDG6+M0GLiv05dR3l7R/kv7T6yxQRbT1x695s7Rf2jLmZ3dJSwgMqCgyWJNIgK0xCMPWFISia4rEI4QmqADG3nf8/VH5b2JfmeMviRACVBSuMYSC1mj82CcbjaI1AcEJDPkwhcbQRyLoWLCHS+4NPuZAGitWMIns9Ug2qcNhdjnGk/csvtF1dYvxyO7ALzDlZDeLliVxzxroFTz1sr2phwlIh9mm4YAiLzTObGoEzXM17lfoWUKlvnIOdFntsN7GGSbQT+1W70xWOOkY9FhkbNeNlYemAbOiT2ziMdlh5cZV1cbbo/Uu399WN+Oi0zvwSPh2F0jXMFSbJJYupV/WUuSRp3ElQOXEOkHkrGSKLnXMv/WsidOeNuBEoyv3LOf5xnA2EcEKWXu/W0IlNKhY21O9d5w5Ei9LnIGGkF04i+QObhz5zkE+ccQoeUsJLUntdsZF0PB8KKJ+tT/frStxI4rikocEwhg8PUe3VZgbpIKWnnZ2relQ6IGwk44rj4HzikzapvB6bxRy8zLS7MGTsmA8FDE3Zi5mpYbK+VduH6RQX96Jm8YJLc+kdrxTfN7FlSwLtTIl2m003SN3jqkNE23PJhgBHPU65xvnOCccQwyZrK/YK12YzLXyXH0ygrpK79htc9niuCDjnLPytM1qHqYboQjUVr1R1QEtctUcrXMKnkFzY2hYiNmOX6l3qE1XiSeGcSJtcpXNN9zZ74d0mU8tx4jQ9uBjHQ0dicFXWoS9HfQ+sMq9cZG6fC8YaZmyodWkq9Gr7yM95UJLJAJ2LF0uud8rKKxjh+pPRoh3g7kCD1u1L+/Y/X7wXAVutlKEUZ1CHlENGjq5/HJbgwIMPBZ+pXelKKEvjiuUIM9UJq+wJs+MctcGOgJxF2CyS6V+2WVtdpFz7pkS/ucsC08ikR4fu1PHFfWN1lUe91gQeJpUG6CjeCyJ9x4zfA8n56wWWe7ZPOYVcvVw8LkA324tFyqig88S/vjtCI07l27xCGQBmH04CTmhcvMvH5Tx8x+Dnt98bLWSN48poHd4Q0AfARYgsSIzH/0mv9ZfVxTF28VLvzCAcpv0x9cvfVfQdJF/pfCq9WYGypRMRpUs5b1QizhCfTyKwzWJxUALEXG0puAoXsMwBUU4FIcojr0Hon9v//esr2yvrwgFtKEhag1BPrpGfSR4/ExCsqYxLEloJIRh8mN/JmHo6310Ist0YLLtAbXu1/KuBKEd7pVrVxWMcNEGtRUTXyJzhozRqVWD+djxsqlOpGutqtO0YSDHpQaqo46+iGEZKkTZyV6QfUclrrgc4mYbbJMNd0OhCqlFP3HVquq7jUYMwRi3RLvnFJxJVGU5DNz2GtzIrdRFsk6Penm8oltNkE/i7n7e+Jp0zROuMg5cya30HXPKEPXURuENSTSlx3DlpOCyWu6OK5aZNjvfgo9qTyhee6/qw0HQ7EoftQRWD9COynYHVoic41KGwSVF9VQjoqPm0JgHmTPV+xQaZQRnIUO7Q7Fjh54usFWmmrBZcYKz2lMnaaMxktOJ3KTcbn7RqdDgnmrH1ZTdRXShPWvW+vaCBWEATKseSOIWgaCG7nsumEYuI6pUIx2COtXNvb1FeGygd/d4EDio5X0jUabNQe/acqk390zTB9vFjv1O2ewO43Zh+PwQuZLk0Ca7k4iygREwjL+odE6xJ96mjGNkYf3OKaZwSx06MDy9IEeMv0BqVLeJKNSPGP1rMK86bJ7wO15YO533jkOwwZBISOmJ8K0DcSuGaGycfnGuXpXN8s2d2Ap03MyM7eHk5ZsgTyLNO9pCO9/TSpgsE6rg4J4E/fkEm1HAEEdns4lVrrfiZRB77dISqiAxtXpr+6NXbDJ236UnG2WW7Jgk9Y7YpM4tNdGtwOd15RqoFYbM+XhJUwTI2bcg+tMvBtFjXA/G+mYJAY2CfmAGClFrHRhcoVZNvVJNC4DJA8YWGF+Twb1CgVVTzl2znLwPh1r4kS3Mvh1+oyGk2nrtAfgAuGSP8Aq39nL3sQeLKS1u8eiDba4sevUIr9BEodTMdFFqZXLrE+oV50wxFVQzhYfzrgR6Dwba5/7pzNxfoHPv4wPlf/fdyA0AM/hlDutt5Ib/7jK+lziPPn7swtkGL7b1OQJ29XUURhqPr1eG/+LLCuC4Brb2qwiNf9mkBLQCwPFtxe3X5Af8PmOZGqAeqylbbWsdGFN76wqMUSLCfDhek0GSrLEIDtY+BuPrGIqCGEIRCP7MJiV/R/35//NPvyr8IXGCJzBKrDE6JtYoRcJrn6axNRBgQYAjCAR49JH4i0JlnPJEMqo5djzygLqezwfllO7FqtlvK+wMDGlvQAbCRb3eG/xtu8HdPoqWMwXBW8qxZuLOLLqjHh4/g2b4i3zaZ5qFn22uM1Rk2laZgTZBEEcDG69gc3vUj9AGhW7ohRjPtpKsHCfT4sDCJzIZQRu60/24DxIvFT1LrAfpFPh74mTcvDEmZEERBCP0Durk9oGsollXyywqNoJR2YXsEGrsTx5zSPvg3BobvCroQnNUWjGKMy9lXZU4lbmyzlRPtDSWFIdOLvTI9KfDHoKNnYDqfhlBJ9UyDcRB2iPKSsckd6QiOk7d0G81s8WwGeK4mtj7TBAB9utFYERTkVCt7a4uxm0lj5B52CMMU5jdZHV4yuTwPOAq0IXw7bD4Nz2/Sqas0qaxDfyaFFbZHjJEcq/fJ0Huw2ZVd/hqWU7aBbuaLIxyEymfx9ID7NgN517Sidgcsgo8BLY8OXRQLLXvYx4xoawyXOhpJzTTXbzG3tIHNk/l80ikF/ZyvrPsfPJ3wuCfA/SsoWRd34RFRjoG9NReQ89hFbaonZMYxRFwcmyMUwpbhcgeNetUBOKMbIL9ji6JRpRuJ7pp65rmCr4OzwxWXP0z+HL8AN+s8gN8E4FKDA/LFRF8u7lx5MllzKYe1GZkUr1Iqlq+YyGl3Y43o9t1tWgGYaW7LauEq3BFH1wbGmM5P0OVg2+nbXMU6cb90oHxDzdV+gjAgD6w1SWimVtgypXHDs6IavLA7CtAbwDwLfykIkKh1HqhFkBrfFiH4XHtzc7yDcffUiLqy9ZjXu3Zj98BeqzpEmq3BsjjhFytXdjjHnNdMtBaWa1wD00WlZqo5+qS5UCLPX63D1VtF38Jpn/8bMNfVGD85/r21tj/R967/cyO7ulBLRJlkpnMkFEmzJCB5Jshoz2b2rXL5wMSUXwql13lQ7l8KJugls9nu8p2lcuWAhkgIyREIEhIWzCDBinSXOaWKy5ylf8AiSvUQggkhLhFSIjX9X1rdffqvdfusHpnWqLVn1YdXr+v7ap6n9/zOzy/tyxEZ9GjBGBx6ZY8wgWXngmFctx1049eAGw81S2/MShbsOw56FOSMX7rLRkjbl7n+gV7C/+aLBiG+z4X4/MlPUNQvxK5IqkIjZM1SoTYGoMRYh3Qob9GECqGCBKHsODDlIx/8H/87T//nUWuMLDJ00FIAnwCcIlCMLamEShao0hEBBQdUyiMfCJcuRfNP+xl8aYxXcsbj1vrFcUJ5vn2YCtIY52xi1oT7YrGZKY183pQaA3toURQ7/h9d6OOjnYpo9Q21Z2cb/fWJQzc7aXE1VMSk55HkYHl9r2mJ1TwkEYkq+0ayvW2ien7ajjI2IqEJ9bEh7QMUY7d0Ch1V9QhkjeyeWB01fBqzCWI/UxX18ex9uJjKhzvV8rgIZuz2ltf7Ht9lL1sPHSUwNR7ejTaUcPkSEvE7MA8kOwQYbPlKnA5bmE9DBDOw87e5nTOaUwnhMA0FDU8noRobIfDrWU8V8fAxJvzSnI3Vb+ybsgoTyuG0xi8ECgjMJQzYCbHR4Gi+JiFZEW3bB/c+hNsTWwxr/odcW+pqAnksD7eaW0k9hrgvI42P2j66E7dY6q2fn7st+f7QRgQ3+oxIx6TY0qAnZLhDvX+eDn2vnaWWKgRrJRMt+xhxhP6EiKQ1Nos6ugU4Wl1CM8BbStCDAXDaIHzsvb5ZTUSEiAQXRHBj3PT3GXXtb2En6JNWPNnty9v+pH2N2jACbszIeIcvnH6+5VlCoO7Ji1XshPZ9fwqDyz4EZ4olojga3t/cOFKo9DNmYbB8CoRhmsRb050y7h3JQ02M4aXTWKQpiW10a6YJFmN5LtQotXmGlKEVR5lj6TdLXLTDdalHa2h93teNicwayQL9m267SzpmvLR/lq6berMbjjoJHGPUdoQpfg8Md/KbWjhgKnByhziasE8fjZbk2tlZmCvYHCVf5bjQq8qzcLkFi54zExLua7Ku9PPgatrWNOFjwiz8v3OFawUkwVwxGaqaQN4sh4an1VuDWDHDDGVt/Dlul3AWAFDw5YcSrWIcnc+4ioi4UphF68RrSWlQwUwb+EKL8Hfea7gR5nW73+9JBl9Eq14AQUAUe3w2kIoemmTZ4pF9Fpc/AKW6ofvhEf9xuJo7GK/BzvnLxCYPiaU9EuWulc1R32Fr183DYE5WYbwUyJeSYzgSz9UPw7oNUYSMYAOFFtDaEAlPk5FGEZ/6Gj8R//sn31nES+fQjEKTfx1HAHUREMyBOs/oTOmwxANcQL71IhXy6iIGsIOglxs577aEZVXrKoThXVolg75kRjuaE/emVN8zSdlfz0wJ8PFD4ar42iXan0tTzxH5eD3RtNXqrXOexNdHdyCvwOqIR6yvXEMZZTskyJfKZ4pSbM0nh+bTmnPcTWfs3RHbdnicWOm/Xxp6iNkgA/HB6zvMJeM17HUqrzz890ubqwbiefOmz1vEOnH6RHV+UaB0ZY/lOnlwoVcMcDQMXTFMtayx6P2s31wvXcFggXSUSpS64xCgTggQ8Qays4tVYfeRDadeHiGeyTD9tm9QvggN9Q7hKyuSUfSdtw5A73S/K1dr9oI64hOaycuuneMXkn08YgPTOve+orhJ3pAVhvDptNMbM4nTtNV1Tpnly3CdNV1E3BbR7xdRZfPWctrzrR6lcU5POiHkeTz7ZE/J7uBGk1FUEKB5/gO0LvJ99IhPEesd+gcJSxykssM9lpaj9tJc3uvrNM74CTsg+gn98HWdko50t1DMCg4XjoLP7akZeBBCmyNIKnpRKD3QzhO3aaBt40em6Ts3u8+cetlX2LOZA6FWtzIW9HOsdXd19B9aFxCFD9mDluEEKBpNE0VRs0kJk/73i6872QDhrxbwRoID5+3N64taJTe7I4Ph4VL9UwfStmpbioCVTq8cevaPg+de6bdKmJWJi1f7LiZ+MKm9HhsxPA6+IIe3lJeT+ho9sSkUO8ne3PzLlSrMiTz7ZjWW9LFkkyxwMnPhK5CNdnMqwXMdeTKLUrIM4+wZhq5VwDmAbZl1ywxRQTzfTyb0IoQenust99vJY35GeUCv+2o0kRrdJ2lxBowyzfWpfF2rdR2pfLRogySq+JxqWmb3Dl8uIUC7um2Xl7zeC8HbGuJDFaApX63iRYfha2frwT526958A6Y+Msa5C+VHT8Vt5bMi9e5f/HhsW9C1l92pEUH710g7Jmk8fWX3iCLDGg/pkJinQBcXWNR4K9pgobWKBZjIRJiMCA8H0DW8H+jzt/5zmJjWAJwCkbXcUjAgGORwZqKA3QNB2iA4BhKx+Sn9sG55CeV09pgvGDs4d4HdyYQGObObyDGPlZcgAxsnVwQtiSquhoeRcfbpjEWW5FnIMs7FSIp3KCg4qaVNB/3wKirRGq/C7ljTR8wdhStKwpfdTwf6+QmbVlX5s5wZqD5wwxOKHVeUf557+lnROfxEC1dbO5WFARtoAZ3zi7s53WVZ5plQaWkdHTM9rRTzzDfh1skOF0th0seVq2cCUyBd5fjhfMFDdMLy6qPCs27Y8Y5F0ULc8FujEt+28eR0EPAlh0uHlFvPDmefYRocSVrEW8cQx1wG9Q2feVcBwbGM/UcoufKDusET4OHWsXo2DmQvxmzEkrFLtx3eK454xZbjeQ8AE7D3Qm96P00i4HZK54zmmISnk/CLPLk+yIsIbLaJtYbCDojc49cwsbZJeJ+dXywjzmmyFOqhhGwYRm4gUqx2B2Zo6XsHMxbrZzdLu3l1VgtUtEVsm0hmdBgYcXjmCJjTDKW4wrbzI04uxSr3gx8G9xKwpH9JLFmIqG1E9ZAOrlxd6t4H5XFRNEu2fsEkayMCSvJg6RQtx3KGuNODgDNQfl4nihbhqYGbx4zUaOqbdGm4BSPQqjCeI9v8QF3julNa1H+0V/ZqEfCo34MfNEXoGyoSOfWmxe3SrE5y4Myg4hBU1edrpWCUO+GHkuu/pXb7kh5n92aZt/EyO5mZfmmzaDQ5TL8SFvQ0RYTbSPEPgZ9uwT4N+1+YVT49COQJQFmpaAK2MJdMysAu4Jcx5pdU8IU3s7cZytto1Dq46R+PDZ2C1Dj8qV+//dcPcNRUK+WEK84PlTRqxVxYV6LRj9gp8i2cF+1/Osl+d0FDBJAG646avV0GM5HwNCECUAW4hbpqJrgOYAv7c8gAf5XPq3K663ZKxOGbfeq3P9Uun3pbnXb9YvcMXHK4mbRQ14KwrK87uMqWSqYw85PntL9T9VLv3oVvfzxy86/x082+OwB8E0xXbBAutSU+SHA3P6zv7WMbF/8l1uTX29g4batX7I8WryMQbx0fwOn88xMWfr93J5dAV527a2PP1FaeclMWS7tB8/ke4Ck/i/Gjfmrp52gPjPvmYPEvAdUOoBinArpNQzj9GuyCU2SS3/yKMSiJKRhyv9Q1+MPp//xOwNUIkhgDFzQmsZoZI3iaLgOFlUqlPJpIo4pCvnk3rAnJpXNwowu8ObQbMhDapYUIdG5L7rJ8eYM1RBGfeSpwk6She1VCM4lMCe2sasG3ohd7yPSn1I6iTLAJ/b9eMJ44XIFAGBuYE6PYEjyzw5mVaHVZzmd6BqqD6ejHBp7fi4fPnKBpWyX3/t6f242x/Gg4mUXOpTVYO509n11otJ9yl43ungJyqHeFWLEakI731uSmOu0C6t9wvIUA62gsU30wmR4mdVxaegiJyk8eCRMbI+UmV/uoGl7r/OHEdEeFTxSBh1jLB7xrFdEZ75XcbFJ7kZTdREeDelQBZiCagydqiZDVi1rzxc9Pp5XzuMKiZgTU7qc731MBvd8BCS66Yzt3NNMfuKCU1YnDYIWe+TONiPLd+XDkqrblvT3RsOSW+cM93etNRXH4pJUxUhdO7o4EtF+fj/7RtrOe/pchYwkMQLs7s2S1K5XmsmuhzCiOqwID10yFbQqd4gXSy66kfQZn7z7hXZP51rUrasYZ4yhqrzdh/B1fjRxtaqqHcMs4cKzhkrtiLb7weesCK2ZB00cykgMN2WqzTvZtdCjlso3dltySIuHWDrDnA2pYUH6xUrb3WH4AineTK7OAiCWDGXiykFWZjPYUA5h1q5586/M6nyLEcmMe/PBd6lKQme91SkyGBMWT8pHZm9Psu3jGb2Ru3gzSsTBnxqY5YmoVehCkE6H/XFXkU3J0LO0V639dfWVcue/G09fB1OteJY3jyrPYNpS8syX/VcAUAZARki1tJTp5osckztvy6UhjMZXmVewlca7iAKAwzNLxHW2OeBzXwFhPAscK9dyWf5K45vdAqoABPuf6a4sLq/A+XXQJMC5v7oniwv55pIk/j9F0EwFUkwLUYuo9Ey1BiCHu7NdqzxbAKNidGcFB7wWV+dtpohq5ppRrSAC7vHPhudL+XLumgvALvJSdiU1MP0x9+Nf+S4T5j+WH/9bb+VdwuPywrZtP7zl2L+jgku1c/+yNC0HTM9fWp8DtMkACIGt/jU/pJ6GrK3adNnnAQbGz72uf0otKnnT9k/JquS9ZNVr77iXvgITL2j1V8G7+7yq+mVhBEF+RBPQcgX+AlrMWeBfNMv8FDmPxQ/Kxn4/1K96ixw4u3/BftB/hRWYk/mmwcgZwsn8XNDf0cvf/uab7zvCvgfHAA3R4FXqalGZpqFkTYcovoZpH4ZgnwipmPwAHP/e//Zv/A/fmYM0xEOIonx0TUcQBdgmRq8pKCYBQlIwFMNUQCafWm59lMrHwbQmwp5uY7lRpL3DlYU98eK5pcz2tCKQQ66cRu/ACNvmvKdtyNsKuoxAO/ZqbKyMJXDEyhBEmwIjPwcuVSiFfVeC6VLoeT7H+ulErvJGgkfeA8wQPgSBb/iQEvOmWvJjMWD7Uik68JUyAEdRkfgCnVzLy6Axak89ElwjhOu8jXt+rMYDYIHHkYonneHmboc1wcgfhUM8Y0612Yy34Eo4aTCy5Ca90DOc4xxbXT3nLgTtOa/GYXJKDcvOpjscBpHZ+KFz3Z7pM3c4mV1SbzQ6hc+3DXUgHsOgX86VeYUTPzSb+MYZ2vFh3a2hndHt8FAkxS3FC1lvAdO+q1m02ocrJFaL1ZgwIhc0UFYgUX96ZP291yFKGLRLela1oMLrG0Q5+4IT0rPoZlTpXCs5t1wW18F3oWwKK5jMe36PEF1kLZLaQpCcQVAon65wvTJ1GnNZYbtRc9wZeu6IbXWdu68E2HyQ9RDo9V0uBWIbNBhg3NCF6y+H3cU+68VxZ1DBTnIaNIU24plu9yJhQeRqMxxsKbGUMNw1HWZLUSL540l9IPU1CvhGwbYrM92jDgeR9xjw+vi4hc4cf7kEqlRVh+sRYxx69rMbChMiNkMdZfbXNDkfs5W10lwpq42MqK9yekFpYagaYqWdrmJp4+VJGL3bsd4Isot0iG351+wscGeJtslJvyWi46ycHkJcMSDjAlin31KjcQJAh6uFi6q8gqn5z47tefwRdZFF/yOdl7QVt3ZR15Em9xn38kq3kOBFcvfnZGLytqWKJmBh328HqfJQZnA/RGHSTLXw6icwQsA4yFXAyj1naYxuVOpsgTFqtpSsq69ZmAUAVEQpFgEwBQIGxRLnA8ZElGvmt5ca/kQNkKWT6nPv7J+9UQdgucRPegi42LMnK8BA/SmQ+Oyb8myD86R7ANCYJ79bGB/rp5/I1RZQ28VpXLfNLzrr5Nd3AI0UTXXfh+3+3Ge/MubNUhXxeZBHv3n8tz97j1NEgqNIgsFrCF9KqPEkXvskjq8BaiU0FMVLd7cPSZzxn/9f31nFAB4DoojR/hoi4GCNBuGiJRxT6xhPQpRA8BjCP7WvWyPwWEKBnUqetr6IZ4yD2dp43KS+zJjHWdghD+QCjbqQoyXkUfuyPBSPXNZM5N65j74ezVXa9+ecxb2cjn0AQ/KJwFT3XLYkvt8XPjEBlGn1kh0ILW6o1IBXdOPfbfDtbq4zc1JrYxefrzQqiMi8Kerb/Tj0FuBMk4Y+pFw7zQ+HSm47wYxRMnb3lhoQGTZjVxbCEpO7KG1s4+3J4Uycscr+lodmiT9W6GMyZutETgjG5ih/jve7cswMykN3zI3pGMRrzTijyLq6MzRDWUif+KS1G6ZcO+eKoLfu8SrIl+s5MwVpYPXd0O42A0rXFyN2L8VwndC5EhUeVrsOrQov40dcZEkcujfM+WZe1I3el0fUGsxsR7NNPpPO7bg1uRW+i5HS3Eyb7WYTctJMn247/3rjbEm5kPqx23f+bnxoCCZIe+n44PMIxWXHvE/jIXrE2oHjLoy33Q250mQS2Es4KTHvsW0InFqGbYQDFuOeFVGDr0eOepiBG86SpIvKOCGnOzzWzckZB/bkHtnH1lFKPQxKw1FoHt9sTBHiLhbVCmzMePfc6Xq9fSgxHtrnC9+rZqAcBClJgvs+L5DEm66bk+rb0FmFu0eEVVDUXxlgGajpURvT42Un6oepNrGNgqDQKjHu6AGqoEK7JUdPPR710WV35JkIZOJUSIbLCzuFfZx0l7PRgxnbBANMQkGoE+X6OOdzMX4rnLLwRdpDAYRG4wVI+ZmyIBL8xDJn6V6qTItX1HOsEZC/hzovOmsK2I8ZxEW8Svs4Tlk+IIlBbUzu6fucg0Kh6lxOahEC0udCrrNoUAkAp1JE5ZcOp3K+9LlTCwFTZgtRgA3pmlXt1UdIQexMQeTS4wFeLS0EZhdW5uPsmu53K4m/cKd3AvZvIAX9nK5fX8lIedOv+jL3f8noP2V+Vz5HmnEMFoxu3eLS/Kd/GmzzPlsebsHOnd/9qv9ECAPcMTL8ue3WPVjz8rryi9m2YFU1DsvKD38Bgosfo2l/femkoz/76ew/NzXN3H2uCtz+wHDCKxS+GIynGZ9/bNi7zt40hfgQja0xzKfXWIQi6yCK4TWVRARExAkNwx9Wzv29f9D/R99ddJCmIzhB0DUeg1VRKqDWdLAIdUVRgGEBFfqfnIsp9LsU5R4oi+/Rw1nWXWXgEAqWbaNNhGuRSjfjgY6H9HbdoI9eEXdKo96Hmcf3on+6HlwtRK+yWDlwgxGCc9/ZBthrOPUg7B+2csaStlrloeUhPa/c4UfbJgnF8ozv+INpFbGde+79uDcCNtYe2Y26y3OeHqMtoQXcifPLjie0qEiu5VE5yyd0paSmUs6aaz122T2VTTE6CkwMNRu2lvAtYIVJ3o8ctIICm1ESm1BZyIKMbV1T1yCOPXhG1Drm8DY4H2B0tWl8xiN0eDq2J9nX0yHWA+OkH9xWpaQibGUqtJN+OFwbmF+Vs0ezal7WVD55/qJFtYeNYbXoRixKHuWhzUJ6ujchzrSh70Bot3Lbg1GFfuB48I0ZTnpFd83K6mD7BjujzNrG2Q5vbFp3YZU/1OyMl4RPkR2634dsxG9PDX5CCjkcHdv1EFVlm+NkMKra29FDISC7TkWHqSYb11kqLoz0nm5063QpmnF3pk4eJEmlG98kzd1J7BB7xbWfsaSG8ya8ll2LtD3RbpNtoaFyYqwuzja6B/jKitjRJg8auy82jHWQAsYeuk5I5JbbCr2sU4lsM1WVuCcGodOE3V02FDM7WLtTYg25PBivWeXZEd4ie//hc/yqOghOS+wP4daSSD52esW8IZArcY2oVDOtYgocwPEO2WfbQZ8gwdz0OR/o7FG4aum0krH8xh1ZfEqFb1k6APjaCPZzsMcvCiA/O6Fl0ZIHnAx1TWtR/oDc2c7A84fHh7gnLqXLzMMTvernJLS842vz95uvqZmKLNhWgmtdKgYXGawj+DUs5QPK5C6tcJBF/qqqvEKYXcSFlvY4S1WdO4eQZjLgnobw0vf12TfWTB/e6V+Ypv76K5qN/uLGDMtFzBe8j3zxx3/w8g48X54uyu4Ze4vvMaBodRu8LAKOYEFw6MLwKr8fFtzElx6kS6PuPg7bJvokNcdfXTAw9sF++6J1wS+Gv/2yISw91j7XDPZLeIIpBIIieO0nSw9sNEDWPoHHayQJCZIKaTJG8A8r28Y9/J2pN9IRSuOkn6xJiqYBPCXkmsIpQBgxIkGQReEE+tTC7l0WroDhfYC6A3ukY4gONqv8cdlJ9baR4qLDo1t1JfVdoRbXbjX6kKons+x1m4cYq3YS14JZDwdms4PqoLiLmJiO5xhipHTpW+3X3qXgmURbobtgK3E4ytGSj15igsjtoc0c6arkpjbqnbJSiyaGHtGRyRS+aLmiEnGThMZ4OLO7laptGXvjxxw7h6brqDC0kgnXPsBejEPHS3rG/J0iEDD/KDeZZ0xqDovXBhvjuSeQ4/XaaJ58UcZQPaBq6GIGHh9qjKy6TjpfsB0480K5GJ6HEuYWKS91jdwBt9nbkqdI1P0+nCzcn9yID28XjB1ExtedzT2Mt9G1Ti9N3Md8Ui8bV+WcVyfc6LcAfF21PKWS/NhPkdC3qL6zTJu3XGo7MCsxgZWhxRrmimqbJvYjTZCJ8m46KX9BCYw56oc7d7izLHaY67uKzOHtFttbhfWlzaohSvhRDOz1cGvS6YEa18arbE0IwOd9r1qKnapSqzA39SR+q88Gp6NpsyJC5SgdZr1TKbFCQyQbL57Sm1W/bZK56o5nVbzu7i1vpTvubDeJdob4ne6OXmObaerrmX/BA+vkpibZPDB5qoO5WO18avPYeUTnneIC92Q4vWUbLj6H+657KNzR3O7IxnBFajVpojS5XVRLafQ47KwzidLFla665mLG+MOO4CP9oE4mcdPxsONxq0ah8wF78PQqPBinM7PZfKX99v/8sc5lAFYARVs6mAnTz275Io2KuHTpMvJFhVDlGcg1lz97yTfMlJmtlvY47iK1+3F46gLxcY8dsGV/r1tv05XqAGOw8GrFPM4Kv7RuAc8XCWZTmZfOZR4PrhvQMkBzZ5UHY5BFvErBn8okJqCts5EDiMuWdtyaaFcKoLlvkPwuMaWKxG3pno3sG+cOPoPAoUvPeUu8adQemHD5+8SWJ8R9O6j7lz8F6n5jUSpZHJAvwJiNvhRq/Gq9N4DAKMqXfBG/Wo7D3vG/Lo1fxiWp5XcWHASot/C8uL4ME0C+27PbdtAOQ/Va4L10e+VeD7pdlvTPpUz7VSRlKSmPzbdD8uazfxM89V/Y57FLh7Xf3wIg+OHrdb1mwwxxvQCs33z2l57Syfe8Wtb4m+/XWC4lxn8EQdDy9/I2+Sdirn6r+vgp7f9dY+6f++zX3m7Z56839rPD/u+8AbFuHU7CU+X/SxllisRjPIHXJAZhCzuD1lSM+msiiAkIChM0Sj4sfPgP/9d/9F99ZzV7CFgGQZaOb9TCE+MEXQd+CK1jKiJCJKSxME4+EYhtyyl2AerC537X+oTWh1KWXOerHHVlD4dqdYhoX5JZsYO4YXzkN9SSskm8FWPHhwx8HNSbgV5xjjFvBQWN0Wkfbz3o9ngEbjeHaWQqDXK9n2cH3+gwZBxYTXJ6+tjQl9HrE36wxtPKofYzLAXi3jeTA0lep4aRVO4KUw3lutuolLS6MCMYjjlMd64+cuXugYFds+wMRSzKwxVhps5DvSpNvs/Qx8A1owTh24ChbvGq7SiMkB8ivY+G0TiFLqRB8Y1NwjNNZ3uiofjdJb0xXBt7u+7KyY9Khc1bwKjilEG3zZTxE5cMJz7FpD3yENSLLgkHSAs9xa909WjXjNHgIeSgUnq9iyUzVJsoidUEKbzzlec7m7zNh0uyRx2Fw9hNc4H9flXxaOxgDm1xhT1Smnu0ooDaN03h2AF8wxXrqgCOaV5dq6gU+Sic8IzZtfuhRxni0tIOtLKbHpbTdmeqrApt3YIQ3RG1crdntdWjRbf2XmTSTITOlJ60ygEho5ZLDjKeRy3SRR3ct+qFI1aCQ3PITsv4crq3XHZw9fyRbsq2uO22BIZtmN1KzjLNG4tWs/ErhXc7Y1fajOkBoEi5SfYrUjv1WAqdrah3BSHE8hTqVWZq2lUTsxE5RcGOueZiIyPy/oLZeoEFjTj05zBDK09a6aLGNaroqfv77uCm3eAUODWZu748NpvbVdvPXk8SbUJR30ph5V0WqYQsaisf4Ym5UkSFUlSL5FWuOhbgQku93rZadPBV3i6VWkLUWYC+9IP+VCCWDGuwvucgXHumBHhfOamOCsDXWErEJ3WugBGiYJ6o1gBwJ++pOFPlS+aoC3i2UhiZayqwt/Bo05oX4HaLEvMWzmhK058FCP/V79zv+lM0lT97Ek2urS/PLukAKADRbNKl4qJ9if2ueU24+ex337oJVICTVgvYLjxUB6+0nf+DHuDqY8HKH7xi5bspwrdpX40ABALvbp4Pnk1Swf9ue3vp4jDO7/HrOb588cf/+CvdUZ8v/MHyAtjfP/vXwQPkq6e4lM+/W2NZnnpt86O2Q/w7L2/T1zfAlTP/Hn8d5b+e+PrZcmpt95b3usRFAz992iHv5n81Kd6vvWQB/eY3O8YDGGp+59U0+mkmwDvc/ysL7n/13v0U6P/WxPrXLq8zrV8thc/+wuuqbwUjOqPymsGcPme183uoR6EIxYkIWROwHwGmG5DrIMCpNYLQEO1HCIriH5bn/+F/83d/4zvj3D6OEiQJlvapOF6jAZQA9k9hawSjyQSGcJKOPpVzKzRXs042pWgwZrWRd9w1QOvDgbS3KtXpWBGo0mosx7Z2E6GJc33l8oOtVnB+7NTrXCXG9TiioaXTx/vMKzMTt1I6a7jdxQhTKX06TYfszsxM02E614u3KjtAFJaccVGUb2dXvVycmguCLD/5G8JjN+yK4q2ctlrI8voNwWkFLmpu/8DMjXCH0bCPcrQFkA+RlexbYT6jeNr6u1UBk5otnFN4v1WVC1+mXJLWQhn1+NHCg+m84pOkODcbchcgaGoaTZ06cyMyp9kI0/y+GsU0VviRi493XY1Mi7wdDlwNjcQ+92w/1tCKY+6wjx+yK5w2/IQQEdPHjZptH6tePTEW6zOJ0+BxYE31vplFDY2w05nEqYG1nUeP8ecC26EGmtJy46ZFseqhVNsoBXueO9iznAMN3eK9m/aHW2LVUx5q2j01KrZtc8RGNbtOYSaCWKe46VVWFeCb4yLzLsox3vQO2hlpe/UOTrGmPNiJjqvVrkbc0DoEcn3Ftd1OpbzT1YyRyDhbO3PbFrZQbq+FpDbHUkzxQL+0cgNdj87Z2hs2fW2uF3EFD7OsnXR/9Ziz63CVKGunxNE4ysXV3gWeSxy9hDLxyQ4DzKovtegTzNw0pRPeVtScH9Fu/zg8atFVN2x+IyfutKcGWburm2tyEgSAnpkMbe/3E+AI8QjzQk0diGQySkLLOPYiThZie/dLfK0c3fq23cJnBlJ4wKkL6WNtVkuVT2F16ZbtKLNbKADaSth15Not2Gqpc3ym88xs+fNCowECX14h7nvsEkbsAsA9DK4RWVy/ipliLmLXgDuXnlmVGoD+JfypmYCLFynkLiX7Swd1M8uVuao8R5k0R8AVZ7v4IVB3dhchtm8dGv3lT3MJr770BwNYRL8aA11Ser4EA4Atz/TY/uKPzQv8hsIZAJ+4W4Dvd17h9J/+aWs+6yS7EuBWFy/+5dduqZ+StQpwLpKaJO4Wrv7WfJUDs/9ifMS/IalbwVCZw+dvvVc5zRAAqARt338+5E++/S99RRfNR8gA89dIQgEkC3B07ccossZpEiFiPwF8EvkQyf5biP2Tn4Zk5s9Fsp/yDfj1T/sG/PD1gzMX0yRo2/JHL3kd3N7Nki4pzC+XJYnrR89J3t3VF//V+Ina5dP/7X/6p/Tzg3gBHxMwRZ5lOLrf98CserOJSGexZZ6HAPvvrZL2R69PwNEr7MfkUjT7tOr8erkJP37z2DwbabQMOKE+fmna5XvXPoP02dIl8akdETzzzpbTWIaGi8jDUjVUVYvKUVAtlUdgMmC9xdw7Q6mPqzgcXt5FwJ9NEj/eyOPnmFTL2wBSniEV/a3zIrgNn2JYPUX5WE3bf65tP9cNTTTAkpKmApPr7XOIjA9MrncxDSRJyKV5PB6gi3Q54a8pKIzWVITACY5hOEQkH6aeyf/+f/K11LPPPsG+IhEsCQkYWaMUgq5RCANLxxG9DjE/RPCIxGP0U9X6dIOKqZV7PTDOPbfQa3gjLOZwTbGsax1ve1SmeuNasXAu/A0LzaFKKadK2uTVJTiRfA5v+FvF0apq7fBDzN1bBVEcnsKufTgdDoRFSsjt0GhJqKA69BisS6Acm23Vq5hWxwgkpolcEJsgpBKkOqnjoY7g09apezgZh5N0N8gc2l1WDnabG2Qz0BD72ArtKrzyzK73gSmIX+yKoqAbeec8Xb2OUFym8uig6mSyd1lBc1tGKxXFUtnIyRAN+hvjtDJChRTHzchgXB++l5IOe7hVlg9sTbb3eOfcjttwPqLCeEvR20aFutPBiLM9PPLbwQKXJ5/ucyyQxOzqrcetkJ4HkBM3e7VNqfAAZwFp7XciMdca6yrTdc+cSlGRjvoArTqXAceUYjTAIvKo8FJ3lZnVIYs8udFBIU8mNjcdYkIxleqEvH2ID8lQzy0bEFXCP6iyGqsy11Nsr/e4pBKFQxnddIQh1kNM9OYVsGFREUZlHFVv5mn/uBA3+HS40HJ/hGNHSVePlueCzNvNoX0hK28jHpDRykJXoxy1nLSOMwLCtUTixMtX0xuUJD2kUCen+nTWtIKgEhN3CMy1WiLkFFwJoZu9iS/YHoZI3t+d5GDqVNjz0RgYXg8xwZlFFP1guypHB+QgCpRRa/2N3nbBRobHBL8QjmFaMjAA/dnYH/zjRTMd8KXXKvw4e4+tPaPovY8j5ds27pjLh2oysGqm80fkj3J3EWcVXzUR1FqBNFFAga2FA9sqAzZF6c7S7BXgZD9qX0mY66iZWqSjW0iLXNJDmY/j99rWmgVUMaNMMRdFPiNXzHLWeC/TeAlTRaNwkUUl3VuU+rIllW8Jx6u8hbpFOHniorHBjB6fTioi1yriZeA+Ahvt+N2mof1spP2bz7qjpSiofycnAba6d42C2+QJdiGg0mDre21zX7fBe0mJt7bBrxloC9j9q69Fr6cLwJzpfSLaJ+ah/Rp4iQOnMP1ZyE386mmn6Z/rlsHtmNNbltmvcAz4an4gN4ESAQwRSLAmCXKJk0fomgpwaCmWTQIiQeGECj5At9vf53ffWUIZFEFogNPA5gsCeOl6j6xpLMbXvg9RUUD6CJqEn4hufKDYkQm3TTUUGSxrwk03k+MdGrjBlOeOsahTcpbN+TGj8IEt4cu2v+hz4vbn0NOtPcfevBPrXUVLKutug13heQ9nK2lVW4i0f+TZTmlpp68PEqYpx3ImJzhQ20NnmPtOb8MDaV/sxGfxmMLSPJS2uz6Ry1vBPS47ugjKCY0fq65rTNtTc0GWUOvKHcpInVMMok2/mdts4PqCL7ur2IdQgwA2d0yvU+gd2jo1BAFuFXnV2eRw2QiDsGn1nGaV4eHBJHE79bPNKZBk1zdvG9b6Pe41dYQwoSoQ62br9XjDdMklpcHNpZ1WPVAZR0g4LkoaT2BBGC9Rn/ekyE2nkAVYqZFJSg08iW9JRhHrShlS+X72q6RS8qSY3DvB4ne9glZ8H2mndiqJjiu5fKBWPt9l7VVrDlITaXt84/MGoLFzg/qVnymWNMfytqArojEoMhTZQrcVfO+hpgNRpY9sxdSzm/u+uGxIe8jnTWXsldzcqLuNvEIpFc8Ot2KeAgE53G8mBYyHo117AyTW4/2AW6v7YVNdo23FO0HsZWmzu0quGtdq1bhY1BZ01lMtFA1mtl/1XHI56qvUqWPDMvLD7npSd/7KL4oBRYoQwKgjUJPN9Y/pyMK7jWEpcfHYxJVoc2R2OxGPYxOjIQuM+AxpV4pLxaeudaVY5RvxbkyrQOcnRznIWMht5kuVrG6NBweGeakh91tF7MOHwgujtuy+S/ulnxkokGDN8WrNtGB3Vh6LQpKydL13lgrbFFP5EtL4clZna/453gPVcwBSzEf8e41oyBHzaqPQ+HBUiqUAyJ3URW5+6Z+IuJNnMriKCAC9LExBJGAZsKXGZ5lauw/XTMEYI1PFRXpCgTxRejyrchH3TVrjXTDABvfPyCJR+PDcnzIUAWJU74IdIfIA1rH0PpjwFAf8liKBv/lt0PGvfyNYQC0o9Psr6oevYe4PkZP8vdf3id/74fPgrwUP8Nf3YPyHTx0mPk7ipo+/+ebLT634/eqIJbhgdrf45WtzED9+GwIe/PBZ3/su7/srDVCQd4OQH78t9c0mKTj0OgSHXq9C73IA1827E3k7j9fTeDt623bD7d0I5N0Sb6cK3vTTb4x6GwTGLN6Yrd/VHxmyX6q0/h3w2hc/+Ql49O++PSW++O/+y688jb/4oz/9ytPgiz/6h195in/xx//x8vT9ZNEzVvL+/fAZS3n/NPnij/+DrzylvvjJn3zlKfJ2Ip/9jbcXsK+fGfrFT55Hg2/R4ihglhrqVx8EYPOZ3zWAbz+tqqe34p09taj6I4tfQYzrfgAWR/+jl+UbtLgOXgC6TuDQKllG/95TlGTxMHS1X73NAsyxxbnwNn0cfYoX69ef+Y3Aqnp6CJbpv2vz6pc/+/MpuMy/+NlfMCzW/Rz67Jd0wdgKi7bkX5AZXvjaK39RZk5LKuRXX/slRmE/eOkvgUcSr5lfn03TmcPXXvnlE6PrO8kQPhinuuevT8dJpiGpXx/2SyaYz/v6fIwimDv39PV1/zJztBiF+WCCz95MRV1zvqFMRiMxmQRQuA4DNFpjEYKtg4Ag1gSdEKGf+GSAfRho+oP//b/4r//+d2UqxnQMwRgarAOcJJe2BcBKRMJgHSXghGKCgCOf/ERTMdV2qb5DZVRlNLpr2cLa7nUhza6PiLPucaPzejn2j3AkuYy9b3J4skPZtrpKjLZ2bDyQKCaB3ZzgFoy2Bd6Kaof7tHdqiy2VbvbhlCo7c7Kve+9xMe9UtW2n05xfUfNRIdxmvyI2jmnGPNlWOUQZzt0B3Hx6VAzGTZcTVLGV61nCdru6X3bbySh8nHuQ23OuaOopO0S+JJ0I6tAi+Lk6Y5ZApY9tqXs5a8Cr1Z7qpSPvU2XSpVe13wxOim+9HLvfasi8W32+Eg7TKA8ylZYlXFhpcxLdWrzZfQBMiJTg7w0XRPURuoo3IxW2VBjwvSXpYDWL5upofAz7UzjqpHS0eymBR67uWoVFjil2GXm3PgnFpmbTuN0qkek5wmq39Tc25K+sObcZX7H9jXouzWYTHuZaB8vfd0V/QA1p1agZ+lBYkjzytbp9pI0qRwSBWlWIoF6+aRoU2HzmVCIPvhsbvRFwZiVsnNJP8F7rYFOI4+PJxvTYrLeNofFtnJnwfRJhF7HsVTEkASPdUSRIV3s0VIV5fNCxSVbNXZ0sB+Wp++7as1kuGpJLnPB8dSWnIshGLvUri2tIET6IikqdBHMg7w3FOmYoq11vaVvqXFWPIcwHCV2B23DbSTgT8btzW7DQJu5ONNcBxgknq66s9/zuoWwy11EP1h0hMbPuEFjrggPTPaLLGT+Z0mocwO8PsFOwkyXfLrkzfKjPdmhLwqI0fcQRkim1BHtFVimI8vB4CfLqRZmsKsGRuWduM3UW5qUuwf14cqfmntlLAEV37/udV1J6i2gKf0SBWTg/A0umO2pmiaqFhIPrn1zTrjzertzl2mtwDwpwX14TP8H9KTF1dlF1ljNvqe1wlEkpXPzPIq/kVz9ZmPNvvYtbAXwnnp6Reok28a/C0f1LWPl9v3gzyPgBNtF8sfp+/Bbveg1T8UuIaknyeAJ9cqsWpbKqAuZB3oTVbQHe33sduURGEv/egnOJX36X9TswXfe7wNTwhxfw3psEaAu26+SZuvEy+M+4RJbXb5ExHJgBZ/DPi5Enw9rs/KZP4s4PqiXnpDx/skro0ir8FPpd8oP+Rezyus1/UbGxXztxjLH9HGwrigbA/j3Mhr6/KKIQaxxGwjVG0jGA2chf435ChxCGoEREfNil9d/77A//p+8KZlGSpmEqALieUPEaRfBw7dOkvybCKEAgOCQJ/FNL/LbXvBs2ky3sLGaAD5ivNBpPT72OMCKcMhmkCPZOOG39gNf2c4GYhRfFZ3tbULuxHHEmuYPfVb0ryuuRVYr+gc+nFU/ZJXm9+G7YZYwXxrO40u7KbUfJPgS7ZRYPqZBa+KHdGgZ3Z7kEH4iQtkWMrE3yrgs7YmM1LEI7Ulnc8zjUS2ib7jGCPcpJ0+kKvVIO/G6ExaCAZb8eXEaDDo5ZG7mJnfl5p8nxCid8FYKPU3rZujRGqpirK6Xfrxo9aIZz7QxXm7DuRN1tK5FFdnN341qBZLKZca+uxKQ3Ki+V05Ha3xzSP2Xn2LDjvZzvT0o7U5HsOsqGMxLLFZ1VY9tmRYU6d4DQ4CahZS4gMH4Mzu6mv2HdjmlVC5EOqek1epXcYySWZGM+afb21qv8nd/c72qeds7deIz8kPKdPLaHDnWtGyNekS2bG6NIYtUJ5d1tu03oPS7Sm+2JTOVbJ46yrG1rs7yQzia6cL1+vCVCCgtUdtxvoFDXpxXRo06J+syFbQ4rgHrifaaJbsTGUYhMPinkvhzqyzxsZHUu9DDt2t1ez9teLm67/ljl1G1yB9c/hGGBnvP9lTDKLnGmk3gZhvIod9cqmxMv1mAIFWJDKyU54nHrnMT4Nb7b106QlVnpL+zEe9K+t+udZ0wBZroPiL5iW2+83+5soasKe7oa7GU82uopbhSxoW4XWdyX8kGbfP3wcL9Vu4XwoZhHRCmOiGqGs/KzPTKzYkalxodgrFeAj3PJ54A0ns01c/G7C5iLeE+ZEu3jqZua72yHAAbzFcz3WvzzqVO9aLI523zpxuoiS84LgygmuGZxm7n1Ut5fgj8XmBwCsnRjVfmsWDxc7lwimlkVnuliKrgvmrO0q7D+ucr8fu3T4gy/9/XKdhj6oLI9yQHq+Us5wsKOuawN22c3O8MPgnyp6iOf0PbaGQjwhx8MzxL45BkMn+LhiZrpuwWIxbnxfpKF5C5KoEsR32tJ4I/fhGJeQ/NLcsjWD5eMR4BVl7xp/BCg4FMpbckZWL/kQ78kcS6D4wvgysMiVPbSgzMaFsW0Bc7D4Tm4/9GCrcvANgFw+pof+TocEOzb0F5y/1NiIb+95Egu+mh5Gr985TbFflX/YtD1t/RF8UwShc+5ncZpB8YUAJ1lDsqX0mcQSmM0BK/RZwE7RCdrP4LiNRwgBEqQvh9gH8b1/7O//Z/+93/4nUnKhBEKEDVeU5FPr1ECx9Y+oDVrBABsjAXAiI4/VVImvcsaMab7MLzovaE7THjWd7kItY3pILQaUJLfMFDg93q8MzVIOnhTmNKs3e2vccCFeub7GaVkHHfPcSHbSlkZxocRpldBHKkNZdjUYNg6RO/c1EKhbZa2BIS5viSeYRn2dNnR+JElpliCj3tJPV3SB+3fqMHVrGw/FDsv7IwINoQC2k+XiXzYQjSoN7G0o5gdnY2dEJeOPqf7LSXjvjWwwk7Wb1uMsJxzK59gZB/pbOeID+omPlZHFGxeW4rTTxTbu1kT3GR/dTW8scpUjTBqv8z3cx7DdtoGh1OzI0XMWRWK6w2ZmjykXTBIRElMbVbJvEpfHkdLfYzUeeWn3fUyxHdhK9ljwuzVAQF8KPWv7KHZE5GS77hArDnaOxpQ5E/DHZWqVcOn8Q23Koq2juTkuF4fnKnLQamO9zjYjdMJEKwLHwvU9kon4gDuuGqZwXW/K0/QVJ+zyjkGjYeDq0BOZRth6YRcT3t+5JoBShVo022bSJ4iBcAq6+Go4Z/t7lCSoXJFN6jw2LAjQtZdESiHVczFxF4nCVvZIqytHAfSD4ibsvNM6sClNaTRBBYr281A5KzAceJQN7xJGUZAwPUUU+Pc9KxDyFiQ3ePt1TCMnVveOKgaJL2WXQyXvEuK5AJueyuNzNLkyKThFtj9BcdRQw0duBOnGhzbmr5+MvZOIG7TzeVmb3Ct44ABUUbiyo7c8Euc/ZOPtjUqAPXihfmJlx/Jm/RMC1Uc4aHwcuEW6SKvMmqiVz3r84ojpJkewCIj+znSZ+pJ8BJziTqc1c53sO811qqmUSqIhXuOgCiiBT0bzIqA2hZstuSZeg64f6KLKUuOZFECKmtNngOo/yIrI9q15iiwJlqwioD5l3wAUS3+ebrx/eVPL6nfvaawhQT0xR//45evgd/LmOUA3oJbt/j0f/ysTmCqvn0Bb4L9uRkW//Pb4fBXDv/sr70vqX95luCPWdzFbwqhhNktgtoA47aA572g0AK6Cwz+7vN5ept+53c/AfZ+65kCUF+SZTKxjV5YPwIAKJ1/QdmWHKPo28Vx/L6VH0J/2QuJ9MMIbPZr8HtH1pgf4WsfxynwKKZ9AH8h/Y2us3/w//wv/+Q7k/pEAabRWBKuaSjEFgk1eu2jNLUOMDoKKCrGUT/6RLyzVEfsLWumXUT1O4qwjkJSCredwV8ys5NGGFt1MviNlyJ9gyBt3PWFsBsRoZWRER5th0MzIZf0/tLjphm3x+wuPDD4apx0soagiZEfyPmIC2ZuYKNrPHChs5mGkxQCCthD/BgLe4P59ZitMJQ7+cKDONvXvdPoqducMIYhJW5PNgY64Uy8c7xz38r7g0GhAqP4x1UN4R2v6ZUCWVf82qfe1kSHCjUVzmi3VDHp1DbagD14vhLltnUbVoRNthdI+GoV2I4hO2JQTuPGB+Ai+JB6sQpnjwlbArWN642OHPiUeDekRx5heIo8LjeKMULms+KQ4bW4OpnkcY2jtFusAKyoHCePXcnkxcG8K9rq3hmN+hC64soDDwd1L7tMnbDBEbPLrrSPLeaPj/R8DdhCyeIznqBNu9WbESLR7RW+5LEnK0O/A6YFddrHZ0VH4AMOlvTZpFVOXsUXyGVjN1OinorpKqLnzfbMRfOdPmoiaUzFjj1juLPP04dGPC6ZFDj3G0oH59FjWhShqAyT9WKbEGierxJib6SHgbSYxxnWo30nM2Z1IS2zpvrAr29d6vVYf5gV9Sh7YbBXWtRccTC84Qm4nWnZdMMsC2f9LGEn1BDDQvIqFgn98dA2x/OekwrVVxWfE5L9Pqy4m6vKIdhLN+XD5Khb5qRosMKnzpDzu16KQZj0jBJO6Uo96TvYDDKIHN3gK7zy//xIHhuyNFBXTRdWeeZj7tv/H+exVaWy5Kk5wgj4M+yaIfrKLwGHNhXInUPYncF9KQBvLNjKrQEPdRZXdgipxbZWHAUF9sTiwkVdU17wEnBQ6c8k6v9JDSZ+831Af2myEDfvawKXJoB2voDIMH1Zvr90o2AuF4CZ/stz9wQo2C3HvQxLUvf4lmD+HPfMK6/jKn7XtOnHSx7378NLSWBbRe3Y/PDb+WY/BUZtgEgLivIA/vJ++EXl1D3b4doARhcU5QXVlE7maxgUQFMHLuvz4e2yOgBNX+aI+xDA0zBZ0zQerzEKpdY0AUHrEIJxBIIwEkL87wpHYSqMFmXudRQQTynSZE0RJLWmQozEwEngaPypGXNMDn7Mne5oZrIpyOslGaSoSPqcvpyvKhzukmaweSIK+kpKLjlOQ9C1O+0CZNzOyXy6brSVOyKPWoGxTqweVOzN1irhuCvenQTYOk2WtcWT7eBKTG5eIPpoyx6N7wTsYJP6CqkROcc3nXJLwkvmsooBzFIXxsie1cZ9clVsdGvL8JmAzrSHNU6vYg9NOzo0nlwD54FaZ2wTghdZrhrp5KxdxYfkzgKyPd3G/YrdW4dAD0iSIIvtpRyKjraQpudzOY6Lju3VKeAvGF044lxCO0E66D7O+sZ5vjemXnE7KPaDyLGxMi4btjorJea16R46p6R50Gjkpu17GjE8c6/wkXsbAGCfY7e3iqx8FBGRnRuJNdC7G7t6mO1QVQD7kyyglXFEwxTwozO+cdLkhAUooQO6lY9jzu1gfdvVvZOxyuUCHZhzediphB5sQj1djdtgN+Bb5XSr98zhOFcwd4tteoXgBjKqdS7Q5+05FK+73DLRJIEzIW6bc94+sGNNzipkaStHNPydDmgSPAy8ruUXVSC0cHOnquk0do/NHoyR4+1q3Mi9LQXaWDcOF0h8rx5MtQ+aUNtibNqN525/urPoXoIhDdI7hDJZqyJV0ghxBEGLSWWi++244abzpjURm1a52+lwe/g25dwO07EOH1BCiMOoVOdB5Fk702aUu6i3/kpTw44aZMJhtO1uKGVoaoMSqU47L/1WvDFcpKEfGn/EnpKZH/HPes4ityY8XMCRVN5aWsEWGg94k2NnKuCTXpFii0Tpz/HPCp5TIb6jXiKRTgxH+V7zRk90AdYLk8cDpBSPk2ey1SLFCv5G15EBvhrZs9dEAfizuS00E9gIs4QsXe2XrDnPFMB7cgHshSXTDtgcFqT9c/DG3/4U3Putn5FJhn/tHSfvo7b+Ev4WL6rw1GMDr5zKia1agHqn2O/bBrz1ozfpbfxV+YZaHLxgF6gWckmOOfj36bN9aZunf3QZ/NqIYhF++RUwJmibWx/3/9Znfw48eZ4J+P+LP/rTF2l4dnQCm/CzTcUy3wv4b/H9IvgXP/nJywepZp/9jfcj0BX8xU/+yfsBr5f0nOFtbiO+PHOw5gmcP7g0P32u8TvfXOODlLfn/f/6Iu9GvK3yr325Ct82Pxj+X/be7Fd2tU8P+gQEpEyNujuAuIDdhAah6jrlechVXJ7KLs+zrUgHz7NdtqvsKkvchBYdBgUhEBIoQgkC8gfkAnEHn1DEFYg7LlFLkSKU/wHstc/07fOd/e1kn9N9EGxprb1WVS2Xp3qf3/O+z+95NuR/vB3/u/L+xXf+/Ot3+FXh3Vuv/69s/6vnv9r6+1Xf8I//1n/3jpreCRvhT7ft/sG71+4L9O0JiN42/tff/crl/jUn6Feu+Xd3XX69m/rHuCdQTuHrXdd/8bYy/v6v433r37Hu+/5O030bhfevt/uLX0Bv8/PfKWf2376J2PiVigb75feyKLGv7q13+3310xQyf16meIH+kvjyTEnSt+vLAILhUJwegQiCjwgI4ccQg+IjvBUVOLn7yEIfKv7/Y+W//vvFj5aHRUIRGCXoVr9A6BFGAexIIgR4DHEQTDEQg6L0c/0C6nI9W6lGohbKg+iNiljSGkeloPpGGprUvuhAUKrntZIcduoNC/ZF2y2s7oA+oSlbp8CsT4kfZNl8Fgq4xcU6gNYei9oQHuvi9LqEKUOMbXp6MncvhPRRH6oRMzpMkkgp96MaD7cK5NIvphKaqXE7Z/x6W273USA7Km6D1wVLO75yiVmdVEqA8XtUuRGjkRFn5LF7ZYlmOPRVqUYTPavI/Xq/6zSGvKaV0g/PpgklKTgAUYKY+t08RW6rXfn1wrPLVTWSk/v0cDkjh5RPBCQ7+LfUcMv4GdEUPJjIAi21Yy/VQowCggxSUt2qxJ0RWFO929XnnwVX2oZIprw/wFIoABW53Ic8PrRN5pyCK6GkWHopBHy8c3EYeghuDVPiyH14e+GDBSp3TlUHZsKwQFULgXiuwuMqgXx3OLgeXeb4KM1KfIVWzCx8VDjd7fMSgeq+Np3yYooVhwSKLb/0Sxy50ENvBzUHZ7uxXhTNojvOJWpcumU5RUOIB4L1qjMatiPJ5l1NyAcmeVLPyuLJyXIeZt+SwkXdqDMw4QMFsBMX1ljcJwm5OOsKz/Z4vim6eaC2oyOhdnUmFQjS7nzQ2E5Jp9h3sL5wgwJGFzbvvPOp7ObDop8jchVw1b1gMiF3e/QaBF44iiLBob51V+0qhLiqJLhUsP0li2WwK9m6p9zLmsCLg6UTuC6SDbl09okWsrC6fcnMbg3EIh+pXxbVCuo9VDJwtzqntfeASURlanjPxtrV7yovLIHLFb8hYFKLIHL0vebnrfhfZdR/Wx+Ol4CXn0qltDK0W+02rb/mqGLlkLx78/HKVrPIsOw6tVLVqw+J7VbXNW9BlLywz5WgQWuD6r7ubNWf3MP2z/2YWVro2yt/DYP/PKDZ3gaTHlPxE2d5/AXJNi/f5Hh860K3R0tBBHmEkozcoIYIjwQek0cSRskUibcBP/oQav7G/0X+R+9+LKgh0AhJIpA4Ahi5QU2YEseIIDe+jOIhDqURgEHoZ9vBXi9NbiFJjtCG34nzM2zAG3c2aFXyzYHyuLjt+yoFL4YpONBcc07zaqNIfeh3ilqNqqOpeqYfxJ12boC7lctW/KIFbWX9oq8GyBCbhZdhBwQyGDxdZrrLZ0gWrlp4gwQdxvj+VJUHALKpqH9AVCYfHGeQCDwxWEA5+/5pA4wJd6XpyV3MYs5wTXxWeDeKN7SFRw3ZBuf7xaARiQxV+4H2dlVz1AVKGs0Ny7JbCuheY4VtK4amyedmZB7qiiXec4jkCmUCuW2WMYNwNz7hRGCbPT55F9jsbOPurxI8Es8Wmyjp0lm2rAtuc87OxGJ4JUZAQGnFYgrHqH7nuxNxasFDF4WoH6olFoXn9Mwtw3lQHJBDtt1dSXRm3PKqHZSn72kIdD4M3oM92JdeCDE+eJwPxUpqRuagOS8QuVVERmYtWYQ7wMuepIC8uofXiB2YzKLuY+HH20k3Wa/Cr/d6O4Hzgs88SlAoRdF5r9ndApGgWwMCVU3kya3jcJE1E8/GK+E5ye2KhoMbi/cIDjYmhm5Yjo4UYLyYSKo1ckkmgK+v4dVGaylviW4QUYuAePUGsCZyjqfHOBwqeyxAPVaXjfRBOqiiRje9eFq4y2Fkeq8S5Ta6q73yeiBM6GFld5Z3n5JU2g3IXB6lsA39iJGQU0gl06C5/iOTiSgyk97LMbq6MkUxuIBtOWQRyNd5uwk/zQ52o8k2Ilt7GkWOyuYPQg260eQ1qOLXG72GtrsNst9cuQNLfgX8PtSe3yih/Pq4NY3vPjcKys0/a6iBjFbhncaHNvitnHpvgd6oLqJU7KpY72VNfmtvx727lLPgRo8Rv/LXDXoBv0oqxdJ3m5oiqKjnnvX81p7+pzTN/Fmw9T7sY+8EAt4sRr6SQnX9m3fIvhT7aNN3UVi+WY58BnD99ls/dllvu7d9XPt4d+b4SaDrt0xNuLLMl5RlqLRgfRuNiKJoHMUbWiVoFh6RjSgdQxCLjkiaRWCaYiiYgB+60fy3r9/60XS4KIBnGLBDJoknR5gAkmMUAuAxygAwjSGIAAjic+d5b6inj0mIDRxjRMwytrz46vwRvOWLndRGDaHQcAIMlnkxqlv5FzSYQPVJC0hBi6c5WvjKUROKaU/MY3LwhUIOLdFwZAJyraHZ2bgq5Y1qrmJ7Z2Jeri9PGySZJoLNyKnh5dxmVsb4ik2FXfPSrrO4dhlL6wNl5dO5utpCwuIhA7p4pTngaB/YpKuL0H4Yr1seT7YS0vThiQV+DqVBC9qdT6U6lF/1FivotgF7GQDN3ooBpxfDEJgbiKnlm+43134hSBtDr8i4cC6RSfHsGNer9RAzlyczCHh1QD8QrbgOi3Bz9Ssz8+qZ6I3xfulW4cZdm95jQXPmS4svucMK55LlxU+boJXunt88KKGMBhPxOCrAYVlQ1RpJlYNIpBG6GkZ5eyCvWT621zMA8ScXD5/DYz1fOiDiu+B0bwsekIF+oq6WfPWJ5sZMEHfOHpyBvJwsMQRYIFCG6taHq50525QvjBWuzw2hXPKlkwIpnaZhVDBdKjzHaDXv7EA8DYD92Y49lGZeA86epWt6lwX1peT0RULk+Hm6DvrcFRcwNHnZoyJfWwUohU7Wcgl0sDRV8po3WmaFCK56nDFk2m3FQivlVBy8r31HGnagPQjX94t2JS/BdEs31iaV2YX0krbpKn2DqsvBXsaeUK6NMcV9Fa6H8jKlNoEGyVkgweni3VLCBEfmDhhAH8bklacPqPlpkVNv0YirvHtYrD4q//B6ae23ShO8xU3tQBYDPmSvqrV9ufLi73oZa4+eCMrfoA/awAJc9jncnzd4OUXAJPXGe97WRGWGK2VIX/3KaPa2ILl1WpXZu6O5ZtdGySvXbuC/8Sijlnl2USz5GbTsxi3tl78KT9m1N5D/9Mipz9IFfT9z+BdfyW2/YwDyfjx/M8B6w6Ff/l2UGcN8Q6MdR9B9QvZtphf9/a88Pb71wqJ3uey2S28mIWN5u+1Th7u0lu2SfW5319D++fcvzcJHF34mrP3u9tC2axtQlvFPna/IGBStKgL9fV6W4ElCQCh+hPE0OSIhHB1DBMWOKBrCMBIlMIB+2GLy7/0X/wn7o3Vy4ni0HTeQHgHyzTIUio9kmEFHAoMAEEKiDCI/Vwo0n0GHg7CSw+bw1TsM4YjaFMZgdRfPtmzDCj/KM+M5cykJPsWJvJz2Uk7EskLBeLLbDprWIWl0PvGiDpPK8rKSaZRVkj0g/TCDTD2cl6dBd0zSnAfffqTS+Wa7tlSJD7TqTlqtz0qWmAJvLTeAgcYQ46wxMfntU7vARjqczlf/xRdd5hFrVOsnspn0Ch/KC8ZQQ0aFDfV8sANNpVRzPzxnCuqJVB6Aqfa7mDynyeOVWelw2ADwwrjKwSrBbBADgVxpQw6pun/2Fz7HrMW9cqXTQagXBKeNgcJWyd8Oyqzqt0kLFPIBpZLnLgeZexWJQt80WD1I8nWyH2ZyGYxLKVtCOsthOxJecr6NtJIXcfKU8ct5BEnn+SDMSp4uKdUzehP1Sq4ozCg6pDEzrD8sLMe0mWEZGlwoGndllDlTyCS8Indqwc7xa5AN0iVVrzTOHXPCZyymEv6BxioEP+nzNuBKRSOJL2VeulmLawvzcRJbCPd6R8vixGTdNlbrhTUxhHFKU4vnypcpaxxoBFozHRC6BCkEEeCXg6znqwfW1O367DSIUWnPcxuuc9D+hBGEqRApgnlq7eL8LAsDrPv1AcbXgAnUUwffUlLSQLA4tYKvypfmqeRLgRcb5wFvRmlovTPcp9CV9EHl7gZvcA5LWURbL7LlYE11TmzdPsxAwydp3NTzlIglfhsTDR4gdxS+hbZ/9BFo26WvG6+IkX1o/uEpQLHdXgdtMPb013PrQ/q+hLk7Y4Oq1TRKpUPBnjgIOdVvWMLUIzhp4trYICWZo7po4pb4WS9j+isFKW1Qy0wMqYyMqsx+vBuEVzEoV9vv/J4G7G/nJX76rg0F7S6NLQqFqTceK7Y7d5OreONsLKRYewkgIN+4o3/FwQLPKDauujurf7Dvbx2fG491vobpNeKbu5B/DeHvYfJPKElY3iWxe4tHeH/Xj++itOmXd9KbzehuTQp8s4zZ9W/y2Kbv8nRvthz3qMZX//hMlNu2iQndBh9l8r4X5WfigPXbwlbvyAJDWYKqfGiEFZNomiTRMUbRjeShJHEkcDQ8oiCMoAAKYyH0obvB8A/+bezXzlX+qx9g4nZ10y4ufrH/+yQj0k/q6v2he+Bf+LUWLdhXtmnUu2krcZr03bQrmd5qnCIsx7cC6M1TXt7ulmRvKSrS8K3laHdZkdLsfnwz/HzLTbEe3R7S8ntvi6TvbdO/eTLRmrfF1Xv6m31AP+Me+523h5Jv9vayHcRPU0j9OZmVtoHjywslGN92D0UotlVR4TEEQuyIpGm8d+mmRzwF0AxMMxiGk3/6F//M2/L39pn+sGH3X//7/8rf/rEMQhMkS/EYTY4EGmFHONzqOgIH4CMM4yAcbXfvdgd/ZjWl2vqJ58018cDoFBHOg7aKFxkdZPWxwB5EXxLd6F9cZk0sPq4tx0HRPCBNxBstdhBPL/V8PrPP4pL5T115th4lACQc0TdSCCR3Rh9VYb8uPAbdkpBc263EMG3wnjDxq8N72ETHUY+LbqMBGJIdHJHrpcC4+rHf466SkjN+s870Sg3NNTwry4s4zZ3QPIELlF4aW42Us3CDoRXv1baJT/OoTc5U5TIdNACTOHpR3djrrVzJwzkveG8INK4qNXHqTHEtNDc+aLmb3W5KKofAwNhGsg6VL2t3mC/qqbWSDevohbjjjj0qCY3bZi6caQ4LdUAXqzhyK7Lv5WkrFdNheJQcMUkiJeKlfdZjE7xY0qgWDNk93RdNvVzfAYzFNRoUZ71y6VzoBjRiMmOsbBs+k8YOnvATyq+6GJ46rDMx7VLBerqczXOlXk75i4Q6yRi9hu6IbFzOpxVGDwa2qIbWntwsflgPQL6djJmgzlaDcpb7GK+RW0qXdnLCJTJfz6yqJkw+tEZ6F0s/znEAubeKB1cNN7C0oDpF9pAbb40P/kpDD2BsREgspuyBD7jP2jT4VL2AevFsfDKu14QeLD6b5uIhxf1ozaMXitJVcB5nVAYNrgAzenmeAwfNguwhdkXB5opmv6Km850hmzSfbc7UsJSYddGDcPChqZsMkhv8B++3qpfYEHZPRXtCNlSN7ma3fFLDrv9UrRpVLB2RLRn8YWG1ACiuvwuDt0qChfcca78Sq40sL3uFIbdGq0DCur0GCD7ui5GZnbMmrDGbnv6zrqICPqjeSD6kr/K656nYW9V5bgJeX7fz9eaNsVVJcLCLzLfKMmiVRrH20DMW3SstlVFqpdUhhRfL3ehedZVSfn26GOyTqp/f6Gfx7dTA9gwd3sM9Smx67/r5ZmvxJgv61s/iK2fQw/tZ7R30/srHkenXWUl8iFD/0vbQt+/N7m92/0mywb6SLdOUtRF++Wx+yXoaa1gfJIIlGIKiyG5eHW71TRQTxwjb8IKIUwCPUxQgsg/XYv/6f/5n/97f/tFkPwmOhzgRH8MI3rEpw49RmgBHgIAyGA0TMoo+F6VquFRPJ4PsoNdhZcewVpPJZaFh0Q6oRPBWhopXaIAvDElmgjk/8okP6vvzPriPuYQlRR/OXUa8hILVkSSHb/rkBWgO3m8zeXq0DE4bN5h9GN4BJV5EcRBueO0GxtyHdIkAq8sYywzM5aFhSYpMDgrdDzR6Q5P7UjoOgg9GIzzYS3Owl2aEzTiYc/GAyCjWPcMHEVz0/Am0oX+WXznhJG6m5SzBASSrDXmn4g/ULaosDXjaHEDS5lnfYDnvUbDbYFwHxGN94USWRa3eKHeL4fCisiHSkSWTB/BFHAnZPmk3U+t6DyPQacooy4n1ql1UxB3uZ23pfP9+zXX2mcnn80sPzvfrzQdO0BM/tTgsNqe7e+ZWmAR10mskh/Ipi1/wENIxtaeVs6ozNpV2VelHMayrY3FDkrRDy5Z8TAJfisA1R0d8A5IMY8Xb4CEMpCFGiVJU3m6oqy7WAu+LgHjiUEIr2gFgZ5ZXjDLOgYfkrtn2eiiVuAMfsA1CusQ8Se6StejroVZnbjAelsWDQIOcS6mg09wHzLt2P/EXihUuZd2AWRKWZ09CklipQKup11QtnygO8u6caCuqL+YJZQLAuND+2miFgU4ofLI1l94+iyvEmNCS46LENHc8BEQU8L0EQeveLYybq05kyYSP5hywUS3cogNQhlNhP3DaTrGJcg+ghd65vIX95opJkdgFNid8Gkotu3OTvAovZbdC+OFozldgBdVbyytjr7LFAkFrlP4+Grsyolhi7UNOo26cV/4o5xdgCwqY6OKU8evn7N5EwL67cfM132M1S38tmsDKQX/dkcgo/D0terebaLez5zqt3HK1wujbkQXF+/VpHZZdeeP8e6RKjGyPQXuM6ddc/VPWUD+To+/gw29MG/79jX5lu4y27af7u6nob2/pCj8ZadqJuZm+73i9v/lHtGXzEy2s/rbJUtKetmBd2C85Shakb9dWwxDfPoppcsQiMDsiWYYcCYKIjmAaZWGKp1D0vQnoP/qHwd/40XpREQyCEThEjhFMEEcYRcFjiMTgMSVJggDTGAexz52AvnDh4WE5tz66Xbjrc2l5K2xBRgzKEtS8Z8h5Su+mI1RcJtQFoDANx4W3pUTunlKz8Q3Bv3W3OVf46TJ1GVz51TB6s5K6z/lOm6lug8L6TNhX/UI7L4FZEfeFdWGFFsAevOQ9ZgLvz6KTsl0WyK6XSfFWuPnPBF/Wq57OCBg/iPLFeiRBm0o7P8VH6hlEL14G7jZlhhziNYSfquxBgOcTUsriFZzAdLxNy3NpzDFNb0TN112Gr0Lm3udnZOdh/IzN6ZzFth8KcKD1PdL5FX5pocPGThrfpyYDByXleimKVI+XYmRW7y4cgidmD5h1rfjzVgkQaLbCqZ28XtCtL4fevZQATZzVe14Tidk8ZTu16ppnJKeZiFRTLRJ4xVD5PN2fhZ+JA2G90lY7+S8Ge0y3Vr2frytzvkmzl72a+boUTvGA+Y2lJv5VUy6sKQUlRKNA+oSKuR30W0QandE3hKI5+H2hc6h/QtgVSW6T/eBoWzGoVeEfNgEdbMM95ai5FMh2VeNGNUSM6MPS66KAhcFnBHB3ZB7nCEc3LHou8kGJeoxylqlXzuKgoOee1qhA8jrlASIgmHKZCGBaikp6N8r6g5Natx+NK2Zc7ygQj5oNWKL9ILKGxV9j/VigAx+1IeRYC3IjQqPBN7rKmE5aMbfshact3Cg8UDqux9rUNp7ZdEko11mFifqCCs82DdBZfr3yT4qnjF8yQwGytQERQ8EfASNEWZ3yvaeP/tpoEqC80YJ42ftQA9d+bs+3ihUD/seFQXIM3IvQE37WdEllmspvxTKwkiZgthvDCmrFyrdjttG9D9d39acPbcDjBruFIro7S/urDipVsWtV4WAXSa01vIHzRjP1RbaERf1TmHT+pN7T3/6e4zT00UnI77tA76u3e0qSkO2p0WW3UaN9vbXY/n7ZcC55n2EU3t81G3u7fxUsGaPvbZc2zHoLevzaDBn/g3fto7mXe9dLef96Ffhtxfg9nQO+IL9ic58BmTuLOz/G6T7d+9tuR/HTrtr+pbNtmJZpqdpuKPy9lVsESjEUjZNjDITxEUk29IpQnDzGWbxhCBilaPKhadEf/eWp/bUs7j/9J4nI+szgjr/8HXL+VoF8h4P3Y/RmQr33CeN779LXeR3o2+V/7//xndzP6evoz7ceoG/iP999GP35mTfAdjAY++1e/rSX/3feqLvAKjT7/YuPxzCJRVvVAqYIvmd17GQawo4YSpBpGEYkgH+Pwv+9tfirP9ZEMwYgCZYi0RFL4K1qwkHiSKTodvOFGJqBeISQyOc6VhXkxiZPOKQEUtsd3JiN+UvCWLhBjBCHlcG1E86qpDuLWyzrie6KV+IkZ2TiDhBvaKp/4tYMu3VpzOjJVS6N1briahKGpQkUChqXMxZcLE2kgiHHvEdpV2iTd3MXWQoBMT6TGx473P2ljCJXfnFqWS0uhfGOxJS38hIXmZCfegcZE81L2I7Y7h8KcOUHJmOnE/oQscOYCh4DDyYbR95ypaJHF72eoK1n6og49ztisNGSwzxj9q3kFi0IqFuFOBBB1N9TljswFB2K86OS9KTM82jI7o5okLnaFYtW21jvwwNa8fDLlqDYBUw0yJqqKgRkI+H4RFCjiDdNjOI0CEog9DwVsjT3L3mJlPXC6U/Gerh1nlSdo/g2Uz9BTL+KanXC5hqBxlDTYycYWVBmcxXxliihFMOvD91yo6PH1W+HiHdvwHBiWff+iKOpd++SBXLaU1IuPgcRPJo3a8AFs4P2jsQrgCEz2sEj13UkK+HKzlqg5rRpuC81rIMHIwey5y/kfKY8oMTG+5V9CogG0aRz1myzuAAMYGQhwA+FcFKthpq668ScSCI1bJf1QNUye5Xq3AHDmotshDLd4NsHo3mykHRKGUPPPeAUPmOi6xsnyg5n/aKPEoW2aW+CGlB4sE5XxOuJD9psg/felkfsCmwXyx3mVoIr2EavNnUGQoiNT+bz9SJOYkJlFHmfpkA+A59mwLxXTese0K1a+keSqARUcW1UZWxwI/yL3G4Uvko2KrvLjvXFr4I62B7bqq9F/rgiTfBAUty+lJ+3Ik0GZcspfMjf5QmFv/rbscer0tqgwhvNVhVttD5G5O2c+SsLbPQdVa0YCawYlHmu9VsBCZhkq4rsxXeNdnev2s7z/xvl1H9he+b8hfCF8gX/hfqZSPUX91Jlq6f6n9Id48+dBYVXP1g8zxIIICA4PALw7qWYwMAxCjPwSGZYEodEhnyfz//71N/8H360yWUEwNJojwrd8Ag4wlvFeIyyfZo7QwA4TaA0JT53ctlaXMCtLxaNkEp3bSVNG0hio74FCOfGaB1C7FVLyh25jgchJVuHt6QIpxsTNM22uVxoH7iiuqvX3t2qH86LnliImnwbtLcfu1M1Zs/k0UrtKWrlwl/ac3WCiwZKIBnD3HLx06hvJurSLh2EIfRBICnJoWRnmKs8GNFSItVi+zObfl20mbYgxNRkJXipdzDiQFObY8SXCytxBKpxL2TjtBvE+tj5KjDl8EQ9yAUWAo2bHmVZH6kuiZDHrXElCTc/EFKCTbpNVLIOv/AXAxs3kauF63xws24ZpAlN7EtSa6S98slwQteHGIiqIvsguUF5xb9IAzk8XuMLqIVz/3qdX+YdDvBMet4hT8HEJL2WhfHgWjKRYQw4BI2/Tggm31wNSqcTF3chaD34QwXmqVfRMnjuNtiZsvn8Gnu0w7zGuPaal/kmr5vItvGr7Vg91qddZJxAeoXQFTXcWfdX0rzcHw1OBP4kzFhBsaUzsShJoSOEuA4NaK+oRMQkflY8ycZy3iGBDjtzHBCOeb6qBNKvNFedVOagn17cIWuYRjbDikUx1e0ISQqcNYNanaBmJM+o6fxoTlhwEE6j0yfy6VY8olicqMwrPUFPL1fDTXtpAO+hf6CzSVMuXM/KV8pBahE+ePCIg0Ji4gIVNS82vncOb4PPGDOZfmIfSn9fgsPQkXl5NQ41Br14RpUbElIMTf40b6k94QiVV+GpVDL6EUFZrfA+GPA65K/OPrkKKJbS7Jx3768M9pSk1allxn4FH59cXrYR+oOvs/6zRqnVaDYe/9q4+y4iQ2VmQ2aLAuS90WnvHWWUVoFYWGHOZcAr5ZvX4ppvCKbvHlQbsrGL6u7eikGrWD4gr0GxH9OfBkp9pjfjzr+MNHnEX6ctvhdc38M67d4rh95HAeBB30Zl+k4r8w1C3ij6PtVdbGR++vq3cxOu6fvfwu69f8OuOgrzNnxHP6L065jGb8TayC/3xOOd/G18770xB7btZjv13TthatK3Te0Wy2+StjGN0z0q+d/45fsMoq92ddz3/k2L9qb03r089kjIH6FLSUm3t/mppwV+S2Gty6+bEIBSFE4AEjkCSAocEZhAj2SKh8eUIMkMiCGEjL+Xmf2//G/xX/3RQnl27ymMJI5JuouPYhw5RgCKH1EiQ6MEQ1My+dxQnqEPdTKUQLalz7yRsGCfMXlZAveShRYfaA8XZZSDkl55RsEG6NooAnh9eY/DskYvZYxhDriB6flmotySqEl0VXiXoISuwMYHhZiWOGuHEKa6U4/yKRARkXolCo7xvCR6HEKF56IorzFcxBj3LC4PlOZkwLi0pom568llAnG5nwhotLmZR2QufQhpXaAKeu+sg9f6YTojHlgPBTy4wZ2TDuqMoxIENdTtTIJFUnadbesnUcG263h+nHiBzOHOfCLhfeIH6zKI6QlcuISI02qG6NO5bNzuevXuwpl8Ni4psNfAp13JfXWamlgnTgxotkvvSNqMAX3QrkgnoJmGVs404kQot+mzCD2LSvUGh591LxTgy0+h1XiEnTpBpTYDD/kmYk2CInHiWxEw9egCuY9TvOoPkelFSa9kB+AUndQOUl4YW3WXwsQg508112/DQWdk5eDfevpKC/XNq8fcyt2u1/jH+Q45uOiuI6QLw+tunGpjhqtVCkOCsbM+Hh7CbIqikFm2ZnKFGzb6iYFStbFj7GabFVBFB8Qy01M8FhtamrNJXZeSc4m82AooLjtU10ETsyjUr8hFPLw8XbIuz9gR80NN3CXW7GFcZ6ZDKb9GSvf0KxbuLhx6oUzlKUsBo4iBuMEZyFZLWx3qdLLg8C4VmPHIi4Hr4K0oE2mlKvQ6L0MsSA/u6BpyOWRd275w4Dsttv/ZR5B3Q4IcUSoB2p2MP8IJXzK0ZxPau2MxpLrChjxG7bfGhrwy7Ld7ocQuChM/Py4+El77jP3PGmkh9vXmOmkJiGrtWY1NETBb5cHksNzqi9IGpW+J1cYTF/UtnEgs98fffrb0V8DU4MadYcUV4A1pV5XJN1RlP7lD6bOcF3cAM9MNu/ZOom3Aeke/9cR+NUH++28SWWsb6orXmzXRd54OD8jvf9OMtOfeUO+2ATFL493LOCu7PWKgvxd/8G4DxW0cnt6akb6KyNlgpNwtqKJxV9/uiXpffPGTLh3v8+Bqkqfjvzm9Y8qw3f2UrX33fiIvY5XhWcP8khEoWVWYLy1VtS7fqm/BffYTSo5xDOBHZG9lCsmNb0YxlOJAkpFAhn+Aen/4X3W/+NFQDwCjiEiAaA8L2DNyYnijuvDuphRjQEJGGQilnytm4uVMhatAAyuwIbgUdGVcTtJHmfc6moh9WF7C8KIBHoxTt4oanxx4kixUEhO+JwhgXs+3R0dE4Ujh6fWCNYeV5AbZh3R9UlBomW/+UiuvDnT0yliuYYiEtwdBUNRY9AeSD4yZou6VEHD3qWvU5CATsVJNL96fsVPwYgGqTuPuSj5RReR4FyyC9mHB/mt2vFu2bCNj3OhWIK03lg76q8GV6Zl1So02TuNzGdawdRhSSy92j+VUiT2xVyDfB5wttRaiZ8K0Oxc8Wbym8AoHsVPSdkN1V/2YVwwEO+XyfUom69lryQHa+KxntdvF0MWGSEE1AsvadrMZArPW46/2mhuzD85kjI7Iy6mbdUESz3uelax+2fWFUte7ywEtNXmvMIzuGekrHgu8OvQC0Q33CgR8ODfshGz1+YBSZV+8YoUwEgvklXQQJHDdypwc8+6eSi4ed6fWPAgJ+2oSykN/5JUXX2Z9Hc6mTq8P7xC7zrh0hJ+vfWk93CZXCLi+ehoIgBgd9USovhZ7ZSOmgTGaSJgKfhTpfWKiXufDayjjMLVq4uM6ayagNKElYlnBnPxGu6Hx2aBUKEccrj7cr3zalGgubE8pAXCCq2f8dPSt/GnnLk3R6NQusWHfBNmxgNgLM+h04PBYGFvHTMaDJqR3ADXnRmJcqGUYKvJ1XWAckZOlxMbupm8iQSOQTbWu5CX/tN7cPfdl9+0Ht5Ee+v+NJb5GPqUIKhv1q6LwrXOrMjKoMME+A1pvx4/4kLI9ljQK5OxpxdV2XhDFKirf5RplbUp59VcZUsqAiUG/8sGdhyvup/fm/pl/YuTDfv/zO2E3SvmObsLlp+6ENVjmS1qi3O/TJzCD8ThDsSOEIuQRQSHsGO7BohkBpzgC4UkExB8uqf33/+Ff+9EmLiNso21xCBwjIoOOMBkDxzAL0SO2fYcgEiRJ7HNNHswGobmnuerqYcxbd75CSNajuRjUeljQDl8Ij5tdCdKAz1p9uVi3lwFw6GT2PhuN1mGcSeG0WCa2TAoD65lvuIPieCkPK6R2NlMFRn3OK/KsJ5ttwLywJ06ChqzlWbVKbPHEsvBDVHSXsYqB4Ib+SvmgbWW6nyiPh3iSqOW5jLA0+lSmRIUWPTBxPZsS/ngSN8+Ioksh4ur6MJCTbsSZHsXuctFVvjuHzuBlvb8iBP6IM7qLKQPHCwmrb/fOCK/PaRTsgDF8oBmtE5mbXRE4YjCYbqaN4gG9sKEdOhHYymEnBtxNGw5o17xa7l6flVmbD7br4mPb8Q0dvOxglJz5trYIL6VVkgWwO7FjGN2e5XxmYQO+3hE7Nh5LRZw2xkfsOSl0XzWGn/hDlOvq1OJw2+XnmOMWNlNuqHvh0+QCze3CBOyoyq9msPPGK5eSgOWa77yNyfYjkkwueMVUZJhBDCjWWAAGQ2wNLDLNIE1bNklF/6k8h4M66TduvgjsudYKbfSas+pdyaRAc5UN3KTOeveCqcVCT54TAVfkqkeaF0sEWa8g4BVP2Dtlt0mD6RPKiM1eMXgEzNGN0d8yUYHxIpmxgz7j8ssOjcddyR08R9YiNYaLTU8qxJDFRQvY3mFhpSjrwpyVk/54Uq4YxWuYR4hQzEtHmV7kk9s1l5exFsnYQNrIdIKOvdm1BOvfAsl/85uBZBv2rI1G/fDE5f+HTfHFVua3/dwN8axzpbrsU93DBFwd3OjRU1nrjTKJ2+Nc41sUpKz6czs3S1Btj/PyS2Z0VOZ30ZENyxvgyusGONWn06nPVMf+W9815wWB7S+3B977z+9Cof79JOC0g8jubZt2aft6Ew5N77fxXi30lVX95zeyWuHu9buNu++srxDnJ9LLWpRBKZYtUd/Et3xr2BBDaAqg6BHFkvCIYDF+jFAiOgJIEhJEnAEY/j2Y+gf/0//64+llsyxLMxDdqBZMHmF899CDEPgYwhgMwfhuPA9+JkxlTnpFTd3WQZ4sM2O2LvoDhjFiLkZUNby4LO6aSq04LNK9DfMZZIRDLde3k3jpo8ZEHHPlTtUjo/z4IBpiGJ1VpnI9h8pcKLmOGa06AdexFHC9QpEyrL46Q8hLU9bgRL0WdW35WJrU+XKSoYLpuwHyaTIUuRMH+lMnnY3kRs7NlJ0yR39eUUO9+AZPAss48Y4cQR1yUCIuv1/v5DlQDqu93FKuqlRg3EZzVC1J647JsQWa6YaCsNst6ZVmnjcSrFtyOSHNDSMzSr8UoRYu141JUs9MbpJax3ww3TZPn57B/VbFhGRcTU5pyma6jNeQyFrnYkzgYnLug0tcVRZys+7WapbVMwU6MVXFjJNcOlBy5DTNZvpEx/pNSa+sdL/kAFODcxFboyk6fSOB6qkRu6DzMzG5H9QbasT8sDBRB0heiFnglTkpuRUX6gGZeEFWffOCQHL0ZADsdo4N1RlWliDv0glDyvN9esDe0ga9m0jFM9bArHDNO0K81MDcyN+JpA+jVZAAjlUjv6yypgIJDPa9LdQQ7ldX31wCiXqk2uF6qF83sDO7CzGk9PXBKTXSbeVik8U3moXh5i5IXYGMmDoGj1Z6oCWJBjqQlJwm7dceL5/ss2XJGu+Eir9k0tRrLEUM/ShDffuYC7sIiGbBfRs86eGrCu+XJrw+LGdepznp6KBeTsUsqoJ2rjBI2G7JT/Kc3+Oh9/yxGpJX4aNGerLrLwofNOpW/2/1PCBDAqjy/kvm7VVeYzDY+FLAbLD1ccMGK+HJV+QoQASL99T8WTdwvIJ217vmiNwGbWBtXIc3arnSwYCpn36rI8HuY7tHkbs6sJsxBBa7z+ptEMzu7YdQ0Iobb/K382IUym7YwMvon1gDx5618pWD+a9azn8Vpv0+z3Mb9bZxfxvv94b5y1uWpiAIny9I3WNB32/up2VNf/FCmdavUSHCCA6mu/YvgoGNMkFJtv1EwkckwwkkhpA0g4APseifatb/8UfDIhwF0wgkN/BDN8oUwuj2/ll4hAkCBkkQDFPwc7HoyXCHg2KFpk7oDwuZkRU4+OcFYgBPCmO28Ql6DuyXS2aPx3pOH7jE6LqaPA6yxkm3rsOLtuwXZuSbNYql4gFH8GQHULqxucnMONw0Fl5/zM6UzTAsptR1vqiMDTxbBqvIWc+srF1IrcSuj3ipCxzgG9Q/V4UvXuDUsVhtzZ4BMtLjVamJZJxSSdnzNg89RqMiKp8d0mhbsEUJmwNO0+1JXruXJwG4xVpFGfjYsly7IZL90MgJUjBB0hL1gH3ZdTZu1TJ0CMZs9Ki21zA0imQeZBjqMTcvKZJAQW+NWXMryQvSsAtOXoyc6Pp5n+Oa2kavko1lJ4cvN4dlmlG6LjQPsnWIvarraKlQfoYwwBw2gDC46SE87ky3LPr9YkDmJYo5HOusIgQAmMH814PZWEcCB7prmoDmgK9T9gy3s4eBOaHC63KTDPiQtqSfymlCDs+FChRLNC+r2usyogBDeGANEJuRm8e9zkTUHvJQtCB/tfTOUmAdfIqnUAI0rs11qZNwNFQ1MO1vgjgjD5RORSH2lnuXeX5jNiTuXc8K0GoPjFTR7byNaeumFA47OCWNdddcTn1KrFKhuaz2GGqzlFTjBhnSlC7g4Xmlr24WnEZLGmbCuS7evSxI/C6exah7qBcxCWnlalKV8cJAFRYcdRtWhersjGAAxjF4u9NiHlcowalVQGBYpT1GacWhlk7sT1chgvJuIFQJz4/0bkD+3jBXyfCejblRHcDffeKsZJ9fevpVDvsr1+zZzMrHsUjy3WZIXHQOofpn3b+hWEohV0ERMHt+97kOeKeSq2SjjlytVE6rMEoVuEYlW/IqW06lrPkaWNyeBbP9Lz/33BOZ3xsMbSTY/99f86fQv/HPfm6Gyq8mdnxrGfMZQPUvbw/xTT9Nrz3vI90jxn46BvUxK6Df1W2Bvn5JGxRnCQr/pXkROOs9yP2LvKSapv+lLCisQUnfZ15ZhIAZsKFNnCLAEcEh8BiRIXlENwTCyQTDIfxDW6B/53/G/8yPZpUXJ2SaRRh2TAAMPcLY9v4hnGBHNIHSECExPIWgz0S7lB6bEaF5goB0bHlylXM9q+zdPym4LGkam6TPpsBul9MSLqlJhXdMCfSD+5rM9pQLQYy87OxQl6eSQ1g1OwAw69GU6jdDy5czVaP4WAxSQq5duH0uXl1VD/fk4FX6Y7tN11zLmYiqHsJQtJyJWbAGP85Ex9oce89iSRwXOTEGdOY0EaQIpapvaVVHkyatQmNa/lZ+2hznDmsG2j4g8tEDzhNpGkVfFpacY1Pl3LslHfFjKqbNXI+DltybgpCZ1QbSzBcJoA9eEu11aOHf6MipcrIVa/Y5OWNnXuOhMxT6ySXZIOBjDcIMMh98pmYkbGjZRx90qqLZyjMIUhEGF4590CvSAgWy3BSosBFSEhd4DZJFhe241yqiJcRW8ifcuSCwjfPYcB3pJy5DMQLkE0mUTrvdIDRE2Q3k1vFqGldrQ4hQyOwI94VLPru4PF2gkcAHrWRT6/Qcc8WodIHmvTY1bA+URMVJmIOkIyuqyg/PemYWyhFPT26eNzTIRxDSc50U1GdxsQKDwaa5qbvFQ9dThapsdKUD3/JmC7fKbSQQTwV+M4AHLjNxJlnzjCqvTry8TqQcJM6TOID3nLqkU3m5jSFgc3ocIr4A2Dc3Loei1uYpIXhRzFX2pAz3U5j7/Lk/oyzLTrDGDeQEXgDZO3EaIk1TcVK4UdMgKQZHTpDODF1LuT51skUd1noSnO+Yu/zDT0A7WHlLovphqzyVEVvF0sE9JSJ4627kar91Gn+1kb3FfHdMlS2lUj6+0rShmbJEEFoHLgr8vFvnyQ3VBUSxZETeDW14H94TvlTXaVRmY6K7OyzPFRu7amRo41978gjjbAi4O+PurfU+qPD2U16daneDVdxdn5J/rS35GtGaZEPCDemL7+37m+KR3M7TV4jdKVPoAuU3iPhmEPNpRjF/9vMmGX/vzQqt6e97K3zcl930bhu/x/u78HZLNxzq8jcuF45v+oldXdjHcTiVfRc2zWufhLw9ol1k/6/tvWdTE3bJ9MU7f3tdG772oOntBXuS5uP2Lnzzq/nl30XN+54ytr3f9kNX7xLI3/t8Kvgm9d83Su8H8RNRwTe1/97LT6uCYn4DjhiIkRkawscwxTYCmBK7O3kGH9M4TsIExXEQQz+MlP7jf/Tv/mhUMEWQKAHJ9AjDYXyE0xg9hgQCHmOSiKIUJSIQgD8THJl1cn1EYFD7pd6pgPMQ5Ga5rr9ARYPacnBBkuIp2Ev/ePWi59R6k6qPRT+MUY/EDXzlOQK8jv71fpEovrf5Zb7JAaOUt23wQ3HB1EvqQd+MyeaQ06NXYqBhkJtZJ4dVxDu7SPyKSybKcxNjK8Ofdna3iZAMRaFVjVDzuEsr21iYHPTu9BhYkWHu6/1yTi7yAjbsbAzn9QIBT0+R0Ft267PiTBRmqx3UZEoCjXfKy5TlbW9Fon0gMdnzYvgKTjnnOXjuMMAlLlMaPUzwbb4EC39TOhx7wuaTxronSAZgzp2x6Qk/D7PzknX4FpvP6eA4yUEKOP+ORtmrHl/yyJ0C8XybLPeFds9r385MENAWeWA7SlLzpM20UxBKSGOEZz9vCLFjKjNz+/lEElvdzNrXLhgsJH6ObI361dkAidg9DzEautZZoh09fD1Tip+a4pQPXqgECH1rHC1gaURoB26CRdEO5PkA4IZvU3rAQ/rM+ddAyywQVG42Lt6t+SQBlPqgDpw23ZwTFk4DeVJj8XEbz+XsAupqhTiv5fNhkV5pk7qeGBXxbcbwXBf0zuYjbWyWiwnAg8VwpySHYoXFJyI7JDCAda4hCODAHM5RidK01K6XqSVwGCD1MZfmsiNb2D1Taej3twQG8Ro7sK+YSWVvtU66J2un7Yrdbangc+KZ852+1i/enKN85cltLKdkBo2MT7RIX3ZrdGVvz9/b1X9YfAjLrVLKjP+SXRt8k70zSbWBQLODq2oZrVJRz90+/DdYpCsRLKOqRf2saWDAC5BqxaDv7jFb8UvZ2x0sHQhafTtWHQq28+ZX2znZ46XXpA7eRJg66FdGvRUKT5WpV3m1n3sc1XaOatnKV/8fy/XsL30oct/Dhv/KL37nPRFD//c/fAtVfmeVe0fyWxgi+sd/62+++67P5y9+96vH/8u/804Ou/B9jNQv3sKeCeubvukNQ2hKUVRre/RdtCvjs37M0+T3PiXC+TPX0i59/JiO2v79HV3eivQfx7LzbZHsotK2+aX29p0WtAv7rSVnCKExBoXQRpUQ5IjAAHwkkyw7kgQZISRKxnGMfIBG/8Ef/tH//X/+WGiUQRmUxBG2G4EiRxhIsiNB4OQxBUI82oASgrPPlcK7xempy+ht8Q60/1TcmvCp0PBiVJRRInwA7qENLNa861IqU+20tlH+THiSi+20EdpsEZQq8SBvaF85dpdhpYyeHHAYl1OSeEYX0IvWLXoyKR2b03deBEQbunjMiV4nz6fOHX921qePFo4zuPw54xyhB+iDBzlxGlGdsUL3g6jfSGJ85i054vX5FLXGrBRz6R+elU46xmF+PclxNkurOdWicoq9i3FfzxgJnllhw9VMko1pWjhJxZ+cAC+vQROXaJLQyFMAEGcK+SSREuIExiF38W3sHDgh7OzurooyJK5yblZlQ7HMnawpZyX7x3PEu8dMnS3gRkF2Sd4JjuZzqb+prAXgrHitDrmAssECOBZ4M5ARe1yAexM/SHlaAH7ZTtey3h1KIxU063waVMuWuF9k+dRU3eh5btUdHsCFXg/MVkRpTmNq+XA3T4nXgEJXKEuVzDHJTkgE9Y8aet4eWxnJG3TDKxzY51yQzQz3FOM5hsaHCZi+PYfUYQEnw84vN3TRV3eoTl3oYjzsSeYFbVsGRLqTbKXpkpb4IRDzU1Yl91EJq0ar7nZYoZEFCIYVZoeJhttOaRd8AMTQr07g4HQW409KcdUCQ30tNWS9AkTdPrzQ+uRfokSn7qiS+MmkTjSBwgFNC0IqNVOmmIQOZl7eqJcgvK2zyrhrSVzRJUyyZRzjyWSfAuXFlazWNOpSn+hw9l7Lwe6y70X54YlJdE9P2mgaquxyeF7fAzsgv2KhvU161zXIkNP6lf6UP+7DSQeuAwXuc4555/Xz1nAUlb8jTLs36m1ozW/nytpNY4QNiYpaYZqNysnbfrJAYDW7w1urrDa00bqnXAWtzNiQyuvwe+EkC6kuiwSW8CcTbvhbuyT+25Ux+Kf2gaaLNL2HxU8s0Pjn6QvLWtTl10wSEjEAQSB5TDbmc0TChDiSWJYeiQyI8SgBAAT+njHH7/4ff+1Hk2dAAIQC8N50jUbxriIkj1GMwkcIQkCQyMAMj4DP5UEYQyoE3FPAW16qRFyHi8CKEphxtH2IQcpSg5LcTmwDIQxl9oY2X2FvAs/DLWP4y9J6PbiCsXIDS5qOUR+6VIkxACiY2yYHmjXrrlbAz2VJ6CPRznf8fhszUYDBqRUlPbUrPtjGjjmGgTNm4O5qRrMAYpruCu1F9i58qgX1jNDPxWSqyAyg04K+Tk2/nktAOacqwGaQ3C1opE3PaEANJCZLEoPmqiJOZNM54bSY6XiAghWVjVSxZ844uWd1hFTW68mGWdo7S8OnJxzrZOTQScgZvUeBRX8mU/yudmsGlk5FDRfPsRF6JEHynhwQz6NckQ3UM3+h7hWwLAkIXMqDfekGWYzy7NYOOcQ0MOPoZ7p9+XmHN6PSQ0irqqfA6DBs1AW00rLkcSe6SgODoIQ0po58rVEfilm73sm/ze7QAxMd3/ED010u5HJ4GctW43YGaJJkeTgRqnzo3FFU/S4oCuA8PC6HEKFc3WSEkTQmEuKA7AZn42rCG8KxLzcaHloSWKDsCHyIDC2YnV7Ua5it4qCj6VKdjOowXcYWFxKcxNDt+0ksHnrzMg4r4ItwQxN6wk4wNr4CGUA9Pn5I8pwsvS6r57O9cVLwhPTTFVOLbi49JnADq2jGxsGkkDAiRvVyTNyI1DWCCynryFfNkBcSEuzZJ/H27HaAARxqW7/oPQrQEcufzAmFLgMtcrn/iZOEeySuzGyIwbBP9YflGbDKc5VsGVtdr68Bb+9LYqi/ldPyqhT+GjQqzyL+qr9+gzHHOWqTJuI5fftCY7j/WfMhv6LA7TghZRU2/hcUvmWUqsVtnC8HlHXPN9zzNWJE2RvU/h/m3uRXdn3NEnpSVpNUkVmVFGRRwOCkUCmhnDvDfVMTsMNNOBxuwr09ubjvwxHubQQFAlJINUGiBiVROQCVSMQIoZoj5Qgm9RcwQClAYsoQCQl7n3Pfu+/e926f5N06oX22w32Ev/Vb3+/71irpWd68Ham4dedDuQJzsNzYudx4R+nLzqcOWbM7+nO/kf8fp8V+54eg2Lu3wfhIoi5Ih184yn/q3No3/LvvnV1BVPUfgg/REbOT7sNOpj4kQXQULWL71kV0OCYeFlRNG36oiro+TuJzoveuZ/ZzsaqjJp4Ig+xQsPq5nNUffknS+sNHGDt6pz+8i2R97k9/HAf5Fed7FEP+/KTiIiuG9/19KqP8dNp/eEDxvyUHywf04zr9v70f9zif88cV3u8K9AcoSr53VjPtY+z//vux0f3YH37FcT/qdP8aIP8cvf/6kcHctw3btvqVqP3X952mdfLZmgTdDkr/xbdG7L/2acO5ePzsd46tP0NB8LN9u7r+DAY/Ivpv6pbCMaoq/UJiCwoOB6qjiZrcOSQaIIdEKPEGh3ASBMT+D46Pkzo+2M+OT3PH5L/8330J2//R/5LN/+DHwnYKRAKCCPC3HcWJN2T/2VEewt6QFMQiOKJ2xhn8QGzvb0wb3BrDmdEczleHH4e2hTD2zJ4zSmfHG6Wvp/VG++FI5ZkKLhiBiVf9QaFT7I8A+ojEsVIX91rCz+I8KjVVesmLeD2uz/V2Z/GSbi9RyFFFGq3QVVe829TopCfjFGLyrv8EMtV3VpRNYJjhWofDxOeywjld2aFWnd2Gc6FzkE0x74Xeg81sV2shxSnO7MQvTbqcrielDCZtv/5oeETTkJIwrLPC2W3viJ1JxRgmrZa4qkBxVZrgqcPNA4JNtipZJg0Kj/n19MIMkmBeJs/hHMn5k+wKNEj0nZK6rQJVBZWbYl9sDKUoyYOb84xTpuVsJOOSsFSooms1K/Zr68X7QqL87XHKahQIMA28mvdrHL06tEE96tKFZECd6+tLTY0Hy04SB3MafWY0uamEHTBT1hC9gjz7Hpe0RIdPOd2V3rWgymQ0ADjVFbl26rN3Wc2Z8BQ+MXVLSldFRtd5pnXgPF7XvuksY+VnuQkLDFkpab1xUja1mHTqIaezq+ih3IUJnWrMwad7wCwq7wIxtHTsc31BlnC1GLUpRpt8ItK9Nf1oI8ibswGDKxHcU2m1lLq1pQ0MaHUZyDrrl0AnzTZOcTffPB+1G1vUUIbJng4FZmofFFvmlX3TGMVL6wzt7DgUPpy50zppYPdEMc3mASB4XFIuLBzrEd1ernsagVwmUY3T50QWCHmmVlWcvG/llRVt79XupXx4GK9fwyoh1TksEa3Ve29AjsCDJammvGPZUQF/X5RGXhVYRr++Q+BqBYJ99x1si4T6wFIoKn7ak4C+cNhkcvv1eavyeS63jI+JPlA2ZUQ2D83xbPPZa6EIHPh+Nzdv23F/Vra4UkwakTdrVVgR3PF9HytY4F/EJOAPkjX5EkuF3qfpLkkwfNCTvtiD+c/btD++dW7r+Fe89bkl8mERyXfFfg58127J49/5vcNHsksOocpH+6Efo/xzJ8kh32Hyz9Ud6W/vi754Mh/OeRFVyZ8TM/6XeV3k2M94XfU55bPzRTxL3C/YMbaH4zDFkTeQRA5Mjam3AE3jtygNAwKJdhADgy+z44H5r380dpyiBImAEPQWxOCOmxgeH2Lj8BschAEV4ChOkD9U7LtZZ8Y3TqVfJkTv3i9yQ7uMv+JsPjQtCdPaeA7bzHpNM0tgHGrx0rIJVt4SQHlSpra8Tf1ahh1Ign4nCviFApjuCjpPMkLZzcmFqhw7d1uNTvPZaTb9pywY3FbPxmpWlbJKYW0/Y2YluMzIHqM6SM2DZIuMelKcp0dZci2cefCeNvtoBh2bnRDoRCnRZ5UdurBeGd+B6durlYOs1rZRxIy0jbWILazCkgnDuD0KkWGzK8oNkPFEcyyy/WswsauEiOL5npe5O/s7U8qA0w6bZx1fX53BCMEtVcJYR+ONxNJ8iZrkeXHA2+myP3UiNRbrMhkYDZI8fyMreENmcz3fWn0JH7XdM6g+B2UNerpLzwHI2/Z18OTLo3xa9ug+3DXv0EdgQbWwLNLTzvehwcqtK+WBGqe9qLljvUy6q7ZLPCMLuafXESQSFhswUGtpNQuVm5GUIzVUBv5g7aQC2MutBdt9wHHeo/jqriDAzCXu7rGXQyuiR+CLzZVOdV4mi6m4OTjH4qlRpkSLUfbiC9By2neJkqeXqI4+yVqKHOSpezJRJr1Xa4lbJtGEOksI+NPStc7O2euyNPSkSyompFjHd1mHhhYKjDN713BgXUo54V9dYDZUJD+YZIMIPXlGyvVePav+wYeN2Bkv4TQTsQOpnnEHTU5PHUTVK+RuCs08szbgDQhbhVs74xIhQ454/3bs+HMEhWRWXr9GHKw46pYVR95ZdJ37JQf6gl56jYf6Zd74ZYZ+FAgTf8H+fo3b5I4WXYgw+5B2YJ2fNHqSmLLR63Gd77KTxyhh4+b3cqGSQ3znyFXv6MjGubdZ29G4fUh6HiU2xzK5EXfGzDTy0cjNxsW+rPC2uviLQM9/6cdDzzfkV9sOvsH7Lt72d9hD2Hvf9F0U5c/++D/+tLuDnBbvXhQ7UAbHa3hf/V3/+9gBfqxxnPdhZ/mJs34stznI8+93yc/+yjuZ/Vz7hBmHD3NQDJ/A9/f7D81+tYc2yuEaTcdx//lZoL98FuHBaA/z6P0I73pnh5jmIVU2JFX1Z//pf/PhEjQf9CAu2k8tHG8/R30zb8cs/7Dfo+aj8+ExrRruj1j3YSr68SgY+oPj9hzr7it9FK7un8V+V38E/THmONC7UMyfo7nU32BuFqe/i7D8sq0UCKEETuyQioXgDu7gDu4kFYBvO0VNYDwk4TjGfywgj1MMQSA8egMDDN2BHCLeKDTc+XCYHDJkaQQR1A8Ecq3Y9Iw2nHPh2DFwfmLjAw9aSpCmDgPzB9WYtLfQtEKHm3XaH2E9CKTNZK5Vw/IKe1LwKKq1JZyKkzYkz24HxzYmhgchC3Cb4DFTdRZZ+E8ouxJ3BZRSIa2NFFCEBuOCG+AgymYplB3b8d23KmS7ncUp8lcXXVtA6zp0j0Gqv11xJWZB2KamFAqFFgrQGHiiV5WtT+AMDPeVv2/cQ1ERz0WzcxwZkOmjDmao/StVknGY12oHf0mEM3OagcdtHmrN9RcD6Wh8mIwmAqw1gF8dnsF1N26t55wEIB/qEqJdESzk3OkLIUW3/jGTZny6wDF86wx5IrHkAsRS/rpcYLZfXLZncPB8P9dAfmafO8k+nS7sMmL4K8WTNhmupBEZwB5z9HSIgqHf2W5YVhYJ8It47nxAZMpihOvIYW5X3HkWF45exLTPBylk5kg/X2MjgC+0Tt+2Ybzk5XLT6ijnenkZWaZ8Ms/YPsm4tKAajpoDLcFKw8zZWSmaC2vPw70zHTQV2GgA0pPNOid6dErV3gHUP5vxVXCaixjhFjOsveOaXHI2n8XDQjy0g272nYBq2ViqwNUDitxQZt1UpFGIHeklhrpcwsPoRDuLim7TyDUWKWcQk3Km8wwPccBw3VG8hMFJ9tB1AQBpoyNJce/3Tii263K/6kQfu7AgCfaEzzP+4P2XejeNjrzOsYib7MSJ305r7NME632RN3r+ujS3vGUHqDVeY4HvoG7apcqKkF9Wsyx4qCr4O5Bdv6FZ/opGOzD9tFPb2Q7A9j5UP5r67cIv63IHb9Br9r9N6zB5ROSSz1X2cPLwEJ+ta/lokjetnSLfEX8fFHlltCiOXfklPXsmt/nFj2xw+EOUOOGPcmLGcw+n3VFk+p4qPnYYTMmHT4s/aWxCPxfZ/IEg9HG3f94imIYmsr9KBDPBIRCDkfgNJED8DcXR8C1EyfDtsMpAIpjA0eTLrhj/0eWzf/6jNWlASJAQKUy+hdSh4gInxNEksqNTBIMUSqYgiv/QHO16fyyYRrLwtbkyhSUG+SXgdQSAPFJzKJM6I/P5KdkkOpq9ho8Pf6yzVm24S5k0Pi01e5DljMKExtulM5wcIRUaqQnXJygO0VumLtzmZocOr8RFbXoXATtvUTn1rkUauTOYfG/fuYlj6NWt6vllsyrxfIKT+WgUkd6iuKGSc5QP/AMDfeJ8asupjBL2dbcpPhk0gJpOm+Cdavwyn3N5J8EZdzptt8vVuVklz3fUbJaV4zB896AsL4o198kPo3XR1SHN1TMhdFVKnpHlFj7A7KrbWs0S3AK0ekNBCZm6o3Viojbnno4hjafxfgsVkEpaewIQe8pjgxul8EzErcNQDwFjs+QWoUX7pOMIUpNoez7KIe1tx4sQA7shuHcF67MeaCgDwDwd6TfFfKx5PvGWRSkdIkFk49I0YswxRrpVUIusNolFHAfPicVMHfEn0ZkUXh1bm9wQMckzf7I8xCrytUgCn35wOZXcQOfcMG5yG5hnetLcNDRWGSsGFkZb2WOM652rJMeRbuly9oFXOMKDyxjFI8ZFWVWr0IUHsHtdFIDkbHUaB0EXT4/A9WLuSrk6wkmv64UzG9dW/EWRuqS54RWFxzIMZgTCPpB8uYitBTCb0CktU03dk2rSznsI4tlPg5rnJGAIkXhzy5LaP+jbNBq3LESlaR2c5kXU3e2+rPBTQWHYsGH9UbDwOTrdHPS7VP6w2ayae8D99TnaPRiLsFxmO4v0Vt/xQK/0a5XVa3mLYA++Voc6i3+41H59k0axs7nRF6jRZ0X4J175kyvw/RD+XH0zL1XhqDHld6Ypg3KZ17Lj1wq7g/LRqrkptf+ew93fLzPMF6x1Z6OwvFWQB/OVXDI7wB3s89tX/vyld6Z0+cTXsD/743/60X1nx5djwuuY4At2UvXoj2nDY4qQPLdtHbfz4+9/NF3C+o/sCPslPDn+4jTx/EtQgv3pVxwMMDaZjlnR78hl3q0J2P1JsPRfJigwBCExAhJvWELC74YAbwFCxG8BnIL7EgJBwq9kH//Zn/69Hw0bMALG4JRM31ASi94QkgDfKPwQHEvxAKUQBE4j7Adig0gNgKWiLcXi6UaJVBATRZb1r6tbJ5SBgM2Ud2vfQS71qFTRgcpeK5/NPVikfnwWqVheL870kjWMaYYmhoUQiK8PT+eutkI0WaSlp/PUPZ4WmXijjyMOPhkX8JxSuJ6Ps7ciss3eJGVHYNHMWDb0b0+hVc9ojsqUFEx9suQ7BD2JUKhjL2eBs/C4TFo8ELmXgMYGZK2htf1l3LpkZR3iVVd5CVdogXl2Y+Ov1U+4qAcG2GlReHz6LdacTlVTOcRQVlja2a1zO5fXu/zAifBF5gvUR+blsfjQlQQ2c+M8cOBS7bp2IjIEm+5OJDC0QQoqWp7IbVjXZF5JsCGS9abWnnFKmNV9BF6h8lj/dO6ttJ+yUbrYzNniWbWtC0U2VnOOrytaPWEAeBhKVT5VKgSh24t7qaaQ3Lw9KtbY6j1PWA3PZ/nkePWrtK/F41H7eGgkd1EkFUa77ZzusSPFTbrr9UkR7lkwCQ7s93Yi4wzRQJCFDlMrJilchdxEkm2oRWcMr32exOTQGNzgWhBnjXJ37hfB8ckebPhaCCaxGAorIZBLYBQqMssYKtmwPYYFqlYeQPjNt3q9uBlmJQQwGnRKIGoVut3atSJ6ujWlerGeCCbSJxvxhmxbn1cUOb1KlX6CItA+dTTlAYEFr2lQPieBVuaZN+y2yK/YK3WRdM1tkUsajyOJsCOpG3edBhgjvwtpYe+ofLRl//oGvmKPoZUviKsqcKu3ZeAhkuyZdSGz1So3HKQejYDmN9bmmDGv/7QxAdZzuZSxHQ8KxdxJFFstfnP0ZeSVAsuwajL7Ne/34qgEfTfTOfoX9vecQ80rz73tqGGi9+vQK6XMK3XHTNnMvjUm/JX3WpdfMlbP2/lDXmT5e29cFOzkI6jr96mw8GgoeKckB1Yciz9nKZ9IB7iv9F5FEtZtVPV/+IH/wjpF/yGo+/ajYH8Sf8HO7xdk5fuBy9/aF/FJ8H3V+r+uw/xf5Dn6XZ//I/S8V4t+vuirmpNESiBpcJigU8nOVgLojSIOG1ok2WNITOAI8mUxr//gf0L6H61rjgjIBA6T8C3FAvBtpy7wjkiHgn+cEhgZoyQE/9D5MPbZyiezH5fKiGY3huIBRYFCnROCy9PofgZyRkxu00NJN5odVg+r8ZsimGxAUKECPckXe84BJ7Tqq9YJPcrqC+pYSUbQGRY0CDClaSiCJP6yfLrNtkjehJsdRGBRQ5eigcRW6gQGiRQBdCQtQ/JHho4UPsGNiPetbEcDBHJeTIou84IXUVT43rj70XwFktNi23mXpKSphrYZV+zMyQaNpgDqI3NxSgmR7T2CEwShm7kTeh2drKXq8Vl1WJ+cqaSO41y7aZNSgNp0mUvJajO71/ehtG4WL+n2QjqR9S/oGE8Y5Vez8gjmqncFg6xjqAD3cfgJXbunLFTWSZcsEF6VAcKVEUYfhS+S4oJjABVC1o21iBiP+vBlSVR5cZGhDAau9IKhutMBs1Qp6thmwA3BUI4oZzUrBOwkGWR4zVytYL71sA+HPd6eZovfUsFiyvsmn31Wq/aIPdTiXWnGVncbMA6QcmCXl/rqL8li3YxL2A0WCjyvQA7MseniWYFCWpGGS+j3LJRdKSWmLKtXCvp+kuKgrwmi1itm2aMWDrgGLBNTtgp3eHaLhjLPzo1UbKjaQpO6tOuitBAAKdX+xNCd6O3AWQsKysrMmRiBp02WoqAFVAZHrKB3aii7KzAWZ6Qx80CaXmPGMqgal6eeD+jwjuNnqlzPS8zHIYIQPcYx7oBc1bPY2u4t8zv8jn6r+TDvfUStmofArgh/TRptlre4Vrb7rBw6imUFqqa4qPsXyS+Z2neujeeI+2hdKb+hT0F2QT51aop3oWv600YmDt3R5HBarw57NsWM5qNL0GtExGf5xjcPG7tskct6R6EMk1kOUdkdgYQ7qhxO7TvS+86BThZy6HHud3pHcfkvxCTnNw/+QewQ0f1C/+QPP+KeGg5B8UjiD/F49IZ/sqFJYBCGD6Sh6yhPmqIfjmTYUez50db0yGX1R53H3zzyfXHx7j/zb0IgRnxvEPvb+yLhcBr4YDzbtvruQPYbP/tLH2sp/+r/+Rs/+6vJx5PaWd/vfSrlEPQdtz4zNFWVvgpdUYwjSRiDb1ECHzqUCPZGYelR2YEjII7vEQb6Mpn6T/773yt+NLnkADxqMFPwjYAI6g2B8eAtoIL0LSBJPIDhNIWJH6qGYrWS+GDVPe4rhFOYXIXT7CJW8DhPiMWbLku2hN+91HmLEnpu7PoJMYYAr48wIbL1esYFmxjCZpic8V5al0cbGTM8MvFoA3Ch5S+01dSJodQd3KK79trura48kSJ3Z6F8jRKInmJ8XCAevJxPy4V1T9yFOVNqkDbuc1AFq9Ws8jmGklhJiF2ozK15Pk43BFu5azSESjjWXtZfchOllzKGo5OKvLIeSiTHCH0hiZKT+KKIFCkgvJadJSkeSvO6XELJYSH+RDerN4ivFIw5/WUu0Jbc/Wd11wL42T4ncG0poQhRfIGDvuhIcLG7p/rcn9ShPOG3a5hfwlfDpqNCC2Q68dKQ2xx5uwRqWwLEFZrzaOvD812SFCVCRN69zpgdQDcJ3yYgmi91XrAVY1Xouul09CDAfHHQguH1XEGmh2TLIdIY1/OaPF99md03i1m5G7JD8gNWxatDYj3X45TxpLytW3W4WCWBPqtrq3Kt8jShSrxGba0qpKIJYKvhxBlUoKSCMzl/2c0l3dDGerRTCXi1nxaQH6F8UkK9dSqvV0ZzBEFELNfigIblRh2maOLpz7Lkb+tUngtvM3Z+aOEVfAH4bWZQOX2kHQU+HkU+lo0iZM20dZod65Qpt5GuF5R9bZdWD6few10UwyP4GjLnk4/J+9fprOow0tTpLZ44IH2az2zCN83xwAIU+3lantGN575Tou3wYN9J0a+Hrs0zlUbZ8sNpdPHL+w5dde2VHKaUdeNtdaWa3OwL3vwNvu1HMeS+XN9f8U9ce1/PVcEuvcP/br9PfiMeepuLIhzalPwO2Ycssl55hwtpaaGKWe2E9Cht8WbFFI+E5CaXeSGXxywRve2ECvEb+Tsk2r55Mudf/6Kt2ldnbb4fhhwY9cmo7UfmQX/r5xpbgi6yXxTa+hu+KjPir5KTTFAqhXHsLT6srFEEJt6oBKd2XIFShKIgAvlK1/byP2T/648GKTGeojAUgm8wiMZvCBnjbyRFhG8RRMUQhaQ4lfzQuRuWAR/SqRhcg87lc/+EUo/txposh4IFt7PSm9pkhagaAqnKXPgXsHE3W0Ia1V2Kq6Xw3fwAHmXBml7ZBip2d3gdWIZHt9H57V4vdVpdGiE3CsmeHh33OmcGZVGWVAEWtNxmUWpagCDr6FpBfYvXEdsP5wZ0SFwSoMg3cLgVAtwz1dYWpj7fCiWdXH5srYF95vDDiBmvWTmPvQkM1q+9DtzwNlEaT0cneqompDBGIigvz/MQ5oDCnOWaaKuOHWJklkl9p2KlXcAwx2exWZ2Fx9jWyhUQJThFqnPReIKuSqV+p8GrCktAu9MZbgE6uadm/twSES0NWvZgQjUWxTJWeQV1H8hNB5GU0IqrUzYrceUTHSejrmyuhYQCyssizkAQshuYymFddXQWoTZkL68empWRIVsf3VwjQ+knPNQhBXTI0F4N4MbBMJZvoEhdVmTkufTmNESuPzFzDzHCsD2B7hznyw57rSVOnN7ghDjwUU8q1xhLHxSFLpWPJDQ1MylLOBANnGyNiJ6doC66toFgaI+2h803pIgsRlDOcKrHAuIOMTBBw+OWKdv1ugOedxtbvCywRO1QtYUmmZ5MHpKie3mFfY28+ZP0ENonarFFzEded3p2cf16eaCm7l+EZCWA0H0+EAwxuvJ1cgUa4TdmilxIzJz6NGBO7Y8hYaODJZPYqTX4IPBDZeZHUMfnbyVt/C6wBcqlvBzSu1+Xn1O2nQnsn/++zWHgDHqbX+4whPhmNh8iVPtoH9q/SrP8DdWBnoNVnqW0noOuvyhA+ClWB1KNf8hHHuJjh1zxtkNmoze+I6J+w9equUNNWdeKY9eHufe70r5zP2xecmXbGSJLz94hg7xDsVe+379GaWTou0kb/+6n+ZujIuyQAPm8C/t33302PxcG+VS/Dv7djwohhLkDUD42weND2Mbrh2fXfgQm+A350BwTPztNOLzOup0FhXXbxh+ipK7fdY4/GNxZVdg//Kir9U0aIt+f+DDvh2XbR/u9Mnjv/Ia5qSr7Gasq6q9KzWFJiqIY+AbGGLyDEbbjEAntTAPBEgRG0cPP8ss+1v9P8PajgREUgTB6SIjA6A6GCBIQb2EYUG8wEhEQliZQAP5QCZEnsZaryhhbXQoo1L5ahly0jbyChl6qmeo+xPr+AAY5GRLCIiocv3LAprgXRgiCW8S726V0Xg7stYgBvSTvGP1AXp+jUySh7PNCbyJHgElkIeQE0vcJNGsRuzgecVaqqWNLJmef3bnA2fNcArkwUacGA7mT9bQnvsDTSwagLlF4YAdfb/aaDjp1p/mnuCCa8mzJk1UX+saJXYaPK+lGJ8azBR5V4pvDE931ymFSGWJTTz2H3DCZZgHX0iM77Co97LMDzeSDuyXnW3YScmsNk4ZwcT/F0aK8917PphW9uncwMO7dUtKaD5nk+UK4xeqk6nKSvAePRNKDvMzDMwTa9vkgg8zKjAuDpsEg4fk09XqQjXmlXLlcB/y5PtF9OM5LXPWy2dT78N+BWdLE7rJsgCftPJmaYhqjnUW2cM159rRHgucl5xbxQpwfPSlA7q1dir6OSfcJ6ZRrclrP0tmpA3hRQZaik0RXLUYHBvwUbZDIZTuRtLMtv9n6BTqp7jWc9iGsi9wkFx5o4mw5r8skCi/GCl947FWduD8CtfZow0t5U1uNlHLuUdfQrapRZeSyUSpsXhytGxxR2iuGzJ6huw64XFU8pR1yB7CFAABaPYV6MomqTw2rnZCYUqc236NST52x2UM0tvASx4w8LXl4OU5jlwJnhnPQd/I6RYDe85z6Gluf0RK17q583/BA6n5hsuh/+xp+g+1j9u2oXlNKGfz1qblDL/4+y9v9kNOAPDMDfTaaVZavFGfnPUfVF3s0NV+bb9A2Zna+gsY/dX19Z79eQVyUTYQ8h0MV57o/qdkiC/cdYKLNazzEg++IIuiFDN8xn813juct3qaX/gFQ5tHsfjhuctghz6LASvkXUaL+sRjByZNHMu04c8w1vTc9h8XQ/8GH7KPSfnDoXh1A9m/sv/fVo3eHzaOW+33duB137Pm9702X/uaBPPvxvo+8yAE5v8WIpvFV0RAyiEg8TsC3JIyTNzQkwzcS3nkIBacpGWFwQGHIlwsT/sf/9//4d38srEFiKkKCBH2DY5g81PPxNyomkLeIgJND9RiHgugHYk2k5ZeMA/PTK2CzUzoZPE21gjeKFSJK1+2MaC5w85XhrgDGwL1uILvMffHAfa3p7k0Zk4LBsONgIVN+AcfEvRKvebkxSiRzqryEStw75iL5j6s4S1z34Bg1zJimkzRioqhZYIA16nnyatC+rss3z251FEtyNJ2JOHmIFSnIFz+H7P4yhDglp4Oo9r1c4qforI1qFp8IZouStnki0eNEJVDXzijqoWm4XWbTWU36Cc2BRsfn0s3HDXuZ6tVGwpUgkuBShWNglOW13JE719b9WZUOIXlnC6onBpl4YXsv/swGCrdcBllHwrm+15e8IqINoArRrBWejTmGvzS+ZFGePrWcZHOCV78IcyHVm70o8oarQrE8W2mZaYTj+jN3QsaztZ4u8f1GApyukgRDK0ir2s31bA15apqwP+g9zJyiCkUyrr3iAcG2orpetPhiyXouj68GwVLgnp5VDXq5g7U8CYGSS93SYKCI9OXMNKamh4/JsDzNcYCJaRd/JZ+eRD3BBpw6pFwItaQWHhCj+YVBYcj0Vo/5V5MpCGmhw/sZetE2pMJV/GDyqKArj3+sbDBdjSo9z7JQRbbxBJD+xVkXbVlP4TQrTn56wGc3iD3I6TzuNcbFZegZP6xYkVhvhszfcZp9ZjLm+DHE4oR3A4zqRFldiT1Dftu/XduywdpQDuoFXQBd7/bbwHrjyDXrxn078cRFLvdYaFrojjnIr7ceEze/kZFj4H8M+A9c8g6LLfOw4aqL9zzbe3uyX3+DeKLvO0sdCNxPuqL6XRQS5g6ByEo+lIO3DDlIjNfYhS/cIbnZsYTVK2Wzc6Xhlv09RHWs1Svz8mgvU8p9O1ZcDi8XfyeV/tE+9R0qqv/KO7ExuzH5wCZp8uiTX8hOfXOG7aM2L/He6vN5gu0H5td+552q7Pv7vojx28yN9rmvQgYR4iGRhNgbgiLgG5qm4BuJhukbBO5jroRCojT5shj9f/Zf/t//849WORCEJA6HOPgWBPF+EgEavwURtf9JIGEQRgmE/mAx+poXjPBOB4+Wn7ReEON9TEcZvqTMKpUyLrWVLowJ9ktJzdfKBQXlt1D2wlXc0qKJpM0aVHha45zEXS5REwNgOsI3AnBBAHXI52OdL7dEKrCdUzNIiql9Pq5qpbqNd7UsK8hXakzzmAdowgvEYYE5mBXTsymiEbzVGYkM0ZCcenm98Fu3RZBF9wO2ir3YV8KtcopJfvKYO3sTN6x+vINLVi0qcrZ71fBCpGJQQ5Z8seVw8ywL5MjW5cNGWnKkqJckXfxpOClSivP6ZL5k+3RZLMVy+C15TD30WHpiHYW1uiUiOBpZZVyQCmSLa8ddglnO5mXjtxPG94ziaBFK21TuViDtGrHSKVZ9xXX7MMeWSbO3a/Hx4NEERk6+Bzc7B2aYcayW57ifuMCCQhwvTi1NCx5WcTinKSx1/dSSmiDbJrLm+B7CHmvY5/uHdqkYMqX4nejpUQ0Z2CmXVmfKnfMLC5RXzYQp2l5E71Skbns1XW3ySmeGpbu8eNrptt01/RW13aQ/IL+FL1iMXdMJ1iwdfyGZ1FJi+HhRaW3fWJTR0I02mivd+1w/XZ+Gc/UhcIsFCGGBbH8S+5YaAzdUUnx0N8jbr4EVXZRS1juCIGwfMnI4aDyfSq5XcZt2wdk97DwNvcaClTZb6nXWT555ppjQMd369rwROndu9NsMtQrWCkHju3uQa+fn2VPAkKm+1fSLdejsouoxdbDDwNd00h6C6uihsyQ7R7ONBR5WJKop7kN0u96H7YiyZfBhMeJ9Az0JL8qkCwr4E9egaOTDwvmwOnaUYocISDHz3IOtVYH5HTa4naYwhQKLqLxTNHnzK/moomDjXGWr2dsp3GHX4h01cKW4HXkyVeDg75In+40vC0BgPyjgv+/o+2alftvQOI79aj4KJHaKEOPpGwhHR6lYvMdaiqTe9qcKCeIIj6AA/krxcgX+aJK2IBUFBAZFbwlBQG8IBO30hITBNwLGKWjnLnBI/VCOIGwJXjgh7yc37GY2RRILXVIZsqNtOM/ktxHdggznM32dhnETOjaUBXtrn2vtTqNDb+5QnCLGqDQiph1OEFNPi4ydLlK54Kr9oK13D7iwi4e2Yaow4swU63qNydOgh2bIJqqowus2Da+wdbX9y9rl/h6ucd7KE8WmhessasQpi5oTnsrOTNRzZp3b/C63zgNlrfvAmKkzvLzXALN8QLfB4E6vexuF6wsPpbjtQ7UEn+Dp2Xfn623JOZdc9WfGbGMSBq/sisonNqatYUWZJXFFF0jqTe6b7rz1YN+j4WV5EawFSydd2UI/mxrgKqxmhVArhvjRtrko0MY5fy68el4uTr3lbnmtNuMkPcF7eW3rE7Qgk9jMzCbZbUsTDpAUArMg/O1i3icW6bVxk6CZTUm20kAW4sJVKK8Xt1fRuxOjftEQ5UtOb5LeEZ2VLnKcjDsKPfjzawRnIfFrqc4QJTZTQFlwVSSY1B+0IJhvwPXBW5TaTgFSJb0R3iDhdC4bjxTUxSERcewDRkiKkCif2Qq71b0wnYK7xMzDCKtnnFnppoX4/Xqfbk1xZhENZcVJueZ3bkEViLyWrHJhFHUjdaSlZtYhtkzz7/2LAVcMy1ANdcW2xPXyXNTLy1NctncnFHtYT76QdQdciQSx4cUpufKWeFi/JXHWe4v6ai0arcs8993WYBdzILctXIpujr+TpO170BehrxFYB33nfoDCHrz4XG4s8CiZ8ky79o4yMdhv9iCIKmz1TY0twsEBvEe9+myG/qTn27d3n8vcd3bO0tz3IJ43yiYuCku/e2kp7LH8mI/Pdv50bRThYwmZstGQzx42xiKoCPd3v0yv8Xa+we1g8V0kbb+i+PPRB+RWVMmH4IMehGEx/H7/gW/b4Q8+7EH7XTvg0Kgjxj6pk77/XGXg12v2fD8A+a19kVZkn479HcHjX9BEwfiMV9Vf4AaBRFgUI9AbCGHEThSiYB+yR8gbBCcgHkJJjIPJl3HjZ/+a/KNJ7hD7ERAshd5SEj2MOXYEowIofcOSIImJHTvI+IcK0t6kDsdO3q1JdRxBBlFyO8Aw030En9Lz5EZdgl53Hqz73TW2qBxXbPxOQT4Y3NH5en/Cip3a2tyOtiQGlT4YHB31tA9dXqerHxYnRYXPT12E6Nvij4C12vfrTZF0RtCE27ToRSudZpiBF1TY40brKcbWbyjf1bGEwXw4iJDn6R19UgPmxsJVgJ6jMfS4Fzm//NfdZlqv6jO2h6VL6D9PznVjQH7BkOgS8Dz+gi8MyamNBb8Mpb5o3KVUOSqotNGNzWd30doBDCR6C0BT1PG51Ud6jh8XYxz4CxyHXVWWKJUNSPvY3MUqL7LdXGyxbdkt6eYrO0H7f05hEKWwOYJNZjqM0ESPhsX1W6YxydLTZemlBnU7kRhAOY280hurJrhVbtnWbnwCltdzusU0v4QqwwmwUfLz2dyAuTVOt1Zdqnuz2I58Zu9epj85yAPuQngq/ZAx6MWV1/2yJlW2JlNLKALtMwwuHvzjcoJpoWoqtEpPFQjlVTWNHeQTkhNeRfYceEl6J21OUgnt1fl5LXsVr4MLZuLXpZe2Tu1jV0e6fJRVDzPkF1quTzeY3FOMn05UAt6oYXRdvIDDdT707G+KFRd4kyVncL2nVwF42SdVGQUs1706R65V1HRsnHnOi4sxDdNJlGowJZyWLRUiSXzqTdTeTnb17MexhV4p9jRLaU4AaGutiaQqcHUr28EZ7tv5BWPKZqHHPIRSivPXeTQqZgV6W1zIRz7J4UCljBCVjcADM1RHqeVN3snCDmVfTxQUz71ugQDVobBM+yD6p51jEvwDFyvvaGBxPEg1j2vkG88UN2+rQL+RYfUoRmCr5b2hdIuWw7zDM/lS2e6IXCr1e2Nkyc3+TjqUxm6875Bj+stfdPYNPuy/Pyqr4gCM/dk//scf+KBrjobFPzh01z56KB6ppz24Dp+XDP/pnyTXIGrDI8h/Wvu392Xn9rHH9+EHd7bQj2II9n1/XwZCK6JJf5WBECiCUyiEvSUQgryhO6i8USBIvpEhgkIgjkEY/OWU0z/8589//0ebpYhTIsZRInwLIBh+Q4hgZyAEjL3t8JKkYQQRcPJDLZ5Kexy9O9vfm8pmpX65CgyBwGOfg7PJbYF5lq8gE5d5NrP30x2+nOZGPrmFO3uFndxqL4PpYG3SQfeM5Wrpbs/eL/oN9H3SEqGk4uLIzy72eCEhdsijYrkyfW9kw2tYFYUyA5XdR6zFcF9Htp412SXZVNqHGhT7KqLWscqiwKaj+sBa3SDUbz0lpQsKnqBsrV6wsXiaiRijAd2tGwCp7QgOrzg8MUuoTZl2Ce53Mj7dztPdEi5+2LDMAA4XF6e3B3U/Is1J3mYnFAEsaAto7HVyxEjoWeBPkVrvRL6Ssdt1GuU+t+tLm23iWdK5otgrXe9cBdbzmiKeskPj9c3gu6dg4NE63jB4DaTuOa3Q5IxDmJXITUhY4GSc3TEXwAYTL6uPvrJ9kKljAkvCrr0PUBvk+pSMHeMe7IpiYuJNzh7tGlRvQVg4sdBOds4lIKiSMRTjiNsvi4AQMbZDQA+mp8IzM26Sm5Vrw6kIxQcPMWrNRhQcr92SLhfQHHtrH3qaJnYbrPnpGbSYVM8o2kfrJzF+VH4h+EX7EqOrTZeRZD03zHfyCko87WVYlhHEN0aliFZQnY65R1bBcw8bDlJmMsx7RPSL5AuPU+xkbGdyilnSGHZ+KO6iEUnpPk10VBIkz9R9xI4sYBMaw2u+t+DVgKaphsjQguHVLeBJIURiim/lUzWwLcrgOLDDfL9NiI9+oVnln34tkpQVqJj0/sqWr2mtB99H3oIMKWwEeY0MeuWO1aYFqoJysA/YK5naK+PqG5DEDJDa8B2+D21lDhy7992fNpr4h6vvoQHDVqu38YVnMkfLPbIzsMUvs8P6qvSFw2yELz0zw/b3tv1ezftrv6dxLm8iKB8aMCUNe5td7PcOUr4DmvzWgROf7J7aTyrgOyERgi5OHvs7X5jZDsc0fceeOHkmj/gAks+Vu8euO9zljWpljj7Kn/21A3CSoD/E0H7nICR/9k/+5Nit8Xy3MwQ+7D+/ALGvYNfn3r/vSPSF7RNjbJqk+9nf+/L2CACDh/b359t/lP3++ebBn/2T//Y4Cj0OY/P42R9+2vxP/wTWdqjo3+HxGcyPTxXNH94l0rv9hqRD8stXEDrFIUH+8zOwi74Y2q7/kBVT8nG+5udbn9vn89Al+L5Q+q8cUDo0bX+YUxXRB76oh+/uUkWbsmoc5lTi+TNevJlfcKkiEhKFEQp5i0Nkp2ZxjL4FSAq+RTEeUzC+07Ov1Dv/w//rP+w+/GjULITD/dDBWxzgyBtCxdgbhSfUGxbvzAwDYYpK0B8IqHSbvFxwaiml6CBrY0xhMpGLOZ3Fha5gPWSarRmHlxVE8KxXAGWWc+gmQGuUeeesiTTE+XVUT424JTqegulGTfSdGRT46cFUWyZaYTmgoBWKbJ1OBPwYZJN3Ck+gOzv3VAZYPMIHzqjWugrFKaHi5pfhGakT3YXxIkP6QuJA0DkBx9Qh6Jc5W8Nzal6EC9TM7mOG8QjnxVhSlXuTKsbFGPCHXKdUJQOvJToRqHWfSB9+Xg2KrAErlU5cVLNW6eM2GXpnI8d0bLU1tXvglybiw4DbKYpD70Tzda+dFsDrkq5f7gN4UU1jeQF438xq8KUg7nG/uF/nHjXzoTBNKhNtBkSAXle17AQRIzBvbb5GHAlVdLT0pFbnirZcs1NiRfB6UfhnYzEGSW8jGCPS8+bCOyPmb2bnZ+wLbFri9rwl0fl893ImBFOCDFvlNUYsppyC8yV3A1ejBki2WOasgQpcPUQWUql4VBGTCPwzxkT1a1khUSNXvZXO2MvTryrbzCSDxHDfWyNfuq8EAcnX9bXdpDgElNzW2x6yAe1y3i5p5e+nZ8Gzy2PONnvVGEalmJzPN8YpJWs0pkuBB8JleOXjxJqw5KmZLqgTktsyg8Fu0XN1u+LeAt6qycKpjVwlJtKJRy9CD8DtZkEIJITMvTugLiB1J7EXtL2AQm1EjA9JyNlAbPBiKbXj+F6xN+z+rUrMPtY778H/0AjHfn0LzbXxWXF+d2piDx3xHWC3bDmMdVVH3PySw7wtQj14pydfD6g7iCmPn3QqD5b3+3HfaehRMndo9DCFvNGYvOXNMfDwth0wD0+U7brTVD5XhJ2clhbswXdIgeWd6iqVKuzAW9LIkQr0jwFHGf0FdX0eDZvCRyuNoyD6Hbv++D//vJjgHY//9E+iQy7UGHbIzYb8WPbeGvpRWi38shXjL3luhDsH3CH+mCUi8kODrd8BtX0k8YFSx7Gdtqv6jzJwH6XUDuU3I0qe+9E+HZ1yimHflRz01fux/86nY3/sQw2Y/RBaMnxyFP5+yPe7R9XC+366fQjxfXnk32Jo8zON0w1V+RW9PiEFIQkCvR09P28oGkFvFIxRbwFG4mSCoxRFfVn54I/+0R/9ez9a/QKKkiFMBcgbFIPhG4JRxOGYdaRFoxgNoCCmyOQHYl/S0Xsw33zGfORiBjSSXU1Vv6Zw37l1kUb56tX1BQKnOT9VpCudvPSMsncvEkVZL18teIdwqp7blLQuSaahuDGFTHhGE8m+0yVVLL7FYnHQZZnhQ/vth5fKFkCOe/VnA3oOYfkybjKMhkF/1VjTW6ILpd1vC21j8ExpacZQrCYLp76ZdZ4bhpfcaCMqXSyBK5+odRZ6/gwZ3ITWjn0NXJZ9PFF+Rvfn2sgs/hbdKckqlgeYRhYfJiNzMZdHdXHjnfKuBDmDVvDkbzTFgTwu+Ux0a9CRrgl7eM5L86B7OL8ZcxX6HVRt4hViHw1J6izl4gz6onzKe3FDgeDyhqwTVb8uodg9JGt6PRotYzK7yfP7+VpL52t/d5ktDnpITljzwr5QTZUpmg8kYX7cALpNa6O1EAm9FHeCXyNUvsAQSIECuJNflpig/gTSj8szqQNY4q319oyphVejIGaQ+tRYFVIsLLPGDdUP1KVyES4V9QeQgZaVETLcJuexYFXamg+PkihJl2ATvHXo2epOD4m4lRbmPWq2s/I8sMHId9J7iq7qgs49UVOSCOuFjfB3HZJSE7xeoPYKefWaYGaOc25fNoPZ59crTRpuvsCKn27lTlfX1Nr4HvBv+Mue6Vc6kbp4ahdewJHtymsWGEsWJOWQVaGXDS8Ix0sg5c68+HtzQmDzpI8vf0nY7Nk8RFWmse/WPlphR0rx13tpXHNl40vFvGPyHs8VkwN9Nju8s4r3ttGjB2Z/eYfI6NcrHzDRhen9nYTupPQnTSIVZyd9h9rDTg4Pj2T/HfeupW9Gi3+Igr6X/h3qD9dKZZnCZ62dYO/rHX5ajrK/7Fw2d5JZ+o1vijv59LDvVr/wt99NKZoDX75oTfX96xgO+bXLRxur7yO/drH2z/1L8msoRJEomMRvAYEGb2gYx3vITaI3CkXRIMEpFIa/bBH/R//VX/7ffzS6g6BpCAcU9ZZECfmGQEj0FqQJ8paSOBbBIEEFP1h+rRPqVfajk/mA7LBdE0SKaPakWD0zdT2X3CNkMZlTSvoCU4ZbSuBFpsQ0nYp8zTLGU7ij/lk9T6A7PF0tsaQigU0UMDNVvwPGS1jiG4C/VJvq9fkC3dKY53IIs/NC78/bnGXu7cYZ/slEGpp6Uq15qaKmMIctkK7tlS0ncIEvt9ZNZdwtUl2NxSeE8K3dOib/fAX1AoKhYD78V4IPuYQt9a3PnxJHvHwa38fcewBcpojZNmS6uMKYNdrNgdgUfc3+9aydXbhyUYFDxcnqJnrz94c7EmoscaH6areeQtw9OKrr89p3YrNA2u3GpmpO9lh9v+S5bsxU64EjkdXwEwPKE9oN58I1EajfzDrv6BWUKn5yQysEG/1RTUESeWl9ljgTQCMdz9lXnYzVmlWgjgsOlydBrxB6gT3F2rtfT2cv9Wo1Htz7ycFD/dXSpbJoEQfLFeboBFy/ztxdKe/uuvrQzeY7kbytIM+JS7FjjMEyPBR6KTjcmmtf5tlJWee5ydtiwRnYD0xzXJDbAvtaWb7oyQyjGzA7bF5bOPOam2aYKzeyCeihTLxraQ78EAJ3MjqfuCSk9Yq7m1CwDDv4dA6WvmcQSYiSxqCfCiGOAP+ie26UGvvIdtaj+2k0XSqfX3PwcpIedU3svlPC/ViDclMjwOhxJVLR8901YnFAcUwNdcATDMf0ACZ7RNAZdghD/lYzURa2h/w93O+wud3RrzN/kA8j3lJEvUZefDYCVTbDPMebfTODlZI/7IQwpeFz7+tDvnKEWQsenmFNTVHz0w77suPvlCYvFfgQ85GRYyZOOSieKR/qAe+zcPu9gA/jC7mR0cNm0iuPds/DJsmDPLNCFZhb/cNWyYyQ/TeknL997vA3fvavHiI1RX94CH34YjUD+L3j/t85lNH2PX6g07R4HO6C36Nw+et0AX5TVpnPbu8VCgdS/C4vGpfPaJ4XFdH0vlrnDGMYlBx+tmRwlC8QKfIWgjD2FiBYHIMYhUYx+SXQ+Ae/9c+in/14bZgxBUEg+pZi0Q4aBB69kSlFvgUBDiMYhKNI+kMnndzL1bkqMFAwlaQjeEbqevLYpHvglhVz6mw9wiH9IajsfWsYIsfv2sKYzwfca0zCGmdBRh7mNKpkSLYlrHhj164BByjaBqnPPH+lwZkhXs5485jHGJqmTsRnDaZeL0DKAxcdwlM3rr6RKNHJqFMFRhFYpWWwzmFqYPUWVXkpKG1qCOQ4N8I8CCVXg/jUhe4TM8AFOCKSFcCFf0YECVce18lTVRSw+kbiW0i7s0hI6jwWYeONM52K70FhiJKbOwHxWXHriEZn5SpZ7oWR0EMwQkVwk6wjIY1H686brISobImAOivReBR0KUPgqoaX0+RIoIZaCHzBVRtcxkkMEtmLT8+iNhIVjlS7AqmwGdgJtLQlWQFlppvzjNQ8NMqr/5Jaw0RgHjSyobs7D2q8Wc/ewOmpAUSMBbK75F3d1+vOzU3lSZuLMPeWzndmeOVFBi2B+ISm/v55ZTfl5uqjuskuHYB4mbZXyugYaZYCLWBR5HQJTifagYI+CLNiDKj0xYUZEF2WJGn6y4mufXID1EdRit12j/h04M4rMmOzXOS9bQmUJYVNpt/sFMicqughTpPZ+to4G4FrXndR4eaR3W+IW2DRCfQdm7uSWJ7nBHjXMyLRHvooSLR3tZKMwp17lSL3MWMAY0g8gNqUQBXFKE9vKkbCF4eK0TFRilBSXtv1VvKv9nV6BbFEEERb++y3Aw0PUfdgtgPG0SiIfB1POFS+/IY7anZz+X3SyYK9o/lws/agaed7wDwmJjfl61tjltix6/BxaAJgzxj+abfIKLC3yaY8K6yH7qCxAyWT76CBHC2a8qHTbCq1Kij7tVur0ojQzrdzr4xzn42rj/I7O/8yr40My9D/x9yb/Eyvt+lBn9QJrZDuBEIiohDgRajVaaqf9jyxIS7b5bLLc3kom8WR53mocrk8LECQIJBASEjJgmEVCQUQi/wHSFnBAoTEgiVKKwgpYs0CKYifn/ec7wzf953pPa0+i3d4qlxVLj9V93Vf93Bd4Phm1/ZUrz9kfOFf/PWggX1Ek691cL4Yjvsqznz9nh+LM395b67kADzavv+xBaZ/nhVZa1dA/9XyEg6iIQHTyFtMY7vUMwIAhEjDt4TAEYqISJzE4W/Axn/0f/4l4ScrL2ERgSQMDBhGmMJvGI1kbzTFxG8xAU6FjgiGQT61taJNk7ChQ4AiPexIfNYsTLeeGsSADGxFu6MteSW/qr0eBiCjDo2DGdrPaTiZhBEcBbZxw1R5HBX48kAvWMo6JHGWkka4ldax5ZZSOGBGigcHzDrYBiL6CxsEzMHLy3xLFihdojKt0rK/Vb5Yr88EfU0OXTgRaZ28WWXiGbVd+KE4fJLP+erDd1gQSpDSo6/8PhGaPE1wY80JpbuEJzSnDICAtjZD0J1a8dbVp8ayK7FN1wgKQxg/Qjc0MvugSIflytdIgiXPdoyk7TUdscvGtfRyLwlCIacWl8h15YnsQc6zHN9urbDSB/hWry8sNGHk9OhS5xVW156ms6nqr7wyY6Ekl+P9IjFqDyHOkh8ZIQznUDU8NThAR3gjXQCmyBXuhKTElMBA2liPUMPnHkq3pmZHwDpkIDEDgWurvXiYPjwKO0AK5Xk5xcqrNKa5GOshOtdudC8YEONrTbfbrHOIVmOqpjqtRXf3D4l1MlKuS0yONVCoyNt+uEXz5TBUj/5UDhC5xDp6K0yPkI1NpbnU6Z8dpWWitNL4I2oPHYk/sVvTGeu4HaxyVZ8Jt1UJS9MO+/JfjpjJEs+2/Q0qO5HvKlbBbM88PEm94eczgd5TKojyQo8e/hmlaBs/OvxF3gxh9IeJJFg7EYXLMqD6sdYfExtP65XLBh+uyVVem6Kzu4LN1dcEGId2EfprHEzclH8JG//4W2cVeAHkzdKuUPYtrRUJf5e259nNt4VVrRw4aE/1btWq2/7ieyAk7mUncMx3zCoEiUcUkVevX05V/yzXYwrNPjUg5JeqZzW6DTiGrcLq5uAALjcfNVd/ayqN39df/Hn3qlFbAd1FRlURPA7wDU2UAbwGreYB0KjqOfhTEtX8M++GNF/qRn8+7MB8o6Py4ZfNlL338os/AP9+2X/5fC3zsDdLvqrAyYfrj+/0v3sNhOsH7rECNGh+sNcA63/GWf4VkJcveUsaYdluUEYRIQCgNMYAZUmoNxKPAWOIMQonom+OXf+3//tf/MnkY+gMhokwit5SOEr3/ga+y2MCFIxQFMuSOKPITwagS2V3IXRW8JA/ZumTo7k7CG7hJNvINUO0s0B2zanIC68V23btZu0pQ9Olcv3S0+BzUUFK8xKCU4UzYZTercy1GUZ5qdo2YQ93uNavg8KMbu9eoiW7afUAP8aMhWnKa47cYasZviVo314RgoqR/C4eZ646CeflRNFdzsTy3a2Q6ICGEnRvkCGbVQIr62MJIdxa4INoEUxCdDi3QklTX11FqgpXKSFCWLSebWXLh82n3t0XJTO6B6w5UBCCEA9naioT0nJVX/awEKe+98RCho/Qy6dAZuaUHHrx/dMRvisQnwKSGmJZz64GurikfdWpLrzRxD0HZI7oboeQXs41E45BcbdI4pLxeHom0bWdK+/uJNw6vc4I65vJc9Rv8gM/gJC8SU31WOGj5CzcZKHu9tJfyvXsRSvhwbh7iG74o+CYi99a4eF2dQYEVlmUKRjIn7bj2bmEBHnrHilbTPWBYTYvTQ9EjE1uebM7P2/lons4WKG323Qm7ucrh626c1+kEfH9LQsHvbGRB8Jy6bH2SQNOUQx9GjMHS+hdlm/Pu1sejEh+BDTmL67PleaB2GIXPmHg1+JFxxEib4baZCWVpaVwxm6OF4mL5kOnh3BDEHTM5hPHClqmzPJ85Wn1KDxis1ENkZieF7fg+MfMp9At82pk7MQtLLlKDdcqG4QTZy3HrmTgZmh19pprdVtB4+UFAOn7KTt/AUCYaguw+hvXdeRKteN9vHjWbBPRRQEGjyN0cdfaT1rfDirwHIQPUP07evvnCGXqG0y84hYpop+1lhmN+zufs2PAWfb37BAaYG6+ze4Dg7hmC/N7wc92cG1TER9wQH+z6oBn133lX7f39X5rN1FD98epu2OqHS9/OjIyPwaEDt8LhLQyL54/HoZ2dZn3p/iRQPS7miSe7V+FIiwi4xQJ34hw954JCeYtoijmDUUZMgqpeNcy+5OEIgpNUjrC4zeCJtA3LIbpt4gGf8UEiZIUimY0+alencWKjoCGxA9mVtYoUBfvTB9eavCM7mgecsYUlkQz5XoeXEomuwCyO9VMd10mST9cEo0sB+GSjTLfbCUTHesQRD7h4sMRP4Akk7LmIqTCC9vHeA8rAB/c52gqju039Tr5C73cYM89aRs7VWXdnkzSlA9ppT75haew0ZBYPLlPkKthRvZSm6gmlcLgm05Sr0yEHHv8zqK6Ih36pTRdhIeObMZlqUFBp20tRsA6sBtCkN1ipbf7fcVDuS+sxj2PLI3SQjPWRAbC9fG6kI05NgQhm02oIBft4eHdoVGLoSmPI6mnisReBqy+KBPlSIuiw50KCIM/kPeQ91/sw6UOS5ocA+7lZZivl3W4sTxFtU8ChOMn9iQlMx2yRMgr8TGeoqZDEXZLuxjcd/RX8IGCyX6c8YBDk5hsNaIIoMAsMQ6FlVJrE6UXmEkmq9CgADu7X2oA8yuqd0TdQhppYRtEx+LWs5PJ3LqEjwHYGo8IaWhNC07nU+aWQcQaU147lRHe753JspoTnjcoktOyPJ4G9AHVASLSc1pjwYVJZFM01GfTPoZzwCPN6YIr4ZUwEi894e2wVeI1XYNz6ggQenzJBHpIGLu6AlIKxZtuoSW7ThKCTGVqLxWDJNIIADO/SLPrgXf/Qu/2ePNf0LZeSaWdEzko7VnRbEDojkhAMhIC8pOaEQzCyPWMrpvzbVZwQ3C+JxdSN8BL+Hw330a+ZQMI3J80agugx2b3chGsVRLgQfGqvfMhrQJheQ12eclv3xzFva6pE89V0581DDGtttWLurfWPavUPRPbq+K67e7bQI2GamVg79KZNRwAbhhUAJ48AfBFDUCyCrihD/iSg6kiuKbg2qrg/YDrRvxpwNDvvAttfg2JdgSJwP8+7KtC44c+e8em9/nwZOrytO8+lM+0/aX08+99NGPbJ8ffB9Ziu0j3Z4258BnGfRuNX5s9S8q8fH4xY76vrlJjCl76+SHe4/kf7TPWf0MNlw/k7/3BLz63He3fBwDeS30IRf0hQWPvHjzH3R/7c1+EXTL03/il/bW+D7zN/aPbNUOnpFn/8EPXz+AVXumuFVp2+1D1fmBW7pKkO8COff/8fPrtN0Am72iioGvfObEmpgBzwub3xw9qmoQfVUp/YEFRFDTBYpXPVIFnFUXSv+xDwSnNwFgcvuHZ7tRDUOkbw0TMG4LiCJLFMUIm3ywo/qf4h/8X+XUg+ve+E0R/bd7yN74ym4i+//K/VLfLSnAp7UcZ1x/6x/svyX53huCKfcD+x6ckfxHcJIDPQBc2H859n/3AC/o7gi1YGrigZ10//fJaEjBNhlGWvSEZCRKSdJebC5H4DWMyhs7oDI/ob/b0/tbf/Ef3r60k/+JTuDGa0BEFEpIE3gdBsJB4o9EMfgNUBqZDmCHiTy7OTrzDujexYoMVj0MoS+rSth7y8QXe+ON2n0ZJN+IlbW0fxNmcf16Ox0P9HO10W1i5bO1j0q/Jy/Af21ml+4f8nE+iZkzjhJbPEWn9sxZ4BMoMKx4RVMHbq3skW4UKJb86uBgN+A8BqUh1qRQLY8TnqyuqPCAK53xMlzxQHvDZolPiGRtCQz1v1ZKhBJf1WcdZVJEscX9yofr5jBvAapl0RUmQxZSKuSg+17SKTJSxkEv3FzdvAeCGBnM5IvJq5JfUiPyufIDLHaG6r0Qge8lRTjUndZva+JzCWnyVHAlyVLFjDXcx1DtNh5Sb1SGby9db76GSViB+b+rYFA10n0FiPsR8yd4N6npUIufCqK5cFdOJvj50gjybInN9oN12OcHa+CSzUxQiIg+Pcca9jr5xTE2upTyO3taBgLirYJTuaVHCLuVNQcmEspFylrGX16Lr17LBIY+/8DLbNPDWNwTOqmp+XQxcfRSGnG0IkyTr1uHpgycqzT4lCTlgczLFTyJ/vfzyOIQVdBQ7qPDZ/CFk92vKHKfNFjz5TOvXyZqIQyprAkettzYzHPeQuPAL9dzevUu9GIRjiR0H8qUKGjJ3RGluUYBmtqvKVpJ7S7vx1XDRtZwb2puhgyt8ZGiQFaa0cni5OIEfD17p871n+GdDPehq1VwXKc5giqHYES2X23w+Bb3K5RIfkRf7KEflwfxhUha7Tyvym3t6EqraEq7aLK5WDqGiJqyLJrrPvKu7pEXV1IAbL6roLN/hemREJ0YPPe2hVf7P3I9P2BfAZn9TPxqDb0URtPvMIuDIqLS7RcGAGuA6LwEOLRFqtesbgWM9uQ5EtwXJ2uLbKq56Pqx64HGoiQDe/AOsI94Vu8M6/dIP4sMuUPGFwN0ubffhmoa7sgTF7aiwx6wfDwl/dVc4SsMPXzzVT20c8RdMR+Iun31hH/ERSP7KVWDBTQJrO9avcY6IUBQNCQAmKY0lbziOoW8MRUZvZBZHMfgLYQjqG4iy/n/8P/nJ2n0wjGA4INlvMU7SO45RbyGKYruZXkaSIRJh8Kc6R7gvqj6h/il5ntCgOxTHCaEXkD22pP60D89gs89ahh8FjuaswYKiFjlY9KvxWg0upGd9Yo6DRIMLEZkvRswxXjme83nGZzVjlu46KHXxhAIGyWG9RZF7wY9ipp4mcZ/KCI7ESb9ih3PSmcqNpNRlbo340Jy5e24dz3GOITjMXxNSfb0SWxAf52vYO4Q0Cx4mb9TVMZLnNb6ZbDgKyUnt3eL1Ck9PfYteHSoF5T0X+byLxZqeYv2yWsGSBFqPLBiAxDNpWzh8gTlTuNYCgvPmCxpnjdlgS86QDZKN9JXdGVFXJ1tbVPt4bsa+6ymH5sjkELTjC1OHQ3eXQpE++0fBOSbgVJ4UzWSXOHe1h3Wc/U5HT0mzj2icnvd+U2/5kqgmtV0FDNI6tGjzeROUKuLONyLK9SKJOsPFhexFCcpq3igL8vA71ESXM1w/psuE+U/yqekprd4jceqfZ/ywDjckxUE6ZrNWDI/b0YBd0ZMzE5uLq5sRTTsX4VXKLoqHxb2He+u9u46UXzd1AxJpwAe77N6I2nQ9SQfOCwWZHczu1m/mwsOhj+av7HqqwyVG/JsZZk6M0ivMokj8TJb7yVnm6kK/JOVoTrmqo3HHo8kmMx6fc+ULMpBWuo5uJT1MnUjYk3k2YLHrpIpLX9j1zmjPkfXOV/bJ2joWJ0duI6/lsR214I5jNDIAdKNFMbyFYW30EP79pkQ+RxQQN3d312+pturiLlC9O0SYC0ADeG+H6ba6C7ASfqsSe7VR5XPiO6qtTtw2NqB26y7eqv2sFfFocI5uqXoqplU1qrXCqgN00O0a3N7UmqiiaruLz6qrhgrgukgoYEjgOAcH1BbTAbJoVVAHAHFVUVhUfheadZsfMlH+27szEOWWz7AB0fvLYXLoq1u/+IH44//8v/nwxVHv+0mAjwKuWX5Bavc5Dwr81L8PlRRpuJuG/0lJJ+310+v0eJUvwHm5KUp/aP306liu5OrWZ5xzFL6qzo0jKJK80RgMwIVKk7eIjPcxdoaIsCROaRj5Brj87X/rP/43fzJwiWOCYMCLvcGAnbxhVIKAM3k/nTTGMzQG/BP5RHAJGfHKNWfPlu3TcW74jBpKhFq3G1McM7t4STN6xn2pGFc7TMqotQmtu9G2UE1ECM83tXfkFvG7O4IIB8nNZ2pwFXTI8K6smr5s8hN8xSHjCE7Gusa9K7svDTp73nhH3BNsaTcJiQwkvtb5rTHd5ahczzgErcn4mJGrOmt0rKHsIex9mpZikeH45iicBo8ot7Fmzv08P8OjjJwp+CoEqqvPqj1wOhTLERa/2uJljCE1cX27Xe5hcSTVFO9GF4kW7BqXj8JUjsfXdrhs8Ol0MdhZrqrR3SIEJG8XVV7gqSwu9avQL1V4ZdFo4s2Lb4SoOYec/Ewwe1tohqoP3Wmp7ordLZzoZ9NYmStBYa/OJipPyl/yiAijumHZur0Oqic928a65ea9VEL3YNb6XRtvDpPMAY9cMvoq94qYDXezV7Bkk162gFkbeqthwWLFwqtCTyxM927Q5mTaRiPHWt5YXMfND8Z/VHyWk9Btze5Rqj03qKFVcYZv5AjxdQBBgwOrVpvHQTOEzdnttRkrjqOoXSlJuVs3GteQaNgi371lGcQfvCG7DFsS+oglKveUOw8N0fqnKjcPuX2h0qnHLuflXqmIOaCzIphunwisczsyfRM4YpBIeYTzr1V5LEVc8oqjdDh6f3qaTtzavnfKQ22tvd1JhHPrbv6G16nUXyGhvdnXBykpAiWUyayv/TVz2fJr9VMjXb8OLHolICovgBQ8nrUqByl3PH4FDOSAk0iplUsAFrNunwr93T7b3HzPJDTRXwLP2ue1Ya2VZt+Wd5eDrwDSPivilHopyzFvTcE5L5XfPGJIfk5HvkZF9G78YqSQBOf+PkYInu9HUA4fV1EB3CcQAa9i6mbtq1WE7wFAEPdVI4cI7F0q1se1XUXPC8oAACd4r7vhahW0gLJsWumD+1Q7B8fmZXZDPsmd7q99rGZ6ffP60pwO/jTx7N8BN4EnzH7MBtKf83Tl9I39owRBYCZG31AKx95A4kK+MShCviVkRCQoDCck+U25hb/14R/8jz/ZKDkBqAhKw9gbtTMFDAvpNwZncEASKDwMmTSMqU9dOV10A1Wrk0RhgnM+Sooq8jCPL3ikPlHU9+dpOaUFJqfMGQmbx60o4HLazBASHN1G/fmVEze6gx6asuBdXTwO26HXTJu9jS5en8YgOesEexJK/namwzy880ajjJejYzKGdik8EWSDAhllUXChKmgaXmnz5O3oKafJyPvTBpMKkdfTDVtuMuSOCHyL+PtlnF/tHA7JGuuCmG9ncm4p1iD8nEWp/sAtJ1c6m+mt3q5ccmOefORbRno22ivXihs+WW0l5r0hXa4GdggjEsMPjyPgNpexODah4Z/KDV9CvUL1c4T32LmE7rxzK1dM6wUQAOvhYFuYwZ7ZK9XfvJXqYErM9UjvuMVj0tY33IG25qoqiqyRO3Z+ITpsWdnLTlGVLI2zdFOlw3RqOC8X7Z5cOGIg75xozOnDWiFCJwbpQWqdYqqaX8Y2c7Rrb4oHrBEhYjhsaYbZZRIKMzHpvY9cCR58LqVVYGql4j1kbA9nb/MNGG1HOocP9FR7YabyaTGxi5FIvhwOkxFJ0tXH4sccZFcuvyxPJHGfApo4dIF7C8k89EosUkeg9RczQLxiayzscaU12pzghsfngX6JeHENpfWW0Gc3kQ6DiJbZszbUe/mMx0TtqypgSxpA+JotbBRguXA4POG6YPnArOXXoWPsB7LYZ3cDr0e3kOkiJdIHvjWYE2ZfPWvZNJu27VwTfBlb8u9nL/cFSVBh1Za+rQ+GaduuEKoigCAQQVWD451F38cPUHPfvdkV4TDNrhf920fJx9CTV/8mE0EnN743/rxHye2g1T8q/y27OqpfsYvfSoSGAjzgm11dtdiPCSq3CcBx4Frubgsg9u/zgBKiikEBcASQhl2iYpcZlzb9B+wffcSFrzewkukRvntb99mHsFvfj4j7bpzaNPlg9O93fe6s8Ino8C/tQqkfn/CXu0o/cSnqL+/48Zmh29IuYfD5jtJHfPmrX9SgfvXuL9R9QnRvJqRvTBTjbziBhW/MvrlEkCmMYjiTJdk3O0b/7p9/+T+ZYHeS0DCAm/ANJjMYwA2ze2NH+BsZxxmJZjASfjLcHMOEJ5DBaGKc1cjaOppi2xT0ea7QzkBDr3kQI99exM5A6nvs3kZpSDcfWnCPd8/kIqrQcmFwY7o1eqceXqf08nwxFHKTWkq5NTiqzcFhlA83+JrjtI/zZ/94OQ8h4+nm1eobyU3o4jHjh6OXdSW+KAklLt5gnHkYsqOpVzYvcS/+5TlpDoRfhJGyGyYPQqe9edTL8YK2XdL70bfXeyZS8m20RmVU8zhX8tdt8xgfvEROOxsLPTcTRKebGNa3FAN5os0Wx+LosEhWb6+mMnPGbEd9hsCnquNgT6hrTh3LRwAHNSbpSmFqrdxXgoxbT6KkN0Yggw2wIemQ4HdTOFcrfa5I2RvO7XFcsroGuX5nbodaZjQcO5z0A3tTX0pwaZ/l2J9uRUmvGbSNzDnnE/bcnwAbuMC9eG7EwIs5l1xP+njq0df5ehva4XINBHLJ7FuIClUwP7uVqa4KVydx408zYsYEDmLmsVBfMWcVmhZfXS5cwK9fxjxXwerp2lJn6uK/Tlp2bCDjsckmC6v+NBxpHiaos3ijQuEYquDUveZs02c6LtMJqoNnuXJS2zivoVOlh5yUlUxcmYgnXmo/8Ll9HaUijI/xw34pR8tnXcVd/Snwh+ROHfoZsc5koA363Lact7TXc+IcyjjJ7lKKTqeQZ3izjwN7hmja1e9WIzp+e70HR/ixSY/yGhlmMPjThcqWr8DN//0d6j6IWjm7S8P8bTUpH1WXvQ4T8M6u8AOr1bHdV1/9aq/RqKiPyi0Itfh31KRuodiskQhSffgER+hMaLz5s4YctQXv1z61WmXuY/ibhjrwu8iq5+yKSKv2rnS0G8wJm7rL5KEOCuCm3o3mNDtfwXWqdllBcOyitnutSvjyGn0+bh7crCIQT7B//ea5v49nvALR/aJbs4Fr9/yirvVFt+T7dU3+8Ov6d/AfUcSHuC+796GJ3ci0SUH+usMYgLX3jnpdNg0AsbRL20+YNd9V5a5x+Eq7PP3R1qV/6cqxrqCJwq8xLkUJJCYzDHsjQTL8hsc4/EaTBPWGZgzMZPtMevZNZZ1//698+Ac/Gc3JYiLKsox5w5I02TdmyTeAQtFbSqNwhJN4yqSf6gykJDBcG2EanZWKPSYXRbKjNdrK2zEQry9dldgyf9o+ebPxB1/06+KtUMqtWH9GskgxHUy+VghFefqdrvQnRtzhJjbPfd5YdS1cpysGIpACfn68TkQKr9cqXEwn5Z8C2aEHiEkubDHrcpBCrZYIR0h0zEt9rLuL23UZI8ZHeomubHY/NOYSS4aD4fR0Ot1smLJvzI2H3WysCVYUh9dtKlPRGzjpOYsvlQGh5oGJT7tFkit/HXmrSC43O7KRi3mcXpaX83gqU2PlWCh9sM8Pwb0YN8qeYPvB3jy4dU71+QBvPHG/WyR0F15sKKT8lpcuIXN3qyJeZBJjuoAdZu9Kv3L7woT2fQFJoucfRIIS5e2SJgy+hVBJ6ucAllCtsmy5Q5nr0p2h8fGUIuZoUelgoArkHFvH4VdclMMZZPhRa2fEreXnYGmcheKr+24EanLrFfxODV6lOkS598HUtAnj+Wj1XGCcGNTtwY1EasOvsLE9XJB8NzKIzFUhnqeexrUlNaE0K8ISANlzfL/2ohzBO0gGOYRnnEzFWweSHk5PBTIAMQwHKMr47ri8QspzD7HZ6Ge1wPJD4/utY+M9fhgE06HFqXcKIXMvROlMOJwKc3YLzgHnnM+Ekkdk5XByTlcgqyRJ01whVD/OWXzDOoVHHTu15lSUniOtPZXRRhbDM9eRcWG2pKaOF1tdfORn9l7fze9nJrfuk9Xqxu79je1bZFr3ouQWiEGpeT7u2z68m6fpIridtxpNDN53ZwF+od+hrOOH3rOIW/pnjTVBa+LvQt6esEsjAPoCqNw7zhxrf4tRbStK3d7HAFUkANcwaLV6N39VbfAvuD4qXzTqBq4Vr+7YMwM6SPwweYXf/1jUEtPnR41U+EuE2D1I1w9t2YFQ/eOF1na1bqHdp9Z+tF/QPyeo+8jar3EMImE0gmEEfoOjLHnDox0IshR9C6MEZ3AiouDwV1xF/8q/9l/8ZM4PJIMzMI6nbzGFEW8YDSNvIPTDbwlNJOBsUnB+nzxmNZ7Lyz1p3LMVBN5Vw02YKmDBCaYTftGsZbhOWaV1xnbhLWZOss2aNcy9VrF+b3VXtRThYN0SBjHxRm3oGqlKVxe7fFnUZiu3M+JWz2PPosgp7KiQR/PTIeKpVkMnPqCyQu076p42isD33skLEoqxkYpg7lZyPzpm16qTF/O6jTKmOMFWq7fcq7jIp4q1z6QPh5Mx1th8WPUG6RwjjkcehYMCcmZqto30hFxh1n8KFJdqJqQ3ltvPExVLXgBPdsUvSwTfbB0l+pHkIRq7YtLt0JfoJIhjikWPp/JqDi5lGh3TmVmBZhpxss5HTqELUkGO8CJgzyxhefrQdjeCvBKylpvpi1zGzG6v3WCrbPoSRy/K2CRscf52F4X+dWgxdJQVUSVcBinv8itTljqPqq3SeqV1ZYRG+1Cw8qHlYDPUoWpztKInU/PiFb12avVU0koMGqZuE/RJeHrHrqIQA938Gjt0K6DdFyio67rQGdKnl9XKD+64Hl8FrUKVcwW0bbhzlzRkW/oMi+e8EY4vf2rd8pRrRoofniuS+ObTvnX6RDbt9OgUUayNGrr1W8tY2eKsWdK7h5r0a7+Ynpn68Od2k0NAgSpXimleexElG7iXE3kt8jWwR8cstclxbUKZTvm6tf1ZeBIgObil6aIg7P14jCeWv8Qn5hVOz9vtICeuu2EU723B6VD40kN89jTOfk9XUa1iF91mt/dVpG/X28FAYt0GNjsHVbw7bjYADLD9/1qlzqqn1fvazXdYxBnO+TjGP+/912aXFwVgsPm2SvgeAAI7hoPdBaIqCg0QMQAKm27vxzi431q7NAKmeRLiV0ml7XJ1gHjoolXpdvLe39nn439IM/zP7bUm6tQ/wvxXBBD+aO+K/+HnOPElnUA+qODgOGw+GP2cPr7gFPvk7l4SCz9WxZ4g3I/78Pb7EhIblUPRd+nOLT4iD613zfpB14QP8T4XPgMC8uFdNjTsPqRZlgKw+GvgqF/OgIdxnI5jD4ApCvMfT1H++rtp6ZT+8d/+e+/WR+IjTbv99Paz+AHw9GfbPkmbX/yzR8URPhMtQdA+QtZvs0dw6a/CVyhLSqUAFN5IJGHecGr3tsNp4g1NAXPAwgwBf745XP3X/5ff+rs/WaksTpiYpJA3JI328S0cfaMThHwjIpqhM4JC0fRTx7cq9kxOx/7K3gE2kNbJsM3l+Uwe1zbJ5sgssNEgG3sGzMEI/LOHa4+iVJx7vgwdHmzs67rM1vS6mUTmn7yU2h6oXqNoCMtrNzpCUqIvGyNRWWVAiKPNidX6wwbyWrZdx4iMPRQLXpS1zrJfKsgykWcGGZoyrNSLMDwL97QUcAzDxUOeHMC9r0rXsSKXPxdhLZ2BZm/ZSF+7l4JeK+GCc6VPb+jAPpUco2OG7WC1botSQgJ1QhLZjSoaf44jCzGvlSECWY+E/kAdI0S4nrPCd0sF1cSGDPBBrm0fPVhcogxJUp+D+bKNChEVQh2vyhK86tVEjtgdIbPD8YljSYQDFqHq07jYWsoTYX6MhTESLG6dYubgLOdHY3Z+3WEDIdTGQI4OwtfDS3tF3gM7Ke0jNgAzELIqRvPzc8SkXuYe64qRYcJfIJSn8SF3bw6mLHMHJ61bXNIrZ50doi7xUSKoO3ZV0xOsmH6NaMjIYJNoY86LeRyIbXkltVkrvk1k6dR0oTkjRqRYt6zrxNzEXjTMnKkJkQ/ZKRzuIPUc7e5lIQK2axdd2+uBpORrIZ86Hyb8gxHGMMj3Rcrqq5kKnpr8eASa7JvC09VmCHsU0UtENeoyEN2NYk27kc0QjpaoC+lEKRrqYI09Ny7qfJiquxqx5Xg91gG6cpGOJiutivSDXnXeb6i7KwlHWSAV/XpdbFr9fgPBIP3OAdXYvYrM+Vsoy7pH593XWdukXfUMDmyt9CsJ1W250sS9THQsNNFqvkMZ7hzcmi24yZr580araqcbasWiGuoTQSsARK8Rf9NqQPEw8G8TgPeu7Z2q3fvO3ukN+OLYWrHTP4D8qG9brbZPJVTsrLYSobZB8cPEQLFvdOs/QsVeyvqHfx8d+nLXdAaH/DRtmJ3CuAB4yu5HTQK/UxgXvICk/Zq5XipDsgTLAHGAGeQND6nsLaII8i3GaQwPkQQE529uivx7/+Qv/NOfrIcSZ3FMJAz1Rsf76BUeR28h+Hq/MeBnLMQiwK+oTwSGvpnA96qNzEdQrCFLYZ4dS6T8cFYrK1hyd6eqcVhlGxYriQY7Otw95i8DpYllB4XLiby7XSE+TtLlXpyXcFltCrGh1JbvW9FASMQaDtujCCu2pCSnSgqCueOQwpqzTXDbSAUlQ6MIK43jWAM3TsrR8hYWBt9S56o8mMNZtdy7VDoge/ZAeoWcghSze7Ejwxfg3bibO+AXB0sGnB0tBxLZ/nE+mNe0VYb0VoctKpXStV5Jc/VNv+NyC1CmYyCEcH5+0I4TVYti3J8jysisTnVFQ4okcpWOINCAJD0nr5dCUlMXOTWTdqwO/pjrUtuW4jPM4OymhtAUNgGnHngEkeszoHgnN5bx1ErMwYHOZzlcPX2Q2KvRm25Rqmupk6vjaBS5rjpAXkouoBcfi1aMJVQwTbRKpCfGlAoaUhokuVStAx1KPvJILDPNxOBB+j8mfnCv+RryH3Q1ryf7eUcg4tovvXttDB7q2APbZNDxcuRePkTbtR2rx9uoXtSxMAYmf/jPyuTRE0Shij72d+/RiFhywhAQ31xeZfXsgbbJFC2qOeY0lPG+xMFSfh24Cxa+sHZWUUPA8PYcniDCMeano24wY9cHRB6hKjgzj+Wyqq62hWYXOw07XwnhALVwP64DPtTrlX+kzBmdWBtFKeLm4vqDJE6poPRG+/AGQ6Ah/3myZDvrFDJ/nRoxmC4nQU476Xutru49FGc3pkNV3kS+pYfS7m4BmngqfM8h1M2Bg6rGffsI0v2gVe18CXgH81Fp8b99dZUPRWZNbiBI/py3RDYVvL+g0D0BUSsQ/EUJUXlA99rdxG6f0WX39ju4DrtcaFDvwKhtgNaIgOJVx3J3w1Z3J/AWPL41wXE+IKfCn4qMzz/zRV3sGyIKn28jAphJQOwb9pmtffqXX78cCPsCagDDIP/4v/ofPnBFH/d7yPwAjvrA990ePT9JP+E4xXX6jnXgGX8ADv35ZE0/Sz4/gd/lfeEz7qxzusLawufDwSDyXgT7M/30Gbj3lwgVU3GURQjxhsBJ8obDCfUWoTTAKopgqJROo5j65lDZf/YHf/C//dOfbPME0BMsTeI3mgqpN4yKmbeIRvC3MKIzwKOSMKE+1V41yvnX9BDIZsUN+mLVnmtEt/OdOEHWZZORSnum8ky0jHg5R4WrXIx5dEIxPNabHFnPYA2E2xAe7GDxSdq9dbdyWR3llCyP6h50xWixrTMK2kCh9Oq2YmjpNpdxW7hJ1DEuXzIxJFd3kqLsOq3BwkIVKfVocLIvNRaiDz6uFeFS0Va+NjWNXXuDUyZRke+QoHFk3AkrSg0TsYglP22HIjPq8t5Jhye7PiqMJZ6asYG4eRDoQOFK2Os2Gtww8CmGBzdLx7JOhqbmmY0+r5uzlCMOy2W6bQzs4EbTgS/98cR50pH26vBpFBHxGPUDKqSZVAr5nIVhrDwhDz5sh/Mlt2vXm0+xJagCk9yZ4MmRPbYOV3elML9kqQB/EMTNB0yMuUSn26J3yWwlZe4HLjQHcBkPxs1VsFNoCBf7YNdM2l9YLIm950HwmWZcvEN9s07dcrt0wd1MOKE+Z/cQehbb3c7WZylM9xLHjfhO3VdHvLQ9HkizfAFpwWPkG/xRnQ/9mb0Ji6dfpb5enEfzrKGVmsOJ8SF5qCzjdZbM+9KtGJRsTBmLYaQgxtg3Vyc2nC5medqi7YUVOC+ePKXapCi81NaFb+jqBB2xJ9ddSQPaF4Xm1yJ5DeIOz1MmEvWzAhnC5bTh1Ihc6cxWoaN2m/BnDH4jAUKj2gKh99FF3HtMNFJ0OpjYiUmP5xrvAdM7uA4q374fdfno4aPuRbKK/ZYimwTrtk/smxOB7S+A8sCAqtT7rp6/FSAqW6XqyQWI1uV3dFt2Q7wqOQ2y8zMXV1DbXTCOXXVxH5YzYRWgVcBrrbYJOEgIAVoHpQ7ei4YCimMfAUqZWLAPHKPvg2alv3deqhgP+JgI7KTZ9V1/CHX5M+/I8hVXOYTYXeXUsvuy7rYzl777fN44ltPHY/398cO7b07RD59MZcQmjMuw+dFURlRYTmKVX6UyKaAKKb6r8BAZDagMCb9FcIK8kQmCUzhMoyT6zRrX3/5frf/gJ6MyTELDIU3AbzGCwW8YHOJvDMKEb3CGkSmewVGMR58IFK+LOowwj+YojTNb+cIPNnuHEefy4CLaKjWOMCtfx9mT/LxvRkWybKxC1PV1wY2nthjYXFPK+XJ4hfCtGVmWfPCuTqDuVXo8lOF6pgxZ6wX61IaXTTdYeMsrggtqCbkmsMfeIN3eMs9cHIMT6OjSRr2xZLB7UgJ1Gyh4Sm+DJXjrtCBa1tqTR1+g88KdyPQ4PqEBUbMG6ZNw7Z60hdpUVVXyVguOZzQtLLORNFwEhUGViecO+Xx2qjVpxIXuuqmsKfHYlVJ7fz6RVJ/Tmae1YhhnfXAzjFZuMfK6aytOBuEFBhzKXA2dLy37CRtmJePXEZlvdCzZZX2EZtg4FaiIejOrcrmNKXFeYtAtley7QZdDvwUa/xzoqOcvlmTcJ7lDIh2BXpPmh41dHQ9ulqwUehCbvABf7oYuHDx+dsamIKNIJ0JxRlJZc63zIUXzAIp85HHX7L67JItvkfaxlHBInmbNk/SGX/Ji8F6HVTu5Ep9RJ0PK+UuwXV7XdA6oLnJHwx0ODzNP5K6KXhaiXzSUFTXL7EzcRJBLFbjowN1IhHxsD6m/n1lEOTvYfLpYakuQVeTWl5RcBOqOLy/qoehn66ZIqGQwsGyoqScN5cul4PVpbC4f6UkLN3jzVJoRiVCdew2CAH5/R05vHjSy9rHEHnSCiM8k7m3oicxiuFWVuTAD8YhNhaUqksy1eMenl8tXtkj+r28Bik2rzPWjF7eK679ZkXQFVGUJWgmk53KlogAoKrnSbXXdA+C+mqiJu7C1inzH0rtoAd59wzQ48awh+lnXuWhM25Jatffa3q4qCoJ/u9ettNIHVEfbDW2qY6XxgOZU9aztJnC7IV5V1EHlYGqV77UtNPCETefBYzdnX3P8kxSE+82Y868A0PjaQjv3TmT2Bk98QH7vXSpnV1MZv35feID/CP29T1puAa/a/KjllqsAIOZryy0YgSUIAShIFmP4Gx4x6FuUATIQZ2iIU2iC4r/iJfp3/p//+vE//1TwgoYYEcUZoCAMugte4wBeUhJ7I1E6jZkURXDyU1sonnhNX1beXM7PJ1tk1Z1/aFfyGTPE6dayfhXSrL/ECKsa0lbIFtVUV3I+acnxZMRHjFiuq89eLLoRDsnrQBfqeWwpNwwHBLtUbE5EAeI5GwhYYyUOJASgyOOG27G0MPL8UvPxKQbPu0A568jMFxGGDfGUWfhFXniPtzdpDuTlmuC4cE5CU61s4Ra66VpJc+3BML1cjoe2STHMxV/ne3TX5Fe2oPcXmcmCFAs5El2kREpRd3pUVOMBpIMGhVNgVmoHpjxztHIMxcyYWFdlZRF62OwLo6SNIir6QE9Py2wU54iKPjnmif16rkQNMvLTE2Vcd5+u2nSSsM9YI6gnUdfNpCfLm7ByqGhsVvyIB2Vwt1MRinBHI9Ixiv0B8nl0hgbBsHjd58A5Fc+MtCqVfxwkAocPvnmfCzVUuZLzNuimsHfV117gHpnsl6cHvnxm4NyM+VTGweSxI19fmTtnPZCbZNRic9JNPi2eElv7wkMezpoew1e4IM8XOfYdvTmcE5iXqVtbr/van7TZ8hKTEFbD/KiOlTHO9uV5YG8gTtmmMCk1njXag75ZOFST0er25EPkKuzQPlelWPgN7abGfwliHj2M8BHOz7seHEwrq8jTptaMe/QPkIMdnleOLrcsG1REmDeQ+kPjve9SzcXEPjKqhEaQLt2W543t1Uc0zw+SPA3Kc8O76UZq97kiXycjgv3v1+zHdnE2tdqXL2L0N7dQ5Fa16zUQQdjkHZB3m7DOx3urYN61REAY3UAYxdSNxb7DJ0EP3OLloC78s66Uoc7ie9beLtpUb+cWgHegexulKQNwnTRRALxk11o9Vf7WtICn7IuQgJMFhWqrm9aauN86AJLzRdu1Zjy5DFrze+up/NY7tfiGEfbnDgk/3lZntzs4pY827Z4/3u7gJFiqoNm/xu4ghtEsomESpPRY9oZTJPJGown1RlEg7KfJ3jn9pv7Jf/gHzb/9k5ELjM7eLaPfIsBi3jAkC8GZADDAaRpJsyiLMDz5VInPDsk1e3t2Ix6e4pmGModzYt7F1bArqa29pC4En69dTJznKX/QnuzBvJCgBwhOglXuUzknofQ+FYbHLim2Hl2DOGwyB92fj8bXGDIZU2TIh+KyPl/G5YqVm6xN+c1iJ9hrFszETh5m83e0DG2lfB68ZJuXTuPIRVKUmcKn2z2kXWEOibxhlrMRPp8ehgiQzxYYBFUn1tLwAtLydiiLgHuKw0Eq4SCkBtKx2TGzc/MkX2Qyqw58OXpVmB4RscXmRjXXQknG53BeLLnHznLe3A+y4HBx4F0LcwrtlNSI23YLbv6VeeI3HAPES4JO2JwHSWm/EjbxLlT69PASfNL7hl2KLTWoWo/Fh9+4zaVZT8ExicIyF4Iz3eNWd6Vw6BFwotOHfqpkLhsofnGhLL99ID6Csbf4jjWt/ariurMKA+baFer0wk9i03uFRHGi9MPj+MKtcj6wjlfqxiTADEvf4o2GwmKutLjjnzGuDMVJ7Q4bhGkVktbeo4EpvbtNY8VrKiXF07MM8EcdxzbiPEhIGhhpsR4YE9l6QU2nh208XNVkyQML9auyVDhWS2xeQwkvMNxEXFmxryZfWKIrWYYOe4jtRRQzj4Y7kM8r/VF4DeeHVvBqzuU5IDMOhnVp36SkTgKcIcuX7U/s4mkieaXk6nzWtHR9lmZnLZp9glX2wUPThXsiT9wmA404H+FxTubvJ/G5j2yx2McEuia030wusOB9jdtHVO9U7SQDRH0ATTVIqE1kl/0MeAH8DJ7v20e9tLiRh/hsDQBJftZzv+/ypVv+vh+i8oAwePsqpwQIlNYA1NilPveZX0BABCLYK06iD0gEIByotGr2XrFiZ79yW63ywf+L0rfzLfhT2DH57R0rvjoURv0R8cf/5d/68A0u8UsVz198LG19buSMHsO4nsPdgPMIvrbT55WtP/iK1mb6oQ273x8/AAQZiw/l+CHsevDgx8ebd+3G/bjn5y/3abrU8tTVPxa4fld2tMuvqYglFELu9jgJkZBveJjib3SC7+LUER2HIUUwcPoN0Pq7/93/8T/945/MAjrep5ey9I1A0OQNyxDsLYzR+A28cooyCR5lGP2JoFVXXUjjORwqDXwhOc6AYjEeFt079MvQrguSB9jBfZEK3RUBUXlTfECJQ4rxL2cmLTqIjReiie6xPqq1TPVIUQXypbXCp0BSd6JwLollDKdVciBJC3ipRvw+H8vyzPBi6Cnbrbs8zrjH0th8RiLbBywh1TzTyKvQqTHJtC+kyx6UswLggGHvSnZCzUKes4dowSfLl8ryDvFydchVp3eQ8GVIq7GdG5q9iETEVU/d6gwxdgh2eg0zTRthmEwSkrCumN9Xdls9jkFT7RqISJpwHZ5mitVJfVt4LiVTTmJOF/jcEd3g4PcREAYyIuXNPPDxfSZTj6uxCr60d4c6Rhya6xIDo7gAcc61825GLHYpbebJmGGEcLadjjbWYz0CjMlSb4tetntyNyOpo3sFn1AWNQRk442mWlnyUhtHOdzHjfdPmngpuXyzAi4M41CbxyobpIor7q/BNYJ2XNK8vT58tC0oD98o8NHuOthsY2RLyDsbG4CisAls59gGeyNBJbmT2M+Jpkx4dEoKmvnkgG2PG9EmF32ucCI7bVLcXm+1kkgvNBMuZtU+6IHHolTCIC/fFrdm/OZW3dE1q0ZMfNCXPJIqbZ0IKMDUceruZzqyTT6T9Sa8I6lHLH3e5GJP2dmrcaRUKkT5MMLO8siPa5JfJbyRLuMroMcRs2sOY9XbCbtNnmL2lEr7TUmeV+griyp/57v28bVtl/+XUO03NvelVUX9xbcdIqje5R9hFbVqv7V27xrMb4PG34RZAzTm21sn0qoDkPyZ0xVYQ63Kb3cKFhP+vqADaBp4n3PAq4suyqXGH8vd/lmtdqlHCVA5fwPHI/ruVbRXGEVwLSpn2WeZ/SppAJ353nTlt3/xrwNEAPHoBcLd+KFs2+l9Ez7Mw7Ibn58rtbwPML8LQQJAaPtx32eJlfAVfo4q+8SY98UU8Uf8iblH2e6TYtLYpO/SXvlHJAvfp5jh3/vFv/pxjvlzLZjHPnD2vo2/v24aJp/jDfM1vNl/slhL+BreML+KN8x+cj+19ei/8IWm5GeiJfGfXc/S6XMX0t9VWJf9VfNRJg4xggkBmUoY9A2PMwaAQ4q8oQmNwgmGRPGvmPj8O//9P8r+5k9m4hMjVEylxM6jqDeMTPC3kECp9xZSllAMlWafOn4m8cNj48YrmyZBaSdcXXtCB3EMQAmlv3oTh+C2FTsVNTbQsXIH/HVxkEC2vDmhm/AWjk3hX+5d0WzDTak54WyY970dn72qa6XBayweOWsaKOzpPl2Q10dGytrPB18OuslMN+upTK+pXc+sTGLPmTtW6kKsySXq6qrZvNd9nQTvfKtvqS1KS9s5wlOdBRKfrTuaHJU435TOG6rUeS2zYMCueUgvXXMxg8iRZdyIrZdzV+J9bDlsg8jj7t0C2Y9zgDFmQuPaHUbumrphJy3DHojopHpyE2YVELrbq7j59Ia84Je3jo5xdqKU7SeXPjXXV7gI7Zwnd2Qa7sOMy/yjJqvXQVO0xKHFq+7e9CGuX1U6Q2Z9RcJgiJHEDLd2W2es1SOsP/tBYxTtA+3PwqNmFTR0TY84lLyJuxGqP7gRvy/xva18B6YGaHPZeSIiNE9ZOUE1S3hgihRW5HZeJpuEHwcMfbGI9kiPCeU5eXfESXBi+WSVMGtwi4hyD12g1BM7X1gOijOeH550ztUUWiGH+2MOGb+OG7E8C3o+tBOcr4wixpNdWxhXt00lt/aDR7gk7Q/SWoCgV93H7Ra77T1CrdFVIrvJ08nMr9wp2vJcHO4edByTS44ToXhT0+gaqDhXPwVLEHMomwmjeS2rO3OXgDXBl+fSYnUtCmt3RU8zKw0HIlvPTMbyspzx15VNnvdb/T3NR3clmHfll43Ftd/c3McAVYC1XXrSrpfA3mUlAVLtzextl5QMGnWrEQ2Vv2su2QnF0xRimhahQxH93B2r0VOjitZ7b0bnHWI38lG9fWUUoNS+PWMnpSq6ze5WDW4HaOSDawOo5Zaj/t7D2YtxHrhWfLD7yVX+9sNkJf/8L/7lL3wFxg9FP+9MZf0wpA34cU4f6TtjivumSWMQxz58XGz5h38/PZVdl+bh+9hyEY4fon0hpQS4sDOmLCvj9POpMvDcnz94L9kRyB/iKPzx+cH9v6pW0yfJu9HCLp+/t2HQd3b1Too0nt336wX+nZXt2EXuNyvOVXKF/ba2j/a5tndZ5W+Knf1I0LMf4bCvCXEgVv9gkmVbrGEI1q6SfP2KEWqIhhmMRW/0LoqMkxHzRqcM+RaGEQqjFEVmMPNbv/id90v0WRo+un3+7s/+J9+cRJhOf/0n07NMwoyJ90UfBCbJNyzBw7coYZg3MkHTLMJDOkQ+VZiGw7GCWM6ifz4Jh5GAtqHxu0gXDxv4PN/7G48Qte1espeTvuB7JR6o6cISwxqQwlBoWE5ax8F//P/MvQe482Z9Nk6YKYRA2FDanIQSSoyx9gACn2QNS7aGbcm2xHijPSzJ8pQlaAk7EEaZZYQN4WO2YX2UGQIhbAgUCGU0jEAoYZcyA3/pJBAIJZDxv8h7vdd5z9Fr+ViP5d/93L9x3z6Ec9Op7uRUYMCQCCxiEgaTwaTrCLaMhXroUeZIp4aM11t4XlmiK6AO5D3A6PKDMi53+w2Ex109WEYzNxu5WbdjZZ11Z9fN9pnESbNQ3Eq+NVakYLXL91g/Fik2WqGDXWe+7m13kNBsDddOakwhAmwRdrj09nFv6bP7ibZejGUXGebdiCs8SUC7BeZ7fcHmcjRUEcBe1Rdv7Pv7+qE2E9e3rdivhCkuDR25uyyKhaENJludWqI9TpvCIRWgvV4Ji5Ka9mhlXoYLSBTmdrZS0I6LeBtnzOP+GsB9IoeXzmC63fQByMSm0TgPJwntKUBfXKiRMAgFtN5u9f0tnPELKix2AxlaaXXkd6BRf5BLKdZaYl3TGrm4j8BMf1lAXTXuZbOt3dpAJs8E6pCb4zgJTXzRLSuVNwpSb01tbw1DElogyXqjhroGyMhgtWHr4NtPdHRQ0gjOxr4IJFBYs1kXZWhByIc5Q0ExAU83q40694XleKDaVR73tTGn5xqJYjnJrMbjeFTfWBg83nU8TchLnij20owulZ4YDbFJudI8HYP0eb+z6tHYOO9WCWoGpq8N4UnpkoykWN0x4cE6RUm+MLCiPRzuRc7tdQlyJK+mFTOYtfCMdPiF5Cwp31Yja+tRTqQk5J8pEPAb3tVIzV9dU3UkV8NGADg0NQGtIzZgxMIh16j5ByJVEqzU62lqcixfPapp3nSfmLPgBo1mctz4nI5CowpDiTFqNOMiiXEjI6ZDedokAJO5Ue8CTJ5LTH6ImHHDW8WkKSdJcc1DqzCWNaOS4xoVIaOUmFEzL3sNrLTv2yT4okPFS29TNKB0OBTaSPBfYR7XAoHmp8vd5Rr5ZOd/d5g7uMJdrjnaIJOTLNY1iWkwpVxsD6zVoc1L8z/r3CqukFdruFn9FCdca9C5fX2IX1m7hjFeC7J1ecfbiJoImvGH7AkDcKRmUFDbBTG8jfiE3bZJnGyToI1bCAHAOARddXjnomfe5HrTHyAg0AYwl2gDnu+2YdLG2rYHE20QBBv2hhA2eV1bEoSpCO1pP+wqToYsOyBl7ECsCxlbZdizUwjt2ANq7+lzuIJWgll2bF5fBwiw7VCZYAddMJ+afrwhOCjXfKa3HXVbXhXH/j7M+ak1HSxqIrBSmNZ0akvevqopPq0BrL4eF6LCV5uJBENBOpoLTiL1oE5IUEiHrwp9Zo0NIQeg8X4Ua4VOFZao86A0jNKEbe3DDZwJgbSj+lUxr2M/UjJ4slNWDgmQouJS+Wq4Tjkw8LoeuGAcAWBUfMJoCrmSylbCBXPLygZQZWSONpI6TLlbMpbm9+Z5oG71EdcKUrNMvD5rGViL3GcFABNLBR3DOij4NqVvpwBY2kMdASzV3ZOlqClmUsBQC96RnVm2w7q+2vOVch2NwX7c38dMEA6s/QQshqW0WqY1QM2ImRo4MMmulhWfpb6+1Ys1Xe3XmVqC1Fj2J8qmyjq4V/pWj9kFi4KBybS/KvgMR0KxO1QGhTHbFPpSCzAW7w8UJ8X7O3VBqpstD/QQa7+BtyWz76JqH26566EcZCrXAodZz7JVRxO4uWpMl74JDUxtJg+EOcz25iwLbuYQxdMiNI/xHZrJEbyH0ZnlscIqkZUcdGag2sHwbLrQWqEfpH23C5ihl0H1ZwpOmVLtDTV/4gzJ6XpbmdnYMVkgm9FLO+JzQkZ6yZzyaHuZpwapceuCmg3MsYa0KkTmVD3chrwrqj1oY3XBRX0/TjIU8zok6SLGSFxfiTOv+NM4YzTs6OrYE9BYutQMopQZN2ysSw7zejGdypBU4wuXStrk0Cb1T7QkRI1/tcRIVSNcY04lwEgN5Aad76vmRY0fqKRJgFxxNc7U15AKgFHVmNNgSDPpWeNKjdOQFIdx48NdryVkaGJqNAI2lVHU11yvkQRLvARKTFDJjP5n5/sux5w/sC/1v3rmWQfj3PPcKyc7L4eew9ze5UQq9BL3ygSfzS0amnGY2qthqYEBr7RWbnOgMXm5ApygaZS4Xs0L1uvrxG/uWh+aLhbulWKd1xJwbj1VFOYP0QYHPMhHcKtN1F/bCACSbQtC65APoA6J2iDkOFftr75eZc9gmARRtJn8IWqggUmiQRvUbzv1R9tzIdyFoOvaXz2ipAFZ9hbzdZRXmWBwvWDtebxvrJFFxy1GA9OqJgaVYikz3U6KaEuVZKsrlhgZO+SYHnJdgp0WVM8WewONDH1rB6v9nZ2JSCINmG29MUetJVVv56FpORYDwd3Z5ZD113hfEYCsa6wwbkgjcVX2q2XfoHvKYK/uvEpqRTCz2nUUYcstdoJkkFSLsSdzgZtQ8qzewMeDjrOsJkllVTMs6LbAgBLcBVQI8MCgR4zeojjQ3SmIhemJhYzm3am2z+awooxBaGysNHKwlqWEzEfoFB6vxD2yIrZqIdvl1gIILtlxsEogbMJbfcNjZNgkfKFiKdkg+jFJZy28EKe0ATsZmVs7Pp6rraqF7MJJHrZUB6K2mDcKJb/+oHWnjD2a9UsnJzRhMcpGBiTi86qcY+Ox5KiaMvDEiVqIqgaXHrjpENQwZjVsuRKSsg97kq+va0QzxL7TA+Vdx3Fxu2+sSo7IxYU4jViBjpcrG3WDlo5rAMyGIiuYCD0m/C6aTVUhAwOYEo2ApILlbhunXW6vw+4C8KarWAhSiNxPMDGWErpwKZxgyr01nsK0ucj5WTXb1oSIKTfULAM6fZmju3X8t3nEpuSNvi+xfoUUen0hDEEbDsjOOqXSF9ya8WUuOh8QSKvjB33EiOJM8PiKAqnRZLkOl0XirHBEywnDdgYDrYiHUW/RggV1E3cCcDblCihf7Lg4rTho0ONKmEN6xT6f/1mG207RzLtL2hBsVG/+eAtEvWOvI6pRR1c5lg5zdVIszmsmAxoVC5taEtW7e7ipwvwJdWd2qKPiSC/2ikajN2yUaVotubmiJbFZ7/CMKoBlXm5U/A8b3czYjY1KR5XpKKlZy2E1zTxkMc046SSUK6dmOnPQqPmReag74CY14/mLjIve5DDvxhTWalfzI8nbWMnvt9WB6HUCld9/5msLKsy0vuNZ+YjE/q51to2AKAbhfptErUaYpumqRiGv7ZM+AWEejOKWe1Vhml8+4NJvXG/W2U6NYwRGtCEcbCiMi7UJzCXbAITgNcwBtuVeV+vsmA+YrDdmZls7iwetxXIoIQOR7lAtR7TzDYEtOqY2UHsCBswwgqGz7jRD2YnutaQlny+oHjabY8jGrJhdH1z3+z15sKYIz3REQ4q2yN4SB92ugLulUvoKPwb8ed+S8mzR2RNa30iiEluyK88kcHNLj1eD4RKaTyitDMKlBWqyi2gdPnKo6b7oSvO40pcqTrP8lrYmgpRKY30HOAFRFgNNtGlE4xGF1IDNunGgyWFdTrDBjBkMVyPO30fy1og9k5c39bs2D4n6rcBoXWBouNsLzXSzTqYbECMFRG1hQUflFlac4ypkCfJII1Si1WfEMYAh+mZrgGiZ7gZakuVd3+qMOh46FRKVGY/n1MYWMoPeL9yadGobpYf27Z4YWpGWT/N6ySbJWp6qG8okF+wu9/zNGKARoYcjLXSwmQYoNO5bmpbuxGk556phZ2NshInRTT3RdNlKoZKJrA4cgC4zzCCdfhAyWBRRopJi6qqfzPKN5NE815cgY7dXje22O+ngXO517V4gDHe224ssdAWOR2CZDbs0PNEqeNTVKgdKdWSDruiS5icZa5TbAbvi/dzE5lI/HlvEwIMDKuKnNmQtfARdgzu4J+161ng/GzgLPa/ZITFGdXEFQ/RQRpYLeGWCXXMnp5UTCwjtlJuRky+IrL8AtTpQixzVWhos0U9weOCnaScZkTHKgc5Od2w30KKdWXNWx1A0yxhKjIPwu55+jSjMEJC0OSD9cVAJpXgOKoyZGqkONpbRdcCElKkZK02qiGfrn5NQZuTEvPq+upqoT8o6sK9dngzr15Jb0xt2f52s6TVVazQI5ESZiqnCjyKJr4F02nRSm3F93TVYuGlDXyRIjo0pVwOOGMtMTV0aWwVtXhkQF0upUMg1GJtTA5Kuga7mzW90wh8UYlZesFoUm/Bg1YgBLPxDU8vMs1Y1lXHqSLY+uKIxLt/aSeQcRIeJr/V9DhNkl5/ctGs3umhN0D885+Byjc4aYuAbHXt5r8Lacxb1adeexdy6PtT0hnurA2VlX0OQuSVHjSR2dEQZ0VcmyVwLcX0caFuH/dIoCbRJH7LaHomDAAJahAOQV6Utr//0f15vxRjUgwDQ8r024EBgG/ZrxkTYNYGCEdu1LBvHYPI605ZixY83fmj6PsotkHpH7lNdofTZ/nY57kEMG0s4yizCbpEtCzTaEDQ/FgGC6vWtnR7naGtRQ7o4z6f95YbAtyAM7Q1oQVOLaac79w3dmE6C+oO8cjzItouVVIxcgnYyiFR1YKwu9vps1idIh+OWFU4hrW6xmPJdcq1EAz62TSqmLAYtJi1U2GrsbjKkthDjLCzDr7YJRrFIjVV9fUEGQcLN4mxliurKM5hyRkn5DtyFIgSSSt9e7bA9kefSflcIpJaFrBCtKYjlPEeQ+mGiWSFjhqSESBuaBFiryxIlONKz2bQCO4412K3plZJ1UqRDm7E0ba2JfEFKCY97Aj0zS5WMEpuYKPgKCThhsqO9EVJJI8/ahjpm77tEHfaV9XKWNzGI3ZiyjE05u1VRATZEw2CeRb3ISNZFRxyUGJr3LXqSLp24WMg228GNeVekeoE78/wxbPTQbF5NwgDsUmK19xdk4UZDd+/3KNksKSLiB96SdrOMsWKvS9HUruPGNMjCAq9ABKl6LdZiuxABD2ZjTUKyIezownieFimrdvSyFHSJYUdwZ6v7PF6/s1u11CJlz27WIRYq1szBaSC3tv3IWEQeZtGCik89X47JYU6sOTww11N6kpGz4W4do0tvk2KyTG3GVYmOogVWrNepIEzx3UTxK90PndbQhrNpt8XpJsdunGAXa+BCFjNn6U1HMJlLbgwUUmuX7/Y6ov+ZIp2KxiJSZTRmM8jVzO3MTY0FJJ5L6yhaR1MJMFMJUDQxMhvFfMioYysFS9Uk+hMtBpqe1Fv8KXCDRhVp2ijV1GvSzP43zpOMgJr8pKYvOtTQkUaZWa6M0tAopF6HpviSGNCkPqfxSg7rtRIgCRoeGprJNS2UUwO+JsWYmxz2uPFeut4sMu8qDAO4TmV5cZsFiXdApdvEuza9z/yAPUJJ+oC9siwPu6Tj4qjXRkin/kJANbGwSLztWIBPWnYdh90/0GZ+5OjB11tnGYI4BIiBYNtuPC1h28LblothbR+u4YDwfaSOstcx7BcoilqDDbsxWo5Kw32xR4eso+Sam4pwNkrTJSZHxIBAKdUGoDrI7j3LXMhkYKIdZBXEKsZ4HcwYprAGmPiWg7uhgkg7aTnwsySYSGUd9j0WUY1WBJTK0PHWODWJGF8BTbKmMhVr7INcMFcr2U5BXcRtsAPWMVny+2ieVeZEIqYyGGwyKi9LU1xja8jbJZgXESzjucZKwkoQF6WAWFAV0cmFjBVme1czkDXEz9XVWChAZeXzVSvhOdVOzIWf0BSJSUxEGNJI83f1lp+Gi8Wk59k9yfdW7GrrwIVDZloyZTbibO7afCerKn6NFWJscT7HsbvVZt7aLoKljQ7q23+b4RynrQVbQ0A23kk9FmS5ZICBCjEekzUEJbtpMApW8mQ4Z7adOTIQ0FSmkmSzXxYeA/Gc5mB+SS4qiVoLEwGZhL5O6ulgkDjeckwQkLDqQikx3sBAxm99nfe25UQPSEqUYNQf7voT3lhGSV7Mlm4WKyQy9ydyvHZ7vC6RW10sl0DYi0EhHw4cQ01DKWpt4AJaw/sNu8+pnPH3U9pwNMcLuCjcTbztStAomV30xIgcLmIczOB8q2+6PQLYcdlW6e6qIg+XWUtFWTyzOHG3LznRCykGCzWuW1p7c5LuBysVGfPoCIjscGpg+4ledrb1e2KRXOGbfF+3uNzedMZh6vTBLth3uZYjWzBWfyQm0TKOEhjcuaxI1IF8UYx+14vsz6jBDxG58Y/842E/ljW6JpQsYkzFxIjngKk1gzqjyIy5qJmIN7R5Y9Rb/Ak1AN2FSG6YcskNO1OlN2OosFFDWx3a9ybTECsJPdSfromUrA2rZkzTqIwa8uR5M6hkxBRk1IFf0gS4/rm+BqmQU24uQZN5I9TfCJv9ufWQmzc17KsYFR+G+5N+36kYBP53q+LD6f/f2hUf/G9WxdcOOG5TH+pd/iTXZsT/mB5LDZpW5d+b8vdJG/Fd0G67GFnDhmOjbbIZXiEh3yVs3McI8KojM4+65OenveR6UxuDUALyUbjtIQ7ahkHSblu2hbRRyPUIxANB276uc54zLhKSZX9p2jArMwlgtWQ+ppfyPAHs0SwcMK3NJgxaSo8vNytHQLeDLGcWWb0FnlDudt3ZWR2di2dCR9SBVrRUpkEPl1LRH+xHXE1ri824T9XRiZxPcstW1nREcSLrSdVo5RYox/tDwppNQGndKhls1Fptes6GZC1ryIcypAc21lr31gNeWQg8NDc9T1Z5rxgr5VrC07xqFQ6niWlMgWpHSzraHksoeLUnkdYQ6hcDdcAauwFdzlDd39f7vhqoaKaLLZZhT0jjedXBpv1VbDKT6RynUjdnfSCfDKqWE6I8U5IxXKYMZNruXCX1/Xi4SGHFESLbMjdax+VpmMocjha3nJfSU33PAgyx0qLelptPikIdVXlV0Zm2jOGBVeHoAALX/KRPaCNvN7CjwA9wlFy6+1W+92wNN2hN42f2pu8KLgL0d8MdaKN7G1wxlL3sJigMD/hKLBQLRMwNl1IJLlc9pMZFoSYx0yDip8yOg/NgtJuJ8nyN1JFQx6crUAT7LbITbF3PE8su5NQvEdCdYLtYDIlu6PTX/KaTy/UboCyTZMTCrR7dD2Wl8jlUs2lQnBMzWwnFOKpvBwJy99YUpleZQe46ycJcJpyyGbC8ShHlfN/qJcXS6/ryZoml2rzr692FZnsiLTELbQRhSWfaAzpgC/OQbE9NWJVR+2ErspS+rhDYig1WBrCb0jHuDTtIUMVdQHKBueRgU2G5CybsNRqZacSSA/RqJP1TkzGKOihC9Y4YkWMWMGO2NGI5bmx7jUqcK4zeiKmgf0LSv1Ebm9+wIcOM5MpMDG24r69vbkCNl80QqdeprBlB3LRxKY3HDVNDaTMyE0ugAdUsomYJCmPsayYBKlO2kDQ5lHk5rGEEUBjqz4aMmx4mjX6TfzrMKkUbLz3II2d+sM0PatAIvKaz95jLO3vh/XUqfN+hPiRZQeZtIufalCd+Z4Dl2KEudPtHfjPGcoUsgETxMqsJ3f+lJu7aNuICaBtzmvkVAnbbhOsCNVwAHuQCmA/+wfzKI5Lht0673pJLCOhaGIa3CQDx2jDgeW0C9+ofEQTHfNQHHPS6Jpc8seisFZ/MoxyGCarHDKrxYAqZZl7y05wBV0qR6K1Q2zFavJsNufmCUhXH0fGai3hy1gVDMm4NKGqxt7Zbn/aitQcVWGoq4MwamasJyRatSZfNWj23xChjzWklLvMBssW11VyQ+oEpuhUn03KSYTtiMQaHqNdabCZTLe0noxXZg82BX46XaCfFI9XVlTHEUztMmwt7YI+3ZsFSG44GIskKyKJEpSEcOvZUGA+dQtBnMsB1F4NEmq2CXeIPbTNH5GXImibCoNXU5mIKN9NJy5Rym8HYAiBBVA1LARxi3KAOAI7Xj53cWM1cugcHlb3qotG0yPZda6CUaOpuEtijkMTcy3KApj2O80FRBlhrl2pUR6TngIdJIpDBVEvvdK3tNB235AmR7hQUTftUa2NCfTUm+isj1wfixCq8NOzP3P7IQ1kIazFFqsIlamJDrruv9HA7hPsJ1aqQKtX37mRfDiNy6/OOJY824IhuDRV4MqfjWZTP1RGM4JAQjb090t1xs4EmsykMLjTe76a0hLlLbjRbaL2UTyHTHxlO7tSkZUeUmDqb2Ig6gVIu7JQgNsb1dJNzdtqSbYPYj3pwd4PYqhThyGzjxTtSDakCNXlZ3fWgcuAUzsbNQWafbxnMoTAbHduzpJNSG0gRaV8cs32lm+3BbW+HTLuobcQlXRaTeu/RjRTTKTdcqI+JDrV1B+GQ2fV9zmXhTjAFaz7kCtfA8ViuHERidPhqJiyLGiIqA2o09ZswGgASJMZGLDTWlaA8rSEEGlYSX0PI1csnR046CU1+v6tDdXXDdoIh4Po1zqW4SS6NErNxeKlZhdEkmJhk3jjCSNNRKPE1z9CCvayFoVxRYM1CikbL7bBWXnGx0ujrpwJaQwZSwwl6zQQqb9OIhTV9VldQjcvHTog65p9cHyDGi21i11Gy6Zw6PHgtQeNWh91SiX+gWsU1ZA5HHzrfq9T0yhkQDPFtHHXaOFTv1RHCQ9uEZUFtx8dIGwR8AnX+oMZwW5C+3mCAhB0btnysTTge1oY9EK8RiHTbqOe7EEGAvoVd12STqyzAITFGRgqbJCSRVYnIcXUIrD/4iLSHZVHoY8vhio4TgsEy25tOgmm06HutSbZ15+LMc1vbvr9gLR8asK6w7e69bqSXtpREjrGR9nSvVCbrLAWmzrCzgSfrhOss90ODXK8RDW7xaegzxnYvKUDOeezU9jZI6KX2ApxW0BBbc3QyxkSVcIxkRuVqNm6BuU/HEWpxmtLiSjnp7VKz3IwSlV0QdrZc9DcLxZDT8W7aMsvQpvQSW4iSq5ClhJc821kAnrE29sEi14EK7O36KTQhRkvA0vUB5pcwHFdaizOqSGJqcJzPNkpl92OTn/EwvGPXEwOald4oyC0aSONNEo/XSQqHczRD5XrHDc/LBAsFNaBwF+2aQ32rJvGQKPQdGAwFDWBs3m3F/nLCjMCxMRrEmJJKHDMaGjqF2nkLZdX+ukvya9aCfHVC4eV+sM2MvWNqkxDydrIk6BO0lVcbecmvO2YHXsyBWWoMtqHI7VB0wBtha2IPmKw1N8ejPaHKW2zAuT0/TufeTtSNQSs1HTnod0oxNdJ0TURDQhoU8y46AEpDtPhuy+/OBoyv4Ym3y2f0wNrIzgCHEHoFeSADcgbSYWtKOPEkewI7C9VyFjI2XSOsjgA4qOfSbuGRA6WT9PvRFursgg7VCovKM/LMgEGcdE0osPvroTHTkiRnCmdHgcgMUop5TUnXy5Uar/igzHzV7BmK0e/Fu3oR+obxZ6voNxrFjfykA16dI6QUh4lRTVIpZaumvtCcZ8RNk6nQtFehBtS48brxn6gxDN3pPveyPL9BMwdIbJwfm+bbUoqTGu7ERGHmNVQ2LIGOa55fs4eaIUBNe9goMjSjBvf6HEgOzXg0b+BBbtRzpjWExGakaDWETI2/SFvU0Yeewk2GaBNeiSV/37RKLbJ7bQ7CphB+WPGuz/NW97nyQFADxH0PRx/bB4LjHWh/EoNOOJxpnM/qfw5Gkb9pazXHWfveyrIP5yvns+vQf9WoMzdROKo890Db2k3wXqyuIWjdSRJkgdL0kWCyzBFNp/UBpSmjK8vkkA3jJO60fYjw2giCQW2ShOC2hyM4Ado2afnw9dbJi0CgB9hW2/McpA2TKNGufznR9nzQslC05lPWdZ26D7DJcCUDUVRm+hLigK1uuEzfKLB9DhpUvuWjcczGWelvjC40BL1o4lPrlbdIZdAbBrg7IoRRiJZkRfXr254ssj5lJ7PN1tBJoLscR8J+LgjyqkO4w6VPKnshiLatIWxQrLgeg1ZrNOk7WbiCkyU667Kcvt+N9xgG7eb6zrFmiSeO0O2kEON0iVMQ1Fe4Gv+EOujUbzFsdI09t+1F5arGhrlcyUsNIj0sEnwZEZf4SN7gQ2ZOjPaDubMhGEQYWlGgAGMF2XXRHF+ncMGI+JLH6v07kiWtEungmswokFxTookl0zVXszeTauLaHoetAYdYb5g9zpET3RR2NNYqg8kMrlQwdMgNvOIBm5xMcY5p8nuLfoUKQ2YUdpipb87g3VAqRhMejua9NcHto5LcJC4f5mBK4WNu5bgrqVeWBSJIxQBYITSPt0JHIHfQnuhVwFjL1jU77FEyF+bZfNFXiD2cz0l1P7RAr9VipkqXllUIUYSsMHt6aI9zTd6N9VUnqjeZ9Kjc5wOY5DglC3eMvpsrA32xWm5FIsaRMTeclb7ZUSw8X6qKpIEjZDvXAXrbmWKIM0v4PRfoygaNkG3GukOmwAfSbOKKqMNH+XjiB/IiG08mCW7BJl2s1JBJURWaVisxhKPR0kHkqS9b3SSfMd0pnlgtjd0ULb2Ayn419gxzyUKVZdc0nCvtrShPOJcuByVfjDsDThFAqkQkfAoG10xSH1aa8vgfhyu4mYswtTCtIWveJLkURo6NVCrkxuglFir5cHdPIX+i6WpmTMXdBJpE1vgGzVhKSatZWNoYukiIGQc1YwmKQ9P7GoLq66+ZySiWIW5uMmJkMk3DmQFKlQDIsRvK08ZlTUzktPm/SWxobs1uxPiaMJZbHI5yaKut95sJw99oFzddt3dsdF+s9UG0ObCS5MA6qMP05kF/OTy5ezMEX7+EgytsXNTkMEUnBFl9OdcQUu6qsWPtyBWuLeqApcbsEYGXldGV5i2YZ/sQhFqNQzLURnzMblsQCbR9GwFdALNJBEeuPzdkCyJ8z2kTGGC1YcJyagTD3TaGIoBnez6G+9c1Fyb3+9Vw0N0kY8OL1Hhn14djoyXz8HiSrrEhAI9LeLU2VnGE4WQ1hVHRbtGdXMeE2VyMp3JjkJzNV0VPAtJyFav2nMGxYjyMB7qBeoueoizHGeePN639hu2WLc8B1NVedSDehNXubjax+0N9sJ1X/a022GVbw1+Z9pilNWzUR6Uub4AOScn9TjVsJeMto9t2R6eHyTgOYGCwBhAnRfM5lPV2873gs5gacCNg29/O6GqsrZAMZkEiHuoqudbWwzGw2yyXAwMJq92AARNbQReqvak3dL2EEWtICk2iB0MQZkxCvcvNkFjN5t1gBAse1Bmqg84sk7ZqgXMqzmNc0hlls95iNuNFiQn0oT+0cISrMmM3VAJ+hEzGVNCDoiCO5SiYjTcLWx8OYa6/mdECsHKzNZqX8cQBqqrnzWyjhOc7zu4HgzEODc1oBEt2tNWcJQQv+4QzpMU0SJNdGhfQlp17nAZKFIaMV0tDGuXReuZNxC7Y8NY1PteR8XadZ+hSYgFqDIi0VNPDvusNkjQkej0QS1O6poaT9WRkzqiuY7NhNeGgns2s9phkObPuel1Wae6EUT+go3Sw7uQh6u8TshqQMisMt+wupDxSG4EKSQFUEJUDbo7kvrbbld5mskpHXWjJjdWRWOq75aIzmoYDk0ApIWiRIicACuAPHRQuVCrt47HqbEoltq0SCbD9mPECfq9aIZNxy06wicttVQFszFyzqfcAURin+uOtvDVipHJNdI3GaxKUNKpxQ44vn42gwMN8TzNf0ihvXf18iGzDElqTpht2o1UloArfGK00gtACbDIGbGhc46lZmIeoIcb1Y5DGjMWcNooAYVivRc2SGy0XLlE0sWnnTaVYDo1mloYfIso1aLS6RSP8hY+t3W99vxZRtj44VBdzPWsT3vdGrfoBh9bFRXio01L/3TXKx6vyYLE6oH7rUkw3LsW3OvdVDtdYKydeM8h+jxpktFUUBN5qffn5yWLdFNEhYN66/Hddt/ZdtX7u5ldn8+tJVux/rcrcUhV43jhC1+HuSjkxBIFtAKqZBOTWcONiQJusw0zb8nECcVGHgHHgKnm4R97u1w+73kYUScL3MRLC2pBluW0YAMG2ZdtIGwMQnyBc27fQ6+oVRiceQlZyZ8GGULqdgFo27japEcjPCTJPmAFhoa1R/anqThoLEG00070ZBJkqNYhDvRP3kHnXVEhLyPcw7AZbmFp3zASnC4oWzenaJFeMuN+vxAQrfY+fb/d5b0cJrJdQs4DAndaCjSA95rUt3Wnh/F4pwpFFpMqULwW3RAZIS1/wRNaqN6Bzc7xgl7GIteZoorMu5c9bmsFtPHW1VoDRBshMy5gH+CYZLrtqHlRZ3KkkG9qaXRZdMM7CxIQOvpsNloWS0ELhaRsN6VJFd14adgmtiCmg94ezyU7jqgJbK0uH73t+2NE2qZ6gibpEidY41qcyy8Z40YN7E2xAYmt5sVIpszXe9GZa30h5rUNzW2C9SHJo2V8sSzojQiRWeBVgd9Woa4uqGYx6ymYzjeA0zvJQHzMFBJbAfqAz/H4DLLudqjefxGOEMiPYLgKn7FnUUlfhFGCW6mAP8+RgHA8MbNDNNErVEtMA5vPU75pYXvjgeFyf6+LQomLQWHIqWFBmQjq27Arc15sHK0aFvm9o0TrYmiOhhXoqScEczfc67lyCNyHEFkJPQBhZtllYZue0RIrzFOzBBsQL5H6197OQWe+lqo+jIhd0ec2PLD9SYFmgOjMeCJBJtpgpfXzDhsKc0rzpLAK5qkR4XUB6wryb+l4gE9AG87Aqyj3a21H2gEHyJIa7o1G/xrUWZk40PMZ3CD0w+LQg/dCA2T8LgpxD+xdFa+yK9eLq3CzNeNhIj6FGOixMRgCMqVEoWhhJGhcfTlfUIbqR1voTXmGbGm6a6YrtDToPV7GgNJVqojKEJS2pCYpRr5FUX6NYw25j/yJBEsM1nSxh4wMmHcqFDeF6jYDGLkbWklhiamKkOWjTJyzXkG1eA9HLmx8izFWG4DeLZv7v3FfZXz3zqQdCtvGSJAq8zPFudLv64G+n4qHf8aD8S1CcY+tD0IEwPFBrKNusr2lbmDZVjgjDI6oiyFodq1f1SzuyueKlrepY/VuwgUgbBgnYb6NEAza+Q7QtmMDagAeiAIi4MAhc1RDmmWe76iXXm/oKZnk25OBt0oEPrZOB+vdjWBvDUBgAMJ+0QPS6qny5JrjYqzZNr9SpvxP5Ii02OrDnkekkIlhnvFv4IT7A+97G9sxdYuvjEgunWQk6tuqiBtYtdhToISpZMORamPmBZFATYrz3aAkfrrAdOUKzgjATER0T2AbbgJiPgRGvTHYcO88Gadwar+pNlujTm8l+Y414JPG6KKorg8ynhNE+orQloqgFrQ+gYXczELD9otMdtoSxRVmDIos64Hge7Tq4Upiu6HeHaRrFA4AYBtJ07/c6EVhgFsw5mMSjky1V5Fal44IJjaZqZyVKaGSExRza8J1ZgVGFymv6rCoAaaZmMTXqjneCo+w7RLZkjXgCAuEi0DswG9A+j1b4eCtFzDKliNxNUckOTbzotKatXSfWNjSkDBc55q9bTCuY1TcgN6RVk8IDgV3ZYJmH0qQDgvAQlMYtSvKW0MbWaQiaxNPAjesYEY3H85TY6kMQpDcClHa3fc2n+7HZkjrbchmawQKQOsuJ3hXKCQPmzJg1dqGibUKcwpygWu7WRhRAcVdsdXrBrOarzL7VkU3c6Nk43TG3QUH4TC/rYknVgfRiAikj0ik3xgIAYdZPUYgnR+G27E6pNFNa9b6/KjJtpCGDqAelfSkYDux4p/NIpPkjq6PoNj+iaUZnqKjD0GNPRHG6v2uxk7iICTe3W/FwmqIpTU0Jqt9jVQNQUhOGI321CPLtVpcECVcSMN/gHEKs5WFrypX4nkgNXAHHvp6sFleCzaVX6zemNRm0YSkzAXI1lgCNwnBT164xVK6BZw4ojDs3GmvhKqx5gYTINeAoU27+J/gO42RJ4fJJrPFkZc6EvXSDrv+Tc5NnUXna+IhJTf2+bDJoDeDU/C+W4kbZa4hI6RCowXYuQ2y9RvUaxIf2yqgBTeZGOkmlqn77tBqQ4nBu1OD+/6Pn2NUoh510qLhsbe51KB3WqPxvQis7sA5ya7UpH3RAXf7NYataEW3Cml953kGwqGmItz4UF2se/Rsm1ZAo/Aq0uPZqYHeqDzWtyo24WFNo6tacbVs/+TWEqC4ra/rI+P3OZcCyCbuZMLHq79qIh3ttu+kh9gHfsS0EsFyCuAocPSm6yXevt85lGIYwxEGQxicZbsMYANfcC0Davg8SKAG6uAte1x4EG5Rgf8a5VinkKd+ZS1N2W+LevEjdeWJ0TFmOeRea0t1ZwW6ZLFEnk9VoONgqk3hikdzcWpvzmMf4IPJHSBEGlBUBjEIjaawNBkmfUqCNkw6AOJvsJ16GbH1vPGDpfKtCJGd15mwX2RPbedVytn2k0svORtd6pbsP4iXaiWTH4OlSVIF5hKRzjFj5u3VAyOZCIoK+pC226zHOc1m0dAJkUSOJY0HsOqUjcxZvZQjxiNFm1ZWWg30fE/briW1ilhmqnbKkaa2OB3G9MXTxPcSqgabwdpf1pVUHcDuGjYpzbL9zlN7C7sD6nDacKdiZDsIltkoya2y63UAL1iqLhAQwDxalp3kO0eeLguzo+aAabiZWdzon9wOlNzdY0FEG4XYmlrCvt1oix5bqwGYGpDuNRpGihHOdALq75XSBZMGEblEotusaFNrn1LHfmznzluhA89IyGS+1dTDwhXVNQibdDF1tIXLIWa5bKVNjGpoU1N+vrGE/nQ7owoMHeithJUuiUnWIL+iuWBCTAJ4xsyUF5dpGLgTJ6W3N3nxcEMQa1VfKzHDCMNa0Hk1YKoQlICmttmNFz/rd9VK1J8aSIlNFsDrpuAjjdSdZuC4G4hCgmlGUobvVxK+AKp+THRPlOGBhTywCV0F1LvaGUOBJRgGy/Fan88zJXZyWfFTaUSXIVBxEzqEdQe0ISxqAGxhG8yRp7fOq6oured8EEOx3WtFmXvn7UKTEh2KRdXgdHtbZayha/w58iDWkYEIq1BxnFElxGBlVHWqrIaIwSdiIXSmMAUlTOTG1OWRMuagOr78DYWhoT/VIiURklHK5pe8TveZDfxRu4vzyNNvvp9iw+jVfDi9xjl8BKdi1m4Rn92ZsoBJkwGYqhjUcwDXnCRWerbkJi0qVHMnQKDGZxg/Z2MvxHDQZt+YyAmJqSSg3abR6HWp+CBjaaC5r4tyMRNKfXV3ov1MjU1wHz4PLw9pvfSb/opREi7KyfkE1XbqmpftbaYJsHGEoucteWa+HUdfBEdhuAwCMtZEmy0SCJNw+1OKyAbLxg7xKuH/iu9HseptvtHzMwj0faJOY47ThQyEwnyDaJOIjKIr5EO5dV43hYk+3ktWsi8UmZuOtMbogoNLugVWIwhQEyqNlqO81ZEMTCTNmLDjuaRzLcsbUJaE1hnmMu9FdVC8tUU8NS+tHSr3tTuuAJ8MSDxEJgU1TczNYbQN1V/G0JVTOkCaVrCv0x7FZqkxcMGa94asJTbhNcUOdlpBkEAIL2CODXVo012XUdIu5nY6ki0sgK7eripkURCAM4oxROj2dXtSb+94Cl3K16rHSBmSFfr5ctGBibPVdUOMFhErlYbDziNgEbM4PyeFO1XzN4/YVtpITDwRokk5zYhyJUH+ygvH1ZkENQTg2rF5WZIuUppUl3HEJkkfUYGnragRPyU7mw711OKqUMabixhYTkVjzWAffT7dpMKSXk950hPhyUxXvzqSeH+NjbBzEG8PvKEsom5jiYM5l8Dqw6ACZofE2bG1Qkt3o5M5QFt18PO4v1cFuxa78sq8PqlR1U3vZF9GYpgpvvp8aXtal13CrK7G0IhnGgKk0QpWW9eoWYqe1s2R2iIRM4lbwdJPyptzbCtYs0fyuhKwjHJPjTRSMVzogb7ZTWwP6roDKvN3vcsoM2vTJ3jSNNx2Ac1deGEqtvUtPaFTigeF4GO3BUgdW3mpd7xVj3HYRcJ+ODTQGBUqd6UHX6+RZmCU5W6MhTqDKDNeicsdTK3uAdNc9YcJBNdcR7Tk5AI1NMt4GWy2maWyBSJaz4cCEFoVWr587UC5bcT4asH9Wy1mjrtWIoAilXNX//nH2AZixDplaACnMHFJ4vUndFEZ66AMMydUoOdQgbiowf4J9THSZ1xgWvEGnuqCa4GtubPKTOsw7ewlqNIcbVa6aTTQMi5cbOKgaURUpbnQhuVRmklRKzbCGwbSGEUSZ1jcHkyRSatSwOalhM/iLtJz91Y1OblrOFonbzEQ6slccGJ61Ouhac+9Q3PGAtZzwYFvvAreXS/Ff9VEHV7CRQxHJqKYuVnCFLcwhqh0C2Vdf+IqDy9vaDhNtN2k0KE9sIG+7WtWE4oBeZNv15aCHoFc++PIH3u3wWbxRFISbtpM0EzmbxUEdkLNrT2uaAZzfvwra+vPHMW9xoztlXnGkrE8+4tQnH6mv+Yhrbawb3ejobx5/RrOuzZ+PvaC/eIhx3PmLbx711PP+7n03vtPBK74BHv13xz5Qf9XHX/7OHz32+7ftIvadwskF5UmT2z3cLfwP3uvDP/ng+afdzD6qd/Rtb/NXt73d6W//0lu5Lz0l++5XxYf8y6Uf/8xbfjj+1pH3vGb9iAu3xdvP+5b1ue13ueJrb77Pp172jn/49S/P+3y8vPBLDznv/OLtD/7xfR70rZ//ywu+9MLjX/Scn18W/OAHr/zlT1/8vu++6eL//uHLgx+88gE//vLP2FP+SVnUV3HZh3990X9/rXrrQ17Y+fb5P/7qxW985FkPu8/XLoZ23/vgg77589eddcbb7nfKgx781h+dcfF/CQ898bGfeebFt1COvPsXlz7gQd859utn/zP6sEfoX/7ZZ789/dmPXxsc/85fX/Srp8lfvv8l2SlP/sT8J97P/tu6zP3ZSx/wlnce/+LPXvz/PvufHz7j3V/6m91P/vaXj9gep0xee8an/9vWO4td8Yn/utfTfl487IEf/uHb3vnTO9/iske+/eHf/spjXnzKz7//3g8px3/pQT/7wU3KX59x5x9+C1/d6kVHPzP+7MPZJz/sZi98zaM/cPbZZ3yeJC757uvkF3/uI/ojfjUsPnH8UXc/4b7vO/stH/nJIz+1xd/+iUd0Hvi0p/3iyP/8+hYfHR/1jbNPeyR5NPH+SwYfe8Xmya/r3UtNTjn5ezf52dfF96pvvdF72qf9w23u8v0Lf/hDN3vsBQ95lnD0y+/a/+n0MY995mfOId/0qbNu+ZUnU+zxZ374KQ/5n7efdebX7vSVd3zlgz8+7Tvg836mA//xxJPv8p3Zu9/zt1+fP/8pJ7xx/CLxDu++96u/fvH5l9zHfUP7Lm/+wnHHvaH10wsvOuZW+9ecfs4Fx/3gBdQ5r3/chz/+T+fe6ec33k0ep72LfuY5nzefcu8v3PUR//wvt5p97Ze3vPCSJ/70bqc853uLJ9zjbc86XZ3d7N9fcfrfPeH2bz3r4MSzHn33571vd9SPXnXKfT96W+AhbzjrqGOco36dEScc8/AO9ZLB8cd+ffOsGz/n5Ow40/rkB+73nlv89H4nfPSXtzv3k9odB/Xj/vG2wOPsN92+/SZMuOn93fPu+LpnfOMDZ9/44d/J/xq45B5fvNFn4UuXH5BuduFTbvbLJ1Dn3In91Gte/Yx/M098bld/1N3+75kn3v4tXzT7X3jOSadZ0nOf9uO7w+cq7IVPu+cvz6fOBW968+f8161PPXOfv/nk47TzHtVtnff5Mz/6wK/866uto+FjnvhqjoSrZ/3i03nvFRPJeT1wycHdnv5M+/ZvfNJx7+Jfj/7du/i7SMpzfTL6pHYi9XL2q594zGNPQU5/2Tuf8Q7u6AcvtGcwk+d3v2o/+aj/+Nb6XdxH8cdHJz/9JRec+IN/tm4vm8i5d/aS+z7pZPGBz71Uj29E3n9897NOOWf+dOBNCHrumyLfO/fs0359vwe0nkkIvvqhV55074e8QHz1Sd5rHn+ReYG7G9/lDT8/88UXv/sJZ/0H98lL0vf/583/6iefZj4Gnf9Km/3Mo59708996jbri15wzF9/5lP/8+5v/uiUr+Rv+f4F1ePBBzz7dReExi9+cWDzHwtu9+xT7/Glp76MO+9C94s3ct711lff86wXnviBe6zfNXr5Xe/0A+2N3Mu97xz/vsee8frnsU946ZNe9vTly1KN/cIB9WPy4scu7/WEH/x9MqDfcdcbv+jDnwnf/NrL1hd+5kQ9vFA79vF3eOXd7nCvMz7c/9pNXvZV88It+oAbv+nzwieP6V8oXxzv6kfO/ylfvvr/PNs69lbCV+znlO+722uPOfFOl57xjv845dze9L5f+ead37d7jRzwxdsfeZvb3fxWH3/25NmvOPttzLMf0fv7/3zck11n/fr7fflhD6ZffNxZnzj9rs9/7AtPvselFz559sW7fP217z3/34F7A7pL3DHab7/zgcc/vfsg+nsf/P7bP/K8t/AfVR//He3hxf1333v328i7n3vs2TT9mdkH3De+99Wf/GTrgv/nvlZ4nvPl+576xTt8/34H/vmfk+743iy5aSd7l/X8NX3B/c/76Ln4Pe/69XdqZ39o9O7PdD/7f95xs2O+fcsXffN1Xznrbv/8pQuX5fLh+8/2MODmT7yp+JLTn3jHX5zcVl7ykfcnj/rSU4/+WvXv/3T6aeXtXhT/4LsfuO+X73yLBfGun9yp+5nR295wpEdo7/3IO888e3Xry977pi8b73zBr8LsJhd+TDnxi9oTPpJd+pUffvXj37/s9rtLxwfeUT9fft6747+dBt37vNn63g/89kPPuWyU/s2569dd9Or7nPuUt57+iVs/mAmfr775qDF62VeC251zv79fvOBNl976G2++xV3+4TYX/u38+Udu9otXv/3M47908XePvc3d7kJ+5MKzzrz5p5+Qqy+92z0mH72rc9pLiqM+rTMX3ad1ofKZi395yX2Lxdse/Q8f/vYZ0Sse+k+nv+Rljz7pgqMD+94XfvBRX7jZO5949PPvddGrn3PuP1462v/gf/6V++lDnvz3z/she4enPOmtNyZefvLH/xp7A/2ht91i/9BzX/og/PnHX/Tqz0b/eOn90h88zjrj++373+OZZ77kdfZxX85ufus7zx7c+dpDV/e/s3pp9a0vB8C5xxylfObrv7zkpJ+ch3/xacCL4hNudhTz2L/qcRe7z27f7QQdkL55yjnfPun88/3Hv3z13JNPPPeS03/6qe9/KDhO+rbyPcl7xukh9OHhsa95xT/qwvPab/3O8PN/8/qfnQt+PH/wh8bCTZ/2nNP/5dY/Qk869cRXiZfc89wnHcU/68a7+4rAR8659H2/Qi/913uf+tyvnPvCVz3j6L9tH3fk+AdecNFD7oZM7vvg1x5tq0/+1CVfX7+ePO19/1Uc9ZMvXPTuR1uPf8zdlbfc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' }); expect(data).toBeDefined(); diff --git a/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalisman.ts b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalisman.ts index c706c6920..8ee130502 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalisman.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalisman.ts @@ -4,7 +4,7 @@ import { decode } from '../../../../../Utils/SkyBlockUtils.js'; class SkyBlockMemberInventoriesBagsTalisman extends SkyBlockMemberInventoriesBaseInventory { override async decodeData(): Promise { - if (undefined === this.base64 || null === this.base64) return null; + if (undefined === this.base64 || this.base64 === null) return null; const decoded = await decode(this.base64); return new SkyBlockMemberInventoriesBagsTalismanDecoded(decoded); } diff --git a/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalismanDecoded.ts b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalismanDecoded.ts index aafc64315..664b65f59 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalismanDecoded.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalismanDecoded.ts @@ -10,8 +10,8 @@ class SkyBlockMemberInventoriesBagsTalismanDecoded extends SkyBlockMemberInvento } private getMagicalPowerItem(rarity: Rarity, id: string = 'UNKNOWN') { - if ('HEGEMONY_ARTIFACT' === id) return 2 * (magicalPowerValues?.[rarity] || 0); - if ('RIFT_PRISM' === id) return 11; + if (id === 'HEGEMONY_ARTIFACT') return 2 * (magicalPowerValues?.[rarity] || 0); + if (id === 'RIFT_PRISM') return 11; return magicalPowerValues?.[rarity] || 0; } diff --git a/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipment.test.ts b/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipment.test.ts index e32bd56f0..03e119ff1 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipment.test.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipment.test.ts @@ -4,7 +4,7 @@ import { expect, expectTypeOf, test } from 'vitest'; test('SkyBlockMemberInventoriesEquipment', () => { const data = new SkyBlockMemberInventoriesEquipment({ - // eslint-disable-next-line max-len + // eslint-disable-next-line @stylistic/max-len data: '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' }); expect(data).toBeDefined(); diff --git a/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipment.ts b/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipment.ts index d3c05f8a0..5a0d3f9af 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipment.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipment.ts @@ -4,7 +4,7 @@ import { decode } from '../../../../../Utils/SkyBlockUtils.js'; class SkyBlockMemberInventoriesEquipment extends SkyBlockMemberInventoriesBaseInventory { override async decodeData(): Promise { - if (undefined === this.base64 || null === this.base64) return null; + if (undefined === this.base64 || this.base64 === null) return null; const decoded = await decode(this.base64); return new SkyBlockMemberInventoriesEquipmentDecoded(decoded); } diff --git a/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventory.test.ts b/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventory.test.ts index 24ded2a1e..611805425 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventory.test.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventory.test.ts @@ -4,7 +4,7 @@ import { expect, expectTypeOf, test } from 'vitest'; test('SkyBlockMemberInventoriesInventory', () => { const data = new SkyBlockMemberInventoriesInventory({ - // eslint-disable-next-line max-len + // eslint-disable-next-line @stylistic/max-len data: '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' }); expect(data).toBeDefined(); diff --git a/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventory.ts b/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventory.ts index 536649d71..ce4fcf0e6 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventory.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventory.ts @@ -4,7 +4,7 @@ import { decode } from '../../../../../Utils/SkyBlockUtils.js'; class SkyBlockMemberInventoriesInventory extends SkyBlockMemberInventoriesBaseInventory { override async decodeData(): Promise { - if (undefined === this.base64 || null === this.base64) return null; + if (undefined === this.base64 || this.base64 === null) return null; const decoded = await decode(this.base64); return new SkyBlockMemberInventoriesInventoryDecoded(decoded); } diff --git a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningCrystal.ts b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningCrystal.ts index 455e38f64..51e6fa059 100644 --- a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningCrystal.ts +++ b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningCrystal.ts @@ -3,7 +3,7 @@ class SkyBlockMemberMiningCrystal { totalFound: number; totalPlaced: number; constructor(data: Record) { - this.found = data.state ? 'FOUND' === data.state : false; + this.found = data.state ? data.state === 'FOUND' : false; this.totalFound = data?.total_found || 0; this.totalPlaced = data?.total_placed || 0; } diff --git a/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPets.ts b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPets.ts index 5ee5fccf0..7acb8096f 100644 --- a/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPets.ts +++ b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPets.ts @@ -36,11 +36,11 @@ class SkyBlockMemberPets { const highestRarity = {} as Record; const highestLevel = {} as Record; for (const pet of this.pets) { - if ('UNKNOWN' === pet.type) continue; - if ('UNKNOWN' === pet.tier) continue; + if (pet.type === 'UNKNOWN') continue; + if (pet.tier === 'UNKNOWN') continue; // ? NOTE: FRACTURED_MONTEZUMA_SOUL is a rift pet so it's not accounted in the calculation - if ('FRACTURED_MONTEZUMA_SOUL' === pet.type) { + if (pet.type === 'FRACTURED_MONTEZUMA_SOUL') { continue; } diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStats.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStats.ts index 9de598b83..f4c8e7610 100644 --- a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStats.ts +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStats.ts @@ -31,7 +31,7 @@ class SkyBlockMemberPlayerStats { this.kills = { total: Object.values(data?.kills || {}).reduce((acc: any, curr) => acc + curr, 0) as number, ...Object.keys(data?.kills || {}) - .filter((key) => 'total' !== key) + .filter((key) => key !== 'total') .sort((a, b) => data?.kills[b] - data?.kills[a]) .map((key) => ({ [key]: data?.kills[key] })) .reduce((acc, curr) => ({ ...acc, ...curr }), {}) @@ -39,7 +39,7 @@ class SkyBlockMemberPlayerStats { this.deaths = { total: Object.values(data?.deaths || {}).reduce((acc: any, curr) => acc + curr, 0) as number, ...Object.keys(data?.deaths || {}) - .filter((key) => 'total' !== key) + .filter((key) => key !== 'total') .sort((a, b) => data?.deaths[b] - data?.deaths[a]) .map((key) => ({ [key]: data?.deaths[key] })) .reduce((acc, curr) => ({ ...acc, ...curr }), {}) diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFight.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFight.ts index d7b100d34..e9ab9e178 100644 --- a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFight.ts +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFight.ts @@ -1,4 +1,4 @@ -// eslint-disable-next-line max-len +// eslint-disable-next-line @stylistic/max-len import SkyBlockMemberPlayerStatsEndIslandDragonFightDragon from './SkyBlockMemberPlayerStatsEndIslandDragonFightDragon.js'; class SkyBlockMemberPlayerStatsEndIslandDragonFight { diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFightDragon.test.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFightDragon.test.ts index 9f23feb01..f11bc622f 100644 --- a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFightDragon.test.ts +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFightDragon.test.ts @@ -1,4 +1,4 @@ -// eslint-disable-next-line max-len +// eslint-disable-next-line @stylistic/max-len import SkyBlockMemberPlayerStatsEndIslandDragonFightDragon from './SkyBlockMemberPlayerStatsEndIslandDragonFightDragon.js'; import { expect, expectTypeOf, test } from 'vitest'; diff --git a/src/Structures/SkyBlock/Member/SkyBlockMemberObjectives.ts b/src/Structures/SkyBlock/Member/SkyBlockMemberObjectives.ts index 22dacec92..00ef89c43 100644 --- a/src/Structures/SkyBlock/Member/SkyBlockMemberObjectives.ts +++ b/src/Structures/SkyBlock/Member/SkyBlockMemberObjectives.ts @@ -5,7 +5,7 @@ class SkyBlockMemberObjectives { tutorial: string[]; constructor(data: Record) { this.objectives = Object.keys(data) - .filter((key) => 'tutorial' !== key) + .filter((key) => key !== 'tutorial') .reduce((obj: Record, key: string) => { obj[key] = data[key]; return obj; diff --git a/src/Structures/SkyBlock/Profile/SkyBlockProfile.ts b/src/Structures/SkyBlock/Profile/SkyBlockProfile.ts index 66c91d0cb..0c984786b 100644 --- a/src/Structures/SkyBlock/Profile/SkyBlockProfile.ts +++ b/src/Structures/SkyBlock/Profile/SkyBlockProfile.ts @@ -30,7 +30,7 @@ class SkyBlockProfile { this.createdAt = this.createdTimestamp ? new Date(this.createdTimestamp) : null; const members = data?.members || {}; this.members = Object.keys(members).map((uuid) => new SkyBlockMember(uuid, members?.[uuid] || {})); - this.me = null !== extra.uuid ? this.members.find((x) => x.uuid === extra.uuid) || null : null; + this.me = extra.uuid !== null ? this.members.find((x) => x.uuid === extra.uuid) || null : null; this.gameMode = data?.game_mode || null; this.banking = new SkyBlockProfileBanking(data?.banking || {}); this.profileName = data?.cute_name || 'UNKNOWN'; diff --git a/src/Structures/Static/Quest.ts b/src/Structures/Static/Quest.ts index 6d9c17339..7d96bb93e 100644 --- a/src/Structures/Static/Quest.ts +++ b/src/Structures/Static/Quest.ts @@ -13,7 +13,7 @@ class Quest { this.name = (data?.name || '').trim(); this.description = (data?.description || '').trim(); this.rewards = data.rewards || []; - this.type = 'DailyResetQuestRequirement' === data.requirements?.[0].type ? 'Daily' : 'Weekly'; + this.type = data.requirements?.[0].type === 'DailyResetQuestRequirement' ? 'Daily' : 'Weekly'; this.objectives = (data?.objectives || []).map((objective: any) => new QuestObjective(objective)); } diff --git a/src/Structures/Static/QuestObjective.ts b/src/Structures/Static/QuestObjective.ts index 506d0748d..a10a6230b 100644 --- a/src/Structures/Static/QuestObjective.ts +++ b/src/Structures/Static/QuestObjective.ts @@ -6,7 +6,7 @@ class QuestObjective { amountNeeded: number; constructor(objective: Record) { this.id = objective.id; - this.type = 'IntegerObjective' === objective.type ? 'Integer' : 'Boolean'; + this.type = objective.type === 'IntegerObjective' ? 'Integer' : 'Boolean'; this.amountNeeded = parseInt(objective.integer || '1', 10); } } diff --git a/src/Utils/Constants.ts b/src/Utils/Constants.ts index 87acdab74..392c0339d 100644 --- a/src/Utils/Constants.ts +++ b/src/Utils/Constants.ts @@ -363,28 +363,231 @@ export const petRarityOffset: { [key in Rarity | 'UNKNOWN']: number } = { }; export const PetLevels: number[] = [ - 100, 110, 120, 130, 145, 160, 175, 190, 210, 230, 250, 275, 300, 330, 360, 400, 440, 490, 540, 600, 660, 730, 800, - 880, 960, 1050, 1150, 1260, 1380, 1510, 1650, 1800, 1960, 2130, 2310, 2500, 2700, 2920, 3160, 3420, 3700, 4000, 4350, - 4750, 5200, 5700, 6300, 7000, 7800, 8700, 9700, 10800, 12000, 13300, 14700, 16200, 17800, 19500, 21300, 23200, 25200, - 27400, 29800, 32400, 35200, 38200, 41400, 44800, 48400, 52200, 56200, 60400, 64800, 69400, 74200, 79200, 84700, 90700, - 97200, 104200, 111700, 119700, 128200, 137200, 146700, 156700, 167700, 179700, 192700, 206700, 221700, 237700, 254700, - 272700, 291700, 311700, 333700, 357700, 383700, 411700, 441700, 476700, 516700, 561700, 611700, 666700, 726700, - 791700, 861700, 936700, 1016700, 1101700, 1191700, 1286700, 1386700, 1496700, 1616700, 1746700, 1886700 + 100, + 110, + 120, + 130, + 145, + 160, + 175, + 190, + 210, + 230, + 250, + 275, + 300, + 330, + 360, + 400, + 440, + 490, + 540, + 600, + 660, + 730, + 800, + 880, + 960, + 1050, + 1150, + 1260, + 1380, + 1510, + 1650, + 1800, + 1960, + 2130, + 2310, + 2500, + 2700, + 2920, + 3160, + 3420, + 3700, + 4000, + 4350, + 4750, + 5200, + 5700, + 6300, + 7000, + 7800, + 8700, + 9700, + 10800, + 12000, + 13300, + 14700, + 16200, + 17800, + 19500, + 21300, + 23200, + 25200, + 27400, + 29800, + 32400, + 35200, + 38200, + 41400, + 44800, + 48400, + 52200, + 56200, + 60400, + 64800, + 69400, + 74200, + 79200, + 84700, + 90700, + 97200, + 104200, + 111700, + 119700, + 128200, + 137200, + 146700, + 156700, + 167700, + 179700, + 192700, + 206700, + 221700, + 237700, + 254700, + 272700, + 291700, + 311700, + 333700, + 357700, + 383700, + 411700, + 441700, + 476700, + 516700, + 561700, + 611700, + 666700, + 726700, + 791700, + 861700, + 936700, + 1016700, + 1101700, + 1191700, + 1286700, + 1386700, + 1496700, + 1616700, + 1746700, + 1886700 ]; export const CustomPetLeveling: CustomPetLevelingData = { GOLDEN_DRAGON: { type: 1, petLevels: [ - 0, 5555, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, - 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, - 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, - 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, - 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, - 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, - 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, - 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, - 1886700, 1886700, 1886700 + 0, + 5555, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700, + 1886700 ], maxLevel: 200 }, @@ -1146,20 +1349,112 @@ export const NETHER_WART = { export const BestiaryBrackets: { [key: number]: number[] } = { 1: [ - 20, 40, 60, 100, 200, 400, 800, 1400, 2000, 3000, 6000, 12000, 20000, 30000, 40000, 50000, 60000, 72000, 86000, - 100000, 200000, 400000, 600000, 800000, 1000000 + 20, + 40, + 60, + 100, + 200, + 400, + 800, + 1400, + 2000, + 3000, + 6000, + 12000, + 20000, + 30000, + 40000, + 50000, + 60000, + 72000, + 86000, + 100000, + 200000, + 400000, + 600000, + 800000, + 1000000 ], 2: [ - 5, 10, 15, 25, 50, 100, 200, 350, 500, 750, 1500, 3000, 5000, 7500, 10000, 12500, 15000, 18000, 21500, 25000, 50000, - 100000, 150000, 200000, 250000 + 5, + 10, + 15, + 25, + 50, + 100, + 200, + 350, + 500, + 750, + 1500, + 3000, + 5000, + 7500, + 10000, + 12500, + 15000, + 18000, + 21500, + 25000, + 50000, + 100000, + 150000, + 200000, + 250000 ], 3: [ - 4, 8, 12, 16, 20, 40, 80, 140, 200, 300, 600, 1200, 2000, 3000, 4000, 5000, 6000, 7200, 8600, 10000, 20000, 40000, - 60000, 80000, 100000 + 4, + 8, + 12, + 16, + 20, + 40, + 80, + 140, + 200, + 300, + 600, + 1200, + 2000, + 3000, + 4000, + 5000, + 6000, + 7200, + 8600, + 10000, + 20000, + 40000, + 60000, + 80000, + 100000 ], 4: [ - 2, 4, 6, 10, 15, 20, 25, 35, 50, 75, 150, 300, 500, 750, 1000, 1350, 1650, 2000, 2500, 3000, 5000, 10000, 15000, - 20000, 25000 + 2, + 4, + 6, + 10, + 15, + 20, + 25, + 35, + 50, + 75, + 150, + 300, + 500, + 750, + 1000, + 1350, + 1650, + 2000, + 2500, + 3000, + 5000, + 10000, + 15000, + 20000, + 25000 ], 5: [ 1, 2, 3, 5, 7, 10, 15, 20, 25, 30, 60, 120, 200, 300, 400, 500, 600, 720, 860, 1000, 2000, 4000, 6000, 8000, 10000 diff --git a/src/Utils/Guild.ts b/src/Utils/Guild.ts index c364e0b0c..02d617b80 100644 --- a/src/Utils/Guild.ts +++ b/src/Utils/Guild.ts @@ -15,11 +15,11 @@ export function parseHistory(historyData: Record): ExpHistory[] { day: x[0], date: x[0].match(dateRegExp) ? parseDate( - x[0] - .match(dateRegExp)! - .slice(1) - .map((x) => parseInt(x, 10)) - ) + x[0] + .match(dateRegExp)! + .slice(1) + .map((x) => parseInt(x, 10)) + ) : undefined, exp: x[1] || 0, totalExp: @@ -31,18 +31,31 @@ export function parseHistory(historyData: Record): ExpHistory[] { export function getGuildLevel(exp: number) { const EXP_NEEDED: number[] = [ - 100000, 150000, 250000, 500000, 750000, 1000000, 1250000, 1500000, 2000000, 2500000, 2500000, 2500000, 2500000, - 2500000, 3000000 + 100000, + 150000, + 250000, + 500000, + 750000, + 1000000, + 1250000, + 1500000, + 2000000, + 2500000, + 2500000, + 2500000, + 2500000, + 2500000, + 3000000 ]; let level = 0; - for (let i = 0; 1000 >= i; i += 1) { + for (let i = 0; i <= 1000; i += 1) { let need: number; if (i >= EXP_NEEDED.length) { need = EXP_NEEDED[EXP_NEEDED.length - 1] || 0; } else { need = EXP_NEEDED[i] || 0; } - if (0 > exp - need) { + if (exp - need < 0) { return Math.round((level + exp / need) * 100) / 100; } level += 1; @@ -58,7 +71,7 @@ export function ranks(data: Record) { } export function expLimit(exp: number) { - return 2e5 < exp ? (7e5 < exp ? 2.5e5 + Math.round(exp * 0.03) : 2e5 + Math.round((exp - 2e5) / 10)) : exp; + return exp > 2e5 ? (exp > 7e5 ? 2.5e5 + Math.round(exp * 0.03) : 2e5 + Math.round((exp - 2e5) / 10)) : exp; } export function calculateExpHistory(data: GuildMember[]): ExpHistory[] { diff --git a/src/Utils/RemoveSnakeCase.ts b/src/Utils/RemoveSnakeCase.ts index 1054b70a5..8087614b7 100644 --- a/src/Utils/RemoveSnakeCase.ts +++ b/src/Utils/RemoveSnakeCase.ts @@ -1,5 +1,5 @@ export function validateJSON(obj: any) { - return 'object' === typeof obj && '{' === JSON.stringify(obj)[0]; + return typeof obj === 'object' && JSON.stringify(obj)[0] === '{'; } export function recursive(obj: any, lowerCase: boolean = false): any { diff --git a/src/Utils/SkyBlockUtils.ts b/src/Utils/SkyBlockUtils.ts index 7e6c4aae4..9fd4a3ff8 100644 --- a/src/Utils/SkyBlockUtils.ts +++ b/src/Utils/SkyBlockUtils.ts @@ -48,12 +48,12 @@ export async function decode(base64: any, isBuffer: boolean = false): Promise; - if ('number' !== typeof xp || isNaN(xp)) { + if (typeof xp !== 'number' || isNaN(xp)) { xp = 0; } diff --git a/src/index.ts b/src/index.ts index a695385df..bcac0bedc 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ /* v8 ignore next 1000 */ -/* eslint-disable max-len */ +/* eslint-disable @stylistic/max-len */ import Client from './Client.js'; import Errors from './Errors.js'; From 5de2e871a36904eddef62d7db5cbd4fb03d06d76 Mon Sep 17 00:00:00 2001 From: Jacob Date: Thu, 18 Sep 2025 16:12:08 +0800 Subject: [PATCH 045/124] style(format) --- src/Client.ts | 1 - src/Private/Updater.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/src/Client.ts b/src/Client.ts index 7d630de07..ab5f2133e 100644 --- a/src/Client.ts +++ b/src/Client.ts @@ -74,7 +74,6 @@ class Client { this[func] = endpoint.execute.bind(endpoint); } if (clients.find((x) => x.key === key)) { - console.warn(Errors.MULTIPLE_INSTANCES); const found = clients.find((x) => x.key === key); if (found) { diff --git a/src/Private/Updater.ts b/src/Private/Updater.ts index e5e40050b..68d54e8da 100644 --- a/src/Private/Updater.ts +++ b/src/Private/Updater.ts @@ -1,4 +1,3 @@ - import Client from '../Client.js'; import Errors from '../Errors.ts'; import packageJson from '../../package.json' with { type: 'json' }; From 026432c94f535f40750497be5f4553cde532b96f Mon Sep 17 00:00:00 2001 From: Jacob Date: Thu, 18 Sep 2025 16:13:14 +0800 Subject: [PATCH 046/124] Release 12.0.0-10 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ef416ffc7..66a0e5aa7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hypixel-api-reborn", - "version": "12.0.0-9", + "version": "12.0.0-10", "description": "Feature-rich Hypixel API wrapper for Node.js", "main": "dist/index.js", "types": "dist/index.d.ts", From 5bdb1d01435c7687208a5d5bc44539cd8d14ef76 Mon Sep 17 00:00:00 2001 From: Jacob Date: Tue, 23 Sep 2025 21:28:26 +0800 Subject: [PATCH 047/124] feat(SkyBlockMemberCrimsonIsleTrophyFish): Ranks total caught Each rank now has it's total caught for that rank --- .../SkyBlockMemberCrimsonIsleTrophyFish.ts | 40 ++++++++++++++++++- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish.ts index 0b3f4d251..cc76f01a5 100644 --- a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish.ts +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish.ts @@ -21,6 +21,10 @@ class SkyBlockMemberCrimsonIsleTrophyFish { soulFish: SkyBlockMemberCrimsonIsleTrophyFishFish; karateFish: SkyBlockMemberCrimsonIsleTrophyFishFish; moldfin: SkyBlockMemberCrimsonIsleTrophyFishFish; + bronze: number; + silver: number; + gold: number; + diamond: number; constructor(data: Record) { const rewards = data?.rewards || [1]; this.rank = this.getTrophyFishRank(rewards[rewards.length - 1]); @@ -42,6 +46,10 @@ class SkyBlockMemberCrimsonIsleTrophyFish { this.soulFish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'soul_fish'); this.karateFish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'karate_fish'); this.moldfin = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'moldfin'); + this.bronze = this.getTrophyFishPerRank('Bronze'); + this.silver = this.getTrophyFishPerRank('Silver'); + this.gold = this.getTrophyFishPerRank('Gold'); + this.diamond = this.getTrophyFishPerRank('Diamond'); } toString(): CrimsonIsleTrophyFishRank { @@ -50,8 +58,6 @@ class SkyBlockMemberCrimsonIsleTrophyFish { private getTrophyFishRank(level: number): CrimsonIsleTrophyFishRank { switch (level) { - case 1: - return 'Bronze'; case 2: return 'Silver'; case 3: @@ -62,6 +68,36 @@ class SkyBlockMemberCrimsonIsleTrophyFish { return 'Bronze'; } } + + private getTrophyFishPerRank(rank: CrimsonIsleTrophyFishRank): number { + const fishes = [ + this.gusher, + this.blobfish, + this.lavaHorse, + this.goldenFish, + this.volcanicStonefish, + this.slugfish, + this.vanille, + this.obfuscatedFish1, + this.obfuscatedFish2, + this.obfuscatedFish3, + this.sulphurSkitter, + this.skeletonFish, + this.manaRay, + this.flyfish, + this.steamingHotFlounder, + this.soulFish, + this.karateFish, + this.moldfin + ]; + + const key = rank.toLowerCase() as keyof (typeof fishes)[number]; + return fishes.reduce((sum, fish) => { + const value = fish[key]; + const num = typeof value === 'function' ? value() : value; + return sum + (num ?? 0); + }, 0); + } } export default SkyBlockMemberCrimsonIsleTrophyFish; From e6dba38840f4db72bc04e3fb43326c1d52b11ab7 Mon Sep 17 00:00:00 2001 From: Jacob Date: Tue, 23 Sep 2025 21:33:49 +0800 Subject: [PATCH 048/124] Release 12.0.0-11 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 66a0e5aa7..241f86c21 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hypixel-api-reborn", - "version": "12.0.0-10", + "version": "12.0.0-11", "description": "Feature-rich Hypixel API wrapper for Node.js", "main": "dist/index.js", "types": "dist/index.d.ts", From 5da3a41e1d2bc618b7e4301e05fddf6c0cdd20f5 Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 24 Sep 2025 09:27:53 +0800 Subject: [PATCH 049/124] feat(SkyBlockMemberCrimsonIsleTrophyFishCaught) --- .../SkyBlockMemberCrimsonIsle.test.ts | 4 +- .../CrimsonIsle/SkyBlockMemberCrimsonIsle.ts | 4 +- ...kyBlockMemberCrimsonIsleTrophyFish.test.ts | 5 ++- .../SkyBlockMemberCrimsonIsleTrophyFish.ts | 45 +++---------------- ...kMemberCrimsonIsleTrophyFishCaught.test.ts | 31 +++++++++++++ ...yBlockMemberCrimsonIsleTrophyFishCaught.ts | 40 +++++++++++++++++ ...ockMemberCrimsonIsleTrophyFishFish.test.ts | 0 ...SkyBlockMemberCrimsonIsleTrophyFishFish.ts | 0 src/index.ts | 7 ++- 9 files changed, 91 insertions(+), 45 deletions(-) rename src/Structures/SkyBlock/Member/CrimsonIsle/{ => SkyBlockMemberCrimsonIsleTrophyFish}/SkyBlockMemberCrimsonIsleTrophyFish.test.ts (94%) rename src/Structures/SkyBlock/Member/CrimsonIsle/{ => SkyBlockMemberCrimsonIsleTrophyFish}/SkyBlockMemberCrimsonIsleTrophyFish.ts (74%) create mode 100644 src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFishCaught.test.ts create mode 100644 src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFishCaught.ts rename src/Structures/SkyBlock/Member/CrimsonIsle/{ => SkyBlockMemberCrimsonIsleTrophyFish}/SkyBlockMemberCrimsonIsleTrophyFishFish.test.ts (100%) rename src/Structures/SkyBlock/Member/CrimsonIsle/{ => SkyBlockMemberCrimsonIsleTrophyFish}/SkyBlockMemberCrimsonIsleTrophyFishFish.ts (100%) diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsle.test.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsle.test.ts index 24ddc1e6d..287732540 100644 --- a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsle.test.ts +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsle.test.ts @@ -1,11 +1,13 @@ +/* eslint-disable @stylistic/max-len */ import SkyBlockMemberCrimsonIsle from './SkyBlockMemberCrimsonIsle.js'; import SkyBlockMemberCrimsonIsleAbiphone from './SkyBlockMemberCrimsonIsleAbiphone.js'; import SkyBlockMemberCrimsonIsleDojo from './SkyBlockMemberCrimsonIsleDojo.js'; import SkyBlockMemberCrimsonIsleKuudra from './SkyBlockMemberCrimsonIsleKuudra.js'; import SkyBlockMemberCrimsonIsleMatriarch from './SkyBlockMemberCrimsonIsleMatriarch.js'; -import SkyBlockMemberCrimsonIsleTrophyFish from './SkyBlockMemberCrimsonIsleTrophyFish.js'; +import SkyBlockMemberCrimsonIsleTrophyFish from './SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.js'; import { expect, expectTypeOf, test } from 'vitest'; import type { CrimsonIsleBoss, CrimsonIsleFaction } from '../../../../Types/SkyBlock.js'; +/* eslint-enable @stylistic/max-len */ test('SkyBlockMemberCrimsonIsle', () => { const data = new SkyBlockMemberCrimsonIsle({ stats: 'meow' }, { stats: 'meow' }); diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsle.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsle.ts index fa4c6db1f..ec0163550 100644 --- a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsle.ts +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsle.ts @@ -1,9 +1,11 @@ +/* eslint-disable @stylistic/max-len */ import SkyBlockMemberCrimsonIsleAbiphone from './SkyBlockMemberCrimsonIsleAbiphone.js'; import SkyBlockMemberCrimsonIsleDojo from './SkyBlockMemberCrimsonIsleDojo.js'; import SkyBlockMemberCrimsonIsleKuudra from './SkyBlockMemberCrimsonIsleKuudra.js'; import SkyBlockMemberCrimsonIsleMatriarch from './SkyBlockMemberCrimsonIsleMatriarch.js'; -import SkyBlockMemberCrimsonIsleTrophyFish from './SkyBlockMemberCrimsonIsleTrophyFish.js'; +import SkyBlockMemberCrimsonIsleTrophyFish from './SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.ts'; import type { CrimsonIsleBoss, CrimsonIsleFaction } from '../../../../Types/SkyBlock.js'; +/* eslint-enable @stylistic/max-len */ class SkyBlockMemberCrimsonIsle { dojo: SkyBlockMemberCrimsonIsleDojo; diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish.test.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.test.ts similarity index 94% rename from src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish.test.ts rename to src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.test.ts index 8947d3dd9..cd57a7c93 100644 --- a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish.test.ts +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.test.ts @@ -1,7 +1,8 @@ import SkyBlockMemberCrimsonIsleTrophyFish from './SkyBlockMemberCrimsonIsleTrophyFish.js'; +import SkyBlockMemberCrimsonIsleTrophyFishCaught from './SkyBlockMemberCrimsonIsleTrophyFishCaught.js'; import SkyBlockMemberCrimsonIsleTrophyFishFish from './SkyBlockMemberCrimsonIsleTrophyFishFish.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type { CrimsonIsleTrophyFishRank } from '../../../../Types/SkyBlock.js'; +import type { CrimsonIsleTrophyFishRank } from '../../../../../Types/SkyBlock.js'; test('SkyBlockMemberCrimsonIsleTrophyFish', () => { // eslint-disable-next-line @typescript-eslint/ban-ts-comment @@ -48,6 +49,8 @@ test('SkyBlockMemberCrimsonIsleTrophyFish', () => { expectTypeOf(data.karateFish).toEqualTypeOf(); expect(data.moldfin).toBeDefined(); expectTypeOf(data.moldfin).toEqualTypeOf(); + expect(data.caught).toBeDefined(); + expectTypeOf(data.caught).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => CrimsonIsleTrophyFishRank>(); expect(data.toString()).toBeDefined(); diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.ts similarity index 74% rename from src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish.ts rename to src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.ts index cc76f01a5..d008abfba 100644 --- a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish.ts +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.ts @@ -1,5 +1,6 @@ -import SkyBlockMemberCrimsonIsleTrophyFishFish from './SkyBlockMemberCrimsonIsleTrophyFishFish.js'; -import type { CrimsonIsleTrophyFishRank } from '../../../../Types/SkyBlock.js'; +import SkyBlockMemberCrimsonIsleTrophyFishCaught from './SkyBlockMemberCrimsonIsleTrophyFishCaught.ts'; +import SkyBlockMemberCrimsonIsleTrophyFishFish from './SkyBlockMemberCrimsonIsleTrophyFishFish.ts'; +import type { CrimsonIsleTrophyFishRank } from '../../../../../Types/SkyBlock.ts'; class SkyBlockMemberCrimsonIsleTrophyFish { rank: CrimsonIsleTrophyFishRank; @@ -21,10 +22,7 @@ class SkyBlockMemberCrimsonIsleTrophyFish { soulFish: SkyBlockMemberCrimsonIsleTrophyFishFish; karateFish: SkyBlockMemberCrimsonIsleTrophyFishFish; moldfin: SkyBlockMemberCrimsonIsleTrophyFishFish; - bronze: number; - silver: number; - gold: number; - diamond: number; + caught: SkyBlockMemberCrimsonIsleTrophyFishCaught; constructor(data: Record) { const rewards = data?.rewards || [1]; this.rank = this.getTrophyFishRank(rewards[rewards.length - 1]); @@ -46,10 +44,7 @@ class SkyBlockMemberCrimsonIsleTrophyFish { this.soulFish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'soul_fish'); this.karateFish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'karate_fish'); this.moldfin = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'moldfin'); - this.bronze = this.getTrophyFishPerRank('Bronze'); - this.silver = this.getTrophyFishPerRank('Silver'); - this.gold = this.getTrophyFishPerRank('Gold'); - this.diamond = this.getTrophyFishPerRank('Diamond'); + this.caught = new SkyBlockMemberCrimsonIsleTrophyFishCaught(this); } toString(): CrimsonIsleTrophyFishRank { @@ -68,36 +63,6 @@ class SkyBlockMemberCrimsonIsleTrophyFish { return 'Bronze'; } } - - private getTrophyFishPerRank(rank: CrimsonIsleTrophyFishRank): number { - const fishes = [ - this.gusher, - this.blobfish, - this.lavaHorse, - this.goldenFish, - this.volcanicStonefish, - this.slugfish, - this.vanille, - this.obfuscatedFish1, - this.obfuscatedFish2, - this.obfuscatedFish3, - this.sulphurSkitter, - this.skeletonFish, - this.manaRay, - this.flyfish, - this.steamingHotFlounder, - this.soulFish, - this.karateFish, - this.moldfin - ]; - - const key = rank.toLowerCase() as keyof (typeof fishes)[number]; - return fishes.reduce((sum, fish) => { - const value = fish[key]; - const num = typeof value === 'function' ? value() : value; - return sum + (num ?? 0); - }, 0); - } } export default SkyBlockMemberCrimsonIsleTrophyFish; diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFishCaught.test.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFishCaught.test.ts new file mode 100644 index 000000000..e00051740 --- /dev/null +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFishCaught.test.ts @@ -0,0 +1,31 @@ +import SkyBlockMemberCrimsonIsleTrophyFishCaught from './SkyBlockMemberCrimsonIsleTrophyFishCaught.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockMemberCrimsonIsleTrophyFishCaught', () => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + const data = new SkyBlockMemberCrimsonIsleTrophyFishCaught({}); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFishCaught); + expectTypeOf(data).toEqualTypeOf(); + expect(data.total).toBeDefined(); + expect(data.total).toBeGreaterThanOrEqual(0); + expectTypeOf(data.total).toEqualTypeOf(); + expect(data.bronze).toBeDefined(); + expect(data.bronze).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bronze).toEqualTypeOf(); + expect(data.silver).toBeDefined(); + expect(data.silver).toBeGreaterThanOrEqual(0); + expectTypeOf(data.silver).toEqualTypeOf(); + expect(data.gold).toBeDefined(); + expect(data.gold).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gold).toEqualTypeOf(); + expect(data.diamond).toBeDefined(); + expect(data.diamond).toBeGreaterThanOrEqual(0); + expectTypeOf(data.diamond).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toEqual(data.total); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFishCaught.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFishCaught.ts new file mode 100644 index 000000000..6f63e3ff9 --- /dev/null +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFishCaught.ts @@ -0,0 +1,40 @@ +import SkyBlockMemberCrimsonIsleTrophyFishFish from './SkyBlockMemberCrimsonIsleTrophyFishFish.ts'; +import type SkyBlockMemberCrimsonIsleTrophyFish from './SkyBlockMemberCrimsonIsleTrophyFish.ts'; +import type { CrimsonIsleTrophyFishRank } from '../../../../../Types/SkyBlock.ts'; + +class SkyBlockMemberCrimsonIsleTrophyFishCaught { + total: number; + bronze: number; + silver: number; + gold: number; + diamond: number; + constructor(data: SkyBlockMemberCrimsonIsleTrophyFish) { + this.total = this.getTrophyFishPerRank(data, 'Total'); + this.bronze = this.getTrophyFishPerRank(data, 'Bronze'); + this.silver = this.getTrophyFishPerRank(data, 'Silver'); + this.gold = this.getTrophyFishPerRank(data, 'Gold'); + this.diamond = this.getTrophyFishPerRank(data, 'Diamond'); + } + + toString(): number { + return this.total; + } + + private getTrophyFishPerRank( + data: SkyBlockMemberCrimsonIsleTrophyFish, + rank: CrimsonIsleTrophyFishRank | 'Total' + ): number { + let num = 0; + + (Object.keys(data) as (keyof SkyBlockMemberCrimsonIsleTrophyFish)[]) + .filter((fish) => !['toString', 'rank', 'caught'].includes(fish as string)) + .forEach((fishName) => { + const fish = data[fishName] as SkyBlockMemberCrimsonIsleTrophyFishFish; + num += fish[rank.toLowerCase() as keyof SkyBlockMemberCrimsonIsleTrophyFishFish] as number; + }); + + return num; + } +} + +export default SkyBlockMemberCrimsonIsleTrophyFishCaught; diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFishFish.test.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFishFish.test.ts similarity index 100% rename from src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFishFish.test.ts rename to src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFishFish.test.ts diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFishFish.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFishFish.ts similarity index 100% rename from src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFishFish.ts rename to src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFishFish.ts diff --git a/src/index.ts b/src/index.ts index bcac0bedc..7672a6a3e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -180,8 +180,9 @@ import SkyBlockMemberCrimsonIsleDojoMinigame from './Structures/SkyBlock/Member/ import SkyBlockMemberCrimsonIsleKuudra from './Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleKuudra.js'; import SkyBlockMemberCrimsonIsleKuudraPartyFinder from './Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleKuudraPartyFinder.js'; import SkyBlockMemberCrimsonIsleMatriarch from './Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleMatriarch.js'; -import SkyBlockMemberCrimsonIsleTrophyFish from './Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish.js'; -import SkyBlockMemberCrimsonIsleTrophyFishFish from './Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFishFish.js'; +import SkyBlockMemberCrimsonIsleTrophyFish from './Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.js'; +import SkyBlockMemberCrimsonIsleTrophyFishCaught from './Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFishCaught.js'; +import SkyBlockMemberCrimsonIsleTrophyFishFish from './Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFishFish.js'; import SkyBlockMemberCurrencies from './Structures/SkyBlock/Member/SkyBlockMemberCurrencies.js'; import SkyBlockMemberDungeons from './Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeons.js'; import SkyBlockMemberDungeonsClasses from './Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsClasses.js'; @@ -490,6 +491,7 @@ export { SkyBlockMemberCrimsonIsleKuudraPartyFinder, SkyBlockMemberCrimsonIsleMatriarch, SkyBlockMemberCrimsonIsleTrophyFish, + SkyBlockMemberCrimsonIsleTrophyFishCaught, SkyBlockMemberCrimsonIsleTrophyFishFish, SkyBlockMemberCurrencies, SkyBlockMemberDungeons, @@ -800,6 +802,7 @@ export default { SkyBlockMemberCrimsonIsleKuudraPartyFinder, SkyBlockMemberCrimsonIsleMatriarch, SkyBlockMemberCrimsonIsleTrophyFish, + SkyBlockMemberCrimsonIsleTrophyFishCaught, SkyBlockMemberCrimsonIsleTrophyFishFish, SkyBlockMemberCurrencies, SkyBlockMemberDungeons, From cc745d0841eceeee8cb3092f0dab8165e0549ee3 Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 24 Sep 2025 09:29:38 +0800 Subject: [PATCH 050/124] Release 12.0.0-12 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 241f86c21..7761b6ff3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hypixel-api-reborn", - "version": "12.0.0-11", + "version": "12.0.0-12", "description": "Feature-rich Hypixel API wrapper for Node.js", "main": "dist/index.js", "types": "dist/index.d.ts", From 139132cd495122eb107e2276bd39600bd0e3ae92 Mon Sep 17 00:00:00 2001 From: Yoshy <60155833+Yoshy2002@users.noreply.github.com> Date: Sun, 5 Oct 2025 13:38:39 +0200 Subject: [PATCH 051/124] chore: update SkyBlockMemberMiningHotmForgeItem to be safe & update Forge Item List (#675) --- .../Mining/SkyBlockMemberMiningHotmForgeItem.ts | 11 ++++++----- src/Types/SkyBlock.ts | 10 +++++----- src/Utils/Constants.ts | 8 ++++---- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForgeItem.ts b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForgeItem.ts index c980e92aa..ff7f4c8a8 100644 --- a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForgeItem.ts +++ b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForgeItem.ts @@ -15,15 +15,16 @@ class SkyBlockMemberMiningHotmForgeItem { constructor(data: Record, quickForgeTime: number = 0) { this.type = data?.type || 'UNKNOWN'; this.id = data?.id || 'UNKNOWN'; - this.name = MiningForgeItems?.[this.id].name || 'UNKNOWN'; + this.name = MiningForgeItems?.[this.id]?.name || 'UNKNOWN'; this.startTime = data?.startTime || 0; this.startTimeAt = new Date(this.startTime); this.endTime = - this.startTime + MiningForgeItems?.[this.id].duration * (MiningForgeQuickForgeMultiplier[quickForgeTime] || 1); + this.startTime + + (MiningForgeItems?.[this.id]?.duration ?? 0) * (MiningForgeQuickForgeMultiplier[quickForgeTime] ?? 1); this.endTimeAt = new Date(this.endTime); - this.slot = data?.slot || 0; - this.notified = data?.notified || false; - this.oldItem = data?.oldItem || null; + this.slot = data?.slot ?? 0; + this.notified = data?.notified ?? false; + this.oldItem = data?.oldItem ?? null; } toString(): MiningForgeItemName | 'UNKNOWN' { diff --git a/src/Types/SkyBlock.ts b/src/Types/SkyBlock.ts index 5d64008ab..5231d7099 100644 --- a/src/Types/SkyBlock.ts +++ b/src/Types/SkyBlock.ts @@ -313,7 +313,7 @@ export type MiningForgeItemId = | 'GEMSTONE_DRILL_2' | 'GEMSTONE_DRILL_3' | 'GEMSTONE_DRILL_4' - | 'POLISHED_TOPAZ_ROD' + | 'TOPAZ_ROD' | 'TITANIUM_DRILL_1' | 'TITANIUM_DRILL_2' | 'TITANIUM_DRILL_3' @@ -432,7 +432,7 @@ export type MiningForgeItemName = | 'Gemstone Drill LT-522' | 'Topaz Drill KGR-12' | 'Jasper Drill X' - | 'Polished Topaz Rod' + | 'Topaz Rod' | 'Titanium Drill DR-X355' | 'Titanium Drill DR-X455' | 'Titanium Drill DR-X555' @@ -451,9 +451,9 @@ export type MiningForgeItemName = | 'Tungsten Regulator' | 'Mithril-Plated Drill Engine' | 'Titanium-Plated Drill Engine' - | 'Ruby-polished Drill Engine' - | 'Sapphire-polished Drill Engine' - | 'Amber-polished Drill Engine' + | 'Ruby-Polished Drill Engine' + | 'Sapphire-Polished Drill Engine' + | 'Amber-Polished Drill Engine' | 'Mithril-Infused Fuel Tank' | 'Titanium-Infused Fuel Tank' | 'Gemstone Fuel Tank' diff --git a/src/Utils/Constants.ts b/src/Utils/Constants.ts index 392c0339d..c696a4dc8 100644 --- a/src/Utils/Constants.ts +++ b/src/Utils/Constants.ts @@ -257,7 +257,7 @@ export const MiningForgeItems: MiningForgeItemsData = { GEMSTONE_DRILL_2: { name: 'Gemstone Drill LT-522', duration: 30000 }, GEMSTONE_DRILL_3: { name: 'Topaz Drill KGR-12', duration: 30000 }, GEMSTONE_DRILL_4: { name: 'Jasper Drill X', duration: 30000 }, - POLISHED_TOPAZ_ROD: { name: 'Polished Topaz Rod', duration: 43200000 }, + TOPAZ_ROD: { name: 'Topaz Rod', duration: 43200000 }, TITANIUM_DRILL_1: { name: 'Titanium Drill DR-X355', duration: 14400000 }, TITANIUM_DRILL_2: { name: 'Titanium Drill DR-X455', duration: 30000 }, TITANIUM_DRILL_3: { name: 'Titanium Drill DR-X555', duration: 30000 }, @@ -276,9 +276,9 @@ export const MiningForgeItems: MiningForgeItemsData = { TUNGSTEN_KEYCHAIN: { name: 'Tungsten Regulator', duration: 64800000 }, MITHRIL_DRILL_ENGINE: { name: 'Mithril-Plated Drill Engine', duration: 86400000 }, TITANIUM_DRILL_ENGINE: { name: 'Titanium-Plated Drill Engine', duration: 30000 }, - RUBY_POLISHED_DRILL_ENGINE: { name: 'Ruby-polished Drill Engine', duration: 30000 }, - SAPPHIRE_POLISHED_DRILL_ENGINE: { name: 'Sapphire-polished Drill Engine', duration: 30000 }, - AMBER_POLISHED_DRILL_ENGINE: { name: 'Amber-polished Drill Engine', duration: 30000 }, + RUBY_POLISHED_DRILL_ENGINE: { name: 'Ruby-Polished Drill Engine', duration: 30000 }, + SAPPHIRE_POLISHED_DRILL_ENGINE: { name: 'Sapphire-Polished Drill Engine', duration: 30000 }, + AMBER_POLISHED_DRILL_ENGINE: { name: 'Amber-Polished Drill Engine', duration: 30000 }, MITHRIL_FUEL_TANK: { name: 'Mithril-Infused Fuel Tank', duration: 86400000 }, TITANIUM_FUEL_TANK: { name: 'Titanium-Infused Fuel Tank', duration: 30000 }, GEMSTONE_FUEL_TANK: { name: 'Gemstone Fuel Tank', duration: 30000 }, From 6842f4e3b0eedc88b9926927d1362e0a0680b74f Mon Sep 17 00:00:00 2001 From: Yoshy <60155833+Yoshy2002@users.noreply.github.com> Date: Sun, 5 Oct 2025 13:40:52 +0200 Subject: [PATCH 052/124] fix: SkyBlockGardenCropMilstone calculation going from 0-45 instead of 1-46 (#674) * fix cropmilestones * prettier --- src/Structures/MiniGames/SkyWars/SkyWars.ts | 6 +- .../Inventory/SkyBlockInventoryItem.ts | 28 +- src/Utils/Constants.ts | 963 ++++++------------ src/Utils/Guild.ts | 27 +- 4 files changed, 358 insertions(+), 666 deletions(-) diff --git a/src/Structures/MiniGames/SkyWars/SkyWars.ts b/src/Structures/MiniGames/SkyWars/SkyWars.ts index d7a9e8e11..025ac860b 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWars.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWars.ts @@ -104,9 +104,9 @@ class SkyWars { this.levelProgress = getSkyWarsLevelProgress(data?.skywars_experience); this.levelFormatted = data?.levelFormatted ? data?.levelFormatted - ?.replace(/§l/gm, '**') - ?.replace(/§([a-f]|[1-9])/gm, '') - ?.replace(/§r/gm, '') + ?.replace(/§l/gm, '**') + ?.replace(/§([a-f]|[1-9])/gm, '') + ?.replace(/§r/gm, '') : null; this.prestige = getSkyWarsPrestige(this.level); this.opals = data?.opals || 0; diff --git a/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.ts b/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.ts index 72f54ceaa..caa1f63d1 100644 --- a/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.ts +++ b/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.ts @@ -88,20 +88,20 @@ class SkyBlockInventoryItem { this.statsBook = data?.tag?.ExtraAttributes?.stats_book || null; this.runes = data?.tag?.ExtraAttributes?.runes ? Object.keys(data?.tag?.ExtraAttributes?.runes).map( - (rune) => new SkyBlockInventoryItemRune({ id: rune, tier: data?.tag?.ExtraAttributes?.runes?.[rune] }) - ) + (rune) => new SkyBlockInventoryItemRune({ id: rune, tier: data?.tag?.ExtraAttributes?.runes?.[rune] }) + ) : null; this.reforge = data?.tag?.ExtraAttributes?.modifier || 'none'; this.hasArtOfWar = Boolean(data?.tag?.ExtraAttributes?.art_of_war_count || 0); this.starCount = data?.tag?.ExtraAttributes?.upgrade_level || 0; this.enchantments = data?.tag?.ExtraAttributes?.enchantments ? Object.keys(data?.tag?.ExtraAttributes?.enchantments).map( - (enchantment) => - new SkyBlockInventoryItemEnchantment({ - id: enchantment, - level: data?.tag?.ExtraAttributes?.enchantments?.[enchantment] - }) - ) + (enchantment) => + new SkyBlockInventoryItemEnchantment({ + id: enchantment, + level: data?.tag?.ExtraAttributes?.enchantments?.[enchantment] + }) + ) : null; this.uuid = data?.tag?.ExtraAttributes?.uuid || null; this.hotPotatoBookCount = data?.tag?.ExtraAttributes?.hot_potato_count || null; @@ -126,12 +126,12 @@ class SkyBlockInventoryItem { this.isShiny = Boolean(data?.tag?.ExtraAttributes?.is_shiny || 0); this.attributes = data?.tag?.ExtraAttributes?.attributes ? Object.keys(data?.tag?.ExtraAttributes?.attributes).map( - (attribute) => - new SkyBlockInventoryItemAttribute({ - id: attribute, - level: data?.tag?.ExtraAttributes?.attributes[attribute] - }) - ) + (attribute) => + new SkyBlockInventoryItemAttribute({ + id: attribute, + level: data?.tag?.ExtraAttributes?.attributes[attribute] + }) + ) : null; this.jalapenoCount = data?.tag?.ExtraAttributes?.jalapeono_count || null; this.hecatombSRuns = data?.tag?.ExtraAttributes?.hecatomb_s_runs || null; diff --git a/src/Utils/Constants.ts b/src/Utils/Constants.ts index c696a4dc8..4fd0b911c 100644 --- a/src/Utils/Constants.ts +++ b/src/Utils/Constants.ts @@ -363,231 +363,28 @@ export const petRarityOffset: { [key in Rarity | 'UNKNOWN']: number } = { }; export const PetLevels: number[] = [ - 100, - 110, - 120, - 130, - 145, - 160, - 175, - 190, - 210, - 230, - 250, - 275, - 300, - 330, - 360, - 400, - 440, - 490, - 540, - 600, - 660, - 730, - 800, - 880, - 960, - 1050, - 1150, - 1260, - 1380, - 1510, - 1650, - 1800, - 1960, - 2130, - 2310, - 2500, - 2700, - 2920, - 3160, - 3420, - 3700, - 4000, - 4350, - 4750, - 5200, - 5700, - 6300, - 7000, - 7800, - 8700, - 9700, - 10800, - 12000, - 13300, - 14700, - 16200, - 17800, - 19500, - 21300, - 23200, - 25200, - 27400, - 29800, - 32400, - 35200, - 38200, - 41400, - 44800, - 48400, - 52200, - 56200, - 60400, - 64800, - 69400, - 74200, - 79200, - 84700, - 90700, - 97200, - 104200, - 111700, - 119700, - 128200, - 137200, - 146700, - 156700, - 167700, - 179700, - 192700, - 206700, - 221700, - 237700, - 254700, - 272700, - 291700, - 311700, - 333700, - 357700, - 383700, - 411700, - 441700, - 476700, - 516700, - 561700, - 611700, - 666700, - 726700, - 791700, - 861700, - 936700, - 1016700, - 1101700, - 1191700, - 1286700, - 1386700, - 1496700, - 1616700, - 1746700, - 1886700 + 100, 110, 120, 130, 145, 160, 175, 190, 210, 230, 250, 275, 300, 330, 360, 400, 440, 490, 540, 600, 660, 730, 800, + 880, 960, 1050, 1150, 1260, 1380, 1510, 1650, 1800, 1960, 2130, 2310, 2500, 2700, 2920, 3160, 3420, 3700, 4000, 4350, + 4750, 5200, 5700, 6300, 7000, 7800, 8700, 9700, 10800, 12000, 13300, 14700, 16200, 17800, 19500, 21300, 23200, 25200, + 27400, 29800, 32400, 35200, 38200, 41400, 44800, 48400, 52200, 56200, 60400, 64800, 69400, 74200, 79200, 84700, 90700, + 97200, 104200, 111700, 119700, 128200, 137200, 146700, 156700, 167700, 179700, 192700, 206700, 221700, 237700, 254700, + 272700, 291700, 311700, 333700, 357700, 383700, 411700, 441700, 476700, 516700, 561700, 611700, 666700, 726700, + 791700, 861700, 936700, 1016700, 1101700, 1191700, 1286700, 1386700, 1496700, 1616700, 1746700, 1886700 ]; export const CustomPetLeveling: CustomPetLevelingData = { GOLDEN_DRAGON: { type: 1, petLevels: [ - 0, - 5555, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700, - 1886700 + 0, 5555, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, + 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, + 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, + 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, + 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, + 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, + 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, + 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, 1886700, + 1886700, 1886700, 1886700 ], maxLevel: 200 }, @@ -856,36 +653,35 @@ export const GARDEN_XP = { }; export const WHEAT = { - 0: 30, - 1: 50, - 2: 80, - 3: 170, - 4: 330, - 5: 670, - 6: 1330, - 7: 2500, - 8: 3500, - 9: 5000, - 10: 6500, - 11: 8000, - 12: 10000, - 13: 20000, - 14: 35000, - 15: 50000, - 16: 75000, - 17: 100000, - 18: 175000, - 19: 250000, - 20: 350000, - 21: 500000, - 22: 750000, - 23: 1000000, - 24: 1300000, - 25: 1600000, - 26: 2000000, - 27: 2300000, - 28: 2600000, - 29: 3000000, + 1: 30, + 2: 50, + 3: 80, + 4: 170, + 5: 330, + 6: 670, + 7: 1330, + 8: 2500, + 9: 3500, + 10: 5000, + 11: 6500, + 12: 8000, + 13: 10000, + 14: 20000, + 15: 35000, + 16: 50000, + 17: 75000, + 18: 100000, + 19: 175000, + 20: 250000, + 21: 350000, + 22: 500000, + 23: 750000, + 24: 1000000, + 25: 1300000, + 26: 1600000, + 27: 2000000, + 28: 2300000, + 29: 2600000, 30: 3000000, 31: 3000000, 32: 3000000, @@ -901,41 +697,41 @@ export const WHEAT = { 42: 3000000, 43: 3000000, 44: 3000000, - 45: 3000000 + 45: 3000000, + 46: 3000000 }; export const CARROT = { - 0: 100, - 1: 150, - 2: 250, - 3: 500, - 4: 1500, - 5: 2500, - 6: 5000, - 7: 7500, - 8: 10000, - 9: 15000, - 10: 20000, - 11: 25000, - 12: 40000, - 13: 70000, - 14: 100000, - 15: 200000, - 16: 250000, + 1: 100, + 2: 150, + 3: 250, + 4: 500, + 5: 1500, + 6: 2500, + 7: 5000, + 8: 7500, + 9: 10000, + 10: 15000, + 11: 20000, + 12: 25000, + 13: 40000, + 14: 70000, + 15: 100000, + 16: 200000, 17: 250000, - 18: 500000, - 19: 750000, - 20: 1000000, - 21: 1500000, - 22: 2000000, - 23: 3000000, - 24: 4000000, - 25: 5000000, - 26: 6000000, - 27: 7000000, - 28: 8000000, - 29: 9000000, - 30: 10000000, + 18: 250000, + 19: 500000, + 20: 750000, + 21: 1000000, + 22: 1500000, + 23: 2000000, + 24: 3000000, + 25: 4000000, + 26: 5000000, + 27: 6000000, + 28: 7000000, + 29: 8000000, + 30: 9000000, 31: 10000000, 32: 10000000, 33: 10000000, @@ -950,41 +746,41 @@ export const CARROT = { 42: 10000000, 43: 10000000, 44: 10000000, - 45: 10000000 + 45: 10000000, + 46: 10000000 }; export const POTATO = { - 0: 100, - 1: 150, - 2: 250, - 3: 500, - 4: 1500, - 5: 2500, - 6: 5000, - 7: 7500, - 8: 10000, - 9: 15000, - 10: 20000, - 11: 25000, - 12: 40000, - 13: 70000, - 14: 100000, - 15: 200000, - 16: 250000, + 1: 100, + 2: 150, + 3: 250, + 4: 500, + 5: 1500, + 6: 2500, + 7: 5000, + 8: 7500, + 9: 10000, + 10: 15000, + 11: 20000, + 12: 25000, + 13: 40000, + 14: 70000, + 15: 100000, + 16: 200000, 17: 250000, - 18: 500000, - 19: 750000, - 20: 1000000, - 21: 1500000, - 22: 2000000, - 23: 3000000, - 24: 4000000, - 25: 5000000, - 26: 6000000, - 27: 7000000, - 28: 8000000, - 29: 9000000, - 30: 10000000, + 18: 250000, + 19: 500000, + 20: 750000, + 21: 1000000, + 22: 1500000, + 23: 2000000, + 24: 3000000, + 25: 4000000, + 26: 5000000, + 27: 6000000, + 28: 7000000, + 29: 8000000, + 30: 9000000, 31: 10000000, 32: 10000000, 33: 10000000, @@ -999,40 +795,40 @@ export const POTATO = { 42: 10000000, 43: 10000000, 44: 10000000, - 45: 10000000 + 45: 10000000, + 46: 10000000 }; export const MELON = { - 0: 150, - 1: 250, - 2: 400, - 3: 850, - 4: 1650, - 5: 3350, - 6: 6650, - 7: 12500, - 8: 17500, - 9: 25000, - 10: 32500, - 11: 40000, - 12: 50000, - 13: 100000, - 14: 175000, - 15: 250000, - 16: 375000, - 17: 500000, - 18: 875000, - 19: 1250000, - 20: 1750000, - 21: 2500000, - 22: 3750000, - 23: 5000000, - 24: 6500000, - 25: 8000000, - 26: 10000000, - 27: 11500000, - 28: 13000000, - 29: 15000000, + 1: 150, + 2: 250, + 3: 400, + 4: 850, + 5: 1650, + 6: 3350, + 7: 6650, + 8: 12500, + 9: 17500, + 10: 25000, + 11: 32500, + 12: 40000, + 13: 50000, + 14: 100000, + 15: 175000, + 16: 250000, + 17: 375000, + 18: 500000, + 19: 875000, + 20: 1250000, + 21: 1750000, + 22: 2500000, + 23: 3750000, + 24: 5000000, + 25: 6500000, + 26: 8000000, + 27: 10000000, + 28: 11500000, + 29: 13000000, 30: 15000000, 31: 15000000, 32: 15000000, @@ -1048,40 +844,40 @@ export const MELON = { 42: 15000000, 43: 15000000, 44: 15000000, - 45: 15000000 + 45: 15000000, + 46: 15000000 }; export const PUMPKIN = { - 0: 30, - 1: 50, - 2: 80, - 3: 170, - 4: 330, - 5: 670, - 6: 1330, - 7: 2500, - 8: 3500, - 9: 5000, - 10: 6500, - 11: 8000, - 12: 10000, - 13: 20000, - 14: 35000, - 15: 50000, - 16: 75000, - 17: 100000, - 18: 175000, - 19: 250000, - 20: 350000, - 21: 500000, - 22: 750000, - 23: 1000000, - 24: 1300000, - 25: 1600000, - 26: 2000000, - 27: 2300000, - 28: 2600000, - 29: 3000000, + 1: 30, + 2: 50, + 3: 80, + 4: 170, + 5: 330, + 6: 670, + 7: 1330, + 8: 2500, + 9: 3500, + 10: 5000, + 11: 6500, + 12: 8000, + 13: 10000, + 14: 20000, + 15: 35000, + 16: 50000, + 17: 75000, + 18: 100000, + 19: 175000, + 20: 250000, + 21: 350000, + 22: 500000, + 23: 750000, + 24: 1000000, + 25: 1300000, + 26: 1600000, + 27: 2000000, + 28: 2300000, + 29: 2600000, 30: 3000000, 31: 3000000, 32: 3000000, @@ -1097,40 +893,40 @@ export const PUMPKIN = { 42: 3000000, 43: 3000000, 44: 3000000, - 45: 3000000 + 45: 3000000, + 46: 3000000 }; export const SUGAR_CANE = { - 0: 60, - 1: 100, - 2: 160, - 3: 340, - 4: 660, - 5: 1340, - 6: 2660, - 7: 5000, - 8: 7000, - 9: 10000, - 10: 13000, - 11: 16000, - 12: 20000, - 13: 40000, - 14: 70000, - 15: 100000, - 16: 150000, - 17: 200000, - 18: 350000, - 19: 500000, - 20: 700000, - 21: 1000000, - 22: 1500000, - 23: 2000000, - 24: 2600000, - 25: 3200000, - 26: 4000000, - 27: 4600000, - 28: 5200000, - 29: 6000000, + 1: 60, + 2: 100, + 3: 160, + 4: 340, + 5: 660, + 6: 1340, + 7: 2660, + 8: 5000, + 9: 7000, + 10: 10000, + 11: 13000, + 12: 16000, + 13: 20000, + 14: 40000, + 15: 70000, + 16: 100000, + 17: 150000, + 18: 200000, + 19: 350000, + 20: 500000, + 21: 700000, + 22: 1000000, + 23: 1500000, + 24: 2000000, + 25: 2600000, + 26: 3200000, + 27: 4000000, + 28: 4600000, + 29: 5200000, 30: 6000000, 31: 6000000, 32: 6000000, @@ -1146,40 +942,40 @@ export const SUGAR_CANE = { 42: 6000000, 43: 6000000, 44: 6000000, - 45: 6000000 + 45: 6000000, + 46: 6000000 }; export const COCOA_BEANS = { - 0: 90, - 1: 150, - 2: 250, - 3: 500, - 4: 1000, - 5: 2000, - 6: 4000, - 7: 7500, - 8: 10000, - 9: 15000, - 10: 20000, - 11: 25000, - 12: 30000, - 13: 50000, - 14: 100000, - 15: 150000, - 16: 200000, - 17: 300000, - 18: 500000, - 19: 750000, - 20: 1000000, - 21: 1500000, - 22: 2000000, - 23: 3000000, - 24: 4000000, - 25: 5000000, - 26: 6000000, - 27: 7000000, - 28: 8000000, - 29: 9000000, + 1: 90, + 2: 150, + 3: 250, + 4: 500, + 5: 1000, + 6: 2000, + 7: 4000, + 8: 7500, + 9: 10000, + 10: 15000, + 11: 20000, + 12: 25000, + 13: 30000, + 14: 50000, + 15: 100000, + 16: 150000, + 17: 200000, + 18: 300000, + 19: 500000, + 20: 750000, + 21: 1000000, + 22: 1500000, + 23: 2000000, + 24: 3000000, + 25: 4000000, + 26: 5000000, + 27: 6000000, + 28: 7000000, + 29: 8000000, 30: 9000000, 31: 9000000, 32: 9000000, @@ -1195,40 +991,40 @@ export const COCOA_BEANS = { 42: 9000000, 43: 9000000, 44: 9000000, - 45: 9000000 + 45: 9000000, + 46: 9000000 }; export const CACTUS = { - 0: 60, - 1: 100, - 2: 160, - 3: 340, - 4: 660, - 5: 1340, - 6: 2660, - 7: 5000, - 8: 7000, - 9: 10000, - 10: 13000, - 11: 16000, - 12: 20000, - 13: 40000, - 14: 70000, - 15: 100000, - 16: 150000, - 17: 200000, - 18: 350000, - 19: 500000, - 20: 700000, - 21: 1000000, - 22: 1500000, - 23: 2000000, - 24: 2600000, - 25: 3200000, - 26: 4000000, - 27: 4600000, - 28: 5200000, - 29: 6000000, + 1: 60, + 2: 100, + 3: 160, + 4: 340, + 5: 660, + 6: 1340, + 7: 2660, + 8: 5000, + 9: 7000, + 10: 10000, + 11: 13000, + 12: 16000, + 13: 20000, + 14: 40000, + 15: 70000, + 16: 100000, + 17: 150000, + 18: 200000, + 19: 350000, + 20: 500000, + 21: 700000, + 22: 1000000, + 23: 1500000, + 24: 2000000, + 25: 2600000, + 26: 3200000, + 27: 4000000, + 28: 4600000, + 29: 5200000, 30: 6000000, 31: 6000000, 32: 6000000, @@ -1244,40 +1040,40 @@ export const CACTUS = { 42: 6000000, 43: 6000000, 44: 6000000, - 45: 6000000 + 45: 6000000, + 46: 6000000 }; export const MUSHROOM = { - 0: 30, - 1: 50, - 2: 80, - 3: 170, - 4: 330, - 5: 670, - 6: 1330, - 7: 2500, - 8: 3500, - 9: 5000, - 10: 6500, - 11: 8000, - 12: 10000, - 13: 20000, - 14: 35000, - 15: 50000, - 16: 75000, - 17: 100000, - 18: 175000, - 19: 250000, - 20: 350000, - 21: 500000, - 22: 750000, - 23: 1000000, - 24: 1300000, - 25: 1600000, - 26: 2000000, - 27: 2300000, - 28: 2600000, - 29: 3000000, + 1: 30, + 2: 50, + 3: 80, + 4: 170, + 5: 330, + 6: 670, + 7: 1330, + 8: 2500, + 9: 3500, + 10: 5000, + 11: 6500, + 12: 8000, + 13: 10000, + 14: 20000, + 15: 35000, + 16: 50000, + 17: 75000, + 18: 100000, + 19: 175000, + 20: 250000, + 21: 350000, + 22: 500000, + 23: 750000, + 24: 1000000, + 25: 1300000, + 26: 1600000, + 27: 2000000, + 28: 2300000, + 29: 2600000, 30: 3000000, 31: 3000000, 32: 3000000, @@ -1293,40 +1089,40 @@ export const MUSHROOM = { 42: 3000000, 43: 3000000, 44: 3000000, - 45: 3000000 + 45: 3000000, + 46: 3000000 }; export const NETHER_WART = { - 0: 90, - 1: 150, - 2: 250, - 3: 500, - 4: 1000, - 5: 2000, - 6: 4000, - 7: 7500, - 8: 10000, - 9: 15000, - 10: 20000, - 11: 25000, - 12: 30000, - 13: 50000, - 14: 100000, - 15: 150000, - 16: 200000, - 17: 300000, - 18: 500000, - 19: 750000, - 20: 1000000, - 21: 1500000, - 22: 2000000, - 23: 3000000, - 24: 4000000, - 25: 5000000, - 26: 6000000, - 27: 7000000, - 28: 8000000, - 29: 9000000, + 1: 90, + 2: 150, + 3: 250, + 4: 500, + 5: 1000, + 6: 2000, + 7: 4000, + 8: 7500, + 9: 10000, + 10: 15000, + 11: 20000, + 12: 25000, + 13: 30000, + 14: 50000, + 15: 100000, + 16: 150000, + 17: 200000, + 18: 300000, + 19: 500000, + 20: 750000, + 21: 1000000, + 22: 1500000, + 23: 2000000, + 24: 3000000, + 25: 4000000, + 26: 5000000, + 27: 6000000, + 28: 7000000, + 29: 8000000, 30: 9000000, 31: 9000000, 32: 9000000, @@ -1342,119 +1138,28 @@ export const NETHER_WART = { 42: 9000000, 43: 9000000, 44: 9000000, - 45: 9000000 + 45: 9000000, + 46: 9000000 }; /* eslint-disable camelcase */ export const BestiaryBrackets: { [key: number]: number[] } = { 1: [ - 20, - 40, - 60, - 100, - 200, - 400, - 800, - 1400, - 2000, - 3000, - 6000, - 12000, - 20000, - 30000, - 40000, - 50000, - 60000, - 72000, - 86000, - 100000, - 200000, - 400000, - 600000, - 800000, - 1000000 + 20, 40, 60, 100, 200, 400, 800, 1400, 2000, 3000, 6000, 12000, 20000, 30000, 40000, 50000, 60000, 72000, 86000, + 100000, 200000, 400000, 600000, 800000, 1000000 ], 2: [ - 5, - 10, - 15, - 25, - 50, - 100, - 200, - 350, - 500, - 750, - 1500, - 3000, - 5000, - 7500, - 10000, - 12500, - 15000, - 18000, - 21500, - 25000, - 50000, - 100000, - 150000, - 200000, - 250000 + 5, 10, 15, 25, 50, 100, 200, 350, 500, 750, 1500, 3000, 5000, 7500, 10000, 12500, 15000, 18000, 21500, 25000, 50000, + 100000, 150000, 200000, 250000 ], 3: [ - 4, - 8, - 12, - 16, - 20, - 40, - 80, - 140, - 200, - 300, - 600, - 1200, - 2000, - 3000, - 4000, - 5000, - 6000, - 7200, - 8600, - 10000, - 20000, - 40000, - 60000, - 80000, - 100000 + 4, 8, 12, 16, 20, 40, 80, 140, 200, 300, 600, 1200, 2000, 3000, 4000, 5000, 6000, 7200, 8600, 10000, 20000, 40000, + 60000, 80000, 100000 ], 4: [ - 2, - 4, - 6, - 10, - 15, - 20, - 25, - 35, - 50, - 75, - 150, - 300, - 500, - 750, - 1000, - 1350, - 1650, - 2000, - 2500, - 3000, - 5000, - 10000, - 15000, - 20000, - 25000 + 2, 4, 6, 10, 15, 20, 25, 35, 50, 75, 150, 300, 500, 750, 1000, 1350, 1650, 2000, 2500, 3000, 5000, 10000, 15000, + 20000, 25000 ], 5: [ 1, 2, 3, 5, 7, 10, 15, 20, 25, 30, 60, 120, 200, 300, 400, 500, 600, 720, 860, 1000, 2000, 4000, 6000, 8000, 10000 diff --git a/src/Utils/Guild.ts b/src/Utils/Guild.ts index 02d617b80..46a9170d2 100644 --- a/src/Utils/Guild.ts +++ b/src/Utils/Guild.ts @@ -15,11 +15,11 @@ export function parseHistory(historyData: Record): ExpHistory[] { day: x[0], date: x[0].match(dateRegExp) ? parseDate( - x[0] - .match(dateRegExp)! - .slice(1) - .map((x) => parseInt(x, 10)) - ) + x[0] + .match(dateRegExp)! + .slice(1) + .map((x) => parseInt(x, 10)) + ) : undefined, exp: x[1] || 0, totalExp: @@ -31,21 +31,8 @@ export function parseHistory(historyData: Record): ExpHistory[] { export function getGuildLevel(exp: number) { const EXP_NEEDED: number[] = [ - 100000, - 150000, - 250000, - 500000, - 750000, - 1000000, - 1250000, - 1500000, - 2000000, - 2500000, - 2500000, - 2500000, - 2500000, - 2500000, - 3000000 + 100000, 150000, 250000, 500000, 750000, 1000000, 1250000, 1500000, 2000000, 2500000, 2500000, 2500000, 2500000, + 2500000, 3000000 ]; let level = 0; for (let i = 0; i <= 1000; i += 1) { From b4ca249d867b44bc52451ec487dd0ef531df8df8 Mon Sep 17 00:00:00 2001 From: Jacob Date: Sun, 5 Oct 2025 20:01:23 +0800 Subject: [PATCH 053/124] fix: prettier vs eslint prettier won btw --- .github/scripts/checkCoverage.ts | 10 +++++----- eslint.config.js | 2 -- package.json | 4 ++-- vitest.setup.ts | 12 ++++++------ 4 files changed, 13 insertions(+), 15 deletions(-) diff --git a/.github/scripts/checkCoverage.ts b/.github/scripts/checkCoverage.ts index 9b4685c7f..5313e4915 100644 --- a/.github/scripts/checkCoverage.ts +++ b/.github/scripts/checkCoverage.ts @@ -34,23 +34,23 @@ const info = { coveredmethods: Number(codeStats.coveredmethods) }; -if (95 > (info.coveredstatements / info.statements) * 100) { +if ((info.coveredstatements / info.statements) * 100 < 95) { throw new Error('Statements is required to be 95% or higher'); } -if (95 > (info.coveredconditionals / info.conditionals) * 100) { +if ((info.coveredconditionals / info.conditionals) * 100 < 95) { throw new Error('Conditionals is required to be 95% or higher'); } -if (95 > (info.coveredmethods / info.methods) * 100) { +if ((info.coveredmethods / info.methods) * 100 < 95) { throw new Error('Methods is required to be 95% or higher'); } if ( - 95 > ((info.coveredstatements + info.coveredconditionals + info.coveredmethods) / (info.statements + info.conditionals + info.methods)) * - 100 + 100 < + 95 ) { throw new Error('Everythng Combinded is required to be 95% or higher'); } diff --git a/eslint.config.js b/eslint.config.js index d3aa24366..1307810a2 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -28,7 +28,6 @@ export default [ '@typescript-eslint/no-unused-vars': ['error', { args: 'none' }], '@stylistic/quotes': ['error', 'single', { avoidEscape: true }], '@stylistic/array-bracket-newline': ['error', 'consistent'], - '@stylistic/array-element-newline': ['warn', 'consistent'], 'no-constant-condition': ['error', { checkLoops: false }], 'no-extend-native': ['warn', { exceptions: ['Object'] }], '@stylistic/nonblock-statement-body-position': 'error', @@ -75,7 +74,6 @@ export default [ '@stylistic/arrow-parens': 'error', '@stylistic/comma-dangle': 'error', '@stylistic/brace-style': 'error', - '@stylistic/indent': ['error', 2], '@stylistic/key-spacing': 'error', '@stylistic/comma-style': 'error', 'no-useless-constructor': 'error', diff --git a/package.json b/package.json index 7761b6ff3..54ffbe386 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,8 @@ "url": "https://github.com/Hypixel-API-Reborn/hypixel-api-reborn/issues" }, "scripts": { - "lint:check": "pnpm exec eslint src/", - "lint": "pnpm exec eslint src/ --fix", + "lint": "pnpm lint:check --fix", + "lint:check": "pnpm exec eslint", "prettier:check": "pnpm exec prettier --check .", "prettier": "pnpm exec prettier --write .", "build": "pnpm exec tsc", diff --git a/vitest.setup.ts b/vitest.setup.ts index 5e7189240..58ee6d61a 100644 --- a/vitest.setup.ts +++ b/vitest.setup.ts @@ -1,6 +1,6 @@ import { config } from 'dotenv'; config(); -if (1 > (process.env.HYPIXEL_KEY || '').length) throw new Error('No API Key specified!'); +if ((process.env.HYPIXEL_KEY || '').length < 1) throw new Error('No API Key specified!'); export const defaultRequestData = { ok: true, @@ -11,21 +11,21 @@ export const defaultRequestData = { statusText: '', type: 'basic', url: '', - clone: function (): Response { + clone: (): Response => { throw new Error('Function not implemented.'); }, body: null, bodyUsed: false, - arrayBuffer: function (): Promise { + arrayBuffer: (): Promise => { throw new Error('Function not implemented.'); }, - blob: function (): Promise { + blob: (): Promise => { throw new Error('Function not implemented.'); }, - formData: function (): Promise { + formData: (): Promise => { throw new Error('Function not implemented.'); }, - text: function (): Promise { + text: (): Promise => { throw new Error('Function not implemented.'); } }; From 42fde46752c9c6c809ef19b8ee5448ba4f7282ba Mon Sep 17 00:00:00 2001 From: Jacob Date: Mon, 13 Oct 2025 11:31:08 +0800 Subject: [PATCH 054/124] fix(SkyblockMemberInventoriesBackpacks): Incorrectly parsing backpacks closes #678 --- .../SkyBlockMemberInventoriesBackpacks.ts | 72 +++++++++---------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpacks.ts b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpacks.ts index 076a45c9a..8dbca1c6a 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpacks.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpacks.ts @@ -22,76 +22,76 @@ class SkyBlockMemberInventoriesBackpacks { constructor(data: Record) { this.backpack1 = data?.backpackIcons?.['0']?.data === undefined || data?.backpackContents?.['0']?.data === undefined - ? new SkyBlockMemberInventoriesBackpack(data, '0') - : null; + ? null + : new SkyBlockMemberInventoriesBackpack(data, '0'); this.backpack2 = data?.backpackIcons?.['1']?.data === undefined || data?.backpackContents?.['1']?.data === undefined - ? new SkyBlockMemberInventoriesBackpack(data, '1') - : null; + ? null + : new SkyBlockMemberInventoriesBackpack(data, '1'); this.backpack3 = data?.backpackIcons?.['2']?.data === undefined || data?.backpackContents?.['2']?.data === undefined - ? new SkyBlockMemberInventoriesBackpack(data, '2') - : null; + ? null + : new SkyBlockMemberInventoriesBackpack(data, '2'); this.backpack4 = data?.backpackIcons?.['3']?.data === undefined || data?.backpackContents?.['3']?.data === undefined - ? new SkyBlockMemberInventoriesBackpack(data, '3') - : null; + ? null + : new SkyBlockMemberInventoriesBackpack(data, '3'); this.backpack5 = data?.backpackIcons?.['4']?.data === undefined || data?.backpackContents?.['4']?.data === undefined - ? new SkyBlockMemberInventoriesBackpack(data, '4') - : null; + ? null + : new SkyBlockMemberInventoriesBackpack(data, '4'); this.backpack6 = data?.backpackIcons?.['5']?.data === undefined || data?.backpackContents?.['5']?.data === undefined - ? new SkyBlockMemberInventoriesBackpack(data, '5') - : null; + ? null + : new SkyBlockMemberInventoriesBackpack(data, '5'); this.backpack7 = data?.backpackIcons?.['6']?.data === undefined || data?.backpackContents?.['6']?.data === undefined - ? new SkyBlockMemberInventoriesBackpack(data, '6') - : null; + ? null + : new SkyBlockMemberInventoriesBackpack(data, '6'); this.backpack8 = data?.backpackIcons?.['7']?.data === undefined || data?.backpackContents?.['7']?.data === undefined - ? new SkyBlockMemberInventoriesBackpack(data, '7') - : null; + ? null + : new SkyBlockMemberInventoriesBackpack(data, '7'); this.backpack9 = data?.backpackIcons?.['8']?.data === undefined || data?.backpackContents?.['8']?.data === undefined - ? new SkyBlockMemberInventoriesBackpack(data, '8') - : null; + ? null + : new SkyBlockMemberInventoriesBackpack(data, '8'); this.backpack10 = data?.backpackIcons?.['9']?.data === undefined || data?.backpackContents?.['9']?.data === undefined - ? new SkyBlockMemberInventoriesBackpack(data, '9') - : null; + ? null + : new SkyBlockMemberInventoriesBackpack(data, '9'); this.backpack11 = data?.backpackIcons?.['10']?.data === undefined || data?.backpackContents?.['10']?.data === undefined - ? new SkyBlockMemberInventoriesBackpack(data, '10') - : null; + ? null + : new SkyBlockMemberInventoriesBackpack(data, '10'); this.backpack12 = data?.backpackIcons?.['11']?.data === undefined || data?.backpackContents?.['11']?.data === undefined - ? new SkyBlockMemberInventoriesBackpack(data, '11') - : null; + ? null + : new SkyBlockMemberInventoriesBackpack(data, '11'); this.backpack13 = data?.backpackIcons?.['12']?.data === undefined || data?.backpackContents?.['12']?.data === undefined - ? new SkyBlockMemberInventoriesBackpack(data, '12') - : null; + ? null + : new SkyBlockMemberInventoriesBackpack(data, '12'); this.backpack14 = data?.backpackIcons?.['13']?.data === undefined || data?.backpackContents?.['13']?.data === undefined - ? new SkyBlockMemberInventoriesBackpack(data, '13') - : null; + ? null + : new SkyBlockMemberInventoriesBackpack(data, '13'); this.backpack15 = data?.backpackIcons?.['14']?.data === undefined || data?.backpackContents?.['14']?.data === undefined - ? new SkyBlockMemberInventoriesBackpack(data, '14') - : null; + ? null + : new SkyBlockMemberInventoriesBackpack(data, '14'); this.backpack16 = data?.backpackIcons?.['15']?.data === undefined || data?.backpackContents?.['15']?.data === undefined - ? new SkyBlockMemberInventoriesBackpack(data, '15') - : null; + ? null + : new SkyBlockMemberInventoriesBackpack(data, '15'); this.backpack17 = data?.backpackIcons?.['16']?.data === undefined || data?.backpackContents?.['16']?.data === undefined - ? new SkyBlockMemberInventoriesBackpack(data, '16') - : null; + ? null + : new SkyBlockMemberInventoriesBackpack(data, '16'); this.backpack18 = data?.backpackIcons?.['17']?.data === undefined || data?.backpackContents?.['17']?.data === undefined - ? new SkyBlockMemberInventoriesBackpack(data, '17') - : null; + ? null + : new SkyBlockMemberInventoriesBackpack(data, '17'); } } From 3feb2e2259831142b5d6ddd42fee000c20bc8cbb Mon Sep 17 00:00:00 2001 From: Jacob Date: Mon, 13 Oct 2025 11:47:52 +0800 Subject: [PATCH 055/124] feat(SkyblockMemberInventories): Sack Counts closes #677 --- .../Member/Inventories/SkyBlockMemberInventories.test.ts | 7 +++++++ .../Member/Inventories/SkyBlockMemberInventories.ts | 2 ++ 2 files changed, 9 insertions(+) diff --git a/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.test.ts b/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.test.ts index c32a94fde..1fcc8a80f 100644 --- a/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.test.ts +++ b/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.test.ts @@ -27,4 +27,11 @@ test('SkyBlockMemberInventories', () => { expectTypeOf(data.personalVault).toEqualTypeOf(); expect(data.wardrobe).toBeDefined(); expectTypeOf(data.wardrobe).toEqualTypeOf(); + expect(data.sacksCounts).toBeDefined(); + expectTypeOf(data.sacksCounts).toEqualTypeOf>(); + Object.keys(data.sacksCounts).forEach((item) => { + expect(data.sacksCounts[item]).toBeDefined(); + expect(data.sacksCounts[item]).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sacksCounts[item]).toEqualTypeOf(); + }); }); diff --git a/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.ts b/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.ts index 98f3faeaf..21e22219d 100644 --- a/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.ts +++ b/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.ts @@ -13,6 +13,7 @@ class SkyBlockMemberInventories { bags: SkyBlockMemberInventoriesBags; personalVault: SkyBlockMemberInventoriesInventory; wardrobe: SkyBlockMemberInventoriesInventory; + sacksCounts: Record; constructor(data: Record) { this.inventory = new SkyBlockMemberInventoriesInventory(data?.inv_contents || {}); this.armor = new SkyBlockMemberInventoriesArmor(data?.inv_armor || {}); @@ -25,6 +26,7 @@ class SkyBlockMemberInventories { this.bags = new SkyBlockMemberInventoriesBags(data?.bag_contents || {}); this.personalVault = new SkyBlockMemberInventoriesInventory(data?.personal_vault_contents || {}); this.wardrobe = new SkyBlockMemberInventoriesInventory({ ...(data?.wardrobe_contents || {}) }); + this.sacksCounts = data?.sacks_counts || {}; } } From ca636965ffe2a73dc8e6079196546f0fb9f2aaa2 Mon Sep 17 00:00:00 2001 From: Jacob Date: Mon, 13 Oct 2025 11:57:05 +0800 Subject: [PATCH 056/124] feat(SkyBlockMemberInventories): Shared Inventory closes #676 --- .../Member/Inventories/SkyBlockMemberInventories.test.ts | 6 +++++- .../Member/Inventories/SkyBlockMemberInventories.ts | 6 +++++- src/Structures/SkyBlock/Member/SkyBlockMember.ts | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.test.ts b/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.test.ts index 1fcc8a80f..6276e8d30 100644 --- a/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.test.ts +++ b/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.test.ts @@ -7,7 +7,7 @@ import SkyBlockMemberInventoriesInventory from './Inventory/SkyBlockMemberInvent import { expect, expectTypeOf, test } from 'vitest'; test('SkyBlockMemberInventories', () => { - const data = new SkyBlockMemberInventories({ stats: 'meow' }); + const data = new SkyBlockMemberInventories({ stats: 'meow' }, { stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberInventories); expectTypeOf(data).toEqualTypeOf(); @@ -34,4 +34,8 @@ test('SkyBlockMemberInventories', () => { expect(data.sacksCounts[item]).toBeGreaterThanOrEqual(0); expectTypeOf(data.sacksCounts[item]).toEqualTypeOf(); }); + expect(data.candy).toBeDefined(); + expectTypeOf(data.candy).toEqualTypeOf(); + expect(data.carnivalMask).toBeDefined(); + expectTypeOf(data.carnivalMask).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.ts b/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.ts index 21e22219d..639a985df 100644 --- a/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.ts +++ b/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.ts @@ -14,7 +14,9 @@ class SkyBlockMemberInventories { personalVault: SkyBlockMemberInventoriesInventory; wardrobe: SkyBlockMemberInventoriesInventory; sacksCounts: Record; - constructor(data: Record) { + candy: SkyBlockMemberInventoriesInventory; + carnivalMask: SkyBlockMemberInventoriesInventory; + constructor(data: Record, shared: Record) { this.inventory = new SkyBlockMemberInventoriesInventory(data?.inv_contents || {}); this.armor = new SkyBlockMemberInventoriesArmor(data?.inv_armor || {}); this.equipment = new SkyBlockMemberInventoriesEquipment(data?.equipment_contents || {}); @@ -27,6 +29,8 @@ class SkyBlockMemberInventories { this.personalVault = new SkyBlockMemberInventoriesInventory(data?.personal_vault_contents || {}); this.wardrobe = new SkyBlockMemberInventoriesInventory({ ...(data?.wardrobe_contents || {}) }); this.sacksCounts = data?.sacks_counts || {}; + this.candy = new SkyBlockMemberInventoriesInventory(shared?.candy_inventory_contents || {}); + this.carnivalMask = new SkyBlockMemberInventoriesInventory(shared?.carnival_mask_inventory_contents || {}); } } diff --git a/src/Structures/SkyBlock/Member/SkyBlockMember.ts b/src/Structures/SkyBlock/Member/SkyBlockMember.ts index 899345be5..f30fded54 100644 --- a/src/Structures/SkyBlock/Member/SkyBlockMember.ts +++ b/src/Structures/SkyBlock/Member/SkyBlockMember.ts @@ -70,7 +70,7 @@ class SkyBlockMember { this.quests = new SkyBlockMemberQuests(data?.quests || {}); this.slayers = new SkyBlockMemberSlayers(data?.slayer || {}); this.rift = new SkyBlockMemberRift(data?.rift || {}); - this.inventory = new SkyBlockMemberInventories(data?.inventory || {}); + this.inventory = new SkyBlockMemberInventories(data?.inventory || {}, data?.shared_inventory || {}); } toString(): UUID { From 88aae24797ae1560a0b16ad050e4116207136f37 Mon Sep 17 00:00:00 2001 From: Jacob Date: Mon, 13 Oct 2025 12:09:43 +0800 Subject: [PATCH 057/124] Release 12.0.0-13 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 54ffbe386..8c35b0560 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hypixel-api-reborn", - "version": "12.0.0-12", + "version": "12.0.0-13", "description": "Feature-rich Hypixel API wrapper for Node.js", "main": "dist/index.js", "types": "dist/index.d.ts", From 4e0addaeb1376403a7d760faae26b987010f7bbe Mon Sep 17 00:00:00 2001 From: Jacob Date: Tue, 14 Oct 2025 15:38:08 +0800 Subject: [PATCH 058/124] feat: SkyHelperNetworthProfile --- .github/scripts/generateIndexFile.ts | 11 +++- src/Types/SkyBlock.ts | 98 ++++++++++++++++++++++++++++ src/Utils/SkyBlockUtils.ts | 95 ++++++++++++++++++++++++++- src/index.ts | 10 +++ 4 files changed, 212 insertions(+), 2 deletions(-) diff --git a/.github/scripts/generateIndexFile.ts b/.github/scripts/generateIndexFile.ts index fba871691..4e7eb12aa 100644 --- a/.github/scripts/generateIndexFile.ts +++ b/.github/scripts/generateIndexFile.ts @@ -32,7 +32,8 @@ async function generateBaseIndex() { '', '', "import Client from './Client.js';", - "import Errors from './Errors.js';" + "import Errors from './Errors.js';", + '' ]; const typesPaths = await scanDirectory('./src/Types/'); @@ -43,6 +44,14 @@ async function generateBaseIndex() { lines.push(''); + const utilsPaths = await scanDirectory('./src/Utils/'); + utilsPaths.forEach((path) => { + const fixedPath = path.replaceAll('.ts', '.js'); + lines.push(`export * from '${fixedPath}';`); + }); + + lines.push(''); + const structuresPaths = await scanDirectory('./src/Structures/'); const fixedStructuresPaths: string[] = []; const importNames: string[] = []; diff --git a/src/Types/SkyBlock.ts b/src/Types/SkyBlock.ts index 5231d7099..8422cf23c 100644 --- a/src/Types/SkyBlock.ts +++ b/src/Types/SkyBlock.ts @@ -1,5 +1,7 @@ /* v8 ignore next 10000 */ +import type SkyBlockMemberLeveling from '../Structures/SkyBlock/Member/SkyBlockMemberLeveling.ts'; +import type SkyBlockMemberPlayerData from '../Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerData.ts'; import type { SortName } from './Global.js'; export interface RawAbiphoneData { @@ -3524,3 +3526,99 @@ export interface BestiaryMobsData { catacombs: RawBestiaryIsland; garden: RawBestiaryIsland; } + +export interface SkyHelperNetWorthProfileCurrenciesEssenceEssence { + current: number; +} + +export interface SkyHelperNetWorthProfileCurrenciesEssence { + WITHER: SkyHelperNetWorthProfileCurrenciesEssenceEssence; + DRAGON: SkyHelperNetWorthProfileCurrenciesEssenceEssence; + SPIDER: SkyHelperNetWorthProfileCurrenciesEssenceEssence; + UNDEAD: SkyHelperNetWorthProfileCurrenciesEssenceEssence; + DIAMOND: SkyHelperNetWorthProfileCurrenciesEssenceEssence; + GOLD: SkyHelperNetWorthProfileCurrenciesEssenceEssence; + ICE: SkyHelperNetWorthProfileCurrenciesEssenceEssence; + CRIMSON: SkyHelperNetWorthProfileCurrenciesEssenceEssence; +} + +export interface SkyHelperNetWorthProfileCurrencies { + coin_purse: number; + essence: SkyHelperNetWorthProfileCurrenciesEssence; +} + +export interface SkyHelperNetWorthProfileProfile { + bank_account: number; +} + +export interface SkyHelperNetWorthProfileInventoryInventory { + data: string; +} + +export interface SkyHelperNetWorthProfileInventoryBackpack { + '0': SkyHelperNetWorthProfileInventoryInventory; + '1': SkyHelperNetWorthProfileInventoryInventory; + '2': SkyHelperNetWorthProfileInventoryInventory; + '3': SkyHelperNetWorthProfileInventoryInventory; + '4': SkyHelperNetWorthProfileInventoryInventory; + '5': SkyHelperNetWorthProfileInventoryInventory; + '6': SkyHelperNetWorthProfileInventoryInventory; + '7': SkyHelperNetWorthProfileInventoryInventory; + '8': SkyHelperNetWorthProfileInventoryInventory; + '9': SkyHelperNetWorthProfileInventoryInventory; + '10': SkyHelperNetWorthProfileInventoryInventory; + '11': SkyHelperNetWorthProfileInventoryInventory; + '12': SkyHelperNetWorthProfileInventoryInventory; + '13': SkyHelperNetWorthProfileInventoryInventory; + '14': SkyHelperNetWorthProfileInventoryInventory; + '15': SkyHelperNetWorthProfileInventoryInventory; + '16': SkyHelperNetWorthProfileInventoryInventory; + '17': SkyHelperNetWorthProfileInventoryInventory; +} + +export interface SkyHelperNetWorthProfileInventoryBagContents { + talisman_bag: SkyHelperNetWorthProfileInventoryInventory; + fishing_bag: SkyHelperNetWorthProfileInventoryInventory; + potion_bag: SkyHelperNetWorthProfileInventoryInventory; + sacks_bag: SkyHelperNetWorthProfileInventoryInventory; + quiver: SkyHelperNetWorthProfileInventoryInventory; +} + +export interface SkyHelperNetWorthProfileInventory { + inv_armor: SkyHelperNetWorthProfileInventoryInventory; + equipment_contents: SkyHelperNetWorthProfileInventoryInventory; + wardrobe_contents: SkyHelperNetWorthProfileInventoryInventory; + inv_contents: SkyHelperNetWorthProfileInventoryInventory; + ender_chest_contents: SkyHelperNetWorthProfileInventoryInventory; + personal_vault_contents: SkyHelperNetWorthProfileInventoryInventory; + backpack_contents: SkyHelperNetWorthProfileInventoryBackpack; + backpack_icons: SkyHelperNetWorthProfileInventoryBackpack; + bag_contents: SkyHelperNetWorthProfileInventoryBagContents; +} + +export interface SkyHelperNetWorthProfileSharedInventory { + candy_inventory_contents: SkyHelperNetWorthProfileInventoryInventory; + carnival_mask_inventory_contents: SkyHelperNetWorthProfileInventoryInventory; +} + +export interface SkyHelperNetWorthProfilePetsDataPet { + type: SkyBlockPetId | 'UNKNOWN'; + tier: 'UNKNOWN' | Rarity; + exp: number; + heldItem: string | null; + skin: string | null; +} + +export interface SkyHelperNetWorthProfilePetsData { + pets: SkyHelperNetWorthProfilePetsDataPet[]; +} + +export interface SkyHelperNetWorthProfile { + currencies: SkyHelperNetWorthProfileCurrencies; + profile: SkyHelperNetWorthProfileProfile; + player_data: SkyBlockMemberPlayerData; + leveling: SkyBlockMemberLeveling; + inventory: SkyHelperNetWorthProfileInventory; + shared_inventory: SkyHelperNetWorthProfileSharedInventory; + pets_data: SkyHelperNetWorthProfilePetsData; +} diff --git a/src/Utils/SkyBlockUtils.ts b/src/Utils/SkyBlockUtils.ts index 9fd4a3ff8..111e409ad 100644 --- a/src/Utils/SkyBlockUtils.ts +++ b/src/Utils/SkyBlockUtils.ts @@ -23,6 +23,7 @@ import { petRarityOffset } from './Constants.js'; import { parse, simplify } from 'prismarine-nbt'; +import type SkyBlockProfile from '../Structures/SkyBlock/Profile/SkyBlockProfile.ts'; import type { LevelData, PetLevelData, @@ -30,7 +31,8 @@ import type { SkillLevelData, SkyBlockPetId, SkyBlockSlayer, - SkyBlockXPTables + SkyBlockXPTables, + SkyHelperNetWorthProfile } from '../Types/SkyBlock.js'; export async function decode(base64: any, isBuffer: boolean = false): Promise { @@ -188,3 +190,94 @@ export function getLevelByXp(xp: number, extra: Extra = { type: 'default' }): Sk return { xp, level, xpForNext, progress, maxed, maxLevel, currentXp }; } + +export function PrepareSkyBlockProfileForSkyHelperNetWorth( + profile: SkyBlockProfile & { me: NonNullable } +): SkyHelperNetWorthProfile { + /* eslint-disable camelcase */ + /* eslint-disable quote-props */ + return { + currencies: { + coin_purse: profile.me.currencies.purse, + essence: { + WITHER: { current: profile.me.currencies.witherEssence }, + DRAGON: { current: profile.me.currencies.dragonEssence }, + SPIDER: { current: profile.me.currencies.spiderEssence }, + UNDEAD: { current: profile.me.currencies.undeadEssence }, + DIAMOND: { current: profile.me.currencies.diamondEssence }, + GOLD: { current: profile.me.currencies.goldEssence }, + ICE: { current: profile.me.currencies.iceEssence }, + CRIMSON: { current: profile.me.currencies.crimsonEssence } + } + }, + profile: { bank_account: profile.banking.balance }, + player_data: profile.me.playerData, + leveling: profile.me.leveling, + inventory: { + inv_armor: { data: profile.me.inventory.armor.base64 ?? '' }, + equipment_contents: { data: profile.me.inventory.equipment.base64 ?? '' }, + wardrobe_contents: { data: profile.me.inventory.wardrobe.base64 ?? '' }, + inv_contents: { data: profile.me.inventory.inventory.base64 ?? '' }, + ender_chest_contents: { data: profile.me.inventory.enderChest.base64 ?? '' }, + personal_vault_contents: { data: profile.me.inventory.personalVault.base64 ?? '' }, + backpack_contents: { + '0': { data: profile.me.inventory.backpacks.backpack1?.backpackContentsBase64 ?? '' }, + '1': { data: profile.me.inventory.backpacks.backpack2?.backpackContentsBase64 ?? '' }, + '2': { data: profile.me.inventory.backpacks.backpack3?.backpackContentsBase64 ?? '' }, + '3': { data: profile.me.inventory.backpacks.backpack4?.backpackContentsBase64 ?? '' }, + '4': { data: profile.me.inventory.backpacks.backpack5?.backpackContentsBase64 ?? '' }, + '5': { data: profile.me.inventory.backpacks.backpack6?.backpackContentsBase64 ?? '' }, + '6': { data: profile.me.inventory.backpacks.backpack7?.backpackContentsBase64 ?? '' }, + '7': { data: profile.me.inventory.backpacks.backpack8?.backpackContentsBase64 ?? '' }, + '8': { data: profile.me.inventory.backpacks.backpack9?.backpackContentsBase64 ?? '' }, + '9': { data: profile.me.inventory.backpacks.backpack10?.backpackContentsBase64 ?? '' }, + '10': { data: profile.me.inventory.backpacks.backpack11?.backpackContentsBase64 ?? '' }, + '11': { data: profile.me.inventory.backpacks.backpack12?.backpackContentsBase64 ?? '' }, + '12': { data: profile.me.inventory.backpacks.backpack13?.backpackContentsBase64 ?? '' }, + '13': { data: profile.me.inventory.backpacks.backpack14?.backpackContentsBase64 ?? '' }, + '14': { data: profile.me.inventory.backpacks.backpack15?.backpackContentsBase64 ?? '' }, + '15': { data: profile.me.inventory.backpacks.backpack16?.backpackContentsBase64 ?? '' }, + '16': { data: profile.me.inventory.backpacks.backpack17?.backpackContentsBase64 ?? '' }, + '17': { data: profile.me.inventory.backpacks.backpack18?.backpackContentsBase64 ?? '' } + }, + backpack_icons: { + '0': { data: profile.me.inventory.backpacks.backpack1?.backpackItemBase64 ?? '' }, + '1': { data: profile.me.inventory.backpacks.backpack2?.backpackItemBase64 ?? '' }, + '2': { data: profile.me.inventory.backpacks.backpack3?.backpackItemBase64 ?? '' }, + '3': { data: profile.me.inventory.backpacks.backpack4?.backpackItemBase64 ?? '' }, + '4': { data: profile.me.inventory.backpacks.backpack5?.backpackItemBase64 ?? '' }, + '5': { data: profile.me.inventory.backpacks.backpack6?.backpackItemBase64 ?? '' }, + '6': { data: profile.me.inventory.backpacks.backpack7?.backpackItemBase64 ?? '' }, + '7': { data: profile.me.inventory.backpacks.backpack8?.backpackItemBase64 ?? '' }, + '8': { data: profile.me.inventory.backpacks.backpack9?.backpackItemBase64 ?? '' }, + '9': { data: profile.me.inventory.backpacks.backpack10?.backpackItemBase64 ?? '' }, + '10': { data: profile.me.inventory.backpacks.backpack11?.backpackItemBase64 ?? '' }, + '11': { data: profile.me.inventory.backpacks.backpack12?.backpackItemBase64 ?? '' }, + '12': { data: profile.me.inventory.backpacks.backpack13?.backpackItemBase64 ?? '' }, + '13': { data: profile.me.inventory.backpacks.backpack14?.backpackItemBase64 ?? '' }, + '14': { data: profile.me.inventory.backpacks.backpack15?.backpackItemBase64 ?? '' }, + '15': { data: profile.me.inventory.backpacks.backpack16?.backpackItemBase64 ?? '' }, + '16': { data: profile.me.inventory.backpacks.backpack17?.backpackItemBase64 ?? '' }, + '17': { data: profile.me.inventory.backpacks.backpack18?.backpackItemBase64 ?? '' } + }, + bag_contents: { + talisman_bag: { data: profile.me.inventory.bags.talisman.base64 ?? '' }, + fishing_bag: { data: profile.me.inventory.bags.fishing.base64 ?? '' }, + potion_bag: { data: profile.me.inventory.bags.potion.base64 ?? '' }, + sacks_bag: { data: profile.me.inventory.bags.sacks.base64 ?? '' }, + quiver: { data: profile.me.inventory.bags.quiver.base64 ?? '' } + } + }, + shared_inventory: { + candy_inventory_contents: { data: profile.me.inventory.candy.base64 ?? '' }, + carnival_mask_inventory_contents: { data: profile.me.inventory.carnivalMask.base64 ?? '' } + }, + pets_data: { + pets: profile.me.pets.pets.map((pet) => { + return { type: pet.type, tier: pet.tier, exp: pet.level.xp, heldItem: pet.heldItem, skin: pet.skin }; + }) + } + }; + /* eslint-enable camelcase */ + /* eslint-enable quote-props */ +} diff --git a/src/index.ts b/src/index.ts index 7672a6a3e..7b82895a4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,6 +3,7 @@ import Client from './Client.js'; import Errors from './Errors.js'; + export * from './Types/API.js'; export * from './Types/Booster.js'; export * from './Types/Client.js'; @@ -15,6 +16,15 @@ export * from './Types/Requests.js'; export * from './Types/SkyBlock.js'; export * from './Types/Static.js'; +export * from './Utils/Constants.js'; +export * from './Utils/Divide.js'; +export * from './Utils/Guild.js'; +export * from './Utils/Oscillation.js'; +export * from './Utils/RemoveSnakeCase.js'; +export * from './Utils/Romanize.js'; +export * from './Utils/SkyBlockUtils.js'; +export * from './Utils/TicksToMilliseconds.js'; + import Achievements from './Structures/Static/Achievements/Achievements.js'; import Arcade from './Structures/MiniGames/Arcade/Arcade.js'; import ArenaBrawl from './Structures/MiniGames/ArenaBrawl/ArenaBrawl.js'; From ab1475077cc140cf0c3418ab6a58c0e974f11f9a Mon Sep 17 00:00:00 2001 From: Jacob Date: Sun, 19 Oct 2025 20:44:47 +0800 Subject: [PATCH 059/124] feat: docs --- docs/.gitignore | 2 + .../SettingUpClient/Code/.gitignore | 2 + .../SettingUpClient/Code/package.json | 7 + .../Code/src/HypixelAPIReborn.js | 5 + .../SettingUpClient/Code/src/PlayerExample.js | 10 + docs/JavaScript/SettingUpClient/Guide.md | 73 +++ .../SkyHelperNetworth/Code/.gitignore | 2 + .../SkyHelperNetworth/Code/package.json | 7 + .../Code/src/CalculatorExample.js | 28 + .../Code/src/HypixelAPIReborn.js | 5 + .../Code/src/MuseumExample.js | 21 + .../Code/src/NetworthExample.js | 31 + .../Code/src/ProfileExample.js | 12 + docs/JavaScript/SkyHelperNetworth/Guide.md | 95 +++ .../SettingUpClient/Code/.gitignore | 2 + .../SettingUpClient/Code/package.json | 14 + .../Code/src/HypixelAPIReborn.ts | 5 + .../SettingUpClient/Code/src/PlayerExample.ts | 13 + .../SettingUpClient/Code/tsconfig.json | 13 + docs/TypeScript/SettingUpClient/Guide.md | 80 +++ .../SkyHelperNetworth/Code/.gitignore | 2 + .../SkyHelperNetworth/Code/package.json | 14 + .../Code/src/CalculatorExample.ts | 34 + .../Code/src/HypixelAPIReborn.ts | 5 + .../Code/src/MuseumExample.ts | 27 + .../Code/src/NetworthExample.ts | 37 ++ .../Code/src/ProfileExample.ts | 15 + .../SkyHelperNetworth/Code/tsconfig.json | 13 + docs/TypeScript/SkyHelperNetworth/Guide.md | 97 +++ docs/TypeScript/UnderstandingIsRaw/Guide.md | 29 + docs/package.json | 29 + docs/pnpm-lock.yaml | 602 ++++++++++++++++++ docs/pnpm-workspace.yaml | 12 + docs/src/GeneratePackages.ts | 165 +++++ docs/tsconfig.json | 13 + src/API/getSkyBlockProfiles.test.ts | 10 +- src/API/getSkyBlockProfiles.ts | 16 +- src/Client.ts | 5 +- src/Types/API.ts | 4 + src/Utils/SkyBlockUtils.ts | 2 +- 40 files changed, 1549 insertions(+), 9 deletions(-) create mode 100644 docs/.gitignore create mode 100644 docs/JavaScript/SettingUpClient/Code/.gitignore create mode 100644 docs/JavaScript/SettingUpClient/Code/package.json create mode 100644 docs/JavaScript/SettingUpClient/Code/src/HypixelAPIReborn.js create mode 100644 docs/JavaScript/SettingUpClient/Code/src/PlayerExample.js create mode 100644 docs/JavaScript/SettingUpClient/Guide.md create mode 100644 docs/JavaScript/SkyHelperNetworth/Code/.gitignore create mode 100644 docs/JavaScript/SkyHelperNetworth/Code/package.json create mode 100644 docs/JavaScript/SkyHelperNetworth/Code/src/CalculatorExample.js create mode 100644 docs/JavaScript/SkyHelperNetworth/Code/src/HypixelAPIReborn.js create mode 100644 docs/JavaScript/SkyHelperNetworth/Code/src/MuseumExample.js create mode 100644 docs/JavaScript/SkyHelperNetworth/Code/src/NetworthExample.js create mode 100644 docs/JavaScript/SkyHelperNetworth/Code/src/ProfileExample.js create mode 100644 docs/JavaScript/SkyHelperNetworth/Guide.md create mode 100644 docs/TypeScript/SettingUpClient/Code/.gitignore create mode 100644 docs/TypeScript/SettingUpClient/Code/package.json create mode 100644 docs/TypeScript/SettingUpClient/Code/src/HypixelAPIReborn.ts create mode 100644 docs/TypeScript/SettingUpClient/Code/src/PlayerExample.ts create mode 100644 docs/TypeScript/SettingUpClient/Code/tsconfig.json create mode 100644 docs/TypeScript/SettingUpClient/Guide.md create mode 100644 docs/TypeScript/SkyHelperNetworth/Code/.gitignore create mode 100644 docs/TypeScript/SkyHelperNetworth/Code/package.json create mode 100644 docs/TypeScript/SkyHelperNetworth/Code/src/CalculatorExample.ts create mode 100644 docs/TypeScript/SkyHelperNetworth/Code/src/HypixelAPIReborn.ts create mode 100644 docs/TypeScript/SkyHelperNetworth/Code/src/MuseumExample.ts create mode 100644 docs/TypeScript/SkyHelperNetworth/Code/src/NetworthExample.ts create mode 100644 docs/TypeScript/SkyHelperNetworth/Code/src/ProfileExample.ts create mode 100644 docs/TypeScript/SkyHelperNetworth/Code/tsconfig.json create mode 100644 docs/TypeScript/SkyHelperNetworth/Guide.md create mode 100644 docs/TypeScript/UnderstandingIsRaw/Guide.md create mode 100644 docs/package.json create mode 100644 docs/pnpm-lock.yaml create mode 100644 docs/pnpm-workspace.yaml create mode 100644 docs/src/GeneratePackages.ts create mode 100644 docs/tsconfig.json diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 000000000..b94707787 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +dist/ diff --git a/docs/JavaScript/SettingUpClient/Code/.gitignore b/docs/JavaScript/SettingUpClient/Code/.gitignore new file mode 100644 index 000000000..b94707787 --- /dev/null +++ b/docs/JavaScript/SettingUpClient/Code/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +dist/ diff --git a/docs/JavaScript/SettingUpClient/Code/package.json b/docs/JavaScript/SettingUpClient/Code/package.json new file mode 100644 index 000000000..d9d1a73c5 --- /dev/null +++ b/docs/JavaScript/SettingUpClient/Code/package.json @@ -0,0 +1,7 @@ +{ + "name": "@hypixel-api-reborn-docs/javascript-setting-up-client", + "type": "module", + "dependencies": { + "hypixel-api-reborn": "catalog:" + } +} diff --git a/docs/JavaScript/SettingUpClient/Code/src/HypixelAPIReborn.js b/docs/JavaScript/SettingUpClient/Code/src/HypixelAPIReborn.js new file mode 100644 index 000000000..b62a133b6 --- /dev/null +++ b/docs/JavaScript/SettingUpClient/Code/src/HypixelAPIReborn.js @@ -0,0 +1,5 @@ +import { Client } from 'hypixel-api-reborn'; + +const HypixelAPIReborn = new Client('YOUR API_KEY'); + +export default HypixelAPIReborn; diff --git a/docs/JavaScript/SettingUpClient/Code/src/PlayerExample.js b/docs/JavaScript/SettingUpClient/Code/src/PlayerExample.js new file mode 100644 index 000000000..f73a78516 --- /dev/null +++ b/docs/JavaScript/SettingUpClient/Code/src/PlayerExample.js @@ -0,0 +1,10 @@ +import HypixelAPIReborn from './HypixelAPIReborn.js'; + +async function Run() { + const player = await HypixelAPIReborn.getPlayer('kathund'); + + console.log(player); +} + +// Required because you can't just run async stuff. +Run(); diff --git a/docs/JavaScript/SettingUpClient/Guide.md b/docs/JavaScript/SettingUpClient/Guide.md new file mode 100644 index 000000000..794565ba7 --- /dev/null +++ b/docs/JavaScript/SettingUpClient/Guide.md @@ -0,0 +1,73 @@ +# Setting up Hypixel-API-Reborn's Client (JavaScript) + +This guide will explain how to setup a reuseable Client instance from Hypixel-API-Reborn. + +This assumes that you will be using JavaScript. Please checkout +[the TypeScript version](../TypeScript/SettingUpClient.md) of this guide if you need TypeScript + +## Requirements + +- Hypixel-API-Reborn v12.0.0-14 or **higher** + +## Assumptions + +This guide assumes the following + +- You are using Hypixel-API-Reborn v12.0.0-14 +- You are using ES6 Modules + +## Initializing a Client Instance + +By importing the Client constructor from Hypixel-API-Reborn you can start a new instance of it by calling new on the +class and passing in your API Key + +```JavaScript +// File HypixelAPIReborn.js +import { Client } from 'hypixel-api-reborn'; + +const HypixelAPIReborn = new Client("YOUR API_KEY"); +``` + +## Sharing your Client Instance + +We recommend not creating multiple instances of Client because of how we manage ratelimiting and having it cause desync +issues. Instead we recommend making one instance of Client then exporting it and importing it an any files that need the +Client instance. + +```JavaScript +// File HypixelAPIReborn.js + +import { Client } from 'hypixel-api-reborn.js'; + +const HypixelAPIReborn = new Client("YOUR API_KEY"); + +export default HypixelAPIReborn; +``` + +Once it's exported you can then reimport it into a different file and make requests from it + +```JavaScript +// File PlayerExample.js +import HypixelAPIReborn from './HypixelAPIReborn.js'; +``` + +## Fetching a Player + +Once you have initialized your client instance you can then call a function on it. In this example we are going to call +[getPlayer](https://hypixel-api-reborn.github.io/hypixel-api-reborn/classes/Client.Client.html#getplayer) but there are +many more endpoints you can fetch. A +[full list can be found on the docs under the Methods section](https://hypixel-api-reborn.github.io/hypixel-api-reborn/classes/Client.Client.html) + +```JavaScript +// File PlayerExample.js +import HypixelAPIReborn from './HypixelAPIReborn.js'; + +const player = await hypixelAPI.getPlayer("kathund"); + +console.log(player); +``` + +## Code + +The resulting code can be found at +[Code/src/](https://github.com/Hypixel-API-Reborn/hypixel-api-reborn/blob/master/docs/JavaScript/SettingUpClient/Code/src/) diff --git a/docs/JavaScript/SkyHelperNetworth/Code/.gitignore b/docs/JavaScript/SkyHelperNetworth/Code/.gitignore new file mode 100644 index 000000000..b94707787 --- /dev/null +++ b/docs/JavaScript/SkyHelperNetworth/Code/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +dist/ diff --git a/docs/JavaScript/SkyHelperNetworth/Code/package.json b/docs/JavaScript/SkyHelperNetworth/Code/package.json new file mode 100644 index 000000000..697ab7624 --- /dev/null +++ b/docs/JavaScript/SkyHelperNetworth/Code/package.json @@ -0,0 +1,7 @@ +{ + "name": "@hypixel-api-reborn-docs/javascript-sky-helper-networth", + "type": "module", + "dependencies": { + "hypixel-api-reborn": "catalog:" + } +} diff --git a/docs/JavaScript/SkyHelperNetworth/Code/src/CalculatorExample.js b/docs/JavaScript/SkyHelperNetworth/Code/src/CalculatorExample.js new file mode 100644 index 000000000..d8cbbc192 --- /dev/null +++ b/docs/JavaScript/SkyHelperNetworth/Code/src/CalculatorExample.js @@ -0,0 +1,28 @@ +import HypixelAPIReborn from './HypixelAPIReborn.js'; +import { PrepareSkyBlockProfileForSkyHelperNetworth } from 'hypixel-api-reborn'; +import { ProfileNetworthCalculator } from 'skyhelper-networth'; + +async function Run() { + const profiles = await HypixelAPIReborn.getSkyBlockProfiles('14727faefbdc4aff848cd2713eb9939e'); + + const selectedProfile = profiles.selectedProfile; + // Check that the player has a selectedProfile. + if (selectedProfile === undefined) throw new Error("Player doesn't have a skyblock profile selected."); + + // Fetch the player's museum data + const museum = await HypixelAPIReborn.getSkyBlockMuseum(selectedProfile.profileId, { raw: true }); + + // Check that the player has API on. + const museumProfile = museum.data.members[selectedProfile.me.uuid]; + if (museumProfile === undefined) throw new Error('Player has museum API off.'); + + // Reparse the profile data so that SkyHelper can read it and use it + const profileData = PrepareSkyBlockProfileForSkyHelperNetworth(selectedProfile); + + // Create the Networth calculator + const networthCalculator = new ProfileNetworthCalculator(profileData, museumProfile, selectedProfile.banking.balance); + console.log(networthCalculator); +} + +// Required because you can't just run async stuff. +Run(); diff --git a/docs/JavaScript/SkyHelperNetworth/Code/src/HypixelAPIReborn.js b/docs/JavaScript/SkyHelperNetworth/Code/src/HypixelAPIReborn.js new file mode 100644 index 000000000..b62a133b6 --- /dev/null +++ b/docs/JavaScript/SkyHelperNetworth/Code/src/HypixelAPIReborn.js @@ -0,0 +1,5 @@ +import { Client } from 'hypixel-api-reborn'; + +const HypixelAPIReborn = new Client('YOUR API_KEY'); + +export default HypixelAPIReborn; diff --git a/docs/JavaScript/SkyHelperNetworth/Code/src/MuseumExample.js b/docs/JavaScript/SkyHelperNetworth/Code/src/MuseumExample.js new file mode 100644 index 000000000..6a9c65368 --- /dev/null +++ b/docs/JavaScript/SkyHelperNetworth/Code/src/MuseumExample.js @@ -0,0 +1,21 @@ +import HypixelAPIReborn from './HypixelAPIReborn.js'; + +async function Run() { + const profiles = await HypixelAPIReborn.getSkyBlockProfiles('14727faefbdc4aff848cd2713eb9939e'); + + const selectedProfile = profiles.selectedProfile; + // Check that the player has a selectedProfile. + if (selectedProfile === undefined) throw new Error("Player doesn't have a skyblock profile selected."); + + // Fetch the player's museum data + const museum = await HypixelAPIReborn.getSkyBlockMuseum(selectedProfile.profileId, { raw: true }); + + // Check that the player has API on. + const museumProfile = museum.data.members[selectedProfile.me.uuid]; + if (museumProfile === undefined) throw new Error('Player has museum API off.'); + + console.log(museumProfile); +} + +// Required because you can't just run async stuff. +Run(); diff --git a/docs/JavaScript/SkyHelperNetworth/Code/src/NetworthExample.js b/docs/JavaScript/SkyHelperNetworth/Code/src/NetworthExample.js new file mode 100644 index 000000000..160823094 --- /dev/null +++ b/docs/JavaScript/SkyHelperNetworth/Code/src/NetworthExample.js @@ -0,0 +1,31 @@ +import HypixelAPIReborn from './HypixelAPIReborn.js'; +import { PrepareSkyBlockProfileForSkyHelperNetworth } from 'hypixel-api-reborn'; +import { ProfileNetworthCalculator } from 'skyhelper-networth'; + +async function Run() { + const profiles = await HypixelAPIReborn.getSkyBlockProfiles('14727faefbdc4aff848cd2713eb9939e'); + + const selectedProfile = profiles.selectedProfile; + // Check that the player has a selectedProfile. + if (selectedProfile === undefined) throw new Error("Player doesn't have a skyblock profile selected."); + + // Fetch the player's museum data + const museum = await HypixelAPIReborn.getSkyBlockMuseum(selectedProfile.profileId, { raw: true }); + + // Check that the player has API on. + const museumProfile = museum.data.members[selectedProfile.me.uuid]; + if (museumProfile === undefined) throw new Error('Player has museum API off.'); + + // Reparse the profile data so that SkyHelper can read it and use it + const profileData = PrepareSkyBlockProfileForSkyHelperNetworth(selectedProfile); + + // Create the Networth calculator + const networthCalculator = new ProfileNetworthCalculator(profileData, museumProfile, selectedProfile.banking.balance); + + // Fetch the Networth + const networthData = await networthCalculator.getNetworth({ onlyNetworth: true }); + console.log(networthData); +} + +// Required because you can't just run async stuff. +Run(); diff --git a/docs/JavaScript/SkyHelperNetworth/Code/src/ProfileExample.js b/docs/JavaScript/SkyHelperNetworth/Code/src/ProfileExample.js new file mode 100644 index 000000000..0a0bb2020 --- /dev/null +++ b/docs/JavaScript/SkyHelperNetworth/Code/src/ProfileExample.js @@ -0,0 +1,12 @@ +import HypixelAPIReborn from './HypixelAPIReborn.js'; + +const profiles = await HypixelAPIReborn.getSkyBlockProfiles('14727faefbdc4aff848cd2713eb9939e'); + +const selectedProfile = profiles.selectedProfile; +// Check that the player has a selectedProfile. +if (selectedProfile === undefined) throw new Error("Player doesn't have a skyblock profile selected."); + +console.log(selectedProfile); + +// Required because you can't just run async stuff. +Run(); diff --git a/docs/JavaScript/SkyHelperNetworth/Guide.md b/docs/JavaScript/SkyHelperNetworth/Guide.md new file mode 100644 index 000000000..ec5a57801 --- /dev/null +++ b/docs/JavaScript/SkyHelperNetworth/Guide.md @@ -0,0 +1,95 @@ +# Fetching SkyHelper Networth using Hypixel-API-Reborn (JavaScript) + +This will explain how to convert a Hypixel-API-Reborn API request into useable data that can be parsed into SkyHelper +Networth. This assumes that you will be using JavaScript. Please checkout +[the TypeScript version](../TypeScript/SkyHelperNetWorth.md) of this guide if you need JavaScript + +## Requirements + +- Hypixel-API-Reborn v12.0.0-14 or **higher** +- SkyHelper Networth v2.5.1 or **higher** + +## Assumptions + +This guide assumes the following + +- You are using Hypixel-API-Reborn v12.0.0-14 +- You are using SkyHelper Networth v2.5.1 +- You have setup a Client instance. If not please see [the Setting Up Client guide](../SettingUpClient/Guide.md) + +## Fetching A Player's Profiles + +Once you have initialized your client instance you can then fetch a user's SkyBlock Profiles and get there currently +selected profile. + +```JavaScript +// File ProfileExample.js +import HypixelAPIReborn from './HypixelAPIReborn.js'; + +const profiles = await HypixelAPIReborn.getSkyBlockProfiles('14727faefbdc4aff848cd2713eb9939e'); + +// Check that the profiles data is not Raw API Data. +if (profiles.isRaw()) throw new Error('Player data is Raw Data.'); + +const selectedProfile = profiles.selectedProfile; +// Check that the player has a selectedProfile. +if (selectedProfile === undefined) throw new Error("Player doesn't have a skyblock profile selected."); + +console.log(selectedProfile); +``` + +## Fetching A Player's Museum + +Once you have found the user's selected profile you will be required to get that player's museum data + +```JavaScript +// File MuseumExample.js +import HypixelAPIReborn from './HypixelAPIReborn.js'; + +const museum = await HypixelAPIReborn.getSkyBlockMuseum(selectedProfile.profileId, { raw: true }); + +// Check that the requested data is raw. +if (!museum.isRaw()) throw new Error('Museum data is not Raw Data.'); + +// Check that the player has API on. +const museumProfile = museum.data.members[selectedProfile.me.uuid]; +if (museumProfile === undefined) throw new Error('Player has museum API off.'); + +console.log(museumProfile); +``` + +## Creating a NetworthCalculator + +Once you have found the user's selected profile and there museum data we need to parse the SkyblockProfile into useable +data for the Networth Calculator + +```JavaScript +// File CalculatorExample.js +import { PrepareSkyBlockProfileForSkyHelperNetworth } from 'hypixel-api-reborn'; +import { ProfileNetworthCalculator } from 'skyhelper-networth'; + +// Reparse the profile data so that SkyHelper can read it and use it +const profileData = PrepareSkyBlockProfileForSkyHelperNetworth(selectedProfile); + +// Create the Networth calculator +const networthCalculator = new ProfileNetworthCalculator(profileData, museumProfile, selectedProfile.banking.balance); +``` + +## Calculating a Player's Networth + +Once we have the Networth Calculator we can calculate the player's networth + +```JavaScript +// File NetworthExample.js +import { PrepareSkyBlockProfileForSkyHelperNetworth } from 'hypixel-api-reborn'; +import { ProfileNetworthCalculator } from 'skyhelper-networth'; + +// Fetch the Networth +const networthData = await networthCalculator.getNetworth({ onlyNetworth: true }); +console.log(networthData); +``` + +## Code + +The resulting code can be found at +[Code/src/](https://github.com/Hypixel-API-Reborn/hypixel-api-reborn/blob/master/docs/JavaScript/SkyHelperNetworth/Code/src/) diff --git a/docs/TypeScript/SettingUpClient/Code/.gitignore b/docs/TypeScript/SettingUpClient/Code/.gitignore new file mode 100644 index 000000000..b94707787 --- /dev/null +++ b/docs/TypeScript/SettingUpClient/Code/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +dist/ diff --git a/docs/TypeScript/SettingUpClient/Code/package.json b/docs/TypeScript/SettingUpClient/Code/package.json new file mode 100644 index 000000000..ea7f9a553 --- /dev/null +++ b/docs/TypeScript/SettingUpClient/Code/package.json @@ -0,0 +1,14 @@ +{ + "name": "@hypixel-api-reborn-docs/typescript-setting-up-client", + "type": "module", + "scripts": { + "build": "pnpm exec tsc --build" + }, + "dependencies": { + "hypixel-api-reborn": "catalog:" + }, + "devDependencies": { + "tsx": "catalog:", + "typescript": "catalog:" + } +} diff --git a/docs/TypeScript/SettingUpClient/Code/src/HypixelAPIReborn.ts b/docs/TypeScript/SettingUpClient/Code/src/HypixelAPIReborn.ts new file mode 100644 index 000000000..b62a133b6 --- /dev/null +++ b/docs/TypeScript/SettingUpClient/Code/src/HypixelAPIReborn.ts @@ -0,0 +1,5 @@ +import { Client } from 'hypixel-api-reborn'; + +const HypixelAPIReborn = new Client('YOUR API_KEY'); + +export default HypixelAPIReborn; diff --git a/docs/TypeScript/SettingUpClient/Code/src/PlayerExample.ts b/docs/TypeScript/SettingUpClient/Code/src/PlayerExample.ts new file mode 100644 index 000000000..6fe7e1356 --- /dev/null +++ b/docs/TypeScript/SettingUpClient/Code/src/PlayerExample.ts @@ -0,0 +1,13 @@ +import HypixelAPIReborn from './HypixelAPIReborn'; + +async function Run() { + const player = await HypixelAPIReborn.getPlayer('kathund'); + + // Check that the player data is not Raw API Data.. + if (player.isRaw()) throw new Error('Player data is Raw Data.'); + + console.log(player); +} + +// Required because you can't just run async stuff. +Run(); diff --git a/docs/TypeScript/SettingUpClient/Code/tsconfig.json b/docs/TypeScript/SettingUpClient/Code/tsconfig.json new file mode 100644 index 000000000..517fe6f64 --- /dev/null +++ b/docs/TypeScript/SettingUpClient/Code/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "forceConsistentCasingInFileNames": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "esModuleInterop": true, + "skipLibCheck": true, + "outDir": "./dist", + "module": "ES2022", + "target": "ES2022", + "strict": true + } +} diff --git a/docs/TypeScript/SettingUpClient/Guide.md b/docs/TypeScript/SettingUpClient/Guide.md new file mode 100644 index 000000000..a847db910 --- /dev/null +++ b/docs/TypeScript/SettingUpClient/Guide.md @@ -0,0 +1,80 @@ +# Setting up Hypixel-API-Reborn's Client (JavaScript) + +This guide will explain how to setup a reuseable Client instance from Hypixel-API-Reborn. + +This assumes that you will be using TypeScript. Please checkout +[the JavaScript version](../JavaScript/SettingUpClient.md) of this guide if you need JavaScript + +## Requirements + +- Hypixel-API-Reborn v12.0.0-14 or **higher** +- TypeScript v5.9.2 or **higher** + +## Assumptions + +This guide assumes the following + +- You are using Hypixel-API-Reborn v12.0.0-14 +- You are using TypeScript v5.9.2 + +## Initializing a Client Instance + +By importing the Client constructor from Hypixel-API-Reborn you can start a new instance of it by calling new on the +class and passing in your API Key + +```TypeScript +// File HypixelAPIReborn.ts +import { Client } from 'hypixel-api-reborn'; + +const HypixelAPIReborn = new Client("YOUR API_KEY"); +``` + +## Sharing your Client Instance + +We recommend not creating multiple instances of Client because of how we manage ratelimiting and having it cause desync +issues. Instead we recommend making one instance of Client then exporting it and importing it an any files that need the +Client instance. + +```TypeScript +// File HypixelAPIReborn.ts + +import { Client } from 'hypixel-api-reborn'; + +const HypixelAPIReborn = new Client("YOUR API_KEY"); + +export default HypixelAPIReborn; +``` + +Once it's exported you can then reimport it into a different file and make requests from it + +```TypeScript +// File PlayerExample.ts +import HypixelAPIReborn from './HypixelAPIReborn'; +``` + +## Fetching a Player + +Once you have initialized your client instance you can then call a function on it. In this example we are going to call +[getPlayer](https://hypixel-api-reborn.github.io/hypixel-api-reborn/classes/Client.Client.html#getplayer) but there are +many more endpoints you can fetch. A +[full list can be found on the docs under the Methods section](https://hypixel-api-reborn.github.io/hypixel-api-reborn/classes/Client.Client.html) + +```TypeScript +// File PlayerExample.ts +import HypixelAPIReborn from './HypixelAPIReborn'; + +const player = await hypixelAPI.getPlayer("kathund"); + +// Check that the player data is not Raw API Data. +if (player.isRaw()) throw new Error("Player data is Raw Data"); + +console.log(player); +``` + +When fetching endpoints we use isRaw to check if the data is a raw request data or not. Consider checking out the +[guide on Understanding isRaw](../UnderstandingIsRaw/Guide.md) for more info + +## Code + +The resulting code can be found at +[Code/src/](https://github.com/Hypixel-API-Reborn/hypixel-api-reborn/blob/master/docs/TypeScript/SettingUpClient/Code/src/) diff --git a/docs/TypeScript/SkyHelperNetworth/Code/.gitignore b/docs/TypeScript/SkyHelperNetworth/Code/.gitignore new file mode 100644 index 000000000..b94707787 --- /dev/null +++ b/docs/TypeScript/SkyHelperNetworth/Code/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +dist/ diff --git a/docs/TypeScript/SkyHelperNetworth/Code/package.json b/docs/TypeScript/SkyHelperNetworth/Code/package.json new file mode 100644 index 000000000..f18521e76 --- /dev/null +++ b/docs/TypeScript/SkyHelperNetworth/Code/package.json @@ -0,0 +1,14 @@ +{ + "name": "@hypixel-api-reborn-docs/typescript-sky-helper-networth", + "type": "module", + "scripts": { + "build": "pnpm exec tsc --build" + }, + "dependencies": { + "hypixel-api-reborn": "catalog:" + }, + "devDependencies": { + "tsx": "catalog:", + "typescript": "catalog:" + } +} diff --git a/docs/TypeScript/SkyHelperNetworth/Code/src/CalculatorExample.ts b/docs/TypeScript/SkyHelperNetworth/Code/src/CalculatorExample.ts new file mode 100644 index 000000000..cd4d772ed --- /dev/null +++ b/docs/TypeScript/SkyHelperNetworth/Code/src/CalculatorExample.ts @@ -0,0 +1,34 @@ +import HypixelAPIReborn from './HypixelAPIReborn'; +import { PrepareSkyBlockProfileForSkyHelperNetworth } from 'hypixel-api-reborn'; +import { ProfileNetworthCalculator } from 'skyhelper-networth'; + +async function Run() { + const profiles = await HypixelAPIReborn.getSkyBlockProfiles('14727faefbdc4aff848cd2713eb9939e'); + + // Check that the profiles data is not Raw API Data. + if (profiles.isRaw()) throw new Error('Player data is Raw Data.'); + + const selectedProfile = profiles.selectedProfile; + // Check that the player has a selectedProfile. + if (selectedProfile === undefined) throw new Error("Player doesn't have a skyblock profile selected."); + + // Fetch the player's museum data + const museum = await HypixelAPIReborn.getSkyBlockMuseum(selectedProfile.profileId, { raw: true }); + + // Check that the requested data is raw. + if (!museum.isRaw()) throw new Error('Museum data is not Raw Data.'); + + // Check that the player has API on. + const museumProfile = museum.data.members[selectedProfile.me.uuid]; + if (museumProfile === undefined) throw new Error('Player has museum API off.'); + + // Reparse the profile data so that SkyHelper can read it and use it + const profileData = PrepareSkyBlockProfileForSkyHelperNetworth(selectedProfile); + + // Create the Networth calculator + const networthCalculator = new ProfileNetworthCalculator(profileData, museumProfile, selectedProfile.banking.balance); + console.log(networthCalculator); +} + +// Required because you can't just run async stuff. +Run(); diff --git a/docs/TypeScript/SkyHelperNetworth/Code/src/HypixelAPIReborn.ts b/docs/TypeScript/SkyHelperNetworth/Code/src/HypixelAPIReborn.ts new file mode 100644 index 000000000..b62a133b6 --- /dev/null +++ b/docs/TypeScript/SkyHelperNetworth/Code/src/HypixelAPIReborn.ts @@ -0,0 +1,5 @@ +import { Client } from 'hypixel-api-reborn'; + +const HypixelAPIReborn = new Client('YOUR API_KEY'); + +export default HypixelAPIReborn; diff --git a/docs/TypeScript/SkyHelperNetworth/Code/src/MuseumExample.ts b/docs/TypeScript/SkyHelperNetworth/Code/src/MuseumExample.ts new file mode 100644 index 000000000..535742392 --- /dev/null +++ b/docs/TypeScript/SkyHelperNetworth/Code/src/MuseumExample.ts @@ -0,0 +1,27 @@ +import HypixelAPIReborn from './HypixelAPIReborn'; + +async function Run() { + const profiles = await HypixelAPIReborn.getSkyBlockProfiles('14727faefbdc4aff848cd2713eb9939e'); + + // Check that the profiles data is not Raw API Data. + if (profiles.isRaw()) throw new Error('Player data is Raw Data.'); + + const selectedProfile = profiles.selectedProfile; + // Check that the player has a selectedProfile. + if (selectedProfile === undefined) throw new Error("Player doesn't have a skyblock profile selected."); + + // Fetch the player's museum data + const museum = await HypixelAPIReborn.getSkyBlockMuseum(selectedProfile.profileId, { raw: true }); + + // Check that the requested data is raw. + if (!museum.isRaw()) throw new Error('Museum data is not Raw Data.'); + + // Check that the player has API on. + const museumProfile = museum.data.members[selectedProfile.me.uuid]; + if (museumProfile === undefined) throw new Error('Player has museum API off.'); + + console.log(museumProfile); +} + +// Required because you can't just run async stuff. +Run(); diff --git a/docs/TypeScript/SkyHelperNetworth/Code/src/NetworthExample.ts b/docs/TypeScript/SkyHelperNetworth/Code/src/NetworthExample.ts new file mode 100644 index 000000000..15eaf6a60 --- /dev/null +++ b/docs/TypeScript/SkyHelperNetworth/Code/src/NetworthExample.ts @@ -0,0 +1,37 @@ +import HypixelAPIReborn from './HypixelAPIReborn'; +import { PrepareSkyBlockProfileForSkyHelperNetworth } from 'hypixel-api-reborn'; +import { ProfileNetworthCalculator } from 'skyhelper-networth'; + +async function Run() { + const profiles = await HypixelAPIReborn.getSkyBlockProfiles('14727faefbdc4aff848cd2713eb9939e'); + + // Check that the profiles data is not Raw API Data. + if (profiles.isRaw()) throw new Error('Player data is Raw Data.'); + + const selectedProfile = profiles.selectedProfile; + // Check that the player has a selectedProfile. + if (selectedProfile === undefined) throw new Error("Player doesn't have a skyblock profile selected."); + + // Fetch the player's museum data + const museum = await HypixelAPIReborn.getSkyBlockMuseum(selectedProfile.profileId, { raw: true }); + + // Check that the requested data is raw. + if (!museum.isRaw()) throw new Error('Museum data is not Raw Data.'); + + // Check that the player has API on. + const museumProfile = museum.data.members[selectedProfile.me.uuid]; + if (museumProfile === undefined) throw new Error('Player has museum API off.'); + + // Reparse the profile data so that SkyHelper can read it and use it + const profileData = PrepareSkyBlockProfileForSkyHelperNetworth(selectedProfile); + + // Create the Networth calculator + const networthCalculator = new ProfileNetworthCalculator(profileData, museumProfile, selectedProfile.banking.balance); + + // Fetch the Networth + const networthData = await networthCalculator.getNetworth({ onlyNetworth: true }); + console.log(networthData); +} + +// Required because you can't just run async stuff. +Run(); diff --git a/docs/TypeScript/SkyHelperNetworth/Code/src/ProfileExample.ts b/docs/TypeScript/SkyHelperNetworth/Code/src/ProfileExample.ts new file mode 100644 index 000000000..b2227c448 --- /dev/null +++ b/docs/TypeScript/SkyHelperNetworth/Code/src/ProfileExample.ts @@ -0,0 +1,15 @@ +import HypixelAPIReborn from './HypixelAPIReborn'; + +const profiles = await HypixelAPIReborn.getSkyBlockProfiles('14727faefbdc4aff848cd2713eb9939e'); + +// Check that the profiles data is not Raw API Data. +if (profiles.isRaw()) throw new Error('Player data is Raw Data.'); + +const selectedProfile = profiles.selectedProfile; +// Check that the player has a selectedProfile. +if (selectedProfile === undefined) throw new Error("Player doesn't have a skyblock profile selected."); + +console.log(selectedProfile); + +// Required because you can't just run async stuff. +Run(); diff --git a/docs/TypeScript/SkyHelperNetworth/Code/tsconfig.json b/docs/TypeScript/SkyHelperNetworth/Code/tsconfig.json new file mode 100644 index 000000000..517fe6f64 --- /dev/null +++ b/docs/TypeScript/SkyHelperNetworth/Code/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "forceConsistentCasingInFileNames": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "esModuleInterop": true, + "skipLibCheck": true, + "outDir": "./dist", + "module": "ES2022", + "target": "ES2022", + "strict": true + } +} diff --git a/docs/TypeScript/SkyHelperNetworth/Guide.md b/docs/TypeScript/SkyHelperNetworth/Guide.md new file mode 100644 index 000000000..881197e65 --- /dev/null +++ b/docs/TypeScript/SkyHelperNetworth/Guide.md @@ -0,0 +1,97 @@ +# Fetching SkyHelper Networth using Hypixel-API-Reborn (TypeScript) + +This will explain how to convert a Hypixel-API-Reborn API request into useable data that can be parsed into SkyHelper +Networth. This assumes that you will be using TypeScript. Please checkout +[the JavaScript version](../JavaScript/SkyHelperNetWorth.md) of this guide if you need JavaScript + +## Requirements + +- Hypixel-API-Reborn v12.0.0-14 or **higher** +- SkyHelper Networth v2.5.1 or **higher** +- TypeScript v5.9.2 or **higher** + +## Assumptions + +This guide assumes the following + +- You are using Hypixel-API-Reborn v12.0.0-14 +- You are using SkyHelper Networth v2.5.1 +- You are using TypeScript v5.9.2 +- You have setup a Client instance. If not please see [the Setting Up Client guide](../SettingUpClient/Guide.md) + +## Fetching A Player's Profiles + +Once you have initialized your client instance you can then fetch a user's SkyBlock Profiles and get there currently +selected profile. + +```TypeScript +// File ProfileExample.ts +import HypixelAPIReborn from './HypixelAPIReborn'; + +const profiles = await HypixelAPIReborn.getSkyBlockProfiles('14727faefbdc4aff848cd2713eb9939e'); + +// Check that the profiles data is not Raw API Data. +if (profiles.isRaw()) throw new Error('Player data is Raw Data.'); + +const selectedProfile = profiles.selectedProfile; +// Check that the player has a selectedProfile. +if (selectedProfile === undefined) throw new Error("Player doesn't have a skyblock profile selected."); + +console.log(selectedProfile); +``` + +## Fetching A Player's Museum + +Once you have found the user's selected profile you will be required to get that player's museum data + +```TypeScript +// File MuseumExample.ts +import HypixelAPIReborn from './HypixelAPIReborn'; + +const museum = await HypixelAPIReborn.getSkyBlockMuseum(selectedProfile.profileId, { raw: true }); + +// Check that the requested data is raw. +if (!museum.isRaw()) throw new Error('Museum data is not Raw Data.'); + +// Check that the player has API on. +const museumProfile = museum.data.members[selectedProfile.me.uuid]; +if (museumProfile === undefined) throw new Error('Player has museum API off.'); + +console.log(museumProfile); +``` + +## Creating a NetworthCalculator + +Once you have found the user's selected profile and there museum data we need to parse the SkyblockProfile into useable +data for the Networth Calculator + +```TypeScript +// File CalculatorExample.ts +import { PrepareSkyBlockProfileForSkyHelperNetworth } from 'hypixel-api-reborn'; +import { ProfileNetworthCalculator } from 'skyhelper-networth'; + +// Reparse the profile data so that SkyHelper can read it and use it +const profileData = PrepareSkyBlockProfileForSkyHelperNetworth(selectedProfile); + +// Create the Networth calculator +const networthCalculator = new ProfileNetworthCalculator(profileData, museumProfile, selectedProfile.banking.balance); +``` + +## Calculating a Player's Networth + +Once we have the Networth Calculator we can calculate the player's networth + +```TypeScript +// File NetworthExample.ts +import { PrepareSkyBlockProfileForSkyHelperNetworth } from 'hypixel-api-reborn'; +import { ProfileNetworthCalculator } from 'skyhelper-networth'; + +// Fetch the Networth +const networthData = await networthCalculator.getNetworth({ onlyNetworth: true }); +console.log(networthData); +``` + +## Code + +The resulting code can be found at +[Code/src/](https://github.com/Hypixel-API-Reborn/hypixel-api-reborn/blob/master/docs/TypeScript/SkyHelperNetworth/Code/src/) diff --git a/docs/TypeScript/UnderstandingIsRaw/Guide.md b/docs/TypeScript/UnderstandingIsRaw/Guide.md new file mode 100644 index 000000000..9fb6c45c7 --- /dev/null +++ b/docs/TypeScript/UnderstandingIsRaw/Guide.md @@ -0,0 +1,29 @@ +# Understanding Is Raw + +This guide will explain how isRaw works and why it's needed in TypeScript. + +This assumes that you will be using TypeScript. There will not be a JavaScript version of this guide. + +## Requirements + +- Hypixel-API-Reborn v12.0.0-14 or **higher** +- TypeScript v5.9.2 or **higher** + +## Assumptions + +This guide assumes the following + +- You are using Hypixel-API-Reborn v12.0.0-14 +- You are using TypeScript v5.9.2 + +## Why + +When fetching an endpoint it returns the following + +```TypeScript +client.getPlayer(): Promise +``` + +In this case when fetching getPlayer it returns the RequestData Or the Player data. Using `isRaw()` as a type guard we +can confirm that it's the Player data because we did not include the raw option in our request. This isRaw will be on +every endpoint because every endpoint supports fetching raw data thus returning RequestData diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 000000000..9b9b7a21a --- /dev/null +++ b/docs/package.json @@ -0,0 +1,29 @@ +{ + "name": "@hypixel-api-reborn-docs/root", + "scripts": { + "generate-packages": "pnpm exec tsx ./src/GeneratePackages.ts" + }, + "packageManager": "pnpm@9.9.0", + "type": "module", + "workspaces": { + "packages": [ + "./TypeScript/SettingUpClient/Code/*", + "./TypeScript/SkyHelperNetworth/Code/*", + "./JavaScript/SettingUpClient/Code/*", + "./JavaScript/SkyHelperNetworth/Code/*" + ] + }, + "engines": { + "node": ">=20.16.0", + "pnpm": ">=9.9.0", + "npm": "forbidden, use pnpm instead", + "yarn": "forbidden, use pnpm instead", + "bun": "forbidden, use pnpm instead" + }, + "devDependencies": { + "tsx": "catalog:", + "typescript": "catalog:", + "prettier": "catalog:", + "yaml": "catalog:" + } +} diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml new file mode 100644 index 000000000..b9455f9dd --- /dev/null +++ b/docs/pnpm-lock.yaml @@ -0,0 +1,602 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +catalogs: + default: + hypixel-api-reborn: + specifier: 12.0.0-13 + version: 12.0.0-13 + prettier: + specifier: ^3.6.2 + version: 3.6.2 + tsx: + specifier: ^4.20.6 + version: 4.20.6 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + yaml: + specifier: ^2.8.1 + version: 2.8.1 + +importers: + + .: + devDependencies: + prettier: + specifier: 'catalog:' + version: 3.6.2 + tsx: + specifier: 'catalog:' + version: 4.20.6 + typescript: + specifier: 'catalog:' + version: 5.9.3 + yaml: + specifier: 'catalog:' + version: 2.8.1 + + JavaScript/SettingUpClient/Code: + dependencies: + hypixel-api-reborn: + specifier: 'catalog:' + version: 12.0.0-13 + + JavaScript/SkyHelperNetworth/Code: + dependencies: + hypixel-api-reborn: + specifier: 'catalog:' + version: 12.0.0-13 + + TypeScript/SettingUpClient/Code: + dependencies: + hypixel-api-reborn: + specifier: 'catalog:' + version: 12.0.0-13 + devDependencies: + tsx: + specifier: 'catalog:' + version: 4.20.6 + typescript: + specifier: 'catalog:' + version: 5.9.3 + + TypeScript/SkyHelperNetworth/Code: + dependencies: + hypixel-api-reborn: + specifier: 'catalog:' + version: 12.0.0-13 + devDependencies: + tsx: + specifier: 'catalog:' + version: 4.20.6 + typescript: + specifier: 'catalog:' + version: 5.9.3 + +packages: + + '@esbuild/aix-ppc64@0.25.11': + resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.11': + resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.11': + resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.11': + resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.11': + resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.11': + resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.11': + resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.11': + resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.11': + resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.11': + resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.11': + resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.11': + resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.11': + resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.11': + resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.11': + resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.11': + resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.11': + resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.11': + resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.11': + resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.11': + resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.11': + resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.11': + resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.11': + resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.11': + resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.11': + resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.11': + resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + esbuild@0.25.11: + resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} + engines: {node: '>=18'} + hasBin: true + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + get-tsconfig@4.12.0: + resolution: {integrity: sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==} + + hypixel-api-reborn@12.0.0-13: + resolution: {integrity: sha512-sIL4fCMVfPGepMVGYAaEbYT7DKegk8QeVe+dFhBh0+haSDQZvMqCeR6JMADVJjaTpNGewL3STpYg685MT1BElQ==} + engines: {node: '>=20.16.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + lodash.reduce@4.6.0: + resolution: {integrity: sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==} + + minecraft-data@3.99.1: + resolution: {integrity: sha512-mI9SNwlrqY2uTTLOT332Hf/QlaLa+AH3V36qu3Y2i9Z2/PjsZlja2ToTDHjazWqDMBtfch+rDTwPB2mHloArHA==} + + node-cache@5.1.2: + resolution: {integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==} + engines: {node: '>= 8.0.0'} + + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} + hasBin: true + + prismarine-nbt@2.7.0: + resolution: {integrity: sha512-Du9OLQAcCj3y29YtewOJbbV4ARaSUEJiTguw0PPQbPBy83f+eCyDRkyBpnXTi/KPyEpgYCzsjGzElevLpFoYGQ==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + protodef-validator@1.4.0: + resolution: {integrity: sha512-2y2coBolqCEuk5Kc3QwO7ThR+/7TZiOit4FrpAgl+vFMvq8w76nDhh09z08e2NQOdrgPLsN2yzXsvRvtADgUZQ==} + hasBin: true + + protodef@1.19.0: + resolution: {integrity: sha512-94f3GR7pk4Qi5YVLaLvWBfTGUIzzO8hyo7vFVICQuu5f5nwKtgGDaeC1uXIu49s5to/49QQhEYeL0aigu1jEGA==} + engines: {node: '>=14'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + rss-parser@3.13.0: + resolution: {integrity: sha512-7jWUBV5yGN3rqMMj7CZufl/291QAhvrrGpDNE4k/02ZchL0npisiYYqULF71jCEKoIiHvK/Q2e6IkDwPziT7+w==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + tsx@4.20.6: + resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==} + engines: {node: '>=18.0.0'} + hasBin: true + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + xml2js@0.5.0: + resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} + engines: {node: '>=4.0.0'} + + xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} + hasBin: true + +snapshots: + + '@esbuild/aix-ppc64@0.25.11': + optional: true + + '@esbuild/android-arm64@0.25.11': + optional: true + + '@esbuild/android-arm@0.25.11': + optional: true + + '@esbuild/android-x64@0.25.11': + optional: true + + '@esbuild/darwin-arm64@0.25.11': + optional: true + + '@esbuild/darwin-x64@0.25.11': + optional: true + + '@esbuild/freebsd-arm64@0.25.11': + optional: true + + '@esbuild/freebsd-x64@0.25.11': + optional: true + + '@esbuild/linux-arm64@0.25.11': + optional: true + + '@esbuild/linux-arm@0.25.11': + optional: true + + '@esbuild/linux-ia32@0.25.11': + optional: true + + '@esbuild/linux-loong64@0.25.11': + optional: true + + '@esbuild/linux-mips64el@0.25.11': + optional: true + + '@esbuild/linux-ppc64@0.25.11': + optional: true + + '@esbuild/linux-riscv64@0.25.11': + optional: true + + '@esbuild/linux-s390x@0.25.11': + optional: true + + '@esbuild/linux-x64@0.25.11': + optional: true + + '@esbuild/netbsd-arm64@0.25.11': + optional: true + + '@esbuild/netbsd-x64@0.25.11': + optional: true + + '@esbuild/openbsd-arm64@0.25.11': + optional: true + + '@esbuild/openbsd-x64@0.25.11': + optional: true + + '@esbuild/openharmony-arm64@0.25.11': + optional: true + + '@esbuild/sunos-x64@0.25.11': + optional: true + + '@esbuild/win32-arm64@0.25.11': + optional: true + + '@esbuild/win32-ia32@0.25.11': + optional: true + + '@esbuild/win32-x64@0.25.11': + optional: true + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + base64-js@1.5.1: {} + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + clone@2.1.2: {} + + entities@2.2.0: {} + + esbuild@0.25.11: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.11 + '@esbuild/android-arm': 0.25.11 + '@esbuild/android-arm64': 0.25.11 + '@esbuild/android-x64': 0.25.11 + '@esbuild/darwin-arm64': 0.25.11 + '@esbuild/darwin-x64': 0.25.11 + '@esbuild/freebsd-arm64': 0.25.11 + '@esbuild/freebsd-x64': 0.25.11 + '@esbuild/linux-arm': 0.25.11 + '@esbuild/linux-arm64': 0.25.11 + '@esbuild/linux-ia32': 0.25.11 + '@esbuild/linux-loong64': 0.25.11 + '@esbuild/linux-mips64el': 0.25.11 + '@esbuild/linux-ppc64': 0.25.11 + '@esbuild/linux-riscv64': 0.25.11 + '@esbuild/linux-s390x': 0.25.11 + '@esbuild/linux-x64': 0.25.11 + '@esbuild/netbsd-arm64': 0.25.11 + '@esbuild/netbsd-x64': 0.25.11 + '@esbuild/openbsd-arm64': 0.25.11 + '@esbuild/openbsd-x64': 0.25.11 + '@esbuild/openharmony-arm64': 0.25.11 + '@esbuild/sunos-x64': 0.25.11 + '@esbuild/win32-arm64': 0.25.11 + '@esbuild/win32-ia32': 0.25.11 + '@esbuild/win32-x64': 0.25.11 + + event-target-shim@5.0.1: {} + + events@3.3.0: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fsevents@2.3.3: + optional: true + + get-tsconfig@4.12.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + hypixel-api-reborn@12.0.0-13: + dependencies: + minecraft-data: 3.99.1 + node-cache: 5.1.2 + prismarine-nbt: 2.7.0 + rss-parser: 3.13.0 + + ieee754@1.2.1: {} + + json-schema-traverse@0.4.1: {} + + lodash.reduce@4.6.0: {} + + minecraft-data@3.99.1: {} + + node-cache@5.1.2: + dependencies: + clone: 2.1.2 + + prettier@3.6.2: {} + + prismarine-nbt@2.7.0: + dependencies: + protodef: 1.19.0 + + process@0.11.10: {} + + protodef-validator@1.4.0: + dependencies: + ajv: 6.12.6 + + protodef@1.19.0: + dependencies: + lodash.reduce: 4.6.0 + protodef-validator: 1.4.0 + readable-stream: 4.7.0 + + punycode@2.3.1: {} + + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + resolve-pkg-maps@1.0.0: {} + + rss-parser@3.13.0: + dependencies: + entities: 2.2.0 + xml2js: 0.5.0 + + safe-buffer@5.2.1: {} + + sax@1.4.1: {} + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + tsx@4.20.6: + dependencies: + esbuild: 0.25.11 + get-tsconfig: 4.12.0 + optionalDependencies: + fsevents: 2.3.3 + + typescript@5.9.3: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + xml2js@0.5.0: + dependencies: + sax: 1.4.1 + xmlbuilder: 11.0.1 + + xmlbuilder@11.0.1: {} + + yaml@2.8.1: {} diff --git a/docs/pnpm-workspace.yaml b/docs/pnpm-workspace.yaml new file mode 100644 index 000000000..e74a35985 --- /dev/null +++ b/docs/pnpm-workspace.yaml @@ -0,0 +1,12 @@ +packages: + - ./TypeScript/SettingUpClient/Code + - ./TypeScript/SkyHelperNetworth/Code + - ./JavaScript/SettingUpClient/Code + - ./JavaScript/SkyHelperNetworth/Code +catalog: + tsx: ^4.20.6 + typescript: ^5.9.3 + prettier: ^3.6.2 + hypixel-api-reborn: 12.0.0-13 + yaml: ^2.8.1 + skyhelper-networth: ^2.5.1 diff --git a/docs/src/GeneratePackages.ts b/docs/src/GeneratePackages.ts new file mode 100644 index 000000000..f01ad636d --- /dev/null +++ b/docs/src/GeneratePackages.ts @@ -0,0 +1,165 @@ +import YAML from 'yaml'; +import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from 'fs'; +import { format } from 'prettier'; + +async function TypeScript() { + const dir = './TypeScript'; + const ignoredFolders = ['node_modules', 'src']; + const packages = []; + const files = readdirSync(dir); + for (const file of files) { + const fullPath = `${dir}/${file}`.replaceAll('//', '/'); + if (statSync(fullPath).isDirectory()) { + if (ignoredFolders.includes(file) === false) { + const deeperFiles = readdirSync(`${dir}/${file}`); + if (deeperFiles.includes('Code') && statSync(`${dir}/${file}/Code`).isDirectory()) packages.push(file); + } + } + } + + const packageJSONFile = JSON.parse(readFileSync('package.json').toString('utf-8')); + const currentPackages = packageJSONFile.workspaces.packages.filter((pkg: string) => pkg.startsWith('./JavaScript/')); + packageJSONFile.workspaces.packages = [ + ...currentPackages, + ...packages.map((pkg) => `${dir}/${pkg}/Code/*`).filter((pkg) => !currentPackages.includes(pkg)) + ]; + + const workspaceConfig = YAML.parse(readFileSync('pnpm-workspace.yaml', 'utf-8')); + const currentPnpm = workspaceConfig.packages.filter((pkg: string) => pkg.startsWith('./JavaScript/')); + workspaceConfig.packages = [ + ...currentPnpm, + ...packages.map((pkg) => `${dir}/${pkg}/Code`).filter((pkg) => !currentPnpm.includes(pkg)) + ]; + writeFileSync('pnpm-workspace.yaml', YAML.stringify(workspaceConfig)); + + const prettierConfig = JSON.parse(readFileSync('../.prettierrc').toString('utf-8')); + const formatted = await format(JSON.stringify(packageJSONFile), { ...prettierConfig, filepath: 'package.json' }); + writeFileSync('package.json', formatted); + + const templatePackage = { + name: '@hypixel-api-reborn-docs', + type: 'module', + scripts: { build: 'pnpm exec tsc --build' }, + dependencies: { 'hypixel-api-reborn': 'catalog:' }, + devDependencies: { tsx: 'catalog:', typescript: 'catalog:' } + }; + + const typeScriptConfig = readFileSync('tsconfig.json').toString('utf-8'); + const gitIgnore = readFileSync('.gitignore').toString('utf-8'); + + for (const docPackage of packages) { + const packageJSON = { ...templatePackage }; + packageJSON.name = `${packageJSON.name}/typescript-${docPackage + .replace(/([a-z])([A-Z])/g, '$1-$2') + .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2') + .toLowerCase()}`; + const formattedPackageJSON = await format(JSON.stringify(packageJSON), { + ...prettierConfig, + filepath: 'package.json' + }); + + writeFileSync(`${dir}/${docPackage}/Code/package.json`, formattedPackageJSON); + writeFileSync(`${dir}/${docPackage}/Code/tsconfig.json`, typeScriptConfig); + writeFileSync(`${dir}/${docPackage}/Code/.gitignore`, gitIgnore); + + if (!existsSync(`${dir}/${docPackage}/Code/src`)) mkdirSync(`${docPackage}/Code/src`, { recursive: true }); + writeFileSync( + `${dir}/${docPackage}/Code/src/HypixelAPIReborn.ts`, + [ + "import { Client } from 'hypixel-api-reborn';", + '', + "const HypixelAPIReborn = new Client('YOUR API_KEY');", + '', + 'export default HypixelAPIReborn;', + '' + ].join('\n') + ); + } +} + +async function JavaScript() { + const dir = './JavaScript'; + const ignoredFolders = ['node_modules', 'src']; + const packages = []; + const files = readdirSync(dir); + for (const file of files) { + const fullPath = `${dir}/${file}`.replaceAll('//', '/'); + if (statSync(fullPath).isDirectory()) { + if (ignoredFolders.includes(file) === false) { + const deeperFiles = readdirSync(`${dir}/${file}`); + if (deeperFiles.includes('Code') && statSync(`${dir}/${file}/Code`).isDirectory()) packages.push(file); + } + } + } + + const packageJSONFile = JSON.parse(readFileSync('package.json').toString('utf-8')); + const currentPackages = packageJSONFile.workspaces.packages.filter((pkg: string) => pkg.startsWith('./TypeScript/')); + packageJSONFile.workspaces.packages = [ + ...currentPackages, + ...packages.map((pkg) => `${dir}/${pkg}/Code/*`).filter((pkg) => !currentPackages.includes(pkg)) + ]; + + const workspaceConfig = YAML.parse(readFileSync('pnpm-workspace.yaml', 'utf-8')); + const currentPnpm = workspaceConfig.packages.filter((pkg: string) => pkg.startsWith('./TypeScript/')); + workspaceConfig.packages = [ + ...currentPnpm, + ...packages.map((pkg) => `${dir}/${pkg}/Code`).filter((pkg) => !currentPnpm.includes(pkg)) + ]; + writeFileSync('pnpm-workspace.yaml', YAML.stringify(workspaceConfig)); + + const prettierConfig = JSON.parse(readFileSync('../.prettierrc').toString('utf-8')); + const formatted = await format(JSON.stringify(packageJSONFile), { ...prettierConfig, filepath: 'package.json' }); + writeFileSync('package.json', formatted); + + const templatePackage = { + name: '@hypixel-api-reborn-docs', + type: 'module', + dependencies: { 'hypixel-api-reborn': 'catalog:' } + }; + + const gitIgnore = readFileSync('.gitignore').toString('utf-8'); + + for (const docPackage of packages) { + const packageJSON = { ...templatePackage }; + packageJSON.name = `${packageJSON.name}/javascript-${docPackage + .replace(/([a-z])([A-Z])/g, '$1-$2') + .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2') + .toLowerCase()}`; + const formattedPackageJSON = await format(JSON.stringify(packageJSON), { + ...prettierConfig, + filepath: 'package.json' + }); + + writeFileSync(`${dir}/${docPackage}/Code/package.json`, formattedPackageJSON); + writeFileSync(`${dir}/${docPackage}/Code/.gitignore`, gitIgnore); + + if (!existsSync(`${dir}/${docPackage}/Code/src`)) mkdirSync(`${docPackage}/Code/src`, { recursive: true }); + writeFileSync( + `${dir}/${docPackage}/Code/src/HypixelAPIReborn.js`, + [ + "import { Client } from 'hypixel-api-reborn';", + '', + "const HypixelAPIReborn = new Client('YOUR API_KEY');", + '', + 'export default HypixelAPIReborn;', + '' + ].join('\n') + ); + } +} + +(async () => { + const packageJSONFile = JSON.parse(readFileSync('package.json').toString('utf-8')); + packageJSONFile.workspaces.packages = []; + + const workspaceConfig = YAML.parse(readFileSync('pnpm-workspace.yaml', 'utf-8')); + workspaceConfig.packages = []; + writeFileSync('pnpm-workspace.yaml', YAML.stringify(workspaceConfig)); + + const prettierConfig = JSON.parse(readFileSync('../.prettierrc').toString('utf-8')); + const formatted = await format(JSON.stringify(packageJSONFile), { ...prettierConfig, filepath: 'package.json' }); + writeFileSync('package.json', formatted); + + await TypeScript(); + await JavaScript(); +})(); diff --git a/docs/tsconfig.json b/docs/tsconfig.json new file mode 100644 index 000000000..517fe6f64 --- /dev/null +++ b/docs/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "forceConsistentCasingInFileNames": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "esModuleInterop": true, + "skipLibCheck": true, + "outDir": "./dist", + "module": "ES2022", + "target": "ES2022", + "strict": true + } +} diff --git a/src/API/getSkyBlockProfiles.test.ts b/src/API/getSkyBlockProfiles.test.ts index 9f8620c0f..fee858ca6 100644 --- a/src/API/getSkyBlockProfiles.test.ts +++ b/src/API/getSkyBlockProfiles.test.ts @@ -9,7 +9,7 @@ import SkyBlockProfileBanking from '../Structures/SkyBlock/Profile/Banking/SkyBl import SkyBlockProfileCommunityUpgrades from '../Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgrades.js'; import { expect, expectTypeOf, test } from 'vitest'; import type { SkyBlockProfileName, SkyBlockProfileType } from '../Types/SkyBlock.js'; -import type { WithRaw } from '../Types/API.js'; +import type { WithSelectedProfile } from '../Types/API.js'; /* eslint-enable @stylistic/max-len */ test('getSkyBlockProfiles (raw)', async () => { @@ -17,7 +17,9 @@ test('getSkyBlockProfiles (raw)', async () => { const data = await client.getSkyBlockProfiles('14727faefbdc4aff848cd2713eb9939e', { raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); - expectTypeOf(data).toEqualTypeOf> | RequestData>(); + expectTypeOf(data).toEqualTypeOf< + WithSelectedProfile> | RequestData + >(); expect(data.isRaw()).toBe(true); client.destroy(); }); @@ -42,7 +44,9 @@ test('getSkyBlockProfiles', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); const data = await client.getSkyBlockProfiles('14727faefbdc4aff848cd2713eb9939e'); expect(data).toBeDefined(); - expectTypeOf(data).toEqualTypeOf> | RequestData>(); + expectTypeOf(data).toEqualTypeOf< + WithSelectedProfile> | RequestData + >(); expect(data.isRaw()).toBe(false); if (data.isRaw()) return; data.forEach((profile) => { diff --git a/src/API/getSkyBlockProfiles.ts b/src/API/getSkyBlockProfiles.ts index 75de125ee..cc0bcc43e 100644 --- a/src/API/getSkyBlockProfiles.ts +++ b/src/API/getSkyBlockProfiles.ts @@ -5,13 +5,13 @@ import SkyBlockGarden from '../Structures/SkyBlock/Garden/SkyBlockGarden.js'; import SkyBlockProfile from '../Structures/SkyBlock/Profile/SkyBlockProfile.js'; import type SkyBlockMuseum from '../Structures/SkyBlock/Museum/SkyBlockMuseum.js'; import type { SkyBlockProfileName } from '../Types/SkyBlock.js'; -import type { SkyBlockRequestOptions, WithRaw } from '../Types/API.js'; +import type { SkyBlockRequestOptions, WithSelectedProfile } from '../Types/API.js'; class getSkyBlockProfiles extends Endpoint { override async execute( query: string, options?: SkyBlockRequestOptions - ): Promise> | RequestData> { + ): Promise> | RequestData> { if (!query) throw new Error(Errors.NO_NICKNAME_UUID); query = await this.client.requestHandler.toUUID(query); const res = await this.client.requestHandler.request(`/skyblock/profiles?uuid=${query}`, options); @@ -25,13 +25,23 @@ class getSkyBlockProfiles extends Endpoint { profiles.set(parsedProfile.profileName, parsedProfile); } + const selectedProfile = Array.from(profiles.values()).find( + (profile): profile is SkyBlockProfile & { me: NonNullable } => + profile.selected === true && this.hasMe(profile) + ); + return Object.assign(profiles, { isRaw(): this is RequestData { return false; - } + }, + selectedProfile }); } + private hasMe(profile: SkyBlockProfile): profile is SkyBlockProfile & { me: NonNullable } { + return profile.me !== null; + } + private async handleGettingSkyBlockGarden(profileId: string): Promise { try { const garden = await this.client.getSkyBlockGarden(profileId); diff --git a/src/Client.ts b/src/Client.ts index ab5f2133e..104823fb4 100644 --- a/src/Client.ts +++ b/src/Client.ts @@ -38,7 +38,8 @@ import type { SkyBlockAuctionResult, SkyBlockAuctionsResult, SkyBlockRequestOptions, - WithRaw + WithRaw, + WithSelectedProfile } from './Types/API.js'; import type { ClientOptions } from './Types/Client.js'; import type { RequestOptions } from './Types/Requests.js'; @@ -235,7 +236,7 @@ class Client { public getSkyBlockProfiles( query: string, options?: SkyBlockRequestOptions - ): Promise> | RequestData> { + ): Promise> | RequestData> { throw new Error(Errors.ENDPOINT_NOT_LOADED); } diff --git a/src/Types/API.ts b/src/Types/API.ts index c6cdd3ba9..9e400b376 100644 --- a/src/Types/API.ts +++ b/src/Types/API.ts @@ -4,6 +4,7 @@ import type RequestData from '../Private/RequestData.ts'; import type SkyBlockAuction from '../Structures/SkyBlock/Auctions/SkyBlockAuction.js'; import type SkyBlockAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockAuctionInfo.js'; import type SkyBlockBaseAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.js'; +import type SkyBlockProfile from '../Structures/SkyBlock/Profile/SkyBlockProfile.ts'; import type { RequestOptions } from './Requests.js'; export interface PlayerRequestOptions extends RequestOptions { @@ -33,6 +34,9 @@ export interface SkyBlockAuctionsResult { isRaw(): this is RequestData; } export type WithRaw = T & { isRaw(): this is RequestData }; +export type WithSelectedProfile = WithRaw & { + selectedProfile?: SkyBlockProfile & { me: NonNullable }; +}; export type GuildFetchOptions = 'id' | 'name' | 'player'; export type AuctionFetchOptions = 'PROFILE' | 'PLAYER' | 'AUCTION_ID'; diff --git a/src/Utils/SkyBlockUtils.ts b/src/Utils/SkyBlockUtils.ts index 111e409ad..71deb8bb0 100644 --- a/src/Utils/SkyBlockUtils.ts +++ b/src/Utils/SkyBlockUtils.ts @@ -191,7 +191,7 @@ export function getLevelByXp(xp: number, extra: Extra = { type: 'default' }): Sk return { xp, level, xpForNext, progress, maxed, maxLevel, currentXp }; } -export function PrepareSkyBlockProfileForSkyHelperNetWorth( +export function PrepareSkyBlockProfileForSkyHelperNetworth( profile: SkyBlockProfile & { me: NonNullable } ): SkyHelperNetWorthProfile { /* eslint-disable camelcase */ From 9d0018c8170ff10cea05a2696aae749cf18d377a Mon Sep 17 00:00:00 2001 From: Jacob Date: Sun, 19 Oct 2025 20:52:46 +0800 Subject: [PATCH 060/124] fix: docs files --- docs/JavaScript/Readme.md | 9 +++++++++ .../JavaScript/SettingUpClient/{Guide.md => Readme.md} | 0 .../SkyHelperNetworth/{Guide.md => Readme.md} | 2 +- docs/Readme.md | 10 ++++++++++ docs/TypeScript/Readme.md | 9 +++++++++ .../TypeScript/SettingUpClient/{Guide.md => Readme.md} | 0 .../SkyHelperNetworth/{Guide.md => Readme.md} | 0 .../UnderstandingIsRaw/{Guide.md => Readme.md} | 0 8 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 docs/JavaScript/Readme.md rename docs/JavaScript/SettingUpClient/{Guide.md => Readme.md} (100%) rename docs/JavaScript/SkyHelperNetworth/{Guide.md => Readme.md} (98%) create mode 100644 docs/Readme.md create mode 100644 docs/TypeScript/Readme.md rename docs/TypeScript/SettingUpClient/{Guide.md => Readme.md} (100%) rename docs/TypeScript/SkyHelperNetworth/{Guide.md => Readme.md} (100%) rename docs/TypeScript/UnderstandingIsRaw/{Guide.md => Readme.md} (100%) diff --git a/docs/JavaScript/Readme.md b/docs/JavaScript/Readme.md new file mode 100644 index 000000000..df9a3eff2 --- /dev/null +++ b/docs/JavaScript/Readme.md @@ -0,0 +1,9 @@ +# JavaScript Hypixel-API-Reborn Guides + +These guides assumes that you will be using JavaScript. Please checkout +[the TypeScript version](../TypeScript/SkyHelperNetWorth.md) of this guide if you need TypeScript + +## Guides + +- [Setting up Hypixel-API-Reborn's Client](SettingUpClient/Readme.md) +- [Fetching SkyHelper Networth using Hypixel-API-Reborn](SkyHelperNetworth/Readme.md) diff --git a/docs/JavaScript/SettingUpClient/Guide.md b/docs/JavaScript/SettingUpClient/Readme.md similarity index 100% rename from docs/JavaScript/SettingUpClient/Guide.md rename to docs/JavaScript/SettingUpClient/Readme.md diff --git a/docs/JavaScript/SkyHelperNetworth/Guide.md b/docs/JavaScript/SkyHelperNetworth/Readme.md similarity index 98% rename from docs/JavaScript/SkyHelperNetworth/Guide.md rename to docs/JavaScript/SkyHelperNetworth/Readme.md index ec5a57801..c288d7453 100644 --- a/docs/JavaScript/SkyHelperNetworth/Guide.md +++ b/docs/JavaScript/SkyHelperNetworth/Readme.md @@ -2,7 +2,7 @@ This will explain how to convert a Hypixel-API-Reborn API request into useable data that can be parsed into SkyHelper Networth. This assumes that you will be using JavaScript. Please checkout -[the TypeScript version](../TypeScript/SkyHelperNetWorth.md) of this guide if you need JavaScript +[the TypeScript version](../TypeScript/SkyHelperNetWorth.md) of this guide if you need TypeScript ## Requirements diff --git a/docs/Readme.md b/docs/Readme.md new file mode 100644 index 000000000..5c211cb65 --- /dev/null +++ b/docs/Readme.md @@ -0,0 +1,10 @@ +# Hypixel-API-Reborn Guides + +## Guides + +- [JavaScript](JavaScript/Readme.md) + - [Setting up Hypixel-API-Reborn's Client](JavaScript/SettingUpClient/Readme.md) + - [Fetching SkyHelper Networth using Hypixel-API-Reborn](JavaScript/SkyHelperNetworth/Readme.md) +- [TypeScript](TypeScript/Readme.md) + - [Setting up Hypixel-API-Reborn's Client](TypeScript/SettingUpClient/Readme.md) + - [Fetching SkyHelper Networth using Hypixel-API-Reborn](TypeScript/SkyHelperNetworth/Readme.md) diff --git a/docs/TypeScript/Readme.md b/docs/TypeScript/Readme.md new file mode 100644 index 000000000..4c5c8b278 --- /dev/null +++ b/docs/TypeScript/Readme.md @@ -0,0 +1,9 @@ +# TypeScript Hypixel-API-Reborn Guides + +These guides assumes that you will be using TypeScript. Please checkout +[the JavaScript version](../JavaScript/SkyHelperNetWorth.md) of this guide if you need JavaScript + +## Guides + +- [Setting up Hypixel-API-Reborn's Client](SettingUpClient/Readme.md) +- [Fetching SkyHelper Networth using Hypixel-API-Reborn](SkyHelperNetworth/Readme.md) diff --git a/docs/TypeScript/SettingUpClient/Guide.md b/docs/TypeScript/SettingUpClient/Readme.md similarity index 100% rename from docs/TypeScript/SettingUpClient/Guide.md rename to docs/TypeScript/SettingUpClient/Readme.md diff --git a/docs/TypeScript/SkyHelperNetworth/Guide.md b/docs/TypeScript/SkyHelperNetworth/Readme.md similarity index 100% rename from docs/TypeScript/SkyHelperNetworth/Guide.md rename to docs/TypeScript/SkyHelperNetworth/Readme.md diff --git a/docs/TypeScript/UnderstandingIsRaw/Guide.md b/docs/TypeScript/UnderstandingIsRaw/Readme.md similarity index 100% rename from docs/TypeScript/UnderstandingIsRaw/Guide.md rename to docs/TypeScript/UnderstandingIsRaw/Readme.md From fed0f39922f9c9124111ef6defe60e7684da7bd8 Mon Sep 17 00:00:00 2001 From: Jacob Date: Sun, 19 Oct 2025 20:53:48 +0800 Subject: [PATCH 061/124] feat: missing doc --- docs/Readme.md | 1 + docs/TypeScript/Readme.md | 1 + 2 files changed, 2 insertions(+) diff --git a/docs/Readme.md b/docs/Readme.md index 5c211cb65..94cf47182 100644 --- a/docs/Readme.md +++ b/docs/Readme.md @@ -8,3 +8,4 @@ - [TypeScript](TypeScript/Readme.md) - [Setting up Hypixel-API-Reborn's Client](TypeScript/SettingUpClient/Readme.md) - [Fetching SkyHelper Networth using Hypixel-API-Reborn](TypeScript/SkyHelperNetworth/Readme.md) + - [Understanding Is Raw](TypeScript/UnderstandingIsRaw/Readme.md) diff --git a/docs/TypeScript/Readme.md b/docs/TypeScript/Readme.md index 4c5c8b278..7d52cd5fd 100644 --- a/docs/TypeScript/Readme.md +++ b/docs/TypeScript/Readme.md @@ -7,3 +7,4 @@ These guides assumes that you will be using TypeScript. Please checkout - [Setting up Hypixel-API-Reborn's Client](SettingUpClient/Readme.md) - [Fetching SkyHelper Networth using Hypixel-API-Reborn](SkyHelperNetworth/Readme.md) +- [Understanding Is Raw](UnderstandingIsRaw/Readme.md) From da96c682ad76a253c879329c19ee85b3c740ddeb Mon Sep 17 00:00:00 2001 From: Jacob Date: Sun, 19 Oct 2025 21:00:17 +0800 Subject: [PATCH 062/124] Release 12.0.0-14 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8c35b0560..94035fe7b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hypixel-api-reborn", - "version": "12.0.0-13", + "version": "12.0.0-14", "description": "Feature-rich Hypixel API wrapper for Node.js", "main": "dist/index.js", "types": "dist/index.d.ts", From 607031b23caee4066b12cd979564590c6fe29362 Mon Sep 17 00:00:00 2001 From: Jacob Date: Sun, 19 Oct 2025 21:01:32 +0800 Subject: [PATCH 063/124] chore(docs): bump hypixel-api-reborn --- docs/pnpm-lock.yaml | 18 +++++++++--------- docs/pnpm-workspace.yaml | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index b9455f9dd..0f7a58259 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -7,8 +7,8 @@ settings: catalogs: default: hypixel-api-reborn: - specifier: 12.0.0-13 - version: 12.0.0-13 + specifier: 12.0.0-14 + version: 12.0.0-14 prettier: specifier: ^3.6.2 version: 3.6.2 @@ -43,19 +43,19 @@ importers: dependencies: hypixel-api-reborn: specifier: 'catalog:' - version: 12.0.0-13 + version: 12.0.0-14 JavaScript/SkyHelperNetworth/Code: dependencies: hypixel-api-reborn: specifier: 'catalog:' - version: 12.0.0-13 + version: 12.0.0-14 TypeScript/SettingUpClient/Code: dependencies: hypixel-api-reborn: specifier: 'catalog:' - version: 12.0.0-13 + version: 12.0.0-14 devDependencies: tsx: specifier: 'catalog:' @@ -68,7 +68,7 @@ importers: dependencies: hypixel-api-reborn: specifier: 'catalog:' - version: 12.0.0-13 + version: 12.0.0-14 devDependencies: tsx: specifier: 'catalog:' @@ -282,8 +282,8 @@ packages: get-tsconfig@4.12.0: resolution: {integrity: sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==} - hypixel-api-reborn@12.0.0-13: - resolution: {integrity: sha512-sIL4fCMVfPGepMVGYAaEbYT7DKegk8QeVe+dFhBh0+haSDQZvMqCeR6JMADVJjaTpNGewL3STpYg685MT1BElQ==} + hypixel-api-reborn@12.0.0-14: + resolution: {integrity: sha512-HnInZRj7P1TvCnPnIVYuhuiYsWzTSoSbj1dWHREbO5L6o9RuDeqUd5aPIF1lQ57tZ/gp8bLZrxzhd/B78NXOAA==} engines: {node: '>=20.16.0'} ieee754@1.2.1: @@ -517,7 +517,7 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - hypixel-api-reborn@12.0.0-13: + hypixel-api-reborn@12.0.0-14: dependencies: minecraft-data: 3.99.1 node-cache: 5.1.2 diff --git a/docs/pnpm-workspace.yaml b/docs/pnpm-workspace.yaml index e74a35985..4ea46223c 100644 --- a/docs/pnpm-workspace.yaml +++ b/docs/pnpm-workspace.yaml @@ -7,6 +7,6 @@ catalog: tsx: ^4.20.6 typescript: ^5.9.3 prettier: ^3.6.2 - hypixel-api-reborn: 12.0.0-13 + hypixel-api-reborn: 12.0.0-14 yaml: ^2.8.1 skyhelper-networth: ^2.5.1 From c1741ed0fd5f7664cb897d731d97ccb2be58e93f Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 22 Oct 2025 07:45:02 +0800 Subject: [PATCH 064/124] feat(PrepareSkyBlockProfileForSkyHelperNetworth): Sack Counts --- src/Types/SkyBlock.ts | 2 ++ src/Utils/SkyBlockUtils.ts | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Types/SkyBlock.ts b/src/Types/SkyBlock.ts index 8422cf23c..6af19f98f 100644 --- a/src/Types/SkyBlock.ts +++ b/src/Types/SkyBlock.ts @@ -3594,6 +3594,7 @@ export interface SkyHelperNetWorthProfileInventory { backpack_contents: SkyHelperNetWorthProfileInventoryBackpack; backpack_icons: SkyHelperNetWorthProfileInventoryBackpack; bag_contents: SkyHelperNetWorthProfileInventoryBagContents; + sacks_counts: Record; } export interface SkyHelperNetWorthProfileSharedInventory { @@ -3621,4 +3622,5 @@ export interface SkyHelperNetWorthProfile { inventory: SkyHelperNetWorthProfileInventory; shared_inventory: SkyHelperNetWorthProfileSharedInventory; pets_data: SkyHelperNetWorthProfilePetsData; + sacks_counts: Record; } diff --git a/src/Utils/SkyBlockUtils.ts b/src/Utils/SkyBlockUtils.ts index 71deb8bb0..d3521560f 100644 --- a/src/Utils/SkyBlockUtils.ts +++ b/src/Utils/SkyBlockUtils.ts @@ -266,7 +266,8 @@ export function PrepareSkyBlockProfileForSkyHelperNetworth( potion_bag: { data: profile.me.inventory.bags.potion.base64 ?? '' }, sacks_bag: { data: profile.me.inventory.bags.sacks.base64 ?? '' }, quiver: { data: profile.me.inventory.bags.quiver.base64 ?? '' } - } + }, + sacks_counts: profile.me.inventory.sacksCounts }, shared_inventory: { candy_inventory_contents: { data: profile.me.inventory.candy.base64 ?? '' }, @@ -276,7 +277,8 @@ export function PrepareSkyBlockProfileForSkyHelperNetworth( pets: profile.me.pets.pets.map((pet) => { return { type: pet.type, tier: pet.tier, exp: pet.level.xp, heldItem: pet.heldItem, skin: pet.skin }; }) - } + }, + sacks_counts: profile.me.inventory.sacksCounts }; /* eslint-enable camelcase */ /* eslint-enable quote-props */ From fc4d58cf0e7e311072a4c3bd5348431d2f92600e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Oct 2025 08:36:48 +0800 Subject: [PATCH 065/124] chore(deps): Update all non-major dependencies (#673) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 14 +- pnpm-lock.yaml | 435 +++++++++++++++++++++++-------------------------- 2 files changed, 210 insertions(+), 239 deletions(-) diff --git a/package.json b/package.json index 94035fe7b..8f2cb7e04 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "packageManager": "pnpm@9.7.1", "author": "Kathund", "dependencies": { - "minecraft-data": "^3.98.0", + "minecraft-data": "^3.99.1", "node-cache": "^5.1.2", "prismarine-nbt": "^2.7.0", "rss-parser": "^3.13.0" @@ -50,16 +50,16 @@ "publisher": "Kathund", "devDependencies": { "@8hobbies/typedoc-plugin-404": "^3.2.1", - "@eslint/js": "^9.35.0", + "@eslint/js": "^9.38.0", "@j4cobi/eslint-plugin-sort-imports": "^1.0.2", - "@stylistic/eslint-plugin": "^5.3.1", + "@stylistic/eslint-plugin": "^5.5.0", "@types/eslint": "^9.6.1", - "@types/node": "^22.18.3", + "@types/node": "^22.18.12", "@types/xml2js": "^0.4.14", "@vitest/coverage-v8": "^3.2.4", "@vitest/ui": "^3.2.4", "dotenv": "^16.6.1", - "eslint": "^9.35.0", + "eslint": "^9.38.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-import": "^2.32.0", "globals": "^16.4.0", @@ -67,8 +67,8 @@ "typedoc": "^0.27.9", "typedoc-material-theme": "^1.4.0", "typedoc-plugin-rename-defaults": "^0.7.3", - "typescript": "^5.9.2", - "typescript-eslint": "^8.43.0", + "typescript": "^5.9.3", + "typescript-eslint": "^8.46.2", "vitest": "^3.2.4", "xml2js": "^0.6.2" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4df915e7f..4bc7bb687 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: minecraft-data: - specifier: ^3.98.0 - version: 3.98.0 + specifier: ^3.99.1 + version: 3.99.1 node-cache: specifier: ^5.1.2 version: 5.1.2 @@ -23,28 +23,28 @@ importers: devDependencies: '@8hobbies/typedoc-plugin-404': specifier: ^3.2.1 - version: 3.2.1(typedoc@0.27.9(typescript@5.9.2)) + version: 3.2.1(typedoc@0.27.9(typescript@5.9.3)) '@eslint/js': - specifier: ^9.35.0 - version: 9.35.0 + specifier: ^9.38.0 + version: 9.38.0 '@j4cobi/eslint-plugin-sort-imports': specifier: ^1.0.2 - version: 1.0.2(eslint@9.35.0)(typescript@5.9.2) + version: 1.0.2(eslint@9.38.0)(typescript@5.9.3) '@stylistic/eslint-plugin': - specifier: ^5.3.1 - version: 5.3.1(eslint@9.35.0) + specifier: ^5.5.0 + version: 5.5.0(eslint@9.38.0) '@types/eslint': specifier: ^9.6.1 version: 9.6.1 '@types/node': - specifier: ^22.18.3 - version: 22.18.3 + specifier: ^22.18.12 + version: 22.18.12 '@types/xml2js': specifier: ^0.4.14 version: 0.4.14 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.18.3)(@vitest/ui@3.2.4)) + version: 3.2.4(vitest@3.2.4(@types/node@22.18.12)(@vitest/ui@3.2.4)) '@vitest/ui': specifier: ^3.2.4 version: 3.2.4(vitest@3.2.4) @@ -52,14 +52,14 @@ importers: specifier: ^16.6.1 version: 16.6.1 eslint: - specifier: ^9.35.0 - version: 9.35.0 + specifier: ^9.38.0 + version: 9.38.0 eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@9.35.0) + version: 10.1.8(eslint@9.38.0) eslint-plugin-import: specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.9.2))(eslint@9.35.0) + version: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0) globals: specifier: ^16.4.0 version: 16.4.0 @@ -68,22 +68,22 @@ importers: version: 3.6.2 typedoc: specifier: ^0.27.9 - version: 0.27.9(typescript@5.9.2) + version: 0.27.9(typescript@5.9.3) typedoc-material-theme: specifier: ^1.4.0 - version: 1.4.0(typedoc@0.27.9(typescript@5.9.2)) + version: 1.4.0(typedoc@0.27.9(typescript@5.9.3)) typedoc-plugin-rename-defaults: specifier: ^0.7.3 - version: 0.7.3(typedoc@0.27.9(typescript@5.9.2)) + version: 0.7.3(typedoc@0.27.9(typescript@5.9.3)) typescript: - specifier: ^5.9.2 - version: 5.9.2 + specifier: ^5.9.3 + version: 5.9.3 typescript-eslint: - specifier: ^8.43.0 - version: 8.43.0(eslint@9.35.0)(typescript@5.9.2) + specifier: ^8.46.2 + version: 8.46.2(eslint@9.38.0)(typescript@5.9.3) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@22.18.3)(@vitest/ui@3.2.4) + version: 3.2.4(@types/node@22.18.12)(@vitest/ui@3.2.4) xml2js: specifier: ^0.6.2 version: 0.6.2 @@ -259,12 +259,6 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.5.1': - resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/eslint-utils@4.9.0': resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -275,32 +269,32 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.21.0': - resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.3.1': - resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==} + '@eslint/config-helpers@0.4.1': + resolution: {integrity: sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.15.2': - resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} + '@eslint/core@0.16.0': + resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.35.0': - resolution: {integrity: sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==} + '@eslint/js@9.38.0': + resolution: {integrity: sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.6': - resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.3.5': - resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} + '@eslint/plugin-kit@0.4.0': + resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@gerrit0/mini-shiki@1.27.2': @@ -492,8 +486,8 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@stylistic/eslint-plugin@5.3.1': - resolution: {integrity: sha512-Ykums1VYonM0TgkD0VteVq9mrlO2FhF48MDJnPyv3MktIB2ydtuhlO0AfWm7xnW1kyf5bjOqA6xc7JjviuVTxg==} + '@stylistic/eslint-plugin@5.5.0': + resolution: {integrity: sha512-IeZF+8H0ns6prg4VrkhgL+yrvDXWDH2cKchrbh80ejG9dQgZWp10epHMbgRuQvgchLII/lfh6Xn3lu6+6L86Hw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=9.0.0' @@ -522,8 +516,8 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/node@22.18.3': - resolution: {integrity: sha512-gTVM8js2twdtqM+AE2PdGEe9zGQY4UvmFjan9rZcVb6FGdStfjWoWejdmy4CfWVO9rh5MiYQGZloKAGkJt8lMw==} + '@types/node@22.18.12': + resolution: {integrity: sha512-BICHQ67iqxQGFSzfCFTT7MRQ5XcBjG5aeKh5Ok38UBbPe5fxTyE+aHFxwVrGyr8GNlqFMLKD1D3P2K/1ks8tog==} '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -531,23 +525,23 @@ packages: '@types/xml2js@0.4.14': resolution: {integrity: sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==} - '@typescript-eslint/eslint-plugin@8.43.0': - resolution: {integrity: sha512-8tg+gt7ENL7KewsKMKDHXR1vm8tt9eMxjJBYINf6swonlWgkYn5NwyIgXpbbDxTNU5DgpDFfj95prcTq2clIQQ==} + '@typescript-eslint/eslint-plugin@8.46.2': + resolution: {integrity: sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.43.0 + '@typescript-eslint/parser': ^8.46.2 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.43.0': - resolution: {integrity: sha512-B7RIQiTsCBBmY+yW4+ILd6mF5h1FUwJsVvpqkrgpszYifetQ2Ke+Z4u6aZh0CblkUGIdR59iYVyXqqZGkZ3aBw==} + '@typescript-eslint/parser@8.46.2': + resolution: {integrity: sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.43.0': - resolution: {integrity: sha512-htB/+D/BIGoNTQYffZw4uM4NzzuolCoaA/BusuSIcC8YjmBYQioew5VUZAYdAETPjeed0hqCaW7EHg+Robq8uw==} + '@typescript-eslint/project-service@8.46.2': + resolution: {integrity: sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -556,18 +550,18 @@ packages: resolution: {integrity: sha512-u2oITX3BJwzWCapoZ/pXw6BCOl8rJP4Ij/3wPoGvY8XwvXflOzd1kLrDUUUAIEdJSFh+ASwdTHqtan9xSg8buw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.43.0': - resolution: {integrity: sha512-daSWlQ87ZhsjrbMLvpuuMAt3y4ba57AuvadcR7f3nl8eS3BjRc8L9VLxFLk92RL5xdXOg6IQ+qKjjqNEimGuAg==} + '@typescript-eslint/scope-manager@8.46.2': + resolution: {integrity: sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.43.0': - resolution: {integrity: sha512-ALC2prjZcj2YqqL5X/bwWQmHA2em6/94GcbB/KKu5SX3EBDOsqztmmX1kMkvAJHzxk7TazKzJfFiEIagNV3qEA==} + '@typescript-eslint/tsconfig-utils@8.46.2': + resolution: {integrity: sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.43.0': - resolution: {integrity: sha512-qaH1uLBpBuBBuRf8c1mLJ6swOfzCXryhKND04Igr4pckzSEW9JX5Aw9AgW00kwfjWJF0kk0ps9ExKTfvXfw4Qg==} + '@typescript-eslint/type-utils@8.46.2': + resolution: {integrity: sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -577,8 +571,8 @@ packages: resolution: {integrity: sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.43.0': - resolution: {integrity: sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==} + '@typescript-eslint/types@8.46.2': + resolution: {integrity: sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@8.28.0': @@ -587,8 +581,8 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/typescript-estree@8.43.0': - resolution: {integrity: sha512-7Vv6zlAhPb+cvEpP06WXXy/ZByph9iL6BQRBDj4kmBsW98AqEeQHlj/13X+sZOrKSo9/rNKH4Ul4f6EICREFdw==} + '@typescript-eslint/typescript-estree@8.46.2': + resolution: {integrity: sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -600,8 +594,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.43.0': - resolution: {integrity: sha512-S1/tEmkUeeswxd0GGcnwuVQPFWo8NzZTOMxCvw8BX7OMxnNae+i8Tm7REQen/SwUIPoPqfKn7EaZ+YLpiB3k9g==} + '@typescript-eslint/utils@8.46.2': + resolution: {integrity: sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -611,8 +605,8 @@ packages: resolution: {integrity: sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.43.0': - resolution: {integrity: sha512-T+S1KqRD4sg/bHfLwrpF/K3gQLBM1n7Rp7OjjikjTEssI2YJzQpi5WXoynOaQ93ERIuq3O8RBTOUYDKszUCEHw==} + '@typescript-eslint/visitor-keys@8.46.2': + resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitest/coverage-v8@3.2.4': @@ -826,15 +820,6 @@ packages: supports-color: optional: true - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -975,16 +960,12 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.2.0: - resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint-visitor-keys@4.2.1: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.35.0: - resolution: {integrity: sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==} + eslint@9.38.0: + resolution: {integrity: sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1408,8 +1389,8 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - minecraft-data@3.98.0: - resolution: {integrity: sha512-JAPqJ/TZoxMUlAPPdWUh1v5wdqvYGFSZ4rW9bUtmaKBkGpomDSjw4V02ocBqbxKJvcTtmc5nM/LfN9/0DDqHrQ==} + minecraft-data@3.99.1: + resolution: {integrity: sha512-mI9SNwlrqY2uTTLOT332Hf/QlaLa+AH3V36qu3Y2i9Z2/PjsZlja2ToTDHjazWqDMBtfch+rDTwPB2mHloArHA==} minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1826,15 +1807,15 @@ packages: peerDependencies: typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x - typescript-eslint@8.43.0: - resolution: {integrity: sha512-FyRGJKUGvcFekRRcBKFBlAhnp4Ng8rhe8tuvvkR9OiU0gfd4vyvTRQHEckO6VDlH57jbeUQem2IpqPq9kLJH+w==} + typescript-eslint@8.46.2: + resolution: {integrity: sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - typescript@5.9.2: - resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true @@ -1976,9 +1957,9 @@ packages: snapshots: - '@8hobbies/typedoc-plugin-404@3.2.1(typedoc@0.27.9(typescript@5.9.2))': + '@8hobbies/typedoc-plugin-404@3.2.1(typedoc@0.27.9(typescript@5.9.3))': dependencies: - typedoc: 0.27.9(typescript@5.9.2) + typedoc: 0.27.9(typescript@5.9.3) '@ampproject/remapping@2.3.0': dependencies: @@ -2069,36 +2050,33 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.5.1(eslint@9.35.0)': - dependencies: - eslint: 9.35.0 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/eslint-utils@4.9.0(eslint@9.35.0)': + '@eslint-community/eslint-utils@4.9.0(eslint@9.38.0)': dependencies: - eslint: 9.35.0 + eslint: 9.38.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.21.0': + '@eslint/config-array@0.21.1': dependencies: - '@eslint/object-schema': 2.1.6 - debug: 4.4.0 + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.3.1': {} + '@eslint/config-helpers@0.4.1': + dependencies: + '@eslint/core': 0.16.0 - '@eslint/core@0.15.2': + '@eslint/core@0.16.0': dependencies: '@types/json-schema': 7.0.15 '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.0 + debug: 4.4.3 espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 @@ -2109,13 +2087,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.35.0': {} + '@eslint/js@9.38.0': {} - '@eslint/object-schema@2.1.6': {} + '@eslint/object-schema@2.1.7': {} - '@eslint/plugin-kit@0.3.5': + '@eslint/plugin-kit@0.4.0': dependencies: - '@eslint/core': 0.15.2 + '@eslint/core': 0.16.0 levn: 0.4.1 '@gerrit0/mini-shiki@1.27.2': @@ -2148,9 +2126,9 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@j4cobi/eslint-plugin-sort-imports@1.0.2(eslint@9.35.0)(typescript@5.9.2)': + '@j4cobi/eslint-plugin-sort-imports@1.0.2(eslint@9.38.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/utils': 8.28.0(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/utils': 8.28.0(eslint@9.38.0)(typescript@5.9.3) transitivePeerDependencies: - eslint - supports-color @@ -2271,11 +2249,11 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} - '@stylistic/eslint-plugin@5.3.1(eslint@9.35.0)': + '@stylistic/eslint-plugin@5.5.0(eslint@9.38.0)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0) - '@typescript-eslint/types': 8.43.0 - eslint: 9.35.0 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) + '@typescript-eslint/types': 8.46.2 + eslint: 9.38.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -2304,7 +2282,7 @@ snapshots: '@types/json5@0.0.29': {} - '@types/node@22.18.3': + '@types/node@22.18.12': dependencies: undici-types: 6.21.0 @@ -2312,43 +2290,43 @@ snapshots: '@types/xml2js@0.4.14': dependencies: - '@types/node': 22.18.3 + '@types/node': 22.18.12 - '@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.9.2))(eslint@9.35.0)(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.43.0(eslint@9.35.0)(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/type-utils': 8.43.0(eslint@9.35.0)(typescript@5.9.2) - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0)(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.43.0 - eslint: 9.35.0 + '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/type-utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.2 + eslint: 9.38.0 graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.9.2)': + '@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.43.0 - debug: 4.4.0 - eslint: 9.35.0 - typescript: 5.9.2 + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.2 + debug: 4.4.3 + eslint: 9.38.0 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.43.0(typescript@5.9.2)': + '@typescript-eslint/project-service@8.46.2(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.9.2) - '@typescript-eslint/types': 8.43.0 - debug: 4.4.0 - typescript: 5.9.2 + '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) + '@typescript-eslint/types': 8.46.2 + debug: 4.4.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -2357,94 +2335,94 @@ snapshots: '@typescript-eslint/types': 8.28.0 '@typescript-eslint/visitor-keys': 8.28.0 - '@typescript-eslint/scope-manager@8.43.0': + '@typescript-eslint/scope-manager@8.46.2': dependencies: - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/visitor-keys': 8.43.0 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/visitor-keys': 8.46.2 - '@typescript-eslint/tsconfig-utils@8.43.0(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.9.3)': dependencies: - typescript: 5.9.2 + typescript: 5.9.3 - '@typescript-eslint/type-utils@8.43.0(eslint@9.35.0)(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.46.2(eslint@9.38.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0)(typescript@5.9.2) - debug: 4.4.0 - eslint: 9.35.0 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3) + debug: 4.4.3 + eslint: 9.38.0 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.28.0': {} - '@typescript-eslint/types@8.43.0': {} + '@typescript-eslint/types@8.46.2': {} - '@typescript-eslint/typescript-estree@8.28.0(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.28.0(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.28.0 '@typescript-eslint/visitor-keys': 8.28.0 - debug: 4.4.0 + debug: 4.4.3 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.1 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.43.0(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.46.2(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.43.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.9.2) - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/visitor-keys': 8.43.0 - debug: 4.4.0 + '@typescript-eslint/project-service': 8.46.2(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/visitor-keys': 8.46.2 + debug: 4.4.3 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.1 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.28.0(eslint@9.35.0)(typescript@5.9.2)': + '@typescript-eslint/utils@8.28.0(eslint@9.38.0)(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.35.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) '@typescript-eslint/scope-manager': 8.28.0 '@typescript-eslint/types': 8.28.0 - '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.9.2) - eslint: 9.35.0 - typescript: 5.9.2 + '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.9.3) + eslint: 9.38.0 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.43.0(eslint@9.35.0)(typescript@5.9.2)': + '@typescript-eslint/utils@8.46.2(eslint@9.38.0)(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0) - '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.9.2) - eslint: 9.35.0 - typescript: 5.9.2 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + eslint: 9.38.0 + typescript: 5.9.3 transitivePeerDependencies: - supports-color '@typescript-eslint/visitor-keys@8.28.0': dependencies: '@typescript-eslint/types': 8.28.0 - eslint-visitor-keys: 4.2.0 + eslint-visitor-keys: 4.2.1 - '@typescript-eslint/visitor-keys@8.43.0': + '@typescript-eslint/visitor-keys@8.46.2': dependencies: - '@typescript-eslint/types': 8.43.0 + '@typescript-eslint/types': 8.46.2 eslint-visitor-keys: 4.2.1 - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@22.18.3)(@vitest/ui@3.2.4))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@22.18.12)(@vitest/ui@3.2.4))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -2459,7 +2437,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.18.3)(@vitest/ui@3.2.4) + vitest: 3.2.4(@types/node@22.18.12)(@vitest/ui@3.2.4) transitivePeerDependencies: - supports-color @@ -2471,13 +2449,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@5.4.15(@types/node@22.18.3))': + '@vitest/mocker@3.2.4(vite@5.4.15(@types/node@22.18.12))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 5.4.15(@types/node@22.18.3) + vite: 5.4.15(@types/node@22.18.12) '@vitest/pretty-format@3.2.4': dependencies: @@ -2508,7 +2486,7 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.15 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.18.3)(@vitest/ui@3.2.4) + vitest: 3.2.4(@types/node@22.18.12)(@vitest/ui@3.2.4) '@vitest/utils@3.2.4': dependencies: @@ -2707,10 +2685,6 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.0: - dependencies: - ms: 2.1.3 - debug@4.4.3: dependencies: ms: 2.1.3 @@ -2865,9 +2839,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.8(eslint@9.35.0): + eslint-config-prettier@10.1.8(eslint@9.38.0): dependencies: - eslint: 9.35.0 + eslint: 9.38.0 eslint-import-resolver-node@0.3.9: dependencies: @@ -2877,17 +2851,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.35.0): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.43.0(eslint@9.35.0)(typescript@5.9.2) - eslint: 9.35.0 + '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.9.3) + eslint: 9.38.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.9.2))(eslint@9.35.0): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -2896,9 +2870,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.35.0 + eslint: 9.38.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.35.0) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -2910,7 +2884,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.43.0(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -2923,29 +2897,26 @@ snapshots: eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.2.0: {} - eslint-visitor-keys@4.2.1: {} - eslint@9.35.0: + eslint@9.38.0: dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.21.0 - '@eslint/config-helpers': 0.3.1 - '@eslint/core': 0.15.2 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.1 + '@eslint/core': 0.16.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.35.0 - '@eslint/plugin-kit': 0.3.5 + '@eslint/js': 9.38.0 + '@eslint/plugin-kit': 0.4.0 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.2 '@types/estree': 1.0.7 - '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.3 escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -3382,7 +3353,7 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - minecraft-data@3.98.0: {} + minecraft-data@3.99.1: {} minimatch@3.1.2: dependencies: @@ -3793,9 +3764,9 @@ snapshots: totalist@3.0.1: {} - ts-api-utils@2.1.0(typescript@5.9.2): + ts-api-utils@2.1.0(typescript@5.9.3): dependencies: - typescript: 5.9.2 + typescript: 5.9.3 tsconfig-paths@3.15.0: dependencies: @@ -3841,37 +3812,37 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typedoc-material-theme@1.4.0(typedoc@0.27.9(typescript@5.9.2)): + typedoc-material-theme@1.4.0(typedoc@0.27.9(typescript@5.9.3)): dependencies: '@material/material-color-utilities': 0.3.0 - typedoc: 0.27.9(typescript@5.9.2) + typedoc: 0.27.9(typescript@5.9.3) - typedoc-plugin-rename-defaults@0.7.3(typedoc@0.27.9(typescript@5.9.2)): + typedoc-plugin-rename-defaults@0.7.3(typedoc@0.27.9(typescript@5.9.3)): dependencies: camelcase: 8.0.0 - typedoc: 0.27.9(typescript@5.9.2) + typedoc: 0.27.9(typescript@5.9.3) - typedoc@0.27.9(typescript@5.9.2): + typedoc@0.27.9(typescript@5.9.3): dependencies: '@gerrit0/mini-shiki': 1.27.2 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 - typescript: 5.9.2 + typescript: 5.9.3 yaml: 2.8.1 - typescript-eslint@8.43.0(eslint@9.35.0)(typescript@5.9.2): + typescript-eslint@8.46.2(eslint@9.38.0)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.9.2))(eslint@9.35.0)(typescript@5.9.2) - '@typescript-eslint/parser': 8.43.0(eslint@9.35.0)(typescript@5.9.2) - '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0)(typescript@5.9.2) - eslint: 9.35.0 - typescript: 5.9.2 + '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3) + eslint: 9.38.0 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - typescript@5.9.2: {} + typescript@5.9.3: {} uc.micro@2.1.0: {} @@ -3888,13 +3859,13 @@ snapshots: dependencies: punycode: 2.3.1 - vite-node@3.2.4(@types/node@22.18.3): + vite-node@3.2.4(@types/node@22.18.12): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 5.4.15(@types/node@22.18.3) + vite: 5.4.15(@types/node@22.18.12) transitivePeerDependencies: - '@types/node' - less @@ -3906,20 +3877,20 @@ snapshots: - supports-color - terser - vite@5.4.15(@types/node@22.18.3): + vite@5.4.15(@types/node@22.18.12): dependencies: esbuild: 0.21.5 postcss: 8.5.3 rollup: 4.37.0 optionalDependencies: - '@types/node': 22.18.3 + '@types/node': 22.18.12 fsevents: 2.3.3 - vitest@3.2.4(@types/node@22.18.3)(@vitest/ui@3.2.4): + vitest@3.2.4(@types/node@22.18.12)(@vitest/ui@3.2.4): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@5.4.15(@types/node@22.18.3)) + '@vitest/mocker': 3.2.4(vite@5.4.15(@types/node@22.18.12)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -3937,11 +3908,11 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 5.4.15(@types/node@22.18.3) - vite-node: 3.2.4(@types/node@22.18.3) + vite: 5.4.15(@types/node@22.18.12) + vite-node: 3.2.4(@types/node@22.18.12) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.18.3 + '@types/node': 22.18.12 '@vitest/ui': 3.2.4(vitest@3.2.4) transitivePeerDependencies: - less From c4b9c23c0be618e6c5f2ec1b7c119ab97acc29ca Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 22 Oct 2025 08:40:57 +0800 Subject: [PATCH 066/124] chore(renovate): update ignored deps --- .github/renovate.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/renovate.json b/.github/renovate.json index 499c15526..989390ad6 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -2,7 +2,7 @@ "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": ["config:recommended", "group:allNonMajor"], "rebaseWhen": "behind-base-branch", - "ignoreDeps": ["pnpm", "node", "typedoc"], + "ignoreDeps": ["pnpm", "node", "typedoc", "hypixel-api-reborn", "skyhelper-networth"], "semanticCommits": "enabled", "labels": ["dependencies"], "schedule": ["* 0 * * *"], From 0575cd33b1580ebb5b01c886e5a733adc4ada6f3 Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 22 Oct 2025 08:44:13 +0800 Subject: [PATCH 067/124] chore(dotenv): Prepare for v17 --- .env.example | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.env.example b/.env.example index 9e05036a1..15bbdec30 100644 --- a/.env.example +++ b/.env.example @@ -1 +1,2 @@ -HYPIXEL_KEY=HYPIXEL_API_KEY \ No newline at end of file +DOTENV_CONFIG_QUIET=true +HYPIXEL_KEY=HYPIXEL_API_KEY From e13a0eda357b8bc269e9df1e0510fe5394185586 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Oct 2025 00:47:43 +0000 Subject: [PATCH 068/124] chore(deps): update dependency dotenv to v17 (#670) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 8f2cb7e04..8f5f970cd 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "@types/xml2js": "^0.4.14", "@vitest/coverage-v8": "^3.2.4", "@vitest/ui": "^3.2.4", - "dotenv": "^16.6.1", + "dotenv": "^17.2.3", "eslint": "^9.38.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-import": "^2.32.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4bc7bb687..d6cf511bf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,8 +49,8 @@ importers: specifier: ^3.2.4 version: 3.2.4(vitest@3.2.4) dotenv: - specifier: ^16.6.1 - version: 16.6.1 + specifier: ^17.2.3 + version: 17.2.3 eslint: specifier: ^9.38.0 version: 9.38.0 @@ -848,8 +848,8 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - dotenv@16.6.1: - resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + dotenv@17.2.3: + resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} engines: {node: '>=12'} dunder-proto@1.0.1: @@ -2709,7 +2709,7 @@ snapshots: dependencies: esutils: 2.0.3 - dotenv@16.6.1: {} + dotenv@17.2.3: {} dunder-proto@1.0.1: dependencies: From 009bcfcbd6f0831e288924e66f7c5a5b2c68a69c Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 22 Oct 2025 09:14:47 +0800 Subject: [PATCH 069/124] chore(dotenv): Update to v17 dotenv config import --- vitest.setup.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vitest.setup.ts b/vitest.setup.ts index 58ee6d61a..b02f100e3 100644 --- a/vitest.setup.ts +++ b/vitest.setup.ts @@ -1,5 +1,5 @@ -import { config } from 'dotenv'; -config(); +import 'dotenv/config'; + if ((process.env.HYPIXEL_KEY || '').length < 1) throw new Error('No API Key specified!'); export const defaultRequestData = { From 128641698524d914645532a03a5fc2a51abcdcf0 Mon Sep 17 00:00:00 2001 From: Jacob Date: Fri, 24 Oct 2025 08:28:47 +0800 Subject: [PATCH 070/124] Release 12.0.0-15 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8f5f970cd..7a888afcf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hypixel-api-reborn", - "version": "12.0.0-14", + "version": "12.0.0-15", "description": "Feature-rich Hypixel API wrapper for Node.js", "main": "dist/index.js", "types": "dist/index.d.ts", From 4ca9f1beb7131bf046fcf89945db21a19f25663c Mon Sep 17 00:00:00 2001 From: Jacob Date: Fri, 24 Oct 2025 08:33:14 +0800 Subject: [PATCH 071/124] chore(docs): bump hypixel-api-reborn --- docs/JavaScript/SettingUpClient/Readme.md | 4 ++-- docs/JavaScript/SkyHelperNetworth/Readme.md | 4 ++-- docs/TypeScript/SettingUpClient/Readme.md | 4 ++-- docs/TypeScript/SkyHelperNetworth/Readme.md | 4 ++-- docs/TypeScript/UnderstandingIsRaw/Readme.md | 4 ++-- docs/pnpm-lock.yaml | 18 +++++++++--------- docs/pnpm-workspace.yaml | 2 +- 7 files changed, 20 insertions(+), 20 deletions(-) diff --git a/docs/JavaScript/SettingUpClient/Readme.md b/docs/JavaScript/SettingUpClient/Readme.md index 794565ba7..43f626ee8 100644 --- a/docs/JavaScript/SettingUpClient/Readme.md +++ b/docs/JavaScript/SettingUpClient/Readme.md @@ -7,13 +7,13 @@ This assumes that you will be using JavaScript. Please checkout ## Requirements -- Hypixel-API-Reborn v12.0.0-14 or **higher** +- Hypixel-API-Reborn v12.0.0-15 or **higher** ## Assumptions This guide assumes the following -- You are using Hypixel-API-Reborn v12.0.0-14 +- You are using Hypixel-API-Reborn v12.0.0-15 - You are using ES6 Modules ## Initializing a Client Instance diff --git a/docs/JavaScript/SkyHelperNetworth/Readme.md b/docs/JavaScript/SkyHelperNetworth/Readme.md index c288d7453..20e144a3f 100644 --- a/docs/JavaScript/SkyHelperNetworth/Readme.md +++ b/docs/JavaScript/SkyHelperNetworth/Readme.md @@ -6,14 +6,14 @@ Networth. This assumes that you will be using JavaScript. Please checkout ## Requirements -- Hypixel-API-Reborn v12.0.0-14 or **higher** +- Hypixel-API-Reborn v12.0.0-15 or **higher** - SkyHelper Networth v2.5.1 or **higher** ## Assumptions This guide assumes the following -- You are using Hypixel-API-Reborn v12.0.0-14 +- You are using Hypixel-API-Reborn v12.0.0-15 - You are using SkyHelper Networth v2.5.1 - You have setup a Client instance. If not please see [the Setting Up Client guide](../SettingUpClient/Guide.md) diff --git a/docs/TypeScript/SettingUpClient/Readme.md b/docs/TypeScript/SettingUpClient/Readme.md index a847db910..af76b4a3a 100644 --- a/docs/TypeScript/SettingUpClient/Readme.md +++ b/docs/TypeScript/SettingUpClient/Readme.md @@ -7,14 +7,14 @@ This assumes that you will be using TypeScript. Please checkout ## Requirements -- Hypixel-API-Reborn v12.0.0-14 or **higher** +- Hypixel-API-Reborn v12.0.0-15 or **higher** - TypeScript v5.9.2 or **higher** ## Assumptions This guide assumes the following -- You are using Hypixel-API-Reborn v12.0.0-14 +- You are using Hypixel-API-Reborn v12.0.0-15 - You are using TypeScript v5.9.2 ## Initializing a Client Instance diff --git a/docs/TypeScript/SkyHelperNetworth/Readme.md b/docs/TypeScript/SkyHelperNetworth/Readme.md index 881197e65..509d660f5 100644 --- a/docs/TypeScript/SkyHelperNetworth/Readme.md +++ b/docs/TypeScript/SkyHelperNetworth/Readme.md @@ -6,7 +6,7 @@ Networth. This assumes that you will be using TypeScript. Please checkout ## Requirements -- Hypixel-API-Reborn v12.0.0-14 or **higher** +- Hypixel-API-Reborn v12.0.0-15 or **higher** - SkyHelper Networth v2.5.1 or **higher** - TypeScript v5.9.2 or **higher** @@ -14,7 +14,7 @@ Networth. This assumes that you will be using TypeScript. Please checkout This guide assumes the following -- You are using Hypixel-API-Reborn v12.0.0-14 +- You are using Hypixel-API-Reborn v12.0.0-15 - You are using SkyHelper Networth v2.5.1 - You are using TypeScript v5.9.2 - You have setup a Client instance. If not please see [the Setting Up Client guide](../SettingUpClient/Guide.md) diff --git a/docs/TypeScript/UnderstandingIsRaw/Readme.md b/docs/TypeScript/UnderstandingIsRaw/Readme.md index 9fb6c45c7..a28426922 100644 --- a/docs/TypeScript/UnderstandingIsRaw/Readme.md +++ b/docs/TypeScript/UnderstandingIsRaw/Readme.md @@ -6,14 +6,14 @@ This assumes that you will be using TypeScript. There will not be a JavaScript v ## Requirements -- Hypixel-API-Reborn v12.0.0-14 or **higher** +- Hypixel-API-Reborn v12.0.0-15 or **higher** - TypeScript v5.9.2 or **higher** ## Assumptions This guide assumes the following -- You are using Hypixel-API-Reborn v12.0.0-14 +- You are using Hypixel-API-Reborn v12.0.0-15 - You are using TypeScript v5.9.2 ## Why diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index 0f7a58259..0a79829c9 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -7,8 +7,8 @@ settings: catalogs: default: hypixel-api-reborn: - specifier: 12.0.0-14 - version: 12.0.0-14 + specifier: 12.0.0-15 + version: 12.0.0-15 prettier: specifier: ^3.6.2 version: 3.6.2 @@ -43,19 +43,19 @@ importers: dependencies: hypixel-api-reborn: specifier: 'catalog:' - version: 12.0.0-14 + version: 12.0.0-15 JavaScript/SkyHelperNetworth/Code: dependencies: hypixel-api-reborn: specifier: 'catalog:' - version: 12.0.0-14 + version: 12.0.0-15 TypeScript/SettingUpClient/Code: dependencies: hypixel-api-reborn: specifier: 'catalog:' - version: 12.0.0-14 + version: 12.0.0-15 devDependencies: tsx: specifier: 'catalog:' @@ -68,7 +68,7 @@ importers: dependencies: hypixel-api-reborn: specifier: 'catalog:' - version: 12.0.0-14 + version: 12.0.0-15 devDependencies: tsx: specifier: 'catalog:' @@ -282,8 +282,8 @@ packages: get-tsconfig@4.12.0: resolution: {integrity: sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==} - hypixel-api-reborn@12.0.0-14: - resolution: {integrity: sha512-HnInZRj7P1TvCnPnIVYuhuiYsWzTSoSbj1dWHREbO5L6o9RuDeqUd5aPIF1lQ57tZ/gp8bLZrxzhd/B78NXOAA==} + hypixel-api-reborn@12.0.0-15: + resolution: {integrity: sha512-xreG5r+2bTn+2WGsNkIvdQa7kjx36AkTYYjdCHYONEqFCRSSYxxkLyV6Rm4/S5ODMlXtrU2rG0Vbw//9VbiNrQ==} engines: {node: '>=20.16.0'} ieee754@1.2.1: @@ -517,7 +517,7 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - hypixel-api-reborn@12.0.0-14: + hypixel-api-reborn@12.0.0-15: dependencies: minecraft-data: 3.99.1 node-cache: 5.1.2 diff --git a/docs/pnpm-workspace.yaml b/docs/pnpm-workspace.yaml index 4ea46223c..4cbb18986 100644 --- a/docs/pnpm-workspace.yaml +++ b/docs/pnpm-workspace.yaml @@ -7,6 +7,6 @@ catalog: tsx: ^4.20.6 typescript: ^5.9.3 prettier: ^3.6.2 - hypixel-api-reborn: 12.0.0-14 + hypixel-api-reborn: 12.0.0-15 yaml: ^2.8.1 skyhelper-networth: ^2.5.1 From 3ca23c3fd15daec9254a30309bce9fd91f4c7fc4 Mon Sep 17 00:00:00 2001 From: Jacob Date: Sun, 26 Oct 2025 20:02:57 +0800 Subject: [PATCH 072/124] feat(RequestHandler): Set Base URL --- .env.example | 1 + src/API/getAchievements.test.ts | 2 ++ src/API/getActiveHouses.test.ts | 2 ++ src/API/getBoosters.test.ts | 2 ++ src/API/getChallenges.test.ts | 2 ++ src/API/getGameCounts.test.ts | 2 ++ src/API/getGuild.test.ts | 11 ++++++++-- src/API/getGuildAchievements.test.ts | 2 ++ src/API/getHouse.test.ts | 3 +++ src/API/getLeaderboards.test.ts | 3 +++ src/API/getPlayerHouses.test.ts | 3 +++ src/API/getQuests.test.ts | 2 ++ src/API/getRecentGames.test.ts | 3 +++ src/API/getSkyBlockAuction.test.ts | 6 ++++++ src/API/getSkyBlockAuctions.test.ts | 7 +++++++ src/API/getSkyBlockBazaar.test.ts | 2 ++ src/API/getSkyBlockBingo.test.ts | 2 ++ src/API/getSkyBlockCollections.test.ts | 2 ++ src/API/getSkyBlockElection.test.ts | 2 ++ src/API/getSkyBlockEndedAuctions.test.ts | 2 ++ src/API/getSkyBlockFireSales.test.ts | 2 ++ src/API/getSkyBlockGarden.test.ts | 3 +++ src/API/getSkyBlockItems.test.ts | 2 ++ src/API/getSkyBlockMuseum.test.ts | 3 +++ src/API/getSkyBlockNews.test.ts | 2 ++ src/API/getSkyBlockProfile.test.ts | 4 ++++ src/API/getSkyBlockProfiles.test.ts | 6 +++++- src/API/getSkyBlockSkills.test.ts | 2 ++ src/API/getStatus.test.ts | 2 ++ src/API/getWatchdogStats.test.ts | 2 ++ src/Errors.ts | 2 ++ src/Private/CacheHandler.test.ts | 1 + src/Private/Endpoint.test.ts | 1 + src/Private/Functions.test.ts | 3 +++ src/Private/RateLimit.test.ts | 6 ++++-- src/Private/RequestHandler.test.ts | 9 ++++++--- src/Private/RequestHandler.ts | 20 +++++++++++++++++-- src/Private/Updater.test.ts | 4 ++++ src/Structures/MiniGames/Pit/Pit.test.ts | 2 ++ .../SkyBlockMemberInventories.test.ts | 2 +- 40 files changed, 128 insertions(+), 11 deletions(-) diff --git a/.env.example b/.env.example index 15bbdec30..fd1b8c411 100644 --- a/.env.example +++ b/.env.example @@ -1,2 +1,3 @@ DOTENV_CONFIG_QUIET=true HYPIXEL_KEY=HYPIXEL_API_KEY +HYPIXEL_URL=https://api.hypixel.net/v2 diff --git a/src/API/getAchievements.test.ts b/src/API/getAchievements.test.ts index b00a98b12..c53591a3a 100644 --- a/src/API/getAchievements.test.ts +++ b/src/API/getAchievements.test.ts @@ -9,6 +9,7 @@ import type { AchievementTier } from '../Types/Static.js'; test('getAchievements (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getAchievements({ raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -19,6 +20,7 @@ test('getAchievements (raw)', async () => { test('getAchievements', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getAchievements(); expect(data).toBeDefined(); expect(data).toBeInstanceOf(Achievements); diff --git a/src/API/getActiveHouses.test.ts b/src/API/getActiveHouses.test.ts index b84bc9c45..2b4040912 100644 --- a/src/API/getActiveHouses.test.ts +++ b/src/API/getActiveHouses.test.ts @@ -6,6 +6,7 @@ import type { WithRaw } from '../Types/API.js'; test('getActiveHouses (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getActiveHouses({ raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -16,6 +17,7 @@ test('getActiveHouses (raw)', async () => { test('getActiveHouses', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getActiveHouses(); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf | RequestData>(); diff --git a/src/API/getBoosters.test.ts b/src/API/getBoosters.test.ts index e7a86f65b..f33901a85 100644 --- a/src/API/getBoosters.test.ts +++ b/src/API/getBoosters.test.ts @@ -8,6 +8,7 @@ import type { WithRaw } from '../Types/API.js'; test('getBoosters (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getBoosters({ raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -18,6 +19,7 @@ test('getBoosters (raw)', async () => { test('getBoosters', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getBoosters(); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf | RequestData>(); diff --git a/src/API/getChallenges.test.ts b/src/API/getChallenges.test.ts index b6306a829..d03a9c86f 100644 --- a/src/API/getChallenges.test.ts +++ b/src/API/getChallenges.test.ts @@ -8,6 +8,7 @@ import type { ChallengeReward } from '../Types/Static.js'; test('getChallenges (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getChallenges({ raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -18,6 +19,7 @@ test('getChallenges (raw)', async () => { test('getChallenges', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getChallenges(); expect(data).toBeDefined(); expect(data).toBeInstanceOf(Challenges); diff --git a/src/API/getGameCounts.test.ts b/src/API/getGameCounts.test.ts index 07ea23dcd..50d36b96b 100644 --- a/src/API/getGameCounts.test.ts +++ b/src/API/getGameCounts.test.ts @@ -5,6 +5,7 @@ import { expect, expectTypeOf, test } from 'vitest'; test('getGameCounts (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getGameCounts({ raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -16,6 +17,7 @@ test('getGameCounts (raw)', async () => { test('getGameCounts', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getGameCounts(); expect(data).toBeDefined(); expect(data).toBeInstanceOf(GameCounts); diff --git a/src/API/getGuild.test.ts b/src/API/getGuild.test.ts index ab8375c16..2ba29421e 100644 --- a/src/API/getGuild.test.ts +++ b/src/API/getGuild.test.ts @@ -13,7 +13,7 @@ import type { GameCode, GameID, GameString } from '../Types/Game.js'; test('Invalid Guild Type', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - // eslint-disable-next-line @typescript-eslint/ban-ts-comment + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error await expect(() => client.getGuild('invalid', 'invalid')).rejects.toThrowError(Errors.INVALID_GUILD_SEARCH_PARAMETER); client.destroy(); @@ -21,6 +21,7 @@ test('Invalid Guild Type', async () => { test('Invalid Guild', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); await expect(() => client.getGuild('name', 'this guild dose not exist')).rejects.toThrowError( Errors.GUILD_DOES_NOT_EXIST ); @@ -29,13 +30,14 @@ test('Invalid Guild', async () => { test('Invalid Guild ID', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); await expect(() => client.getGuild('id', 'invalid guild id')).rejects.toThrowError(Errors.INVALID_GUILD_ID); client.destroy(); }); test('No Guild Query', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - // eslint-disable-next-line @typescript-eslint/ban-ts-comment + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error await expect(() => client.getGuild('id')).rejects.toThrowError(Errors.NO_GUILD_QUERY); client.destroy(); @@ -43,6 +45,7 @@ test('No Guild Query', async () => { test('User not in a guild', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getGuild('player', '37501e7512b845ab8796e2baf9e9677a'); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); @@ -51,6 +54,7 @@ test('User not in a guild', async () => { test('getGuild (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getGuild('name', 'Pixelic', { raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -62,6 +66,7 @@ test('getGuild (raw)', async () => { test('getGuild (Name)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getGuild('name', 'Pixelic'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(Guild); @@ -246,6 +251,7 @@ test('getGuild (Name)', async () => { test('getGuild (Id)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getGuild('id', '64b54f9d8ea8c96aaedafe84'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(Guild); @@ -430,6 +436,7 @@ test('getGuild (Id)', async () => { test('getGuild (Player)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getGuild('player', '14727faefbdc4aff848cd2713eb9939e'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(Guild); diff --git a/src/API/getGuildAchievements.test.ts b/src/API/getGuildAchievements.test.ts index 5d42f486d..95b2eb502 100644 --- a/src/API/getGuildAchievements.test.ts +++ b/src/API/getGuildAchievements.test.ts @@ -8,6 +8,7 @@ import type { AchievementTier } from '../Types/Static.js'; test('getGuildAchievements (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getGuildAchievements({ raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -19,6 +20,7 @@ test('getGuildAchievements (raw)', async () => { test('getGuildAchievements', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getGuildAchievements(); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); diff --git a/src/API/getHouse.test.ts b/src/API/getHouse.test.ts index 9aa1a2d88..f3b0d5d29 100644 --- a/src/API/getHouse.test.ts +++ b/src/API/getHouse.test.ts @@ -6,6 +6,7 @@ import { expect, expectTypeOf, test } from 'vitest'; test('getHouse (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const houses = (await client.getActiveHouses()) as House[]; if (undefined === houses[0]) return; const data = await client.getHouse(houses[0].uuid, { raw: true }); @@ -18,6 +19,7 @@ test('getHouse (raw)', async () => { test('getHouse (no input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error await expect(() => client.getHouse()).rejects.toThrowError(Errors.NO_UUID); @@ -26,6 +28,7 @@ test('getHouse (no input)', async () => { test('getHouse', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const houses = (await client.getActiveHouses()) as House[]; if (undefined === houses[0]) return; expect(houses).toBeDefined(); diff --git a/src/API/getLeaderboards.test.ts b/src/API/getLeaderboards.test.ts index 04421dc45..6966fa08b 100644 --- a/src/API/getLeaderboards.test.ts +++ b/src/API/getLeaderboards.test.ts @@ -8,6 +8,7 @@ import type { WithRaw } from '../Types/API.js'; test('getLeaderboards (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getLeaderboards({ raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -18,6 +19,7 @@ test('getLeaderboards (raw)', async () => { test('getLeaderboards', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getLeaderboards(); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf> | RequestData>(); @@ -57,6 +59,7 @@ test('getLeaderboards', async () => { test('getLeaderboards (Missing Data)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? ''); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); vi.spyOn(global, 'fetch').mockResolvedValue({ ...defaultRequestData, json: () => Promise.resolve({ success: true }) diff --git a/src/API/getPlayerHouses.test.ts b/src/API/getPlayerHouses.test.ts index 4a53f053a..4bf3bfdef 100644 --- a/src/API/getPlayerHouses.test.ts +++ b/src/API/getPlayerHouses.test.ts @@ -7,6 +7,7 @@ import type { WithRaw } from '../Types/API.js'; test('getPlayerHouses (No input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error await expect(() => client.getPlayerHouses()).rejects.toThrowError(Errors.NO_NICKNAME_UUID); @@ -15,6 +16,7 @@ test('getPlayerHouses (No input)', async () => { test('getPlayerHouses (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getPlayerHouses('69e04609da2a4e7dabb83546a971969e', { raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -25,6 +27,7 @@ test('getPlayerHouses (raw)', async () => { test('getPlayerHouses', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getPlayerHouses('69e04609da2a4e7dabb83546a971969e'); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf | RequestData>(); diff --git a/src/API/getQuests.test.ts b/src/API/getQuests.test.ts index ad5c92288..80bc70a92 100644 --- a/src/API/getQuests.test.ts +++ b/src/API/getQuests.test.ts @@ -9,6 +9,7 @@ import type { QuestReward, QuestType } from '../Types/Static.js'; test('getQuests (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getQuests({ raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -19,6 +20,7 @@ test('getQuests (raw)', async () => { test('getQuests', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getQuests(); expect(data).toBeDefined(); expect(data).toBeInstanceOf(Quests); diff --git a/src/API/getRecentGames.test.ts b/src/API/getRecentGames.test.ts index ccffb9268..95448ecfa 100644 --- a/src/API/getRecentGames.test.ts +++ b/src/API/getRecentGames.test.ts @@ -8,6 +8,7 @@ import type { WithRaw } from '../Types/API.js'; test('getRecentGames (no input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error await expect(() => client.getRecentGames()).rejects.toThrowError(Errors.NO_NICKNAME_UUID); @@ -16,6 +17,7 @@ test('getRecentGames (no input)', async () => { test('getRecentGames (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getRecentGames('3b76b69ae5134296a730ed49171ad6f8', { raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -26,6 +28,7 @@ test('getRecentGames (raw)', async () => { test('getRecentGames', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getRecentGames('ea805d40e8284d8d8e64e9fc8ac301ca'); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf | RequestData>(); diff --git a/src/API/getSkyBlockAuction.test.ts b/src/API/getSkyBlockAuction.test.ts index 7b1cd3d2f..1987ea88c 100644 --- a/src/API/getSkyBlockAuction.test.ts +++ b/src/API/getSkyBlockAuction.test.ts @@ -8,6 +8,7 @@ import type { SkyBlockAuctionResult } from '../Types/API.js'; test('getSkyBlockAuction (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const auctions = await client.getSkyBlockAuctions(1); if (auctions.isRaw()) return; if (undefined === auctions.auctions[0]) return; @@ -22,6 +23,7 @@ test('getSkyBlockAuction (raw)', async () => { test('getSkyBlockAuction (No Type Input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error await expect(() => client.getSkyBlockAuction()).rejects.toThrowError(Errors.BAD_AUCTION_FILTER); @@ -30,6 +32,7 @@ test('getSkyBlockAuction (No Type Input)', async () => { test('getSkyBlockAuction (Bad Type Input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error await expect(() => client.getSkyBlockAuction('meow', 'meow')).rejects.toThrowError(Errors.BAD_AUCTION_FILTER); @@ -38,6 +41,7 @@ test('getSkyBlockAuction (Bad Type Input)', async () => { test('getSkyBlockAuction (No Query Input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error await expect(() => client.getSkyBlockAuction('AUCTION_ID')).rejects.toThrowError(Errors.NO_UUID); @@ -46,6 +50,7 @@ test('getSkyBlockAuction (No Query Input)', async () => { test('getSkyBlockAuction (PROFILE)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const auctions = await client.getSkyBlockAuctions(1); if (auctions.isRaw()) return; if (undefined === auctions.auctions[0]) return; @@ -64,6 +69,7 @@ test('getSkyBlockAuction (PROFILE)', async () => { test('getSkyBlockAuction (PLAYER)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const auctions = await client.getSkyBlockAuctions(1); if (auctions.isRaw()) return; if (undefined === auctions.auctions[0]) return; diff --git a/src/API/getSkyBlockAuctions.test.ts b/src/API/getSkyBlockAuctions.test.ts index 5216e19db..65c826654 100644 --- a/src/API/getSkyBlockAuctions.test.ts +++ b/src/API/getSkyBlockAuctions.test.ts @@ -8,6 +8,7 @@ import type { SkyBlockAuctionsResult } from '../Types/API.js'; test('getSkyBlockAuctions (No Input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error await expect(() => client.getSkyBlockAuctions()).rejects.toThrowError(Errors.INVALID_OPTION_VALUE); @@ -16,18 +17,21 @@ test('getSkyBlockAuctions (No Input)', async () => { test('getSkyBlockAuctions (Negative Input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); await expect(() => client.getSkyBlockAuctions(-1)).rejects.toThrowError(Errors.INVALID_OPTION_VALUE); client.destroy(); }); test('getSkyBlockAuctions (Page 0)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); await expect(() => client.getSkyBlockAuctions(0)).rejects.toThrowError(Errors.INVALID_OPTION_VALUE); client.destroy(); }); test('getSkyBlockAuctions (String Input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error await expect(() => client.getSkyBlockAuctions('hi')).rejects.toThrowError(Errors.INVALID_OPTION_VALUE); @@ -36,6 +40,7 @@ test('getSkyBlockAuctions (String Input)', async () => { test('getSkyBlockAuctions (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockAuctions(1, { raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -46,6 +51,7 @@ test('getSkyBlockAuctions (raw)', async () => { test('getSkyBlockAuctions (One Page)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockAuctions(1); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); @@ -60,6 +66,7 @@ test('getSkyBlockAuctions (One Page)', async () => { test('getSkyBlockAuctions (All Pages)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockAuctions('*'); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); diff --git a/src/API/getSkyBlockBazaar.test.ts b/src/API/getSkyBlockBazaar.test.ts index 742f3f9ac..4bb9a51b4 100644 --- a/src/API/getSkyBlockBazaar.test.ts +++ b/src/API/getSkyBlockBazaar.test.ts @@ -6,6 +6,7 @@ import type SkyBlockBazaarProduct from '../Structures/SkyBlock/Bazaar/SkyBlockBa test('getSkyBlockBazaar (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockBazaar({ raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -16,6 +17,7 @@ test('getSkyBlockBazaar (raw)', async () => { test('getSkyBlockBazaar', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockBazaar(); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); diff --git a/src/API/getSkyBlockBingo.test.ts b/src/API/getSkyBlockBingo.test.ts index a68078a6a..72419513d 100644 --- a/src/API/getSkyBlockBingo.test.ts +++ b/src/API/getSkyBlockBingo.test.ts @@ -6,6 +6,7 @@ import type SkyBlockBingoGoal from '../Structures/SkyBlock/Bingo/SkyBlockBingoGo test('getSkyBlockBingo (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockBingo({ raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -16,6 +17,7 @@ test('getSkyBlockBingo (raw)', async () => { test('getSkyBlockBingo', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockBingo(); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); diff --git a/src/API/getSkyBlockCollections.test.ts b/src/API/getSkyBlockCollections.test.ts index c643c0469..42690d571 100644 --- a/src/API/getSkyBlockCollections.test.ts +++ b/src/API/getSkyBlockCollections.test.ts @@ -6,6 +6,7 @@ import { expect, expectTypeOf, test } from 'vitest'; test('getSkyBlockCollections (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockCollections({ raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -16,6 +17,7 @@ test('getSkyBlockCollections (raw)', async () => { test('getSkyBlockCollections', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockCollections(); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); diff --git a/src/API/getSkyBlockElection.test.ts b/src/API/getSkyBlockElection.test.ts index e70268e90..c1a0f5f2d 100644 --- a/src/API/getSkyBlockElection.test.ts +++ b/src/API/getSkyBlockElection.test.ts @@ -6,6 +6,7 @@ import { expect, expectTypeOf, test } from 'vitest'; test('getSkyBlockElection (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockElection({ raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -16,6 +17,7 @@ test('getSkyBlockElection (raw)', async () => { test('getSkyBlockElection', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockElection(); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); diff --git a/src/API/getSkyBlockEndedAuctions.test.ts b/src/API/getSkyBlockEndedAuctions.test.ts index 32b7b95fa..fc42c663c 100644 --- a/src/API/getSkyBlockEndedAuctions.test.ts +++ b/src/API/getSkyBlockEndedAuctions.test.ts @@ -7,6 +7,7 @@ import type { SkyBlockAuctionResult } from '../Types/API.js'; test('getSkyBlockEndedAuctions (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockEndedAuctions({ raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -17,6 +18,7 @@ test('getSkyBlockEndedAuctions (raw)', async () => { test('getSkyBlockEndedAuctions', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockEndedAuctions(); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); diff --git a/src/API/getSkyBlockFireSales.test.ts b/src/API/getSkyBlockFireSales.test.ts index d53aeb54d..5178eb802 100644 --- a/src/API/getSkyBlockFireSales.test.ts +++ b/src/API/getSkyBlockFireSales.test.ts @@ -7,6 +7,7 @@ import type { WithRaw } from '../Types/API.js'; test('getSkyBlockFireSales (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockFireSales({ raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -17,6 +18,7 @@ test('getSkyBlockFireSales (raw)', async () => { test('getSkyBlockFireSales', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); vi.spyOn(global, 'fetch').mockResolvedValue({ ...defaultRequestData, json: () => diff --git a/src/API/getSkyBlockGarden.test.ts b/src/API/getSkyBlockGarden.test.ts index f601ff04b..f07a246f0 100644 --- a/src/API/getSkyBlockGarden.test.ts +++ b/src/API/getSkyBlockGarden.test.ts @@ -12,6 +12,7 @@ import type { BarnPlot, BarnSkin, SkillLevelData } from '../Types/SkyBlock.js'; test('getSkyBlockGarden (no input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error await expect(() => client.getSkyBlockGarden()).rejects.toThrowError(Errors.NO_UUID); @@ -20,6 +21,7 @@ test('getSkyBlockGarden (no input)', async () => { test('getSkyBlockGarden (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockGarden('ed9b9d6d-d9b7-43b1-9841-5d0c20b55494', { raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -29,6 +31,7 @@ test('getSkyBlockGarden (raw)', async () => { test('getSkyBlockGarden', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockGarden('ed9b9d6d-d9b7-43b1-9841-5d0c20b55494'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockGarden); diff --git a/src/API/getSkyBlockItems.test.ts b/src/API/getSkyBlockItems.test.ts index cbaddcd01..4684d64ff 100644 --- a/src/API/getSkyBlockItems.test.ts +++ b/src/API/getSkyBlockItems.test.ts @@ -6,6 +6,7 @@ import type { WithRaw } from '../Types/API.js'; test('getSkyBlockItems (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockItems({ raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -16,6 +17,7 @@ test('getSkyBlockItems (raw)', async () => { test('getSkyBlockItems', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockItems(); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf | RequestData>(); diff --git a/src/API/getSkyBlockMuseum.test.ts b/src/API/getSkyBlockMuseum.test.ts index 7a6cad78a..6301958a5 100644 --- a/src/API/getSkyBlockMuseum.test.ts +++ b/src/API/getSkyBlockMuseum.test.ts @@ -8,6 +8,7 @@ import type { UUID } from '../Types/Global.js'; test('getSkyBlockMuseum (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockMuseum('63fe6f4c-4b06-43b2-abd0-2d15dc303e41', { raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -18,6 +19,7 @@ test('getSkyBlockMuseum (raw)', async () => { test('getSkyBlockMuseum (No input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error await expect(() => client.getSkyBlockMuseum()).rejects.toThrowError(Errors.NO_UUID); @@ -26,6 +28,7 @@ test('getSkyBlockMuseum (No input)', async () => { test('getSkyBlockMuseum', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockMuseum('63fe6f4c-4b06-43b2-abd0-2d15dc303e41'); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); diff --git a/src/API/getSkyBlockNews.test.ts b/src/API/getSkyBlockNews.test.ts index 151ded4c2..ec1986933 100644 --- a/src/API/getSkyBlockNews.test.ts +++ b/src/API/getSkyBlockNews.test.ts @@ -6,6 +6,7 @@ import type { WithRaw } from '../Types/API.js'; test('getSkyBlockNews (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockNews({ raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -16,6 +17,7 @@ test('getSkyBlockNews (raw)', async () => { test('getSkyBlockNews', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockNews(); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf | RequestData>(); diff --git a/src/API/getSkyBlockProfile.test.ts b/src/API/getSkyBlockProfile.test.ts index 77d4469bf..48c28dad3 100644 --- a/src/API/getSkyBlockProfile.test.ts +++ b/src/API/getSkyBlockProfile.test.ts @@ -13,6 +13,7 @@ import type { SkyBlockProfileName, SkyBlockProfileType } from '../Types/SkyBlock test('getSkyBlockProfile (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockProfile('14727faefbdc4aff848cd2713eb9939e', { raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -23,6 +24,7 @@ test('getSkyBlockProfile (raw)', async () => { test('getSkyBlockProfile (no input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error await expect(() => client.getSkyBlockProfile()).rejects.toThrowError(Errors.NO_UUID); @@ -31,6 +33,7 @@ test('getSkyBlockProfile (no input)', async () => { test('getSkyBlockProfile (no profiles)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); await expect(() => client.getSkyBlockProfile('ce6685dd-78dd-4418-9f6f-b01cf9778daa')).rejects.toThrowError( Errors.NO_SKYBLOCK_PROFILES ); @@ -39,6 +42,7 @@ test('getSkyBlockProfile (no profiles)', async () => { test('getSkyBlockProfile', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockProfile('ed9b9d6d-d9b7-43b1-9841-5d0c20b55494'); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); diff --git a/src/API/getSkyBlockProfiles.test.ts b/src/API/getSkyBlockProfiles.test.ts index fee858ca6..80fe84edd 100644 --- a/src/API/getSkyBlockProfiles.test.ts +++ b/src/API/getSkyBlockProfiles.test.ts @@ -10,10 +10,11 @@ import SkyBlockProfileCommunityUpgrades from '../Structures/SkyBlock/Profile/Com import { expect, expectTypeOf, test } from 'vitest'; import type { SkyBlockProfileName, SkyBlockProfileType } from '../Types/SkyBlock.js'; import type { WithSelectedProfile } from '../Types/API.js'; -/* eslint-enable @stylistic/max-len */ +/* eslint-enable @stylistic/max-len */ test('getSkyBlockProfiles (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockProfiles('14727faefbdc4aff848cd2713eb9939e', { raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -26,6 +27,7 @@ test('getSkyBlockProfiles (raw)', async () => { test('getSkyBlockProfiles (no input)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error await expect(() => client.getSkyBlockProfiles()).rejects.toThrowError(Errors.NO_NICKNAME_UUID); @@ -34,6 +36,7 @@ test('getSkyBlockProfiles (no input)', async () => { test('getSkyBlockProfiles (no profiles)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); await expect(() => client.getSkyBlockProfiles('b491990d53fd4c5fa61e19d58cc7eddf')).rejects.toThrowError( Errors.NO_SKYBLOCK_PROFILES ); @@ -42,6 +45,7 @@ test('getSkyBlockProfiles (no profiles)', async () => { test('getSkyBlockProfiles', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockProfiles('14727faefbdc4aff848cd2713eb9939e'); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf< diff --git a/src/API/getSkyBlockSkills.test.ts b/src/API/getSkyBlockSkills.test.ts index 80ba3f246..4a671e28d 100644 --- a/src/API/getSkyBlockSkills.test.ts +++ b/src/API/getSkyBlockSkills.test.ts @@ -6,6 +6,7 @@ import { expect, expectTypeOf, test } from 'vitest'; test('getSkyBlockSkills (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockSkills({ raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -16,6 +17,7 @@ test('getSkyBlockSkills (raw)', async () => { test('getSkyBlockSkills', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getSkyBlockSkills(); expect(data).toBeDefined(); expectTypeOf(data).toEqualTypeOf(); diff --git a/src/API/getStatus.test.ts b/src/API/getStatus.test.ts index 57dd438ab..d3c143207 100644 --- a/src/API/getStatus.test.ts +++ b/src/API/getStatus.test.ts @@ -7,6 +7,7 @@ import type { GameCode, GameID, GameString } from '../Types/Game.js'; test('getStatus (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getStatus('4982eac19ae7422891b61a17a74c87a2', { raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -17,6 +18,7 @@ test('getStatus (raw)', async () => { test('getStatus', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getStatus('370d6421b761456fadf28c43fe5c4bcf'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(Status); diff --git a/src/API/getWatchdogStats.test.ts b/src/API/getWatchdogStats.test.ts index 912f6736b..bee815fc8 100644 --- a/src/API/getWatchdogStats.test.ts +++ b/src/API/getWatchdogStats.test.ts @@ -5,6 +5,7 @@ import { expect, expectTypeOf, test } from 'vitest'; test('getWatchdogStats (raw)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getWatchdogStats({ raw: true }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(RequestData); @@ -15,6 +16,7 @@ test('getWatchdogStats (raw)', async () => { test('getWatchdogStats', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getWatchdogStats(); expect(data).toBeDefined(); expect(data).toBeInstanceOf(WatchdogStats); diff --git a/src/Errors.ts b/src/Errors.ts index d40d1cd7c..eade9b6c4 100644 --- a/src/Errors.ts +++ b/src/Errors.ts @@ -41,6 +41,8 @@ class Errors { '[hypixel-api-reborn] An error happened whilst initializing rate limit. We strongly recommend restarting the code as this can lead to de-synchronization.'; static ENDPOINT_NOT_LOADED: string = '[hypixel-api-reborn] This endpoint has not been loaded yet. Please restart your code'; + static INVALID_BASE_URL: string = '[Hypixel-API-Reborn] Invalid Request URL.'; + static INVALID_BASE_URL_SLASH: string = "[Hypixel-API-Reborn] Invalid Request URL. Please don't end with a /"; } export default Errors; diff --git a/src/Private/CacheHandler.test.ts b/src/Private/CacheHandler.test.ts index fe110babf..8f5699520 100644 --- a/src/Private/CacheHandler.test.ts +++ b/src/Private/CacheHandler.test.ts @@ -5,6 +5,7 @@ import { expect, expectTypeOf, test } from 'vitest'; test('CacheHandler', () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); expect(client).toBeDefined(); expectTypeOf(client).toEqualTypeOf(); diff --git a/src/Private/Endpoint.test.ts b/src/Private/Endpoint.test.ts index 38fbeeba3..51ddd217a 100644 --- a/src/Private/Endpoint.test.ts +++ b/src/Private/Endpoint.test.ts @@ -5,6 +5,7 @@ import { expect, expectTypeOf, test } from 'vitest'; test('Endpoint', () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); expect(client).toBeDefined(); expectTypeOf(client).toEqualTypeOf(); diff --git a/src/Private/Functions.test.ts b/src/Private/Functions.test.ts index f2ca53401..610569505 100644 --- a/src/Private/Functions.test.ts +++ b/src/Private/Functions.test.ts @@ -4,6 +4,7 @@ import { expect, expectTypeOf, test } from 'vitest'; test('Functions', () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); expect(client).toBeDefined(); expectTypeOf(client).toEqualTypeOf(); expect(client.functions).toBeDefined(); @@ -51,4 +52,6 @@ test('Functions', () => { expect(client.functions.isGuildID(id)).toBe(false); expectTypeOf(client.functions.isGuildID(id)).toBeBoolean(); }); + + client.destroy(); }); diff --git a/src/Private/RateLimit.test.ts b/src/Private/RateLimit.test.ts index 3280fd7c7..a57dc4e45 100644 --- a/src/Private/RateLimit.test.ts +++ b/src/Private/RateLimit.test.ts @@ -6,6 +6,7 @@ import { expect, expectTypeOf, test, vi } from 'vitest'; test('RateLimit (None)', () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); expect(client).toBeDefined(); expectTypeOf(client).toEqualTypeOf(); @@ -36,8 +37,7 @@ test('RateLimit (None)', () => { test('RateLimit (Auto)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { rateLimit: 'NONE' }); - expect(client).toBeDefined(); - expectTypeOf(client).toEqualTypeOf(); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); expect(client.rateLimit).toBeDefined(); expectTypeOf(client.rateLimit).toEqualTypeOf(); @@ -67,6 +67,7 @@ test('RateLimit (Auto)', async () => { test('Ratelimit (Sync)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? ''); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); client.updater.currentVersion = '1.0.0'; vi.spyOn(global, 'fetch').mockResolvedValue({ ...defaultRequestData, @@ -82,6 +83,7 @@ test('Ratelimit (Sync)', async () => { test('Ratelimit (Bad Sync Data)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? ''); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); client.updater.currentVersion = '1.0.0'; vi.spyOn(global, 'fetch').mockResolvedValue({ ...defaultRequestData, headers: new Headers({ hello: '100' }) } as any); await expect(() => client.rateLimit.sync()).rejects.toThrowError(Errors.RATE_LIMIT_INIT_ERROR); diff --git a/src/Private/RequestHandler.test.ts b/src/Private/RequestHandler.test.ts index 8336e45ee..b15afa17f 100644 --- a/src/Private/RequestHandler.test.ts +++ b/src/Private/RequestHandler.test.ts @@ -6,9 +6,7 @@ import { expect, expectTypeOf, test, vi } from 'vitest'; test('RequestHandler', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - expect(client).toBeDefined(); - expectTypeOf(client).toEqualTypeOf(); - + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); expect(client.requestHandler).toBeDefined(); expectTypeOf(client.requestHandler).toEqualTypeOf(); @@ -28,6 +26,7 @@ test('RequestHandler', async () => { test('RequestHandler (Invalid API Key)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); expect(client.requestHandler.request).toBeDefined(); expectTypeOf(client.requestHandler.request).toBeFunction(); vi.spyOn(global, 'fetch').mockResolvedValue({ @@ -42,6 +41,7 @@ test('RequestHandler (Invalid API Key)', async () => { test('RequestHandler (400 Bad Request)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); expect(client.requestHandler.request).toBeDefined(); expectTypeOf(client.requestHandler.request).toBeFunction(); vi.spyOn(global, 'fetch').mockResolvedValue({ @@ -58,6 +58,7 @@ test('RequestHandler (400 Bad Request)', async () => { test('RequestHandler (400 Bad Request No Cause)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); expect(client.requestHandler.request).toBeDefined(); expectTypeOf(client.requestHandler.request).toBeFunction(); vi.spyOn(global, 'fetch').mockResolvedValue({ @@ -74,6 +75,7 @@ test('RequestHandler (400 Bad Request No Cause)', async () => { test('RequestHandler (Unprocessable Entity)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); expect(client.requestHandler.request).toBeDefined(); expectTypeOf(client.requestHandler.request).toBeFunction(); vi.spyOn(global, 'fetch').mockResolvedValue({ @@ -88,6 +90,7 @@ test('RequestHandler (Unprocessable Entity)', async () => { test('RequestHandler (Rate Limited)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); expect(client.requestHandler.request).toBeDefined(); expectTypeOf(client.requestHandler.request).toBeFunction(); vi.spyOn(global, 'fetch').mockResolvedValue({ diff --git a/src/Private/RequestHandler.ts b/src/Private/RequestHandler.ts index 2cc864590..81afb56b1 100644 --- a/src/Private/RequestHandler.ts +++ b/src/Private/RequestHandler.ts @@ -1,4 +1,3 @@ -const BASE_URL = 'https://api.hypixel.net/v2'; import Client from '../Client.js'; import Errors from '../Errors.ts'; import RequestData from './RequestData.js'; @@ -6,8 +5,25 @@ import type { RequestOptions } from '../Types/Requests.js'; class RequestHandler { readonly client: Client; + private BASE_URL: string; constructor(client: Client) { this.client = client; + this.BASE_URL = 'https://api.hypixel.net/v2'; + } + + setBaseURL(url: string = 'https://api.hypixel.net/v2'): this { + if ( + !url.startsWith('http') || + !url.includes('://') || + (url.includes('.') && url.includes(':')) || + (!url.includes('.') && !url.includes(':')) + ) { + throw new Error(Errors.INVALID_BASE_URL); + } + + if (url.endsWith('/')) throw new Error(Errors.INVALID_BASE_URL_SLASH); + this.BASE_URL = url; + return this; } async request(endpoint: string, options?: RequestOptions): Promise { @@ -22,7 +38,7 @@ class RequestHandler { timestamp: data.timestamp }); } - const res = await fetch(BASE_URL + endpoint, { headers: { 'API-Key': this.client.key } }); + const res = await fetch(this.BASE_URL + endpoint, { headers: { 'API-Key': this.client.key } }); if (res.status >= 500 && res.status < 528) { throw new Error( Errors.ERROR_STATUSTEXT.replace(/{statustext}/, `Server Error : ${res.status} ${res.statusText}`) diff --git a/src/Private/Updater.test.ts b/src/Private/Updater.test.ts index 0b447def3..8324aaa11 100644 --- a/src/Private/Updater.test.ts +++ b/src/Private/Updater.test.ts @@ -8,6 +8,7 @@ import { vi } from 'vitest'; test('Updater', () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); expect(client).toBeDefined(); expectTypeOf(client).toEqualTypeOf(); @@ -38,6 +39,7 @@ test('Updater', () => { test('Updater (getLatestVersion)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); vi.spyOn(global, 'fetch').mockResolvedValue({ ...defaultRequestData, json: () => Promise.resolve({ 'dist-tags': { latest: '1.0.0' } }) @@ -50,6 +52,7 @@ test('Updater (getLatestVersion)', async () => { test('Updater (getLatestVersion error)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); vi.spyOn(global, 'fetch').mockResolvedValue({ ...defaultRequestData, status: 404, @@ -62,6 +65,7 @@ test('Updater (getLatestVersion error)', async () => { test('Updater (check version)', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const consoleLogSpy = vi.spyOn(console, 'log'); client.updater.currentVersion = '1.0.0'; vi.spyOn(global, 'fetch').mockResolvedValue({ diff --git a/src/Structures/MiniGames/Pit/Pit.test.ts b/src/Structures/MiniGames/Pit/Pit.test.ts index c3e240b87..669bcdc1d 100644 --- a/src/Structures/MiniGames/Pit/Pit.test.ts +++ b/src/Structures/MiniGames/Pit/Pit.test.ts @@ -89,6 +89,7 @@ test('Pit', () => { test('Pit Inventory', async () => { const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); + client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); const data = await client.getPlayer('3457688aa57c4d71ab9d22b04f9160db'); expect(data.isRaw()).toBe(false); if (data.isRaw()) return; @@ -218,4 +219,5 @@ test('Pit Inventory', async () => { expect(pitArmor.boots.extraAttributes).toBeDefined(); expectTypeOf(pitArmor.boots.extraAttributes).toEqualTypeOf(); } + client.destroy(); }); diff --git a/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.test.ts b/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.test.ts index 6276e8d30..cc990293b 100644 --- a/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.test.ts +++ b/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.test.ts @@ -32,7 +32,7 @@ test('SkyBlockMemberInventories', () => { Object.keys(data.sacksCounts).forEach((item) => { expect(data.sacksCounts[item]).toBeDefined(); expect(data.sacksCounts[item]).toBeGreaterThanOrEqual(0); - expectTypeOf(data.sacksCounts[item]).toEqualTypeOf(); + expectTypeOf(data.sacksCounts[item]).toEqualTypeOf(); }); expect(data.candy).toBeDefined(); expectTypeOf(data.candy).toEqualTypeOf(); From 1462d3a09b5a13a7a91ed91796b54fa3554485aa Mon Sep 17 00:00:00 2001 From: Jacob Date: Sun, 26 Oct 2025 21:44:59 +0800 Subject: [PATCH 073/124] refactor(WithSelectedProfile) --- src/Types/API.ts | 6 ++---- src/Types/SkyBlock.ts | 3 +++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Types/API.ts b/src/Types/API.ts index 9e400b376..b0733a478 100644 --- a/src/Types/API.ts +++ b/src/Types/API.ts @@ -4,8 +4,8 @@ import type RequestData from '../Private/RequestData.ts'; import type SkyBlockAuction from '../Structures/SkyBlock/Auctions/SkyBlockAuction.js'; import type SkyBlockAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockAuctionInfo.js'; import type SkyBlockBaseAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.js'; -import type SkyBlockProfile from '../Structures/SkyBlock/Profile/SkyBlockProfile.ts'; import type { RequestOptions } from './Requests.js'; +import type { SkyblockProfileWithMe } from './SkyBlock.ts'; export interface PlayerRequestOptions extends RequestOptions { guild?: boolean; @@ -34,9 +34,7 @@ export interface SkyBlockAuctionsResult { isRaw(): this is RequestData; } export type WithRaw = T & { isRaw(): this is RequestData }; -export type WithSelectedProfile = WithRaw & { - selectedProfile?: SkyBlockProfile & { me: NonNullable }; -}; +export type WithSelectedProfile = WithRaw & { selectedProfile?: SkyblockProfileWithMe }; export type GuildFetchOptions = 'id' | 'name' | 'player'; export type AuctionFetchOptions = 'PROFILE' | 'PLAYER' | 'AUCTION_ID'; diff --git a/src/Types/SkyBlock.ts b/src/Types/SkyBlock.ts index 6af19f98f..007c789d2 100644 --- a/src/Types/SkyBlock.ts +++ b/src/Types/SkyBlock.ts @@ -2,6 +2,7 @@ import type SkyBlockMemberLeveling from '../Structures/SkyBlock/Member/SkyBlockMemberLeveling.ts'; import type SkyBlockMemberPlayerData from '../Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerData.ts'; +import type SkyBlockProfile from '../Structures/SkyBlock/Profile/SkyBlockProfile.ts'; import type { SortName } from './Global.js'; export interface RawAbiphoneData { @@ -3624,3 +3625,5 @@ export interface SkyHelperNetWorthProfile { pets_data: SkyHelperNetWorthProfilePetsData; sacks_counts: Record; } + +export type SkyblockProfileWithMe = SkyBlockProfile & { me: NonNullable }; From 42581420de3bec3df082793d44ba5e250424b576 Mon Sep 17 00:00:00 2001 From: Jacob Date: Sun, 26 Oct 2025 21:45:15 +0800 Subject: [PATCH 074/124] feat(RequestHandler): noCacheCheck --- src/Private/RequestHandler.ts | 8 ++++++-- src/Types/Requests.ts | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Private/RequestHandler.ts b/src/Private/RequestHandler.ts index 81afb56b1..db83bc9ac 100644 --- a/src/Private/RequestHandler.ts +++ b/src/Private/RequestHandler.ts @@ -27,8 +27,12 @@ class RequestHandler { } async request(endpoint: string, options?: RequestOptions): Promise { - options = { raw: options?.raw ?? false, noCache: options?.noCache ?? false }; - if (this.client.cacheHandler.has(endpoint)) { + options = { + raw: options?.raw ?? false, + noCache: options?.noCache ?? false, + noCacheCheck: options?.noCacheCheck ?? false + }; + if (options.noCacheCheck && this.client.cacheHandler.has(endpoint)) { const data = this.client.cacheHandler.get(endpoint); return new RequestData(data.data, data.headers, { status: 200, diff --git a/src/Types/Requests.ts b/src/Types/Requests.ts index cc95a8304..0ba337f3b 100644 --- a/src/Types/Requests.ts +++ b/src/Types/Requests.ts @@ -3,4 +3,5 @@ export interface RequestOptions { raw?: boolean; noCache?: boolean; + noCacheCheck?: boolean; } From dfb5e22ebfe084b63b08924d94760029a8ebcbdd Mon Sep 17 00:00:00 2001 From: Jacob Date: Sun, 26 Oct 2025 21:55:14 +0800 Subject: [PATCH 075/124] Release 12.0.0-16 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7a888afcf..ea2663575 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hypixel-api-reborn", - "version": "12.0.0-15", + "version": "12.0.0-16", "description": "Feature-rich Hypixel API wrapper for Node.js", "main": "dist/index.js", "types": "dist/index.d.ts", From 948765bb5715f11bdea966a0df08f74d11bc5da5 Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 29 Oct 2025 18:23:32 +0800 Subject: [PATCH 076/124] refactor(BuildBattle) Co-authored-by: aidn5 --- src/Structures/MiniGames/BuildBattle.test.ts | 44 - src/Structures/MiniGames/BuildBattle.ts | 30 - .../MiniGames/BuildBattle/BuildBattle.ts | 110 ++ .../BuildBattle/BuildBattleLastWin.ts | 16 + .../BuildBattleLeaderboardSettings.ts | 15 + .../MiniGames/BuildBattle/BuildBattleVotes.ts | 1246 +++++++++++++++++ .../BuildBattle/Emblem/BuildBattleEmblem.ts | 16 + .../Emblem/BuildBattleEmblemColors.ts | 34 + src/Structures/Player/PlayerStats.test.ts | 2 +- src/Structures/Player/PlayerStats.ts | 2 +- src/Types/Player.ts | 409 +++++- src/Utils/Constants.ts | 24 +- src/index.ts | 17 +- 13 files changed, 1880 insertions(+), 85 deletions(-) delete mode 100644 src/Structures/MiniGames/BuildBattle.test.ts delete mode 100644 src/Structures/MiniGames/BuildBattle.ts create mode 100644 src/Structures/MiniGames/BuildBattle/BuildBattle.ts create mode 100644 src/Structures/MiniGames/BuildBattle/BuildBattleLastWin.ts create mode 100644 src/Structures/MiniGames/BuildBattle/BuildBattleLeaderboardSettings.ts create mode 100644 src/Structures/MiniGames/BuildBattle/BuildBattleVotes.ts create mode 100644 src/Structures/MiniGames/BuildBattle/Emblem/BuildBattleEmblem.ts create mode 100644 src/Structures/MiniGames/BuildBattle/Emblem/BuildBattleEmblemColors.ts diff --git a/src/Structures/MiniGames/BuildBattle.test.ts b/src/Structures/MiniGames/BuildBattle.test.ts deleted file mode 100644 index e202a7581..000000000 --- a/src/Structures/MiniGames/BuildBattle.test.ts +++ /dev/null @@ -1,44 +0,0 @@ -import BuildBattle from './BuildBattle.js'; -import { expect, expectTypeOf, test } from 'vitest'; -import type { BuildBattleWins } from '../../Types/Player.js'; - -test('BuildBattle', () => { - const data = new BuildBattle({ stats: 'meow' }); - expect(data).toBeInstanceOf(BuildBattle); - expectTypeOf(data).toEqualTypeOf(); - expect(data.score).toBeDefined(); - expect(data.score).toBeGreaterThanOrEqual(0); - expectTypeOf(data.score).toEqualTypeOf(); - expect(data.totalWins).toBeDefined(); - expect(data.totalWins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.totalWins).toEqualTypeOf(); - expect(data.games).toBeDefined(); - expect(data.games).toBeGreaterThanOrEqual(0); - expectTypeOf(data.games).toEqualTypeOf(); - expect(data.WLR).toBeDefined(); - expect(data.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.WLR).toEqualTypeOf(); - expect(data.superVotes).toBeDefined(); - expect(data.superVotes).toBeGreaterThanOrEqual(0); - expectTypeOf(data.superVotes).toEqualTypeOf(); - expect(data.coins).toBeDefined(); - expect(data.coins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.coins).toEqualTypeOf(); - expect(data.totalVotes).toBeDefined(); - expect(data.totalVotes).toBeGreaterThanOrEqual(0); - expectTypeOf(data.totalVotes).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.wins.solo).toBeDefined(); - expect(data.wins.solo).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins.solo).toEqualTypeOf(); - expect(data.wins.teams).toBeDefined(); - expect(data.wins.teams).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins.teams).toEqualTypeOf(); - expect(data.wins.pro).toBeDefined(); - expect(data.wins.pro).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins.pro).toEqualTypeOf(); - expect(data.wins.gtb).toBeDefined(); - expect(data.wins.gtb).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins.gtb).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/BuildBattle.ts b/src/Structures/MiniGames/BuildBattle.ts deleted file mode 100644 index 453379631..000000000 --- a/src/Structures/MiniGames/BuildBattle.ts +++ /dev/null @@ -1,30 +0,0 @@ -import Divide from '../../Utils/Divide.js'; -import type { BuildBattleWins } from '../../Types/Player.js'; - -class BuildBattle { - score: number; - totalWins: number; - games: number; - WLR: number; - superVotes: number; - coins: number; - totalVotes: number; - wins: BuildBattleWins; - constructor(data: Record) { - this.score = data?.score || 0; - this.totalWins = data?.wins || 0; - this.games = data?.games_played || 0; - this.WLR = Divide(this.totalWins, this.games); - this.superVotes = data?.super_votes || 0; - this.coins = data?.coins || data?.tokens || 0; - this.totalVotes = data?.total_votes || 0; - this.wins = { - solo: data?.wins_solo_normal || 0, - teams: data?.wins_teams_normal || 0, - pro: data?.wins_solo_pro || 0, - gtb: data?.wins_guess_the_build || 0 - }; - } -} - -export default BuildBattle; diff --git a/src/Structures/MiniGames/BuildBattle/BuildBattle.ts b/src/Structures/MiniGames/BuildBattle/BuildBattle.ts new file mode 100644 index 000000000..e7419c874 --- /dev/null +++ b/src/Structures/MiniGames/BuildBattle/BuildBattle.ts @@ -0,0 +1,110 @@ +import BuildBattleEmblem from './Emblem/BuildBattleEmblem.ts'; +import BuildBattleLastWin from './BuildBattleLastWin.js'; +import BuildBattleLeaderboardSettings from './BuildBattleLeaderboardSettings.js'; +import BuildBattleVotes from './BuildBattleVotes.js'; +import { BuildBattleTitleRequirements } from '../../../Utils/Constants.ts'; +import { monthAB } from '../../../Utils/Oscillation.ts'; +import type { + BuildBattleBackdrop, + BuildBattleHat, + BuildBattleIsland, + BuildBattleMovementTrail, + BuildBattlePackageItem, + BuildBattleShopSort, + BuildBattleSong, + BuildBattleSuit, + BuildBattleTitle, + BuildBattleVictoryDance +} from '../../../Types/Player.ts'; + +class BuildBattle { + activeIsland: BuildBattleIsland | 'island_none'; + activeMovementTrail: BuildBattleMovementTrail | 'movement_trail_none'; + correctGuesses: number; + emblem: BuildBattleEmblem; + playedGames: number; + lastPurchasedSong: BuildBattleSong | 'UNKNOWN'; + lastWon: BuildBattleLastWin; + leaderboardSettings: BuildBattleLeaderboardSettings; + loadout: string[]; + monthlyTokensA: number; + monthlyTokensB: number; + monthlyTokens: number; + music: boolean; + selectedHat: BuildBattleHat | 'hats_none'; + suit: BuildBattleSuit | 'suit_none'; + victoryDance: BuildBattleVictoryDance | 'victory_dance_none'; + packages: BuildBattlePackageItem[]; + score: number; + title: BuildBattleTitle; + selectedBackdrop: BuildBattleBackdrop | 'backdrops_none'; + shopSort: BuildBattleShopSort | 'UNKNOWN'; + shopSortEnableOwnedFirst: boolean; + soloMostPoints: number; + superVotes: number; + teamsMostPoints: number; + tokens: number; + totalVotes: number; + weeklyTokensA: number; + weeklyTokensB: number; + votes: BuildBattleVotes; + wins: number; + winsGuessTheBuild: number; + winsHalloween: number; + winsSoloNormal: number; + winsSoloPro: number; + winsSpeedBuilders: number; + winsTeamsNormal: number; + constructor(data: Record) { + this.activeIsland = data?.active_island || 'island_none'; + this.activeMovementTrail = data?.active_movement_trail || 'movement_trail_none'; + this.correctGuesses = data?.correct_guesses || 0; + this.emblem = new BuildBattleEmblem(data?.emblem || {}); + this.playedGames = data?.games_played || 0; + this.lastPurchasedSong = data?.last_purchased_song || 'UNKNOWN'; + this.lastWon = new BuildBattleLastWin(data?.last_won || {}); + this.leaderboardSettings = new BuildBattleLeaderboardSettings(data?.leaderboardSettings || {}); + this.loadout = data?.buildbattle_loadout || []; + this.monthlyTokensA = data?.monthly_tokens_a || data?.monthly_coins_a || 0; + this.monthlyTokensB = data?.monthly_tokens_b || data?.monthly_coins_b || 0; + this.monthlyTokens = data?.[`monthly_tokens_${monthAB()}`] || data?.[`monthly_coins_${monthAB()}`] || 0; + this.music = data?.music || true; + this.selectedHat = data?.new_selected_hat || 'hats_none'; + this.suit = data?.new_suit || 'suit_none'; + this.victoryDance = data?.new_victory_dance || 'victory_dance_none'; + this.packages = data?.packages || []; + this.score = data?.score || 0; + this.title = BuildBattle.getBuildBattleTitle(this.score); + this.selectedBackdrop = data?.selected_backdrop || 'backdrops_none'; + this.shopSort = data?.shop_sort || false; + this.shopSortEnableOwnedFirst = data?.shop_sort_enable_owned_first || false; + this.soloMostPoints = data?.solo_most_points || 0; + this.superVotes = data?.super_votes || 0; + this.teamsMostPoints = data?.teams_most_points || 0; + this.tokens = data?.tokens || data?.coins || 0; + this.totalVotes = data?.total_votes || 0; + this.weeklyTokensA = data?.weekly_tokens_a || data?.weekly_coins_a || 0; + this.weeklyTokensB = data?.weekly_tokens_b || data?.weekly_coins_b || 0; + this.monthlyTokens = data?.[`weekly_tokens_${monthAB()}`] || data?.[`weekly_coins_${monthAB()}`] || 0; + this.votes = new BuildBattleVotes(data); + this.wins = data?.wins || 0; + this.winsGuessTheBuild = data?.wins_guess_the_build || 0; + this.winsHalloween = data?.wins_halloween || 0; + this.winsSoloNormal = data?.wins_solo_normal || 0; + this.winsSoloPro = data?.wins_solo_pro || 0; + this.winsSpeedBuilders = data?.wins_speed_builders || 0; + this.winsTeamsNormal = data?.wins_teams_normal || 0; + } + + static getBuildBattleTitle(score: number): BuildBattleTitle { + return ( + ( + BuildBattleTitleRequirements.slice() + .reverse() + .find((t) => score >= t.requirement) || BuildBattleTitleRequirements[0] + )?.title || 'Rookie' + ); + } +} + +export default BuildBattle; diff --git a/src/Structures/MiniGames/BuildBattle/BuildBattleLastWin.ts b/src/Structures/MiniGames/BuildBattle/BuildBattleLastWin.ts new file mode 100644 index 000000000..5c0668aac --- /dev/null +++ b/src/Structures/MiniGames/BuildBattle/BuildBattleLastWin.ts @@ -0,0 +1,16 @@ +class BuildBattleLastWin { + guessTheBuildAt: Date | null; + soloNormalAt: Date | null; + soloProAt: Date | null; + speedBuildersAt: Date | null; + teamsNormalAt: Date | null; + constructor(data: Record) { + this.guessTheBuildAt = data?.GUESS_THE_BUILD ? new Date(data?.GUESS_THE_BUILD) : null; + this.soloNormalAt = data?.SOLO_NORMAL ? new Date(data?.SOLO_NORMAL) : null; + this.soloProAt = data?.SOLO_PRO ? new Date(data?.SOLO_PRO) : null; + this.speedBuildersAt = data?.SPEED_BUILDERS ? new Date(data?.SPEED_BUILDERS) : null; + this.teamsNormalAt = data?.TEAMS_NORMAL ? new Date(data?.TEAMS_NORMAL) : null; + } +} + +export default BuildBattleLastWin; diff --git a/src/Structures/MiniGames/BuildBattle/BuildBattleLeaderboardSettings.ts b/src/Structures/MiniGames/BuildBattle/BuildBattleLeaderboardSettings.ts new file mode 100644 index 000000000..9fcb213bd --- /dev/null +++ b/src/Structures/MiniGames/BuildBattle/BuildBattleLeaderboardSettings.ts @@ -0,0 +1,15 @@ +import type { + BuildBattleLeaderboardSettingsMode, + BuildBattleLeaderboardSettingsResetType +} from '../../../Types/Player.ts'; + +class BuildBattleLeaderboardSettings { + mode: BuildBattleLeaderboardSettingsMode | 'UNKNOWN'; + resetType: BuildBattleLeaderboardSettingsResetType | 'UNKNOWN'; + constructor(data: Record) { + this.mode = data?.mode || 'UNKNOWN'; + this.resetType = data?.resetType || 'UNKNOWN'; + } +} + +export default BuildBattleLeaderboardSettings; diff --git a/src/Structures/MiniGames/BuildBattle/BuildBattleVotes.ts b/src/Structures/MiniGames/BuildBattle/BuildBattleVotes.ts new file mode 100644 index 000000000..b2b7701bf --- /dev/null +++ b/src/Structures/MiniGames/BuildBattle/BuildBattleVotes.ts @@ -0,0 +1,1246 @@ +class BuildBattleVotes { + abandoned: number; + abandonedMansion: number; + adventCalendar: number; + airplane: number; + aladdin: number; + alien: number; + alienInvasion: number; + anchor: number; + ancient: number; + angel: number; + angry: number; + animal: number; + ant: number; + apocalyptic: number; + apple: number; + aquarium: number; + arcade: number; + arcadeMachine: number; + archer: number; + arm: number; + astronaut: number; + awards: number; + axe: number; + baby: number; + backpack: number; + bacon: number; + bakery: number; + baking: number; + balloon: number; + banana: number; + barbeque: number; + barn: number; + bat: number; + bath: number; + bats: number; + battle: number; + baubles: number; + beach: number; + beanstalk: number; + bear: number; + beard: number; + bed: number; + bee: number; + bell: number; + bike: number; + bikeRiding: number; + bird: number; + birdHouse: number; + birthday: number; + birthdayParty: number; + blaze: number; + blizzard: number; + block: number; + blocks: number; + boardGames: number; + boardgames: number; + boat: number; + bobsledding: number; + bones: number; + boogeyman: number; + book: number; + boot: number; + bottle: number; + bouncyCastle: number; + bowlingAlley: number; + box: number; + boxingRing: number; + boy: number; + brain: number; + branch: number; + bread: number; + breakfast: number; + brewingStand: number; + bridge: number; + brokenBridge: number; + broomstick: number; + bucket: number; + bug: number; + builder: number; + bunny: number; + buried: number; + butterflies: number; + butterfly: number; + button: number; + cabin: number; + cake: number; + camel: number; + camera: number; + camp: number; + campfire: number; + camping: number; + campsite: number; + candle: number; + candlelight: number; + candles: number; + candy: number; + candyBuckets: number; + candyCane: number; + cannon: number; + car: number; + caribbean: number; + carnival: number; + carolling: number; + cart: number; + cartoon: number; + castle: number; + cat: number; + catapult: number; + caterpillar: number; + cauldron: number; + cave: number; + celebration: number; + cellar: number; + cheese: number; + chemistry: number; + cherry: number; + cherryBlossom: number; + cherryBlossoms: number; + chess: number; + chest: number; + chicken: number; + chimney: number; + chocolate: number; + chocolateFactory: number; + choir: number; + christmasCard: number; + christmasDinner: number; + christmasEve: number; + christmasGift: number; + christmasMorning: number; + christmasTree: number; + cinema: number; + circus: number; + clock: number; + cloud: number; + clown: number; + cobweb: number; + coconut: number; + coffin: number; + comet: number; + computer: number; + cookieMountain: number; + corpseBride: number; + costume: number; + cowboy: number; + crab: number; + craftingTable: number; + crane: number; + crayon: number; + crayons: number; + creeper: number; + crocodile: number; + crystalBall: number; + cup: number; + curtain: number; + cushion: number; + dancer: number; + darkWoods: number; + decoratedHouse: number; + demon: number; + dice: number; + dinosaur: number; + disco: number; + disguise: number; + doll: number; + dollhouse: number; + dolphin: number; + doorbell: number; + doughnut: number; + doughnuts: number; + dracula: number; + dragon: number; + dress: number; + drill: number; + drink: number; + droid: number; + drum: number; + dungeon: number; + earmuffs: number; + earth: number; + easterEgg: number; + eatingCompetition: number; + eggBasket: number; + egyptain: number; + egyptian: number; + eiffelTower: number; + elephant: number; + elf: number; + enderman: number; + engine: number; + ethereal: number; + evergreenTree: number; + evilCat: number; + evilClown: number; + extraterrestrial: number; + eye: number; + fairy: number; + family: number; + fancy: number; + fangs: number; + fantasy: number; + farm: number; + farmersMarket: number; + feast: number; + feather: number; + fire: number; + fireplace: number; + firetruck: number; + firework: number; + fireworks: number; + fishingRod: number; + flag: number; + flamingo: number; + flashlight: number; + floatingIsland: number; + flower: number; + flowerPatch: number; + fly: number; + flying: number; + flyingPig: number; + flyingSaucer: number; + foot: number; + football: number; + forge: number; + fork: number; + fortuneteller: number; + fountain: number; + frankenstein: number; + freezer: number; + fridge: number; + frostyTheSnowman: number; + frozen: number; + fullMoon: number; + futuristicHouse: number; + game: number; + garage: number; + garden: number; + ghast: number; + ghost: number; + ghostShip: number; + ghoul: number; + giantPresents: number; + gifts: number; + gingerbread: number; + gingerbreadHouse: number; + gingerbreadMan: number; + giraffe: number; + girl: number; + glasses: number; + glove: number; + goat: number; + goblin: number; + golem: number; + goose: number; + gothic: number; + gravestone: number; + graveyard: number; + greekTemple: number; + grimReaper: number; + grinch: number; + guitar: number; + gym: number; + halloweenCostumes: number; + halloweenParty: number; + halloweenTreats: number; + hamburger: number; + hammer: number; + hamster: number; + hand: number; + happy: number; + harbor: number; + haunted: number; + hauntedForest: number; + hauntedHouse: number; + head: number; + headlessHorseman: number; + heart: number; + helicopter: number; + hikingTrail: number; + holiday: number; + holly: number; + hotAirBalloon: number; + hotChocolate: number; + house: number; + howl: number; + hugeStocking: number; + hurricane: number; + hypixel: number; + hypixelSweater: number; + iceCream: number; + iceFishing: number; + iceSkating: number; + igloo: number; + illusion: number; + imp: number; + industrial: number; + insect: number; + ironman: number; + island: number; + jackolantern: number; + jellyfish: number; + jetski: number; + jewel: number; + jingleBell: number; + jurassic: number; + keyboard: number; + killerWhale: number; + king: number; + kite: number; + kitten: number; + knight: number; + laboratory: number; + ladyBug: number; + lantern: number; + leaf: number; + leg: number; + library: number; + light: number; + lightbulb: number; + lighthouse: number; + lion: number; + livingDead: number; + llama: number; + lodge: number; + lunchbox: number; + madScientist: number; + magic: number; + magicWand: number; + magician: number; + magnet: number; + mailBox: number; + map: number; + mars: number; + marshmallow: number; + marshmallows: number; + martians: number; + mask: number; + maze: number; + meadow: number; + medieval: number; + mermaid: number; + meteorite: number; + mice: number; + midnight: number; + milk: number; + milkAndCookies: number; + mincePie: number; + mine: number; + mistletoe: number; + modernHome: number; + money: number; + monkey: number; + monster: number; + monsterTruck: number; + monument: number; + moon: number; + motorbike: number; + mouse: number; + movie: number; + mummy: number; + museum: number; + mushroom: number; + music: number; + mutant: number; + mythical: number; + nail: number; + neon: number; + nightmare: number; + ninja: number; + northPole: number; + nose: number; + nostalgia: number; + ocean: number; + octopus: number; + ogre: number; + olympics: number; + orange: number; + oven: number; + owl: number; + package: number; + paint: number; + painting: number; + palace: number; + palmTree: number; + panda: number; + parachute: number; + park: number; + pastel: number; + pen: number; + pencil: number; + penguin: number; + phantom: number; + photograph: number; + piano: number; + picnic: number; + picture: number; + pie: number; + piggyBank: number; + pineapple: number; + pipe: number; + pirate: number; + pirates: number; + pitchfork: number; + pixelArt: number; + plane: number; + plantPot: number; + plate: number; + pogoStick: number; + pogoSticks: number; + pond: number; + pool: number; + poolParty: number; + poolTable: number; + popcorn: number; + popsicle: number; + postOffice: number; + pot: number; + potato: number; + potion: number; + pottedPlant: number; + prehistoric: number; + presentsPile: number; + princess: number; + pumpkinCarving: number; + pyramid: number; + racecar: number; + rainbow: number; + rainforest: number; + rat: number; + reindeer: number; + rhino: number; + ring: number; + robot: number; + robots: number; + rockingChair: number; + rollercoaster: number; + roman: number; + rubberDuck: number; + rudolph: number; + rustic: number; + sackOfPresents: number; + sad: number; + safari: number; + sailboat: number; + sandcastle: number; + sandwich: number; + santa: number; + santaClaus: number; + santasSleigh: number; + santasWorkshop: number; + scarecrow: number; + scaryMovie: number; + school: number; + schoolBus: number; + scifi: number; + scientist: number; + scissors: number; + screw: number; + scythe: number; + selfPortrait: number; + sewer: number; + shark: number; + sheep: number; + shell: number; + shepherd: number; + shipwreck: number; + shoe: number; + shopping: number; + shovel: number; + skateboard: number; + skatepark: number; + skatingRink: number; + skeleton: number; + skeletonJockey: number; + skiCabin: number; + skull: number; + skydiver: number; + sled: number; + slenderman: number; + slime: number; + snail: number; + snake: number; + snowAngel: number; + snowFort: number; + snowGlobe: number; + snowballFight: number; + snowflake: number; + snowman: number; + snowyForest: number; + solarPanels: number; + solarSystem: number; + soldier: number; + sorcerer: number; + soup: number; + space: number; + spaceship: number; + spellbook: number; + spider: number; + spiderWeb: number; + spirit: number; + spirits: number; + sponge: number; + spookyTree: number; + spring: number; + spy: number; + stadium: number; + stamp: number; + star: number; + starryNight: number; + steamLocomotive: number; + steamPunk: number; + steampunk: number; + stick: number; + stocking: number; + sun: number; + sunset: number; + superHero: number; + superhero: number; + supernatural: number; + surfboard: number; + surprise: number; + surreal: number; + sushi: number; + swamp: number; + sweet: number; + sweets: number; + swing: number; + sword: number; + talentShow: number; + tank: number; + tarantula: number; + teddyBear: number; + temple: number; + tennis: number; + tent: number; + test: number; + tests: number; + theBestToyEver: number; + theFuture: number; + theGrinch: number; + theater: number; + themePark: number; + throne: number; + thunderAndLightning: number; + ticket: number; + tiger: number; + tomb: number; + tombstone: number; + tooth: number; + toothpaste: number; + topHat: number; + torch: number; + tornado: number; + tower: number; + towerOfPisa: number; + toyBox: number; + toyFactory: number; + toys: number; + tractor: number; + train: number; + trainStation: number; + trainstation: number; + trampoline: number; + treasure: number; + treasureChest: number; + treehouse: number; + trickortreating: number; + troll: number; + truck: number; + turkey: number; + turtle: number; + usa: number; + umbrella: number; + undead: number; + underTheSea: number; + underground: number; + unicorn: number; + vampire: number; + vegetableGarden: number; + vehicle: number; + vendingMachine: number; + videoGame: number; + viking: number; + volcano: number; + volcanoEruption: number; + volleyballCourt: number; + wallet: number; + warlock: number; + watch: number; + waterBucket: number; + waterfall: number; + web: number; + weightlifting: number; + werewolf: number; + western: number; + whale: number; + wheel: number; + wickedWitch: number; + windmill: number; + winterSuit: number; + wisemen: number; + wish: number; + witch: number; + witchHut: number; + witchcraft: number; + witchesHat: number; + wizard: number; + wolves: number; + wonderland: number; + world: number; + worm: number; + wreath: number; + yuleLog: number; + zebra: number; + zombie: number; + zombieApocalypse: number; + zombiePigman: number; + zombies: number; + zoo: number; + null: number; + constructor(data: Record) { + this.abandoned = data?.votes_Abandoned || 0; + this.abandonedMansion = data?.['votes_Abandoned Mansion'] || 0; + this.adventCalendar = data?.['votes_Advent Calendar'] || 0; + this.airplane = data?.votes_Airplane || 0; + this.aladdin = data?.votes_Aladdin || 0; + this.alien = data?.votes_Alien || 0; + this.alienInvasion = data?.['votes_Alien Invasion'] || 0; + this.anchor = data?.votes_Anchor || 0; + this.ancient = data?.votes_Ancient || 0; + this.angel = data?.votes_Angel || 0; + this.angry = data?.votes_Angry || 0; + this.animal = data?.votes_Animal || 0; + this.ant = data?.votes_Ant || 0; + this.apocalyptic = data?.votes_Apocalyptic || 0; + this.apple = data?.votes_Apple || 0; + this.aquarium = data?.votes_Aquarium || 0; + this.arcade = data?.votes_Arcade || 0; + this.arcadeMachine = data?.['votes_Arcade Machine'] || 0; + this.archer = data?.votes_Archer || 0; + this.arm = data?.votes_Arm || 0; + this.astronaut = data?.votes_Astronaut || 0; + this.awards = data?.votes_Awards || 0; + this.axe = data?.votes_Axe || 0; + this.baby = data?.votes_Baby || 0; + this.backpack = data?.votes_Backpack || 0; + this.bacon = data?.votes_Bacon || 0; + this.bakery = data?.votes_Bakery || 0; + this.baking = data?.votes_Baking || 0; + this.balloon = data?.votes_Balloon || 0; + this.banana = data?.votes_Banana || 0; + this.barbeque = data?.votes_Barbeque || 0; + this.barn = data?.votes_Barn || 0; + this.bat = data?.votes_Bat || 0; + this.bath = data?.votes_Bath || 0; + this.bats = data?.votes_Bats || 0; + this.battle = data?.votes_Battle || 0; + this.baubles = data?.votes_Baubles || 0; + this.beach = data?.votes_Beach || 0; + this.beanstalk = data?.votes_Beanstalk || 0; + this.bear = data?.votes_Bear || 0; + this.beard = data?.votes_Beard || 0; + this.bed = data?.votes_Bed || 0; + this.bee = data?.votes_Bee || 0; + this.bell = data?.votes_Bell || 0; + this.bike = data?.votes_Bike || 0; + this.bikeRiding = data?.['votes_Bike Riding'] || 0; + this.bird = data?.votes_Bird || 0; + this.birdHouse = data?.['votes_Bird House'] || 0; + this.birthday = data?.votes_Birthday || 0; + this.birthdayParty = data?.['votes_Birthday Party'] || 0; + this.blaze = data?.votes_Blaze || 0; + this.blizzard = data?.votes_Blizzard || 0; + this.block = data?.votes_Block || 0; + this.blocks = data?.votes_Blocks || 0; + this.boardGames = data?.['votes_Board Games'] || 0; + this.boardgames = data?.votes_Boardgames || 0; + this.boat = data?.votes_Boat || 0; + this.bobsledding = data?.votes_Bobsledding || 0; + this.bones = data?.votes_Bones || 0; + this.boogeyman = data?.votes_Boogeyman || 0; + this.book = data?.votes_Book || 0; + this.boot = data?.votes_Boot || 0; + this.bottle = data?.votes_Bottle || 0; + this.bouncyCastle = data?.['votes_Bouncy Castle'] || 0; + this.bowlingAlley = data?.['votes_Bowling Alley'] || 0; + this.box = data?.votes_Box || 0; + this.boxingRing = data?.['votes_Boxing Ring'] || 0; + this.boy = data?.votes_Boy || 0; + this.brain = data?.votes_Brain || 0; + this.branch = data?.votes_Branch || 0; + this.bread = data?.votes_Bread || 0; + this.breakfast = data?.votes_Breakfast || 0; + this.brewingStand = data?.['votes_Brewing Stand'] || 0; + this.bridge = data?.votes_Bridge || 0; + this.brokenBridge = data?.['votes_Broken Bridge'] || 0; + this.broomstick = data?.votes_Broomstick || 0; + this.bucket = data?.votes_Bucket || 0; + this.bug = data?.votes_Bug || 0; + this.builder = data?.votes_Builder || 0; + this.bunny = data?.votes_Bunny || 0; + this.buried = data?.votes_Buried || 0; + this.butterflies = data?.votes_Butterflies || 0; + this.butterfly = data?.votes_Butterfly || 0; + this.button = data?.votes_Button || 0; + this.cabin = data?.votes_Cabin || 0; + this.cake = data?.votes_Cake || 0; + this.camel = data?.votes_Camel || 0; + this.camera = data?.votes_Camera || 0; + this.camp = data?.votes_Camp || 0; + this.campfire = data?.votes_Campfire || 0; + this.camping = data?.votes_Camping || 0; + this.campsite = data?.votes_Campsite || 0; + this.candle = data?.votes_Candle || 0; + this.candlelight = data?.votes_Candlelight || 0; + this.candles = data?.votes_Candles || 0; + this.candy = data?.votes_Candy || 0; + this.candyBuckets = data?.['votes_Candy Buckets'] || 0; + this.candyCane = data?.['votes_Candy Cane'] || 0; + this.cannon = data?.votes_Cannon || 0; + this.car = data?.votes_Car || 0; + this.caribbean = data?.votes_Caribbean || 0; + this.carnival = data?.votes_Carnival || 0; + this.carolling = data?.votes_Carolling || 0; + this.cart = data?.votes_Cart || 0; + this.cartoon = data?.votes_Cartoon || 0; + this.castle = data?.votes_Castle || 0; + this.cat = data?.votes_Cat || 0; + this.catapult = data?.votes_Catapult || 0; + this.caterpillar = data?.votes_Caterpillar || 0; + this.cauldron = data?.votes_Cauldron || 0; + this.cave = data?.votes_Cave || 0; + this.celebration = data?.votes_Celebration || 0; + this.cellar = data?.votes_Cellar || 0; + this.cheese = data?.votes_Cheese || 0; + this.chemistry = data?.votes_Chemistry || 0; + this.cherry = data?.votes_Cherry || 0; + this.cherryBlossom = data?.['votes_Cherry Blossom'] || 0; + this.cherryBlossoms = data?.['votes_Cherry Blossoms'] || 0; + this.chess = data?.votes_Chess || 0; + this.chest = data?.votes_Chest || 0; + this.chicken = data?.votes_Chicken || 0; + this.chimney = data?.votes_Chimney || 0; + this.chocolate = data?.votes_Chocolate || 0; + this.chocolateFactory = data?.['votes_Chocolate Factory'] || 0; + this.choir = data?.votes_Choir || 0; + this.christmasCard = data?.['votes_Christmas Card'] || 0; + this.christmasDinner = data?.['votes_Christmas Dinner'] || 0; + this.christmasEve = data?.['votes_Christmas Eve'] || 0; + this.christmasGift = data?.['votes_Christmas Gift'] || 0; + this.christmasMorning = data?.['votes_Christmas Morning'] || 0; + this.christmasTree = data?.['votes_Christmas Tree'] || 0; + this.cinema = data?.votes_Cinema || 0; + this.circus = data?.votes_Circus || 0; + this.clock = data?.votes_Clock || 0; + this.cloud = data?.votes_Cloud || 0; + this.clown = data?.votes_Clown || 0; + this.cobweb = data?.votes_Cobweb || 0; + this.coconut = data?.votes_Coconut || 0; + this.coffin = data?.votes_Coffin || 0; + this.comet = data?.votes_Comet || 0; + this.computer = data?.votes_Computer || 0; + this.cookieMountain = data?.['votes_Cookie Mountain'] || 0; + this.corpseBride = data?.['votes_Corpse Bride'] || 0; + this.costume = data?.votes_Costume || 0; + this.cowboy = data?.votes_Cowboy || 0; + this.crab = data?.votes_Crab || 0; + this.craftingTable = data?.['votes_Crafting Table'] || 0; + this.crane = data?.votes_Crane || 0; + this.crayon = data?.votes_Crayon || 0; + this.crayons = data?.votes_Crayons || 0; + this.creeper = data?.votes_Creeper || 0; + this.crocodile = data?.votes_Crocodile || 0; + this.crystalBall = data?.['votes_Crystal Ball'] || 0; + this.cup = data?.votes_Cup || 0; + this.curtain = data?.votes_Curtain || 0; + this.cushion = data?.votes_Cushion || 0; + this.dancer = data?.votes_Dancer || 0; + this.darkWoods = data?.['votes_Dark woods'] || 0; + this.decoratedHouse = data?.['votes_Decorated House'] || 0; + this.demon = data?.votes_Demon || 0; + this.dice = data?.votes_Dice || 0; + this.dinosaur = data?.votes_Dinosaur || 0; + this.disco = data?.votes_Disco || 0; + this.disguise = data?.votes_Disguise || 0; + this.doll = data?.votes_Doll || 0; + this.dollhouse = data?.votes_Dollhouse || 0; + this.dolphin = data?.votes_Dolphin || 0; + this.doorbell = data?.votes_Doorbell || 0; + this.doughnut = data?.votes_Doughnut || 0; + this.doughnuts = data?.votes_Doughnuts || 0; + this.dracula = data?.votes_Dracula || 0; + this.dragon = data?.votes_Dragon || 0; + this.dress = data?.votes_Dress || 0; + this.drill = data?.votes_Drill || 0; + this.drink = data?.votes_Drink || 0; + this.droid = data?.votes_Droid || 0; + this.drum = data?.votes_Drum || 0; + this.dungeon = data?.votes_Dungeon || 0; + this.earmuffs = data?.votes_Earmuffs || 0; + this.earth = data?.votes_Earth || 0; + this.easterEgg = data?.['votes_Easter Egg'] || 0; + this.eatingCompetition = data?.['votes_Eating Competition'] || 0; + this.eggBasket = data?.['votes_Egg Basket'] || 0; + this.egyptain = data?.votes_Egyptain || 0; + this.egyptian = data?.votes_Egyptian || 0; + this.eiffelTower = data?.['votes_Eiffel tower'] || 0; + this.elephant = data?.votes_Elephant || 0; + this.elf = data?.votes_Elf || 0; + this.enderman = data?.votes_Enderman || 0; + this.engine = data?.votes_Engine || 0; + this.ethereal = data?.votes_Ethereal || 0; + this.evergreenTree = data?.['votes_Evergreen Tree'] || 0; + this.evilCat = data?.['votes_Evil Cat'] || 0; + this.evilClown = data?.['votes_Evil Clown'] || 0; + this.extraterrestrial = data?.votes_Extraterrestrial || 0; + this.eye = data?.votes_Eye || 0; + this.fairy = data?.votes_Fairy || 0; + this.family = data?.votes_Family || 0; + this.fancy = data?.votes_Fancy || 0; + this.fangs = data?.votes_Fangs || 0; + this.fantasy = data?.votes_Fantasy || 0; + this.farm = data?.votes_Farm || 0; + this.farmersMarket = data?.["votes_Farmer's Market"] || 0; + this.feast = data?.votes_Feast || 0; + this.feather = data?.votes_Feather || 0; + this.fire = data?.votes_Fire || 0; + this.fireplace = data?.votes_Fireplace || 0; + this.firetruck = data?.votes_Firetruck || 0; + this.firework = data?.votes_Firework || 0; + this.fireworks = data?.votes_Fireworks || 0; + this.fishingRod = data?.['votes_Fishing Rod'] || 0; + this.flag = data?.votes_Flag || 0; + this.flamingo = data?.votes_Flamingo || 0; + this.flashlight = data?.votes_Flashlight || 0; + this.floatingIsland = data?.['votes_Floating Island'] || 0; + this.flower = data?.votes_Flower || 0; + this.flowerPatch = data?.['votes_Flower Patch'] || 0; + this.fly = data?.votes_Fly || 0; + this.flying = data?.votes_Flying || 0; + this.flyingPig = data?.['votes_Flying Pig'] || 0; + this.flyingSaucer = data?.['votes_Flying Saucer'] || 0; + this.foot = data?.votes_Foot || 0; + this.football = data?.votes_Football || 0; + this.forge = data?.votes_Forge || 0; + this.fork = data?.votes_Fork || 0; + this.fortuneteller = data?.votes_Fortuneteller || 0; + this.fountain = data?.votes_Fountain || 0; + this.frankenstein = data?.votes_Frankenstein || 0; + this.freezer = data?.votes_Freezer || 0; + this.fridge = data?.votes_Fridge || 0; + this.frostyTheSnowman = data?.['votes_Frosty the Snowman'] || 0; + this.frozen = data?.votes_Frozen || 0; + this.fullMoon = data?.['votes_Full Moon'] || 0; + this.futuristicHouse = data?.['votes_Futuristic House'] || 0; + this.game = data?.votes_Game || 0; + this.garage = data?.votes_Garage || 0; + this.garden = data?.votes_Garden || 0; + this.ghast = data?.votes_Ghast || 0; + this.ghost = data?.votes_Ghost || 0; + this.ghostShip = data?.['votes_Ghost Ship'] || 0; + this.ghoul = data?.votes_Ghoul || 0; + this.giantPresents = data?.['votes_Giant Presents'] || 0; + this.gifts = data?.votes_Gifts || 0; + this.gingerbread = data?.votes_Gingerbread || 0; + this.gingerbreadHouse = data?.['votes_Gingerbread House'] || 0; + this.gingerbreadMan = data?.['votes_Gingerbread Man'] || 0; + this.giraffe = data?.votes_Giraffe || 0; + this.girl = data?.votes_Girl || 0; + this.glasses = data?.votes_Glasses || 0; + this.glove = data?.votes_Glove || 0; + this.goat = data?.votes_Goat || 0; + this.goblin = data?.votes_Goblin || 0; + this.golem = data?.votes_Golem || 0; + this.goose = data?.votes_Goose || 0; + this.gothic = data?.votes_Gothic || 0; + this.gravestone = data?.votes_Gravestone || 0; + this.graveyard = data?.votes_Graveyard || 0; + this.greekTemple = data?.['votes_Greek Temple'] || 0; + this.grimReaper = data?.['votes_Grim Reaper'] || 0; + this.grinch = data?.votes_Grinch || 0; + this.guitar = data?.votes_Guitar || 0; + this.gym = data?.votes_Gym || 0; + this.halloweenCostumes = data?.['votes_Halloween Costumes'] || 0; + this.halloweenParty = data?.['votes_Halloween Party'] || 0; + this.halloweenTreats = data?.['votes_Halloween Treats'] || 0; + this.hamburger = data?.votes_Hamburger || 0; + this.hammer = data?.votes_Hammer || 0; + this.hamster = data?.votes_Hamster || 0; + this.hand = data?.votes_Hand || 0; + this.happy = data?.votes_Happy || 0; + this.harbor = data?.votes_Harbor || 0; + this.haunted = data?.votes_Haunted || 0; + this.hauntedForest = data?.['votes_Haunted Forest'] || 0; + this.hauntedHouse = data?.['votes_Haunted House'] || 0; + this.head = data?.votes_Head || 0; + this.headlessHorseman = data?.['votes_Headless Horseman'] || 0; + this.heart = data?.votes_Heart || 0; + this.helicopter = data?.votes_Helicopter || 0; + this.hikingTrail = data?.['votes_Hiking Trail'] || 0; + this.holiday = data?.votes_Holiday || 0; + this.holly = data?.votes_Holly || 0; + this.hotAirBalloon = data?.['votes_Hot Air Balloon'] || 0; + this.hotChocolate = data?.['votes_Hot Chocolate'] || 0; + this.house = data?.votes_House || 0; + this.howl = data?.votes_Howl || 0; + this.hugeStocking = data?.['votes_Huge Stocking'] || 0; + this.hurricane = data?.votes_Hurricane || 0; + this.hypixel = data?.votes_Hypixel || 0; + this.hypixelSweater = data?.['votes_Hypixel Sweater'] || 0; + this.iceCream = data?.['votes_Ice Cream'] || 0; + this.iceFishing = data?.['votes_Ice Fishing'] || 0; + this.iceSkating = data?.['votes_Ice Skating'] || 0; + this.igloo = data?.votes_Igloo || 0; + this.illusion = data?.votes_Illusion || 0; + this.imp = data?.votes_Imp || 0; + this.industrial = data?.votes_Industrial || 0; + this.insect = data?.votes_Insect || 0; + this.ironman = data?.votes_Ironman || 0; + this.island = data?.votes_Island || 0; + this.jackolantern = data?.['votes_Jack-O-Lantern'] || 0; + this.jellyfish = data?.votes_Jellyfish || 0; + this.jetski = data?.votes_Jetski || 0; + this.jewel = data?.votes_Jewel || 0; + this.jingleBell = data?.['votes_Jingle Bell'] || 0; + this.jurassic = data?.votes_Jurassic || 0; + this.keyboard = data?.votes_Keyboard || 0; + this.killerWhale = data?.['votes_Killer Whale'] || 0; + this.king = data?.votes_King || 0; + this.kite = data?.votes_Kite || 0; + this.kitten = data?.votes_Kitten || 0; + this.knight = data?.votes_Knight || 0; + this.laboratory = data?.votes_Laboratory || 0; + this.ladyBug = data?.['votes_Lady Bug'] || 0; + this.lantern = data?.votes_Lantern || 0; + this.leaf = data?.votes_Leaf || 0; + this.leg = data?.votes_Leg || 0; + this.library = data?.votes_Library || 0; + this.light = data?.votes_Light || 0; + this.lightbulb = data?.votes_Lightbulb || 0; + this.lighthouse = data?.votes_Lighthouse || 0; + this.lion = data?.votes_Lion || 0; + this.livingDead = data?.['votes_Living dead'] || 0; + this.llama = data?.votes_Llama || 0; + this.lodge = data?.votes_Lodge || 0; + this.lunchbox = data?.votes_Lunchbox || 0; + this.madScientist = data?.['votes_Mad Scientist'] || 0; + this.magic = data?.votes_Magic || 0; + this.magicWand = data?.['votes_Magic Wand'] || 0; + this.magician = data?.votes_Magician || 0; + this.magnet = data?.votes_Magnet || 0; + this.mailBox = data?.['votes_Mail Box'] || 0; + this.map = data?.votes_Map || 0; + this.mars = data?.votes_Mars || 0; + this.marshmallow = data?.votes_Marshmallow || 0; + this.marshmallows = data?.votes_Marshmallows || 0; + this.martians = data?.votes_Martians || 0; + this.mask = data?.votes_Mask || 0; + this.maze = data?.votes_Maze || 0; + this.meadow = data?.votes_Meadow || 0; + this.medieval = data?.votes_Medieval || 0; + this.mermaid = data?.votes_Mermaid || 0; + this.meteorite = data?.votes_Meteorite || 0; + this.mice = data?.votes_Mice || 0; + this.midnight = data?.votes_Midnight || 0; + this.milk = data?.votes_Milk || 0; + this.milkAndCookies = data?.['votes_Milk and Cookies'] || 0; + this.mincePie = data?.['votes_Mince Pie'] || 0; + this.mine = data?.votes_Mine || 0; + this.mistletoe = data?.votes_Mistletoe || 0; + this.modernHome = data?.['votes_Modern Home'] || 0; + this.money = data?.votes_Money || 0; + this.monkey = data?.votes_Monkey || 0; + this.monster = data?.votes_Monster || 0; + this.monsterTruck = data?.['votes_Monster Truck'] || 0; + this.monument = data?.votes_Monument || 0; + this.moon = data?.votes_Moon || 0; + this.motorbike = data?.votes_Motorbike || 0; + this.mouse = data?.votes_Mouse || 0; + this.movie = data?.votes_Movie || 0; + this.mummy = data?.votes_Mummy || 0; + this.museum = data?.votes_Museum || 0; + this.mushroom = data?.votes_Mushroom || 0; + this.music = data?.votes_Music || 0; + this.mutant = data?.votes_Mutant || 0; + this.mythical = data?.votes_Mythical || 0; + this.nail = data?.votes_Nail || 0; + this.neon = data?.votes_Neon || 0; + this.nightmare = data?.votes_Nightmare || 0; + this.ninja = data?.votes_Ninja || 0; + this.northPole = data?.['votes_North Pole'] || 0; + this.nose = data?.votes_Nose || 0; + this.nostalgia = data?.votes_Nostalgia || 0; + this.ocean = data?.votes_Ocean || 0; + this.octopus = data?.votes_Octopus || 0; + this.ogre = data?.votes_Ogre || 0; + this.olympics = data?.votes_Olympics || 0; + this.orange = data?.votes_Orange || 0; + this.oven = data?.votes_Oven || 0; + this.owl = data?.votes_Owl || 0; + this.package = data?.votes_Package || 0; + this.paint = data?.votes_Paint || 0; + this.painting = data?.votes_Painting || 0; + this.palace = data?.votes_Palace || 0; + this.palmTree = data?.['votes_Palm Tree'] || 0; + this.panda = data?.votes_Panda || 0; + this.parachute = data?.votes_Parachute || 0; + this.park = data?.votes_Park || 0; + this.pastel = data?.votes_Pastel || 0; + this.pen = data?.votes_Pen || 0; + this.pencil = data?.votes_Pencil || 0; + this.penguin = data?.votes_Penguin || 0; + this.phantom = data?.votes_Phantom || 0; + this.photograph = data?.votes_Photograph || 0; + this.piano = data?.votes_Piano || 0; + this.picnic = data?.votes_Picnic || 0; + this.picture = data?.votes_Picture || 0; + this.pie = data?.votes_Pie || 0; + this.piggyBank = data?.['votes_Piggy Bank'] || 0; + this.pineapple = data?.votes_Pineapple || 0; + this.pipe = data?.votes_Pipe || 0; + this.pirate = data?.votes_Pirate || 0; + this.pirates = data?.votes_Pirates || 0; + this.pitchfork = data?.votes_Pitchfork || 0; + this.pixelArt = data?.['votes_Pixel Art'] || 0; + this.plane = data?.votes_Plane || 0; + this.plantPot = data?.['votes_Plant Pot'] || 0; + this.plate = data?.votes_Plate || 0; + this.pogoStick = data?.['votes_Pogo Stick'] || 0; + this.pogoSticks = data?.['votes_Pogo Sticks'] || 0; + this.pond = data?.votes_Pond || 0; + this.pool = data?.votes_Pool || 0; + this.poolParty = data?.['votes_Pool Party'] || 0; + this.poolTable = data?.['votes_Pool Table'] || 0; + this.popcorn = data?.votes_Popcorn || 0; + this.popsicle = data?.votes_Popsicle || 0; + this.postOffice = data?.['votes_Post Office'] || 0; + this.pot = data?.votes_Pot || 0; + this.potato = data?.votes_Potato || 0; + this.potion = data?.votes_Potion || 0; + this.pottedPlant = data?.['votes_Potted Plant'] || 0; + this.prehistoric = data?.votes_Prehistoric || 0; + this.presentsPile = data?.['votes_Presents Pile'] || 0; + this.princess = data?.votes_Princess || 0; + this.pumpkinCarving = data?.['votes_Pumpkin Carving'] || 0; + this.pyramid = data?.votes_Pyramid || 0; + this.racecar = data?.votes_Racecar || 0; + this.rainbow = data?.votes_Rainbow || 0; + this.rainforest = data?.votes_Rainforest || 0; + this.rat = data?.votes_Rat || 0; + this.reindeer = data?.votes_Reindeer || 0; + this.rhino = data?.votes_Rhino || 0; + this.ring = data?.votes_Ring || 0; + this.robot = data?.votes_Robot || 0; + this.robots = data?.votes_Robots || 0; + this.rockingChair = data?.['votes_Rocking Chair'] || 0; + this.rollercoaster = data?.votes_Rollercoaster || 0; + this.roman = data?.votes_Roman || 0; + this.rubberDuck = data?.['votes_Rubber Duck'] || 0; + this.rudolph = data?.votes_Rudolph || 0; + this.rustic = data?.votes_Rustic || 0; + this.sackOfPresents = data?.['votes_Sack of Presents'] || 0; + this.sad = data?.votes_Sad || 0; + this.safari = data?.votes_Safari || 0; + this.sailboat = data?.votes_Sailboat || 0; + this.sandcastle = data?.votes_Sandcastle || 0; + this.sandwich = data?.votes_Sandwich || 0; + this.santa = data?.votes_Santa || 0; + this.santaClaus = data?.['votes_Santa Claus'] || 0; + this.santasSleigh = data?.["votes_Santa's Sleigh"] || 0; + this.santasWorkshop = data?.["votes_Santa's Workshop"] || 0; + this.scarecrow = data?.votes_Scarecrow || 0; + this.scaryMovie = data?.['votes_Scary Movie'] || 0; + this.school = data?.votes_School || 0; + this.schoolBus = data?.['votes_School Bus'] || 0; + this.scifi = data?.['votes_Sci-fi'] || 0; + this.scientist = data?.votes_Scientist || 0; + this.scissors = data?.votes_Scissors || 0; + this.screw = data?.votes_Screw || 0; + this.scythe = data?.votes_Scythe || 0; + this.selfPortrait = data?.['votes_Self Portrait'] || 0; + this.sewer = data?.votes_Sewer || 0; + this.shark = data?.votes_Shark || 0; + this.sheep = data?.votes_Sheep || 0; + this.shell = data?.votes_Shell || 0; + this.shepherd = data?.votes_Shepherd || 0; + this.shipwreck = data?.votes_Shipwreck || 0; + this.shoe = data?.votes_Shoe || 0; + this.shopping = data?.votes_Shopping || 0; + this.shovel = data?.votes_Shovel || 0; + this.skateboard = data?.votes_Skateboard || 0; + this.skatepark = data?.votes_Skatepark || 0; + this.skatingRink = data?.['votes_Skating Rink'] || 0; + this.skeleton = data?.votes_Skeleton || 0; + this.skeletonJockey = data?.['votes_Skeleton Jockey'] || 0; + this.skiCabin = data?.['votes_Ski Cabin'] || 0; + this.skull = data?.votes_Skull || 0; + this.skydiver = data?.votes_Skydiver || 0; + this.sled = data?.votes_Sled || 0; + this.slenderman = data?.votes_Slenderman || 0; + this.slime = data?.votes_Slime || 0; + this.snail = data?.votes_Snail || 0; + this.snake = data?.votes_Snake || 0; + this.snowAngel = data?.['votes_Snow Angel'] || 0; + this.snowFort = data?.['votes_Snow Fort'] || 0; + this.snowGlobe = data?.['votes_Snow Globe'] || 0; + this.snowballFight = data?.['votes_Snowball Fight'] || 0; + this.snowflake = data?.votes_Snowflake || 0; + this.snowman = data?.votes_Snowman || 0; + this.snowyForest = data?.['votes_Snowy Forest'] || 0; + this.solarPanels = data?.['votes_Solar Panels'] || 0; + this.solarSystem = data?.['votes_Solar System'] || 0; + this.soldier = data?.votes_Soldier || 0; + this.sorcerer = data?.votes_Sorcerer || 0; + this.soup = data?.votes_Soup || 0; + this.space = data?.votes_Space || 0; + this.spaceship = data?.votes_Spaceship || 0; + this.spellbook = data?.votes_Spellbook || 0; + this.spider = data?.votes_Spider || 0; + this.spiderWeb = data?.['votes_Spider Web'] || 0; + this.spirit = data?.votes_Spirit || 0; + this.spirits = data?.votes_Spirits || 0; + this.sponge = data?.votes_Sponge || 0; + this.spookyTree = data?.['votes_Spooky Tree'] || 0; + this.spring = data?.votes_Spring || 0; + this.spy = data?.votes_Spy || 0; + this.stadium = data?.votes_Stadium || 0; + this.stamp = data?.votes_Stamp || 0; + this.star = data?.votes_Star || 0; + this.starryNight = data?.['votes_Starry Night'] || 0; + this.steamLocomotive = data?.['votes_Steam Locomotive'] || 0; + this.steamPunk = data?.['votes_Steam Punk'] || 0; + this.steampunk = data?.votes_Steampunk || 0; + this.stick = data?.votes_Stick || 0; + this.stocking = data?.votes_Stocking || 0; + this.sun = data?.votes_Sun || 0; + this.sunset = data?.votes_Sunset || 0; + this.superHero = data?.['votes_Super Hero'] || 0; + this.superhero = data?.votes_Superhero || 0; + this.supernatural = data?.votes_Supernatural || 0; + this.surfboard = data?.votes_Surfboard || 0; + this.surprise = data?.votes_Surprise || 0; + this.surreal = data?.votes_Surreal || 0; + this.sushi = data?.votes_Sushi || 0; + this.swamp = data?.votes_Swamp || 0; + this.sweet = data?.votes_Sweet || 0; + this.sweets = data?.votes_Sweets || 0; + this.swing = data?.votes_Swing || 0; + this.sword = data?.votes_Sword || 0; + this.talentShow = data?.['votes_Talent Show'] || 0; + this.tank = data?.votes_Tank || 0; + this.tarantula = data?.votes_Tarantula || 0; + this.teddyBear = data?.['votes_Teddy Bear'] || 0; + this.temple = data?.votes_Temple || 0; + this.tennis = data?.votes_Tennis || 0; + this.tent = data?.votes_Tent || 0; + this.test = data?.votes_Test || 0; + this.tests = data?.votes_Tests || 0; + this.theBestToyEver = data?.['votes_The Best Toy Ever'] || 0; + this.theFuture = data?.['votes_The Future'] || 0; + this.theGrinch = data?.['votes_The Grinch'] || 0; + this.theater = data?.votes_Theater || 0; + this.themePark = data?.['votes_Theme Park'] || 0; + this.throne = data?.votes_Throne || 0; + this.thunderAndLightning = data?.['votes_Thunder and Lightning'] || 0; + this.ticket = data?.votes_Ticket || 0; + this.tiger = data?.votes_Tiger || 0; + this.tomb = data?.votes_Tomb || 0; + this.tombstone = data?.votes_Tombstone || 0; + this.tooth = data?.votes_Tooth || 0; + this.toothpaste = data?.votes_Toothpaste || 0; + this.topHat = data?.['votes_Top Hat'] || 0; + this.torch = data?.votes_Torch || 0; + this.tornado = data?.votes_Tornado || 0; + this.tower = data?.votes_Tower || 0; + this.towerOfPisa = data?.['votes_Tower of Pisa'] || 0; + this.toyBox = data?.['votes_Toy Box'] || 0; + this.toyFactory = data?.['votes_Toy Factory'] || 0; + this.toys = data?.votes_Toys || 0; + this.tractor = data?.votes_Tractor || 0; + this.train = data?.votes_Train || 0; + this.trainStation = data?.['votes_Train Station'] || 0; + this.trainstation = data?.votes_Trainstation || 0; + this.trampoline = data?.votes_Trampoline || 0; + this.treasure = data?.votes_Treasure || 0; + this.treasureChest = data?.['votes_Treasure Chest'] || 0; + this.treehouse = data?.votes_Treehouse || 0; + this.trickortreating = data?.['votes_Trick-or-Treating'] || 0; + this.troll = data?.votes_Troll || 0; + this.truck = data?.votes_Truck || 0; + this.turkey = data?.votes_Turkey || 0; + this.turtle = data?.votes_Turtle || 0; + this.usa = data?.votes_USA || 0; + this.umbrella = data?.votes_Umbrella || 0; + this.undead = data?.votes_Undead || 0; + this.underTheSea = data?.['votes_Under the Sea'] || 0; + this.underground = data?.votes_Underground || 0; + this.unicorn = data?.votes_Unicorn || 0; + this.vampire = data?.votes_Vampire || 0; + this.vegetableGarden = data?.['votes_Vegetable Garden'] || 0; + this.vehicle = data?.votes_Vehicle || 0; + this.vendingMachine = data?.['votes_Vending Machine'] || 0; + this.videoGame = data?.['votes_Video Game'] || 0; + this.viking = data?.votes_Viking || 0; + this.volcano = data?.votes_Volcano || 0; + this.volcanoEruption = data?.['votes_Volcano Eruption'] || 0; + this.volleyballCourt = data?.['votes_Volleyball Court'] || 0; + this.wallet = data?.votes_Wallet || 0; + this.warlock = data?.votes_Warlock || 0; + this.watch = data?.votes_Watch || 0; + this.waterBucket = data?.['votes_Water Bucket'] || 0; + this.waterfall = data?.votes_Waterfall || 0; + this.web = data?.votes_Web || 0; + this.weightlifting = data?.votes_Weightlifting || 0; + this.werewolf = data?.votes_Werewolf || 0; + this.western = data?.votes_Western || 0; + this.whale = data?.votes_Whale || 0; + this.wheel = data?.votes_Wheel || 0; + this.wickedWitch = data?.['votes_Wicked Witch'] || 0; + this.windmill = data?.votes_Windmill || 0; + this.winterSuit = data?.['votes_Winter Suit'] || 0; + this.wisemen = data?.votes_Wisemen || 0; + this.wish = data?.votes_Wish || 0; + this.witch = data?.votes_Witch || 0; + this.witchHut = data?.['votes_Witch Hut'] || 0; + this.witchcraft = data?.votes_Witchcraft || 0; + this.witchesHat = data?.['votes_Witches Hat'] || 0; + this.wizard = data?.votes_Wizard || 0; + this.wolves = data?.votes_Wolves || 0; + this.wonderland = data?.votes_Wonderland || 0; + this.world = data?.votes_World || 0; + this.worm = data?.votes_Worm || 0; + this.wreath = data?.votes_Wreath || 0; + this.yuleLog = data?.['votes_Yule Log'] || 0; + this.zebra = data?.votes_Zebra || 0; + this.zombie = data?.votes_Zombie || 0; + this.zombieApocalypse = data?.['votes_Zombie Apocalypse'] || 0; + this.zombiePigman = data?.['votes_Zombie Pigman'] || 0; + this.zombies = data?.votes_Zombies || 0; + this.zoo = data?.votes_Zoo || 0; + this.null = data?.votes_null || 0; + } +} + +export default BuildBattleVotes; diff --git a/src/Structures/MiniGames/BuildBattle/Emblem/BuildBattleEmblem.ts b/src/Structures/MiniGames/BuildBattle/Emblem/BuildBattleEmblem.ts new file mode 100644 index 000000000..667b594cd --- /dev/null +++ b/src/Structures/MiniGames/BuildBattle/Emblem/BuildBattleEmblem.ts @@ -0,0 +1,16 @@ +import BuildBattleEmblemColors from './BuildBattleEmblemColors.ts'; +import type { BuildBattleEmblemIcon } from '../../../../Types/Player.ts'; +import type { ColorCode } from '../../../../Types/Color.ts'; + +class BuildBattleEmblem { + colorUnlocked: BuildBattleEmblemColors; + selectedColor: ColorCode | 'UNKNOWN'; + selectedIcon: BuildBattleEmblemIcon | 'UNKNOWN'; + constructor(data: Record) { + this.colorUnlocked = new BuildBattleEmblemColors(data?.color_unlocked || {}); + this.selectedColor = data?.selected_color || 'UNKNOWN'; + this.selectedIcon = data?.selected_icon || 'UNKNOWN'; + } +} + +export default BuildBattleEmblem; diff --git a/src/Structures/MiniGames/BuildBattle/Emblem/BuildBattleEmblemColors.ts b/src/Structures/MiniGames/BuildBattle/Emblem/BuildBattleEmblemColors.ts new file mode 100644 index 000000000..3f842db16 --- /dev/null +++ b/src/Structures/MiniGames/BuildBattle/Emblem/BuildBattleEmblemColors.ts @@ -0,0 +1,34 @@ +class BuildBattleEmblemColors { + aqua: boolean; + black: boolean; + blue: boolean; + darkAqua: boolean; + darkBlue: boolean; + darkGray: boolean; + darkGreen: boolean; + darkPurple: boolean; + darkRed: boolean; + gray: boolean; + green: boolean; + lightPurple: boolean; + red: boolean; + yellow: boolean; + constructor(data: Record) { + this.aqua = data?.aqua || false; + this.black = data?.black || false; + this.blue = data?.blue || false; + this.darkAqua = data?.dark_aqua || false; + this.darkBlue = data?.dark_blue || false; + this.darkGray = data?.dark_gray || false; + this.darkGreen = data?.dark_green || false; + this.darkPurple = data?.dark_purple || false; + this.darkRed = data?.dark_red || false; + this.gray = data?.gray || false; + this.green = data?.green || false; + this.lightPurple = data?.light_purple || false; + this.red = data?.red || false; + this.yellow = data?.yellow || false; + } +} + +export default BuildBattleEmblemColors; diff --git a/src/Structures/Player/PlayerStats.test.ts b/src/Structures/Player/PlayerStats.test.ts index 0cf817399..2bbf1b800 100644 --- a/src/Structures/Player/PlayerStats.test.ts +++ b/src/Structures/Player/PlayerStats.test.ts @@ -2,7 +2,7 @@ import Arcade from '../MiniGames/Arcade/Arcade.js'; import ArenaBrawl from '../MiniGames/ArenaBrawl/ArenaBrawl.js'; import BedWars from '../MiniGames/BedWars/BedWars.js'; import BlitzSurvivalGames from '../MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.js'; -import BuildBattle from '../MiniGames/BuildBattle.js'; +import BuildBattle from '../MiniGames/BuildBattle/BuildBattle.js'; import CopsAndCrims from '../MiniGames/CopsAndCrims/CopsAndCrims.js'; import Duels from '../MiniGames/Duels/Duels.js'; import MegaWalls from '../MiniGames/MegaWalls/MegaWalls.js'; diff --git a/src/Structures/Player/PlayerStats.ts b/src/Structures/Player/PlayerStats.ts index 2e47f23d4..4cce0ca06 100644 --- a/src/Structures/Player/PlayerStats.ts +++ b/src/Structures/Player/PlayerStats.ts @@ -2,7 +2,7 @@ import Arcade from '../MiniGames/Arcade/Arcade.js'; import ArenaBrawl from '../MiniGames/ArenaBrawl/ArenaBrawl.js'; import BedWars from '../MiniGames/BedWars/BedWars.js'; import BlitzSurvivalGames from '../MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.js'; -import BuildBattle from '../MiniGames/BuildBattle.js'; +import BuildBattle from '../MiniGames/BuildBattle/BuildBattle.js'; import CopsAndCrims from '../MiniGames/CopsAndCrims/CopsAndCrims.js'; import Duels from '../MiniGames/Duels/Duels.js'; import MegaWalls from '../MiniGames/MegaWalls/MegaWalls.js'; diff --git a/src/Types/Player.ts b/src/Types/Player.ts index 01a4abec0..587edb76d 100644 --- a/src/Types/Player.ts +++ b/src/Types/Player.ts @@ -477,13 +477,6 @@ export type DuelsBaseDivision = | 'Divine' | 'Ascended'; -export interface BuildBattleWins { - solo: number; - teams: number; - pro: number; - gtb: number; -} - export interface WoolGamesPrivateGameConfig { one_hit_one_kill: boolean; rainbow_wool: 'Enabled' | 'Disabled'; @@ -1237,3 +1230,405 @@ export type PlayerCosmeticsParticlePack = export type PlayerCosmeticsClickEffects = 'skull' | 'blizzard' | 'easter_egg' | 'holiday_firework' | 'hypixel'; export type ChatChannel = 'ALL' | 'PARTY' | 'GUILD' | 'OFFICER' | 'PM' | 'SKYBLOCK_COOP'; +export type BuildBattleShopSort = 'rarity_ascending' | 'rarity_descending' | SortName; +export type BuildBattleEmblemIcon = 'ALPHA' | 'OMEGA' | 'PODIUM' | 'REMINISCENCE' | 'RICH'; +export type BuildBattleLeaderboardSettingsMode = + | 'ALL_MODES' + | 'GUESS_THE_BUILD' + | 'PRO' + | 'SOLO' + | 'SOLO_LATEST' + | 'SPEED_BUILDERS' + | 'TEAMS'; +export type BuildBattleLeaderboardSettingsResetType = 'MONTHLY' | 'NEVER' | 'WEEKLY'; +export type BuildBattleHat = + | 'hats_ancient_hat' + | 'hats_bakers_hat' + | 'hats_bankers_draught' + | 'hats_batters_helmet' + | 'hats_boogie_woogie_hat' + | 'hats_bounty_hat' + | 'hats_builder_hat' + | 'hats_canada_hat' + | 'hats_creeper_head' + | 'hats_desert_hat' + | 'hats_emerald_hat' + | 'hats_forest_hat' + | 'hats_frying_pan' + | 'hats_gnome_hat' + | 'hats_goldigger' + | 'hats_hardcore_hat' + | 'hats_jumpman_hat' + | 'hats_let_there_be_light_hat' + | 'hats_lumberjack_hat' + | 'hats_luminous_hat' + | 'hats_master_builder_hat' + | 'hats_miners_hat' + | 'hats_musician_hat' + | 'hats_over_the_rainbow' + | 'hats_scholars_cap' + | 'hats_scotland_hat' + | 'hats_shiny_hat' + | 'hats_shocked_hat' + | 'hats_skeleton_skull' + | 'hats_spaceman_helmet' + | 'hats_summer_hat' + | 'hats_the_attendant' + | 'hats_the_milkman' + | 'hats_the_superfan' + | 'hats_tnt_hat' + | 'hats_treasure_hat' + | 'hats_winter_hat' + | 'hats_wither_skull' + | 'hats_zombie_skull'; +export type BuildBattleSuit = + | 'suits_all_yellow' + | 'suits_blaze' + | 'suits_budder' + | 'suits_buildbattlesuit' + | 'suits_bumbleebee' + | 'suits_candy_corn' + | 'suits_commander' + | 'suits_disco' + | 'suits_elite' + | 'suits_fashionista' + | 'suits_invader' + | 'suits_majestic' + | 'suits_marine' + | 'suits_medieval' + | 'suits_metallic' + | 'suits_monochrome' + | 'suits_primary_colors' + | 'suits_revenge' + | 'suits_santa' + | 'suits_shiny' + | 'suits_slime' + | 'suits_snow' + | 'suits_soldier' + | 'suits_space' + | 'suits_special_ops' + | 'suits_swat'; +export type BuildBattleVictoryDance = + | 'better_fireworks' + | 'twerk_apocalypse' + | 'victory_dance_animal_rain' + | 'victory_dance_anvil_rain' + | 'victory_dance_cold_snap' + | 'victory_dance_egg_meteors' + | 'victory_dance_fireworks' + | 'victory_dance_ghast_rider' + | 'victory_dance_graveyardrave' + | 'victory_dance_guardians' + | 'victory_dance_heat_wave' + | 'victory_dance_meteor_shower' + | 'victory_dance_night_shift' + | 'victory_dance_pumpkin_bomber' + | 'victory_dance_rainbow_dolly' + | 'victory_dance_rooted' + | 'victory_dance_snow_bomber' + | 'victory_dance_special_fireworks' + | 'victory_dance_terror' + | 'victory_dance_toy_stick' + | 'victory_dance_twerk_apocalypse' + | 'victory_dance_winter_twister' + | 'victory_dance_wither_rider' + | 'victory_dance_yeehaw'; +export type BuildBattleBackdrop = + | 'backdrops_aquarium' + | 'backdrops_art' + | 'backdrops_artifact' + | 'backdrops_astro' + | 'backdrops_at_the_beach' + | 'backdrops_back_to_school' + | 'backdrops_city' + | 'backdrops_coffee' + | 'backdrops_cozy' + | 'backdrops_desert' + | 'backdrops_fireplace' + | 'backdrops_graveyard' + | 'backdrops_greyspire' + | 'backdrops_happy_world' + | 'backdrops_haunted_room' + | 'backdrops_hypixel_lobby' + | 'backdrops_knights_hall' + | 'backdrops_lunar1' + | 'backdrops_lunar2' + | 'backdrops_midnighttown' + | 'backdrops_monastery' + | 'backdrops_mountains' + | 'backdrops_pond' + | 'backdrops_potionmaking' + | 'backdrops_pumpkin_god' + | 'backdrops_ruins' + | 'backdrops_skyline' + | 'backdrops_snowflake' + | 'backdrops_ten_anniversary' + | 'backdrops_townpocalypse' + | 'backdrops_tropical_sands' + | 'backdrops_vanilla' + | 'backdrops_village' + | 'backdrops_web' + | 'backdrops_year_of_the_snake'; +export type BuildBattleIsland = + | 'island_bbq' + | 'island_clouds' + | 'island_desert' + | 'island_dice' + | 'island_dwarven_king' + | 'island_fish_bowl' + | 'island_flower' + | 'island_frog' + | 'island_gothic' + | 'island_greek_temple' + | 'island_hourglass' + | 'island_jerry' + | 'island_jungle' + | 'island_mesa' + | 'island_mines' + | 'island_mushroom' + | 'island_mycelium' + | 'island_nether' + | 'island_pickle_jar' + | 'island_sand_fort' + | 'island_sci_fi' + | 'island_serpent' + | 'island_snow' + | 'island_steam_punk' + | 'island_taiga' + | 'island_tiki' + | 'island_tnt' + | 'island_tower' + | 'island_waterfall'; +export type BuildBattleMovementTrail = + | 'movement_trail_black_smoke' + | 'movement_trail_fire' + | 'movement_trail_frosty' + | 'movement_trail_green_star'; +export type BuildBattleSong = + | 'aztec' + | 'balrog' + | 'blockjitsu' + | 'bohemian_rhapsody' + | 'cantina' + | 'cirno_noteblock' + | 'comptine' + | 'corpse_party' + | 'creeper_chase' + | 'creeper_salsa' + | 'crossing_field' + | 'end_lobby' + | 'fireflies' + | 'flight_bumblebee' + | 'flowering_night' + | 'fortune_start_jingle' + | 'fortune_stop_jingle' + | 'gamemode8' + | 'ghostly_band' + | 'happy_fish' + | 'hide_and_seek_sad' + | 'hilly_escapades' + | 'holiday' + | 'hoppin_blocks' + | 'i_cant_wait' + | 'i_wish_it_could_be_christmas_everday' + | 'icy_breeze' + | 'immortal_smoke' + | 'interdimensional' + | 'journey' + | 'journey_in_the_sky' + | 'kart_olympus' + | 'kewl' + | 'kirby_gourmet' + | 'let_it_go' + | 'license_to_infinity' + | 'lunatic_eyes' + | 'mad_world' + | 'mayan' + | 'mayan_theme' + | 'moonrvg' + | 'nyan_cat' + | 'onward' + | 'owen' + | 'pokemon_theme' + | 'pump_it_up' + | 'race_away' + | 'red_brick_house' + | 'retro_track' + | 'santa_claus_is_coming_to_town' + | 'seppette_of_the_dead_princess' + | 'silent_wish' + | 'storms' + | 'suspenseful' + | 'walking_mega' + | 'welcome'; +export type BuildBattlePackageItem = + | 'all_yellow' + | 'ancient_hat' + | 'anvil_rain' + | 'aquarium' + | 'astro' + | 'at_the_beach' + | 'aztec_track' + | 'back_to_school' + | 'backstreet' + | 'bad_apple' + | 'bakers_hat' + | 'bankers_draught' + | 'batters_helmet' + | 'bb_achieve_flag' + | 'bb_stat_flag' + | 'bblc' + | 'black_notes' + | 'bleeding_out' + | 'boogie_woogie_hat' + | 'bounty_hat' + | 'budder' + | 'buildbattlesuit' + | 'builder_hat' + | 'bumbleebee' + | 'canada_hat' + | 'carousel_ride' + | 'cold_snap' + | 'commander' + | 'creeper_head' + | 'desert_hat' + | 'disco' + | 'dungeon_drama' + | 'elite' + | 'emblem.color_unlocked' + | 'emerald_hat' + | 'entertainer' + | 'fashionista' + | 'feasibility' + | 'final_cubic_generator' + | 'fireworks' + | 'flight_in_fantasia' + | 'forester_hat' + | 'frying_pan' + | 'gamemode_88' + | 'ghast_rider' + | 'gnome_hat' + | 'goldigger' + | 'graveyard' + | 'guardians' + | 'happy' + | 'happy_world' + | 'hardcore_hat' + | 'haunted_room' + | 'hide_and_seek' + | 'how_you_love_me' + | 'hypixel_lobby' + | 'invader' + | 'jumpman_hat' + | 'knights_hall' + | 'larger_than_life' + | 'last_christmas' + | 'let_there_be_light_hat' + | 'level1' + | 'level2' + | 'level3' + | 'level4' + | 'level5' + | 'lobby' + | 'lobby_song' + | 'lumberjack_hat' + | 'luminous_hat' + | 'mad_jack' + | 'maidens_cappriccio' + | 'majestic' + | 'marine' + | 'master_builder_hat' + | 'mbison' + | 'medieval' + | 'metallic' + | 'meteor_shower' + | 'minecraft_is_my_life' + | 'miners_hat' + | 'monastery' + | 'mountains' + | 'musician_hat' + | 'native_faith' + | 'night_shift' + | 'nyny' + | 'olympus' + | 'over_the_rainbow' + | 'phwee' + | 'pond' + | 'potionmaking' + | 'primary_colors' + | 'pumpkin_god' + | 'rainbow_dolly' + | 'retro' + | 'revenge' + | 'reverse_ideology' + | 'rockin_around_the_christmas_tree' + | 'roll' + | 'santa' + | 'scholars_cap' + | 'scotland_hat' + | 'setbbtheme' + | 'shiny' + | 'shiny_hat' + | 'shocked_hat' + | 'similar' + | 'skeleton_skull' + | 'sky_of_trees' + | 'slime' + | 'snow' + | 'soldier' + | 'space' + | 'spaceman_helmet' + | 'special_ops' + | 'suit.monochrome' + | 'summer_hat' + | 'super_votes' + | 'swat' + | 'swd33' + | 'terror' + | 'the_attendant' + | 'the_milkman' + | 'the_superfan' + | 'tnt_hat' + | 'townpocalypse' + | 'toy_stick' + | 'traceway' + | 'treasure_hat' + | 'vessel_of_stars' + | 'victory' + | 'voting' + | 'what_ive_done' + | 'winter_hat' + | 'winter_wonderland' + | 'wither_rider' + | 'wither_skull' + | 'yeehaw' + | 'zelda_chest_opening' + | 'zinnias_theme' + | 'zombie_skull' + | BuildBattleHat + | BuildBattleSuit + | BuildBattleVictoryDance + | BuildBattleBackdrop + | BuildBattleMovementTrail + | BuildBattleIsland + | BuildBattleSong; +export type BuildBattleTitle = + | 'Rookie' + | 'Untrained' + | 'Amatuer' + | 'Prospect' + | 'Apprentice' + | 'Experienced' + | 'Seasoned' + | 'Trained' + | 'Skilled' + | 'Talented' + | 'Professional' + | 'Artisan' + | 'Expert' + | 'Master' + | 'Legend' + | 'Grandmaster' + | 'Celestial' + | 'Divine' + | 'Ascended'; diff --git a/src/Utils/Constants.ts b/src/Utils/Constants.ts index 4fd0b911c..e53cbf8a7 100644 --- a/src/Utils/Constants.ts +++ b/src/Utils/Constants.ts @@ -6,7 +6,7 @@ import type { SkyBlockSlayer, SkyBlockXPTables } from '../Types/SkyBlock.js'; -import type { DuelsBaseDivision } from '../Types/Player.js'; +import type { BuildBattleTitle, DuelsBaseDivision } from '../Types/Player.js'; import type { GameCode, GameID, GameString } from '../Types/Game.js'; export const games: { id: GameID; code: GameCode; name: GameString }[] = [ @@ -2452,3 +2452,25 @@ export const BestiaryMobs: BestiaryMobsData = { ] } }; + +export const BuildBattleTitleRequirements: { title: BuildBattleTitle; requirement: number }[] = [ + { title: 'Rookie', requirement: 0 }, + { title: 'Untrained', requirement: 100 }, + { title: 'Amatuer', requirement: 250 }, + { title: 'Prospect', requirement: 550 }, + { title: 'Apprentice', requirement: 1000 }, + { title: 'Experienced', requirement: 2000 }, + { title: 'Seasoned', requirement: 3500 }, + { title: 'Trained', requirement: 5000 }, + { title: 'Skilled', requirement: 7500 }, + { title: 'Talented', requirement: 10000 }, + { title: 'Professional', requirement: 15000 }, + { title: 'Artisan', requirement: 20000 }, + { title: 'Expert', requirement: 30000 }, + { title: 'Master', requirement: 50000 }, + { title: 'Legend', requirement: 100000 }, + { title: 'Grandmaster', requirement: 200000 }, + { title: 'Celestial', requirement: 300000 }, + { title: 'Divine', requirement: 400000 }, + { title: 'Ascended', requirement: 500000 } +]; diff --git a/src/index.ts b/src/index.ts index 7b82895a4..d5a245a19 100644 --- a/src/index.ts +++ b/src/index.ts @@ -50,7 +50,12 @@ import BlockingDead from './Structures/MiniGames/Arcade/BlockingDead.js'; import Booster from './Structures/Boosters/Booster.js'; import BountyHunters from './Structures/MiniGames/Arcade/BountyHunters.js'; import BowSpleef from './Structures/MiniGames/TNTGames/BowSpleef.js'; -import BuildBattle from './Structures/MiniGames/BuildBattle.js'; +import BuildBattle from './Structures/MiniGames/BuildBattle/BuildBattle.js'; +import BuildBattleEmblem from './Structures/MiniGames/BuildBattle/Emblem/BuildBattleEmblem.js'; +import BuildBattleEmblemColors from './Structures/MiniGames/BuildBattle/Emblem/BuildBattleEmblemColors.js'; +import BuildBattleLastWin from './Structures/MiniGames/BuildBattle/BuildBattleLastWin.js'; +import BuildBattleLeaderboardSettings from './Structures/MiniGames/BuildBattle/BuildBattleLeaderboardSettings.js'; +import BuildBattleVotes from './Structures/MiniGames/BuildBattle/BuildBattleVotes.js'; import CaptureTheWool from './Structures/MiniGames/WoolGames/CaptureTheWool.js'; import Challenge from './Structures/Static/Challenge.js'; import Challenges from './Structures/Static/Challenges.js'; @@ -361,6 +366,11 @@ export { BountyHunters, BowSpleef, BuildBattle, + BuildBattleEmblem, + BuildBattleEmblemColors, + BuildBattleLastWin, + BuildBattleLeaderboardSettings, + BuildBattleVotes, CaptureTheWool, Challenge, Challenges, @@ -672,6 +682,11 @@ export default { BountyHunters, BowSpleef, BuildBattle, + BuildBattleEmblem, + BuildBattleEmblemColors, + BuildBattleLastWin, + BuildBattleLeaderboardSettings, + BuildBattleVotes, CaptureTheWool, Challenge, Challenges, From 8085b80afda8cc0cf299676cf953a6d9dcd4a4b6 Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 29 Oct 2025 22:57:54 +0800 Subject: [PATCH 077/124] refactor(MurderMystery) --- .../MiniGames/BuildBattle/BuildBattle.ts | 24 +- .../BuildBattleLeaderboardSettings.ts | 15 - .../BuildBattle/Emblem/BuildBattleEmblem.ts | 16 - .../MurderMystery/MurderMystery.test.ts | 75 -- .../MiniGames/MurderMystery/MurderMystery.ts | 242 ++++- .../MurderMystery/MurderMysteryDescent.ts | 110 ++ .../MurderMystery/MurderMysteryDescentItem.ts | 10 + .../MurderMystery/MurderMysteryFavorites.ts | 36 + .../MurderMystery/MurderMysteryGamemode.ts | 47 + .../MurderMysteryKnifeSkinPrestige.ts | 13 + .../MurderMysteryKnifeSkinPrestigeXp.ts | 92 ++ .../MurderMystery/MurderMysteryMap.ts | 59 ++ .../MurderMysteryModeStats.test.ts | 51 - .../MurderMystery/MurderMysteryModeStats.ts | 37 - .../MiniGames/Shared/Emblem/Emblem.ts | 15 + .../Emblem/EmblemColors.ts} | 4 +- .../MiniGames/Shared/LeaderboardSettings.ts | 12 + src/Types/Player.ts | 956 +++++++++++++++++- src/index.ts | 42 +- 19 files changed, 1596 insertions(+), 260 deletions(-) delete mode 100644 src/Structures/MiniGames/BuildBattle/BuildBattleLeaderboardSettings.ts delete mode 100644 src/Structures/MiniGames/BuildBattle/Emblem/BuildBattleEmblem.ts delete mode 100644 src/Structures/MiniGames/MurderMystery/MurderMystery.test.ts create mode 100644 src/Structures/MiniGames/MurderMystery/MurderMysteryDescent.ts create mode 100644 src/Structures/MiniGames/MurderMystery/MurderMysteryDescentItem.ts create mode 100644 src/Structures/MiniGames/MurderMystery/MurderMysteryFavorites.ts create mode 100644 src/Structures/MiniGames/MurderMystery/MurderMysteryGamemode.ts create mode 100644 src/Structures/MiniGames/MurderMystery/MurderMysteryKnifeSkinPrestige.ts create mode 100644 src/Structures/MiniGames/MurderMystery/MurderMysteryKnifeSkinPrestigeXp.ts create mode 100644 src/Structures/MiniGames/MurderMystery/MurderMysteryMap.ts delete mode 100644 src/Structures/MiniGames/MurderMystery/MurderMysteryModeStats.test.ts delete mode 100644 src/Structures/MiniGames/MurderMystery/MurderMysteryModeStats.ts create mode 100644 src/Structures/MiniGames/Shared/Emblem/Emblem.ts rename src/Structures/MiniGames/{BuildBattle/Emblem/BuildBattleEmblemColors.ts => Shared/Emblem/EmblemColors.ts} (92%) create mode 100644 src/Structures/MiniGames/Shared/LeaderboardSettings.ts diff --git a/src/Structures/MiniGames/BuildBattle/BuildBattle.ts b/src/Structures/MiniGames/BuildBattle/BuildBattle.ts index e7419c874..aeeb1aea8 100644 --- a/src/Structures/MiniGames/BuildBattle/BuildBattle.ts +++ b/src/Structures/MiniGames/BuildBattle/BuildBattle.ts @@ -1,31 +1,33 @@ -import BuildBattleEmblem from './Emblem/BuildBattleEmblem.ts'; import BuildBattleLastWin from './BuildBattleLastWin.js'; -import BuildBattleLeaderboardSettings from './BuildBattleLeaderboardSettings.js'; import BuildBattleVotes from './BuildBattleVotes.js'; +import Emblem from '../Shared/Emblem/Emblem.ts'; +import LeaderboardSettings from '../Shared/LeaderboardSettings.ts'; import { BuildBattleTitleRequirements } from '../../../Utils/Constants.ts'; import { monthAB } from '../../../Utils/Oscillation.ts'; import type { BuildBattleBackdrop, + BuildBattleEmblemIcon, BuildBattleHat, BuildBattleIsland, + BuildBattleLeaderboardSettingsMode, BuildBattleMovementTrail, BuildBattlePackageItem, - BuildBattleShopSort, BuildBattleSong, BuildBattleSuit, BuildBattleTitle, - BuildBattleVictoryDance + BuildBattleVictoryDance, + ShopSort } from '../../../Types/Player.ts'; class BuildBattle { activeIsland: BuildBattleIsland | 'island_none'; activeMovementTrail: BuildBattleMovementTrail | 'movement_trail_none'; correctGuesses: number; - emblem: BuildBattleEmblem; + emblem: Emblem; playedGames: number; lastPurchasedSong: BuildBattleSong | 'UNKNOWN'; lastWon: BuildBattleLastWin; - leaderboardSettings: BuildBattleLeaderboardSettings; + leaderboardSettings: LeaderboardSettings; loadout: string[]; monthlyTokensA: number; monthlyTokensB: number; @@ -38,7 +40,7 @@ class BuildBattle { score: number; title: BuildBattleTitle; selectedBackdrop: BuildBattleBackdrop | 'backdrops_none'; - shopSort: BuildBattleShopSort | 'UNKNOWN'; + shopSort: ShopSort | 'UNKNOWN'; shopSortEnableOwnedFirst: boolean; soloMostPoints: number; superVotes: number; @@ -59,11 +61,13 @@ class BuildBattle { this.activeIsland = data?.active_island || 'island_none'; this.activeMovementTrail = data?.active_movement_trail || 'movement_trail_none'; this.correctGuesses = data?.correct_guesses || 0; - this.emblem = new BuildBattleEmblem(data?.emblem || {}); + this.emblem = new Emblem(data?.emblem || {}); this.playedGames = data?.games_played || 0; this.lastPurchasedSong = data?.last_purchased_song || 'UNKNOWN'; this.lastWon = new BuildBattleLastWin(data?.last_won || {}); - this.leaderboardSettings = new BuildBattleLeaderboardSettings(data?.leaderboardSettings || {}); + this.leaderboardSettings = new LeaderboardSettings( + data?.leaderboardSettings || {} + ); this.loadout = data?.buildbattle_loadout || []; this.monthlyTokensA = data?.monthly_tokens_a || data?.monthly_coins_a || 0; this.monthlyTokensB = data?.monthly_tokens_b || data?.monthly_coins_b || 0; @@ -76,7 +80,7 @@ class BuildBattle { this.score = data?.score || 0; this.title = BuildBattle.getBuildBattleTitle(this.score); this.selectedBackdrop = data?.selected_backdrop || 'backdrops_none'; - this.shopSort = data?.shop_sort || false; + this.shopSort = data?.shop_sort || 'UNKNOWN'; this.shopSortEnableOwnedFirst = data?.shop_sort_enable_owned_first || false; this.soloMostPoints = data?.solo_most_points || 0; this.superVotes = data?.super_votes || 0; diff --git a/src/Structures/MiniGames/BuildBattle/BuildBattleLeaderboardSettings.ts b/src/Structures/MiniGames/BuildBattle/BuildBattleLeaderboardSettings.ts deleted file mode 100644 index 9fcb213bd..000000000 --- a/src/Structures/MiniGames/BuildBattle/BuildBattleLeaderboardSettings.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { - BuildBattleLeaderboardSettingsMode, - BuildBattleLeaderboardSettingsResetType -} from '../../../Types/Player.ts'; - -class BuildBattleLeaderboardSettings { - mode: BuildBattleLeaderboardSettingsMode | 'UNKNOWN'; - resetType: BuildBattleLeaderboardSettingsResetType | 'UNKNOWN'; - constructor(data: Record) { - this.mode = data?.mode || 'UNKNOWN'; - this.resetType = data?.resetType || 'UNKNOWN'; - } -} - -export default BuildBattleLeaderboardSettings; diff --git a/src/Structures/MiniGames/BuildBattle/Emblem/BuildBattleEmblem.ts b/src/Structures/MiniGames/BuildBattle/Emblem/BuildBattleEmblem.ts deleted file mode 100644 index 667b594cd..000000000 --- a/src/Structures/MiniGames/BuildBattle/Emblem/BuildBattleEmblem.ts +++ /dev/null @@ -1,16 +0,0 @@ -import BuildBattleEmblemColors from './BuildBattleEmblemColors.ts'; -import type { BuildBattleEmblemIcon } from '../../../../Types/Player.ts'; -import type { ColorCode } from '../../../../Types/Color.ts'; - -class BuildBattleEmblem { - colorUnlocked: BuildBattleEmblemColors; - selectedColor: ColorCode | 'UNKNOWN'; - selectedIcon: BuildBattleEmblemIcon | 'UNKNOWN'; - constructor(data: Record) { - this.colorUnlocked = new BuildBattleEmblemColors(data?.color_unlocked || {}); - this.selectedColor = data?.selected_color || 'UNKNOWN'; - this.selectedIcon = data?.selected_icon || 'UNKNOWN'; - } -} - -export default BuildBattleEmblem; diff --git a/src/Structures/MiniGames/MurderMystery/MurderMystery.test.ts b/src/Structures/MiniGames/MurderMystery/MurderMystery.test.ts deleted file mode 100644 index 58ca5b180..000000000 --- a/src/Structures/MiniGames/MurderMystery/MurderMystery.test.ts +++ /dev/null @@ -1,75 +0,0 @@ -import MurderMystery from './MurderMystery.js'; -import MurderMysteryModeStats from './MurderMysteryModeStats.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('MurderMystery', () => { - const data = new MurderMystery({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(MurderMystery); - expectTypeOf(data).toEqualTypeOf(); - expect(data.tokens).toBeDefined(); - expect(data.tokens).toBeGreaterThanOrEqual(0); - expectTypeOf(data.tokens).toEqualTypeOf(); - expect(data.goldPickedUp).toBeDefined(); - expect(data.goldPickedUp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.goldPickedUp).toEqualTypeOf(); - expect(data.playedGames).toBeDefined(); - expect(data.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.playedGames).toEqualTypeOf(); - expect(data.kills).toBeDefined(); - expect(data.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.kills).toEqualTypeOf(); - expect(data.thrownKnifeKills).toBeDefined(); - expect(data.thrownKnifeKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.thrownKnifeKills).toEqualTypeOf(); - expect(data.knifeKills).toBeDefined(); - expect(data.knifeKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.knifeKills).toEqualTypeOf(); - expect(data.trapKills).toBeDefined(); - expect(data.trapKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.trapKills).toEqualTypeOf(); - expect(data.bowKills).toBeDefined(); - expect(data.bowKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowKills).toEqualTypeOf(); - expect(data.killsAsMurderer).toBeDefined(); - expect(data.killsAsMurderer).toBeGreaterThanOrEqual(0); - expectTypeOf(data.killsAsMurderer).toEqualTypeOf(); - expect(data.deaths).toBeDefined(); - expect(data.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.deaths).toEqualTypeOf(); - expect(data.KDR).toBeDefined(); - expect(data.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.KDR).toEqualTypeOf(); - expect(data.winsAsMurderer).toBeDefined(); - expect(data.winsAsMurderer).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winsAsMurderer).toEqualTypeOf(); - expect(data.winsAsDetective).toBeDefined(); - expect(data.winsAsDetective).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winsAsDetective).toEqualTypeOf(); - expect(data.winsAsHero).toBeDefined(); - expect(data.winsAsHero).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winsAsHero).toEqualTypeOf(); - expect(data.fastestWinAsMurderer).toBeDefined(); - expect(data.fastestWinAsMurderer).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fastestWinAsMurderer).toEqualTypeOf(); - expect(data.fastestWinAsDetective).toBeDefined(); - expect(data.fastestWinAsDetective).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fastestWinAsDetective).toEqualTypeOf(); - expect(data.totalTimeSurvived).toBeDefined(); - expect(data.totalTimeSurvived).toBeGreaterThanOrEqual(0); - expectTypeOf(data.totalTimeSurvived).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.suicides).toBeDefined(); - expect(data.suicides).toBeGreaterThanOrEqual(0); - expectTypeOf(data.suicides).toEqualTypeOf(); - expect(data.classic).toBeDefined(); - expectTypeOf(data.classic).toEqualTypeOf(); - expect(data.assassins).toBeDefined(); - expectTypeOf(data.assassins).toEqualTypeOf(); - expect(data.doubleUp).toBeDefined(); - expectTypeOf(data.doubleUp).toEqualTypeOf(); - expect(data.infection).toBeDefined(); - expectTypeOf(data.infection).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/MurderMystery/MurderMystery.ts b/src/Structures/MiniGames/MurderMystery/MurderMystery.ts index fd4efeaae..64162d53b 100644 --- a/src/Structures/MiniGames/MurderMystery/MurderMystery.ts +++ b/src/Structures/MiniGames/MurderMystery/MurderMystery.ts @@ -1,54 +1,218 @@ -import Divide from '../../../Utils/Divide.js'; -import MurderMysteryModeStats from './MurderMysteryModeStats.js'; +import Emblem from '../Shared/Emblem/Emblem.js'; +import LeaderboardSettings from '../Shared/LeaderboardSettings.js'; +import MurderMysteryDescent from './MurderMysteryDescent.js'; +import MurderMysteryFavorites from './MurderMysteryFavorites.ts'; +import MurderMysteryGamemode from './MurderMysteryGamemode.ts'; +import MurderMysteryKnifeSkinPrestige from './MurderMysteryKnifeSkinPrestige.ts'; +import MurderMysteryMap from './MurderMysteryMap.ts'; +import type { + MurderMysteryAnimatedHat, + MurderMysteryDeathCry, + MurderMysteryDescentMode, + MurderMysteryEmblemIcon, + MurderMysteryGesture, + MurderMysteryGravestone, + MurderMysteryItem, + MurderMysteryKillNote, + MurderMysteryKnifeSkin, + MurderMysteryLastWords, + MurderMysteryMapName, + MurderMysteryProjectileTrail, + MurderMysteryRole, + MurderMysteryVictoryDance, + ShopSort +} from '../../../Types/Player.ts'; class MurderMystery { + activeAnimatedHat: MurderMysteryAnimatedHat | 'UNKNOWN'; + activeDeathCry: MurderMysteryDeathCry | 'UNKNOWN'; + activeGesture: MurderMysteryGesture | 'UNKNOWN'; + activeGravestone: MurderMysteryGravestone | 'UNKNOWN'; + activeKillNote: MurderMysteryKillNote | 'UNKNOWN'; + activeKnifeSkin: MurderMysteryKnifeSkin | 'UNKNOWN'; + activeLastWords: MurderMysteryLastWords | 'UNKNOWN'; + activeProjectileTrail: MurderMysteryProjectileTrail | 'UNKNOWN'; + activeVictoryDance: MurderMysteryVictoryDance | 'UNKNOWN'; + alphaWins: number; + bowKills: number; + chestHistoryNew: MurderMysteryItem[]; tokens: number; - goldPickedUp: number; - playedGames: number; + tokensPickedUp: number; + deaths: number; + descent: MurderMysteryDescent; + detectiveWins: number; + doEmblemsInGame: boolean; + doHeartbeatSounds: boolean; + doHints: boolean; + emblem: Emblem; + favoriteDescentMode: MurderMysteryDescentMode | 'UNKNOWN'; + favorites: MurderMysteryFavorites; + games: number; + grantedChests: number; kills: number; - thrownKnifeKills: number; + knifeSkinPrestiges: MurderMysteryKnifeSkinPrestige; + leaderboardSettings: LeaderboardSettings<'UNKNOWN'>; knifeKills: number; + lastOneAlive: number; + longestTimeAsSurvivorSeconds: number; + mapsConsumablesUsed: MurderMysteryMapName[]; + mapsMurdererTrapKills: MurderMysteryMapName[]; + chestHistory: MurderMysteryItem[]; + chests: number; + christmasChests: number; + easterChests: number; + goldenChests: number; + halloweenChests: number; + lunarChests: number; + merryChests: number; + murdererWins: number; + books: MurderMysteryRole[]; + quickestDetectiveWinTimeSeconds: number; + quickestMurdererWinTimeSeconds: number; + quickestShowdownWinTimeSeconds: number; + shopSort: ShopSort | 'UNKNOWN'; + shopSortEnableOwnedFirst: boolean; + showdownPotg: number; + showQueueBook: boolean; + spookyOpenAch: number; + suicides: number; + survivorWins: number; + thrownKnifeKills: number; + totalTimeSurvivedSeconds: number; trapKills: number; - bowKills: number; - killsAsMurderer: number; - deaths: number; - KDR: number; - winsAsMurderer: number; - winsAsDetective: number; - winsAsHero: number; - fastestWinAsMurderer: number; - fastestWinAsDetective: number; - totalTimeSurvived: number; + wasHero: number; wins: number; - suicides: number; - classic: MurderMysteryModeStats; - assassins: MurderMysteryModeStats; - doubleUp: MurderMysteryModeStats; - infection: MurderMysteryModeStats; + openedChests: number; + openedCommons: number; + openedEpics: number; + openedLegendaries: number; + openedRares: number; + ancientTomb: MurderMysteryMap; + aquarium: MurderMysteryMap; + archives: MurderMysteryMap; + archivesTopFloor: MurderMysteryMap; + cattleridgeFarm: MurderMysteryMap; + cruiseShip: MurderMysteryMap; + darkfall: MurderMysteryMap; + easterWorld: MurderMysteryMap; + goldRush: MurderMysteryMap; + headquarters: MurderMysteryMap; + hollywood: MurderMysteryMap; + hypixelWorld: MurderMysteryMap; + library: MurderMysteryMap; + mountain: MurderMysteryMap; + sanPeratico: MurderMysteryMap; + sanPeraticoV2: MurderMysteryMap; + skywayPier: MurderMysteryMap; + snowfall: MurderMysteryMap; + snowglobe: MurderMysteryMap; + spookyMansion: MurderMysteryMap; + subway: MurderMysteryMap; + towerfall: MurderMysteryMap; + transport: MurderMysteryMap; + villa: MurderMysteryMap; + widowsDen: MurderMysteryMap; + assassins: MurderMysteryGamemode; + classic: MurderMysteryGamemode; + doubleUp: MurderMysteryGamemode; + hardcode: MurderMysteryGamemode; + infection: MurderMysteryGamemode; + showdown: MurderMysteryGamemode; constructor(data: Record) { - this.tokens = data?.coins || data?.tokens || 0; - this.goldPickedUp = data?.coins_pickedup || 0; - this.playedGames = data?.games || 0; + this.activeAnimatedHat = data?.active_animated_hat || 'UNKNOWN'; + this.activeDeathCry = data?.active_deathcry || 'UNKNOWN'; + this.activeGesture = data?.active_gesture || 'UNKNOWN'; + this.activeGravestone = data?.active_gravestone || 'UNKNOWN'; + this.activeKillNote = data?.active_kill_note || 'UNKNOWN'; + this.activeKnifeSkin = data?.active_knife_skin || 'UNKNOWN'; + this.activeLastWords = data?.active_last_words || 'UNKNOWN'; + this.activeProjectileTrail = data?.active_projectile_trail || data?.activeProjectileTrail || 'UNKNOWN'; + this.activeVictoryDance = data?.active_victory_dance || 'UNKNOWN'; + this.alphaWins = data?.alpha_wins || 0; + this.bowKills = data?.bow_kills || 0; + this.chestHistoryNew = data?.chest_history_new || []; + this.tokens = data?.coins || 0; + this.tokensPickedUp = data?.coins_pickedup || 0; + this.deaths = data?.deaths || 0; + this.descent = new MurderMysteryDescent(data?.descent || {}); + this.detectiveWins = data?.detective_wins || 0; + this.doEmblemsInGame = data?.doEmblemsInGame || false; + this.doHeartbeatSounds = data?.doHeartbeatSounds || false; + this.doHints = data?.doHints || false; + this.emblem = new Emblem(data?.emblem || {}); + this.favoriteDescentMode = data?.favoriteDescentMode || 'UNKNOWN'; + this.favorites = new MurderMysteryFavorites(data?.favorites || {}); + this.games = data?.games || 0; + this.grantedChests = data?.granted_chests || 0; this.kills = data?.kills || 0; - this.thrownKnifeKills = data?.thrown_knife_kills || 0; + this.knifeSkinPrestiges = new MurderMysteryKnifeSkinPrestige(data?.knifeSkinPrestiges || {}); + this.leaderboardSettings = new LeaderboardSettings<'UNKNOWN'>(data?.leaderboardSettings || {}); this.knifeKills = data?.knife_kills || 0; + this.lastOneAlive = data?.last_one_alive || 0; + this.longestTimeAsSurvivorSeconds = data?.longest_time_as_survivor_seconds || 0; + this.mapsConsumablesUsed = data?.mapsConsumablesUsed || []; + this.mapsMurdererTrapKills = data?.mapsMurdererTrapKills || []; + this.chestHistory = data?.mm_chest_history || []; + this.chests = data?.mm_chests || 0; + this.christmasChests = data?.mm_christmas_chests || 0; + this.easterChests = data?.mm_easter_chests || 0; + this.goldenChests = data?.mm_golden_chests || 0; + this.halloweenChests = data?.mm_halloween_chests || 0; + this.lunarChests = data?.mm_lunar_chests || 0; + this.merryChests = data?.mm_merry_chests || 0; + this.murdererWins = data?.murderer_wins || 0; + this.books = data?.murdermystery_books || []; + this.quickestDetectiveWinTimeSeconds = data?.quickest_detective_win_time_seconds || 0; + this.quickestMurdererWinTimeSeconds = data?.quickest_murderer_win_time_seconds || 0; + this.quickestShowdownWinTimeSeconds = data?.quickest_showdown_win_time_seconds || 0; + this.shopSort = data?.shop_sort || false; + this.shopSortEnableOwnedFirst = data?.shop_sort_enable_owned_first || false; + this.showdownPotg = data?.showdown_potg || 0; + this.showQueueBook = data?.showqueuebook || true; + this.spookyOpenAch = data?.spooky_open_ach || 0; + this.suicides = data?.suicides || 0; + this.survivorWins = data?.survivor_wins || 0; + this.thrownKnifeKills = data?.thrown_knife_kills || 0; + this.totalTimeSurvivedSeconds = data?.total_time_survived_seconds || 0; this.trapKills = data?.trap_kills || 0; - this.bowKills = data?.bow_kills || 0; - this.killsAsMurderer = data?.kills_as_murderer || 0; - this.deaths = data?.deaths || 0; - this.KDR = Divide(this.kills, this.deaths); - this.winsAsMurderer = data?.murderer_wins || 0; - this.winsAsDetective = data?.detective_wins || 0; - this.winsAsHero = data?.was_hero || 0; - this.fastestWinAsMurderer = data?.quickest_murderer_win_time_seconds || 0; - this.fastestWinAsDetective = data?.quickest_detective_win_time_seconds || 0; - this.totalTimeSurvived = data?.total_time_survived_seconds || 0; + this.wasHero = data?.was_hero || 0; this.wins = data?.wins || 0; - this.suicides = data?.suicides || 0; - this.classic = new MurderMysteryModeStats(data, 'MURDER_CLASSIC'); - this.assassins = new MurderMysteryModeStats(data, 'MURDER_ASSASSINS'); - this.doubleUp = new MurderMysteryModeStats(data, 'MURDER_DOUBLE_UP'); - this.infection = new MurderMysteryModeStats(data, 'MURDER_INFECTION'); + this.openedChests = data?.MurderMystery_openedChests || 0; + this.openedCommons = data?.MurderMystery_openedCommons || 0; + this.openedEpics = data?.MurderMystery_openedEpics || 0; + this.openedLegendaries = data?.MurderMystery_openedLegendaries || 0; + this.openedRares = data?.MurderMystery_openedRares || 0; + this.ancientTomb = new MurderMysteryMap(data, 'ancient_tomb'); + this.aquarium = new MurderMysteryMap(data, 'aquarium'); + this.archives = new MurderMysteryMap(data, 'archives'); + this.archivesTopFloor = new MurderMysteryMap(data, 'archives_top_floor'); + this.cattleridgeFarm = new MurderMysteryMap(data, 'cattleridge_farm'); + this.cruiseShip = new MurderMysteryMap(data, 'cruise_ship'); + this.darkfall = new MurderMysteryMap(data, 'darkfall'); + this.easterWorld = new MurderMysteryMap(data, 'easter_world'); + this.goldRush = new MurderMysteryMap(data, 'gold_rush'); + this.headquarters = new MurderMysteryMap(data, 'headquarters'); + this.hollywood = new MurderMysteryMap(data, 'hollywood'); + this.hypixelWorld = new MurderMysteryMap(data, 'hypixel_world'); + this.library = new MurderMysteryMap(data, 'library'); + this.mountain = new MurderMysteryMap(data, 'mountain'); + this.sanPeratico = new MurderMysteryMap(data, 'san_peratico'); + this.sanPeraticoV2 = new MurderMysteryMap(data, 'san_peratico_v2'); + this.skywayPier = new MurderMysteryMap(data, 'skyway_pier'); + this.snowfall = new MurderMysteryMap(data, 'snowfall'); + this.snowglobe = new MurderMysteryMap(data, 'snowglobe'); + this.spookyMansion = new MurderMysteryMap(data, 'spooky_mansion'); + this.subway = new MurderMysteryMap(data, 'subway'); + this.towerfall = new MurderMysteryMap(data, 'towerfall'); + this.transport = new MurderMysteryMap(data, 'transport'); + this.villa = new MurderMysteryMap(data, 'villa'); + this.widowsDen = new MurderMysteryMap(data, "widow's_den"); + this.assassins = new MurderMysteryGamemode(data, 'MURDER_ASSASSINS'); + this.classic = new MurderMysteryGamemode(data, 'MURDER_CLASSIC'); + this.doubleUp = new MurderMysteryGamemode(data, 'MURDER_DOUBLE_UP'); + this.hardcode = new MurderMysteryGamemode(data, 'MURDER_HARDCORE'); + this.infection = new MurderMysteryGamemode(data, 'MURDER_INFECTION'); + this.showdown = new MurderMysteryGamemode(data, 'MURDER_SHOWDOWN'); } } diff --git a/src/Structures/MiniGames/MurderMystery/MurderMysteryDescent.ts b/src/Structures/MiniGames/MurderMystery/MurderMysteryDescent.ts new file mode 100644 index 000000000..fc60837be --- /dev/null +++ b/src/Structures/MiniGames/MurderMystery/MurderMysteryDescent.ts @@ -0,0 +1,110 @@ +import MurderMysteryDescentItem from './MurderMysteryDescentItem.ts'; + +class MurderMysteryDescent { + Armed: MurderMysteryDescentItem; + bloodLust: MurderMysteryDescentItem; + bountyHunter: MurderMysteryDescentItem; + cleanJob: MurderMysteryDescentItem; + Collateral: MurderMysteryDescentItem; + contagionContained: MurderMysteryDescentItem; + Cornucopia: MurderMysteryDescentItem; + crimsonJoy: MurderMysteryDescentItem; + crowdControl: MurderMysteryDescentItem; + cuttingTheroots: MurderMysteryDescentItem; + deadlyPrecision: MurderMysteryDescentItem; + deadorAlive: MurderMysteryDescentItem; + deathDefy: MurderMysteryDescentItem; + distanttransMission: MurderMysteryDescentItem; + doubleDosage: MurderMysteryDescentItem; + dualProficiency: MurderMysteryDescentItem; + exponentiation: MurderMysteryDescentItem; + eyeonPrey: MurderMysteryDescentItem; + firstJob: MurderMysteryDescentItem; + firstOfMany: MurderMysteryDescentItem; + firstSteps: MurderMysteryDescentItem; + grandSlam: MurderMysteryDescentItem; + hero: MurderMysteryDescentItem; + highRoller: MurderMysteryDescentItem; + holdGround: MurderMysteryDescentItem; + huntsman: MurderMysteryDescentItem; + jobSearch: MurderMysteryDescentItem; + lawMaker: MurderMysteryDescentItem; + Legacy: MurderMysteryDescentItem; + localSpecialty: MurderMysteryDescentItem; + lurkingContagion: MurderMysteryDescentItem; + makeshiftShield: MurderMysteryDescentItem; + mowingDown: MurderMysteryDescentItem; + oneOfUs: MurderMysteryDescentItem; + paneKiller: MurderMysteryDescentItem; + patientZero: MurderMysteryDescentItem; + postPandemic: MurderMysteryDescentItem; + pythagoreanDisposal: MurderMysteryDescentItem; + quickDraw: MurderMysteryDescentItem; + reloaded: MurderMysteryDescentItem; + seasonedHitman: MurderMysteryDescentItem; + selfDefense: MurderMysteryDescentItem; + serialTrapper: MurderMysteryDescentItem; + silverBullet: MurderMysteryDescentItem; + slaughterHouse: MurderMysteryDescentItem; + sneaky: MurderMysteryDescentItem; + survival: MurderMysteryDescentItem; + totaloutBreak: MurderMysteryDescentItem; + trapping101: MurderMysteryDescentItem; + trulyMad: MurderMysteryDescentItem; + viralKnife: MurderMysteryDescentItem; + constructor(data: Record) { + this.Armed = new MurderMysteryDescentItem(data?.Armed || {}); + this.bloodLust = new MurderMysteryDescentItem(data?.Bloodlust || {}); + this.bountyHunter = new MurderMysteryDescentItem(data?.Bountyhunter || {}); + this.cleanJob = new MurderMysteryDescentItem(data?.Cleanjob || {}); + this.Collateral = new MurderMysteryDescentItem(data?.Collateral || {}); + this.contagionContained = new MurderMysteryDescentItem(data?.Contagioncontained || {}); + this.Cornucopia = new MurderMysteryDescentItem(data?.Cornucopia || {}); + this.crimsonJoy = new MurderMysteryDescentItem(data?.Crimsonjoy || {}); + this.crowdControl = new MurderMysteryDescentItem(data?.Crowdcontrol || {}); + this.cuttingTheroots = new MurderMysteryDescentItem(data?.Cuttingtheroots || {}); + this.deadlyPrecision = new MurderMysteryDescentItem(data?.Deadlyprecision || {}); + this.deadorAlive = new MurderMysteryDescentItem(data?.Deadoralive || {}); + this.deathDefy = new MurderMysteryDescentItem(data?.Deathdefy || {}); + this.distanttransMission = new MurderMysteryDescentItem(data?.Distanttransmission || {}); + this.doubleDosage = new MurderMysteryDescentItem(data?.Doubledosage || {}); + this.dualProficiency = new MurderMysteryDescentItem(data?.Dualproficiency || {}); + this.exponentiation = new MurderMysteryDescentItem(data?.Exponentiation || {}); + this.eyeonPrey = new MurderMysteryDescentItem(data?.Eyeonprey || {}); + this.firstJob = new MurderMysteryDescentItem(data?.Firstjob || {}); + this.firstOfMany = new MurderMysteryDescentItem(data?.Firstofmany || {}); + this.firstSteps = new MurderMysteryDescentItem(data?.Firststeps || {}); + this.grandSlam = new MurderMysteryDescentItem(data?.Grandslam || {}); + this.hero = new MurderMysteryDescentItem(data?.Hero || {}); + this.highRoller = new MurderMysteryDescentItem(data?.Highroller || {}); + this.holdGround = new MurderMysteryDescentItem(data?.Holdground || {}); + this.huntsman = new MurderMysteryDescentItem(data?.Huntsman || {}); + this.jobSearch = new MurderMysteryDescentItem(data?.Jobsearch || {}); + this.lawMaker = new MurderMysteryDescentItem(data?.Lawmaker || {}); + this.Legacy = new MurderMysteryDescentItem(data?.Legacy || {}); + this.localSpecialty = new MurderMysteryDescentItem(data?.Localspecialty || {}); + this.lurkingContagion = new MurderMysteryDescentItem(data?.Lurkingcontagion || {}); + this.makeshiftShield = new MurderMysteryDescentItem(data?.Makeshiftshield || {}); + this.mowingDown = new MurderMysteryDescentItem(data?.Mowingdown || {}); + this.oneOfUs = new MurderMysteryDescentItem(data?.Oneofus || {}); + this.paneKiller = new MurderMysteryDescentItem(data?.Panekiller || {}); + this.patientZero = new MurderMysteryDescentItem(data?.Patientzero || {}); + this.postPandemic = new MurderMysteryDescentItem(data?.Postpandemic || {}); + this.pythagoreanDisposal = new MurderMysteryDescentItem(data?.Pythagoreandisposal || {}); + this.quickDraw = new MurderMysteryDescentItem(data?.Quickdraw || {}); + this.reloaded = new MurderMysteryDescentItem(data?.Reloaded || {}); + this.seasonedHitman = new MurderMysteryDescentItem(data?.Seasonedhitman || {}); + this.selfDefense = new MurderMysteryDescentItem(data?.Selfdefense || {}); + this.serialTrapper = new MurderMysteryDescentItem(data?.Serialtrapper || {}); + this.silverBullet = new MurderMysteryDescentItem(data?.Silverbullet || {}); + this.slaughterHouse = new MurderMysteryDescentItem(data?.Slaughterhouse || {}); + this.sneaky = new MurderMysteryDescentItem(data?.Sneaky || {}); + this.survival = new MurderMysteryDescentItem(data?.Survival || {}); + this.totaloutBreak = new MurderMysteryDescentItem(data?.Totaloutbreak || {}); + this.trapping101 = new MurderMysteryDescentItem(data?.Trapping101 || {}); + this.trulyMad = new MurderMysteryDescentItem(data?.Trulymad || {}); + this.viralKnife = new MurderMysteryDescentItem(data?.Viralknife || {}); + } +} + +export default MurderMysteryDescent; diff --git a/src/Structures/MiniGames/MurderMystery/MurderMysteryDescentItem.ts b/src/Structures/MiniGames/MurderMystery/MurderMysteryDescentItem.ts new file mode 100644 index 000000000..e8ad7fb35 --- /dev/null +++ b/src/Structures/MiniGames/MurderMystery/MurderMysteryDescentItem.ts @@ -0,0 +1,10 @@ +class MurderMysteryDescentItem { + claimed: boolean; + progress: number; + constructor(data: Record) { + this.claimed = data?.claimed || false; + this.progress = data?.progress || 0; + } +} + +export default MurderMysteryDescentItem; diff --git a/src/Structures/MiniGames/MurderMystery/MurderMysteryFavorites.ts b/src/Structures/MiniGames/MurderMystery/MurderMysteryFavorites.ts new file mode 100644 index 000000000..59b533e1e --- /dev/null +++ b/src/Structures/MiniGames/MurderMystery/MurderMysteryFavorites.ts @@ -0,0 +1,36 @@ +import type { + MurderMysteryAnimatedHatRaw, + MurderMysteryDeathCryRaw, + MurderMysteryGestureRaw, + MurderMysteryGravestoneRaw, + MurderMysteryKillNoteRaw, + MurderMysteryKnifeSkinRaw, + MurderMysteryLastWordsRaw, + MurderMysteryProjectileTrailRaw, + MurderMysteryVictoryDanceRaw +} from '../../../Types/Player.ts'; + +class MurderMysteryFavorites { + animatedHat: MurderMysteryAnimatedHatRaw[]; + deathCry: MurderMysteryDeathCryRaw[]; + gesture: MurderMysteryGestureRaw[]; + gravestone: MurderMysteryGravestoneRaw[]; + killNote: MurderMysteryKillNoteRaw[]; + knifeSkin: MurderMysteryKnifeSkinRaw[]; + lastWords: MurderMysteryLastWordsRaw[]; + projectileTrail: MurderMysteryProjectileTrailRaw[]; + victoryDance: MurderMysteryVictoryDanceRaw[]; + constructor(data: Record) { + this.animatedHat = data?.animated_hat || []; + this.deathCry = data?.deathcry || []; + this.gesture = data?.gesture || []; + this.gravestone = data?.gravestone || []; + this.killNote = data?.kill_note || []; + this.knifeSkin = data?.knife_skin || []; + this.lastWords = data?.last_words || []; + this.projectileTrail = data?.projectile_trail || []; + this.victoryDance = data?.victory_dance || []; + } +} + +export default MurderMysteryFavorites; diff --git a/src/Structures/MiniGames/MurderMystery/MurderMysteryGamemode.ts b/src/Structures/MiniGames/MurderMystery/MurderMysteryGamemode.ts new file mode 100644 index 000000000..a88ae9d5c --- /dev/null +++ b/src/Structures/MiniGames/MurderMystery/MurderMysteryGamemode.ts @@ -0,0 +1,47 @@ +import type { MurderMysteryMapName, MurderMysteryMode } from '../../../Types/Player.ts'; + +class MurderMysteryGamemode { + alphaWins: number; + bowKills: number; + tokensPickedUp: number; + deaths: number; + detectiveWins: number; + games: number; + kills: number; + lastOneAlive: number; + longestTimeAsSurvivorSeconds: number; + murdererWins: number; + quickestDetectiveWinTimeSeconds: number; + quickestMurdererWinTimeSeconds: number; + quickestShowdownWinTimeSeconds: number; + showdownPotg: number; + suicides: number; + survivorWins: number; + totalTimeSurvivedSeconds: number; + wasHero: number; + wins: number; + constructor(data: Record, gamemode: MurderMysteryMode, map?: MurderMysteryMapName) { + const key = `${gamemode}${map ? `_${map}` : ''}`; + this.alphaWins = data?.[`alpha_wins_${key}`]; + this.bowKills = data?.[`bow_kills_${key}`]; + this.tokensPickedUp = data?.[`coins_pickedup_${key}`]; + this.deaths = data?.[`deaths_${key}`]; + this.detectiveWins = data?.[`detective_wins_${key}`]; + this.games = data?.[`games_${key}`]; + this.kills = data?.[`kills_${key}`]; + this.lastOneAlive = data?.[`last_one_alive_${key}`]; + this.longestTimeAsSurvivorSeconds = data?.[`longest_time_as_survivor_seconds_${key}`]; + this.murdererWins = data?.[`murderer_wins_${key}`]; + this.quickestDetectiveWinTimeSeconds = data?.[`quickest_detective_win_time_seconds_${key}`]; + this.quickestMurdererWinTimeSeconds = data?.[`quickest_murderer_win_time_seconds_${key}`]; + this.quickestShowdownWinTimeSeconds = data?.[`quickest_showdown_win_time_seconds_${key}`]; + this.showdownPotg = data?.[`showdown_potg_${key}`]; + this.suicides = data?.[`suicides_${key}`]; + this.survivorWins = data?.[`survivor_wins_${key}`]; + this.totalTimeSurvivedSeconds = data?.[`total_time_survived_seconds_${key}`]; + this.wasHero = data?.[`was_hero_${key}`]; + this.wins = data?.[`wins_${key}`]; + } +} + +export default MurderMysteryGamemode; diff --git a/src/Structures/MiniGames/MurderMystery/MurderMysteryKnifeSkinPrestige.ts b/src/Structures/MiniGames/MurderMystery/MurderMysteryKnifeSkinPrestige.ts new file mode 100644 index 000000000..e5b680be4 --- /dev/null +++ b/src/Structures/MiniGames/MurderMystery/MurderMysteryKnifeSkinPrestige.ts @@ -0,0 +1,13 @@ +import MurderMysteryKnifeSkinPrestigeXp from './MurderMysteryKnifeSkinPrestigeXp.ts'; +import type { MurderMysteryKnifeSkinRaw } from '../../../Types/Player.ts'; + +class MurderMysteryKnifeSkinPrestige { + usePrestige: MurderMysteryKnifeSkinRaw[]; + xp: MurderMysteryKnifeSkinPrestigeXp; + constructor(data: Record) { + this.usePrestige = data?.usePrestige || []; + this.xp = new MurderMysteryKnifeSkinPrestigeXp(data?.xp || {}); + } +} + +export default MurderMysteryKnifeSkinPrestige; diff --git a/src/Structures/MiniGames/MurderMystery/MurderMysteryKnifeSkinPrestigeXp.ts b/src/Structures/MiniGames/MurderMystery/MurderMysteryKnifeSkinPrestigeXp.ts new file mode 100644 index 000000000..02a854020 --- /dev/null +++ b/src/Structures/MiniGames/MurderMystery/MurderMysteryKnifeSkinPrestigeXp.ts @@ -0,0 +1,92 @@ +class MurderMysteryKnifeSkinPrestigeXp { + '10000Spoons': number; + apple: number; + bastedTurkey: number; + blazeStick: number; + bloodyBrick: number; + bone: number; + campfireLeftovers: number; + carrotOnStick: number; + cheapo: number; + cheese: number; + chewedBush: number; + diamondShovel: number; + doubleDeathScythe: number; + dragonEgg: number; + earthenDagger: number; + easterBasket: number; + farmingImplement: number; + feather: number; + fragilePlant: number; + frisbee: number; + glisteningMelon: number; + goldDigger: number; + grilledSteak: number; + grimoire: number; + iceShard: number; + mouseTrap: number; + prickly: number; + pumpkinPie: number; + rudolphsNose: number; + rudolphsSnack: number; + salmon: number; + scythe: number; + shears: number; + shinySnack: number; + shovel: number; + shred: number; + sprayPaintedShovel: number; + stake: number; + stick: number; + stickWithHat: number; + sweetTreat: number; + timber: number; + woodAxe: number; + constructor(data: Record) { + this['10000Spoons'] = data?.['10000_spoons'] || 0; + this.apple = data?.apple || 0; + this.bastedTurkey = data?.basted_turkey || 0; + this.blazeStick = data?.blaze_stick || 0; + this.bloodyBrick = data?.bloody_brick || 0; + this.bone = data?.bone || 0; + this.campfireLeftovers = data?.campfire_leftovers || 0; + this.carrotOnStick = data?.carrot_on_stick || 0; + this.cheapo = data?.cheapo || 0; + this.cheese = data?.cheese || 0; + this.chewedBush = data?.chewed_bush || 0; + this.diamondShovel = data?.diamond_shovel || 0; + this.doubleDeathScythe = data?.double_death_scythe || 0; + this.dragonEgg = data?.dragon_egg || 0; + this.earthenDagger = data?.earthen_dagger || 0; + this.easterBasket = data?.easter_basket || 0; + this.farmingImplement = data?.farming_implement || 0; + this.feather = data?.feather || 0; + this.fragilePlant = data?.fragile_plant || 0; + this.frisbee = data?.frisbee || 0; + this.glisteningMelon = data?.glistening_melon || 0; + this.goldDigger = data?.gold_digger || 0; + this.grilledSteak = data?.grilled_steak || 0; + this.grimoire = data?.grimoire || 0; + this.iceShard = data?.ice_shard || 0; + this.mouseTrap = data?.mouse_trap || 0; + this.prickly = data?.prickly || 0; + this.pumpkinPie = data?.pumpkin_pie || 0; + this.rudolphsNose = data?.rudolphs_nose || 0; + this.rudolphsSnack = data?.rudolphs_snack || 0; + this.salmon = data?.salmon || 0; + this.scythe = data?.scythe || 0; + this.shears = data?.shears || 0; + this.shinySnack = data?.shiny_snack || 0; + this.shovel = data?.shovel || 0; + this.shred = data?.shred || 0; + this.sprayPaintedShovel = data?.spray_painted_shovel || 0; + this.stake = data?.stake || 0; + this.stick = data?.stick || 0; + this.stickWithHat = data?.stick_with_hat || 0; + this.sweetTreat = data?.sweet_treat || 0; + this.timber = data?.timber || 0; + this.woodAxe = data?.wood_axe || 0; + } +} + +export default MurderMysteryKnifeSkinPrestigeXp; diff --git a/src/Structures/MiniGames/MurderMystery/MurderMysteryMap.ts b/src/Structures/MiniGames/MurderMystery/MurderMysteryMap.ts new file mode 100644 index 000000000..10c6bd6e3 --- /dev/null +++ b/src/Structures/MiniGames/MurderMystery/MurderMysteryMap.ts @@ -0,0 +1,59 @@ +import MurderMysteryGamemode from './MurderMysteryGamemode.ts'; +import type { MurderMysteryMapName } from '../../../Types/Player.ts'; + +class MurderMysteryMap { + alphaWins: number; + bowKills: number; + tokensPickedUp: number; + deaths: number; + detectiveWins: number; + games: number; + kills: number; + lastOneAlive: number; + longestTimeAsSurvivorSeconds: number; + murdererWins: number; + quickestDetectiveWinTimeSeconds: number; + quickestMurdererWinTimeSeconds: number; + quickestShowdownWinTimeSeconds: number; + showdownPotg: number; + suicides: number; + survivorWins: number; + totalTimeSurvivedSeconds: number; + wasHero: number; + wins: number; + assassins: MurderMysteryGamemode; + classic: MurderMysteryGamemode; + doubleUp: MurderMysteryGamemode; + hardcode: MurderMysteryGamemode; + infection: MurderMysteryGamemode; + showdown: MurderMysteryGamemode; + constructor(data: Record, map: MurderMysteryMapName) { + this.alphaWins = data?.[`alpha_wins_${map}`]; + this.bowKills = data?.[`bow_kills_${map}`]; + this.tokensPickedUp = data?.[`coins_pickedup_${map}`]; + this.deaths = data?.[`deaths_${map}`]; + this.detectiveWins = data?.[`detective_wins_${map}`]; + this.games = data?.[`games_${map}`]; + this.kills = data?.[`kills_${map}`]; + this.lastOneAlive = data?.[`last_one_alive_${map}`]; + this.longestTimeAsSurvivorSeconds = data?.[`longest_time_as_survivor_seconds_${map}`]; + this.murdererWins = data?.[`murderer_wins_${map}`]; + this.quickestDetectiveWinTimeSeconds = data?.[`quickest_detective_win_time_seconds_${map}`]; + this.quickestMurdererWinTimeSeconds = data?.[`quickest_murderer_win_time_seconds_${map}`]; + this.quickestShowdownWinTimeSeconds = data?.[`quickest_showdown_win_time_seconds_${map}`]; + this.showdownPotg = data?.[`showdown_potg_${map}`]; + this.suicides = data?.[`suicides_${map}`]; + this.survivorWins = data?.[`survivor_wins_${map}`]; + this.totalTimeSurvivedSeconds = data?.[`total_time_survived_seconds_${map}`]; + this.wasHero = data?.[`was_hero_${map}`]; + this.wins = data?.[`wins_${map}`]; + this.assassins = new MurderMysteryGamemode(data, 'MURDER_ASSASSINS', map); + this.classic = new MurderMysteryGamemode(data, 'MURDER_CLASSIC', map); + this.doubleUp = new MurderMysteryGamemode(data, 'MURDER_DOUBLE_UP', map); + this.hardcode = new MurderMysteryGamemode(data, 'MURDER_HARDCORE', map); + this.infection = new MurderMysteryGamemode(data, 'MURDER_INFECTION', map); + this.showdown = new MurderMysteryGamemode(data, 'MURDER_SHOWDOWN', map); + } +} + +export default MurderMysteryMap; diff --git a/src/Structures/MiniGames/MurderMystery/MurderMysteryModeStats.test.ts b/src/Structures/MiniGames/MurderMystery/MurderMysteryModeStats.test.ts deleted file mode 100644 index d98f0ea5b..000000000 --- a/src/Structures/MiniGames/MurderMystery/MurderMysteryModeStats.test.ts +++ /dev/null @@ -1,51 +0,0 @@ -import MurderMysteryModeStats from './MurderMysteryModeStats.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('MurderMystery', () => { - const data = new MurderMysteryModeStats({ stats: 'meow' }, 'MURDER_ASSASSINS'); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(MurderMysteryModeStats); - expectTypeOf(data).toEqualTypeOf(); - expect(data.goldPickedUp).toBeDefined(); - expect(data.goldPickedUp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.goldPickedUp).toEqualTypeOf(); - expect(data.kills).toBeDefined(); - expect(data.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.kills).toEqualTypeOf(); - expect(data.thrownKnifeKills).toBeDefined(); - expect(data.thrownKnifeKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.thrownKnifeKills).toEqualTypeOf(); - expect(data.knifeKills).toBeDefined(); - expect(data.knifeKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.knifeKills).toEqualTypeOf(); - expect(data.bowKills).toBeDefined(); - expect(data.bowKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowKills).toEqualTypeOf(); - expect(data.trapKills).toBeDefined(); - expect(data.trapKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.trapKills).toEqualTypeOf(); - expect(data.deaths).toBeDefined(); - expect(data.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.deaths).toEqualTypeOf(); - expect(data.suicides).toBeDefined(); - expect(data.suicides).toBeGreaterThanOrEqual(0); - expectTypeOf(data.suicides).toEqualTypeOf(); - expect(data.KDR).toBeDefined(); - expect(data.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.KDR).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.winsAsDetective).toBeDefined(); - expect(data.winsAsDetective).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winsAsDetective).toEqualTypeOf(); - expect(data.winsAsMurderer).toBeDefined(); - expect(data.winsAsMurderer).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winsAsMurderer).toEqualTypeOf(); - expect(data.winsAsHero).toBeDefined(); - expect(data.winsAsHero).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winsAsHero).toEqualTypeOf(); - expect(data.playedGames).toBeDefined(); - expect(data.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.playedGames).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/MurderMystery/MurderMysteryModeStats.ts b/src/Structures/MiniGames/MurderMystery/MurderMysteryModeStats.ts deleted file mode 100644 index 35d651466..000000000 --- a/src/Structures/MiniGames/MurderMystery/MurderMysteryModeStats.ts +++ /dev/null @@ -1,37 +0,0 @@ -import Divide from '../../../Utils/Divide.js'; -import type { MurderMysteryModes } from '../../../Types/Player.js'; - -class MurderMysteryModeStats { - goldPickedUp: number; - kills: number; - thrownKnifeKills: number; - knifeKills: number; - bowKills: number; - trapKills: number; - deaths: number; - suicides: number; - KDR: number; - wins: number; - winsAsDetective: number; - winsAsMurderer: number; - winsAsHero: number; - playedGames: number; - constructor(data: Record, gamemode: MurderMysteryModes) { - this.goldPickedUp = data?.[`coins_pickedup_${gamemode}`] || 0; - this.kills = data?.[`kills_${gamemode}`] || 0; - this.thrownKnifeKills = data?.[`thrown_knife_kills_${gamemode}`] || 0; - this.knifeKills = data?.[`knife_kills_${gamemode}`] || 0; - this.bowKills = data?.[`bow_kills_${gamemode}`] || 0; - this.trapKills = data?.[`trap_kills_${gamemode}`] || 0; - this.deaths = data?.[`deaths_${gamemode}`] || 0; - this.suicides = data?.[`suicides_${gamemode}`] || 0; - this.KDR = Divide(this.kills, this.deaths); - this.wins = data?.[`wins_${gamemode}`] || 0; - this.winsAsDetective = data?.[`detective_wins_${gamemode}`] || 0; - this.winsAsMurderer = data?.[`murderer_wins_${gamemode}`] || 0; - this.winsAsHero = data?.[`was_hero_${gamemode}`] || 0; - this.playedGames = data?.[`games_${gamemode}`] || 0; - } -} - -export default MurderMysteryModeStats; diff --git a/src/Structures/MiniGames/Shared/Emblem/Emblem.ts b/src/Structures/MiniGames/Shared/Emblem/Emblem.ts new file mode 100644 index 000000000..e44a82467 --- /dev/null +++ b/src/Structures/MiniGames/Shared/Emblem/Emblem.ts @@ -0,0 +1,15 @@ +import EmblemColors from './EmblemColors.ts'; +import type { ColorCode } from '../../../../Types/Color.ts'; + +class Emblem { + colorUnlocked: EmblemColors; + selectedColor: ColorCode | 'UNKNOWN'; + selectedIcon: Icons | 'UNKNOWN'; + constructor(data: Record) { + this.colorUnlocked = new EmblemColors(data?.color_unlocked || {}); + this.selectedColor = data?.selected_color || 'UNKNOWN'; + this.selectedIcon = data?.selected_icon || 'UNKNOWN'; + } +} + +export default Emblem; diff --git a/src/Structures/MiniGames/BuildBattle/Emblem/BuildBattleEmblemColors.ts b/src/Structures/MiniGames/Shared/Emblem/EmblemColors.ts similarity index 92% rename from src/Structures/MiniGames/BuildBattle/Emblem/BuildBattleEmblemColors.ts rename to src/Structures/MiniGames/Shared/Emblem/EmblemColors.ts index 3f842db16..2e39df1b3 100644 --- a/src/Structures/MiniGames/BuildBattle/Emblem/BuildBattleEmblemColors.ts +++ b/src/Structures/MiniGames/Shared/Emblem/EmblemColors.ts @@ -1,4 +1,4 @@ -class BuildBattleEmblemColors { +class EmblemColors { aqua: boolean; black: boolean; blue: boolean; @@ -31,4 +31,4 @@ class BuildBattleEmblemColors { } } -export default BuildBattleEmblemColors; +export default EmblemColors; diff --git a/src/Structures/MiniGames/Shared/LeaderboardSettings.ts b/src/Structures/MiniGames/Shared/LeaderboardSettings.ts new file mode 100644 index 000000000..f684a01a1 --- /dev/null +++ b/src/Structures/MiniGames/Shared/LeaderboardSettings.ts @@ -0,0 +1,12 @@ +import type { LeaderboardSettingsResetType } from '../../../Types/Player.ts'; + +class LeaderboardSettings { + mode: ModeType | 'UNKNOWN'; + resetType: LeaderboardSettingsResetType | 'UNKNOWN'; + constructor(data: Record) { + this.mode = data?.mode || 'UNKNOWN'; + this.resetType = data?.resetType || 'UNKNOWN'; + } +} + +export default LeaderboardSettings; diff --git a/src/Types/Player.ts b/src/Types/Player.ts index 587edb76d..32d4a11b4 100644 --- a/src/Types/Player.ts +++ b/src/Types/Player.ts @@ -22,7 +22,6 @@ export type ArenaBrawlModes = '1v1' | '2v2' | '4v4'; export type ArenaBrawlRunes = 'slowing' | 'energy' | 'damage' | 'tank' | 'speed'; export type MiniWallsKits = 'soldier' | 'archer' | 'builder'; export type WoolWarsClassNames = 'ASSAULT' | 'TANK' | 'GOLEM' | 'SWORDSMAN' | 'ENGINEER' | 'ARCHER'; -export type MurderMysteryModes = 'MURDER_CLASSIC' | 'MURDER_ASSASSINS' | 'MURDER_DOUBLE_UP' | 'MURDER_INFECTION'; export type SmashHeoresModes = 'normal' | '2v2' | 'teams'; export type SkyWarsBaseModes = 'solo' | 'team'; export type MegaWallsModes = 'face_off' | 'gvg'; @@ -1230,7 +1229,7 @@ export type PlayerCosmeticsParticlePack = export type PlayerCosmeticsClickEffects = 'skull' | 'blizzard' | 'easter_egg' | 'holiday_firework' | 'hypixel'; export type ChatChannel = 'ALL' | 'PARTY' | 'GUILD' | 'OFFICER' | 'PM' | 'SKYBLOCK_COOP'; -export type BuildBattleShopSort = 'rarity_ascending' | 'rarity_descending' | SortName; +export type ShopSort = 'rarity_ascending' | 'rarity_descending' | SortName; export type BuildBattleEmblemIcon = 'ALPHA' | 'OMEGA' | 'PODIUM' | 'REMINISCENCE' | 'RICH'; export type BuildBattleLeaderboardSettingsMode = | 'ALL_MODES' @@ -1240,7 +1239,6 @@ export type BuildBattleLeaderboardSettingsMode = | 'SOLO_LATEST' | 'SPEED_BUILDERS' | 'TEAMS'; -export type BuildBattleLeaderboardSettingsResetType = 'MONTHLY' | 'NEVER' | 'WEEKLY'; export type BuildBattleHat = | 'hats_ancient_hat' | 'hats_bakers_hat' @@ -1632,3 +1630,955 @@ export type BuildBattleTitle = | 'Celestial' | 'Divine' | 'Ascended'; + +export type LeaderboardSettingsResetType = 'MONTHLY' | 'NEVER' | 'WEEKLY'; + +export type MurderMysteryDescentMode = 'ASSASSINS' | 'CLASSIC' | 'INFECTION'; +export type MurderMysteryMode = + | 'MURDER_ASSASSINS' + | 'MURDER_CLASSIC' + | 'MURDER_DOUBLE_UP' + | 'MURDER_HARDCORE' + | 'MURDER_INFECTION' + | 'MURDER_SHOWDOWN'; +export type MurderMysteryVictoryDance = + | 'victory_dance_abominable_snowman' + | 'victory_dance_bad_weather' + | 'victory_dance_bat_swarm' + | 'victory_dance_chicken_rider' + | 'victory_dance_chinese_dragon' + | 'victory_dance_cold_snap' + | 'victory_dance_dragon_fire' + | 'victory_dance_easter_bunnies' + | 'victory_dance_egg_meteors' + | 'victory_dance_exploding_bunnies' + | 'victory_dance_festive_music' + | 'victory_dance_fireworks' + | 'victory_dance_floating_lanterns' + | 'victory_dance_flower_bed' + | 'victory_dance_graveyardrave' + | 'victory_dance_guardians' + | 'victory_dance_haunted' + | 'victory_dance_heat_wave' + | 'victory_dance_infection' + | 'victory_dance_love_aura' + | 'victory_dance_meteor_shower' + | 'victory_dance_night_shift' + | 'victory_dance_pumpkin_bomber' + | 'victory_dance_pumpkin_laser' + | 'victory_dance_pumpkin_patch' + | 'victory_dance_puppy_party' + | 'victory_dance_rabbit_meteors' + | 'victory_dance_rainbow_dolly' + | 'victory_dance_raining_pigs' + | 'victory_dance_raining_swords' + | 'victory_dance_rooted' + | 'victory_dance_snow_bomber' + | 'victory_dance_snowman_army' + | 'victory_dance_swarm' + | 'victory_dance_to_build_a_snowman' + | 'victory_dance_toy_stick' + | 'victory_dance_twerk_apocalypse' + | 'victory_dance_winter_twister' + | 'victory_dance_wither_rider' + | 'victory_dance_yeehaw'; +export type MurderMysteryVictoryDanceRaw = + | 'abominable_snowman' + | 'bad_weather' + | 'bat_swarm' + | 'chicken_rider' + | 'chinese_dragon' + | 'cold_snap' + | 'dragon_fire' + | 'easter_bunnies' + | 'egg_meteors' + | 'exploding_bunnies' + | 'festive_music' + | 'fireworks' + | 'floating_lanterns' + | 'flower_bed' + | 'graveyardrave' + | 'guardians' + | 'haunted' + | 'heat_wave' + | 'infection' + | 'love_aura' + | 'meteor_shower' + | 'night_shift' + | 'pumpkin_bomber' + | 'pumpkin_laser' + | 'pumpkin_patch' + | 'puppy_party' + | 'rabbit_meteors' + | 'rainbow_dolly' + | 'raining_pigs' + | 'raining_swords' + | 'rooted' + | 'snow_bomber' + | 'snowman_army' + | 'swarm' + | 'to_build_a_snowman' + | 'toy_stick' + | 'twerk_apocalypse' + | 'winter_twister' + | 'wither_rider' + | 'yeehaw'; +export type MurderMysteryProjectileTrail = + | 'projectile_trail_Jack_O_Lantern_Trail' + | 'projectile_trail_angry_villager' + | 'projectile_trail_bee' + | 'projectile_trail_black_smoke' + | 'projectile_trail_blood' + | 'projectile_trail_blue_dust' + | 'projectile_trail_bone' + | 'projectile_trail_bubbles' + | 'projectile_trail_candy_basket' + | 'projectile_trail_chains' + | 'projectile_trail_cheese' + | 'projectile_trail_cursedflame' + | 'projectile_trail_derailed' + | 'projectile_trail_ender' + | 'projectile_trail_fanged' + | 'projectile_trail_fiery_wind' + | 'projectile_trail_fire' + | 'projectile_trail_fireball' + | 'projectile_trail_firework' + | 'projectile_trail_flame_rings' + | 'projectile_trail_glitch' + | 'projectile_trail_green_star' + | 'projectile_trail_hanukkah' + | 'projectile_trail_hearts' + | 'projectile_trail_hoops' + | 'projectile_trail_howling_wind' + | 'projectile_trail_icicle' + | 'projectile_trail_jack_o_lantern_trail' + | 'projectile_trail_lava' + | 'projectile_trail_let_there_be_leather' + | 'projectile_trail_lunar_dust' + | 'projectile_trail_magic' + | 'projectile_trail_magic_wind' + | 'projectile_trail_merry' + | 'projectile_trail_notes' + | 'projectile_trail_orb' + | 'projectile_trail_peep_hatching' + | 'projectile_trail_potion' + | 'projectile_trail_potion_rain' + | 'projectile_trail_present' + | 'projectile_trail_pumpkin_pie' + | 'projectile_trail_pumpkin_spice_powered' + | 'projectile_trail_pumpkin_volley_trail' + | 'projectile_trail_purple_dust' + | 'projectile_trail_rainbow' + | 'projectile_trail_rainy' + | 'projectile_trail_random' + | 'projectile_trail_red_dust' + | 'projectile_trail_rocket' + | 'projectile_trail_rose' + | 'projectile_trail_slime' + | 'projectile_trail_snowball' + | 'projectile_trail_snowball_rain' + | 'projectile_trail_sparkler' + | 'projectile_trail_spiders_silk' + | 'projectile_trail_spooky_wind' + | 'projectile_trail_spring_ribbons' + | 'projectile_trail_stormy' + | 'projectile_trail_tinsel' + | 'projectile_trail_trick_or_treat' + | 'projectile_trail_twin_dragon' + | 'projectile_trail_twirling_snowflake' + | 'projectile_trail_twisted_trail' + | 'projectile_trail_water' + | 'projectile_trail_white_smoke' + | 'projectile_trail_wingman' + | 'projectile_trail_wisp_whirlwind' + | 'projectile_trail_wither_skull'; +export type MurderMysteryProjectileTrailRaw = + | 'Jack_O_Lantern_Trail' + | 'angry_villager' + | 'bee' + | 'black_smoke' + | 'blood' + | 'blue_dust' + | 'bone' + | 'bubbles' + | 'candy_basket' + | 'chains' + | 'cheese' + | 'cursedflame' + | 'derailed' + | 'ender' + | 'fanged' + | 'fiery_wind' + | 'fire' + | 'fireball' + | 'firework' + | 'flame_rings' + | 'glitch' + | 'green_star' + | 'hanukkah' + | 'hearts' + | 'hoops' + | 'howling_wind' + | 'icicle' + | 'jack_o_lantern_trail' + | 'lava' + | 'let_there_be_leather' + | 'lunar_dust' + | 'magic' + | 'magic_wind' + | 'merry' + | 'notes' + | 'orb' + | 'peep_hatching' + | 'potion' + | 'potion_rain' + | 'present' + | 'pumpkin_pie' + | 'pumpkin_spice_powered' + | 'pumpkin_volley_trail' + | 'purple_dust' + | 'rainbow' + | 'rainy' + | 'random' + | 'red_dust' + | 'rocket' + | 'rose' + | 'slime' + | 'snowball' + | 'snowball_rain' + | 'sparkler' + | 'spiders_silk' + | 'spooky_wind' + | 'spring_ribbons' + | 'stormy' + | 'tinsel' + | 'trick_or_treat' + | 'twin_dragon' + | 'twirling_snowflake' + | 'twisted_trail' + | 'water' + | 'white_smoke' + | 'wingman' + | 'wisp_whirlwind' + | 'wither_skull'; +export type MurderMysteryLastWords = + | 'last_words_10th_anniversary' + | 'last_words_buzz' + | 'last_words_chicken' + | 'last_words_condescending' + | 'last_words_crybaby' + | 'last_words_deathcount' + | 'last_words_dontcare' + | 'last_words_eggstraordinary_puns' + | 'last_words_eggy' + | 'last_words_fashion' + | 'last_words_festive' + | 'last_words_glutton' + | 'last_words_hypixel_fan' + | 'last_words_jolly' + | 'last_words_meme' + | 'last_words_meow' + | 'last_words_mrobvious' + | 'last_words_naughty' + | 'last_words_oxymorons' + | 'last_words_philosoph' + | 'last_words_pirate' + | 'last_words_protips' + | 'last_words_rage' + | 'last_words_rats' + | 'last_words_reindeer' + | 'last_words_spooky' + | 'last_words_squeak' + | 'last_words_superstitions' + | 'last_words_trick_or_treat' + | 'last_words_woof' + | 'last_words_wrapped_up'; +export type MurderMysteryLastWordsRaw = + | '10th_anniversary' + | 'buzz' + | 'chicken' + | 'condescending' + | 'crybaby' + | 'deathcount' + | 'dontcare' + | 'eggstraordinary_puns' + | 'eggy' + | 'fashion' + | 'festive' + | 'glutton' + | 'hypixel_fan' + | 'jolly' + | 'meme' + | 'meow' + | 'mrobvious' + | 'naughty' + | 'oxymorons' + | 'philosoph' + | 'pirate' + | 'protips' + | 'rage' + | 'rats' + | 'reindeer' + | 'spooky' + | 'squeak' + | 'superstitions' + | 'trick_or_treat' + | 'woof' + | 'wrapped_up'; +export type MurderMysteryKnifeSkin = + | 'knife_skin_10000_spoons' + | 'knife_skin_apple' + | 'knife_skin_basted_turkey' + | 'knife_skin_blaze_stick' + | 'knife_skin_bloody_brick' + | 'knife_skin_bone' + | 'knife_skin_campfire_leftovers' + | 'knife_skin_carrot_on_stick' + | 'knife_skin_cheapo' + | 'knife_skin_cheese' + | 'knife_skin_chewed_bush' + | 'knife_skin_diamond_shovel' + | 'knife_skin_double_death_scythe' + | 'knife_skin_dragon_egg' + | 'knife_skin_earthen_dagger' + | 'knife_skin_easter_basket' + | 'knife_skin_farming_implement' + | 'knife_skin_feather' + | 'knife_skin_fragile_plant' + | 'knife_skin_frisbee' + | 'knife_skin_glistening_melon' + | 'knife_skin_gold_digger' + | 'knife_skin_grilled_steak' + | 'knife_skin_grimoire' + | 'knife_skin_ice_shard' + | 'knife_skin_mouse_trap' + | 'knife_skin_prickly' + | 'knife_skin_pumpkin_pie' + | 'knife_skin_rudolphs_nose' + | 'knife_skin_rudolphs_snack' + | 'knife_skin_salmon' + | 'knife_skin_scythe' + | 'knife_skin_shears' + | 'knife_skin_shiny_snack' + | 'knife_skin_shovel' + | 'knife_skin_shred' + | 'knife_skin_spray_painted_shovel' + | 'knife_skin_stake' + | 'knife_skin_stick' + | 'knife_skin_stick_with_hat' + | 'knife_skin_sweet_treat' + | 'knife_skin_timber' + | 'knife_skin_wood_axe'; +export type MurderMysteryKnifeSkinRaw = + | '10000_spoons' + | 'apple' + | 'basted_turkey' + | 'blaze_stick' + | 'bloody_brick' + | 'bone' + | 'campfire_leftovers' + | 'carrot_on_stick' + | 'cheapo' + | 'cheese' + | 'chewed_bush' + | 'diamond_shovel' + | 'double_death_scythe' + | 'dragon_egg' + | 'earthen_dagger' + | 'easter_basket' + | 'farming_implement' + | 'feather' + | 'fragile_plant' + | 'frisbee' + | 'glistening_melon' + | 'gold_digger' + | 'grilled_steak' + | 'grimoire' + | 'ice_shard' + | 'mouse_trap' + | 'prickly' + | 'pumpkin_pie' + | 'rudolphs_nose' + | 'rudolphs_snack' + | 'salmon' + | 'scythe' + | 'shears' + | 'shiny_snack' + | 'shovel' + | 'shred' + | 'spray_painted_shovel' + | 'stake' + | 'stick' + | 'stick_with_hat' + | 'sweet_treat' + | 'timber' + | 'wood_axe'; +export type MurderMysteryKillNote = + | 'kill_note_ace' + | 'kill_note_angelic_jerry' + | 'kill_note_angry_cow' + | 'kill_note_angry_turkey' + | 'kill_note_bad_time' + | 'kill_note_bee_that_chicken' + | 'kill_note_big_brother' + | 'kill_note_big_skull' + | 'kill_note_boo' + | 'kill_note_boom' + | 'kill_note_bowtie' + | 'kill_note_buff_chicken' + | 'kill_note_bunny_gg' + | 'kill_note_bunny_lantern' + | 'kill_note_bunny_parkour' + | 'kill_note_bye' + | 'kill_note_candy_cane_guns' + | 'kill_note_candy_cane_sniper' + | 'kill_note_candy_king' + | 'kill_note_casual_christmas' + | 'kill_note_chalk_outline' + | 'kill_note_chickens' + | 'kill_note_chocolate_feast' + | 'kill_note_christmas_tree' + | 'kill_note_comfy_web' + | 'kill_note_cookies_and_milk' + | 'kill_note_cooler_climates' + | 'kill_note_creeper_rudolph' + | 'kill_note_curled_ox' + | 'kill_note_cute_bunny' + | 'kill_note_deadboy' + | 'kill_note_derailed' + | 'kill_note_dice_roll' + | 'kill_note_distinguished_ghost' + | 'kill_note_dogs_of_wisdom' + | 'kill_note_dragon' + | 'kill_note_easter_basket' + | 'kill_note_easter_creeper' + | 'kill_note_easter_eggs' + | 'kill_note_easter_sweater' + | 'kill_note_egg_decorations' + | 'kill_note_egg_gunner' + | 'kill_note_egg_hit' + | 'kill_note_egg_hunt' + | 'kill_note_egg_surprise' + | 'kill_note_egg_time' + | 'kill_note_faboolous' + | 'kill_note_fake_vampire' + | 'kill_note_family_photo_christmas' + | 'kill_note_fatality' + | 'kill_note_fireworks' + | 'kill_note_flowers_for_you' + | 'kill_note_found_u' + | 'kill_note_fried' + | 'kill_note_game_over' + | 'kill_note_garlic' + | 'kill_note_gas' + | 'kill_note_ggwp_pumpkin' + | 'kill_note_ghosts' + | 'kill_note_gift_spray' + | 'kill_note_gingerbread_jerry' + | 'kill_note_gingerbread_murderer' + | 'kill_note_golden_egg' + | 'kill_note_golem_picnic' + | 'kill_note_good_fortune' + | 'kill_note_gothic_jerry' + | 'kill_note_gradient' + | 'kill_note_haunted_conscience' + | 'kill_note_haunted_house' + | 'kill_note_hide_and_seek' + | 'kill_note_ice_scream_cart' + | 'kill_note_im' + | 'kill_note_jerry_island_poster' + | 'kill_note_lantern' + | 'kill_note_lazy_bunnies' + | 'kill_note_lazy_spring' + | 'kill_note_lion_dancer' + | 'kill_note_lucky_rabbit' + | 'kill_note_masks_power' + | 'kill_note_master_sword' + | 'kill_note_menorah' + | 'kill_note_mistletoe' + | 'kill_note_mob_party' + | 'kill_note_monster_under_bed' + | 'kill_note_murder_mystery_poster' + | 'kill_note_one_of_us' + | 'kill_note_ouija' + | 'kill_note_ox_costume' + | 'kill_note_painted_dragon_egg' + | 'kill_note_party_crasher' + | 'kill_note_peaceful' + | 'kill_note_perfect_sword_throw' + | 'kill_note_pig_peace' + | 'kill_note_poison' + | 'kill_note_pumpkin_farm' + | 'kill_note_pumpkin_pals' + | 'kill_note_pumpkinz' + | 'kill_note_puppy_surprise' + | 'kill_note_rabbit_celebration' + | 'kill_note_rabbit_costume' + | 'kill_note_rabbits_in_basket' + | 'kill_note_rat_costume' + | 'kill_note_rats_2020' + | 'kill_note_rose' + | 'kill_note_sabeetage' + | 'kill_note_sand_castle' + | 'kill_note_santa' + | 'kill_note_santa_slips' + | 'kill_note_scared' + | 'kill_note_sea_bass' + | 'kill_note_seasons_greetings' + | 'kill_note_self_portrait' + | 'kill_note_selfie' + | 'kill_note_shh' + | 'kill_note_silent_night' + | 'kill_note_skeleton_wave' + | 'kill_note_skull' + | 'kill_note_sleeps_and_treats' + | 'kill_note_sloth_burn' + | 'kill_note_smug_pig' + | 'kill_note_sniper_snowball' + | 'kill_note_snow_angel' + | 'kill_note_snow_jerry' + | 'kill_note_snowball_fight' + | 'kill_note_snowman_rampage' + | 'kill_note_snowman_surprise' + | 'kill_note_soulless' + | 'kill_note_split_personality' + | 'kill_note_spooky_game_over' + | 'kill_note_spooky_skelington' + | 'kill_note_super_effective' + | 'kill_note_surfs_up' + | 'kill_note_sweets' + | 'kill_note_the_great_egg_hunt' + | 'kill_note_tombstone' + | 'kill_note_trick_or_treat' + | 'kill_note_turkey_day' + | 'kill_note_ugly_bed_wars_sweater' + | 'kill_note_undead_lifesaving_association' + | 'kill_note_vampire_jerry' + | 'kill_note_watcher' + | 'kill_note_witch_please' + | 'kill_note_wrong_eggs' + | 'kill_note_year_of_the_dog' + | 'kill_note_year_of_the_dragon' + | 'kill_note_year_of_the_ox' + | 'kill_note_year_of_the_pig' + | 'kill_note_year_of_the_rabbit' + | 'kill_note_year_of_the_rat' + | 'kill_note_year_of_the_snake' + | 'kill_note_year_of_the_tiger'; +export type MurderMysteryKillNoteRaw = + | 'ace' + | 'angelic_jerry' + | 'angry_cow' + | 'angry_turkey' + | 'bad_time' + | 'bee_that_chicken' + | 'big_brother' + | 'big_skull' + | 'boo' + | 'boom' + | 'bowtie' + | 'buff_chicken' + | 'bunny_gg' + | 'bunny_lantern' + | 'bunny_parkour' + | 'bye' + | 'candy_cane_guns' + | 'candy_cane_sniper' + | 'candy_king' + | 'casual_christmas' + | 'chalk_outline' + | 'chickens' + | 'chocolate_feast' + | 'christmas_tree' + | 'comfy_web' + | 'cookies_and_milk' + | 'cooler_climates' + | 'creeper_rudolph' + | 'curled_ox' + | 'cute_bunny' + | 'deadboy' + | 'derailed' + | 'dice_roll' + | 'distinguished_ghost' + | 'dogs_of_wisdom' + | 'dragon' + | 'easter_basket' + | 'easter_creeper' + | 'easter_eggs' + | 'easter_sweater' + | 'egg_decorations' + | 'egg_gunner' + | 'egg_hit' + | 'egg_hunt' + | 'egg_surprise' + | 'egg_time' + | 'faboolous' + | 'fake_vampire' + | 'family_photo_christmas' + | 'fatality' + | 'fireworks' + | 'flowers_for_you' + | 'found_u' + | 'fried' + | 'game_over' + | 'garlic' + | 'gas' + | 'ggwp_pumpkin' + | 'ghosts' + | 'gift_spray' + | 'gingerbread_jerry' + | 'gingerbread_murderer' + | 'golden_egg' + | 'golem_picnic' + | 'good_fortune' + | 'gothic_jerry' + | 'gradient' + | 'haunted_conscience' + | 'haunted_house' + | 'hide_and_seek' + | 'ice_scream_cart' + | 'im' + | 'jerry_island_poster' + | 'lantern' + | 'lazy_bunnies' + | 'lazy_spring' + | 'lion_dancer' + | 'lucky_rabbit' + | 'masks_power' + | 'master_sword' + | 'menorah' + | 'mistletoe' + | 'mob_party' + | 'monster_under_bed' + | 'murder_mystery_poster' + | 'one_of_us' + | 'ouija' + | 'ox_costume' + | 'painted_dragon_egg' + | 'party_crasher' + | 'peaceful' + | 'perfect_sword_throw' + | 'pig_peace' + | 'poison' + | 'pumpkin_farm' + | 'pumpkin_pals' + | 'pumpkinz' + | 'puppy_surprise' + | 'rabbit_celebration' + | 'rabbit_costume' + | 'rabbits_in_basket' + | 'rat_costume' + | 'rats_2020' + | 'rose' + | 'sabeetage' + | 'sand_castle' + | 'santa' + | 'santa_slips' + | 'scared' + | 'sea_bass' + | 'seasons_greetings' + | 'self_portrait' + | 'selfie' + | 'shh' + | 'silent_night' + | 'skeleton_wave' + | 'skull' + | 'sleeps_and_treats' + | 'sloth_burn' + | 'smug_pig' + | 'sniper_snowball' + | 'snow_angel' + | 'snow_jerry' + | 'snowball_fight' + | 'snowman_rampage' + | 'snowman_surprise' + | 'soulless' + | 'split_personality' + | 'spooky_game_over' + | 'spooky_skelington' + | 'super_effective' + | 'surfs_up' + | 'sweets' + | 'the_great_egg_hunt' + | 'tombstone' + | 'trick_or_treat' + | 'turkey_day' + | 'ugly_bed_wars_sweater' + | 'undead_lifesaving_association' + | 'vampire_jerry' + | 'watcher' + | 'witch_please' + | 'wrong_eggs' + | 'year_of_the_dog' + | 'year_of_the_dragon' + | 'year_of_the_ox' + | 'year_of_the_pig' + | 'year_of_the_rabbit' + | 'year_of_the_rat' + | 'year_of_the_snake' + | 'year_of_the_tiger'; +export type MurderMysteryGravestone = + | 'gravestone_basic' + | 'gravestone_botanic' + | 'gravestone_creeper' + | 'gravestone_floral' + | 'gravestone_frozen_skeleton' + | 'gravestone_humble' + | 'gravestone_mossy_basic' + | 'gravestone_niche' + | 'gravestone_sand_castle' + | 'gravestone_unadorned' + | 'gravestone_unsubtle' + | 'gravestone_warrior'; +export type MurderMysteryGravestoneRaw = + | 'basic' + | 'botanic' + | 'creeper' + | 'floral' + | 'frozen_skeleton' + | 'humble' + | 'mossy_basic' + | 'niche' + | 'sand_castle' + | 'unadorned' + | 'unsubtle' + | 'warrior'; +export type MurderMysteryGesture = + | 'gesture_ballet' + | 'gesture_can_can' + | 'gesture_clapping' + | 'gesture_cool_dance' + | 'gesture_crab_dance' + | 'gesture_goodbye' + | 'gesture_graduation' + | 'gesture_high_five' + | 'gesture_hula' + | 'gesture_hype_dance' + | 'gesture_jump' + | 'gesture_karaoke' + | 'gesture_mind_blown' + | 'gesture_possessed' + | 'gesture_snowball_toss' + | 'gesture_sun' + | 'gesture_treasure' + | 'gesture_victory' + | 'gesture_wave_dance' + | 'gesture_zombie_dance'; +export type MurderMysteryGestureRaw = + | 'ballet' + | 'can_can' + | 'clapping' + | 'cool_dance' + | 'crab_dance' + | 'goodbye' + | 'graduation' + | 'high_five' + | 'hula' + | 'hype_dance' + | 'jump' + | 'karaoke' + | 'mind_blown' + | 'possessed' + | 'snowball_toss' + | 'sun' + | 'treasure' + | 'victory' + | 'wave_dance' + | 'zombie_dance'; +export type MurderMysteryFavoriteMap = + | 'favoritemap_ancient tomb' + | 'favoritemap_aquarium' + | 'favoritemap_archives' + | 'favoritemap_archives top floor' + | 'favoritemap_cattleridge farm' + | 'favoritemap_cruise ship' + | 'favoritemap_darkfall' + | 'favoritemap_easter world' + | 'favoritemap_gold rush' + | 'favoritemap_headquarters' + | 'favoritemap_hollywood' + | 'favoritemap_hypixel world' + | 'favoritemap_library' + | 'favoritemap_mountain' + | 'favoritemap_san peratico' + | 'favoritemap_san peratico v2' + | 'favoritemap_skyway pier' + | 'favoritemap_snowfall' + | 'favoritemap_snowglobe' + | 'favoritemap_spooky mansion' + | 'favoritemap_subway' + | 'favoritemap_towerfall' + | 'favoritemap_transport' + | 'favoritemap_villa' + | "favoritemap_widow's den"; +export type MurderMysteryFavoriteMapRaw = + | 'ancient tomb' + | 'aquarium' + | 'archives' + | 'archives top floor' + | 'cattleridge farm' + | 'cruise ship' + | 'darkfall' + | 'easter world' + | 'gold rush' + | 'headquarters' + | 'hollywood' + | 'hypixel world' + | 'library' + | 'mountain' + | 'san peratico' + | 'san peratico v2' + | 'skyway pier' + | 'snowfall' + | 'snowglobe' + | 'spooky mansion' + | 'subway' + | 'towerfall' + | 'transport' + | 'villa' + | "widow's den"; +export type MurderMysteryDeathCry = + | 'deathcry_coffin_close' + | 'deathcry_dark_portal' + | 'deathcry_dinosaur' + | 'deathcry_doused_lantern' + | 'deathcry_dragon_roar' + | 'deathcry_drama_queen' + | 'deathcry_firework' + | 'deathcry_ghosts_cry' + | 'deathcry_greed' + | 'deathcry_grumble' + | 'deathcry_grumpy_villager' + | 'deathcry_haunted_curse' + | 'deathcry_howl' + | 'deathcry_pig' + | 'deathcry_puddle' + | 'deathcry_rage' + | 'deathcry_sad_moo' + | 'deathcry_sad_puppy' + | 'deathcry_scurry' + | 'deathcry_sigh' + | 'deathcry_sniff' + | 'deathcry_squeal' + | 'deathcry_static' + | 'deathcry_up_in_flames'; +export type MurderMysteryDeathCryRaw = + | 'coffin_close' + | 'dark_portal' + | 'dinosaur' + | 'doused_lantern' + | 'dragon_roar' + | 'drama_queen' + | 'firework' + | 'ghosts_cry' + | 'greed' + | 'grumble' + | 'grumpy_villager' + | 'haunted_curse' + | 'howl' + | 'pig' + | 'puddle' + | 'rage' + | 'sad_moo' + | 'sad_puppy' + | 'scurry' + | 'sigh' + | 'sniff' + | 'squeal' + | 'static' + | 'up_in_flames'; +export type MurderMysteryAnimatedHat = + | 'animated_hat_blushy' + | 'animated_hat_chroma_slime' + | 'animated_hat_cyborg' + | 'animated_hat_demon_eyes' + | 'animated_hat_derpy_eyes' + | 'animated_hat_elfgirl' + | 'animated_hat_ender_pulse' + | 'animated_hat_eye' + | 'animated_hat_flower_crown' + | 'animated_hat_grinch' + | 'animated_hat_happy_dude' + | 'animated_hat_herobrine' + | 'animated_hat_pumpkin' + | 'animated_hat_rainbow_present' + | 'animated_hat_reindeer' + | 'animated_hat_sacred_cattle' + | 'animated_hat_santa' + | 'animated_hat_sherlock' + | 'animated_hat_shining_tiger'; +export type MurderMysteryAnimatedHatRaw = + | 'blushy' + | 'chroma_slime' + | 'cyborg' + | 'demon_eyes' + | 'derpy_eyes' + | 'elfgirl' + | 'ender_pulse' + | 'eye' + | 'flower_crown' + | 'grinch' + | 'happy_dude' + | 'herobrine' + | 'pumpkin' + | 'rainbow_present' + | 'reindeer' + | 'sacred_cattle' + | 'santa' + | 'sherlock' + | 'shining_tiger'; +export type MurderMysteryItem = + | 'displayed_youtuber_book' + | 'emblem.color_unlocked' + | 'increase_yt_detective' + | 'increase_yt_murderer' + | 'rudolphs_nose' + | 'sep2021AchievementSync' + | 'sep2021achievementsync' + | MurderMysteryVictoryDance + | MurderMysteryProjectileTrail + | MurderMysteryLastWords + | MurderMysteryKnifeSkin + | MurderMysteryKillNote + | MurderMysteryGravestone + | MurderMysteryGesture + | MurderMysteryFavoriteMap + | MurderMysteryDeathCry + | MurderMysteryAnimatedHat; +export type MurderMysteryMapName = + | 'ancient_tomb' + | 'aquarium' + | 'archives' + | 'archives_top_floor' + | 'cattleridge_farm' + | 'cruise_ship' + | 'darkfall' + | 'easter_world' + | 'gold_rush' + | 'headquarters' + | 'hollywood' + | 'hypixel_world' + | 'library' + | 'mountain' + | 'san_peratico' + | 'san_peratico_v2' + | 'skyway_pier' + | 'snowfall' + | 'snowglobe' + | 'spooky_mansion' + | 'subway' + | 'towerfall' + | 'transport' + | 'villa' + | "widow's_den"; +export type MurderMysteryRole = 'detective' | 'innocent' | 'murderer'; +export type MurderMysteryEmblemIcon = + | 'ALPHA' + | 'DIVINE' + | 'EQUIVALENCE' + | 'FLORIN' + | 'OMEGA' + | 'PODIUM' + | 'RICH' + | 'SIGMA' + | 'ZERO'; diff --git a/src/index.ts b/src/index.ts index d5a245a19..61973aa1b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -51,10 +51,7 @@ import Booster from './Structures/Boosters/Booster.js'; import BountyHunters from './Structures/MiniGames/Arcade/BountyHunters.js'; import BowSpleef from './Structures/MiniGames/TNTGames/BowSpleef.js'; import BuildBattle from './Structures/MiniGames/BuildBattle/BuildBattle.js'; -import BuildBattleEmblem from './Structures/MiniGames/BuildBattle/Emblem/BuildBattleEmblem.js'; -import BuildBattleEmblemColors from './Structures/MiniGames/BuildBattle/Emblem/BuildBattleEmblemColors.js'; import BuildBattleLastWin from './Structures/MiniGames/BuildBattle/BuildBattleLastWin.js'; -import BuildBattleLeaderboardSettings from './Structures/MiniGames/BuildBattle/BuildBattleLeaderboardSettings.js'; import BuildBattleVotes from './Structures/MiniGames/BuildBattle/BuildBattleVotes.js'; import CaptureTheWool from './Structures/MiniGames/WoolGames/CaptureTheWool.js'; import Challenge from './Structures/Static/Challenge.js'; @@ -73,6 +70,8 @@ import DuelsMegaWalls from './Structures/MiniGames/Duels/DuelsMegaWalls.js'; import DuelsOP from './Structures/MiniGames/Duels/DuelsOP.js'; import DuelsSkyWars from './Structures/MiniGames/Duels/DuelsSkyWars.js'; import DuelsUHC from './Structures/MiniGames/Duels/DuelsUHC.js'; +import Emblem from './Structures/MiniGames/Shared/Emblem/Emblem.js'; +import EmblemColors from './Structures/MiniGames/Shared/Emblem/EmblemColors.js'; import EnderSpleef from './Structures/MiniGames/Arcade/EnderSpleef.js'; import FarmHunt from './Structures/MiniGames/Arcade/FarmHunt.js'; import Football from './Structures/MiniGames/Arcade/Football.js'; @@ -92,12 +91,19 @@ import House from './Structures/House.js'; import HypixelSays from './Structures/MiniGames/Arcade/HypixelSays.js'; import ItemBytes from './Structures/ItemBytes.js'; import Leaderboard from './Structures/Leaderboard.js'; +import LeaderboardSettings from './Structures/MiniGames/Shared/LeaderboardSettings.js'; import MegaWalls from './Structures/MiniGames/MegaWalls/MegaWalls.js'; import MegaWallsKitStats from './Structures/MiniGames/MegaWalls/MegaWallsKitStats.js'; import MegaWallsModeStats from './Structures/MiniGames/MegaWalls/MegaWallsModeStats.js'; import MiniWalls from './Structures/MiniGames/Arcade/MiniWalls.js'; import MurderMystery from './Structures/MiniGames/MurderMystery/MurderMystery.js'; -import MurderMysteryModeStats from './Structures/MiniGames/MurderMystery/MurderMysteryModeStats.js'; +import MurderMysteryDescent from './Structures/MiniGames/MurderMystery/MurderMysteryDescent.js'; +import MurderMysteryDescentItem from './Structures/MiniGames/MurderMystery/MurderMysteryDescentItem.js'; +import MurderMysteryFavorites from './Structures/MiniGames/MurderMystery/MurderMysteryFavorites.js'; +import MurderMysteryGamemode from './Structures/MiniGames/MurderMystery/MurderMysteryGamemode.js'; +import MurderMysteryKnifeSkinPrestige from './Structures/MiniGames/MurderMystery/MurderMysteryKnifeSkinPrestige.js'; +import MurderMysteryKnifeSkinPrestigeXp from './Structures/MiniGames/MurderMystery/MurderMysteryKnifeSkinPrestigeXp.js'; +import MurderMysteryMap from './Structures/MiniGames/MurderMystery/MurderMysteryMap.js'; import OneTimeAchievement from './Structures/Static/Achievements/OneTimeAchievement.js'; import PVPRun from './Structures/MiniGames/TNTGames/PVPRun.js'; import Paintball from './Structures/MiniGames/Paintball.js'; @@ -366,10 +372,7 @@ export { BountyHunters, BowSpleef, BuildBattle, - BuildBattleEmblem, - BuildBattleEmblemColors, BuildBattleLastWin, - BuildBattleLeaderboardSettings, BuildBattleVotes, CaptureTheWool, Challenge, @@ -388,6 +391,8 @@ export { DuelsOP, DuelsSkyWars, DuelsUHC, + Emblem, + EmblemColors, EnderSpleef, FarmHunt, Football, @@ -407,12 +412,19 @@ export { HypixelSays, ItemBytes, Leaderboard, + LeaderboardSettings, MegaWalls, MegaWallsKitStats, MegaWallsModeStats, MiniWalls, MurderMystery, - MurderMysteryModeStats, + MurderMysteryDescent, + MurderMysteryDescentItem, + MurderMysteryFavorites, + MurderMysteryGamemode, + MurderMysteryKnifeSkinPrestige, + MurderMysteryKnifeSkinPrestigeXp, + MurderMysteryMap, OneTimeAchievement, PVPRun, Paintball, @@ -682,10 +694,7 @@ export default { BountyHunters, BowSpleef, BuildBattle, - BuildBattleEmblem, - BuildBattleEmblemColors, BuildBattleLastWin, - BuildBattleLeaderboardSettings, BuildBattleVotes, CaptureTheWool, Challenge, @@ -704,6 +713,8 @@ export default { DuelsOP, DuelsSkyWars, DuelsUHC, + Emblem, + EmblemColors, EnderSpleef, FarmHunt, Football, @@ -723,12 +734,19 @@ export default { HypixelSays, ItemBytes, Leaderboard, + LeaderboardSettings, MegaWalls, MegaWallsKitStats, MegaWallsModeStats, MiniWalls, MurderMystery, - MurderMysteryModeStats, + MurderMysteryDescent, + MurderMysteryDescentItem, + MurderMysteryFavorites, + MurderMysteryGamemode, + MurderMysteryKnifeSkinPrestige, + MurderMysteryKnifeSkinPrestigeXp, + MurderMysteryMap, OneTimeAchievement, PVPRun, Paintball, From 9b05ae1b538cca4d5e7bd297dbb8d2cdf2602d5b Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 19 Nov 2025 11:09:16 +0800 Subject: [PATCH 078/124] refactor(Arcade) --- .../MiniGames/Arcade/Arcade.test.ts | 70 ------ src/Structures/MiniGames/Arcade/Arcade.ts | 180 +++++++++++---- .../MiniGames/Arcade/ArcadeOptions.ts | 22 ++ .../MiniGames/Arcade/BlockingDead.test.ts | 18 -- .../MiniGames/Arcade/BlockingDead.ts | 8 +- .../MiniGames/Arcade/BountyHunters.test.ts | 30 --- .../MiniGames/Arcade/DragonWars.test.ts | 15 -- src/Structures/MiniGames/Arcade/DragonWars.ts | 4 +- .../MiniGames/Arcade/DrawTheirThing.ts | 8 + .../MiniGames/Arcade/Dropper.test.ts | 33 --- src/Structures/MiniGames/Arcade/Dropper.ts | 27 --- .../MiniGames/Arcade/Dropper/Dropper.ts | 146 ++++++++++++ .../MiniGames/Arcade/Dropper/DropperMap.ts | 10 + .../MiniGames/Arcade/DropperMap.test.ts | 15 -- src/Structures/MiniGames/Arcade/DropperMap.ts | 10 - src/Structures/MiniGames/Arcade/Dtt.ts | 13 ++ .../MiniGames/Arcade/EasterSimulator.ts | 10 + .../MiniGames/Arcade/EnderSpleef.test.ts | 30 --- .../MiniGames/Arcade/EnderSpleef.ts | 24 +- .../MiniGames/Arcade/FarmHunt.test.ts | 45 ---- src/Structures/MiniGames/Arcade/FarmHunt.ts | 46 ++-- src/Structures/MiniGames/Arcade/FootBall.ts | 14 ++ .../MiniGames/Arcade/Football.test.ts | 21 -- .../MiniGames/Arcade/GalaxyWars.test.ts | 36 --- src/Structures/MiniGames/Arcade/GalaxyWars.ts | 35 +-- .../MiniGames/Arcade/GrinchSimulator.ts | 22 ++ .../MiniGames/Arcade/HalloweenSimulator.ts | 10 + .../MiniGames/Arcade/HideAndSeek.test.ts | 21 -- .../MiniGames/Arcade/HideAndSeek.ts | 23 +- .../MiniGames/Arcade/HoleInTheWall.test.ts | 16 -- .../MiniGames/Arcade/HoleInTheWall.ts | 18 +- .../MiniGames/Arcade/HypixelSays.test.ts | 21 -- .../MiniGames/Arcade/HypixelSports.ts | 8 + .../MiniGames/Arcade/MiniWalls.test.ts | 42 ---- src/Structures/MiniGames/Arcade/MiniWalls.ts | 47 ++-- .../{BountyHunters.ts => OneInTheQuiver.ts} | 20 +- .../MiniGames/Arcade/PartyGames.test.ts | 18 -- src/Structures/MiniGames/Arcade/PartyGames.ts | 12 - .../MiniGames/Arcade/PartyGames/LawnMoower.ts | 11 + .../MiniGames/Arcade/PartyGames/PartyGames.ts | 62 +++++ .../Arcade/PartyGames/PartyGamesGame.ts | 18 ++ .../MiniGames/Arcade/PartyGames/RPG16.ts | 10 + .../MiniGames/Arcade/PartyPooper.test.ts | 18 -- .../MiniGames/Arcade/PartyPooper.ts | 12 - .../MiniGames/Arcade/PixelParty.test.ts | 40 ---- src/Structures/MiniGames/Arcade/PixelParty.ts | 31 --- .../Arcade/PixelPartyGameMode.test.ts | 27 --- .../MiniGames/Arcade/PixelPartyGameMode.ts | 21 -- .../MiniGames/Arcade/PropHunt.test.ts | 18 -- src/Structures/MiniGames/Arcade/PropHunt.ts | 12 - src/Structures/MiniGames/Arcade/SantaSays.ts | 14 ++ .../MiniGames/Arcade/SantaSimulator.ts | 12 + .../MiniGames/Arcade/ScubaSimulator.ts | 12 + .../Arcade/{HypixelSays.ts => SimonSays.ts} | 12 +- .../Arcade/{Football.ts => Soccer.ts} | 12 +- .../MiniGames/Arcade/ThrowOut.test.ts | 21 -- src/Structures/MiniGames/Arcade/ThrowOut.ts | 14 +- src/Structures/MiniGames/Arcade/WoolHunt.ts | 52 +++++ .../MiniGames/Arcade/Zombies.test.ts | 37 --- src/Structures/MiniGames/Arcade/Zombies.ts | 39 ---- .../MiniGames/Arcade/Zombies/Zombies.ts | 218 ++++++++++++++++++ .../MiniGames/Arcade/Zombies/ZombiesMap.ts | 30 +++ .../MiniGames/Arcade/ZombiesStats.test.ts | 45 ---- .../MiniGames/Arcade/ZombiesStats.ts | 33 --- src/Types/Player.ts | 181 ++++++++++++++- src/index.ts | 89 ++++--- 66 files changed, 1226 insertions(+), 1023 deletions(-) delete mode 100644 src/Structures/MiniGames/Arcade/Arcade.test.ts create mode 100644 src/Structures/MiniGames/Arcade/ArcadeOptions.ts delete mode 100644 src/Structures/MiniGames/Arcade/BlockingDead.test.ts delete mode 100644 src/Structures/MiniGames/Arcade/BountyHunters.test.ts delete mode 100644 src/Structures/MiniGames/Arcade/DragonWars.test.ts create mode 100644 src/Structures/MiniGames/Arcade/DrawTheirThing.ts delete mode 100644 src/Structures/MiniGames/Arcade/Dropper.test.ts delete mode 100644 src/Structures/MiniGames/Arcade/Dropper.ts create mode 100644 src/Structures/MiniGames/Arcade/Dropper/Dropper.ts create mode 100644 src/Structures/MiniGames/Arcade/Dropper/DropperMap.ts delete mode 100644 src/Structures/MiniGames/Arcade/DropperMap.test.ts delete mode 100644 src/Structures/MiniGames/Arcade/DropperMap.ts create mode 100644 src/Structures/MiniGames/Arcade/Dtt.ts create mode 100644 src/Structures/MiniGames/Arcade/EasterSimulator.ts delete mode 100644 src/Structures/MiniGames/Arcade/EnderSpleef.test.ts delete mode 100644 src/Structures/MiniGames/Arcade/FarmHunt.test.ts create mode 100644 src/Structures/MiniGames/Arcade/FootBall.ts delete mode 100644 src/Structures/MiniGames/Arcade/Football.test.ts delete mode 100644 src/Structures/MiniGames/Arcade/GalaxyWars.test.ts create mode 100644 src/Structures/MiniGames/Arcade/GrinchSimulator.ts create mode 100644 src/Structures/MiniGames/Arcade/HalloweenSimulator.ts delete mode 100644 src/Structures/MiniGames/Arcade/HideAndSeek.test.ts delete mode 100644 src/Structures/MiniGames/Arcade/HoleInTheWall.test.ts delete mode 100644 src/Structures/MiniGames/Arcade/HypixelSays.test.ts create mode 100644 src/Structures/MiniGames/Arcade/HypixelSports.ts delete mode 100644 src/Structures/MiniGames/Arcade/MiniWalls.test.ts rename src/Structures/MiniGames/Arcade/{BountyHunters.ts => OneInTheQuiver.ts} (75%) delete mode 100644 src/Structures/MiniGames/Arcade/PartyGames.test.ts delete mode 100644 src/Structures/MiniGames/Arcade/PartyGames.ts create mode 100644 src/Structures/MiniGames/Arcade/PartyGames/LawnMoower.ts create mode 100644 src/Structures/MiniGames/Arcade/PartyGames/PartyGames.ts create mode 100644 src/Structures/MiniGames/Arcade/PartyGames/PartyGamesGame.ts create mode 100644 src/Structures/MiniGames/Arcade/PartyGames/RPG16.ts delete mode 100644 src/Structures/MiniGames/Arcade/PartyPooper.test.ts delete mode 100644 src/Structures/MiniGames/Arcade/PartyPooper.ts delete mode 100644 src/Structures/MiniGames/Arcade/PixelParty.test.ts delete mode 100644 src/Structures/MiniGames/Arcade/PixelParty.ts delete mode 100644 src/Structures/MiniGames/Arcade/PixelPartyGameMode.test.ts delete mode 100644 src/Structures/MiniGames/Arcade/PixelPartyGameMode.ts delete mode 100644 src/Structures/MiniGames/Arcade/PropHunt.test.ts delete mode 100644 src/Structures/MiniGames/Arcade/PropHunt.ts create mode 100644 src/Structures/MiniGames/Arcade/SantaSays.ts create mode 100644 src/Structures/MiniGames/Arcade/SantaSimulator.ts create mode 100644 src/Structures/MiniGames/Arcade/ScubaSimulator.ts rename src/Structures/MiniGames/Arcade/{HypixelSays.ts => SimonSays.ts} (87%) rename src/Structures/MiniGames/Arcade/{Football.ts => Soccer.ts} (65%) delete mode 100644 src/Structures/MiniGames/Arcade/ThrowOut.test.ts create mode 100644 src/Structures/MiniGames/Arcade/WoolHunt.ts delete mode 100644 src/Structures/MiniGames/Arcade/Zombies.test.ts delete mode 100644 src/Structures/MiniGames/Arcade/Zombies.ts create mode 100644 src/Structures/MiniGames/Arcade/Zombies/Zombies.ts create mode 100644 src/Structures/MiniGames/Arcade/Zombies/ZombiesMap.ts delete mode 100644 src/Structures/MiniGames/Arcade/ZombiesStats.test.ts delete mode 100644 src/Structures/MiniGames/Arcade/ZombiesStats.ts diff --git a/src/Structures/MiniGames/Arcade/Arcade.test.ts b/src/Structures/MiniGames/Arcade/Arcade.test.ts deleted file mode 100644 index a3c0036b1..000000000 --- a/src/Structures/MiniGames/Arcade/Arcade.test.ts +++ /dev/null @@ -1,70 +0,0 @@ -import Arcade from './Arcade.js'; -import BlockingDead from './BlockingDead.js'; -import BountyHunters from './BountyHunters.js'; -import DragonWars from './DragonWars.js'; -import Dropper from './Dropper.js'; -import EnderSpleef from './EnderSpleef.js'; -import FarmHunt from './FarmHunt.js'; -import Football from './Football.js'; -import GalaxyWars from './GalaxyWars.js'; -import HideAndSeek from './HideAndSeek.js'; -import HoleInTheWall from './HoleInTheWall.js'; -import HypixelSays from './HypixelSays.js'; -import MiniWalls from './MiniWalls.js'; -import PartyGames from './PartyGames.js'; -import PixelParty from './PixelParty.js'; -import ThrowOut from './ThrowOut.js'; -import Zombies from './Zombies.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('Arcade', () => { - const data = new Arcade({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(Arcade); - expectTypeOf(data).toEqualTypeOf(); - expect(data.coins).toBeDefined(); - expect(data.coins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.coins).toEqualTypeOf(); - expect(data.weeklyCoins).toBeDefined(); - expect(data.weeklyCoins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.weeklyCoins).toEqualTypeOf(); - expect(data.monthlyCoins).toBeDefined(); - expect(data.monthlyCoins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.monthlyCoins).toEqualTypeOf(); - expect(data.hintsDisabled).toBeDefined(); - expectTypeOf(data.hintsDisabled).toEqualTypeOf(); - expect(data.flashDisabled).toBeDefined(); - expectTypeOf(data.flashDisabled).toEqualTypeOf(); - expect(data.blockingDead).toBeDefined(); - expectTypeOf(data.blockingDead).toEqualTypeOf(); - expect(data.bountyHunters).toBeDefined(); - expectTypeOf(data.bountyHunters).toEqualTypeOf(); - expect(data.dragonWars).toBeDefined(); - expectTypeOf(data.dragonWars).toEqualTypeOf(); - expect(data.dropper).toBeDefined(); - expectTypeOf(data.dropper).toEqualTypeOf(); - expect(data.enderSpleef).toBeDefined(); - expectTypeOf(data.enderSpleef).toEqualTypeOf(); - expect(data.farmHunt).toBeDefined(); - expectTypeOf(data.farmHunt).toEqualTypeOf(); - expect(data.football).toBeDefined(); - expectTypeOf(data.football).toEqualTypeOf(); - expect(data.galaxyWars).toBeDefined(); - expectTypeOf(data.galaxyWars).toEqualTypeOf(); - expect(data.hideAndSeek).toBeDefined(); - expectTypeOf(data.hideAndSeek).toEqualTypeOf(); - expect(data.holeInTheWall).toBeDefined(); - expectTypeOf(data.holeInTheWall).toEqualTypeOf(); - expect(data.hypixelSays).toBeDefined(); - expectTypeOf(data.hypixelSays).toEqualTypeOf(); - expect(data.miniWalls).toBeDefined(); - expectTypeOf(data.miniWalls).toEqualTypeOf(); - expect(data.partyGames).toBeDefined(); - expectTypeOf(data.partyGames).toEqualTypeOf(); - expect(data.pixelParty).toBeDefined(); - expectTypeOf(data.pixelParty).toEqualTypeOf(); - expect(data.throwOut).toBeDefined(); - expectTypeOf(data.throwOut).toEqualTypeOf(); - expect(data.zombies).toBeDefined(); - expectTypeOf(data.zombies).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/Arcade/Arcade.ts b/src/Structures/MiniGames/Arcade/Arcade.ts index d71d7021f..fd2cc9c84 100644 --- a/src/Structures/MiniGames/Arcade/Arcade.ts +++ b/src/Structures/MiniGames/Arcade/Arcade.ts @@ -1,64 +1,166 @@ -import BlockingDead from './BlockingDead.js'; -import BountyHunters from './BountyHunters.js'; -import DragonWars from './DragonWars.js'; -import Dropper from './Dropper.js'; -import EnderSpleef from './EnderSpleef.js'; -import FarmHunt from './FarmHunt.js'; -import Football from './Football.js'; -import GalaxyWars from './GalaxyWars.js'; -import HideAndSeek from './HideAndSeek.js'; -import HoleInTheWall from './HoleInTheWall.js'; -import HypixelSays from './HypixelSays.js'; -import MiniWalls from './MiniWalls.js'; -import PartyGames from './PartyGames.js'; -import PixelParty from './PixelParty.js'; -import ThrowOut from './ThrowOut.js'; -import Zombies from './Zombies.js'; -import { monthAB, weekAB } from '../../../Utils/Oscillation.js'; +import ArcadeOptions from './ArcadeOptions.js'; +import BlockingDead from './BlockingDead.ts'; +import DragonWars from './DragonWars.ts'; +import DrawTheirThing from './DrawTheirThing.ts'; +import Dropper from './Dropper/Dropper.ts'; +import Dtt from './Dtt.ts'; +import EasterSimulator from './EasterSimulator.ts'; +import EnderSpleef from './EnderSpleef.ts'; +import FarmHunt from './FarmHunt.ts'; +import FootBall from './FootBall.ts'; +import GalaxyWars from './GalaxyWars.ts'; +import GrinchSimulator from './GrinchSimulator.ts'; +import HalloweenSimulator from './HalloweenSimulator.ts'; +import HideAndSeek from './HideAndSeek.ts'; +import HoleInTheWall from './HoleInTheWall.ts'; +import HypixelSports from './HypixelSports.ts'; +import MiniWalls from './MiniWalls.ts'; +import OneInTheQuiver from './OneInTheQuiver.ts'; +import PartyGames from './PartyGames/PartyGames.js'; +import SantaSays from './SantaSays.ts'; +import SantaSimulator from './SantaSimulator.ts'; +import ScubaSimulator from './ScubaSimulator.ts'; +import SimonSays from './SimonSays.ts'; +import Soccer from './Soccer.ts'; +import ThrowOut from './ThrowOut.ts'; +import WoolHunt from './WoolHunt.ts'; +import Zombies from './Zombies/Zombies.ts'; +import { monthAB, weekAB } from '../../../Utils/Oscillation.ts'; +import type { + ArcadeBountyHead, + ArcadeMeleeWeapon, + ArcadeMovementTrail, + ArcadePackage, + ArcadeProjectileTrail, + ArcadeVictoryDance, + Language, + ShopSort +} from '../../../Types/Player.ts'; class Arcade { - coins: number; - weeklyCoins: number; - monthlyCoins: number; - hintsDisabled: boolean; - flashDisabled: boolean; + activeMovementTrail: ArcadeMovementTrail | 'UNKNOWN'; + activeProjectileTrail: ArcadeProjectileTrail | 'UNKNOWN'; + activeVictoryDance: ArcadeVictoryDance | 'UNKNOWN'; + blood: boolean; + bountyHead: ArcadeBountyHead; + tokens: number; + dec2016Achievements: boolean; + dec2016Achievements2: boolean; + flash: boolean; + hideAndSeekShowQueueBook: boolean; + hints: boolean; + language: Language | 'UNKNOWN'; + maxWave: number; + meleeWeapon: ArcadeMeleeWeapon | 'UNKNOWN'; + monthlyTokens: number; + monthlyTokensA: number; + monthlyTokensB: number; + music: boolean; + mysteryGiftsObtained: number; + options: ArcadeOptions; + poopCollected: number; + ppLanguage: Language | 'UNKNOWN'; + privategames: Record; + shopSort: ShopSort | 'UNKNOWN'; + shopSortEnableOwnedFirst: boolean; + showInfoBook: boolean; + simonSong: boolean; + stampLevel: number; + timestamp: number; + weeklyTokens: number; + weeklyTokensA: number; + weeklyTokensB: number; + xmasMusic: boolean; + packages: ArcadePackage[]; blockingDead: BlockingDead; - bountyHunters: BountyHunters; dragonWars: DragonWars; dropper: Dropper; + drawTheirThing: DrawTheirThing; + dtt: Dtt; + easterSimulator: EasterSimulator; enderSpleef: EnderSpleef; farmHunt: FarmHunt; - football: Football; + footBall: FootBall; galaxyWars: GalaxyWars; + grinchSimulator: GrinchSimulator; + halloweenSimulator: HalloweenSimulator; hideAndSeek: HideAndSeek; holeInTheWall: HoleInTheWall; - hypixelSays: HypixelSays; - miniWalls: MiniWalls; + hypixelSports: HypixelSports; + MiniWalls: MiniWalls; + oneInTheQuiver: OneInTheQuiver; partyGames: PartyGames; - pixelParty: PixelParty; + santaSays: SantaSays; + santaSimulator: SantaSimulator; + scubaSimulator: ScubaSimulator; + simonSays: SimonSays; + soccer: Soccer; throwOut: ThrowOut; + woolHunt: WoolHunt; zombies: Zombies; - constructor(data: Record = {}) { - this.coins = data?.coins || data?.tokens || 0; - this.weeklyCoins = parseInt(data?.[`weekly_coins_${weekAB()}`] || 0, 10); - this.monthlyCoins = parseInt(data?.[`monthly_coins_${monthAB()}`] || 0, 10); - this.hintsDisabled = !data?.hints; - this.flashDisabled = !data?.flash; + constructor(data: Record) { + this.activeMovementTrail = data?.active_movement_trail || 'UNKNOWN'; + this.activeProjectileTrail = data?.active_projectile_trail || 'UNKNOWN'; + this.activeVictoryDance = data?.active_victory_dance || 'UNKNOWN'; + this.blood = data?.blood || false; + this.bountyHead = data?.bounty_head || 'DEFAULT'; + this.tokens = data?.tokens || data?.coins || 0; + this.dec2016Achievements = data?.dec2016_achievements || false; + this.dec2016Achievements2 = data?.dec2016_achievements2 || false; + this.flash = data?.flash || false; + this.hideAndSeekShowQueueBook = data?.hideandseek_showqueuebook || false; + this.hints = data?.hints || false; + this.language = data?.language || 'UNKNOWN'; + this.maxWave = data?.max_wave || 0; + this.meleeWeapon = data?.melee_weapon || 'UNKNOWN'; + this.monthlyTokens = parseInt( + data?.[`monthly_tokens_${monthAB()}`] || data?.[`monthly_coins_${monthAB()}`] || 0, + 10 + ); + this.monthlyTokensA = data?.monthly_coins_a || 0; + this.monthlyTokensB = data?.monthly_coins_b || 0; + this.music = data?.music || false; + this.mysteryGiftsObtained = data?.mystery_gifts_obtained || 0; + this.options = new ArcadeOptions(data); + this.poopCollected = data?.poop_collected || 0; + this.ppLanguage = data?.pp_language || 'UNKNOWN'; + this.privategames = data?.privategames || {}; + this.shopSort = data?.shop_sort || 'UNKNOWN'; + this.shopSortEnableOwnedFirst = data?.shop_sort_enable_owned_first || false; + this.showInfoBook = data?.showinfobook || false; + this.simonSong = data?.simon_song || false; + this.stampLevel = data?.stamp_level || 0; + this.timestamp = data?.time_stamp || 0; + this.weeklyTokens = parseInt(data?.[`weekly_tokens_${weekAB()}`] || data?.[`weekly_coins_${weekAB()}`] || 0, 10); + this.weeklyTokensA = data?.weekly_tokens_a || data?.weekly_coins_a || 0; + this.weeklyTokensB = data?.weekly_tokens_b || data?.weekly_coins_b || 0; + this.xmasMusic = data?.xmas_music || false; + this.packages = data?.packages || []; this.blockingDead = new BlockingDead(data); - this.bountyHunters = new BountyHunters(data); this.dragonWars = new DragonWars(data); - this.dropper = new Dropper(data?.dropper); + this.dropper = new Dropper(data?.dropper || {}); + this.drawTheirThing = new DrawTheirThing(data); + this.dtt = new Dtt(data); + this.easterSimulator = new EasterSimulator(data); this.enderSpleef = new EnderSpleef(data); this.farmHunt = new FarmHunt(data); - this.football = new Football(data); + this.footBall = new FootBall(data); this.galaxyWars = new GalaxyWars(data); + this.grinchSimulator = new GrinchSimulator(data); + this.halloweenSimulator = new HalloweenSimulator(data); this.hideAndSeek = new HideAndSeek(data); this.holeInTheWall = new HoleInTheWall(data); - this.hypixelSays = new HypixelSays(data); - this.miniWalls = new MiniWalls(data); + this.hypixelSports = new HypixelSports(data); + this.MiniWalls = new MiniWalls(data); + this.oneInTheQuiver = new OneInTheQuiver(data); this.partyGames = new PartyGames(data); - this.pixelParty = new PixelParty(data); + this.santaSays = new SantaSays(data); + this.santaSimulator = new SantaSimulator(data); + this.scubaSimulator = new ScubaSimulator(data); + this.simonSays = new SimonSays(data); + this.soccer = new Soccer(data); this.throwOut = new ThrowOut(data); + this.woolHunt = new WoolHunt(data); this.zombies = new Zombies(data); } } diff --git a/src/Structures/MiniGames/Arcade/ArcadeOptions.ts b/src/Structures/MiniGames/Arcade/ArcadeOptions.ts new file mode 100644 index 000000000..34dd50d76 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/ArcadeOptions.ts @@ -0,0 +1,22 @@ +class ArcadeOptions { + showAllKillFeed: boolean; + showEnemyWoolDropped: boolean; + showEnemyWoolPickedUp: boolean; + showOwnWoolDropped: boolean; + showOwnWoolPickedUp: boolean; + showTipHologram: boolean; + showTips: boolean; + showTutorialBook: boolean; + constructor(data: Record) { + this.showAllKillFeed = (data?.option_show_all_killfeed || 'off') === 'on'; + this.showEnemyWoolDropped = (data?.option_show_enemy_wool_dropped || 'off') === 'on'; + this.showEnemyWoolPickedUp = (data?.option_show_enemy_wool_picked_up || 'off') === 'on'; + this.showOwnWoolDropped = (data?.option_show_own_wool_dropped || 'off') === 'on'; + this.showOwnWoolPickedUp = (data?.option_show_own_wool_picked_up || 'off') === 'on'; + this.showTipHologram = (data?.option_show_tip_hologram || 'off') === 'on'; + this.showTips = (data?.option_show_tips || 'off') === 'on'; + this.showTutorialBook = (data?.option_show_tutorial_book || 'off') === 'on'; + } +} + +export default ArcadeOptions; diff --git a/src/Structures/MiniGames/Arcade/BlockingDead.test.ts b/src/Structures/MiniGames/Arcade/BlockingDead.test.ts deleted file mode 100644 index 247357d1d..000000000 --- a/src/Structures/MiniGames/Arcade/BlockingDead.test.ts +++ /dev/null @@ -1,18 +0,0 @@ -import BlockingDead from './BlockingDead.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('BlockingDead', () => { - const data = new BlockingDead({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(BlockingDead); - expectTypeOf(data).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.kills).toBeDefined(); - expect(data.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.kills).toEqualTypeOf(); - expect(data.headShots).toBeDefined(); - expect(data.headShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.headShots).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/Arcade/BlockingDead.ts b/src/Structures/MiniGames/Arcade/BlockingDead.ts index 3a34f3cae..07a390a95 100644 --- a/src/Structures/MiniGames/Arcade/BlockingDead.ts +++ b/src/Structures/MiniGames/Arcade/BlockingDead.ts @@ -1,11 +1,11 @@ class BlockingDead { - wins: number; - kills: number; headShots: number; + kills: number; + wins: number; constructor(data: Record) { - this.wins = data?.wins_dayone || 0; - this.kills = data?.kills_dayone || 0; this.headShots = data?.headshots_dayone || 0; + this.kills = data?.kills_dayone || 0; + this.wins = data?.wins_dayone || 0; } } diff --git a/src/Structures/MiniGames/Arcade/BountyHunters.test.ts b/src/Structures/MiniGames/Arcade/BountyHunters.test.ts deleted file mode 100644 index aeac33ca2..000000000 --- a/src/Structures/MiniGames/Arcade/BountyHunters.test.ts +++ /dev/null @@ -1,30 +0,0 @@ -import BountyHunters from './BountyHunters.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('BountyHunters', () => { - const data = new BountyHunters({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(BountyHunters); - expectTypeOf(data).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.kills).toBeDefined(); - expect(data.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.kills).toEqualTypeOf(); - expect(data.deaths).toBeDefined(); - expect(data.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.deaths).toEqualTypeOf(); - expect(data.KDR).toBeDefined(); - expect(data.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.KDR).toEqualTypeOf(); - expect(data.bountyKills).toBeDefined(); - expect(data.bountyKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bountyKills).toEqualTypeOf(); - expect(data.bowKills).toBeDefined(); - expect(data.bowKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowKills).toEqualTypeOf(); - expect(data.swordKills).toBeDefined(); - expect(data.swordKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.swordKills).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/Arcade/DragonWars.test.ts b/src/Structures/MiniGames/Arcade/DragonWars.test.ts deleted file mode 100644 index d648b9ed6..000000000 --- a/src/Structures/MiniGames/Arcade/DragonWars.test.ts +++ /dev/null @@ -1,15 +0,0 @@ -import DragonWars from './DragonWars.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('DragonWars', () => { - const data = new DragonWars({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(DragonWars); - expectTypeOf(data).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.kills).toBeDefined(); - expect(data.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.kills).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/Arcade/DragonWars.ts b/src/Structures/MiniGames/Arcade/DragonWars.ts index c150bfb1b..cf142b64f 100644 --- a/src/Structures/MiniGames/Arcade/DragonWars.ts +++ b/src/Structures/MiniGames/Arcade/DragonWars.ts @@ -1,9 +1,9 @@ class DragonWars { - wins: number; kills: number; + wins: number; constructor(data: Record) { - this.wins = data?.wins_dragonwars2 || 0; this.kills = data?.kills_dragonwars2 || 0; + this.wins = data?.wins_dragonwars2 || 0; } } diff --git a/src/Structures/MiniGames/Arcade/DrawTheirThing.ts b/src/Structures/MiniGames/Arcade/DrawTheirThing.ts new file mode 100644 index 000000000..c9d89e8f1 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/DrawTheirThing.ts @@ -0,0 +1,8 @@ +class DrawTheirThing { + wins: number; + constructor(data: Record) { + this.wins = data?.wins_draw_their_thing || 0; + } +} + +export default DrawTheirThing; diff --git a/src/Structures/MiniGames/Arcade/Dropper.test.ts b/src/Structures/MiniGames/Arcade/Dropper.test.ts deleted file mode 100644 index 0363b84de..000000000 --- a/src/Structures/MiniGames/Arcade/Dropper.test.ts +++ /dev/null @@ -1,33 +0,0 @@ -import Dropper from './Dropper.js'; -import DropperMap from './DropperMap.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('Dropper', () => { - const data = new Dropper({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(Dropper); - expectTypeOf(data).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.fails).toBeDefined(); - expect(data.fails).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fails).toEqualTypeOf(); - expect(data.fastestGame).toBeDefined(); - expect(data.fastestGame).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fastestGame).toEqualTypeOf(); - expect(data.flawlessGames).toBeDefined(); - expect(data.flawlessGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.flawlessGames).toEqualTypeOf(); - expect(data.gamesPlayed).toBeDefined(); - expect(data.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.gamesPlayed).toEqualTypeOf(); - expect(data.mapsCompleted).toBeDefined(); - expect(data.mapsCompleted).toBeGreaterThanOrEqual(0); - expectTypeOf(data.mapsCompleted).toEqualTypeOf(); - expect(data.gamesFinished).toBeDefined(); - expect(data.gamesFinished).toBeGreaterThanOrEqual(0); - expectTypeOf(data.gamesFinished).toEqualTypeOf(); - expect(data.maps).toBeDefined(); - expectTypeOf(data.maps).toEqualTypeOf>(); -}); diff --git a/src/Structures/MiniGames/Arcade/Dropper.ts b/src/Structures/MiniGames/Arcade/Dropper.ts deleted file mode 100644 index 5ac8511ec..000000000 --- a/src/Structures/MiniGames/Arcade/Dropper.ts +++ /dev/null @@ -1,27 +0,0 @@ -import DropperMap from './DropperMap.js'; - -class Dropper { - wins: number; - fails: number; - fastestGame: number; - flawlessGames: number; - gamesPlayed: number; - mapsCompleted: number; - gamesFinished: number; - maps: Record; - constructor(data: Record) { - this.wins = data?.wins ?? 0; - this.fails = data?.fails ?? 0; - this.fastestGame = data?.fastest_game ?? 0; - this.flawlessGames = data?.flawless_games ?? 0; - this.gamesPlayed = data?.games_played ?? 0; - this.mapsCompleted = data?.maps_completed ?? 0; - this.gamesFinished = data?.games_finished ?? 0; - this.maps = {}; - Object?.keys(data?.map_stats ?? {})?.forEach((map) => { - this.maps[map] = new DropperMap(data?.map_stats, map); - }); - } -} - -export default Dropper; diff --git a/src/Structures/MiniGames/Arcade/Dropper/Dropper.ts b/src/Structures/MiniGames/Arcade/Dropper/Dropper.ts new file mode 100644 index 000000000..47cb57b1f --- /dev/null +++ b/src/Structures/MiniGames/Arcade/Dropper/Dropper.ts @@ -0,0 +1,146 @@ +import DropperMap from './DropperMap.ts'; + +class Dropper { + fails: number; + fastestGame: number; + flawlessGames: number; + gamesFinished: number; + gamesPlayed: number; + mapsCompleted: number; + wins: number; + atlantis: DropperMap; + balloons: DropperMap; + bbq: DropperMap; + beanstalk: DropperMap; + birdcage: DropperMap; + boardgames: DropperMap; + bridges: DropperMap; + butterflies: DropperMap; + cabin: DropperMap; + castle: DropperMap; + city: DropperMap; + distance: DropperMap; + distortion: DropperMap; + drainage: DropperMap; + emoji: DropperMap; + factory: DropperMap; + floatingIslands: DropperMap; + flytrap: DropperMap; + frogspawn: DropperMap; + gears: DropperMap; + geometry: DropperMap; + glacier: DropperMap; + hellgate: DropperMap; + illusion: DropperMap; + iris: DropperMap; + kingDommines: DropperMap; + kingsPass: DropperMap; + kraken: DropperMap; + launchZone: DropperMap; + lavaFall: DropperMap; + lily: DropperMap; + maelstrom: DropperMap; + mainframe: DropperMap; + microscope: DropperMap; + mineshaft: DropperMap; + mushroom: DropperMap; + nightlife: DropperMap; + ocean: DropperMap; + overgrown: DropperMap; + painted: DropperMap; + paradigm: DropperMap; + plughole: DropperMap; + raindrops: DropperMap; + ravine: DropperMap; + retro: DropperMap; + revolve: DropperMap; + sandWorm: DropperMap; + sewer: DropperMap; + space: DropperMap; + stratocumulus: DropperMap; + sweets: DropperMap; + tangle: DropperMap; + time: DropperMap; + toilet: DropperMap; + ufo: DropperMap; + upsideDown: DropperMap; + vintage: DropperMap; + vortex: DropperMap; + warp: DropperMap; + warPortal: DropperMap; + well: DropperMap; + western: DropperMap; + constructor(data: Record) { + this.fails = data?.fails || 0; + this.fastestGame = data?.fastest_game || 0; + this.flawlessGames = data?.flawless_games || 0; + this.gamesFinished = data?.games_finished || 0; + this.gamesPlayed = data?.games_played || 0; + this.mapsCompleted = data?.maps_completed || 0; + this.wins = data?.wins || 0; + this.atlantis = new DropperMap(data?.atlantis || {}); + this.balloons = new DropperMap(data?.balloons || {}); + this.bbq = new DropperMap(data?.bbq || {}); + this.beanstalk = new DropperMap(data?.beanstalk || {}); + this.birdcage = new DropperMap(data?.birdcage || {}); + this.boardgames = new DropperMap(data?.boardgames || {}); + this.bridges = new DropperMap(data?.bridges || {}); + this.butterflies = new DropperMap(data?.butterflies || {}); + this.cabin = new DropperMap(data?.cabin || {}); + this.castle = new DropperMap(data?.castle || {}); + this.city = new DropperMap(data?.city || {}); + this.distance = new DropperMap(data?.distance || {}); + this.distortion = new DropperMap(data?.distortion || {}); + this.drainage = new DropperMap(data?.drainage || {}); + this.emoji = new DropperMap(data?.emoji || {}); + this.factory = new DropperMap(data?.factory || {}); + this.floatingIslands = new DropperMap(data?.floatingislands || {}); + this.flytrap = new DropperMap(data?.flytrap || {}); + this.frogspawn = new DropperMap(data?.frogspawn || {}); + this.gears = new DropperMap(data?.gears || {}); + this.geometry = new DropperMap(data?.geometry || {}); + this.glacier = new DropperMap(data?.glacier || {}); + this.hellgate = new DropperMap(data?.hellgate || {}); + this.illusion = new DropperMap(data?.illusion || {}); + this.iris = new DropperMap(data?.iris || {}); + this.kingDommines = new DropperMap(data?.kingdommines || {}); + this.kingsPass = new DropperMap(data?.kingspass || {}); + this.kraken = new DropperMap(data?.kraken || {}); + this.launchZone = new DropperMap(data?.launchzone || {}); + this.lavaFall = new DropperMap(data?.lavafall || {}); + this.lily = new DropperMap(data?.lily || {}); + this.maelstrom = new DropperMap(data?.maelstrom || {}); + this.mainframe = new DropperMap(data?.mainframe || {}); + this.microscope = new DropperMap(data?.microscope || {}); + this.mineshaft = new DropperMap(data?.mineshaft || {}); + this.mushroom = new DropperMap(data?.mushroom || {}); + this.nightlife = new DropperMap(data?.nightlife || {}); + this.ocean = new DropperMap(data?.ocean || {}); + this.overgrown = new DropperMap(data?.overgrown || {}); + this.painted = new DropperMap(data?.painted || {}); + this.paradigm = new DropperMap(data?.paradigm || {}); + this.plughole = new DropperMap(data?.plughole || {}); + this.raindrops = new DropperMap(data?.raindrops || {}); + this.ravine = new DropperMap(data?.ravine || {}); + this.retro = new DropperMap(data?.retro || {}); + this.revolve = new DropperMap(data?.revolve || {}); + this.sandWorm = new DropperMap(data?.sandworm || {}); + this.sewer = new DropperMap(data?.sewer || {}); + this.space = new DropperMap(data?.space || {}); + this.stratocumulus = new DropperMap(data?.stratocumulus || {}); + this.sweets = new DropperMap(data?.sweets || {}); + this.tangle = new DropperMap(data?.tangle || {}); + this.time = new DropperMap(data?.time || {}); + this.toilet = new DropperMap(data?.toilet || {}); + this.ufo = new DropperMap(data?.ufo || {}); + this.upsideDown = new DropperMap(data?.upsidedown || {}); + this.vintage = new DropperMap(data?.vintage || {}); + this.vortex = new DropperMap(data?.vortex || {}); + this.warp = new DropperMap(data?.warp || {}); + this.warPortal = new DropperMap(data?.warportal || {}); + this.well = new DropperMap(data?.well || {}); + this.western = new DropperMap(data?.western || {}); + } +} + +export default Dropper; diff --git a/src/Structures/MiniGames/Arcade/Dropper/DropperMap.ts b/src/Structures/MiniGames/Arcade/Dropper/DropperMap.ts new file mode 100644 index 000000000..a5355c08c --- /dev/null +++ b/src/Structures/MiniGames/Arcade/Dropper/DropperMap.ts @@ -0,0 +1,10 @@ +class DropperMap { + bestTime: number; + completions: number; + constructor(data: Record) { + this.bestTime = data?.best_time || 0; + this.completions = data?.completions || 0; + } +} + +export default DropperMap; diff --git a/src/Structures/MiniGames/Arcade/DropperMap.test.ts b/src/Structures/MiniGames/Arcade/DropperMap.test.ts deleted file mode 100644 index 3045b60f5..000000000 --- a/src/Structures/MiniGames/Arcade/DropperMap.test.ts +++ /dev/null @@ -1,15 +0,0 @@ -import DropperMap from './DropperMap.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('DropperMap', () => { - const data = new DropperMap({ stats: 'meow' }, 'meow'); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(DropperMap); - expectTypeOf(data).toEqualTypeOf(); - expect(data.bestTime).toBeDefined(); - expect(data.bestTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bestTime).toEqualTypeOf(); - expect(data.completions).toBeDefined(); - expect(data.completions).toBeGreaterThanOrEqual(0); - expectTypeOf(data.completions).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/Arcade/DropperMap.ts b/src/Structures/MiniGames/Arcade/DropperMap.ts deleted file mode 100644 index f503661dd..000000000 --- a/src/Structures/MiniGames/Arcade/DropperMap.ts +++ /dev/null @@ -1,10 +0,0 @@ -class DropperMap { - bestTime: number; - completions: number; - constructor(data: Record, mapName: string) { - this.bestTime = data?.[mapName]?.best_time || 0; - this.completions = data?.[mapName]?.completions || 0; - } -} - -export default DropperMap; diff --git a/src/Structures/MiniGames/Arcade/Dtt.ts b/src/Structures/MiniGames/Arcade/Dtt.ts new file mode 100644 index 000000000..0aec08be7 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/Dtt.ts @@ -0,0 +1,13 @@ +// TODO: Work out WHAT THE FUCK Dtt means. I cannot find any mentions of it +class Dtt { + dropdown: boolean; + filter: boolean; + music: boolean; + constructor(data: Record) { + this.dropdown = data?.dtt_dropdown || false; + this.filter = data?.dtt_filter || false; + this.music = data?.dtt_music || false; + } +} + +export default Dtt; diff --git a/src/Structures/MiniGames/Arcade/EasterSimulator.ts b/src/Structures/MiniGames/Arcade/EasterSimulator.ts new file mode 100644 index 000000000..4ab0c9f24 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/EasterSimulator.ts @@ -0,0 +1,10 @@ +class EasterSimulator { + eggsFound: number; + wins: number; + constructor(data: Record) { + this.eggsFound = data?.eggs_found_easter_simulator || 0; + this.wins = data?.wins_easter_simulator || 0; + } +} + +export default EasterSimulator; diff --git a/src/Structures/MiniGames/Arcade/EnderSpleef.test.ts b/src/Structures/MiniGames/Arcade/EnderSpleef.test.ts deleted file mode 100644 index 97f9002cf..000000000 --- a/src/Structures/MiniGames/Arcade/EnderSpleef.test.ts +++ /dev/null @@ -1,30 +0,0 @@ -import EnderSpleef from './EnderSpleef.js'; -import { expect, expectTypeOf, test } from 'vitest'; -import type { EnderSpleefTrails } from '../../../Types/Player.js'; - -test('EnderSpleef', () => { - const data = new EnderSpleef({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(EnderSpleef); - expectTypeOf(data).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.kills).toBeDefined(); - expect(data.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.kills).toEqualTypeOf(); - expect(data.trail).toBeDefined(); - expectTypeOf(data.trail).toEqualTypeOf(); - expect(data.blocksDestroyed).toBeDefined(); - expect(data.blocksDestroyed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blocksDestroyed).toEqualTypeOf(); - expect(data.bigShotActivations).toBeDefined(); - expect(data.bigShotActivations).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bigShotActivations).toEqualTypeOf(); - expect(data.tripleShotActivations).toBeDefined(); - expect(data.tripleShotActivations).toBeGreaterThanOrEqual(0); - expectTypeOf(data.tripleShotActivations).toEqualTypeOf(); - expect(data.totalPowerUpActivations).toBeDefined(); - expect(data.totalPowerUpActivations).toBeGreaterThanOrEqual(0); - expectTypeOf(data.totalPowerUpActivations).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/Arcade/EnderSpleef.ts b/src/Structures/MiniGames/Arcade/EnderSpleef.ts index 0289e3514..bf5543b15 100644 --- a/src/Structures/MiniGames/Arcade/EnderSpleef.ts +++ b/src/Structures/MiniGames/Arcade/EnderSpleef.ts @@ -1,21 +1,19 @@ -import type { EnderSpleefTrails } from '../../../Types/Player.js'; +import type { ArcadeEnderSpleefTrail } from '../../../Types/Player.ts'; class EnderSpleef { - wins: number; - kills: number; - trail: EnderSpleefTrails | 'None'; + bigshotPowerupActivations: number; blocksDestroyed: number; - bigShotActivations: number; - tripleShotActivations: number; - totalPowerUpActivations: number; + spleefTrail: ArcadeEnderSpleefTrail | 'UNKNOWN'; + powerupActivations: number; + tripleshotPowerupActivations: number; + wins: number; constructor(data: Record) { - this.wins = data?.wins_ender || 0; - this.kills = data?.kills_dragonwars2 || 0; - this.trail = data?.enderspleef_trail || 'None'; + this.bigshotPowerupActivations = data?.bigshot_powerup_activations_ender || 0; this.blocksDestroyed = data?.blocks_destroyed_ender || 0; - this.bigShotActivations = data?.bigshot_powerup_activations_ender || 0; - this.tripleShotActivations = data?.tripleshot_powerup_activations_ender || 0; - this.totalPowerUpActivations = this.bigShotActivations + this.tripleShotActivations; + this.spleefTrail = data?.enderspleef_trail || 'UNKNOWN'; + this.powerupActivations = data?.powerup_activations_ender || 0; + this.tripleshotPowerupActivations = data?.tripleshot_powerup_activations_ender || 0; + this.wins = data?.wins_ender || 0; } } diff --git a/src/Structures/MiniGames/Arcade/FarmHunt.test.ts b/src/Structures/MiniGames/Arcade/FarmHunt.test.ts deleted file mode 100644 index 95cdebba5..000000000 --- a/src/Structures/MiniGames/Arcade/FarmHunt.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -import FarmHunt from './FarmHunt.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('FarmHunt', () => { - const data = new FarmHunt({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(FarmHunt); - expectTypeOf(data).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.winsAsAnimal).toBeDefined(); - expect(data.winsAsAnimal).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winsAsAnimal).toEqualTypeOf(); - expect(data.winsAsHunter).toBeDefined(); - expect(data.winsAsHunter).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winsAsHunter).toEqualTypeOf(); - expect(data.kills).toBeDefined(); - expect(data.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.kills).toEqualTypeOf(); - expect(data.killsAsAnimal).toBeDefined(); - expect(data.killsAsAnimal).toBeGreaterThanOrEqual(0); - expectTypeOf(data.killsAsAnimal).toEqualTypeOf(); - expect(data.killsAsHunter).toBeDefined(); - expect(data.killsAsHunter).toBeGreaterThanOrEqual(0); - expectTypeOf(data.killsAsHunter).toEqualTypeOf(); - expect(data.tauntsUsed).toBeDefined(); - expect(data.tauntsUsed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.tauntsUsed).toEqualTypeOf(); - expect(data.riskyTauntsUsed).toBeDefined(); - expect(data.riskyTauntsUsed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.riskyTauntsUsed).toEqualTypeOf(); - expect(data.safeTauntsUsed).toBeDefined(); - expect(data.safeTauntsUsed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.safeTauntsUsed).toEqualTypeOf(); - expect(data.dangerousTauntsUsed).toBeDefined(); - expect(data.dangerousTauntsUsed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.dangerousTauntsUsed).toEqualTypeOf(); - expect(data.fireworkTauntsUsed).toBeDefined(); - expect(data.fireworkTauntsUsed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fireworkTauntsUsed).toEqualTypeOf(); - expect(data.poop).toBeDefined(); - expect(data.poop).toBeGreaterThanOrEqual(0); - expectTypeOf(data.poop).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/Arcade/FarmHunt.ts b/src/Structures/MiniGames/Arcade/FarmHunt.ts index e9add7162..909dac5b2 100644 --- a/src/Structures/MiniGames/Arcade/FarmHunt.ts +++ b/src/Structures/MiniGames/Arcade/FarmHunt.ts @@ -1,29 +1,39 @@ class FarmHunt { - wins: number; - winsAsAnimal: number; - winsAsHunter: number; + animalBowKills: number; + animalKills: number; + animalWins: number; + animalsBowKills: number; + bowKills: number; + dangerousTauntsUsed: number; + fireworkTauntsUsed: number; + hunterBowKills: number; + hunterKills: number; + hunterWins: number; + huntersBowKills: number; kills: number; - killsAsAnimal: number; - killsAsHunter: number; - tauntsUsed: number; + poopCollected: number; riskyTauntsUsed: number; safeTauntsUsed: number; - dangerousTauntsUsed: number; - fireworkTauntsUsed: number; - poop: number; + tauntsUsed: number; + wins: number; constructor(data: Record) { - this.wins = data?.wins_farm_hunt || 0; - this.winsAsAnimal = data?.animal_wins_farm_hunt || 0; - this.winsAsHunter = data?.hunter_wins_farm_hunt || 0; + this.animalBowKills = data?.animal_bow_kills_farm_hunt || 0; + this.animalKills = data?.animal_kills_farm_hunt || 0; + this.animalWins = data?.animal_wins_farm_hunt || 0; + this.animalsBowKills = data?.animals_bow_kills_farm_hunt || 0; + this.bowKills = data?.bow_kills_farm_hunt || 0; + this.dangerousTauntsUsed = data?.dangerous_taunts_used_farm_hunt || 0; + this.fireworkTauntsUsed = data?.firework_taunts_used_farm_hunt || 0; + this.hunterBowKills = data?.hunter_bow_kills_farm_hunt || 0; + this.hunterKills = data?.hunter_kills_farm_hunt || 0; + this.hunterWins = data?.hunter_wins_farm_hunt || 0; + this.huntersBowKills = data?.hunters_bow_kills_farm_hunt || 0; this.kills = data?.kills_farm_hunt || 0; - this.killsAsAnimal = data?.animal_kills_farm_hunt || 0; - this.killsAsHunter = data?.hunter_kills_farm_hunt || 0; - this.tauntsUsed = data?.taunts_used_farm_hunt || 0; + this.poopCollected = data?.poop_collected_farm_hunt || 0; this.riskyTauntsUsed = data?.risky_taunts_used_farm_hunt || 0; this.safeTauntsUsed = data?.safe_taunts_used_farm_hunt || 0; - this.dangerousTauntsUsed = data?.dangerous_taunts_used_farm_hunt || 0; - this.fireworkTauntsUsed = data?.firework_taunts_used_farm_hunt || 0; - this.poop = (data?.poop_collected_farm_hunt || 0) + (data?.poop_collected || 0); + this.tauntsUsed = data?.taunts_used_farm_hunt || 0; + this.wins = data?.wins_farm_hunt || 0; } } diff --git a/src/Structures/MiniGames/Arcade/FootBall.ts b/src/Structures/MiniGames/Arcade/FootBall.ts new file mode 100644 index 000000000..72015c030 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/FootBall.ts @@ -0,0 +1,14 @@ +class FootBall { + goals: number; + kicks: number; + powerkicks: number; + wins: number; + constructor(data: Record) { + this.goals = data?.fb_goals || 0; + this.kicks = data?.fb_kicks || 0; + this.powerkicks = data?.fb_powerkicks || 0; + this.wins = data?.fb_wins || 0; + } +} + +export default FootBall; diff --git a/src/Structures/MiniGames/Arcade/Football.test.ts b/src/Structures/MiniGames/Arcade/Football.test.ts deleted file mode 100644 index 40bf88964..000000000 --- a/src/Structures/MiniGames/Arcade/Football.test.ts +++ /dev/null @@ -1,21 +0,0 @@ -import Football from './Football.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('Football', () => { - const data = new Football({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(Football); - expectTypeOf(data).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.goals).toBeDefined(); - expect(data.goals).toBeGreaterThanOrEqual(0); - expectTypeOf(data.goals).toEqualTypeOf(); - expect(data.kicks).toBeDefined(); - expect(data.kicks).toBeGreaterThanOrEqual(0); - expectTypeOf(data.kicks).toEqualTypeOf(); - expect(data.powerKicks).toBeDefined(); - expect(data.powerKicks).toBeGreaterThanOrEqual(0); - expectTypeOf(data.powerKicks).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/Arcade/GalaxyWars.test.ts b/src/Structures/MiniGames/Arcade/GalaxyWars.test.ts deleted file mode 100644 index 02e95ff43..000000000 --- a/src/Structures/MiniGames/Arcade/GalaxyWars.test.ts +++ /dev/null @@ -1,36 +0,0 @@ -import GalaxyWars from './GalaxyWars.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('GalaxyWars', () => { - const data = new GalaxyWars({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(GalaxyWars); - expectTypeOf(data).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.kills).toBeDefined(); - expect(data.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.kills).toEqualTypeOf(); - expect(data.deaths).toBeDefined(); - expect(data.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.deaths).toEqualTypeOf(); - expect(data.KDR).toBeDefined(); - expect(data.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.KDR).toEqualTypeOf(); - expect(data.shotsFired).toBeDefined(); - expect(data.shotsFired).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shotsFired).toEqualTypeOf(); - expect(data.weeklyKills).toBeDefined(); - expect(data.weeklyKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.weeklyKills).toEqualTypeOf(); - expect(data.monthlyKills).toBeDefined(); - expect(data.monthlyKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.monthlyKills).toEqualTypeOf(); - expect(data.attackerKills).toBeDefined(); - expect(data.attackerKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.attackerKills).toEqualTypeOf(); - expect(data.defenderKills).toBeDefined(); - expect(data.defenderKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.defenderKills).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/Arcade/GalaxyWars.ts b/src/Structures/MiniGames/Arcade/GalaxyWars.ts index c8a5258ba..1e8f41eab 100644 --- a/src/Structures/MiniGames/Arcade/GalaxyWars.ts +++ b/src/Structures/MiniGames/Arcade/GalaxyWars.ts @@ -1,26 +1,31 @@ -import Divide from '../../../Utils/Divide.js'; -import { monthAB, weekAB } from '../../../Utils/Oscillation.js'; +import { monthAB, weekAB } from '../../../Utils/Oscillation.ts'; class GalaxyWars { - wins: number; - kills: number; deaths: number; - KDR: number; + empireKills: number; + gameWins: number; + kills: number; + monthlyKills: number; + monthlyKillsA: number; + monthlyKillsB: number; + rebelKills: number; shotsFired: number; weeklyKills: number; - monthlyKills: number; - attackerKills: number; - defenderKills: number; + weeklyKillsA: number; + weeklyKillsB: number; constructor(data: Record) { - this.wins = data?.sw_game_wins || 0; - this.kills = data?.sw_kills || 0; this.deaths = data?.sw_deaths || 0; - this.KDR = Divide(this.kills, this.deaths); + this.empireKills = data?.sw_empire_kills || 0; + this.gameWins = data?.sw_game_wins || 0; + this.kills = data?.sw_kills || 0; + this.monthlyKills = parseInt(data?.[`sw_monthly_kills_${monthAB()}`] || 0, 10); + this.monthlyKillsA = data?.sw_monthly_kills_a || 0; + this.monthlyKillsB = data?.sw_monthly_kills_b || 0; + this.rebelKills = data?.sw_rebel_kills || 0; this.shotsFired = data?.sw_shots_fired || 0; - this.weeklyKills = parseInt(data?.[`weekly_kills_${weekAB()}`] || 0, 10); - this.monthlyKills = parseInt(data?.[`monthly_kills_${monthAB()}`] || 0, 10); - this.attackerKills = data?.sw_rebel_kills || 0; - this.defenderKills = data?.sw_empire_kills || 0; + this.weeklyKills = parseInt(data?.[`sw_weekly_kills_${weekAB()}`] || 0, 10); + this.weeklyKillsA = data?.sw_weekly_kills_a || 0; + this.weeklyKillsB = data?.sw_weekly_kills_b || 0; } } diff --git a/src/Structures/MiniGames/Arcade/GrinchSimulator.ts b/src/Structures/MiniGames/Arcade/GrinchSimulator.ts new file mode 100644 index 000000000..7fa2f8ccb --- /dev/null +++ b/src/Structures/MiniGames/Arcade/GrinchSimulator.ts @@ -0,0 +1,22 @@ +class GrinchSimulator { + gifts: number; + giftsTourney: number; + giftsTourneyGrinchSimulator1: number; + lossesTourney: number; + lossesTourneyGrinchSimulator1: number; + wins: number; + winsTourney: number; + winsTourneyGrinchSimulator1: number; + constructor(data: Record) { + this.gifts = data?.gifts_grinch_simulator_v2 || 0; + this.giftsTourney = data?.gifts_grinch_simulator_v2_tourney || 0; + this.giftsTourneyGrinchSimulator1 = data?.gifts_grinch_simulator_v2_tourney_grinch_simulator_1 || 0; + this.lossesTourney = data?.losses_grinch_simulator_v2_tourney || 0; + this.lossesTourneyGrinchSimulator1 = data?.losses_grinch_simulator_v2_tourney_grinch_simulator_1 || 0; + this.wins = data?.wins_grinch_simulator_v2 || 0; + this.winsTourney = data?.wins_grinch_simulator_v2_tourney || 0; + this.winsTourneyGrinchSimulator1 = data?.wins_grinch_simulator_v2_tourney_grinch_simulator_1 || 0; + } +} + +export default GrinchSimulator; diff --git a/src/Structures/MiniGames/Arcade/HalloweenSimulator.ts b/src/Structures/MiniGames/Arcade/HalloweenSimulator.ts new file mode 100644 index 000000000..831c25a4f --- /dev/null +++ b/src/Structures/MiniGames/Arcade/HalloweenSimulator.ts @@ -0,0 +1,10 @@ +class HalloweenSimulator { + candyFound: number; + wins: number; + constructor(data: Record) { + this.candyFound = data?.candy_found_halloween_simulator || 0; + this.wins = data?.wins_halloween_simulator || 0; + } +} + +export default HalloweenSimulator; diff --git a/src/Structures/MiniGames/Arcade/HideAndSeek.test.ts b/src/Structures/MiniGames/Arcade/HideAndSeek.test.ts deleted file mode 100644 index 4685121c1..000000000 --- a/src/Structures/MiniGames/Arcade/HideAndSeek.test.ts +++ /dev/null @@ -1,21 +0,0 @@ -import HideAndSeek from './HideAndSeek.js'; -import PartyPooper from './PartyPooper.js'; -import PropHunt from './PropHunt.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('HideAndSeek', () => { - const data = new HideAndSeek({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(HideAndSeek); - expectTypeOf(data).toEqualTypeOf(); - expect(data.partyPooper).toBeDefined(); - expectTypeOf(data.partyPooper).toEqualTypeOf(); - expect(data.propHunt).toBeDefined(); - expectTypeOf(data.propHunt).toEqualTypeOf(); - expect(data.winsAsSeeker).toBeDefined(); - expect(data.winsAsSeeker).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winsAsSeeker).toEqualTypeOf(); - expect(data.winsAsHider).toBeDefined(); - expect(data.winsAsHider).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winsAsHider).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/Arcade/HideAndSeek.ts b/src/Structures/MiniGames/Arcade/HideAndSeek.ts index 7d496def3..303d7daf1 100644 --- a/src/Structures/MiniGames/Arcade/HideAndSeek.ts +++ b/src/Structures/MiniGames/Arcade/HideAndSeek.ts @@ -1,16 +1,17 @@ -import PartyPooper from './PartyPooper.js'; -import PropHunt from './PropHunt.js'; - class HideAndSeek { - partyPooper: PartyPooper; - propHunt: PropHunt; - winsAsSeeker: number; - winsAsHider: number; + hiderWins: number; + partyPooperHiderWins: number; + partyPooperSeekerWins: number; + propHuntHiderWins: number; + propHuntSeekerWins: number; + seekerWins: number; constructor(data: Record) { - this.partyPooper = new PartyPooper(data); - this.propHunt = new PropHunt(data); - this.winsAsSeeker = data?.seeker_wins_hide_and_seek || 0; - this.winsAsHider = data?.hider_wins_hide_and_seek || 0; + this.hiderWins = data?.hider_wins_hide_and_seek || 0; + this.partyPooperHiderWins = data?.party_pooper_hider_wins_hide_and_seek || 0; + this.partyPooperSeekerWins = data?.party_pooper_seeker_wins_hide_and_seek || 0; + this.propHuntHiderWins = data?.prop_hunt_hider_wins_hide_and_seek || 0; + this.propHuntSeekerWins = data?.prop_hunt_seeker_wins_hide_and_seek || 0; + this.seekerWins = data?.seeker_wins_hide_and_seek || 0; } } diff --git a/src/Structures/MiniGames/Arcade/HoleInTheWall.test.ts b/src/Structures/MiniGames/Arcade/HoleInTheWall.test.ts deleted file mode 100644 index ca3875a3a..000000000 --- a/src/Structures/MiniGames/Arcade/HoleInTheWall.test.ts +++ /dev/null @@ -1,16 +0,0 @@ -import HoleInTheWall from './HoleInTheWall.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('HoleInTheWall', () => { - const data = new HoleInTheWall({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(HoleInTheWall); - expectTypeOf(data).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.rounds).toBeDefined(); - expect(data.scoreRecordFinals).toBeDefined(); - expect(data.scoreRecordNormal).toBeDefined(); - expect(data.scoreRecordOverall).toBeDefined(); -}); diff --git a/src/Structures/MiniGames/Arcade/HoleInTheWall.ts b/src/Structures/MiniGames/Arcade/HoleInTheWall.ts index 99ec60e85..67fb26032 100644 --- a/src/Structures/MiniGames/Arcade/HoleInTheWall.ts +++ b/src/Structures/MiniGames/Arcade/HoleInTheWall.ts @@ -1,15 +1,17 @@ +import type { ArcadeHoleInTheWallColor } from '../../../Types/Player.ts'; + class HoleInTheWall { - wins: number; rounds: number; - scoreRecordFinals: number; - scoreRecordNormal: number; - scoreRecordOverall: number; + wins: number; + color: ArcadeHoleInTheWallColor; + recordF: number; + recordQ: number; constructor(data: Record) { - this.wins = data?.wins_hole_in_the_wall || 0; this.rounds = data?.rounds_hole_in_the_wall || 0; - this.scoreRecordFinals = data?.hitw_record_f || 0; - this.scoreRecordNormal = data?.hitw_record_q || 0; - this.scoreRecordOverall = this.scoreRecordFinals + this.scoreRecordNormal; + this.wins = data?.wins_hole_in_the_wall || 0; + this.color = data?.hitw_color || 'DEFAULT'; + this.recordF = data?.hitw_record_f || 0; + this.recordQ = data?.hitw_record_q || 0; } } diff --git a/src/Structures/MiniGames/Arcade/HypixelSays.test.ts b/src/Structures/MiniGames/Arcade/HypixelSays.test.ts deleted file mode 100644 index 74e05c667..000000000 --- a/src/Structures/MiniGames/Arcade/HypixelSays.test.ts +++ /dev/null @@ -1,21 +0,0 @@ -import HypixelSays from './HypixelSays.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('HypixelSays', () => { - const data = new HypixelSays({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(HypixelSays); - expectTypeOf(data).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.rounds).toBeDefined(); - expect(data.rounds).toBeGreaterThanOrEqual(0); - expectTypeOf(data.rounds).toEqualTypeOf(); - expect(data.roundWins).toBeDefined(); - expect(data.roundWins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.roundWins).toEqualTypeOf(); - expect(data.topScore).toBeDefined(); - expect(data.topScore).toBeGreaterThanOrEqual(0); - expectTypeOf(data.topScore).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/Arcade/HypixelSports.ts b/src/Structures/MiniGames/Arcade/HypixelSports.ts new file mode 100644 index 000000000..a78020b54 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/HypixelSports.ts @@ -0,0 +1,8 @@ +class HypixelSports { + wins: number; + constructor(data: Record) { + this.wins = data?.wins_hypixel_sports || 0; + } +} + +export default HypixelSports; diff --git a/src/Structures/MiniGames/Arcade/MiniWalls.test.ts b/src/Structures/MiniGames/Arcade/MiniWalls.test.ts deleted file mode 100644 index a2fb3b6c6..000000000 --- a/src/Structures/MiniGames/Arcade/MiniWalls.test.ts +++ /dev/null @@ -1,42 +0,0 @@ -import MiniWalls from './MiniWalls.js'; -import { expect, expectTypeOf, test } from 'vitest'; -import type { MiniWallsKits } from '../../../Types/Player.js'; - -test('MiniWalls', () => { - const data = new MiniWalls({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(MiniWalls); - expectTypeOf(data).toEqualTypeOf(); - expect(data.kit).toBeDefined(); - expectTypeOf(data.kit).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.kills).toBeDefined(); - expect(data.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.kills).toEqualTypeOf(); - expect(data.deaths).toBeDefined(); - expect(data.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.deaths).toEqualTypeOf(); - expect(data.KDR).toBeDefined(); - expect(data.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.KDR).toEqualTypeOf(); - expect(data.finalKills).toBeDefined(); - expect(data.finalKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.finalKills).toEqualTypeOf(); - expect(data.witherKills).toBeDefined(); - expect(data.witherKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.witherKills).toEqualTypeOf(); - expect(data.witherDamage).toBeDefined(); - expect(data.witherDamage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.witherDamage).toEqualTypeOf(); - expect(data.arrowsShot).toBeDefined(); - expect(data.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arrowsShot).toEqualTypeOf(); - expect(data.arrowsHit).toBeDefined(); - expect(data.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arrowsHit).toEqualTypeOf(); - expect(data.bowAccuracy).toBeDefined(); - expect(data.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowAccuracy).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/Arcade/MiniWalls.ts b/src/Structures/MiniGames/Arcade/MiniWalls.ts index 3ff6b559b..66b87802b 100644 --- a/src/Structures/MiniGames/Arcade/MiniWalls.ts +++ b/src/Structures/MiniGames/Arcade/MiniWalls.ts @@ -1,30 +1,39 @@ -import Divide from '../../../Utils/Divide.js'; -import type { MiniWallsKits } from '../../../Types/Player.js'; - class MiniWalls { - kit: MiniWallsKits | 'None'; - wins: number; - kills: number; + arrowsHit: number; + arrowsHitTourney0: number; + arrowsShot: number; + arrowsShotTourney0: number; deaths: number; - KDR: number; + deathsTourney0: number; finalKills: number; - witherKills: number; + finalKillsTourney0: number; + kills: number; + killsTourney0: number; + inventoryLayout: Record; + wins: number; + winsTourney0: number; witherDamage: number; - arrowsShot: number; - arrowsHit: number; - bowAccuracy: number; + witherDamageTourney0: number; + witherKills: number; + witherKillsTourney0: number; constructor(data: Record) { - this.kit = data?.miniwalls_activeKit || 'None'; - this.wins = data?.wins_mini_walls || 0; - this.kills = data?.kills_mini_walls || 0; + this.arrowsHit = data?.arrows_hit_mini_walls || 0; + this.arrowsHitTourney0 = data?.arrows_hit_tourney_mini_walls_0 || 0; + this.arrowsShot = data?.arrows_shot_mini_walls || 0; + this.arrowsShotTourney0 = data?.arrows_shot_tourney_mini_walls_0 || 0; this.deaths = data?.deaths_mini_walls || 0; - this.KDR = Divide(this.kills, this.deaths); + this.deathsTourney0 = data?.deaths_tourney_mini_walls_0 || 0; this.finalKills = data?.final_kills_mini_walls || 0; - this.witherKills = data?.wither_kills_mini_walls || 0; + this.finalKillsTourney0 = data?.final_kills_tourney_mini_walls_0 || 0; + this.kills = data?.kills_mini_walls || 0; + this.killsTourney0 = data?.kills_tourney_mini_walls_0 || 0; + this.inventoryLayout = data?.mini_walls_inventory_layout || {}; + this.wins = data?.wins_mini_walls || 0; + this.winsTourney0 = data?.wins_tourney_mini_walls_0 || 0; this.witherDamage = data?.wither_damage_mini_walls || 0; - this.arrowsShot = data?.arrows_shot_mini_walls || 0; - this.arrowsHit = data?.arrows_hit_mini_walls || 0; - this.bowAccuracy = Divide(this.arrowsHit, this.arrowsShot); + this.witherDamageTourney0 = data?.wither_damage_tourney_mini_walls_0 || 0; + this.witherKills = data?.wither_kills_mini_walls || 0; + this.witherKillsTourney0 = data?.wither_kills_tourney_mini_walls_0 || 0; } } diff --git a/src/Structures/MiniGames/Arcade/BountyHunters.ts b/src/Structures/MiniGames/Arcade/OneInTheQuiver.ts similarity index 75% rename from src/Structures/MiniGames/Arcade/BountyHunters.ts rename to src/Structures/MiniGames/Arcade/OneInTheQuiver.ts index 288642420..4715c0890 100644 --- a/src/Structures/MiniGames/Arcade/BountyHunters.ts +++ b/src/Structures/MiniGames/Arcade/OneInTheQuiver.ts @@ -1,22 +1,18 @@ -import Divide from '../../../Utils/Divide.js'; - -class BountyHunters { - wins: number; - kills: number; - deaths: number; - KDR: number; +class OneInTheQuiver { bountyKills: number; bowKills: number; + deaths: number; + kills: number; swordKills: number; + wins: number; constructor(data: Record) { - this.wins = data?.wins_oneinthequiver || 0; - this.kills = data?.kills_oneinthequiver || 0; - this.deaths = data?.deaths_oneinthequiver || 0; - this.KDR = Divide(this.kills, this.deaths); this.bountyKills = data?.bounty_kills_oneinthequiver || 0; this.bowKills = data?.bow_kills_oneinthequiver || 0; + this.deaths = data?.deaths_oneinthequiver || 0; + this.kills = data?.kills_oneinthequiver || 0; this.swordKills = data?.sword_kills_oneinthequiver || 0; + this.wins = data?.wins_oneinthequiver || 0; } } -export default BountyHunters; +export default OneInTheQuiver; diff --git a/src/Structures/MiniGames/Arcade/PartyGames.test.ts b/src/Structures/MiniGames/Arcade/PartyGames.test.ts deleted file mode 100644 index 58be5af56..000000000 --- a/src/Structures/MiniGames/Arcade/PartyGames.test.ts +++ /dev/null @@ -1,18 +0,0 @@ -import PartyGames from './PartyGames.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('PartyGames', () => { - const data = new PartyGames({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(PartyGames); - expectTypeOf(data).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.roundWins).toBeDefined(); - expect(data.roundWins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.roundWins).toEqualTypeOf(); - expect(data.stars).toBeDefined(); - expect(data.stars).toBeGreaterThanOrEqual(0); - expectTypeOf(data.stars).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/Arcade/PartyGames.ts b/src/Structures/MiniGames/Arcade/PartyGames.ts deleted file mode 100644 index e7eb419a9..000000000 --- a/src/Structures/MiniGames/Arcade/PartyGames.ts +++ /dev/null @@ -1,12 +0,0 @@ -class PartyGames { - wins: number; - roundWins: number; - stars: number; - constructor(data: Record) { - this.wins = data?.wins_party || 0; - this.roundWins = data?.round_wins_party || 0; - this.stars = data?.total_stars_party || 0; - } -} - -export default PartyGames; diff --git a/src/Structures/MiniGames/Arcade/PartyGames/LawnMoower.ts b/src/Structures/MiniGames/Arcade/PartyGames/LawnMoower.ts new file mode 100644 index 000000000..27981d6e3 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/PartyGames/LawnMoower.ts @@ -0,0 +1,11 @@ +import PartyGamesGame from './PartyGamesGame.ts'; + +class LawnMoower extends PartyGamesGame { + constructor(data: Record) { + super(data, 'lawn_moower'); + this.bestScore = data?.lawn_moower_mowed_best_score_party || 0; + this.totalScore = data?.lawn_moower_mowed_total_score_party || 0; + } +} + +export default LawnMoower; diff --git a/src/Structures/MiniGames/Arcade/PartyGames/PartyGames.ts b/src/Structures/MiniGames/Arcade/PartyGames/PartyGames.ts new file mode 100644 index 000000000..69c1ffe0b --- /dev/null +++ b/src/Structures/MiniGames/Arcade/PartyGames/PartyGames.ts @@ -0,0 +1,62 @@ +import LawnMoower from './LawnMoower.ts'; +import PartyGamesGame from './PartyGamesGame.ts'; +import RPG16 from './RPG16.ts'; + +class PartyGames { + animalSlaughter: PartyGamesGame; + anvilSpleef: PartyGamesGame; + avalanche: PartyGamesGame; + bombardment: PartyGamesGame; + cannonPainting: PartyGamesGame; + chickenRings: PartyGamesGame; + dive: PartyGamesGame; + fireLeapers: PartyGamesGame; + frozenFloor: PartyGamesGame; + highGround: PartyGamesGame; + hoeHoeHoe: PartyGamesGame; + jigsawRush: PartyGamesGame; + jungleJump: PartyGamesGame; + labEscape: PartyGamesGame; + lawnMoower: LawnMoower; + minecartRacing: PartyGamesGame; + pigFishing: PartyGamesGame; + pigJousting: PartyGamesGame; + rpg16: RPG16; + shootingRange: PartyGamesGame; + spiderMaze: PartyGamesGame; + superSheep: PartyGamesGame; + theFloorIsLava: PartyGamesGame; + trampolinio: PartyGamesGame; + volcano: PartyGamesGame; + workshop: PartyGamesGame; + constructor(data: Record) { + this.animalSlaughter = new PartyGamesGame(data, 'animal_slaughter'); + this.anvilSpleef = new PartyGamesGame(data, 'anvil_spleef'); + this.avalanche = new PartyGamesGame(data, 'avalanche'); + this.bombardment = new PartyGamesGame(data, 'bombardment'); + this.cannonPainting = new PartyGamesGame(data, 'cannon_painting'); + this.chickenRings = new PartyGamesGame(data, 'chicken_rings'); + this.dive = new PartyGamesGame(data, 'dive'); + this.fireLeapers = new PartyGamesGame(data, 'fire_leapers'); + this.frozenFloor = new PartyGamesGame(data, 'frozen_floor'); + this.highGround = new PartyGamesGame(data, 'high_ground'); + this.hoeHoeHoe = new PartyGamesGame(data, 'hoe_hoe_hoe'); + this.jigsawRush = new PartyGamesGame(data, 'jigsaw_rush'); + this.jungleJump = new PartyGamesGame(data, 'jungle_jump'); + this.labEscape = new PartyGamesGame(data, 'lab_escape'); + this.lawnMoower = new LawnMoower(data); + this.minecartRacing = new PartyGamesGame(data, 'minecart_racing'); + this.pigFishing = new PartyGamesGame(data, 'pig_fishing'); + this.pigJousting = new PartyGamesGame(data, 'pig_jousting'); + this.rpg16 = new RPG16(data); + this.shootingRange = new PartyGamesGame(data, 'shooting_range'); + this.spiderMaze = new PartyGamesGame(data, 'spider_maze'); + this.superSheep = new PartyGamesGame(data, 'super_sheep'); + this.theFloorIsLava = new PartyGamesGame(data, 'the_floor_is_lava'); + this.trampolinio = new PartyGamesGame(data, 'trampolinio'); + this.volcano = new PartyGamesGame(data, 'volcano'); + this.workshop = new PartyGamesGame(data, 'workshop'); + } +} + +export default PartyGames; diff --git a/src/Structures/MiniGames/Arcade/PartyGames/PartyGamesGame.ts b/src/Structures/MiniGames/Arcade/PartyGames/PartyGamesGame.ts new file mode 100644 index 000000000..4ecb7525f --- /dev/null +++ b/src/Structures/MiniGames/Arcade/PartyGames/PartyGamesGame.ts @@ -0,0 +1,18 @@ +import type { ArcadePartyGamesGame } from '../../../../Types/Player.ts'; + +class PartyGamesGame { + bestScore: number; + bestTime: number; + kills: number; + roundWins: number; + totalScore: number; + constructor(data: Record, game: ArcadePartyGamesGame) { + this.bestScore = data?.[`${game}_best_score_party`] || 0; + this.bestTime = data?.[`${game}_best_time_party`] || 0; + this.kills = data?.[`${game}_kills_party`] || 0; + this.roundWins = data?.[`${game}_round_wins_party`] || 0; + this.totalScore = data?.[`${game}_total_score_party`] || 0; + } +} + +export default PartyGamesGame; diff --git a/src/Structures/MiniGames/Arcade/PartyGames/RPG16.ts b/src/Structures/MiniGames/Arcade/PartyGames/RPG16.ts new file mode 100644 index 000000000..b17133e78 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/PartyGames/RPG16.ts @@ -0,0 +1,10 @@ +import PartyGamesGame from './PartyGamesGame.ts'; + +class RPG16 extends PartyGamesGame { + constructor(data: Record) { + super(data, 'rpg_16'); + this.bestScore = data?.rpg_16_kills_best_score_party || 0; + } +} + +export default RPG16; diff --git a/src/Structures/MiniGames/Arcade/PartyPooper.test.ts b/src/Structures/MiniGames/Arcade/PartyPooper.test.ts deleted file mode 100644 index 77c0c285d..000000000 --- a/src/Structures/MiniGames/Arcade/PartyPooper.test.ts +++ /dev/null @@ -1,18 +0,0 @@ -import PartyPooper from './PartyPooper.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('PartyPooper', () => { - const data = new PartyPooper({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(PartyPooper); - expectTypeOf(data).toEqualTypeOf(); - expect(data.winsAsSeeker).toBeDefined(); - expect(data.winsAsSeeker).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winsAsSeeker).toEqualTypeOf(); - expect(data.winsAsHider).toBeDefined(); - expect(data.winsAsHider).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winsAsHider).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/Arcade/PartyPooper.ts b/src/Structures/MiniGames/Arcade/PartyPooper.ts deleted file mode 100644 index 6717dcc15..000000000 --- a/src/Structures/MiniGames/Arcade/PartyPooper.ts +++ /dev/null @@ -1,12 +0,0 @@ -class PartyPooper { - winsAsSeeker: number; - winsAsHider: number; - wins: number; - constructor(data: Record) { - this.winsAsSeeker = data?.party_pooper_seeker_wins_hide_and_seek || 0; - this.winsAsHider = data?.party_pooper_hider_wins_hide_and_seek || 0; - this.wins = this.winsAsSeeker + this.winsAsHider; - } -} - -export default PartyPooper; diff --git a/src/Structures/MiniGames/Arcade/PixelParty.test.ts b/src/Structures/MiniGames/Arcade/PixelParty.test.ts deleted file mode 100644 index 240a5b05a..000000000 --- a/src/Structures/MiniGames/Arcade/PixelParty.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -import PixelParty from './PixelParty.js'; -import PixelPartyGameMode from './PixelPartyGameMode.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('PixelParty', () => { - const data = new PixelParty({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(PixelParty); - expectTypeOf(data).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.gamesPlayed).toBeDefined(); - expect(data.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.gamesPlayed).toEqualTypeOf(); - expect(data.losses).toBeDefined(); - expect(data.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.losses).toEqualTypeOf(); - expect(data.WLR).toBeDefined(); - expect(data.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.WLR).toEqualTypeOf(); - expect(data.roundsPlayed).toBeDefined(); - expect(data.roundsPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.roundsPlayed).toEqualTypeOf(); - expect(data.powerUpsCollected).toBeDefined(); - expect(data.powerUpsCollected).toBeGreaterThanOrEqual(0); - expectTypeOf(data.powerUpsCollected).toEqualTypeOf(); - expect(data.normal).toBeDefined(); - expectTypeOf(data.normal).toEqualTypeOf(); - expect(data.hyper).toBeDefined(); - expectTypeOf(data.hyper).toEqualTypeOf(); - expect(data.highestRound).toBeDefined(); - expect(data.highestRound).toBeGreaterThanOrEqual(0); - expectTypeOf(data.highestRound).toEqualTypeOf(); - expect(data.musicVolume).toBeDefined(); - expect(data.musicVolume).toBeGreaterThanOrEqual(0); - expectTypeOf(data.musicVolume).toEqualTypeOf(); - expect(data.colorBlind).toBeDefined(); - expectTypeOf(data.colorBlind).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/Arcade/PixelParty.ts b/src/Structures/MiniGames/Arcade/PixelParty.ts deleted file mode 100644 index 4424176c2..000000000 --- a/src/Structures/MiniGames/Arcade/PixelParty.ts +++ /dev/null @@ -1,31 +0,0 @@ -import Divide from '../../../Utils/Divide.js'; -import PixelPartyGameMode from './PixelPartyGameMode.js'; - -class PixelParty { - wins: number; - gamesPlayed: number; - losses: number; - WLR: number; - roundsPlayed: number; - powerUpsCollected: number; - normal: PixelPartyGameMode; - hyper: PixelPartyGameMode; - highestRound: number; - musicVolume: number; - colorBlind: object; - constructor(data: Record) { - this.wins = data?.pixel_party?.wins || 0; - this.gamesPlayed = data?.pixel_party?.games_played || 0; - this.losses = this.gamesPlayed - this.wins; - this.WLR = Divide(this.wins, this.losses); - this.roundsPlayed = data?.pixel_party?.rounds_completed || 0; - this.powerUpsCollected = data?.pixel_party?.power_ups_collected || 0; - this.normal = new PixelPartyGameMode(data?.pixel_party, 'normal'); - this.hyper = new PixelPartyGameMode(data?.pixel_party, 'hyper'); - this.highestRound = data?.pixel_party?.highest_round || 0; - this.musicVolume = data?.pixel_party_music_volume || 0; - this.colorBlind = data?.pixelparty || {}; - } -} - -export default PixelParty; diff --git a/src/Structures/MiniGames/Arcade/PixelPartyGameMode.test.ts b/src/Structures/MiniGames/Arcade/PixelPartyGameMode.test.ts deleted file mode 100644 index d6e6f5ca6..000000000 --- a/src/Structures/MiniGames/Arcade/PixelPartyGameMode.test.ts +++ /dev/null @@ -1,27 +0,0 @@ -import PixelPartyGameMode from './PixelPartyGameMode.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('PixelPartyGameMode', () => { - const data = new PixelPartyGameMode({ stats: 'meow' }, 'hyper'); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(PixelPartyGameMode); - expectTypeOf(data).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.gamesPlayed).toBeDefined(); - expect(data.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.gamesPlayed).toEqualTypeOf(); - expect(data.losses).toBeDefined(); - expect(data.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.losses).toEqualTypeOf(); - expect(data.WLR).toBeDefined(); - expect(data.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.WLR).toEqualTypeOf(); - expect(data.roundsPlayed).toBeDefined(); - expect(data.roundsPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.roundsPlayed).toEqualTypeOf(); - expect(data.powerUpsCollected).toBeDefined(); - expect(data.powerUpsCollected).toBeGreaterThanOrEqual(0); - expectTypeOf(data.powerUpsCollected).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/Arcade/PixelPartyGameMode.ts b/src/Structures/MiniGames/Arcade/PixelPartyGameMode.ts deleted file mode 100644 index b94c6282b..000000000 --- a/src/Structures/MiniGames/Arcade/PixelPartyGameMode.ts +++ /dev/null @@ -1,21 +0,0 @@ -import Divide from '../../../Utils/Divide.js'; -import type { PixelPartyGameModes } from '../../../Types/Player.js'; - -class PixelPartyGameMode { - wins: number; - gamesPlayed: number; - losses: number; - WLR: number; - roundsPlayed: number; - powerUpsCollected: number; - constructor(data: Record, modeName: PixelPartyGameModes) { - this.wins = data?.[`wins_${modeName}`] || 0; - this.gamesPlayed = data?.[`games_played_${modeName}`] || 0; - this.losses = this.gamesPlayed - this.wins; - this.WLR = Divide(this.wins, this.losses); - this.roundsPlayed = data?.[`rounds_completed_${modeName}`] || 0; - this.powerUpsCollected = data?.[`power_ups_collected_${modeName}`] || 0; - } -} - -export default PixelPartyGameMode; diff --git a/src/Structures/MiniGames/Arcade/PropHunt.test.ts b/src/Structures/MiniGames/Arcade/PropHunt.test.ts deleted file mode 100644 index ede0cee74..000000000 --- a/src/Structures/MiniGames/Arcade/PropHunt.test.ts +++ /dev/null @@ -1,18 +0,0 @@ -import PropHunt from './PropHunt.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('PropHunt', () => { - const data = new PropHunt({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(PropHunt); - expectTypeOf(data).toEqualTypeOf(); - expect(data.winsAsSeeker).toBeDefined(); - expect(data.winsAsSeeker).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winsAsSeeker).toEqualTypeOf(); - expect(data.winsAsHider).toBeDefined(); - expect(data.winsAsHider).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winsAsHider).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/Arcade/PropHunt.ts b/src/Structures/MiniGames/Arcade/PropHunt.ts deleted file mode 100644 index 7181e7935..000000000 --- a/src/Structures/MiniGames/Arcade/PropHunt.ts +++ /dev/null @@ -1,12 +0,0 @@ -class PropHunt { - winsAsSeeker: number; - winsAsHider: number; - wins: number; - constructor(data: Record) { - this.winsAsSeeker = data?.prop_hunt_seeker_wins_hide_and_seek || 0; - this.winsAsHider = data?.prop_hunt_hider_wins_hide_and_seek || 0; - this.wins = this.winsAsSeeker + this.winsAsHider; - } -} - -export default PropHunt; diff --git a/src/Structures/MiniGames/Arcade/SantaSays.ts b/src/Structures/MiniGames/Arcade/SantaSays.ts new file mode 100644 index 000000000..1639baf28 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/SantaSays.ts @@ -0,0 +1,14 @@ +class SantaSays { + roundWins: number; + rounds: number; + topScore: number; + wins: number; + constructor(data: Record) { + this.roundWins = data?.round_wins_santa_says || 0; + this.rounds = data?.rounds_santa_says || 0; + this.topScore = data?.top_score_santa_says || 0; + this.wins = data?.wins_santa_says || 0; + } +} + +export default SantaSays; diff --git a/src/Structures/MiniGames/Arcade/SantaSimulator.ts b/src/Structures/MiniGames/Arcade/SantaSimulator.ts new file mode 100644 index 000000000..d4d93abac --- /dev/null +++ b/src/Structures/MiniGames/Arcade/SantaSimulator.ts @@ -0,0 +1,12 @@ +class SantaSimulator { + delivered: number; + spotted: number; + wins: number; + constructor(data: Record) { + this.delivered = data?.delivered_santa_simulator || 0; + this.spotted = data?.spotted_santa_simulator || 0; + this.wins = data?.wins_santa_simulator || 0; + } +} + +export default SantaSimulator; diff --git a/src/Structures/MiniGames/Arcade/ScubaSimulator.ts b/src/Structures/MiniGames/Arcade/ScubaSimulator.ts new file mode 100644 index 000000000..28a23944e --- /dev/null +++ b/src/Structures/MiniGames/Arcade/ScubaSimulator.ts @@ -0,0 +1,12 @@ +class ScubaSimulator { + itemsFound: number; + totalPoints: number; + wins: number; + constructor(data: Record) { + this.itemsFound = data?.items_found_scuba_simulator || 0; + this.totalPoints = data?.total_points_scuba_simulator || 0; + this.wins = data?.wins_scuba_simulator || 0; + } +} + +export default ScubaSimulator; diff --git a/src/Structures/MiniGames/Arcade/HypixelSays.ts b/src/Structures/MiniGames/Arcade/SimonSays.ts similarity index 87% rename from src/Structures/MiniGames/Arcade/HypixelSays.ts rename to src/Structures/MiniGames/Arcade/SimonSays.ts index 10ce896c8..ef2216e18 100644 --- a/src/Structures/MiniGames/Arcade/HypixelSays.ts +++ b/src/Structures/MiniGames/Arcade/SimonSays.ts @@ -1,14 +1,14 @@ -class HypixelSays { - wins: number; - rounds: number; +class SimonSays { roundWins: number; + rounds: number; topScore: number; + wins: number; constructor(data: Record) { - this.wins = data?.wins_simon_says || 0; - this.rounds = data?.rounds_simon_says || 0; this.roundWins = data?.round_wins_simon_says || 0; + this.rounds = data?.rounds_simon_says || 0; this.topScore = data?.top_score_simon_says || 0; + this.wins = data?.wins_simon_says || 0; } } -export default HypixelSays; +export default SimonSays; diff --git a/src/Structures/MiniGames/Arcade/Football.ts b/src/Structures/MiniGames/Arcade/Soccer.ts similarity index 65% rename from src/Structures/MiniGames/Arcade/Football.ts rename to src/Structures/MiniGames/Arcade/Soccer.ts index 17016019b..8051a91f5 100644 --- a/src/Structures/MiniGames/Arcade/Football.ts +++ b/src/Structures/MiniGames/Arcade/Soccer.ts @@ -1,14 +1,14 @@ -class Football { - wins: number; +class Soccer { goals: number; kicks: number; - powerKicks: number; + powerkicks: number; + wins: number; constructor(data: Record) { - this.wins = data?.wins_soccer || 0; this.goals = data?.goals_soccer || 0; this.kicks = data?.kicks_soccer || 0; - this.powerKicks = data?.powerkicks_soccer || 0; + this.powerkicks = data?.powerkicks_soccer || 0; + this.wins = data?.wins_soccer || 0; } } -export default Football; +export default Soccer; diff --git a/src/Structures/MiniGames/Arcade/ThrowOut.test.ts b/src/Structures/MiniGames/Arcade/ThrowOut.test.ts deleted file mode 100644 index 8660e3d56..000000000 --- a/src/Structures/MiniGames/Arcade/ThrowOut.test.ts +++ /dev/null @@ -1,21 +0,0 @@ -import ThrowOut from './ThrowOut.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('ThrowOut', () => { - const data = new ThrowOut({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(ThrowOut); - expectTypeOf(data).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.kills).toBeDefined(); - expect(data.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.kills).toEqualTypeOf(); - expect(data.deaths).toBeDefined(); - expect(data.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.deaths).toEqualTypeOf(); - expect(data.KDR).toBeDefined(); - expect(data.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.KDR).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/Arcade/ThrowOut.ts b/src/Structures/MiniGames/Arcade/ThrowOut.ts index fa893fc44..728b369f0 100644 --- a/src/Structures/MiniGames/Arcade/ThrowOut.ts +++ b/src/Structures/MiniGames/Arcade/ThrowOut.ts @@ -1,15 +1,15 @@ -import Divide from '../../../Utils/Divide.js'; +import type { ArcadeThrowOutDisguise } from '../../../Types/Player.ts'; class ThrowOut { - wins: number; - kills: number; deaths: number; - KDR: number; + kills: number; + wins: number; + disguise: ArcadeThrowOutDisguise | 'UNKNOWN'; constructor(data: Record) { - this.wins = data?.wins_throw_out || 0; - this.kills = data?.kills_throw_out || 0; this.deaths = data?.deaths_throw_out || 0; - this.KDR = Divide(this.kills, this.deaths); + this.kills = data?.kills_throw_out || 0; + this.wins = data?.wins_throw_out || 0; + this.disguise = data?.throwout_disguise || 'UNKNOWN'; } } diff --git a/src/Structures/MiniGames/Arcade/WoolHunt.ts b/src/Structures/MiniGames/Arcade/WoolHunt.ts new file mode 100644 index 000000000..bcc2943b3 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/WoolHunt.ts @@ -0,0 +1,52 @@ +class WoolHunt { + assists: number; + deaths: number; + deathsToWoolholder: number; + deathsWithWool: number; + experiencedDraws: number; + experiencedLosses: number; + experiencedWins: number; + fastestWin: number; + fastestWoolCapture: number; + goldEarned: number; + goldSpent: number; + inventorylayout: Record; + kills: number; + killsOnWoolholder: number; + killsWithWool: number; + longestGame: number; + mostGoldEarned: number; + mostKillsAndAssists: number; + participatedDraws: number; + participatedLosses: number; + participatedWins: number; + woolsCaptured: number; + woolsStolen: number; + constructor(data: Record) { + this.assists = data?.woolhunt_assists || 0; + this.deaths = data?.woolhunt_deaths || 0; + this.deathsToWoolholder = data?.woolhunt_deaths_to_woolholder || 0; + this.deathsWithWool = data?.woolhunt_deaths_with_wool || 0; + this.experiencedDraws = data?.woolhunt_experienced_draws || 0; + this.experiencedLosses = data?.woolhunt_experienced_losses || 0; + this.experiencedWins = data?.woolhunt_experienced_wins || 0; + this.fastestWin = data?.woolhunt_fastest_win || 0; + this.fastestWoolCapture = data?.woolhunt_fastest_wool_capture || 0; + this.goldEarned = data?.woolhunt_gold_earned || 0; + this.goldSpent = data?.woolhunt_gold_spent || 0; + this.inventorylayout = data?.woolhunt_inventorylayout || {}; + this.kills = data?.woolhunt_kills || 0; + this.killsOnWoolholder = data?.woolhunt_kills_on_woolholder || 0; + this.killsWithWool = data?.woolhunt_kills_with_wool || 0; + this.longestGame = data?.woolhunt_longest_game || 0; + this.mostGoldEarned = data?.woolhunt_most_gold_earned || 0; + this.mostKillsAndAssists = data?.woolhunt_most_kills_and_assists || 0; + this.participatedDraws = data?.woolhunt_participated_draws || 0; + this.participatedLosses = data?.woolhunt_participated_losses || 0; + this.participatedWins = data?.woolhunt_participated_wins || 0; + this.woolsCaptured = data?.woolhunt_wools_captured || 0; + this.woolsStolen = data?.woolhunt_wools_stolen || 0; + } +} + +export default WoolHunt; diff --git a/src/Structures/MiniGames/Arcade/Zombies.test.ts b/src/Structures/MiniGames/Arcade/Zombies.test.ts deleted file mode 100644 index 97dd3a00a..000000000 --- a/src/Structures/MiniGames/Arcade/Zombies.test.ts +++ /dev/null @@ -1,37 +0,0 @@ -import Zombies from './Zombies.js'; -import ZombiesStats from './ZombiesStats.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('Zombies', () => { - const data = new Zombies({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(Zombies); - expectTypeOf(data).toEqualTypeOf(); - expect(data.overall).toBeDefined(); - expectTypeOf(data.overall).toEqualTypeOf(); - expect(data.deadEnd).toBeDefined(); - expectTypeOf(data.deadEnd).toEqualTypeOf(); - expect(data.badBlood).toBeDefined(); - expectTypeOf(data.badBlood).toEqualTypeOf(); - expect(data.alienArcadium).toBeDefined(); - expectTypeOf(data.alienArcadium).toEqualTypeOf(); - expect(data.prison).toBeDefined(); - expectTypeOf(data.prison).toEqualTypeOf(); - expect(data.killsByZombie).toBeDefined(); - expectTypeOf(data.killsByZombie).toEqualTypeOf>(); - expect(data.bulletsHit).toBeDefined(); - expect(data.bulletsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bulletsHit).toEqualTypeOf(); - expect(data.bulletsShot).toBeDefined(); - expect(data.bulletsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bulletsShot).toEqualTypeOf(); - expect(data.gunAccuracy).toBeDefined(); - expect(data.gunAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.gunAccuracy).toEqualTypeOf(); - expect(data.headShots).toBeDefined(); - expect(data.headShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.headShots).toEqualTypeOf(); - expect(data.headShotAccuracy).toBeDefined(); - expect(data.headShotAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.headShotAccuracy).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/Arcade/Zombies.ts b/src/Structures/MiniGames/Arcade/Zombies.ts deleted file mode 100644 index 01bd92d05..000000000 --- a/src/Structures/MiniGames/Arcade/Zombies.ts +++ /dev/null @@ -1,39 +0,0 @@ -import Divide from '../../../Utils/Divide.js'; -import ZombiesStats from './ZombiesStats.js'; -import { RemoveSnakeCaseString } from '../../../Utils/RemoveSnakeCase.js'; - -class Zombies { - overall: ZombiesStats; - deadEnd: ZombiesStats; - badBlood: ZombiesStats; - alienArcadium: ZombiesStats; - prison: ZombiesStats; - killsByZombie: Record; - bulletsHit: number; - bulletsShot: number; - gunAccuracy: number; - headShots: number; - headShotAccuracy: number; - constructor(data: Record) { - this.overall = new ZombiesStats(data); - this.deadEnd = new ZombiesStats(data, 'deadend'); - this.badBlood = new ZombiesStats(data, 'badblood'); - this.alienArcadium = new ZombiesStats(data, 'alienarcadium'); - this.prison = new ZombiesStats(data, 'prison'); - this.killsByZombie = this.parseZombiesKills(data); - this.bulletsHit = data?.bullets_hit_zombies || 0; - this.bulletsShot = data?.bullets_shot_zombies || 0; - this.gunAccuracy = Divide(this.bulletsHit, this.bulletsShot); - this.headShots = data?.headshots_zombies || 0; - this.headShotAccuracy = Divide(this.headShots, this.bulletsShot); - } - private parseZombiesKills(data: Record): Record { - const matches = Array.from(Object.keys(data)) - .map((x) => x.match(/^([A-Za-z]+)_zombie_kills_zombies$/)) - .filter((x) => x); - // From entries might be broken - return Object.fromEntries(matches.map((x: any) => [RemoveSnakeCaseString(x[1]), data[x[0]]])); - } -} - -export default Zombies; diff --git a/src/Structures/MiniGames/Arcade/Zombies/Zombies.ts b/src/Structures/MiniGames/Arcade/Zombies/Zombies.ts new file mode 100644 index 000000000..bd4570426 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/Zombies/Zombies.ts @@ -0,0 +1,218 @@ +class Zombies { + basicZombieKills: number; + basketballZombieKills: number; + bestRoundZombies: number; + blazeZombieKills: number; + blobZombieKills: number; + bombZombieKills: number; + broodmotherZombieKills: number; + bulletsHit: number; + bulletsShot: number; + caveSpiderZombieKills: number; + chargedCreeperZombieKills: number; + chglugluZombieKills: number; + clownZombieKills: number; + corruptedPigmanZombieKills: number; + creeperZombieKills: number; + daBombZombieKills: number; + deaths: number; + doorsOpened: number; + drownedZombieKills: number; + empoweredZombieKills: number; + enderZombieKills: number; + endermiteZombieKills: number; + familyDaughterZombieKills: number; + familyFatherZombieKills: number; + familyMotherZombieKills: number; + familyTwinBlueZombieKills: number; + familyTwinRedZombieKills: number; + fastestTime10: number; + fastestTime20: number; + fastestTime30: number; + fireLordZombieKills: number; + fireZombieKills: number; + frostZombieZombieKills: number; + ghastZombieKills: number; + giantRainbowZombieKills: number; + giantZombieKills: number; + guardZombieZombieKills: number; + guardianZombieKills: number; + headlessPigmanZombieKills: number; + headshots: number; + herobrineMinionZombieKills: number; + herobrineZombieKills: number; + humanZombieKills: number; + infernoPigmanZombieKills: number; + infernoZombieKills: number; + invisibleZombieKills: number; + ironGolemZombieKills: number; + kingDrownedZombieKills: number; + kingSlimeZombieKills: number; + knightDrownedZombieKills: number; + magmaCubeZombieKills: number; + magmaZombieKills: number; + mcdonaldsPigmanZombieKills: number; + mcdonaldsZombieZombieKills: number; + megaBlobZombieKills: number; + megaMagmaZombieKills: number; + moltenZombieKills: number; + murderPigmanZombieKills: number; + murderZombieZombieKills: number; + nurseZombieZombieKills: number; + pigZombieZombieKills: number; + playersRevived: number; + prisonerPigman2CellZombieKills: number; + prisonerPigman2ZombieKills: number; + prisonerPigmanCellZombieKills: number; + prisonerPigmanZombieKills: number; + prisonerSkeletonZombieKills: number; + prisonerZombieAngry2ZombieKills: number; + prisonerZombieAngry3ZombieKills: number; + prisonerZombieAngryZombieKills: number; + prisonerZombieCellZombieKills: number; + prisonerZombieKills: number; + rainbowZombieKills: number; + scubaZombieKills: number; + sentinelZombieKills: number; + shadySkeletonZombieKills: number; + silverfishZombieKills: number; + skelefishZombieKills: number; + skeletonZombieKills: number; + slimeZombieKills: number; + slimeZombieZombieKills: number; + spaceBlasterZombieKills: number; + spaceGruntZombieKills: number; + tankDrownedZombieKills: number; + tankZombieZombieKills: number; + theOldOneZombieKills: number; + theWardenZombieKills: number; + timesKnockedDown: number; + tntBabyZombieKills: number; + tntZombieKills: number; + totalRoundsSurvived: number; + werewolfZombieKills: number; + windowsRepaired: number; + wins: number; + witchZombieKills: number; + witherSkeletonZombieKills: number; + witherZombieKills: number; + witherZombieZombieKills: number; + wolfDrownedZombieKills: number; + wolfPetZombieKills: number; + wolfZombieKills: number; + worldEnderZombieKills: number; + wormSmallZombieKills: number; + wormZombieKills: number; + zombieKills: number; + hideTutorials: boolean; + constructor(data: Record) { + this.basicZombieKills = data?.basic_zombie_kills_zombies || 0; + this.basketballZombieKills = data?.basketball_zombie_zombie_kills_zombies || 0; + this.bestRoundZombies = data?.best_round_zombies || 0; + this.blazeZombieKills = data?.blaze_zombie_kills_zombies || 0; + this.blobZombieKills = data?.blob_zombie_kills_zombies || 0; + this.bombZombieKills = data?.bomb_zombie_kills_zombies || 0; + this.broodmotherZombieKills = data?.broodmother_zombie_kills_zombies || 0; + this.bulletsHit = data?.bullets_hit_zombies || 0; + this.bulletsShot = data?.bullets_shot_zombies || 0; + this.caveSpiderZombieKills = data?.cave_spider_zombie_kills_zombies || 0; + this.chargedCreeperZombieKills = data?.charged_creeper_zombie_kills_zombies || 0; + this.chglugluZombieKills = data?.chgluglu_zombie_kills_zombies || 0; + this.clownZombieKills = data?.clown_zombie_kills_zombies || 0; + this.corruptedPigmanZombieKills = data?.corrupted_pigman_zombie_kills_zombies || 0; + this.creeperZombieKills = data?.creeper_zombie_kills_zombies || 0; + this.daBombZombieKills = data?.da_bomb_zombie_kills_zombies || 0; + this.deaths = data?.deaths_zombies || 0; + this.doorsOpened = data?.doors_opened_zombies || 0; + this.drownedZombieKills = data?.drowned_zombie_kills_zombies || 0; + this.empoweredZombieKills = data?.empowered_zombie_kills_zombies || 0; + this.enderZombieKills = data?.ender_zombie_kills_zombies || 0; + this.endermiteZombieKills = data?.endermite_zombie_kills_zombies || 0; + this.familyDaughterZombieKills = data?.family_daughter_zombie_kills_zombies || 0; + this.familyFatherZombieKills = data?.family_father_zombie_kills_zombies || 0; + this.familyMotherZombieKills = data?.family_mother_zombie_kills_zombies || 0; + this.familyTwinBlueZombieKills = data?.family_twin_blue_zombie_kills_zombies || 0; + this.familyTwinRedZombieKills = data?.family_twin_red_zombie_kills_zombies || 0; + this.fastestTime10 = data?.fastest_time_10_zombies || 0; + this.fastestTime20 = data?.fastest_time_20_zombies || 0; + this.fastestTime30 = data?.fastest_time_30_zombies || 0; + this.fireLordZombieKills = data?.fire_lord_zombie_kills_zombies || 0; + this.fireZombieKills = data?.fire_zombie_kills_zombies || 0; + this.frostZombieZombieKills = data?.frost_zombie_zombie_kills_zombies || 0; + this.ghastZombieKills = data?.ghast_zombie_kills_zombies || 0; + this.giantRainbowZombieKills = data?.giant_rainbow_zombie_kills_zombies || 0; + this.giantZombieKills = data?.giant_zombie_kills_zombies || 0; + this.guardZombieZombieKills = data?.guard_zombie_zombie_kills_zombies || 0; + this.guardianZombieKills = data?.guardian_zombie_kills_zombies || 0; + this.headlessPigmanZombieKills = data?.headless_pigman_zombie_kills_zombies || 0; + this.headshots = data?.headshots_zombies || 0; + this.herobrineMinionZombieKills = data?.herobrine_minion_zombie_kills_zombies || 0; + this.herobrineZombieKills = data?.herobrine_zombie_kills_zombies || 0; + this.humanZombieKills = data?.human_zombie_zombie_kills_zombies || 0; + this.infernoPigmanZombieKills = data?.inferno_pigman_zombie_kills_zombies || 0; + this.infernoZombieKills = data?.inferno_zombie_kills_zombies || 0; + this.invisibleZombieKills = data?.invisible_zombie_kills_zombies || 0; + this.ironGolemZombieKills = data?.iron_golem_zombie_kills_zombies || 0; + this.kingDrownedZombieKills = data?.king_drowned_zombie_kills_zombies || 0; + this.kingSlimeZombieKills = data?.king_slime_zombie_kills_zombies || 0; + this.knightDrownedZombieKills = data?.knight_drowned_zombie_kills_zombies || 0; + this.magmaCubeZombieKills = data?.magma_cube_zombie_kills_zombies || 0; + this.magmaZombieKills = data?.magma_zombie_kills_zombies || 0; + this.mcdonaldsPigmanZombieKills = data?.mcdonalds_pigman_zombie_kills_zombies || 0; + this.mcdonaldsZombieZombieKills = data?.mcdonalds_zombie_zombie_kills_zombies || 0; + this.megaBlobZombieKills = data?.mega_blob_zombie_kills_zombies || 0; + this.megaMagmaZombieKills = data?.mega_magma_zombie_kills_zombies || 0; + this.moltenZombieKills = data?.molten_zombie_kills_zombies || 0; + this.murderPigmanZombieKills = data?.murder_pigman_zombie_kills_zombies || 0; + this.murderZombieZombieKills = data?.murder_zombie_zombie_kills_zombies || 0; + this.nurseZombieZombieKills = data?.nurse_zombie_zombie_kills_zombies || 0; + this.pigZombieZombieKills = data?.pig_zombie_zombie_kills_zombies || 0; + this.playersRevived = data?.players_revived_zombies || 0; + this.prisonerPigman2CellZombieKills = data?.prisoner_pigman_2_cell_zombie_kills_zombies || 0; + this.prisonerPigman2ZombieKills = data?.prisoner_pigman_2_zombie_kills_zombies || 0; + this.prisonerPigmanCellZombieKills = data?.prisoner_pigman_cell_zombie_kills_zombies || 0; + this.prisonerPigmanZombieKills = data?.prisoner_pigman_zombie_kills_zombies || 0; + this.prisonerSkeletonZombieKills = data?.prisoner_skeleton_zombie_kills_zombies || 0; + this.prisonerZombieAngry2ZombieKills = data?.prisoner_zombie_angry_2_zombie_kills_zombies || 0; + this.prisonerZombieAngry3ZombieKills = data?.prisoner_zombie_angry_3_zombie_kills_zombies || 0; + this.prisonerZombieAngryZombieKills = data?.prisoner_zombie_angry_zombie_kills_zombies || 0; + this.prisonerZombieCellZombieKills = data?.prisoner_zombie_cell_zombie_kills_zombies || 0; + this.prisonerZombieKills = data?.prisoner_zombie_zombie_kills_zombies || 0; + this.rainbowZombieKills = data?.rainbow_zombie_kills_zombies || 0; + this.scubaZombieKills = data?.scuba_zombie_zombie_kills_zombies || 0; + this.sentinelZombieKills = data?.sentinel_zombie_kills_zombies || 0; + this.shadySkeletonZombieKills = data?.shady_skeleton_zombie_kills_zombies || 0; + this.silverfishZombieKills = data?.silverfish_zombie_kills_zombies || 0; + this.skelefishZombieKills = data?.skelefish_zombie_kills_zombies || 0; + this.skeletonZombieKills = data?.skeleton_zombie_kills_zombies || 0; + this.slimeZombieKills = data?.slime_zombie_kills_zombies || 0; + this.slimeZombieZombieKills = data?.slime_zombie_zombie_kills_zombies || 0; + this.spaceBlasterZombieKills = data?.space_blaster_zombie_kills_zombies || 0; + this.spaceGruntZombieKills = data?.space_grunt_zombie_kills_zombies || 0; + this.tankDrownedZombieKills = data?.tank_drowned_zombie_kills_zombies || 0; + this.tankZombieZombieKills = data?.tank_zombie_zombie_kills_zombies || 0; + this.theOldOneZombieKills = data?.the_old_one_zombie_kills_zombies || 0; + this.theWardenZombieKills = data?.the_warden_zombie_kills_zombies || 0; + this.timesKnockedDown = data?.times_knocked_down_zombies || 0; + this.tntBabyZombieKills = data?.tnt_baby_zombie_kills_zombies || 0; + this.tntZombieKills = data?.tnt_zombie_kills_zombies || 0; + this.totalRoundsSurvived = data?.total_rounds_survived_zombies || 0; + this.werewolfZombieKills = data?.werewolf_zombie_kills_zombies || 0; + this.windowsRepaired = data?.windows_repaired_zombies || 0; + this.wins = data?.wins_zombies || 0; + this.witchZombieKills = data?.witch_zombie_kills_zombies || 0; + this.witherSkeletonZombieKills = data?.wither_skeleton_zombie_kills_zombies || 0; + this.witherZombieKills = data?.wither_zombie_kills_zombies || 0; + this.witherZombieZombieKills = data?.wither_zombie_zombie_kills_zombies || 0; + this.wolfDrownedZombieKills = data?.wolf_drowned_zombie_kills_zombies || 0; + this.wolfPetZombieKills = data?.wolf_pet_zombie_kills_zombies || 0; + this.wolfZombieKills = data?.wolf_zombie_kills_zombies || 0; + this.worldEnderZombieKills = data?.world_ender_zombie_kills_zombies || 0; + this.wormSmallZombieKills = data?.worm_small_zombie_kills_zombies || 0; + this.wormZombieKills = data?.worm_zombie_kills_zombies || 0; + this.zombieKills = data?.zombie_kills_zombies || 0; + this.hideTutorials = data?.zombies_hideTutorials || false; + } +} + +export default Zombies; diff --git a/src/Structures/MiniGames/Arcade/Zombies/ZombiesMap.ts b/src/Structures/MiniGames/Arcade/Zombies/ZombiesMap.ts new file mode 100644 index 000000000..25dce8842 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/Zombies/ZombiesMap.ts @@ -0,0 +1,30 @@ +import type { ArcadeZombiesMaps } from '../../../../Types/Player.ts'; + +class ZombiesMap { + bestRoundZombies: number; + deaths: number; + fastestTime10: number; + fastestTime20: number; + fastestTime30: number; + playersRevived: number; + timesKnockedDown: number; + totalRoundsSurvived: number; + windowsRepaired: number; + wins: number; + zombieKills: number; + constructor(data: Record, map: ArcadeZombiesMaps) { + this.bestRoundZombies = data?.[`best_round_zombies_${map}`]; + this.deaths = data?.[`deaths_zombies_${map}`]; + this.fastestTime10 = data?.[`fastest_time_10_zombies_${map}`]; + this.fastestTime20 = data?.[`fastest_time_20_zombies_${map}`]; + this.fastestTime30 = data?.[`fastest_time_30_zombies_${map}`]; + this.playersRevived = data?.[`players_revived_zombies_${map}`]; + this.timesKnockedDown = data?.[`times_knocked_down_zombies_${map}`]; + this.totalRoundsSurvived = data?.[`total_rounds_survived_zombies_${map}`]; + this.windowsRepaired = data?.[`windows_repaired_zombies_${map}`]; + this.wins = data?.[`wins_zombies_${map}`]; + this.zombieKills = data?.[`zombie_kills_zombies_${map}`]; + } +} + +export default ZombiesMap; diff --git a/src/Structures/MiniGames/Arcade/ZombiesStats.test.ts b/src/Structures/MiniGames/Arcade/ZombiesStats.test.ts deleted file mode 100644 index 798a1ba48..000000000 --- a/src/Structures/MiniGames/Arcade/ZombiesStats.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -import ZombieStats from './ZombiesStats.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('ZombieStats', () => { - const data = new ZombieStats({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(ZombieStats); - expectTypeOf(data).toEqualTypeOf(); - expect(data.bestRound).toBeDefined(); - expect(data.bestRound).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bestRound).toEqualTypeOf(); - expect(data.deaths).toBeDefined(); - expect(data.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.deaths).toEqualTypeOf(); - expect(data.doorsOpened).toBeDefined(); - expect(data.doorsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.doorsOpened).toEqualTypeOf(); - expect(data.fastestRound10).toBeDefined(); - expect(data.fastestRound10).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fastestRound10).toEqualTypeOf(); - expect(data.fastestRound20).toBeDefined(); - expect(data.fastestRound20).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fastestRound20).toEqualTypeOf(); - expect(data.fastestRound30).toBeDefined(); - expect(data.fastestRound30).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fastestRound30).toEqualTypeOf(); - expect(data.playersRevived).toBeDefined(); - expect(data.playersRevived).toBeGreaterThanOrEqual(0); - expectTypeOf(data.playersRevived).toEqualTypeOf(); - expect(data.timesKnockedDown).toBeDefined(); - expect(data.timesKnockedDown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.timesKnockedDown).toEqualTypeOf(); - expect(data.roundsSurvived).toBeDefined(); - expect(data.roundsSurvived).toBeGreaterThanOrEqual(0); - expectTypeOf(data.roundsSurvived).toEqualTypeOf(); - expect(data.windowsRepaired).toBeDefined(); - expect(data.windowsRepaired).toBeGreaterThanOrEqual(0); - expectTypeOf(data.windowsRepaired).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.zombieKills).toBeDefined(); - expect(data.zombieKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.zombieKills).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/Arcade/ZombiesStats.ts b/src/Structures/MiniGames/Arcade/ZombiesStats.ts deleted file mode 100644 index 24f3b09e3..000000000 --- a/src/Structures/MiniGames/Arcade/ZombiesStats.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { ZombiesMaps } from '../../../Types/Player.js'; - -class ZombiesStats { - bestRound: number; - deaths: number; - doorsOpened: number; - fastestRound10: number; - fastestRound20: number; - fastestRound30: number; - playersRevived: number; - timesKnockedDown: number; - roundsSurvived: number; - windowsRepaired: number; - wins: number; - zombieKills: number; - constructor(data: Record, map?: ZombiesMaps) { - const mapName = map ? `_${map}` : ''; - this.bestRound = data?.[`best_round_zombies${mapName}`] || 0; - this.deaths = data?.[`deaths_zombies${mapName}`] || 0; - this.doorsOpened = data?.[`doors_opened_zombies${mapName}`] || 0; - this.fastestRound10 = data?.[`fastest_time_10_zombies${mapName}_normal`] || 0; - this.fastestRound20 = data?.[`fastest_time_20_zombies${mapName}_normal`] || 0; - this.fastestRound30 = data?.[`fastest_time_30_zombies${mapName}_normal`] || 0; - this.playersRevived = data?.[`players_revived_zombies${mapName}`] || 0; - this.timesKnockedDown = data?.[`times_knocked_down_zombies${mapName}`] || 0; - this.roundsSurvived = data?.[`total_rounds_survived_zombies${mapName}`] || 0; - this.windowsRepaired = data?.[`windows_repaired_zombies${mapName}`] || 0; - this.wins = data?.[`wins_zombies${mapName}`] || 0; - this.zombieKills = data?.[`zombie_kills_zombies${mapName}`] || 0; - } -} - -export default ZombiesStats; diff --git a/src/Types/Player.ts b/src/Types/Player.ts index 32d4a11b4..2f65a359c 100644 --- a/src/Types/Player.ts +++ b/src/Types/Player.ts @@ -11,7 +11,6 @@ export type PlayerTourneyShopSort = 'highest_cost' | SortName; export type PlayerAchievementsOneTimeSort = 'highest_points' | SortName; export type SeasonName = 'christmas' | 'easter' | 'summer' | 'halloween' | 'anniversary'; export type SocialMediaId = 'DISCORD' | 'TWITTER' | 'YOUTUBE' | 'INSTAGRAM' | 'TIKTOK' | 'TWITCH' | 'HYPIXEL'; -export type ZombiesMaps = 'deadend' | 'badblood' | 'alienarcadium' | 'prison'; export type EnderSpleefTrails = 'RAINBOW' | 'GREEN' | 'DEFAULT' | 'RED' | 'BLUE'; export type TurboKartRacersMaps = 'retro' | 'hypixelgp' | 'olympus' | 'junglerush' | 'canyon'; export type VampireZRoles = 'human' | 'vampire'; @@ -2582,3 +2581,183 @@ export type MurderMysteryEmblemIcon = | 'RICH' | 'SIGMA' | 'ZERO'; +export type ArcadePartyGamesGame = + | 'animal_slaughter' + | 'anvil_spleef' + | 'avalanche' + | 'bombardment' + | 'cannon_painting' + | 'chicken_rings' + | 'dive' + | 'fire_leapers' + | 'frozen_floor' + | 'high_ground' + | 'hoe_hoe_hoe' + | 'jigsaw_rush' + | 'jungle_jump' + | 'lab_escape' + | 'lawn_moower' + | 'minecart_racing' + | 'pig_fishing' + | 'pig_jousting' + | 'rpg_16' + | 'shooting_range' + | 'spider_maze' + | 'super_sheep' + | 'the_floor_is_lava' + | 'trampolinio' + | 'volcano' + | 'workshop'; +export type ArcadeZombiesMaps = 'alienarcadium' | 'badblood' | 'deadend' | 'prison'; +export type ArcadeEnderSpleefTrail = 'BLUE' | 'DEFAULT' | 'GREEN' | 'RAINBOW' | 'RED'; +export type ArcadeHoleInTheWallColor = 'CYAN' | 'DEFAULT' | 'FROSTED' | 'GREEN' | 'PUMPKIN' | 'RED' | 'YELLOW'; +export type ArcadeThrowOutDisguise = 'COW' | 'PIG' | 'SHEEP' | 'SNOWMAN' | 'ZOMBIE'; +export type ArcadeBountyHead = 'DEFAULT' | 'EMOTION' | 'HUNTER' | 'MOB' | 'TARGET'; +export type ArcadeMeleeWeapon = + | 'BASEBALL_BAT' + | 'CLIMBER_PICKAXE' + | 'COMBAT_KNIFE' + | 'CRICKET_BAT' + | 'FIRE_AXE' + | 'GOLF_CLUB' + | 'KATANA' + | 'KNIFE' + | 'MACHETE' + | 'POLICE_BATON'; +export type ArcadeMovementTrail = + | 'movement_trail_black_smoke' + | 'movement_trail_fire' + | 'movement_trail_frosty' + | 'movement_trail_green_star' + | 'movement_trail_magic' + | 'movement_trail_notes' + | 'movement_trail_rainbow' + | 'movement_trail_white_smoke'; +export type ArcadeProjectileTrail = + | 'projectile_trail_angry_villager' + | 'projectile_trail_bee' + | 'projectile_trail_black_smoke' + | 'projectile_trail_blood' + | 'projectile_trail_blue_dust' + | 'projectile_trail_bone' + | 'projectile_trail_candy_basket' + | 'projectile_trail_cursedflame' + | 'projectile_trail_ender' + | 'projectile_trail_fanged' + | 'projectile_trail_fire' + | 'projectile_trail_fireball' + | 'projectile_trail_firework' + | 'projectile_trail_flame_rings' + | 'projectile_trail_green_star' + | 'projectile_trail_hearts' + | 'projectile_trail_howling_wind' + | 'projectile_trail_icicle' + | 'projectile_trail_jack_o_lantern_trail' + | 'projectile_trail_lava' + | 'projectile_trail_magic' + | 'projectile_trail_notes' + | 'projectile_trail_potion' + | 'projectile_trail_pumpkin_pie' + | 'projectile_trail_pumpkin_spice_powered' + | 'projectile_trail_pumpkin_volley_trail' + | 'projectile_trail_purple_dust' + | 'projectile_trail_rainbow' + | 'projectile_trail_random' + | 'projectile_trail_red_dust' + | 'projectile_trail_rose' + | 'projectile_trail_slime' + | 'projectile_trail_sparkler' + | 'projectile_trail_spiders_silk' + | 'projectile_trail_stormy' + | 'projectile_trail_twirling_snowflake' + | 'projectile_trail_water' + | 'projectile_trail_white_smoke' + | 'projectile_trail_wisp_whirlwind'; +export type ArcadeVictoryDance = + | 'victory_dance_animal_rain' + | 'victory_dance_anvil_rain' + | 'victory_dance_chicken_rider' + | 'victory_dance_cold_snap' + | 'victory_dance_dragon_fire' + | 'victory_dance_egg_meteors' + | 'victory_dance_fireworks' + | 'victory_dance_graveyardrave' + | 'victory_dance_guardians' + | 'victory_dance_heat_wave' + | 'victory_dance_meteor_shower' + | 'victory_dance_pumpkin_bomber' + | 'victory_dance_pumpkin_laser' + | 'victory_dance_rooted' + | 'victory_dance_snow_bomber' + | 'victory_dance_special_fireworks' + | 'victory_dance_toy_stick' + | 'victory_dance_twerk_apocalypse' + | 'victory_dance_winter_twister' + | 'victory_dance_wither_rider'; +export type ArcadeTrail = + | 'blue_trail' + | 'emotion_trail' + | 'green_trail' + | 'hunter_trail' + | 'mob_trail' + | 'rainbow_trail' + | 'red_trail' + | 'target_trail'; +export type ArcadeWall = 'cyan_wall' | 'frosted_wall' | 'green_wall' | 'pumpkin_wall' | 'red_wall' | 'yellow_wall'; +export type ArcadeMelee = + | 'baseball_bat_melee' + | 'climber_pickaxe_melee' + | 'combat_knife_melee' + | 'cricket_bat_melee' + | 'fire_axe_melee' + | 'golf_club_melee' + | 'katana_melee' + | 'machete_melee' + | 'police_baton_melee'; +export type ArcadePixelPartyPants = + | 'aqua_pixel_party_pants' + | 'bling_pixel_party_pants' + | 'blurple_pixel_party_pants' + | 'breathable_pixel_party_pants' + | 'bright_pink_pixel_party_pants' + | 'cold_hearted_pixel_party_pants' + | 'deep_ocean_pixel_party_pants' + | 'disco_pixel_party_pants' + | 'hot_pink_pixel_party_pants' + | 'light_blue_pixel_party_pants' + | 'lime_pixel_party_pants' + | 'mint_pixel_party_pants' + | 'peach_pixel_party_pants' + | 'purple_pixel_party_pants' + | 'rank_color_pixel_party_pants' + | 'snow_pixel_party_pants' + | 'yellow_pixel_party_pants'; +export type ArcadePixelPartyDiscoHelmet = + | 'blue_pixel_party_disco_helmet' + | 'cyan_pixel_party_disco_helmet' + | 'green_pixel_party_disco_helmet' + | 'light_blue_pixel_party_disco_helmet' + | 'lime_pixel_party_disco_helmet' + | 'magenta_pixel_party_disco_helmet' + | 'orange_pixel_party_disco_helmet' + | 'party_pixel_party_disco_helmet' + | 'pink_pixel_party_disco_helmet' + | 'purple_pixel_party_disco_helmet' + | 'red_pixel_party_disco_helmet' + | 'spaceman_pixel_party_disco_helmet' + | 'yellow_pixel_party_disco_helmet'; +export type ArcadePixelParty = ArcadePixelPartyPants | ArcadePixelPartyDiscoHelmet; +export type ArcadeDisguise = 'cow_disguise' | 'sheep_disguise' | 'snowman_disguise' | 'zombie_disguise'; +export type ArcadePackage = + | 'mini_walls_mini_me' + | 'setbbtheme' + | ArcadeMovementTrail + | ArcadeProjectileTrail + | ArcadeVictoryDance + | ArcadeTrail + | ArcadeWall + | ArcadeMelee + | ArcadePixelPartyPants + | ArcadePixelPartyDiscoHelmet + | ArcadePixelParty + | ArcadeDisguise; diff --git a/src/index.ts b/src/index.ts index 61973aa1b..631c243e6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -27,6 +27,7 @@ export * from './Utils/TicksToMilliseconds.js'; import Achievements from './Structures/Static/Achievements/Achievements.js'; import Arcade from './Structures/MiniGames/Arcade/Arcade.js'; +import ArcadeOptions from './Structures/MiniGames/Arcade/ArcadeOptions.js'; import ArenaBrawl from './Structures/MiniGames/ArenaBrawl/ArenaBrawl.js'; import ArenaBrawlMode from './Structures/MiniGames/ArenaBrawl/ArenaBrawlMode.js'; import BaseAchievement from './Structures/Static/Achievements/BaseAchievement.js'; @@ -48,7 +49,6 @@ import BlitzSurvivalGames from './Structures/MiniGames/BlitzSurvivalGames/BlitzS import BlitzSurvivalGamesKit from './Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesKit.js'; import BlockingDead from './Structures/MiniGames/Arcade/BlockingDead.js'; import Booster from './Structures/Boosters/Booster.js'; -import BountyHunters from './Structures/MiniGames/Arcade/BountyHunters.js'; import BowSpleef from './Structures/MiniGames/TNTGames/BowSpleef.js'; import BuildBattle from './Structures/MiniGames/BuildBattle/BuildBattle.js'; import BuildBattleLastWin from './Structures/MiniGames/BuildBattle/BuildBattleLastWin.js'; @@ -61,8 +61,10 @@ import CopsAndCrims from './Structures/MiniGames/CopsAndCrims/CopsAndCrims.js'; import CopsAndCrimsGamemode from './Structures/MiniGames/CopsAndCrims/CopsAndCrimsGamemode.js'; import CopsAndCrimsGun from './Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.js'; import DragonWars from './Structures/MiniGames/Arcade/DragonWars.js'; -import Dropper from './Structures/MiniGames/Arcade/Dropper.js'; -import DropperMap from './Structures/MiniGames/Arcade/DropperMap.js'; +import DrawTheirThing from './Structures/MiniGames/Arcade/DrawTheirThing.js'; +import Dropper from './Structures/MiniGames/Arcade/Dropper/Dropper.js'; +import DropperMap from './Structures/MiniGames/Arcade/Dropper/DropperMap.js'; +import Dtt from './Structures/MiniGames/Arcade/Dtt.js'; import Duels from './Structures/MiniGames/Duels/Duels.js'; import DuelsBridge from './Structures/MiniGames/Duels/DuelsBridge.js'; import DuelsGamemode from './Structures/MiniGames/Duels/DuelsGamemode.js'; @@ -70,26 +72,30 @@ import DuelsMegaWalls from './Structures/MiniGames/Duels/DuelsMegaWalls.js'; import DuelsOP from './Structures/MiniGames/Duels/DuelsOP.js'; import DuelsSkyWars from './Structures/MiniGames/Duels/DuelsSkyWars.js'; import DuelsUHC from './Structures/MiniGames/Duels/DuelsUHC.js'; +import EasterSimulator from './Structures/MiniGames/Arcade/EasterSimulator.js'; import Emblem from './Structures/MiniGames/Shared/Emblem/Emblem.js'; import EmblemColors from './Structures/MiniGames/Shared/Emblem/EmblemColors.js'; import EnderSpleef from './Structures/MiniGames/Arcade/EnderSpleef.js'; import FarmHunt from './Structures/MiniGames/Arcade/FarmHunt.js'; -import Football from './Structures/MiniGames/Arcade/Football.js'; +import FootBall from './Structures/MiniGames/Arcade/FootBall.js'; import GalaxyWars from './Structures/MiniGames/Arcade/GalaxyWars.js'; import Game from './Structures/Game.js'; import GameAchievements from './Structures/Static/Achievements/GameAchievements.js'; import GameChallenges from './Structures/Static/GameChallenges.js'; import GameCounts from './Structures/GameCounts.js'; import GameQuests from './Structures/Static/GameQuests.js'; +import GrinchSimulator from './Structures/MiniGames/Arcade/GrinchSimulator.js'; import Guild from './Structures/Guild/Guild.js'; import GuildAchievements from './Structures/Static/Achievements/GuildAchievements.js'; import GuildMember from './Structures/Guild/GuildMember.js'; import GuildRank from './Structures/Guild/GuildRank.js'; +import HalloweenSimulator from './Structures/MiniGames/Arcade/HalloweenSimulator.js'; import HideAndSeek from './Structures/MiniGames/Arcade/HideAndSeek.js'; import HoleInTheWall from './Structures/MiniGames/Arcade/HoleInTheWall.js'; import House from './Structures/House.js'; -import HypixelSays from './Structures/MiniGames/Arcade/HypixelSays.js'; +import HypixelSports from './Structures/MiniGames/Arcade/HypixelSports.js'; import ItemBytes from './Structures/ItemBytes.js'; +import LawnMoower from './Structures/MiniGames/Arcade/PartyGames/LawnMoower.js'; import Leaderboard from './Structures/Leaderboard.js'; import LeaderboardSettings from './Structures/MiniGames/Shared/LeaderboardSettings.js'; import MegaWalls from './Structures/MiniGames/MegaWalls/MegaWalls.js'; @@ -104,15 +110,14 @@ import MurderMysteryGamemode from './Structures/MiniGames/MurderMystery/MurderMy import MurderMysteryKnifeSkinPrestige from './Structures/MiniGames/MurderMystery/MurderMysteryKnifeSkinPrestige.js'; import MurderMysteryKnifeSkinPrestigeXp from './Structures/MiniGames/MurderMystery/MurderMysteryKnifeSkinPrestigeXp.js'; import MurderMysteryMap from './Structures/MiniGames/MurderMystery/MurderMysteryMap.js'; +import OneInTheQuiver from './Structures/MiniGames/Arcade/OneInTheQuiver.js'; import OneTimeAchievement from './Structures/Static/Achievements/OneTimeAchievement.js'; import PVPRun from './Structures/MiniGames/TNTGames/PVPRun.js'; import Paintball from './Structures/MiniGames/Paintball.js'; -import PartyGames from './Structures/MiniGames/Arcade/PartyGames.js'; -import PartyPooper from './Structures/MiniGames/Arcade/PartyPooper.js'; +import PartyGames from './Structures/MiniGames/Arcade/PartyGames/PartyGames.js'; +import PartyGamesGame from './Structures/MiniGames/Arcade/PartyGames/PartyGamesGame.js'; import Pit from './Structures/MiniGames/Pit/Pit.js'; import PitInventoryItem from './Structures/MiniGames/Pit/PitInventoryItem.js'; -import PixelParty from './Structures/MiniGames/Arcade/PixelParty.js'; -import PixelPartyGameMode from './Structures/MiniGames/Arcade/PixelPartyGameMode.js'; import Player from './Structures/Player/Player.js'; import PlayerAchievements from './Structures/Player/PlayerAchievements/PlayerAchievements.js'; import PlayerAchievementsRewards from './Structures/Player/PlayerAchievements/PlayerAchievementsRewards.js'; @@ -143,14 +148,18 @@ import PlayerSocialMedia from './Structures/Player/PlayerSocialMedia.js'; import PlayerStats from './Structures/Player/PlayerStats.js'; import PlayerTourney from './Structures/Player/PlayerTourney/PlayerTourney.js'; import PlayerTourneyData from './Structures/Player/PlayerTourney/PlayerTourneyData.js'; -import PropHunt from './Structures/MiniGames/Arcade/PropHunt.js'; import Quakecraft from './Structures/MiniGames/Quakecraft/Quakecraft.js'; import QuakecraftMode from './Structures/MiniGames/Quakecraft/QuakecraftMode.js'; import Quest from './Structures/Static/Quest.js'; import QuestObjective from './Structures/Static/QuestObjective.js'; import Quests from './Structures/Static/Quests.js'; +import RPG16 from './Structures/MiniGames/Arcade/PartyGames/RPG16.js'; import RecentGame from './Structures/RecentGame.js'; +import SantaSays from './Structures/MiniGames/Arcade/SantaSays.js'; +import SantaSimulator from './Structures/MiniGames/Arcade/SantaSimulator.js'; +import ScubaSimulator from './Structures/MiniGames/Arcade/ScubaSimulator.js'; import SheepWars from './Structures/MiniGames/WoolGames/SheepWars.js'; +import SimonSays from './Structures/MiniGames/Arcade/SimonSays.js'; import SkyBlockAuction from './Structures/SkyBlock/Auctions/SkyBlockAuction.js'; import SkyBlockAuctionBid from './Structures/SkyBlock/Auctions/SkyBlockAuctionBid.js'; import SkyBlockAuctionInfo from './Structures/SkyBlock/Auctions/SkyBlockAuctionInfo.js'; @@ -318,6 +327,7 @@ import SkyWarsPackages from './Structures/MiniGames/SkyWars/SkyWarsPackages.js'; import SmashHeoresHero from './Structures/MiniGames/SmashHeroes/SmashHeoresHero.js'; import SmashHeroes from './Structures/MiniGames/SmashHeroes/SmashHeroes.js'; import SmashHeroesMode from './Structures/MiniGames/SmashHeroes/SmashHeroesMode.js'; +import Soccer from './Structures/MiniGames/Arcade/Soccer.js'; import SpeedUHC from './Structures/MiniGames/SpeedUHC/SpeedUHC.js'; import SpeedUHCMode from './Structures/MiniGames/SpeedUHC/SpeedUHCMode.js'; import Status from './Structures/Status.js'; @@ -338,16 +348,18 @@ import Warlords from './Structures/MiniGames/Warlords/Warlords.js'; import WarlordsClass from './Structures/MiniGames/Warlords/WarlordsClass.js'; import WatchdogStats from './Structures/WatchdogStats.js'; import WoolGames from './Structures/MiniGames/WoolGames/WoolGames.js'; +import WoolHunt from './Structures/MiniGames/Arcade/WoolHunt.js'; import WoolWars from './Structures/MiniGames/WoolGames/WoolWars.js'; import WoolWarsClass from './Structures/MiniGames/WoolGames/WoolWarsClass.js'; -import Zombies from './Structures/MiniGames/Arcade/Zombies.js'; -import ZombiesStats from './Structures/MiniGames/Arcade/ZombiesStats.js'; +import Zombies from './Structures/MiniGames/Arcade/Zombies/Zombies.js'; +import ZombiesMap from './Structures/MiniGames/Arcade/Zombies/ZombiesMap.js'; export { Client, Errors, Achievements, Arcade, + ArcadeOptions, ArenaBrawl, ArenaBrawlMode, BaseAchievement, @@ -369,7 +381,6 @@ export { BlitzSurvivalGamesKit, BlockingDead, Booster, - BountyHunters, BowSpleef, BuildBattle, BuildBattleLastWin, @@ -382,8 +393,10 @@ export { CopsAndCrimsGamemode, CopsAndCrimsGun, DragonWars, + DrawTheirThing, Dropper, DropperMap, + Dtt, Duels, DuelsBridge, DuelsGamemode, @@ -391,26 +404,30 @@ export { DuelsOP, DuelsSkyWars, DuelsUHC, + EasterSimulator, Emblem, EmblemColors, EnderSpleef, FarmHunt, - Football, + FootBall, GalaxyWars, Game, GameAchievements, GameChallenges, GameCounts, GameQuests, + GrinchSimulator, Guild, GuildAchievements, GuildMember, GuildRank, + HalloweenSimulator, HideAndSeek, HoleInTheWall, House, - HypixelSays, + HypixelSports, ItemBytes, + LawnMoower, Leaderboard, LeaderboardSettings, MegaWalls, @@ -425,15 +442,14 @@ export { MurderMysteryKnifeSkinPrestige, MurderMysteryKnifeSkinPrestigeXp, MurderMysteryMap, + OneInTheQuiver, OneTimeAchievement, PVPRun, Paintball, PartyGames, - PartyPooper, + PartyGamesGame, Pit, PitInventoryItem, - PixelParty, - PixelPartyGameMode, Player, PlayerAchievements, PlayerAchievementsRewards, @@ -464,14 +480,18 @@ export { PlayerStats, PlayerTourney, PlayerTourneyData, - PropHunt, Quakecraft, QuakecraftMode, Quest, QuestObjective, Quests, + RPG16, RecentGame, + SantaSays, + SantaSimulator, + ScubaSimulator, SheepWars, + SimonSays, SkyBlockAuction, SkyBlockAuctionBid, SkyBlockAuctionInfo, @@ -639,6 +659,7 @@ export { SmashHeoresHero, SmashHeroes, SmashHeroesMode, + Soccer, SpeedUHC, SpeedUHCMode, Status, @@ -659,10 +680,11 @@ export { WarlordsClass, WatchdogStats, WoolGames, + WoolHunt, WoolWars, WoolWarsClass, Zombies, - ZombiesStats + ZombiesMap }; export default { @@ -670,6 +692,7 @@ export default { Errors, Achievements, Arcade, + ArcadeOptions, ArenaBrawl, ArenaBrawlMode, BaseAchievement, @@ -691,7 +714,6 @@ export default { BlitzSurvivalGamesKit, BlockingDead, Booster, - BountyHunters, BowSpleef, BuildBattle, BuildBattleLastWin, @@ -704,8 +726,10 @@ export default { CopsAndCrimsGamemode, CopsAndCrimsGun, DragonWars, + DrawTheirThing, Dropper, DropperMap, + Dtt, Duels, DuelsBridge, DuelsGamemode, @@ -713,26 +737,30 @@ export default { DuelsOP, DuelsSkyWars, DuelsUHC, + EasterSimulator, Emblem, EmblemColors, EnderSpleef, FarmHunt, - Football, + FootBall, GalaxyWars, Game, GameAchievements, GameChallenges, GameCounts, GameQuests, + GrinchSimulator, Guild, GuildAchievements, GuildMember, GuildRank, + HalloweenSimulator, HideAndSeek, HoleInTheWall, House, - HypixelSays, + HypixelSports, ItemBytes, + LawnMoower, Leaderboard, LeaderboardSettings, MegaWalls, @@ -747,15 +775,14 @@ export default { MurderMysteryKnifeSkinPrestige, MurderMysteryKnifeSkinPrestigeXp, MurderMysteryMap, + OneInTheQuiver, OneTimeAchievement, PVPRun, Paintball, PartyGames, - PartyPooper, + PartyGamesGame, Pit, PitInventoryItem, - PixelParty, - PixelPartyGameMode, Player, PlayerAchievements, PlayerAchievementsRewards, @@ -786,14 +813,18 @@ export default { PlayerStats, PlayerTourney, PlayerTourneyData, - PropHunt, Quakecraft, QuakecraftMode, Quest, QuestObjective, Quests, + RPG16, RecentGame, + SantaSays, + SantaSimulator, + ScubaSimulator, SheepWars, + SimonSays, SkyBlockAuction, SkyBlockAuctionBid, SkyBlockAuctionInfo, @@ -961,6 +992,7 @@ export default { SmashHeoresHero, SmashHeroes, SmashHeroesMode, + Soccer, SpeedUHC, SpeedUHCMode, Status, @@ -981,8 +1013,9 @@ export default { WarlordsClass, WatchdogStats, WoolGames, + WoolHunt, WoolWars, WoolWarsClass, Zombies, - ZombiesStats + ZombiesMap }; From c360cae4c9f61099945c2517b16f27bd47696c61 Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 19 Nov 2025 12:52:35 +0800 Subject: [PATCH 079/124] fix(RequestHandler): Set Base URL --- src/Private/RequestHandler.ts | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/Private/RequestHandler.ts b/src/Private/RequestHandler.ts index db83bc9ac..7a055ee18 100644 --- a/src/Private/RequestHandler.ts +++ b/src/Private/RequestHandler.ts @@ -12,15 +12,7 @@ class RequestHandler { } setBaseURL(url: string = 'https://api.hypixel.net/v2'): this { - if ( - !url.startsWith('http') || - !url.includes('://') || - (url.includes('.') && url.includes(':')) || - (!url.includes('.') && !url.includes(':')) - ) { - throw new Error(Errors.INVALID_BASE_URL); - } - + if (!url.startsWith('http') || !url.includes('://')) throw new Error(Errors.INVALID_BASE_URL); if (url.endsWith('/')) throw new Error(Errors.INVALID_BASE_URL_SLASH); this.BASE_URL = url; return this; From 9a57a54152c2cc2d4051e9727361e6dab5dd0219 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 19 Nov 2025 05:06:58 +0000 Subject: [PATCH 080/124] chore(deps): Update all non-major dependencies (#682) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 16 +-- pnpm-lock.yaml | 320 ++++++++++++++++++++++++------------------------- 2 files changed, 168 insertions(+), 168 deletions(-) diff --git a/package.json b/package.json index ea2663575..441ff3282 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "packageManager": "pnpm@9.7.1", "author": "Kathund", "dependencies": { - "minecraft-data": "^3.99.1", + "minecraft-data": "^3.100.0", "node-cache": "^5.1.2", "prismarine-nbt": "^2.7.0", "rss-parser": "^3.13.0" @@ -50,25 +50,25 @@ "publisher": "Kathund", "devDependencies": { "@8hobbies/typedoc-plugin-404": "^3.2.1", - "@eslint/js": "^9.38.0", + "@eslint/js": "^9.39.1", "@j4cobi/eslint-plugin-sort-imports": "^1.0.2", - "@stylistic/eslint-plugin": "^5.5.0", + "@stylistic/eslint-plugin": "^5.6.0", "@types/eslint": "^9.6.1", - "@types/node": "^22.18.12", + "@types/node": "^22.19.1", "@types/xml2js": "^0.4.14", "@vitest/coverage-v8": "^3.2.4", "@vitest/ui": "^3.2.4", "dotenv": "^17.2.3", - "eslint": "^9.38.0", + "eslint": "^9.39.1", "eslint-config-prettier": "^10.1.8", "eslint-plugin-import": "^2.32.0", - "globals": "^16.4.0", + "globals": "^16.5.0", "prettier": "^3.6.2", "typedoc": "^0.27.9", - "typedoc-material-theme": "^1.4.0", + "typedoc-material-theme": "^1.4.1", "typedoc-plugin-rename-defaults": "^0.7.3", "typescript": "^5.9.3", - "typescript-eslint": "^8.46.2", + "typescript-eslint": "^8.47.0", "vitest": "^3.2.4", "xml2js": "^0.6.2" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d6cf511bf..c6a4d9dd5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: minecraft-data: - specifier: ^3.99.1 - version: 3.99.1 + specifier: ^3.100.0 + version: 3.100.0 node-cache: specifier: ^5.1.2 version: 5.1.2 @@ -25,26 +25,26 @@ importers: specifier: ^3.2.1 version: 3.2.1(typedoc@0.27.9(typescript@5.9.3)) '@eslint/js': - specifier: ^9.38.0 - version: 9.38.0 + specifier: ^9.39.1 + version: 9.39.1 '@j4cobi/eslint-plugin-sort-imports': specifier: ^1.0.2 - version: 1.0.2(eslint@9.38.0)(typescript@5.9.3) + version: 1.0.2(eslint@9.39.1)(typescript@5.9.3) '@stylistic/eslint-plugin': - specifier: ^5.5.0 - version: 5.5.0(eslint@9.38.0) + specifier: ^5.6.0 + version: 5.6.0(eslint@9.39.1) '@types/eslint': specifier: ^9.6.1 version: 9.6.1 '@types/node': - specifier: ^22.18.12 - version: 22.18.12 + specifier: ^22.19.1 + version: 22.19.1 '@types/xml2js': specifier: ^0.4.14 version: 0.4.14 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.18.12)(@vitest/ui@3.2.4)) + version: 3.2.4(vitest@3.2.4(@types/node@22.19.1)(@vitest/ui@3.2.4)) '@vitest/ui': specifier: ^3.2.4 version: 3.2.4(vitest@3.2.4) @@ -52,17 +52,17 @@ importers: specifier: ^17.2.3 version: 17.2.3 eslint: - specifier: ^9.38.0 - version: 9.38.0 + specifier: ^9.39.1 + version: 9.39.1 eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@9.38.0) + version: 10.1.8(eslint@9.39.1) eslint-plugin-import: specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0) + version: 2.32.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1) globals: - specifier: ^16.4.0 - version: 16.4.0 + specifier: ^16.5.0 + version: 16.5.0 prettier: specifier: ^3.6.2 version: 3.6.2 @@ -70,8 +70,8 @@ importers: specifier: ^0.27.9 version: 0.27.9(typescript@5.9.3) typedoc-material-theme: - specifier: ^1.4.0 - version: 1.4.0(typedoc@0.27.9(typescript@5.9.3)) + specifier: ^1.4.1 + version: 1.4.1(typedoc@0.27.9(typescript@5.9.3)) typedoc-plugin-rename-defaults: specifier: ^0.7.3 version: 0.7.3(typedoc@0.27.9(typescript@5.9.3)) @@ -79,11 +79,11 @@ importers: specifier: ^5.9.3 version: 5.9.3 typescript-eslint: - specifier: ^8.46.2 - version: 8.46.2(eslint@9.38.0)(typescript@5.9.3) + specifier: ^8.47.0 + version: 8.47.0(eslint@9.39.1)(typescript@5.9.3) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@22.18.12)(@vitest/ui@3.2.4) + version: 3.2.4(@types/node@22.19.1)(@vitest/ui@3.2.4) xml2js: specifier: ^0.6.2 version: 0.6.2 @@ -273,28 +273,28 @@ packages: resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.4.1': - resolution: {integrity: sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==} + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.16.0': - resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.38.0': - resolution: {integrity: sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==} + '@eslint/js@9.39.1': + resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.7': resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.4.0': - resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==} + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@gerrit0/mini-shiki@1.27.2': @@ -486,8 +486,8 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@stylistic/eslint-plugin@5.5.0': - resolution: {integrity: sha512-IeZF+8H0ns6prg4VrkhgL+yrvDXWDH2cKchrbh80ejG9dQgZWp10epHMbgRuQvgchLII/lfh6Xn3lu6+6L86Hw==} + '@stylistic/eslint-plugin@5.6.0': + resolution: {integrity: sha512-owEc4B8ME+O/xyZOkLVyLqPMsUgJXIM4XzCm5Vt3WvRXpyoOfYxgA+JkEiFqXPCI8+Nc2BzAT+KGAK7QleGs8Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=9.0.0' @@ -516,8 +516,8 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/node@22.18.12': - resolution: {integrity: sha512-BICHQ67iqxQGFSzfCFTT7MRQ5XcBjG5aeKh5Ok38UBbPe5fxTyE+aHFxwVrGyr8GNlqFMLKD1D3P2K/1ks8tog==} + '@types/node@22.19.1': + resolution: {integrity: sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==} '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -525,23 +525,23 @@ packages: '@types/xml2js@0.4.14': resolution: {integrity: sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==} - '@typescript-eslint/eslint-plugin@8.46.2': - resolution: {integrity: sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==} + '@typescript-eslint/eslint-plugin@8.47.0': + resolution: {integrity: sha512-fe0rz9WJQ5t2iaLfdbDc9T80GJy0AeO453q8C3YCilnGozvOyCG5t+EZtg7j7D88+c3FipfP/x+wzGnh1xp8ZA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.46.2 + '@typescript-eslint/parser': ^8.47.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.46.2': - resolution: {integrity: sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==} + '@typescript-eslint/parser@8.47.0': + resolution: {integrity: sha512-lJi3PfxVmo0AkEY93ecfN+r8SofEqZNGByvHAI3GBLrvt1Cw6H5k1IM02nSzu0RfUafr2EvFSw0wAsZgubNplQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.46.2': - resolution: {integrity: sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==} + '@typescript-eslint/project-service@8.47.0': + resolution: {integrity: sha512-2X4BX8hUeB5JcA1TQJ7GjcgulXQ+5UkNb0DL8gHsHUHdFoiCTJoYLTpib3LtSDPZsRET5ygN4qqIWrHyYIKERA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -550,18 +550,18 @@ packages: resolution: {integrity: sha512-u2oITX3BJwzWCapoZ/pXw6BCOl8rJP4Ij/3wPoGvY8XwvXflOzd1kLrDUUUAIEdJSFh+ASwdTHqtan9xSg8buw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.46.2': - resolution: {integrity: sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==} + '@typescript-eslint/scope-manager@8.47.0': + resolution: {integrity: sha512-a0TTJk4HXMkfpFkL9/WaGTNuv7JWfFTQFJd6zS9dVAjKsojmv9HT55xzbEpnZoY+VUb+YXLMp+ihMLz/UlZfDg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.46.2': - resolution: {integrity: sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==} + '@typescript-eslint/tsconfig-utils@8.47.0': + resolution: {integrity: sha512-ybUAvjy4ZCL11uryalkKxuT3w3sXJAuWhOoGS3T/Wu+iUu1tGJmk5ytSY8gbdACNARmcYEB0COksD2j6hfGK2g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.46.2': - resolution: {integrity: sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==} + '@typescript-eslint/type-utils@8.47.0': + resolution: {integrity: sha512-QC9RiCmZ2HmIdCEvhd1aJELBlD93ErziOXXlHEZyuBo3tBiAZieya0HLIxp+DoDWlsQqDawyKuNEhORyku+P8A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -571,8 +571,8 @@ packages: resolution: {integrity: sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.46.2': - resolution: {integrity: sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==} + '@typescript-eslint/types@8.47.0': + resolution: {integrity: sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@8.28.0': @@ -581,8 +581,8 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/typescript-estree@8.46.2': - resolution: {integrity: sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==} + '@typescript-eslint/typescript-estree@8.47.0': + resolution: {integrity: sha512-k6ti9UepJf5NpzCjH31hQNLHQWupTRPhZ+KFF8WtTuTpy7uHPfeg2NM7cP27aCGajoEplxJDFVCEm9TGPYyiVg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -594,8 +594,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.46.2': - resolution: {integrity: sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==} + '@typescript-eslint/utils@8.47.0': + resolution: {integrity: sha512-g7XrNf25iL4TJOiPqatNuaChyqt49a/onq5YsJ9+hXeugK+41LVg7AxikMfM02PC6jbNtZLCJj6AUcQXJS/jGQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -605,8 +605,8 @@ packages: resolution: {integrity: sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.46.2': - resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==} + '@typescript-eslint/visitor-keys@8.47.0': + resolution: {integrity: sha512-SIV3/6eftCy1bNzCQoPmbWsRLujS8t5iDIZ4spZOBHqrM+yfX2ogg8Tt3PDTAVKw3sSCiUgg30uOAvK2r9zGjQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitest/coverage-v8@3.2.4': @@ -964,8 +964,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.38.0: - resolution: {integrity: sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==} + eslint@9.39.1: + resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1107,8 +1107,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@16.4.0: - resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} + globals@16.5.0: + resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} engines: {node: '>=18'} globalthis@1.0.4: @@ -1389,8 +1389,8 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - minecraft-data@3.99.1: - resolution: {integrity: sha512-mI9SNwlrqY2uTTLOT332Hf/QlaLa+AH3V36qu3Y2i9Z2/PjsZlja2ToTDHjazWqDMBtfch+rDTwPB2mHloArHA==} + minecraft-data@3.100.0: + resolution: {integrity: sha512-viEmZHxANjuvVg5e6VTxbEtvn2ku5EOP9SBt/LJAVaDhAhX8HeJY/zLhH31W/zFDNxC+S0J5pdkM+fPK+/gAJQ==} minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1789,8 +1789,8 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typedoc-material-theme@1.4.0: - resolution: {integrity: sha512-TBoBpX/4zWO6l74/wBLivXHC2rIiD70KXMliYrw1KhcqdybyxkVBLP5z8KiJuNV8aQIeS+rK2QG6GSucQHJQDQ==} + typedoc-material-theme@1.4.1: + resolution: {integrity: sha512-/inKZw8SqZPt+pmawpMhDmXCJQyIm+fHFuGChioyJQICZcX2FyzpwZnyPWcZHmJ09upttWFhti4ZI3hESJNkSA==} engines: {node: '>=18.0.0', npm: '>=8.6.0'} peerDependencies: typedoc: ^0.25.13 || ^0.26.x || ^0.27.x || ^0.28.x @@ -1807,8 +1807,8 @@ packages: peerDependencies: typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x - typescript-eslint@8.46.2: - resolution: {integrity: sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg==} + typescript-eslint@8.47.0: + resolution: {integrity: sha512-Lwe8i2XQ3WoMjua/r1PHrCTpkubPYJCAfOurtn+mtTzqB6jNd+14n9UN1bJ4s3F49x9ixAm0FLflB/JzQ57M8Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -2050,9 +2050,9 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.38.0)': + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1)': dependencies: - eslint: 9.38.0 + eslint: 9.39.1 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -2065,11 +2065,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.4.1': + '@eslint/config-helpers@0.4.2': dependencies: - '@eslint/core': 0.16.0 + '@eslint/core': 0.17.0 - '@eslint/core@0.16.0': + '@eslint/core@0.17.0': dependencies: '@types/json-schema': 7.0.15 @@ -2087,13 +2087,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.38.0': {} + '@eslint/js@9.39.1': {} '@eslint/object-schema@2.1.7': {} - '@eslint/plugin-kit@0.4.0': + '@eslint/plugin-kit@0.4.1': dependencies: - '@eslint/core': 0.16.0 + '@eslint/core': 0.17.0 levn: 0.4.1 '@gerrit0/mini-shiki@1.27.2': @@ -2126,9 +2126,9 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@j4cobi/eslint-plugin-sort-imports@1.0.2(eslint@9.38.0)(typescript@5.9.3)': + '@j4cobi/eslint-plugin-sort-imports@1.0.2(eslint@9.39.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/utils': 8.28.0(eslint@9.38.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.28.0(eslint@9.39.1)(typescript@5.9.3) transitivePeerDependencies: - eslint - supports-color @@ -2249,11 +2249,11 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} - '@stylistic/eslint-plugin@5.5.0(eslint@9.38.0)': + '@stylistic/eslint-plugin@5.6.0(eslint@9.39.1)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) - '@typescript-eslint/types': 8.46.2 - eslint: 9.38.0 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) + '@typescript-eslint/types': 8.47.0 + eslint: 9.39.1 eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -2282,7 +2282,7 @@ snapshots: '@types/json5@0.0.29': {} - '@types/node@22.18.12': + '@types/node@22.19.1': dependencies: undici-types: 6.21.0 @@ -2290,17 +2290,17 @@ snapshots: '@types/xml2js@0.4.14': dependencies: - '@types/node': 22.18.12 + '@types/node': 22.19.1 - '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/type-utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.46.2 - eslint: 9.38.0 + '@typescript-eslint/parser': 8.47.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.47.0 + '@typescript-eslint/type-utils': 8.47.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.47.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.47.0 + eslint: 9.39.1 graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -2309,22 +2309,22 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3)': + '@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.46.2 + '@typescript-eslint/scope-manager': 8.47.0 + '@typescript-eslint/types': 8.47.0 + '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.47.0 debug: 4.4.3 - eslint: 9.38.0 + eslint: 9.39.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.46.2(typescript@5.9.3)': + '@typescript-eslint/project-service@8.47.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) - '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/tsconfig-utils': 8.47.0(typescript@5.9.3) + '@typescript-eslint/types': 8.47.0 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: @@ -2335,22 +2335,22 @@ snapshots: '@typescript-eslint/types': 8.28.0 '@typescript-eslint/visitor-keys': 8.28.0 - '@typescript-eslint/scope-manager@8.46.2': + '@typescript-eslint/scope-manager@8.47.0': dependencies: - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/visitor-keys': 8.46.2 + '@typescript-eslint/types': 8.47.0 + '@typescript-eslint/visitor-keys': 8.47.0 - '@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.47.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.46.2(eslint@9.38.0)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.47.0(eslint@9.39.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3) + '@typescript-eslint/types': 8.47.0 + '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.47.0(eslint@9.39.1)(typescript@5.9.3) debug: 4.4.3 - eslint: 9.38.0 + eslint: 9.39.1 ts-api-utils: 2.1.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -2358,7 +2358,7 @@ snapshots: '@typescript-eslint/types@8.28.0': {} - '@typescript-eslint/types@8.46.2': {} + '@typescript-eslint/types@8.47.0': {} '@typescript-eslint/typescript-estree@8.28.0(typescript@5.9.3)': dependencies: @@ -2374,12 +2374,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.46.2(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.47.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.46.2(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/visitor-keys': 8.46.2 + '@typescript-eslint/project-service': 8.47.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.47.0(typescript@5.9.3) + '@typescript-eslint/types': 8.47.0 + '@typescript-eslint/visitor-keys': 8.47.0 debug: 4.4.3 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -2390,24 +2390,24 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.28.0(eslint@9.38.0)(typescript@5.9.3)': + '@typescript-eslint/utils@8.28.0(eslint@9.39.1)(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) '@typescript-eslint/scope-manager': 8.28.0 '@typescript-eslint/types': 8.28.0 '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.9.3) - eslint: 9.38.0 + eslint: 9.39.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.46.2(eslint@9.38.0)(typescript@5.9.3)': + '@typescript-eslint/utils@8.47.0(eslint@9.39.1)(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) - '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - eslint: 9.38.0 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) + '@typescript-eslint/scope-manager': 8.47.0 + '@typescript-eslint/types': 8.47.0 + '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) + eslint: 9.39.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -2417,12 +2417,12 @@ snapshots: '@typescript-eslint/types': 8.28.0 eslint-visitor-keys: 4.2.1 - '@typescript-eslint/visitor-keys@8.46.2': + '@typescript-eslint/visitor-keys@8.47.0': dependencies: - '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/types': 8.47.0 eslint-visitor-keys: 4.2.1 - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@22.18.12)(@vitest/ui@3.2.4))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@22.19.1)(@vitest/ui@3.2.4))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -2437,7 +2437,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.18.12)(@vitest/ui@3.2.4) + vitest: 3.2.4(@types/node@22.19.1)(@vitest/ui@3.2.4) transitivePeerDependencies: - supports-color @@ -2449,13 +2449,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@5.4.15(@types/node@22.18.12))': + '@vitest/mocker@3.2.4(vite@5.4.15(@types/node@22.19.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 5.4.15(@types/node@22.18.12) + vite: 5.4.15(@types/node@22.19.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -2486,7 +2486,7 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.15 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.18.12)(@vitest/ui@3.2.4) + vitest: 3.2.4(@types/node@22.19.1)(@vitest/ui@3.2.4) '@vitest/utils@3.2.4': dependencies: @@ -2839,9 +2839,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.8(eslint@9.38.0): + eslint-config-prettier@10.1.8(eslint@9.39.1): dependencies: - eslint: 9.38.0 + eslint: 9.39.1 eslint-import-resolver-node@0.3.9: dependencies: @@ -2851,17 +2851,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.9.3) - eslint: 9.38.0 + '@typescript-eslint/parser': 8.47.0(eslint@9.39.1)(typescript@5.9.3) + eslint: 9.39.1 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -2870,9 +2870,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.38.0 + eslint: 9.39.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -2884,7 +2884,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.9.3) + '@typescript-eslint/parser': 8.47.0(eslint@9.39.1)(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -2899,16 +2899,16 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.38.0: + eslint@9.39.1: dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.1 - '@eslint/config-helpers': 0.4.1 - '@eslint/core': 0.16.0 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.38.0 - '@eslint/plugin-kit': 0.4.0 + '@eslint/js': 9.39.1 + '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.2 @@ -3078,7 +3078,7 @@ snapshots: globals@14.0.0: {} - globals@16.4.0: {} + globals@16.5.0: {} globalthis@1.0.4: dependencies: @@ -3353,7 +3353,7 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - minecraft-data@3.99.1: {} + minecraft-data@3.100.0: {} minimatch@3.1.2: dependencies: @@ -3812,7 +3812,7 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typedoc-material-theme@1.4.0(typedoc@0.27.9(typescript@5.9.3)): + typedoc-material-theme@1.4.1(typedoc@0.27.9(typescript@5.9.3)): dependencies: '@material/material-color-utilities': 0.3.0 typedoc: 0.27.9(typescript@5.9.3) @@ -3831,13 +3831,13 @@ snapshots: typescript: 5.9.3 yaml: 2.8.1 - typescript-eslint@8.46.2(eslint@9.38.0)(typescript@5.9.3): + typescript-eslint@8.47.0(eslint@9.39.1)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(typescript@5.9.3) - '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3) - eslint: 9.38.0 + '@typescript-eslint/eslint-plugin': 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.47.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.47.0(eslint@9.39.1)(typescript@5.9.3) + eslint: 9.39.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -3859,13 +3859,13 @@ snapshots: dependencies: punycode: 2.3.1 - vite-node@3.2.4(@types/node@22.18.12): + vite-node@3.2.4(@types/node@22.19.1): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 5.4.15(@types/node@22.18.12) + vite: 5.4.15(@types/node@22.19.1) transitivePeerDependencies: - '@types/node' - less @@ -3877,20 +3877,20 @@ snapshots: - supports-color - terser - vite@5.4.15(@types/node@22.18.12): + vite@5.4.15(@types/node@22.19.1): dependencies: esbuild: 0.21.5 postcss: 8.5.3 rollup: 4.37.0 optionalDependencies: - '@types/node': 22.18.12 + '@types/node': 22.19.1 fsevents: 2.3.3 - vitest@3.2.4(@types/node@22.18.12)(@vitest/ui@3.2.4): + vitest@3.2.4(@types/node@22.19.1)(@vitest/ui@3.2.4): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@5.4.15(@types/node@22.18.12)) + '@vitest/mocker': 3.2.4(vite@5.4.15(@types/node@22.19.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -3908,11 +3908,11 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 5.4.15(@types/node@22.18.12) - vite-node: 3.2.4(@types/node@22.18.12) + vite: 5.4.15(@types/node@22.19.1) + vite-node: 3.2.4(@types/node@22.19.1) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.18.12 + '@types/node': 22.19.1 '@vitest/ui': 3.2.4(vitest@3.2.4) transitivePeerDependencies: - less From a613b6e293b27b8dd7e95a25f28c2f3253305a19 Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 19 Nov 2025 13:13:29 +0800 Subject: [PATCH 081/124] chore(deps): move node types to correct version --- .github/renovate.json | 2 +- package.json | 4 ++-- pnpm-lock.yaml | 44 +++++++++++++++++++++---------------------- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/.github/renovate.json b/.github/renovate.json index 989390ad6..08f3ae2c3 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -2,7 +2,7 @@ "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": ["config:recommended", "group:allNonMajor"], "rebaseWhen": "behind-base-branch", - "ignoreDeps": ["pnpm", "node", "typedoc", "hypixel-api-reborn", "skyhelper-networth"], + "ignoreDeps": ["pnpm", "node", "@types/node", "typedoc", "hypixel-api-reborn", "skyhelper-networth"], "semanticCommits": "enabled", "labels": ["dependencies"], "schedule": ["* 0 * * *"], diff --git a/package.json b/package.json index 441ff3282..6213a8d69 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "docgen": "pnpm exec typedoc" }, "engines": { - "node": ">=20.16.0" + "node": ">=20.19.5" }, "type": "module", "packageManager": "pnpm@9.7.1", @@ -54,7 +54,7 @@ "@j4cobi/eslint-plugin-sort-imports": "^1.0.2", "@stylistic/eslint-plugin": "^5.6.0", "@types/eslint": "^9.6.1", - "@types/node": "^22.19.1", + "@types/node": "^20.19.5", "@types/xml2js": "^0.4.14", "@vitest/coverage-v8": "^3.2.4", "@vitest/ui": "^3.2.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c6a4d9dd5..0e722eab1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -37,14 +37,14 @@ importers: specifier: ^9.6.1 version: 9.6.1 '@types/node': - specifier: ^22.19.1 - version: 22.19.1 + specifier: ^20.19.5 + version: 20.19.25 '@types/xml2js': specifier: ^0.4.14 version: 0.4.14 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.19.1)(@vitest/ui@3.2.4)) + version: 3.2.4(vitest@3.2.4(@types/node@20.19.25)(@vitest/ui@3.2.4)) '@vitest/ui': specifier: ^3.2.4 version: 3.2.4(vitest@3.2.4) @@ -83,7 +83,7 @@ importers: version: 8.47.0(eslint@9.39.1)(typescript@5.9.3) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@22.19.1)(@vitest/ui@3.2.4) + version: 3.2.4(@types/node@20.19.25)(@vitest/ui@3.2.4) xml2js: specifier: ^0.6.2 version: 0.6.2 @@ -516,8 +516,8 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/node@22.19.1': - resolution: {integrity: sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==} + '@types/node@20.19.25': + resolution: {integrity: sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==} '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -2282,7 +2282,7 @@ snapshots: '@types/json5@0.0.29': {} - '@types/node@22.19.1': + '@types/node@20.19.25': dependencies: undici-types: 6.21.0 @@ -2290,7 +2290,7 @@ snapshots: '@types/xml2js@0.4.14': dependencies: - '@types/node': 22.19.1 + '@types/node': 20.19.25 '@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)': dependencies: @@ -2422,7 +2422,7 @@ snapshots: '@typescript-eslint/types': 8.47.0 eslint-visitor-keys: 4.2.1 - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@22.19.1)(@vitest/ui@3.2.4))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@20.19.25)(@vitest/ui@3.2.4))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -2437,7 +2437,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.19.1)(@vitest/ui@3.2.4) + vitest: 3.2.4(@types/node@20.19.25)(@vitest/ui@3.2.4) transitivePeerDependencies: - supports-color @@ -2449,13 +2449,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@5.4.15(@types/node@22.19.1))': + '@vitest/mocker@3.2.4(vite@5.4.15(@types/node@20.19.25))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 5.4.15(@types/node@22.19.1) + vite: 5.4.15(@types/node@20.19.25) '@vitest/pretty-format@3.2.4': dependencies: @@ -2486,7 +2486,7 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.15 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.19.1)(@vitest/ui@3.2.4) + vitest: 3.2.4(@types/node@20.19.25)(@vitest/ui@3.2.4) '@vitest/utils@3.2.4': dependencies: @@ -3859,13 +3859,13 @@ snapshots: dependencies: punycode: 2.3.1 - vite-node@3.2.4(@types/node@22.19.1): + vite-node@3.2.4(@types/node@20.19.25): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 5.4.15(@types/node@22.19.1) + vite: 5.4.15(@types/node@20.19.25) transitivePeerDependencies: - '@types/node' - less @@ -3877,20 +3877,20 @@ snapshots: - supports-color - terser - vite@5.4.15(@types/node@22.19.1): + vite@5.4.15(@types/node@20.19.25): dependencies: esbuild: 0.21.5 postcss: 8.5.3 rollup: 4.37.0 optionalDependencies: - '@types/node': 22.19.1 + '@types/node': 20.19.25 fsevents: 2.3.3 - vitest@3.2.4(@types/node@22.19.1)(@vitest/ui@3.2.4): + vitest@3.2.4(@types/node@20.19.25)(@vitest/ui@3.2.4): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@5.4.15(@types/node@22.19.1)) + '@vitest/mocker': 3.2.4(vite@5.4.15(@types/node@20.19.25)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -3908,11 +3908,11 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 5.4.15(@types/node@22.19.1) - vite-node: 3.2.4(@types/node@22.19.1) + vite: 5.4.15(@types/node@20.19.25) + vite-node: 3.2.4(@types/node@20.19.25) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.19.1 + '@types/node': 20.19.25 '@vitest/ui': 3.2.4(vitest@3.2.4) transitivePeerDependencies: - less From 2fea995dfac3489cb2cdd5f9a4a1424fb27145cf Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 19 Nov 2025 13:18:13 +0800 Subject: [PATCH 082/124] chore(github actions): Update coverage checking --- .github/scripts/checkCoverage.ts | 67 +++---- .github/workflows/ci-cd.yml | 5 +- package.json | 2 + pnpm-lock.yaml | 295 +++++++++++++++++++++++++++++++ 4 files changed, 325 insertions(+), 44 deletions(-) diff --git a/.github/scripts/checkCoverage.ts b/.github/scripts/checkCoverage.ts index 5313e4915..44553c2be 100644 --- a/.github/scripts/checkCoverage.ts +++ b/.github/scripts/checkCoverage.ts @@ -1,56 +1,43 @@ /* v8 ignore next 1000 */ -import { parseString } from 'xml2js'; -import { readFile } from 'fs'; - -function parseXMLFile(): Promise { - return new Promise((resolve, reject) => { - readFile('.github/coverageData.xml', 'utf8', (err, data) => { - if (err) { - reject('File Dose not exist!'); - return; - } - - parseString(data, (err, result) => { - if (err) { - reject('Something Went wrong!'); - return; - } - - resolve(result); - }); - }); - }); -} +import { parseStringPromise } from 'xml2js'; +import { readFileSync } from 'fs'; + +const coverageDataFile = readFileSync('./coverage/clover.xml', 'utf-8'); +const parsed = await parseStringPromise(coverageDataFile); -const data = await parseXMLFile(); -const codeStats = data.coverage.project[0].metrics[0].$; +const codeStats = parsed.coverage.project[0].metrics[0].$; const info = { statements: Number(codeStats.statements), - coveredstatements: Number(codeStats.coveredstatements), + coveredStatements: Number(codeStats.coveredstatements), conditionals: Number(codeStats.conditionals), - coveredconditionals: Number(codeStats.coveredconditionals), + coveredConditionals: Number(codeStats.coveredconditionals), methods: Number(codeStats.methods), - coveredmethods: Number(codeStats.coveredmethods) + coveredMethods: Number(codeStats.coveredmethods) }; -if ((info.coveredstatements / info.statements) * 100 < 95) { - throw new Error('Statements is required to be 95% or higher'); +const baseline = 95; + +const statementsCoverage = (info.coveredStatements / info.statements) * 100; +if (statementsCoverage <= baseline) { + console.log(`Statements is required to be ${baseline}% or higher. Currently ${statementsCoverage.toFixed(2)}`); + process.exit(); } -if ((info.coveredconditionals / info.conditionals) * 100 < 95) { - throw new Error('Conditionals is required to be 95% or higher'); +const conditionalsCoverage = (info.coveredConditionals / info.conditionals) * 100; +if (conditionalsCoverage <= baseline) { + console.log(`Conditionals is required to be ${baseline}% or higher. Currently ${conditionalsCoverage.toFixed(2)}`); + process.exit(); } -if ((info.coveredmethods / info.methods) * 100 < 95) { - throw new Error('Methods is required to be 95% or higher'); +const methodsCoverage = (info.coveredMethods / info.methods) * 100; +if (methodsCoverage <= baseline) { + console.log(`Methods is required to be ${baseline}% or higher. Currently ${methodsCoverage.toFixed(2)}`); + process.exit(); } -if ( - ((info.coveredstatements + info.coveredconditionals + info.coveredmethods) / - (info.statements + info.conditionals + info.methods)) * - 100 < - 95 -) { - throw new Error('Everythng Combinded is required to be 95% or higher'); +const combinedCoverage = statementsCoverage + conditionalsCoverage + methodsCoverage; +if (combinedCoverage <= baseline) { + console.log(`Everything Combined is required to be ${baseline}% or higher. Currently ${combinedCoverage.toFixed(2)}`); + process.exit(); } diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml index afe71c66f..01138f4b6 100644 --- a/.github/workflows/ci-cd.yml +++ b/.github/workflows/ci-cd.yml @@ -125,8 +125,5 @@ jobs: HYPIXEL_KEY: ${{ secrets.HYPIXEL_KEY }} run: pnpm test:coverage - - name: Move Coverage Data - run: mv coverage/clover.xml .github/coverageData.xml - - name: Check Coverage - run: npx tsx .github/scripts/checkCoverage.ts + run: pnpm test:coverage:check diff --git a/package.json b/package.json index 6213a8d69..de5779339 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "build": "pnpm exec tsc", "test": "pnpm exec vitest run", "test:coverage": "pnpm exec vitest run --coverage", + "test:coverage:check": "pnpm exec tsx .github/scripts/checkCoverage.ts", "test:ui": "pnpm exec vitest --ui --coverage", "docgen": "pnpm exec typedoc" }, @@ -64,6 +65,7 @@ "eslint-plugin-import": "^2.32.0", "globals": "^16.5.0", "prettier": "^3.6.2", + "tsx": "^4.20.6", "typedoc": "^0.27.9", "typedoc-material-theme": "^1.4.1", "typedoc-plugin-rename-defaults": "^0.7.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0e722eab1..f719d3514 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -66,6 +66,9 @@ importers: prettier: specifier: ^3.6.2 version: 3.6.2 + tsx: + specifier: ^4.20.6 + version: 4.20.6 typedoc: specifier: ^0.27.9 version: 0.27.9(typescript@5.9.3) @@ -127,138 +130,294 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.9.0': resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -908,6 +1067,11 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -1091,6 +1255,9 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} + get-tsconfig@4.13.0: + resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1568,6 +1735,9 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve@1.22.10: resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} engines: {node: '>= 0.4'} @@ -1769,6 +1939,11 @@ packages: tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + tsx@4.20.6: + resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==} + engines: {node: '>=18.0.0'} + hasBin: true + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -1984,72 +2159,150 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true + '@esbuild/aix-ppc64@0.25.12': + optional: true + '@esbuild/android-arm64@0.21.5': optional: true + '@esbuild/android-arm64@0.25.12': + optional: true + '@esbuild/android-arm@0.21.5': optional: true + '@esbuild/android-arm@0.25.12': + optional: true + '@esbuild/android-x64@0.21.5': optional: true + '@esbuild/android-x64@0.25.12': + optional: true + '@esbuild/darwin-arm64@0.21.5': optional: true + '@esbuild/darwin-arm64@0.25.12': + optional: true + '@esbuild/darwin-x64@0.21.5': optional: true + '@esbuild/darwin-x64@0.25.12': + optional: true + '@esbuild/freebsd-arm64@0.21.5': optional: true + '@esbuild/freebsd-arm64@0.25.12': + optional: true + '@esbuild/freebsd-x64@0.21.5': optional: true + '@esbuild/freebsd-x64@0.25.12': + optional: true + '@esbuild/linux-arm64@0.21.5': optional: true + '@esbuild/linux-arm64@0.25.12': + optional: true + '@esbuild/linux-arm@0.21.5': optional: true + '@esbuild/linux-arm@0.25.12': + optional: true + '@esbuild/linux-ia32@0.21.5': optional: true + '@esbuild/linux-ia32@0.25.12': + optional: true + '@esbuild/linux-loong64@0.21.5': optional: true + '@esbuild/linux-loong64@0.25.12': + optional: true + '@esbuild/linux-mips64el@0.21.5': optional: true + '@esbuild/linux-mips64el@0.25.12': + optional: true + '@esbuild/linux-ppc64@0.21.5': optional: true + '@esbuild/linux-ppc64@0.25.12': + optional: true + '@esbuild/linux-riscv64@0.21.5': optional: true + '@esbuild/linux-riscv64@0.25.12': + optional: true + '@esbuild/linux-s390x@0.21.5': optional: true + '@esbuild/linux-s390x@0.25.12': + optional: true + '@esbuild/linux-x64@0.21.5': optional: true + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + '@esbuild/netbsd-x64@0.21.5': optional: true + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + '@esbuild/openbsd-x64@0.21.5': optional: true + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + '@esbuild/sunos-x64@0.21.5': optional: true + '@esbuild/sunos-x64@0.25.12': + optional: true + '@esbuild/win32-arm64@0.21.5': optional: true + '@esbuild/win32-arm64@0.25.12': + optional: true + '@esbuild/win32-ia32@0.21.5': optional: true + '@esbuild/win32-ia32@0.25.12': + optional: true + '@esbuild/win32-x64@0.21.5': optional: true + '@esbuild/win32-x64@0.25.12': + optional: true + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1)': dependencies: eslint: 9.39.1 @@ -2837,6 +3090,35 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + escape-string-regexp@4.0.0: {} eslint-config-prettier@10.1.8(eslint@9.39.1): @@ -3059,6 +3341,10 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 + get-tsconfig@4.13.0: + dependencies: + resolve-pkg-maps: 1.0.0 + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -3529,6 +3815,8 @@ snapshots: resolve-from@4.0.0: {} + resolve-pkg-maps@1.0.0: {} + resolve@1.22.10: dependencies: is-core-module: 2.16.1 @@ -3775,6 +4063,13 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 + tsx@4.20.6: + dependencies: + esbuild: 0.25.12 + get-tsconfig: 4.13.0 + optionalDependencies: + fsevents: 2.3.3 + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 From 7d2a4800c01104f0c0cab838b758685b039db53d Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 19 Nov 2025 14:35:37 +0800 Subject: [PATCH 083/124] fix(casing): Unknown -> UNKNOWN --- src/Private/RequestHandler.test.ts | 2 +- src/Private/RequestHandler.ts | 2 +- src/Structures/GameCounts.ts | 2 +- src/Structures/Guild/Guild.ts | 4 ++-- .../Player/PlayerAchievements/PlayerAchievementsRewards.ts | 2 +- src/Utils/Guild.ts | 2 +- src/Utils/RemoveSnakeCase.ts | 4 ++-- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Private/RequestHandler.test.ts b/src/Private/RequestHandler.test.ts index b15afa17f..a48840b0a 100644 --- a/src/Private/RequestHandler.test.ts +++ b/src/Private/RequestHandler.test.ts @@ -67,7 +67,7 @@ test('RequestHandler (400 Bad Request No Cause)', async () => { json: () => Promise.resolve({ success: false }) } as any); await expect(() => client.requestHandler.request('/boosters')).rejects.toThrowError( - Errors.ERROR_CODE_CAUSE.replace(/{code}/, '400 Bad Request').replace(/{cause}/, 'Unknown') + Errors.ERROR_CODE_CAUSE.replace(/{code}/, '400 Bad Request').replace(/{cause}/, 'UNKNOWN') ); vi.restoreAllMocks(); client.destroy(); diff --git a/src/Private/RequestHandler.ts b/src/Private/RequestHandler.ts index 7a055ee18..70ac9fbbe 100644 --- a/src/Private/RequestHandler.ts +++ b/src/Private/RequestHandler.ts @@ -43,7 +43,7 @@ class RequestHandler { const parsedRes = (await res.json()) as Record; if (res.status === 400) { throw new Error( - Errors.ERROR_CODE_CAUSE.replace(/{code}/, '400 Bad Request').replace(/{cause}/, parsedRes.cause || 'Unknown') + Errors.ERROR_CODE_CAUSE.replace(/{code}/, '400 Bad Request').replace(/{cause}/, parsedRes.cause || 'UNKNOWN') ); } if (res.status === 403) throw new Error(Errors.INVALID_API_KEY); diff --git a/src/Structures/GameCounts.ts b/src/Structures/GameCounts.ts index 12a033d74..48dc5adb2 100644 --- a/src/Structures/GameCounts.ts +++ b/src/Structures/GameCounts.ts @@ -9,7 +9,7 @@ class GameCounts { this.playerCount = data.playerCount; for (const game in data.games) { if (Object.prototype.hasOwnProperty.call(MiniGamesString, game)) { - const objectName = (MiniGamesString[game] || 'Unknown').toUpperCase().replace(/ +/g, '_'); + const objectName = (MiniGamesString[game] || 'UNKNOWN').toUpperCase().replace(/ +/g, '_'); this[RemoveSnakeCaseString(objectName)] = recursive(data.games[game], true); } else { this[RemoveSnakeCaseString(game)] = recursive(data.games[game], true); diff --git a/src/Structures/Guild/Guild.ts b/src/Structures/Guild/Guild.ts index 6d4ce98a0..f4b3b5c96 100644 --- a/src/Structures/Guild/Guild.ts +++ b/src/Structures/Guild/Guild.ts @@ -30,8 +30,8 @@ class Guild { preferredGames: Game[]; constructor(data: Record, uuid?: string) { // eslint-disable-next-line no-underscore-dangle - this.id = data._id || 'Unknown'; - this.name = data.name || 'Unknown'; + this.id = data._id || 'UNKNOWN'; + this.name = data.name || 'UNKNOWN'; this.description = data.description ?? ''; this.experience = data.exp || 0; this.level = getGuildLevel(this.experience); diff --git a/src/Structures/Player/PlayerAchievements/PlayerAchievementsRewards.ts b/src/Structures/Player/PlayerAchievements/PlayerAchievementsRewards.ts index 42c293bff..f0b7e366f 100644 --- a/src/Structures/Player/PlayerAchievements/PlayerAchievementsRewards.ts +++ b/src/Structures/Player/PlayerAchievements/PlayerAchievementsRewards.ts @@ -10,7 +10,7 @@ class PlayerAchievementsRewards { return parseInt(keyA) - parseInt(keyB); }) .forEach((item) => { - const key: string = Object.keys(item)?.[0] || 'Unknown'; + const key: string = Object.keys(item)?.[0] || 'UNKNOWN'; this[key] = item[key]; }); } diff --git a/src/Utils/Guild.ts b/src/Utils/Guild.ts index 46a9170d2..5bad0fe13 100644 --- a/src/Utils/Guild.ts +++ b/src/Utils/Guild.ts @@ -67,7 +67,7 @@ export function calculateExpHistory(data: GuildMember[]): ExpHistory[] { Object.keys(data[0].expHistory).forEach((day, index) => { let GEXP = 0; data.forEach((member) => (GEXP += member.expHistory?.[index]?.exp || 0)); - finalObj[data[0]?.expHistory[index]?.day || 'Unknown'] = expLimit(GEXP); + finalObj[data[0]?.expHistory[index]?.day || 'UNKNOWN'] = expLimit(GEXP); }); return parseHistory(finalObj); } diff --git a/src/Utils/RemoveSnakeCase.ts b/src/Utils/RemoveSnakeCase.ts index 8087614b7..3e9f0978c 100644 --- a/src/Utils/RemoveSnakeCase.ts +++ b/src/Utils/RemoveSnakeCase.ts @@ -7,7 +7,7 @@ export function recursive(obj: any, lowerCase: boolean = false): any { return Object.keys(obj).reduce( (pV, cV) => ({ ...pV, - [(lowerCase ? cV : cV.toLowerCase()).replace(/_[a-z]/gi, (x) => (x?.[1] || 'Unknown').toUpperCase())]: recursive( + [(lowerCase ? cV : cV.toLowerCase()).replace(/_[a-z]/gi, (x) => (x?.[1] || 'UNKNOWN').toUpperCase())]: recursive( obj[cV] ) }), @@ -16,5 +16,5 @@ export function recursive(obj: any, lowerCase: boolean = false): any { } export function RemoveSnakeCaseString(str: string): string { - return str.toLowerCase().replace(/_[a-z]/gi, (x) => (x?.[1] || 'Unknown').toUpperCase()); + return str.toLowerCase().replace(/_[a-z]/gi, (x) => (x?.[1] || 'UNKNOWN').toUpperCase()); } From 47173236a182f971cb241273517a0e1a600e2fad Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 19 Nov 2025 21:40:50 +0800 Subject: [PATCH 084/124] refactor/fix/feat(types tests) --- .github/scripts/Utils.ts | 29 + .github/scripts/checkCoverage.ts | 2 - .github/scripts/generateBasicTests.ts | 300 +++ .github/scripts/generateIndexFile.ts | 33 +- package.json | 1 + src/API/getGuild.test.ts | 12 - src/API/getSkyBlockProfile.ts | 8 +- src/API/getSkyBlockProfiles.ts | 8 +- src/Structures/Boosters/Booster.test.ts | 48 +- src/Structures/Boosters/Booster.ts | 10 +- src/Structures/Color.test.ts | 14 +- src/Structures/Game.test.ts | 25 + src/Structures/GameCounts.test.ts | 17 + src/Structures/GameCounts.ts | 2 +- src/Structures/Guild/Guild.test.ts | 7 +- src/Structures/Guild/Guild.ts | 4 - src/Structures/Guild/GuildMember.test.ts | 9 +- src/Structures/Guild/GuildRank.test.ts | 5 +- src/Structures/Guild/GuildRank.ts | 2 +- src/Structures/House.test.ts | 8 +- src/Structures/ItemBytes.test.ts | 12 + src/Structures/Leaderboard.test.ts | 5 - .../MiniGames/Arcade/Arcade.test.ts | 205 ++ src/Structures/MiniGames/Arcade/Arcade.ts | 2 +- .../MiniGames/Arcade/ArcadeOptions.test.ts | 25 + .../MiniGames/Arcade/BlockingDead.test.ts | 18 + .../MiniGames/Arcade/DragonWars.test.ts | 15 + .../MiniGames/Arcade/DrawTheirThing.test.ts | 12 + .../MiniGames/Arcade/Dropper/Dropper.test.ts | 217 ++ .../Arcade/Dropper/DropperMap.test.ts | 15 + src/Structures/MiniGames/Arcade/Dtt.test.ts | 15 + .../MiniGames/Arcade/EasterSimulator.test.ts | 15 + .../MiniGames/Arcade/EnderSpleef.test.ts | 27 + .../MiniGames/Arcade/FarmHunt.test.ts | 60 + .../MiniGames/Arcade/FootBall.test.ts | 21 + .../MiniGames/Arcade/GalaxyWars.test.ts | 45 + .../MiniGames/Arcade/GrinchSimulator.test.ts | 33 + .../Arcade/HalloweenSimulator.test.ts | 15 + .../MiniGames/Arcade/HideAndSeek.test.ts | 27 + .../MiniGames/Arcade/HoleInTheWall.test.ts | 24 + .../MiniGames/Arcade/HypixelSports.test.ts | 12 + .../MiniGames/Arcade/MiniWalls.test.ts | 59 + .../MiniGames/Arcade/OneInTheQuiver.test.ts | 27 + .../Arcade/PartyGames/LawnMoower.test.ts | 9 + .../Arcade/PartyGames/PartyGames.test.ts | 90 + .../Arcade/PartyGames/PartyGamesGame.test.ts | 24 + .../MiniGames/Arcade/PartyGames/RPG16.test.ts | 9 + .../MiniGames/Arcade/SantaSays.test.ts | 21 + .../MiniGames/Arcade/SantaSimulator.test.ts | 18 + .../MiniGames/Arcade/ScubaSimulator.test.ts | 18 + .../MiniGames/Arcade/SimonSays.test.ts | 21 + .../MiniGames/Arcade/Soccer.test.ts | 21 + .../MiniGames/Arcade/ThrowOut.test.ts | 21 + .../MiniGames/Arcade/WoolHunt.test.ts | 77 + .../MiniGames/Arcade/Zombies/Zombies.test.ts | 326 +++ .../Arcade/Zombies/ZombiesMap.test.ts | 42 + .../MiniGames/Arcade/Zombies/ZombiesMap.ts | 22 +- .../MiniGames/ArenaBrawl/ArenaBrawl.test.ts | 4 + .../MiniGames/BedWars/BedWars.test.ts | 7 + .../MiniGames/BedWars/BedWarsBeds.test.ts | 18 + .../BedWars/BedWarsCollectedItems.test.ts | 21 + .../BedWars/BedWarsDreamMode.test.ts | 16 + .../BedWars/BedWarsDreamStats.test.ts | 25 + .../MiniGames/BedWars/BedWarsMode.test.ts | 49 + .../Practice/BedWarsPracticeBase.test.ts | 13 + .../BedWarsPracticeBaseBlocksPlaced.test.ts | 12 + .../Practice/BedWarsPracticeBridging.test.ts | 13 + .../BedWarsPracticeBridgingRecords.test.ts | 19 + .../BedWarsPracticeModeAttempts.test.ts | 18 + .../Practice/BedWarsPracticeRecord.test.ts | 19 + .../BedWarsPracticeRecordElevation.test.ts | 15 + .../Practice/BedWarsPracticeStats.test.ts | 27 + .../BlitzSurvivalGames.test.ts | 2170 +---------------- .../BlitzSurvivalGamesKit.test.ts | 66 + .../MiniGames/BuildBattle/BuildBattle.test.ts | 123 + .../BuildBattle/BuildBattleLastWin.test.ts | 19 + .../BuildBattle/BuildBattleVotes.test.ts | 1869 ++++++++++++++ .../CopsAndCrims/CopsAndCrims.test.ts | 14 + .../CopsAndCrims/CopsAndCrimsGamemode.test.ts | 1 + .../CopsAndCrims/CopsAndCrimsGun.test.ts | 3 +- src/Structures/MiniGames/Duels/Duels.test.ts | 1771 +------------- .../MiniGames/Duels/DuelsBridge.test.ts | 87 + .../MiniGames/Duels/DuelsGamemode.test.ts | 65 + .../MiniGames/Duels/DuelsMegaWalls.test.ts | 72 + .../MiniGames/Duels/DuelsOP.test.ts | 72 + .../MiniGames/Duels/DuelsSkyWars.test.ts | 72 + .../MiniGames/Duels/DuelsUHC.test.ts | 78 + .../MiniGames/MegaWalls/MegaWalls.test.ts | 31 +- .../MegaWalls/MegaWallsKitStats.test.ts | 4 +- .../MegaWalls/MegaWallsModeStats.test.ts | 4 +- .../MurderMystery/MurderMystery.test.ts | 292 +++ .../MurderMysteryDescent.test.ts | 163 ++ .../MurderMysteryDescentItem.test.ts | 14 + .../MurderMysteryFavorites.test.ts | 38 + .../MurderMysteryGamemode.test.ts | 66 + .../MurderMystery/MurderMysteryGamemode.ts | 38 +- .../MurderMysteryKnifeSkinPrestige.test.ts | 16 + .../MurderMysteryKnifeSkinPrestigeXp.test.ts | 138 ++ .../MurderMystery/MurderMysteryMap.test.ts | 85 + .../MurderMystery/MurderMysteryMap.ts | 38 +- src/Structures/MiniGames/Paintball.test.ts | 2 + src/Structures/MiniGames/Pit/Pit.test.ts | 196 +- .../MiniGames/Pit/PitInventoryItem.test.ts | 23 + .../MiniGames/Quakecraft/Quakecraft.test.ts | 2 + .../MiniGames/Shared/Emblem/Emblem.test.ts | 19 + .../Shared/Emblem/EmblemColors.test.ts | 37 + .../Shared/LeaderboardSettings.test.ts | 14 + .../{Skywars.test.ts => SkyWars.test.ts} | 6 + .../MiniGames/SkyWars/SkyWarsMode.test.ts | 2 +- .../SkyWars/SkyWarsModeStats.test.ts | 4 +- .../MiniGames/SkyWars/SkyWarsPackages.test.ts | 19 + .../MiniGames/SkyWars/SkyWarsPackages.ts | 4 +- .../SmashHeroes/SmashHeoresHero.test.ts | 42 + .../MiniGames/SmashHeroes/SmashHeroes.test.ts | 19 + .../SmashHeroes/SmashHeroesMode.test.ts | 27 + .../MiniGames/SpeedUHC/SpeedUHC.test.ts | 6 + .../MiniGames/SpeedUHC/SpeedUHCMode.test.ts | 2 +- .../MiniGames/TNTGames/TNTGames.test.ts | 5 + .../TurboKartRacers/TurboKartRacers.test.ts | 5 + .../TurboKartRacersMap.test.ts | 4 +- src/Structures/MiniGames/UHC/UHC.test.ts | 7 + .../MiniGames/UHC/UHCGamemode.test.ts | 5 +- .../MiniGames/VampireZ/VampireZ.test.ts | 2 + .../MiniGames/Warlords/Warlords.test.ts | 16 + .../MiniGames/WoolGames/WoolGames.test.ts | 3 + .../MiniGames/WoolGames/WoolWars.test.ts | 6 + src/Structures/Player/Player.test.ts | 28 +- src/Structures/Player/Player.ts | 8 +- .../PlayerAchievements.test.ts | 1 + .../PlayerAchievementsTotem.test.ts | 10 +- .../PlayerAdventRewards.test.ts | 3 +- .../PlayerAdventRewardsDay.test.ts | 3 +- .../Pets/PlayerCosmeticsPet.test.ts | 2 +- .../Pets/PlayerCosmeticsPets.test.ts | 6 +- .../PlayerCosmetics/PlayerCosmetics.test.ts | 37 +- src/Structures/Player/PlayerGifting.test.ts | 6 - .../PlayerHousing/PlayerHousing.test.ts | 5 - .../PlayerHousingGivenCookies.test.ts | 2 +- .../PlayerHousingPlayerSettings.test.ts | 1 + src/Structures/Player/PlayerParkour.test.ts | 7 +- .../Player/PlayerQuests/PlayerQuest.test.ts | 3 +- .../PlayerQuestCompletion.test.ts | 1 + .../PlayerQuestCompletions.test.ts | 5 - .../Player/PlayerQuests/PlayerQuests.test.ts | 5 - .../PlayerRewards/PlayerRewards.test.ts | 4 - .../PlayerRewardsMonthlyCrate.test.ts | 3 +- .../Player/PlayerScorpiusBribe.test.ts | 3 +- .../PlayerSeasonalChristmasYear.test.ts | 3 +- ...SeasonalChristmasYearAdventRewards.test.ts | 25 - .../PlayerTourney/PlayerTourney.test.ts | 7 - .../PlayerTourney/PlayerTourneyData.test.ts | 4 +- src/Structures/RecentGame.test.ts | 31 + .../SkyBlock/Auctions/SkyBlockAuction.test.ts | 11 +- .../Auctions/SkyBlockAuctionBid.test.ts | 4 + .../Auctions/SkyBlockAuctionInfo.test.ts | 13 +- .../Auctions/SkyBlockBaseAuction.test.ts | 24 +- .../Auctions/SkyBlockBaseAuctionInfo.test.ts | 2 + .../SkyBlock/Bazaar/SkyBlockBazaar.test.ts | 12 +- .../Bazaar/SkyBlockBazaarProduct.test.ts | 2 + .../Bazaar/SkyBlockBazaarProductOrder.test.ts | 4 + .../Bazaar/SkyBlockBazaarQuickStatus.test.ts | 9 + .../SkyBlock/Bingo/SkyBlockBingo.test.ts | 9 +- .../SkyBlock/Bingo/SkyBlockBingoGoal.test.ts | 3 +- .../Collections/SkyBlockCollection.test.ts | 5 +- .../SkyBlockCollectionTier.test.ts | 3 +- .../Collections/SkyBlockCollections.test.ts | 8 +- .../Election/SkyBlockElection.test.ts | 8 +- .../SkyBlockElectionCandidate.test.ts | 3 +- .../Election/SkyBlockElectionCandidate.ts | 4 +- .../SkyBlockElectionCandidatePerk.test.ts | 2 +- .../Election/SkyBlockElectionData.test.ts | 3 + .../FireSale/SkyBlockFireSale.test.ts | 11 +- .../SkyBlock/Garden/SkyBlockGarden.test.ts | 14 +- .../SkyBlockGardenActiveVisitor.test.ts | 5 +- ...lockGardenActiveVisitorRequirement.test.ts | 4 +- .../Garden/SkyBlockGardenComposter.test.ts | 8 +- .../SkyBlockGardenComposterUpgrades.test.ts | 5 + .../SkyBlockGardenCropMilestones.test.ts | 5 +- .../SkyBlockGardenCropsUpgrades.test.ts | 15 +- .../Garden/SkyBlockGardenVisitors.test.ts | 2 + .../Inventory/SkyBlockInventoryItem.test.ts | 163 ++ .../Inventory/SkyBlockInventoryItem.ts | 2 +- .../SkyBlockInventoryItemAttribute.test.ts | 19 + .../SkyBlockInventoryItemEnchantment.test.ts | 19 + .../SkyBlockInventoryItemRune.test.ts | 19 + .../SkyBlockMemberAccessoryBag.test.ts | 5 +- .../SkyBlockMemberAccessoryBagTuning.test.ts | 11 +- ...yBlockMemberAccessoryBagTuningSlot.test.ts | 10 +- .../Bestiary/SkyBlockMemberBestiary.test.ts | 25 +- .../SkyBlockMemberChocolateFactory.test.ts | 15 +- ...SkyBlockMemberChocolateFactoryEggs.test.ts | 6 + ...ockMemberChocolateFactoryEmployees.test.ts | 7 + ...yBlockMemberChocolateFactoryHitmen.test.ts | 8 +- ...ockMemberChocolateFactoryTimeTower.test.ts | 8 +- ...lockMemberChocolateFactoryUpgrades.test.ts | 3 + .../SkyBlockMemberCrimsonIsle.test.ts | 9 +- .../SkyBlockMemberCrimsonIsleAbiphone.test.ts | 2 + .../SkyBlockMemberCrimsonIsleDojo.test.ts | 99 +- ...BlockMemberCrimsonIsleDojoMinigame.test.ts | 6 +- .../SkyBlockMemberCrimsonIsleKuudra.test.ts | 14 +- ...SkyBlockMemberCrimsonIsleMatriarch.test.ts | 4 +- ...kyBlockMemberCrimsonIsleTrophyFish.test.ts | 75 +- ...kMemberCrimsonIsleTrophyFishCaught.test.ts | 9 +- ...ockMemberCrimsonIsleTrophyFishFish.test.ts | 9 +- .../Dungeons/SkyBlockMemberDungeons.test.ts | 6 +- .../SkyBlockMemberDungeonsClasses.test.ts | 3 +- .../SkyBlockMemberDungeonsFloor.test.ts | 15 +- .../SkyBlockMemberDungeonsFloorRun.test.ts | 15 +- .../SkyBlockMemberDungeonsMode.test.ts | 10 +- .../SkyBlockMemberDungeonsTreasureRun.test.ts | 5 +- ...yBlockMemberDungeonsTreasuresChest.test.ts | 6 + ...BlockMemberInventoriesArmorDecoded.test.ts | 9 + .../SkyBlockMemberInventoriesBackpack.test.ts | 20 +- .../SkyBlockMemberInventoriesBackpack.ts | 4 +- ...ckMemberInventoriesBackpackDecoded.test.ts | 52 +- ...kyBlockMemberInventoriesBackpackDecoded.ts | 9 +- .../SkyBlockMemberInventoriesBags.test.ts | 27 +- ...BlockMemberInventoriesBagsTalisman.test.ts | 12 +- ...mberInventoriesBagsTalismanDecoded.test.ts | 32 +- ...SkyBlockMemberInventoriesEquipment.test.ts | 12 +- ...kMemberInventoriesEquipmentDecoded.test.ts | 163 +- ...SkyBlockMemberInventoriesInventory.test.ts | 12 +- ...kMemberInventoriesInventoryDecoded.test.ts | 74 +- .../SkyBlockMemberInventories.test.ts | 15 +- ...lockMemberInventoriesBaseInventory.test.ts | 2 - .../SkyBlockMemberJacobContests.test.ts | 3 + .../SkyBlockMemberJacobContestsMedals.test.ts | 3 + .../SkyBlockMemberJacobContestsPerks.test.ts | 2 + .../Mining/SkyBlockMemberMining.test.ts | 12 +- .../SkyBlockMemberMiningCrystal.test.ts | 4 +- .../Mining/SkyBlockMemberMiningHotm.test.ts | 6 +- .../SkyBlockMemberMiningHotmForge.test.ts | 6 +- .../SkyBlockMemberMiningHotmForgeItem.test.ts | 7 +- .../Mining/SkyBlockMemberMiningPowder.test.ts | 7 +- .../SkyBlockMemberMiningPowders.test.ts | 9 +- .../Member/Pets/SkyBlockMemberPet.test.ts | 3 +- .../Member/Pets/SkyBlockMemberPets.test.ts | 11 +- .../SkyBlockMemberPetsAutoPetRule.test.ts | 2 +- .../Pets/SkyBlockMemberPetsAutoPets.test.ts | 3 +- .../Pets/SkyBlockMemberPetsCare.test.ts | 3 +- .../SkyBlockMemberPlayerData.test.ts | 13 +- ...yBlockMemberPlayerDataActiveEffect.test.ts | 2 + .../SkyBlockMemberPlayerDataMinions.test.ts | 182 +- .../SkyBlockMemberPlayerDataSkills.test.ts | 11 + .../SkyBlockMemberPlayerStats.test.ts | 24 +- .../SkyBlockMemberPlayerStatsAuctions.test.ts | 13 +- ...lockMemberPlayerStatsAuctionsStats.test.ts | 13 + .../SkyBlockMemberPlayerStatsCandy.test.ts | 10 +- ...SkyBlockMemberPlayerStatsEndIsland.test.ts | 5 +- ...berPlayerStatsEndIslandDragonFight.test.ts | 26 + ...yerStatsEndIslandDragonFightDragon.test.ts | 14 +- .../SkyBlockMemberPlayerStatsFishing.test.ts | 11 + .../SkyBlockMemberPlayerStatsGifts.test.ts | 10 + .../SkyBlockMemberPlayerStatsMythos.test.ts | 10 + ...ockMemberPlayerStatsSpookyFestival.test.ts | 11 +- .../SkyBlockMemberPlayerStatsWinter.test.ts | 4 + .../Quests/SkyBlockMemberQuests.test.ts | 6 +- .../Quests/SkyBlockMemberQuestsHarp.test.ts | 26 +- .../SkyBlockMemberQuestsHarpSong.test.ts | 10 +- .../SkyBlockMemberQuestsTrapper.test.ts | 8 + .../Member/Rift/SkyBlockMemberRift.test.ts | 36 +- .../Rift/SkyBlockMemberRiftAccess.test.ts | 4 + .../SkyBlockMemberRiftBlackLagoon.test.ts | 1 + .../Rift/SkyBlockMemberRiftCastle.test.ts | 2 + .../Rift/SkyBlockMemberRiftDeadCats.test.ts | 3 +- .../Rift/SkyBlockMemberRiftDreamFarm.test.ts | 1 + .../Rift/SkyBlockMemberRiftEnigma.test.ts | 1 + .../Rift/SkyBlockMemberRiftGallery.test.ts | 3 +- ...lockMemberRiftGallerySecuredTrophy.test.ts | 3 + .../Rift/SkyBlockMemberRiftInventory.test.ts | 4 + .../SkyBlockMemberRiftWizardTower.test.ts | 6 + .../Rift/SkyBlockMemberRiftWyldWoods.test.ts | 1 + .../SkyBlockMemberRiftVillagePlaza.test.ts | 9 +- ...yBlockMemberRiftVillagePlazaCowboy.test.ts | 2 + ...yBlockMemberRiftVillagePlazaMurder.test.ts | 3 + .../SkyBlockMemberRiftWestVillage.test.ts | 12 +- ...kyBlockMemberRiftWestVillageGlyphs.test.ts | 1 + ...BlockMemberRiftWestVillageKatHouse.test.ts | 3 + .../SkyBlock/Member/SkyBlockMember.test.ts | 63 +- .../Member/SkyBlockMemberCurrencies.test.ts | 10 + .../Member/SkyBlockMemberFairySouls.test.ts | 8 + .../Member/SkyBlockMemberLeveling.test.ts | 10 + .../Member/SkyBlockMemberProfile.test.ts | 4 + .../Slayers/SkyBlockMemberSlayer.test.ts | 15 +- .../Slayers/SkyBlockMemberSlayers.test.ts | 8 +- .../SkyBlockMemberSlayersQuest.test.ts | 10 +- .../Slayers/SkyBlockMemberSlayersQuest.ts | 4 +- .../SkyBlock/Museum/SkyBlockMuseum.test.ts | 2 +- .../Museum/SkyBlockMuseumItem.test.ts | 11 +- .../Museum/SkyBlockMuseumMember.test.ts | 3 +- .../SkyBlock/News/SkyBlockNews.test.ts | 5 + .../Potion/SkyBlockPotionEffect.test.ts | 30 + .../SkyBlock/Potion/SkyBlockPotionEffect.ts | 2 +- .../Banking/SkyBlockProfileBanking.test.ts | 8 +- ...SkyBlockProfilesBankingTransaction.test.ts | 7 + .../SkyBlockProfileCommunityUpgrades.test.ts | 9 +- ...ockProfileCommunityUpgradesUpgrade.test.ts | 7 + ...ckProfileCommunityUpgradesUpgraded.test.ts | 5 + ...kyBlockProfileCommunityUpgradesUpgraded.ts | 2 +- ...kProfileCommunityUpgradesUpgrading.test.ts | 2 + .../SkyBlock/Profile/SkyBlockProfile.test.ts | 20 +- .../SkyBlock/Profile/SkyBlockProfile.ts | 6 +- .../SkyBlock/Skills/SkyBlockSkill.test.ts | 8 +- .../Skills/SkyBlockSkillLevel.test.ts | 7 + .../SkyBlock/Skills/SkyBlockSkills.test.ts | 15 +- src/Structures/SkyBlock/SkyBlockItem.test.ts | 12 + .../Static/Achievements/Achievements.test.ts | 18 + .../Static/Achievements/Achievements.ts | 4 +- .../Achievements/BaseAchievement.test.ts | 24 + .../Static/Achievements/BaseAchievement.ts | 4 +- .../Achievements/GameAchievements.test.ts | 23 + .../Static/Achievements/GameAchievements.ts | 4 +- .../Achievements/GuildAchievements.test.ts | 21 + .../Static/Achievements/GuildAchievements.ts | 6 +- .../Achievements/OneTimeAchievement.test.ts | 18 + .../Static/Achievements/OneTimeAchievement.ts | 2 +- .../Achievements/TieredAchievement.test.ts | 12 + .../Static/Achievements/TieredAchievement.ts | 2 +- src/Structures/Static/Challenge.test.ts | 16 + src/Structures/Static/Challenge.ts | 6 +- src/Structures/Static/Challenges.test.ts | 18 + src/Structures/Static/Challenges.ts | 4 +- src/Structures/Static/GameChallenges.test.ts | 14 + src/Structures/Static/GameChallenges.ts | 2 +- src/Structures/Static/GameQuests.test.ts | 14 + src/Structures/Static/GameQuests.ts | 4 +- src/Structures/Static/Quest.test.ts | 5 +- src/Structures/Static/QuestObjective.test.ts | 17 + src/Structures/Static/QuestObjective.ts | 2 +- src/Structures/Static/Quests.test.ts | 18 + src/Structures/Static/Quests.ts | 4 +- src/Structures/Status.test.ts | 3 + src/Types/API.ts | 2 - src/Types/Booster.ts | 2 - src/Types/Client.ts | 2 - src/Types/Color.ts | 2 - src/Types/Game.ts | 2 - src/Types/Global.ts | 2 - src/Types/Guild.ts | 2 - src/Types/Player.ts | 1 - src/Types/Requests.ts | 2 - src/Types/SkyBlock.ts | 2 - src/Types/Static.ts | 2 - src/Utils/ParseBoosterType.ts | 7 + src/index.ts | 3 +- vitest.config.ts | 14 +- 346 files changed, 7831 insertions(+), 5149 deletions(-) create mode 100644 .github/scripts/Utils.ts create mode 100644 .github/scripts/generateBasicTests.ts create mode 100644 src/Structures/Game.test.ts create mode 100644 src/Structures/GameCounts.test.ts create mode 100644 src/Structures/ItemBytes.test.ts create mode 100644 src/Structures/MiniGames/Arcade/Arcade.test.ts create mode 100644 src/Structures/MiniGames/Arcade/ArcadeOptions.test.ts create mode 100644 src/Structures/MiniGames/Arcade/BlockingDead.test.ts create mode 100644 src/Structures/MiniGames/Arcade/DragonWars.test.ts create mode 100644 src/Structures/MiniGames/Arcade/DrawTheirThing.test.ts create mode 100644 src/Structures/MiniGames/Arcade/Dropper/Dropper.test.ts create mode 100644 src/Structures/MiniGames/Arcade/Dropper/DropperMap.test.ts create mode 100644 src/Structures/MiniGames/Arcade/Dtt.test.ts create mode 100644 src/Structures/MiniGames/Arcade/EasterSimulator.test.ts create mode 100644 src/Structures/MiniGames/Arcade/EnderSpleef.test.ts create mode 100644 src/Structures/MiniGames/Arcade/FarmHunt.test.ts create mode 100644 src/Structures/MiniGames/Arcade/FootBall.test.ts create mode 100644 src/Structures/MiniGames/Arcade/GalaxyWars.test.ts create mode 100644 src/Structures/MiniGames/Arcade/GrinchSimulator.test.ts create mode 100644 src/Structures/MiniGames/Arcade/HalloweenSimulator.test.ts create mode 100644 src/Structures/MiniGames/Arcade/HideAndSeek.test.ts create mode 100644 src/Structures/MiniGames/Arcade/HoleInTheWall.test.ts create mode 100644 src/Structures/MiniGames/Arcade/HypixelSports.test.ts create mode 100644 src/Structures/MiniGames/Arcade/MiniWalls.test.ts create mode 100644 src/Structures/MiniGames/Arcade/OneInTheQuiver.test.ts create mode 100644 src/Structures/MiniGames/Arcade/PartyGames/LawnMoower.test.ts create mode 100644 src/Structures/MiniGames/Arcade/PartyGames/PartyGames.test.ts create mode 100644 src/Structures/MiniGames/Arcade/PartyGames/PartyGamesGame.test.ts create mode 100644 src/Structures/MiniGames/Arcade/PartyGames/RPG16.test.ts create mode 100644 src/Structures/MiniGames/Arcade/SantaSays.test.ts create mode 100644 src/Structures/MiniGames/Arcade/SantaSimulator.test.ts create mode 100644 src/Structures/MiniGames/Arcade/ScubaSimulator.test.ts create mode 100644 src/Structures/MiniGames/Arcade/SimonSays.test.ts create mode 100644 src/Structures/MiniGames/Arcade/Soccer.test.ts create mode 100644 src/Structures/MiniGames/Arcade/ThrowOut.test.ts create mode 100644 src/Structures/MiniGames/Arcade/WoolHunt.test.ts create mode 100644 src/Structures/MiniGames/Arcade/Zombies/Zombies.test.ts create mode 100644 src/Structures/MiniGames/Arcade/Zombies/ZombiesMap.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsBeds.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsCollectedItems.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsDreamMode.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsDreamStats.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsMode.test.ts create mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBase.test.ts create mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBaseBlocksPlaced.test.ts create mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridging.test.ts create mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridgingRecords.test.ts create mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeModeAttempts.test.ts create mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecord.test.ts create mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecordElevation.test.ts create mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeStats.test.ts create mode 100644 src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesKit.test.ts create mode 100644 src/Structures/MiniGames/BuildBattle/BuildBattle.test.ts create mode 100644 src/Structures/MiniGames/BuildBattle/BuildBattleLastWin.test.ts create mode 100644 src/Structures/MiniGames/BuildBattle/BuildBattleVotes.test.ts create mode 100644 src/Structures/MiniGames/Duels/DuelsBridge.test.ts create mode 100644 src/Structures/MiniGames/Duels/DuelsGamemode.test.ts create mode 100644 src/Structures/MiniGames/Duels/DuelsMegaWalls.test.ts create mode 100644 src/Structures/MiniGames/Duels/DuelsOP.test.ts create mode 100644 src/Structures/MiniGames/Duels/DuelsSkyWars.test.ts create mode 100644 src/Structures/MiniGames/Duels/DuelsUHC.test.ts create mode 100644 src/Structures/MiniGames/MurderMystery/MurderMystery.test.ts create mode 100644 src/Structures/MiniGames/MurderMystery/MurderMysteryDescent.test.ts create mode 100644 src/Structures/MiniGames/MurderMystery/MurderMysteryDescentItem.test.ts create mode 100644 src/Structures/MiniGames/MurderMystery/MurderMysteryFavorites.test.ts create mode 100644 src/Structures/MiniGames/MurderMystery/MurderMysteryGamemode.test.ts create mode 100644 src/Structures/MiniGames/MurderMystery/MurderMysteryKnifeSkinPrestige.test.ts create mode 100644 src/Structures/MiniGames/MurderMystery/MurderMysteryKnifeSkinPrestigeXp.test.ts create mode 100644 src/Structures/MiniGames/MurderMystery/MurderMysteryMap.test.ts create mode 100644 src/Structures/MiniGames/Pit/PitInventoryItem.test.ts create mode 100644 src/Structures/MiniGames/Shared/Emblem/Emblem.test.ts create mode 100644 src/Structures/MiniGames/Shared/Emblem/EmblemColors.test.ts create mode 100644 src/Structures/MiniGames/Shared/LeaderboardSettings.test.ts rename src/Structures/MiniGames/SkyWars/{Skywars.test.ts => SkyWars.test.ts} (95%) create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsPackages.test.ts create mode 100644 src/Structures/MiniGames/SmashHeroes/SmashHeoresHero.test.ts create mode 100644 src/Structures/MiniGames/SmashHeroes/SmashHeroesMode.test.ts create mode 100644 src/Structures/RecentGame.test.ts create mode 100644 src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.test.ts create mode 100644 src/Structures/SkyBlock/Inventory/SkyBlockInventoryItemAttribute.test.ts create mode 100644 src/Structures/SkyBlock/Inventory/SkyBlockInventoryItemEnchantment.test.ts create mode 100644 src/Structures/SkyBlock/Inventory/SkyBlockInventoryItemRune.test.ts create mode 100644 src/Structures/SkyBlock/Potion/SkyBlockPotionEffect.test.ts create mode 100644 src/Structures/Static/Achievements/Achievements.test.ts create mode 100644 src/Structures/Static/Achievements/BaseAchievement.test.ts create mode 100644 src/Structures/Static/Achievements/GameAchievements.test.ts create mode 100644 src/Structures/Static/Achievements/GuildAchievements.test.ts create mode 100644 src/Structures/Static/Achievements/OneTimeAchievement.test.ts create mode 100644 src/Structures/Static/Achievements/TieredAchievement.test.ts create mode 100644 src/Structures/Static/Challenge.test.ts create mode 100644 src/Structures/Static/Challenges.test.ts create mode 100644 src/Structures/Static/GameChallenges.test.ts create mode 100644 src/Structures/Static/GameQuests.test.ts create mode 100644 src/Structures/Static/QuestObjective.test.ts create mode 100644 src/Structures/Static/Quests.test.ts create mode 100644 src/Utils/ParseBoosterType.ts diff --git a/.github/scripts/Utils.ts b/.github/scripts/Utils.ts new file mode 100644 index 000000000..99f169383 --- /dev/null +++ b/.github/scripts/Utils.ts @@ -0,0 +1,29 @@ +import { readdir } from 'fs/promises'; + +export interface ScanDirectoryOptions { + goDeep?: boolean; + replaceSrc?: boolean; +} + +export async function scanDirectory(directoryPath: string, options?: ScanDirectoryOptions): Promise { + const parsedOptions: ScanDirectoryOptions = { + goDeep: options?.goDeep ?? true, + replaceSrc: options?.replaceSrc ?? false + }; + const filePaths: string[] = []; + const files = await readdir(directoryPath, { withFileTypes: true }); + + for (const file of files) { + const fullPath = directoryPath + file.name; + if (file.isDirectory() && parsedOptions.goDeep) { + const paths = await scanDirectory(`${fullPath}/`, parsedOptions); + paths.forEach((path) => filePaths.push(path)); + } else { + if (fullPath.endsWith('.test.ts')) continue; + if (fullPath.endsWith('index.ts')) continue; + filePaths.push(fullPath.replaceAll('./src/', parsedOptions.replaceSrc ? './' : './src/')); + } + } + + return filePaths; +} diff --git a/.github/scripts/checkCoverage.ts b/.github/scripts/checkCoverage.ts index 44553c2be..ba87b3f3a 100644 --- a/.github/scripts/checkCoverage.ts +++ b/.github/scripts/checkCoverage.ts @@ -1,5 +1,3 @@ -/* v8 ignore next 1000 */ - import { parseStringPromise } from 'xml2js'; import { readFileSync } from 'fs'; diff --git a/.github/scripts/generateBasicTests.ts b/.github/scripts/generateBasicTests.ts new file mode 100644 index 000000000..0f40994e3 --- /dev/null +++ b/.github/scripts/generateBasicTests.ts @@ -0,0 +1,300 @@ +import { + ClassDeclaration, + Declaration, + ImportDeclaration, + LeftHandSideExpression, + MethodDeclaration, + ModifierFlags, + Node, + ParameterDeclaration, + PropertyDeclaration, + ScriptTarget, + SourceFile, + SyntaxKind, + createProgram, + createSourceFile, + forEachChild, + getCombinedModifierFlags, + isClassDeclaration, + isEnumDeclaration, + isFunctionDeclaration, + isIdentifier, + isImportDeclaration, + isInterfaceDeclaration, + isMethodDeclaration, + isNamedImports, + isPropertyDeclaration, + isQualifiedName, + isReturnStatement, + isTypeAliasDeclaration, + isVariableStatement +} from 'typescript'; +import { format } from 'prettier'; +import { readFileSync, writeFileSync } from 'node:fs'; +import { scanDirectory } from './Utils'; + +const prettierConfig = JSON.parse(readFileSync('.prettierrc').toString('utf-8')); +const primitiveTypes = new Set(['string', 'number', 'boolean', 'any', 'unknown', 'void']); + +interface ParsedProperty { + name: string; + type: string; + kind: 'primitive' | 'class'; +} + +interface ParsedImport { + module: string; + named?: string[]; + default?: string; +} + +interface ParsedMethod { + name: string; + returnType: string; + parameters: ParsedProperty[]; + body?: string; +} + +interface ParsedClass { + className: string; + properties: ParsedProperty[]; + methods: ParsedMethod[]; + imports: ParsedImport[]; + extending: string; +} + +function handleImportDeclaration(sourceFile: SourceFile, node: ImportDeclaration): ParsedImport { + const importObj: ParsedImport = { module: node.moduleSpecifier.getText(sourceFile).replace(/['"]/g, '') }; + if (!node.importClause) return importObj; + if (node.importClause.name) importObj.default = node.importClause.name.getText(sourceFile); + if (!node.importClause.namedBindings) return importObj; + if (!isNamedImports(node.importClause.namedBindings)) return importObj; + importObj.named = node.importClause.namedBindings.elements.map((element) => element.name.getText(sourceFile)); + return importObj; +} + +function handlePropertyParameterDeclaration( + sourceFile: SourceFile, + property: PropertyDeclaration | ParameterDeclaration +): ParsedProperty { + let type = 'any'; + if (property.type) type = property.type.getText(sourceFile); + return { name: property.name.getText(sourceFile), type, kind: primitiveTypes.has(type) ? 'primitive' : 'class' }; +} + +function extractReturnBody(sourceFile: SourceFile, method: MethodDeclaration): string | undefined { + if (!method.body) return undefined; + const returnStmt = method.body.statements.find((statements) => isReturnStatement(statements)); + if (!returnStmt) return undefined; + const expression = returnStmt.expression; + if (!expression) return undefined; + return expression.getText(sourceFile); +} + +function handleMethodDeclaration(sourceFile: SourceFile, method: MethodDeclaration): ParsedMethod { + let returnType = 'void'; + if (method.type) returnType = method.type.getText(sourceFile); + const parameters = method.parameters.map((parameters) => handlePropertyParameterDeclaration(sourceFile, parameters)); + const info: ParsedMethod = { name: method.name.getText(sourceFile), returnType, parameters }; + if (info.name === 'toString') info.body = extractReturnBody(sourceFile, method); + return info; +} + +function getExtendingName(expr: LeftHandSideExpression): string { + if (isIdentifier(expr)) return expr.text; + if (isQualifiedName(expr)) return expr.right.text; + return 'UNKNOWN'; +} + +function handleClassDeclaration( + sourceFile: SourceFile, + node: ClassDeclaration +): { properties: ParsedProperty[]; methods: ParsedMethod[]; extending: string } { + let extending: string = ''; + if (node.heritageClauses) { + for (const clause of node.heritageClauses) { + if (clause.token === SyntaxKind.ExtendsKeyword) { + const type = clause.types[0]; + if (type) extending = getExtendingName(type.expression); + } + } + } + + const properties: ParsedProperty[] = []; + const methods: ParsedMethod[] = []; + for (const member of node.members) { + if (isPropertyDeclaration(member)) properties.push(handlePropertyParameterDeclaration(sourceFile, member)); + if (isMethodDeclaration(member)) methods.push(handleMethodDeclaration(sourceFile, member)); + } + return { properties, methods, extending }; +} + +function getTypes(filePath: string): ParsedClass { + const imports: ParsedImport[] = []; + let className = 'UNKNOWN'; + let extending = 'UNKNOWN'; + const properties: ParsedProperty[] = []; + const methods: ParsedMethod[] = []; + + const fileContent = readFileSync(filePath, 'utf-8'); + const sourceFile = createSourceFile(filePath, fileContent, ScriptTarget.Latest, true); + function visit(node: Node) { + if (isClassDeclaration(node) && node.name) className = node.name.text; + if (isClassDeclaration(node)) { + const classData = handleClassDeclaration(sourceFile, node); + extending = classData.extending; + classData.properties.forEach((property) => properties.push(property)); + classData.methods.forEach((method) => methods.push(method)); + } + if (isImportDeclaration(node)) imports.push(handleImportDeclaration(sourceFile, node)); + forEachChild(node, visit); + } + + visit(sourceFile); + return { className, properties, methods, imports, extending }; +} + +function getFileName(filePath: string): string { + return filePath.split('/').pop() || 'UNKNOWN'; +} + +function getParentDirPath(filePath: string): string { + return filePath.replaceAll(getFileName(filePath), ''); +} + +function getParentDirName(filePath: string): string { + return getParentDirPath(filePath).slice(0, -1).split('/').reverse()[0]; +} + +const ignoredImportsFolders = ['Utils', 'Private']; +const allowedMethods = ['toString', 'toHex', 'toCode', 'toInGameCode']; + +function parseTypeName(name: string): string { + if (name.includes("'")) return `[${name}]`; + return `.${name}`; +} + +function getExportedNames(filePath: string): string[] { + const program = createProgram([filePath], {}); + const sourceFile = program.getSourceFile(filePath)!; + + const exportedNames: string[] = []; + + function visit(node: Node) { + const isExported = (getCombinedModifierFlags(node as Declaration) & ModifierFlags.Export) !== 0; + + if (isExported) { + if ( + isInterfaceDeclaration(node) || + isTypeAliasDeclaration(node) || + isClassDeclaration(node) || + isEnumDeclaration(node) || + isFunctionDeclaration(node) || + isVariableStatement(node) + ) { + if (isVariableStatement(node)) { + for (const decl of node.declarationList.declarations) { + if (isIdentifier(decl.name)) exportedNames.push(decl.name.text); + } + } else if (node.name && isIdentifier(node.name)) { + exportedNames.push(node.name.text); + } + } + } + + forEachChild(node, visit); + } + + visit(sourceFile); + + return exportedNames; +} + +function validTypeIsClass(type: string, ignoredTypes: string[]): boolean { + if (type.includes('{')) return false; + if (type.includes('[')) return false; + if (type.includes('|')) return false; + if (type.includes("'")) return false; + if (type.includes('"')) return false; + if (type.includes('<')) return false; + if (type.includes(',')) return false; + if (type.includes(';')) return false; + if (type.includes(' ')) return false; + if (ignoredTypes.includes(type)) return false; + return true; +} + +async function parseFile(filePath: string, ignoredTypes: string[]) { + console.log(`Generating Test for ${filePath}`); + const types = getTypes(filePath); + if (types === null) return; + const imports: string[] = [ + '/* eslint-disable @stylistic/max-len */', + `import ${types.className} from './${types.className}.js';` + ]; + const typedImports: string[] = []; + types.imports.forEach((fileImport) => { + fileImport.module = fileImport.module.replaceAll('.js', '.ts'); + if (ignoredImportsFolders.includes(getParentDirName(fileImport.module))) return; + fileImport.module = fileImport.module.replaceAll('.ts', '.js'); + if (types.extending !== '' && types.extending === fileImport.default) return; + if (fileImport.default) imports.push(`import ${fileImport.default} from '${fileImport.module}'`); + if (fileImport.named) typedImports.push(`import type {${fileImport.named.join(', ')}} from '${fileImport.module}'`); + }); + imports.push("import { expect, expectTypeOf, test } from 'vitest';"); + const testCode: string[] = [ + `test('${types.className}', () => {`, + `const data = new ${types.className}({ stats: 'meow' });`, + 'expect(data).toBeDefined();', + `expect(data).toBeInstanceOf(${types.className});`, + `expectTypeOf(data).toEqualTypeOf<${types.className}>();` + ]; + types.properties.forEach((type) => { + type.name = parseTypeName(type.name); + testCode.push(`expect(data${type.name}).toBeDefined();`); + if (type.type === 'number') testCode.push(`expect(data${type.name}).toBeGreaterThanOrEqual(0);`); + if (type.kind === 'class' && validTypeIsClass(type.type, ignoredTypes)) { + testCode.push(`expect(data${type.name}).toBeInstanceOf(${type.type});`); + } + testCode.push(`expectTypeOf(data${type.name}).toEqualTypeOf<${type.type}>();`); + }); + types.methods.forEach((method) => { + if (!allowedMethods.includes(method.name)) return; + testCode.push(`expect(data.${method.name}).toBeDefined();`); + testCode.push(`expectTypeOf(data.${method.name}).toEqualTypeOf<() => ${method.returnType}>();`); + testCode.push(`expect(data.${method.name}()).toBeDefined();`); + if (method.name === 'toString' && method.body) { + testCode.push(`expect(data.${method.name}()).toBe(${method.body.replaceAll('this.', 'data.')});`); + } + testCode.push(`expectTypeOf(data.${method.name}()).toEqualTypeOf<${method.returnType}>();`); + }); + testCode.push('});'); + + filePath = filePath.replaceAll('.ts', '.test.ts'); + const joinedString = [...imports, ...typedImports, '/* eslint-enable @stylistic/max-len */', '', ...testCode] + .join('\n') + .replaceAll('\n\n\n', '\n'); + const formatted = await format(joinedString, { ...prettierConfig, filepath: filePath }); + writeFileSync(filePath, formatted); + console.log(`Generated Test for ${filePath}\n`); +} + +async function getIgnoredTypes(): Promise { + const ignoredTypes: string[] = []; + const typesPaths = await scanDirectory('./src/Types/'); + for (const file of typesPaths) { + getExportedNames(file).forEach((type) => { + if (!ignoredTypes.includes(type)) ignoredTypes.push(type); + }); + } + + return ignoredTypes; +} + +(async () => { + const ignoredTypes = await getIgnoredTypes(); + const structuresPaths = await scanDirectory('./src/Structures/'); + for (const file of structuresPaths) { + await parseFile(file, ignoredTypes); + } +})(); diff --git a/.github/scripts/generateIndexFile.ts b/.github/scripts/generateIndexFile.ts index 4e7eb12aa..f4e105fcf 100644 --- a/.github/scripts/generateIndexFile.ts +++ b/.github/scripts/generateIndexFile.ts @@ -1,33 +1,12 @@ -/* v8 ignore next 1000 */ - import { format } from 'prettier'; import { readFileSync, writeFileSync } from 'fs'; -import { readdir } from 'fs/promises'; - -async function scanDirectory(directoryPath: string, goDeep: boolean = true): Promise { - const filePaths: string[] = []; - const files = await readdir(directoryPath, { withFileTypes: true }); - - for (const file of files) { - const fullPath = directoryPath + file.name; - if (file.isDirectory() && goDeep) { - const paths = await scanDirectory(`${fullPath}/`); - paths.forEach((path) => filePaths.push(path)); - } else { - if (fullPath.endsWith('.test.ts')) continue; - if (fullPath.endsWith('index.ts')) continue; - filePaths.push(fullPath.replaceAll('./src/', './')); - } - } - - return filePaths; -} +import { scanDirectory } from './Utils'; const prettierConfig = JSON.parse(readFileSync('.prettierrc').toString('utf-8')); async function generateBaseIndex() { const lines: string[] = [ - '/* v8 ignore next 1000 */', + '', '/* eslint-disable @stylistic/max-len */', '', '', @@ -36,7 +15,7 @@ async function generateBaseIndex() { '' ]; - const typesPaths = await scanDirectory('./src/Types/'); + const typesPaths = await scanDirectory('./src/Types/', { replaceSrc: true }); typesPaths.forEach((path) => { const fixedPath = path.replaceAll('.ts', '.js'); lines.push(`export * from '${fixedPath}';`); @@ -44,7 +23,7 @@ async function generateBaseIndex() { lines.push(''); - const utilsPaths = await scanDirectory('./src/Utils/'); + const utilsPaths = await scanDirectory('./src/Utils/', { replaceSrc: true }); utilsPaths.forEach((path) => { const fixedPath = path.replaceAll('.ts', '.js'); lines.push(`export * from '${fixedPath}';`); @@ -52,7 +31,7 @@ async function generateBaseIndex() { lines.push(''); - const structuresPaths = await scanDirectory('./src/Structures/'); + const structuresPaths = await scanDirectory('./src/Structures/', { replaceSrc: true }); const fixedStructuresPaths: string[] = []; const importNames: string[] = []; @@ -89,7 +68,7 @@ async function generateAPIIndex() { const importNames: string[] = []; - const apiPaths = await scanDirectory('./src/API/', false); + const apiPaths = await scanDirectory('./src/API/', { goDeep: false, replaceSrc: true }); const fixedAPIPaths: string[] = []; apiPaths.forEach((path) => { diff --git a/package.json b/package.json index de5779339..3822b5875 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "prettier": "pnpm exec prettier --write .", "build": "pnpm exec tsc", "test": "pnpm exec vitest run", + "test:generate": "pnpm exec tsx .github/scripts/generateBasicTests.ts", "test:coverage": "pnpm exec vitest run --coverage", "test:coverage:check": "pnpm exec tsx .github/scripts/checkCoverage.ts", "test:ui": "pnpm exec vitest --ui --coverage", diff --git a/src/API/getGuild.test.ts b/src/API/getGuild.test.ts index 2ba29421e..8b9bb99e5 100644 --- a/src/API/getGuild.test.ts +++ b/src/API/getGuild.test.ts @@ -242,10 +242,6 @@ test('getGuild (Name)', async () => { }); expect(data.toString()).toBeDefined(); expectTypeOf(data.toString()).toEqualTypeOf(); - expect(data.guildMaster()).toBeDefined(); - expect(data.guildMaster()).toBeInstanceOf(GuildMember); - expect(['Guild Master', 'GUILDMASTER']).toContain(data.guildMaster()?.rank); - expectTypeOf(data.guildMaster()).toEqualTypeOf(); client.destroy(); }); @@ -427,10 +423,6 @@ test('getGuild (Id)', async () => { }); expect(data.toString()).toBeDefined(); expectTypeOf(data.toString()).toEqualTypeOf(); - expect(data.guildMaster()).toBeDefined(); - expect(data.guildMaster()).toBeInstanceOf(GuildMember); - expect(['Guild Master', 'GUILDMASTER']).toContain(data.guildMaster()?.rank); - expectTypeOf(data.guildMaster()).toEqualTypeOf(); client.destroy(); }); @@ -612,9 +604,5 @@ test('getGuild (Player)', async () => { }); expect(data.toString()).toBeDefined(); expectTypeOf(data.toString()).toEqualTypeOf(); - expect(data.guildMaster()).toBeDefined(); - expect(data.guildMaster()).toBeInstanceOf(GuildMember); - expect(['Guild Master', 'GUILDMASTER']).toContain(data.guildMaster()?.rank); - expectTypeOf(data.guildMaster()).toEqualTypeOf(); client.destroy(); }); diff --git a/src/API/getSkyBlockProfile.ts b/src/API/getSkyBlockProfile.ts index 7fc48dff7..1a865eb6a 100644 --- a/src/API/getSkyBlockProfile.ts +++ b/src/API/getSkyBlockProfile.ts @@ -18,21 +18,21 @@ class getSkyBlockProfile extends Endpoint { return parsedProfile; } - private async handleGettingSkyBlockGarden(profileId: string): Promise { + private async handleGettingSkyBlockGarden(profileId: string): Promise { try { const garden = await this.client.getSkyBlockGarden(profileId); return garden as SkyBlockGarden; } catch { - return null; + return undefined; } } - private async handleGettingSkyBlockMuseum(profileId: string): Promise { + private async handleGettingSkyBlockMuseum(profileId: string): Promise { try { const museum = await this.client.getSkyBlockMuseum(profileId); return museum as SkyBlockMuseum; } catch { - return null; + return undefined; } } } diff --git a/src/API/getSkyBlockProfiles.ts b/src/API/getSkyBlockProfiles.ts index cc0bcc43e..c73dc9f58 100644 --- a/src/API/getSkyBlockProfiles.ts +++ b/src/API/getSkyBlockProfiles.ts @@ -42,21 +42,21 @@ class getSkyBlockProfiles extends Endpoint { return profile.me !== null; } - private async handleGettingSkyBlockGarden(profileId: string): Promise { + private async handleGettingSkyBlockGarden(profileId: string): Promise { try { const garden = await this.client.getSkyBlockGarden(profileId); return garden as SkyBlockGarden; } catch { - return null; + return undefined; } } - private async handleGettingSkyBlockMuseum(profileId: string): Promise { + private async handleGettingSkyBlockMuseum(profileId: string): Promise { try { const museum = await this.client.getSkyBlockMuseum(profileId); return museum as SkyBlockMuseum; } catch { - return null; + return undefined; } } } diff --git a/src/Structures/Boosters/Booster.test.ts b/src/Structures/Boosters/Booster.test.ts index ee2c766dd..697af0ade 100644 --- a/src/Structures/Boosters/Booster.test.ts +++ b/src/Structures/Boosters/Booster.test.ts @@ -1,8 +1,44 @@ -import { expect, test } from 'vitest'; -import { parseType } from './Booster.js'; +import Booster from './Booster.js'; +import Game from '../Game.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { BoosterType } from '../../Types/Booster.js'; -test('Booster (parseType)', () => { - expect(parseType({ stacked: true })).toBe('STACKED'); - expect(parseType({ stacked: false })).toBe('QUEUED'); - expect(parseType({ stacked: 'meow' })).toBe('ACTIVE'); +test('Booster', () => { + const data = new Booster({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Booster); + expectTypeOf(data).toEqualTypeOf(); + expect(data.purchaser).toBeDefined(); + expectTypeOf(data.purchaser).toEqualTypeOf(); + expect(data.amount).toBeDefined(); + expect(data.amount).toBeGreaterThanOrEqual(0); + expectTypeOf(data.amount).toEqualTypeOf(); + expect(data.originalLength).toBeDefined(); + expect(data.originalLength).toBeGreaterThanOrEqual(0); + expectTypeOf(data.originalLength).toEqualTypeOf(); + expect(data.remaining).toBeDefined(); + expect(data.remaining).toBeGreaterThanOrEqual(0); + expectTypeOf(data.remaining).toEqualTypeOf(); + expect(data.activatedTimestamp).toBeDefined(); + expect(data.activatedTimestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.activatedTimestamp).toEqualTypeOf(); + expect(data.activated).toBeDefined(); + expect(data.activated).toBeInstanceOf(Date); + expectTypeOf(data.activated).toEqualTypeOf(); + expect(data.game).toBeDefined(); + expect(data.game).toBeInstanceOf(Game); + expectTypeOf(data.game).toEqualTypeOf(); + expect(data.isActive).toBeDefined(); + expectTypeOf(data.isActive).toEqualTypeOf(); + expect(data.type).toBeDefined(); + expectTypeOf(data.type).toEqualTypeOf(); + expect(data.stackers).toBeDefined(); + expectTypeOf(data.stackers).toEqualTypeOf(); + expect(data.expired).toBeDefined(); + expectTypeOf(data.expired).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(`${data.purchaser}'s booster in ${data.game}`); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/Boosters/Booster.ts b/src/Structures/Boosters/Booster.ts index 7004eebda..387b6c234 100644 --- a/src/Structures/Boosters/Booster.ts +++ b/src/Structures/Boosters/Booster.ts @@ -21,11 +21,11 @@ class Booster { stackers: string[]; expired: boolean; constructor(data: Record) { - this.purchaser = data.purchaserUuid; - this.amount = data.amount; - this.originalLength = data.originalLength; - this.remaining = data.length; - this.activatedTimestamp = data.dateActivated; + this.purchaser = data.purchaserUuid || 'UNKNOWN'; + this.amount = data.amount || 0; + this.originalLength = data.originalLength || 0; + this.remaining = data.length || 0; + this.activatedTimestamp = data.dateActivated || 0; this.activated = new Date(data.dateActivated); this.game = new Game(data.gameType); this.isActive = Array.isArray(data.stacked); diff --git a/src/Structures/Color.test.ts b/src/Structures/Color.test.ts index c06a48730..5718be5f0 100644 --- a/src/Structures/Color.test.ts +++ b/src/Structures/Color.test.ts @@ -9,17 +9,21 @@ test('Color', () => { expectTypeOf(data).toEqualTypeOf(); expect(data.color).toBeDefined(); expectTypeOf(data.color).toEqualTypeOf(); - expect(data.color).toBe('BLACK'); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => ColorString>(); expect(data.toString()).toBeDefined(); - expectTypeOf(data.toString()).toEqualTypeOf(); expect(data.toString()).toBe('Black'); + expectTypeOf(data.toString()).toEqualTypeOf(); + expect(data.toHex).toBeDefined(); + expectTypeOf(data.toHex).toEqualTypeOf<() => ColorHex>(); expect(data.toHex()).toBeDefined(); expectTypeOf(data.toHex()).toEqualTypeOf(); - expect(data.toHex()).toBe('#000000'); + expect(data.toCode).toBeDefined(); + expectTypeOf(data.toCode).toEqualTypeOf<() => ColorCode>(); expect(data.toCode()).toBeDefined(); expectTypeOf(data.toCode()).toEqualTypeOf(); - expect(data.toCode()).toBe('BLACK'); + expect(data.toInGameCode).toBeDefined(); + expectTypeOf(data.toInGameCode).toEqualTypeOf<() => InGameCode>(); expect(data.toInGameCode()).toBeDefined(); expectTypeOf(data.toInGameCode()).toEqualTypeOf(); - expect(data.toInGameCode()).toBe('§0'); }); diff --git a/src/Structures/Game.test.ts b/src/Structures/Game.test.ts new file mode 100644 index 000000000..61fad2590 --- /dev/null +++ b/src/Structures/Game.test.ts @@ -0,0 +1,25 @@ +import Game from './Game.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { GameCode, GameID, GameString } from '../Types/Game.js'; + +test('Game', () => { + const data = new Game('ARCADE'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Game); + expectTypeOf(data).toEqualTypeOf(); + expect(data.game).toBeDefined(); + expectTypeOf(data.game).toEqualTypeOf(); + expect(data.id).toBeDefined(); + expectTypeOf(data.id).toEqualTypeOf(); + expect(data.code).toBeDefined(); + expectTypeOf(data.code).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.found).toBeDefined(); + expectTypeOf(data.found).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => GameString | null>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.name); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/GameCounts.test.ts b/src/Structures/GameCounts.test.ts new file mode 100644 index 000000000..2f0441db9 --- /dev/null +++ b/src/Structures/GameCounts.test.ts @@ -0,0 +1,17 @@ +import GameCounts from './GameCounts.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCounts', () => { + const data = new GameCounts({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCounts); + expectTypeOf(data).toEqualTypeOf(); + expect(data.playerCount).toBeDefined(); + expect(data.playerCount).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playerCount).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.playerCount); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/GameCounts.ts b/src/Structures/GameCounts.ts index 48dc5adb2..6a85b472b 100644 --- a/src/Structures/GameCounts.ts +++ b/src/Structures/GameCounts.ts @@ -6,7 +6,7 @@ class GameCounts { playerCount: number; [x: string]: object | number; constructor(data: Record) { - this.playerCount = data.playerCount; + this.playerCount = data.playerCount || 0; for (const game in data.games) { if (Object.prototype.hasOwnProperty.call(MiniGamesString, game)) { const objectName = (MiniGamesString[game] || 'UNKNOWN').toUpperCase().replace(/ +/g, '_'); diff --git a/src/Structures/Guild/Guild.test.ts b/src/Structures/Guild/Guild.test.ts index e39c46983..d1ec45665 100644 --- a/src/Structures/Guild/Guild.test.ts +++ b/src/Structures/Guild/Guild.test.ts @@ -18,8 +18,10 @@ test('Guild', () => { expect(data.description).toBeDefined(); expectTypeOf(data.description).toEqualTypeOf(); expect(data.experience).toBeDefined(); + expect(data.experience).toBeGreaterThanOrEqual(0); expectTypeOf(data.experience).toEqualTypeOf(); expect(data.level).toBeDefined(); + expect(data.level).toBeGreaterThanOrEqual(0); expectTypeOf(data.level).toEqualTypeOf(); expect(data.members).toBeDefined(); expectTypeOf(data.members).toEqualTypeOf(); @@ -28,6 +30,7 @@ test('Guild', () => { expect(data.ranks).toBeDefined(); expectTypeOf(data.ranks).toEqualTypeOf(); expect(data.totalWeeklyGEXP).toBeDefined(); + expect(data.totalWeeklyGEXP).toBeGreaterThanOrEqual(0); expectTypeOf(data.totalWeeklyGEXP).toEqualTypeOf(); expect(data.createdAtTimestamp).toBeDefined(); expectTypeOf(data.createdAtTimestamp).toEqualTypeOf(); @@ -53,9 +56,9 @@ test('Guild', () => { expectTypeOf(data.achievements).toEqualTypeOf<{ winners: number; experienceKings: number; onlinePlayers: number }>(); expect(data.preferredGames).toBeDefined(); expectTypeOf(data.preferredGames).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string>(); expect(data.toString()).toBeDefined(); expect(data.toString()).toBe(data.name); expectTypeOf(data.toString()).toEqualTypeOf(); - expect(data.guildMaster).toBeDefined(); - expectTypeOf(data.guildMaster()).toEqualTypeOf(); }); diff --git a/src/Structures/Guild/Guild.ts b/src/Structures/Guild/Guild.ts index f4b3b5c96..da511e8e2 100644 --- a/src/Structures/Guild/Guild.ts +++ b/src/Structures/Guild/Guild.ts @@ -61,10 +61,6 @@ class Guild { return this.name; } - guildMaster(): GuildMember | undefined { - return this.members.find((member) => member.rank === 'Guild Master'); - } - isRaw(): this is RequestData { return false; } diff --git a/src/Structures/Guild/GuildMember.test.ts b/src/Structures/Guild/GuildMember.test.ts index 01fb1c22e..ce9717194 100644 --- a/src/Structures/Guild/GuildMember.test.ts +++ b/src/Structures/Guild/GuildMember.test.ts @@ -1,19 +1,21 @@ import GuildMember from './GuildMember.js'; import { expect, expectTypeOf, test } from 'vitest'; import type { ExpHistory } from '../../Types/Guild.js'; +import type { UUID } from '../../Types/Global.js'; -test('Guild Member', () => { +test('GuildMember', () => { const data = new GuildMember({ stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(GuildMember); expectTypeOf(data).toEqualTypeOf(); expect(data.uuid).toBeDefined(); - expectTypeOf(data.uuid).toEqualTypeOf(); + expectTypeOf(data.uuid).toEqualTypeOf(); expect(data.joinedAtTimestamp).toBeDefined(); expectTypeOf(data.joinedAtTimestamp).toEqualTypeOf(); expect(data.joinedAt).toBeDefined(); expectTypeOf(data.joinedAt).toEqualTypeOf(); expect(data.questParticipation).toBeDefined(); + expect(data.questParticipation).toBeGreaterThanOrEqual(0); expectTypeOf(data.questParticipation).toEqualTypeOf(); expect(data.rank).toBeDefined(); expectTypeOf(data.rank).toEqualTypeOf(); @@ -24,7 +26,10 @@ test('Guild Member', () => { expect(data.expHistory).toBeDefined(); expectTypeOf(data.expHistory).toEqualTypeOf(); expect(data.weeklyExperience).toBeDefined(); + expect(data.weeklyExperience).toBeGreaterThanOrEqual(0); expectTypeOf(data.weeklyExperience).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string>(); expect(data.toString()).toBeDefined(); expect(data.toString()).toBe(data.uuid); expectTypeOf(data.toString()).toEqualTypeOf(); diff --git a/src/Structures/Guild/GuildRank.test.ts b/src/Structures/Guild/GuildRank.test.ts index 20519c492..0237ed563 100644 --- a/src/Structures/Guild/GuildRank.test.ts +++ b/src/Structures/Guild/GuildRank.test.ts @@ -1,7 +1,7 @@ import GuildRank from './GuildRank.js'; import { expect, expectTypeOf, test } from 'vitest'; -test('Guild Rank', () => { +test('GuildRank', () => { const data = new GuildRank({ stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(GuildRank); @@ -17,7 +17,10 @@ test('Guild Rank', () => { expect(data.createdAt).toBeDefined(); expectTypeOf(data.createdAt).toEqualTypeOf(); expect(data.priority).toBeDefined(); + expect(data.priority).toBeGreaterThanOrEqual(0); expectTypeOf(data.priority).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string>(); expect(data.toString()).toBeDefined(); expect(data.toString()).toBe(data.name); expectTypeOf(data.toString()).toEqualTypeOf(); diff --git a/src/Structures/Guild/GuildRank.ts b/src/Structures/Guild/GuildRank.ts index b6ddd5bd1..214ed9ae6 100644 --- a/src/Structures/Guild/GuildRank.ts +++ b/src/Structures/Guild/GuildRank.ts @@ -14,7 +14,7 @@ class GuildRank { this.priority = data?.priority || 0; } - toString() { + toString(): string { return this.name; } } diff --git a/src/Structures/House.test.ts b/src/Structures/House.test.ts index 9c767a4b3..1b7d2783e 100644 --- a/src/Structures/House.test.ts +++ b/src/Structures/House.test.ts @@ -1,5 +1,6 @@ import House from './House.js'; import { expect, expectTypeOf, test } from 'vitest'; +import type { UUID } from '../Types/Global.js'; test('House', () => { const data = new House({ stats: 'meow' }); @@ -9,7 +10,7 @@ test('House', () => { expect(data.name).toBeDefined(); expectTypeOf(data.name).toEqualTypeOf(); expect(data.uuid).toBeDefined(); - expectTypeOf(data.uuid).toEqualTypeOf(); + expectTypeOf(data.uuid).toEqualTypeOf(); expect(data.owner).toBeDefined(); expectTypeOf(data.owner).toEqualTypeOf(); expect(data.createdAtTimestamp).toBeDefined(); @@ -22,4 +23,9 @@ test('House', () => { expect(data.cookies).toBeDefined(); expect(data.cookies).toBeGreaterThanOrEqual(0); expectTypeOf(data.cookies).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.name); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/ItemBytes.test.ts b/src/Structures/ItemBytes.test.ts new file mode 100644 index 000000000..9fc484e78 --- /dev/null +++ b/src/Structures/ItemBytes.test.ts @@ -0,0 +1,12 @@ +import ItemBytes from './ItemBytes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('ItemBytes', () => { + const data = new ItemBytes({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(ItemBytes); + expectTypeOf(data).toEqualTypeOf(); + expect(data.bytesBuffer).toBeDefined(); + expect(data.bytesBuffer).toBeInstanceOf(Buffer); + expectTypeOf(data.bytesBuffer).toEqualTypeOf(); +}); diff --git a/src/Structures/Leaderboard.test.ts b/src/Structures/Leaderboard.test.ts index 30ba4312c..4fbb2d42b 100644 --- a/src/Structures/Leaderboard.test.ts +++ b/src/Structures/Leaderboard.test.ts @@ -19,9 +19,4 @@ test('Leaderboard', () => { expectTypeOf(data.count).toEqualTypeOf(); expect(data.leaders).toBeDefined(); expectTypeOf(data.leaders).toEqualTypeOf(); - - data.leaders.forEach((leader: string) => { - expect(leader).toBeDefined(); - expectTypeOf(leader).toEqualTypeOf(); - }); }); diff --git a/src/Structures/MiniGames/Arcade/Arcade.test.ts b/src/Structures/MiniGames/Arcade/Arcade.test.ts new file mode 100644 index 000000000..07e1eb1ff --- /dev/null +++ b/src/Structures/MiniGames/Arcade/Arcade.test.ts @@ -0,0 +1,205 @@ +import Arcade from './Arcade.js'; +import ArcadeOptions from './ArcadeOptions.js'; +import BlockingDead from './BlockingDead.js'; +import DragonWars from './DragonWars.js'; +import DrawTheirThing from './DrawTheirThing.js'; +import Dropper from './Dropper/Dropper.js'; +import Dtt from './Dtt.js'; +import EasterSimulator from './EasterSimulator.js'; +import EnderSpleef from './EnderSpleef.js'; +import FarmHunt from './FarmHunt.js'; +import FootBall from './FootBall.js'; +import GalaxyWars from './GalaxyWars.js'; +import GrinchSimulator from './GrinchSimulator.js'; +import HalloweenSimulator from './HalloweenSimulator.js'; +import HideAndSeek from './HideAndSeek.js'; +import HoleInTheWall from './HoleInTheWall.js'; +import HypixelSports from './HypixelSports.js'; +import MiniWalls from './MiniWalls.js'; +import OneInTheQuiver from './OneInTheQuiver.js'; +import PartyGames from './PartyGames/PartyGames.js'; +import SantaSays from './SantaSays.js'; +import SantaSimulator from './SantaSimulator.js'; +import ScubaSimulator from './ScubaSimulator.js'; +import SimonSays from './SimonSays.js'; +import Soccer from './Soccer.js'; +import ThrowOut from './ThrowOut.js'; +import WoolHunt from './WoolHunt.js'; +import Zombies from './Zombies/Zombies.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { + ArcadeBountyHead, + ArcadeMeleeWeapon, + ArcadeMovementTrail, + ArcadePackage, + ArcadeProjectileTrail, + ArcadeVictoryDance, + Language, + ShopSort +} from '../../../Types/Player.js'; + +test('Arcade', () => { + const data = new Arcade({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Arcade); + expectTypeOf(data).toEqualTypeOf(); + expect(data.activeMovementTrail).toBeDefined(); + expectTypeOf(data.activeMovementTrail).toEqualTypeOf(); + expect(data.activeProjectileTrail).toBeDefined(); + expectTypeOf(data.activeProjectileTrail).toEqualTypeOf(); + expect(data.activeVictoryDance).toBeDefined(); + expectTypeOf(data.activeVictoryDance).toEqualTypeOf(); + expect(data.blood).toBeDefined(); + expectTypeOf(data.blood).toEqualTypeOf(); + expect(data.bountyHead).toBeDefined(); + expectTypeOf(data.bountyHead).toEqualTypeOf(); + expect(data.tokens).toBeDefined(); + expect(data.tokens).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tokens).toEqualTypeOf(); + expect(data.dec2016Achievements).toBeDefined(); + expectTypeOf(data.dec2016Achievements).toEqualTypeOf(); + expect(data.dec2016Achievements2).toBeDefined(); + expectTypeOf(data.dec2016Achievements2).toEqualTypeOf(); + expect(data.flash).toBeDefined(); + expectTypeOf(data.flash).toEqualTypeOf(); + expect(data.hideAndSeekShowQueueBook).toBeDefined(); + expectTypeOf(data.hideAndSeekShowQueueBook).toEqualTypeOf(); + expect(data.hints).toBeDefined(); + expectTypeOf(data.hints).toEqualTypeOf(); + expect(data.language).toBeDefined(); + expectTypeOf(data.language).toEqualTypeOf(); + expect(data.maxWave).toBeDefined(); + expect(data.maxWave).toBeGreaterThanOrEqual(0); + expectTypeOf(data.maxWave).toEqualTypeOf(); + expect(data.meleeWeapon).toBeDefined(); + expectTypeOf(data.meleeWeapon).toEqualTypeOf(); + expect(data.monthlyTokens).toBeDefined(); + expect(data.monthlyTokens).toBeGreaterThanOrEqual(0); + expectTypeOf(data.monthlyTokens).toEqualTypeOf(); + expect(data.monthlyTokensA).toBeDefined(); + expect(data.monthlyTokensA).toBeGreaterThanOrEqual(0); + expectTypeOf(data.monthlyTokensA).toEqualTypeOf(); + expect(data.monthlyTokensB).toBeDefined(); + expect(data.monthlyTokensB).toBeGreaterThanOrEqual(0); + expectTypeOf(data.monthlyTokensB).toEqualTypeOf(); + expect(data.music).toBeDefined(); + expectTypeOf(data.music).toEqualTypeOf(); + expect(data.mysteryGiftsObtained).toBeDefined(); + expect(data.mysteryGiftsObtained).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mysteryGiftsObtained).toEqualTypeOf(); + expect(data.options).toBeDefined(); + expect(data.options).toBeInstanceOf(ArcadeOptions); + expectTypeOf(data.options).toEqualTypeOf(); + expect(data.poopCollected).toBeDefined(); + expect(data.poopCollected).toBeGreaterThanOrEqual(0); + expectTypeOf(data.poopCollected).toEqualTypeOf(); + expect(data.ppLanguage).toBeDefined(); + expectTypeOf(data.ppLanguage).toEqualTypeOf(); + expect(data.privategames).toBeDefined(); + expectTypeOf(data.privategames).toEqualTypeOf>(); + expect(data.shopSort).toBeDefined(); + expectTypeOf(data.shopSort).toEqualTypeOf(); + expect(data.shopSortEnableOwnedFirst).toBeDefined(); + expectTypeOf(data.shopSortEnableOwnedFirst).toEqualTypeOf(); + expect(data.showInfoBook).toBeDefined(); + expectTypeOf(data.showInfoBook).toEqualTypeOf(); + expect(data.simonSong).toBeDefined(); + expectTypeOf(data.simonSong).toEqualTypeOf(); + expect(data.stampLevel).toBeDefined(); + expect(data.stampLevel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.stampLevel).toEqualTypeOf(); + expect(data.timestamp).toBeDefined(); + expect(data.timestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.timestamp).toEqualTypeOf(); + expect(data.weeklyTokens).toBeDefined(); + expect(data.weeklyTokens).toBeGreaterThanOrEqual(0); + expectTypeOf(data.weeklyTokens).toEqualTypeOf(); + expect(data.weeklyTokensA).toBeDefined(); + expect(data.weeklyTokensA).toBeGreaterThanOrEqual(0); + expectTypeOf(data.weeklyTokensA).toEqualTypeOf(); + expect(data.weeklyTokensB).toBeDefined(); + expect(data.weeklyTokensB).toBeGreaterThanOrEqual(0); + expectTypeOf(data.weeklyTokensB).toEqualTypeOf(); + expect(data.xmasMusic).toBeDefined(); + expectTypeOf(data.xmasMusic).toEqualTypeOf(); + expect(data.packages).toBeDefined(); + expectTypeOf(data.packages).toEqualTypeOf(); + expect(data.blockingDead).toBeDefined(); + expect(data.blockingDead).toBeInstanceOf(BlockingDead); + expectTypeOf(data.blockingDead).toEqualTypeOf(); + expect(data.dragonWars).toBeDefined(); + expect(data.dragonWars).toBeInstanceOf(DragonWars); + expectTypeOf(data.dragonWars).toEqualTypeOf(); + expect(data.dropper).toBeDefined(); + expect(data.dropper).toBeInstanceOf(Dropper); + expectTypeOf(data.dropper).toEqualTypeOf(); + expect(data.drawTheirThing).toBeDefined(); + expect(data.drawTheirThing).toBeInstanceOf(DrawTheirThing); + expectTypeOf(data.drawTheirThing).toEqualTypeOf(); + expect(data.dtt).toBeDefined(); + expect(data.dtt).toBeInstanceOf(Dtt); + expectTypeOf(data.dtt).toEqualTypeOf(); + expect(data.easterSimulator).toBeDefined(); + expect(data.easterSimulator).toBeInstanceOf(EasterSimulator); + expectTypeOf(data.easterSimulator).toEqualTypeOf(); + expect(data.enderSpleef).toBeDefined(); + expect(data.enderSpleef).toBeInstanceOf(EnderSpleef); + expectTypeOf(data.enderSpleef).toEqualTypeOf(); + expect(data.farmHunt).toBeDefined(); + expect(data.farmHunt).toBeInstanceOf(FarmHunt); + expectTypeOf(data.farmHunt).toEqualTypeOf(); + expect(data.footBall).toBeDefined(); + expect(data.footBall).toBeInstanceOf(FootBall); + expectTypeOf(data.footBall).toEqualTypeOf(); + expect(data.galaxyWars).toBeDefined(); + expect(data.galaxyWars).toBeInstanceOf(GalaxyWars); + expectTypeOf(data.galaxyWars).toEqualTypeOf(); + expect(data.grinchSimulator).toBeDefined(); + expect(data.grinchSimulator).toBeInstanceOf(GrinchSimulator); + expectTypeOf(data.grinchSimulator).toEqualTypeOf(); + expect(data.halloweenSimulator).toBeDefined(); + expect(data.halloweenSimulator).toBeInstanceOf(HalloweenSimulator); + expectTypeOf(data.halloweenSimulator).toEqualTypeOf(); + expect(data.hideAndSeek).toBeDefined(); + expect(data.hideAndSeek).toBeInstanceOf(HideAndSeek); + expectTypeOf(data.hideAndSeek).toEqualTypeOf(); + expect(data.holeInTheWall).toBeDefined(); + expect(data.holeInTheWall).toBeInstanceOf(HoleInTheWall); + expectTypeOf(data.holeInTheWall).toEqualTypeOf(); + expect(data.hypixelSports).toBeDefined(); + expect(data.hypixelSports).toBeInstanceOf(HypixelSports); + expectTypeOf(data.hypixelSports).toEqualTypeOf(); + expect(data.MiniWalls).toBeDefined(); + expect(data.MiniWalls).toBeInstanceOf(MiniWalls); + expectTypeOf(data.MiniWalls).toEqualTypeOf(); + expect(data.oneInTheQuiver).toBeDefined(); + expect(data.oneInTheQuiver).toBeInstanceOf(OneInTheQuiver); + expectTypeOf(data.oneInTheQuiver).toEqualTypeOf(); + expect(data.partyGames).toBeDefined(); + expect(data.partyGames).toBeInstanceOf(PartyGames); + expectTypeOf(data.partyGames).toEqualTypeOf(); + expect(data.santaSays).toBeDefined(); + expect(data.santaSays).toBeInstanceOf(SantaSays); + expectTypeOf(data.santaSays).toEqualTypeOf(); + expect(data.santaSimulator).toBeDefined(); + expect(data.santaSimulator).toBeInstanceOf(SantaSimulator); + expectTypeOf(data.santaSimulator).toEqualTypeOf(); + expect(data.scubaSimulator).toBeDefined(); + expect(data.scubaSimulator).toBeInstanceOf(ScubaSimulator); + expectTypeOf(data.scubaSimulator).toEqualTypeOf(); + expect(data.simonSays).toBeDefined(); + expect(data.simonSays).toBeInstanceOf(SimonSays); + expectTypeOf(data.simonSays).toEqualTypeOf(); + expect(data.soccer).toBeDefined(); + expect(data.soccer).toBeInstanceOf(Soccer); + expectTypeOf(data.soccer).toEqualTypeOf(); + expect(data.throwOut).toBeDefined(); + expect(data.throwOut).toBeInstanceOf(ThrowOut); + expectTypeOf(data.throwOut).toEqualTypeOf(); + expect(data.woolHunt).toBeDefined(); + expect(data.woolHunt).toBeInstanceOf(WoolHunt); + expectTypeOf(data.woolHunt).toEqualTypeOf(); + expect(data.zombies).toBeDefined(); + expect(data.zombies).toBeInstanceOf(Zombies); + expectTypeOf(data.zombies).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/Arcade.ts b/src/Structures/MiniGames/Arcade/Arcade.ts index fd2cc9c84..81514c1fe 100644 --- a/src/Structures/MiniGames/Arcade/Arcade.ts +++ b/src/Structures/MiniGames/Arcade/Arcade.ts @@ -1,4 +1,4 @@ -import ArcadeOptions from './ArcadeOptions.js'; +import ArcadeOptions from './ArcadeOptions.ts'; import BlockingDead from './BlockingDead.ts'; import DragonWars from './DragonWars.ts'; import DrawTheirThing from './DrawTheirThing.ts'; diff --git a/src/Structures/MiniGames/Arcade/ArcadeOptions.test.ts b/src/Structures/MiniGames/Arcade/ArcadeOptions.test.ts new file mode 100644 index 000000000..4a29acd93 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/ArcadeOptions.test.ts @@ -0,0 +1,25 @@ +import ArcadeOptions from './ArcadeOptions.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('ArcadeOptions', () => { + const data = new ArcadeOptions({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(ArcadeOptions); + expectTypeOf(data).toEqualTypeOf(); + expect(data.showAllKillFeed).toBeDefined(); + expectTypeOf(data.showAllKillFeed).toEqualTypeOf(); + expect(data.showEnemyWoolDropped).toBeDefined(); + expectTypeOf(data.showEnemyWoolDropped).toEqualTypeOf(); + expect(data.showEnemyWoolPickedUp).toBeDefined(); + expectTypeOf(data.showEnemyWoolPickedUp).toEqualTypeOf(); + expect(data.showOwnWoolDropped).toBeDefined(); + expectTypeOf(data.showOwnWoolDropped).toEqualTypeOf(); + expect(data.showOwnWoolPickedUp).toBeDefined(); + expectTypeOf(data.showOwnWoolPickedUp).toEqualTypeOf(); + expect(data.showTipHologram).toBeDefined(); + expectTypeOf(data.showTipHologram).toEqualTypeOf(); + expect(data.showTips).toBeDefined(); + expectTypeOf(data.showTips).toEqualTypeOf(); + expect(data.showTutorialBook).toBeDefined(); + expectTypeOf(data.showTutorialBook).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/BlockingDead.test.ts b/src/Structures/MiniGames/Arcade/BlockingDead.test.ts new file mode 100644 index 000000000..23a10680a --- /dev/null +++ b/src/Structures/MiniGames/Arcade/BlockingDead.test.ts @@ -0,0 +1,18 @@ +import BlockingDead from './BlockingDead.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BlockingDead', () => { + const data = new BlockingDead({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BlockingDead); + expectTypeOf(data).toEqualTypeOf(); + expect(data.headShots).toBeDefined(); + expect(data.headShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.headShots).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/DragonWars.test.ts b/src/Structures/MiniGames/Arcade/DragonWars.test.ts new file mode 100644 index 000000000..a01eeea8e --- /dev/null +++ b/src/Structures/MiniGames/Arcade/DragonWars.test.ts @@ -0,0 +1,15 @@ +import DragonWars from './DragonWars.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('DragonWars', () => { + const data = new DragonWars({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(DragonWars); + expectTypeOf(data).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/DrawTheirThing.test.ts b/src/Structures/MiniGames/Arcade/DrawTheirThing.test.ts new file mode 100644 index 000000000..a5c650fee --- /dev/null +++ b/src/Structures/MiniGames/Arcade/DrawTheirThing.test.ts @@ -0,0 +1,12 @@ +import DrawTheirThing from './DrawTheirThing.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('DrawTheirThing', () => { + const data = new DrawTheirThing({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(DrawTheirThing); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/Dropper/Dropper.test.ts b/src/Structures/MiniGames/Arcade/Dropper/Dropper.test.ts new file mode 100644 index 000000000..9d5e1f38f --- /dev/null +++ b/src/Structures/MiniGames/Arcade/Dropper/Dropper.test.ts @@ -0,0 +1,217 @@ +import Dropper from './Dropper.js'; +import DropperMap from './DropperMap.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Dropper', () => { + const data = new Dropper({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Dropper); + expectTypeOf(data).toEqualTypeOf(); + expect(data.fails).toBeDefined(); + expect(data.fails).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fails).toEqualTypeOf(); + expect(data.fastestGame).toBeDefined(); + expect(data.fastestGame).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fastestGame).toEqualTypeOf(); + expect(data.flawlessGames).toBeDefined(); + expect(data.flawlessGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.flawlessGames).toEqualTypeOf(); + expect(data.gamesFinished).toBeDefined(); + expect(data.gamesFinished).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gamesFinished).toEqualTypeOf(); + expect(data.gamesPlayed).toBeDefined(); + expect(data.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gamesPlayed).toEqualTypeOf(); + expect(data.mapsCompleted).toBeDefined(); + expect(data.mapsCompleted).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mapsCompleted).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.atlantis).toBeDefined(); + expect(data.atlantis).toBeInstanceOf(DropperMap); + expectTypeOf(data.atlantis).toEqualTypeOf(); + expect(data.balloons).toBeDefined(); + expect(data.balloons).toBeInstanceOf(DropperMap); + expectTypeOf(data.balloons).toEqualTypeOf(); + expect(data.bbq).toBeDefined(); + expect(data.bbq).toBeInstanceOf(DropperMap); + expectTypeOf(data.bbq).toEqualTypeOf(); + expect(data.beanstalk).toBeDefined(); + expect(data.beanstalk).toBeInstanceOf(DropperMap); + expectTypeOf(data.beanstalk).toEqualTypeOf(); + expect(data.birdcage).toBeDefined(); + expect(data.birdcage).toBeInstanceOf(DropperMap); + expectTypeOf(data.birdcage).toEqualTypeOf(); + expect(data.boardgames).toBeDefined(); + expect(data.boardgames).toBeInstanceOf(DropperMap); + expectTypeOf(data.boardgames).toEqualTypeOf(); + expect(data.bridges).toBeDefined(); + expect(data.bridges).toBeInstanceOf(DropperMap); + expectTypeOf(data.bridges).toEqualTypeOf(); + expect(data.butterflies).toBeDefined(); + expect(data.butterflies).toBeInstanceOf(DropperMap); + expectTypeOf(data.butterflies).toEqualTypeOf(); + expect(data.cabin).toBeDefined(); + expect(data.cabin).toBeInstanceOf(DropperMap); + expectTypeOf(data.cabin).toEqualTypeOf(); + expect(data.castle).toBeDefined(); + expect(data.castle).toBeInstanceOf(DropperMap); + expectTypeOf(data.castle).toEqualTypeOf(); + expect(data.city).toBeDefined(); + expect(data.city).toBeInstanceOf(DropperMap); + expectTypeOf(data.city).toEqualTypeOf(); + expect(data.distance).toBeDefined(); + expect(data.distance).toBeInstanceOf(DropperMap); + expectTypeOf(data.distance).toEqualTypeOf(); + expect(data.distortion).toBeDefined(); + expect(data.distortion).toBeInstanceOf(DropperMap); + expectTypeOf(data.distortion).toEqualTypeOf(); + expect(data.drainage).toBeDefined(); + expect(data.drainage).toBeInstanceOf(DropperMap); + expectTypeOf(data.drainage).toEqualTypeOf(); + expect(data.emoji).toBeDefined(); + expect(data.emoji).toBeInstanceOf(DropperMap); + expectTypeOf(data.emoji).toEqualTypeOf(); + expect(data.factory).toBeDefined(); + expect(data.factory).toBeInstanceOf(DropperMap); + expectTypeOf(data.factory).toEqualTypeOf(); + expect(data.floatingIslands).toBeDefined(); + expect(data.floatingIslands).toBeInstanceOf(DropperMap); + expectTypeOf(data.floatingIslands).toEqualTypeOf(); + expect(data.flytrap).toBeDefined(); + expect(data.flytrap).toBeInstanceOf(DropperMap); + expectTypeOf(data.flytrap).toEqualTypeOf(); + expect(data.frogspawn).toBeDefined(); + expect(data.frogspawn).toBeInstanceOf(DropperMap); + expectTypeOf(data.frogspawn).toEqualTypeOf(); + expect(data.gears).toBeDefined(); + expect(data.gears).toBeInstanceOf(DropperMap); + expectTypeOf(data.gears).toEqualTypeOf(); + expect(data.geometry).toBeDefined(); + expect(data.geometry).toBeInstanceOf(DropperMap); + expectTypeOf(data.geometry).toEqualTypeOf(); + expect(data.glacier).toBeDefined(); + expect(data.glacier).toBeInstanceOf(DropperMap); + expectTypeOf(data.glacier).toEqualTypeOf(); + expect(data.hellgate).toBeDefined(); + expect(data.hellgate).toBeInstanceOf(DropperMap); + expectTypeOf(data.hellgate).toEqualTypeOf(); + expect(data.illusion).toBeDefined(); + expect(data.illusion).toBeInstanceOf(DropperMap); + expectTypeOf(data.illusion).toEqualTypeOf(); + expect(data.iris).toBeDefined(); + expect(data.iris).toBeInstanceOf(DropperMap); + expectTypeOf(data.iris).toEqualTypeOf(); + expect(data.kingDommines).toBeDefined(); + expect(data.kingDommines).toBeInstanceOf(DropperMap); + expectTypeOf(data.kingDommines).toEqualTypeOf(); + expect(data.kingsPass).toBeDefined(); + expect(data.kingsPass).toBeInstanceOf(DropperMap); + expectTypeOf(data.kingsPass).toEqualTypeOf(); + expect(data.kraken).toBeDefined(); + expect(data.kraken).toBeInstanceOf(DropperMap); + expectTypeOf(data.kraken).toEqualTypeOf(); + expect(data.launchZone).toBeDefined(); + expect(data.launchZone).toBeInstanceOf(DropperMap); + expectTypeOf(data.launchZone).toEqualTypeOf(); + expect(data.lavaFall).toBeDefined(); + expect(data.lavaFall).toBeInstanceOf(DropperMap); + expectTypeOf(data.lavaFall).toEqualTypeOf(); + expect(data.lily).toBeDefined(); + expect(data.lily).toBeInstanceOf(DropperMap); + expectTypeOf(data.lily).toEqualTypeOf(); + expect(data.maelstrom).toBeDefined(); + expect(data.maelstrom).toBeInstanceOf(DropperMap); + expectTypeOf(data.maelstrom).toEqualTypeOf(); + expect(data.mainframe).toBeDefined(); + expect(data.mainframe).toBeInstanceOf(DropperMap); + expectTypeOf(data.mainframe).toEqualTypeOf(); + expect(data.microscope).toBeDefined(); + expect(data.microscope).toBeInstanceOf(DropperMap); + expectTypeOf(data.microscope).toEqualTypeOf(); + expect(data.mineshaft).toBeDefined(); + expect(data.mineshaft).toBeInstanceOf(DropperMap); + expectTypeOf(data.mineshaft).toEqualTypeOf(); + expect(data.mushroom).toBeDefined(); + expect(data.mushroom).toBeInstanceOf(DropperMap); + expectTypeOf(data.mushroom).toEqualTypeOf(); + expect(data.nightlife).toBeDefined(); + expect(data.nightlife).toBeInstanceOf(DropperMap); + expectTypeOf(data.nightlife).toEqualTypeOf(); + expect(data.ocean).toBeDefined(); + expect(data.ocean).toBeInstanceOf(DropperMap); + expectTypeOf(data.ocean).toEqualTypeOf(); + expect(data.overgrown).toBeDefined(); + expect(data.overgrown).toBeInstanceOf(DropperMap); + expectTypeOf(data.overgrown).toEqualTypeOf(); + expect(data.painted).toBeDefined(); + expect(data.painted).toBeInstanceOf(DropperMap); + expectTypeOf(data.painted).toEqualTypeOf(); + expect(data.paradigm).toBeDefined(); + expect(data.paradigm).toBeInstanceOf(DropperMap); + expectTypeOf(data.paradigm).toEqualTypeOf(); + expect(data.plughole).toBeDefined(); + expect(data.plughole).toBeInstanceOf(DropperMap); + expectTypeOf(data.plughole).toEqualTypeOf(); + expect(data.raindrops).toBeDefined(); + expect(data.raindrops).toBeInstanceOf(DropperMap); + expectTypeOf(data.raindrops).toEqualTypeOf(); + expect(data.ravine).toBeDefined(); + expect(data.ravine).toBeInstanceOf(DropperMap); + expectTypeOf(data.ravine).toEqualTypeOf(); + expect(data.retro).toBeDefined(); + expect(data.retro).toBeInstanceOf(DropperMap); + expectTypeOf(data.retro).toEqualTypeOf(); + expect(data.revolve).toBeDefined(); + expect(data.revolve).toBeInstanceOf(DropperMap); + expectTypeOf(data.revolve).toEqualTypeOf(); + expect(data.sandWorm).toBeDefined(); + expect(data.sandWorm).toBeInstanceOf(DropperMap); + expectTypeOf(data.sandWorm).toEqualTypeOf(); + expect(data.sewer).toBeDefined(); + expect(data.sewer).toBeInstanceOf(DropperMap); + expectTypeOf(data.sewer).toEqualTypeOf(); + expect(data.space).toBeDefined(); + expect(data.space).toBeInstanceOf(DropperMap); + expectTypeOf(data.space).toEqualTypeOf(); + expect(data.stratocumulus).toBeDefined(); + expect(data.stratocumulus).toBeInstanceOf(DropperMap); + expectTypeOf(data.stratocumulus).toEqualTypeOf(); + expect(data.sweets).toBeDefined(); + expect(data.sweets).toBeInstanceOf(DropperMap); + expectTypeOf(data.sweets).toEqualTypeOf(); + expect(data.tangle).toBeDefined(); + expect(data.tangle).toBeInstanceOf(DropperMap); + expectTypeOf(data.tangle).toEqualTypeOf(); + expect(data.time).toBeDefined(); + expect(data.time).toBeInstanceOf(DropperMap); + expectTypeOf(data.time).toEqualTypeOf(); + expect(data.toilet).toBeDefined(); + expect(data.toilet).toBeInstanceOf(DropperMap); + expectTypeOf(data.toilet).toEqualTypeOf(); + expect(data.ufo).toBeDefined(); + expect(data.ufo).toBeInstanceOf(DropperMap); + expectTypeOf(data.ufo).toEqualTypeOf(); + expect(data.upsideDown).toBeDefined(); + expect(data.upsideDown).toBeInstanceOf(DropperMap); + expectTypeOf(data.upsideDown).toEqualTypeOf(); + expect(data.vintage).toBeDefined(); + expect(data.vintage).toBeInstanceOf(DropperMap); + expectTypeOf(data.vintage).toEqualTypeOf(); + expect(data.vortex).toBeDefined(); + expect(data.vortex).toBeInstanceOf(DropperMap); + expectTypeOf(data.vortex).toEqualTypeOf(); + expect(data.warp).toBeDefined(); + expect(data.warp).toBeInstanceOf(DropperMap); + expectTypeOf(data.warp).toEqualTypeOf(); + expect(data.warPortal).toBeDefined(); + expect(data.warPortal).toBeInstanceOf(DropperMap); + expectTypeOf(data.warPortal).toEqualTypeOf(); + expect(data.well).toBeDefined(); + expect(data.well).toBeInstanceOf(DropperMap); + expectTypeOf(data.well).toEqualTypeOf(); + expect(data.western).toBeDefined(); + expect(data.western).toBeInstanceOf(DropperMap); + expectTypeOf(data.western).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/Dropper/DropperMap.test.ts b/src/Structures/MiniGames/Arcade/Dropper/DropperMap.test.ts new file mode 100644 index 000000000..c924e43e2 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/Dropper/DropperMap.test.ts @@ -0,0 +1,15 @@ +import DropperMap from './DropperMap.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('DropperMap', () => { + const data = new DropperMap({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(DropperMap); + expectTypeOf(data).toEqualTypeOf(); + expect(data.bestTime).toBeDefined(); + expect(data.bestTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bestTime).toEqualTypeOf(); + expect(data.completions).toBeDefined(); + expect(data.completions).toBeGreaterThanOrEqual(0); + expectTypeOf(data.completions).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/Dtt.test.ts b/src/Structures/MiniGames/Arcade/Dtt.test.ts new file mode 100644 index 000000000..1e84a2995 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/Dtt.test.ts @@ -0,0 +1,15 @@ +import Dtt from './Dtt.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Dtt', () => { + const data = new Dtt({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Dtt); + expectTypeOf(data).toEqualTypeOf(); + expect(data.dropdown).toBeDefined(); + expectTypeOf(data.dropdown).toEqualTypeOf(); + expect(data.filter).toBeDefined(); + expectTypeOf(data.filter).toEqualTypeOf(); + expect(data.music).toBeDefined(); + expectTypeOf(data.music).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/EasterSimulator.test.ts b/src/Structures/MiniGames/Arcade/EasterSimulator.test.ts new file mode 100644 index 000000000..7ef58ce73 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/EasterSimulator.test.ts @@ -0,0 +1,15 @@ +import EasterSimulator from './EasterSimulator.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('EasterSimulator', () => { + const data = new EasterSimulator({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(EasterSimulator); + expectTypeOf(data).toEqualTypeOf(); + expect(data.eggsFound).toBeDefined(); + expect(data.eggsFound).toBeGreaterThanOrEqual(0); + expectTypeOf(data.eggsFound).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/EnderSpleef.test.ts b/src/Structures/MiniGames/Arcade/EnderSpleef.test.ts new file mode 100644 index 000000000..6683305ff --- /dev/null +++ b/src/Structures/MiniGames/Arcade/EnderSpleef.test.ts @@ -0,0 +1,27 @@ +import EnderSpleef from './EnderSpleef.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { ArcadeEnderSpleefTrail } from '../../../Types/Player.js'; + +test('EnderSpleef', () => { + const data = new EnderSpleef({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(EnderSpleef); + expectTypeOf(data).toEqualTypeOf(); + expect(data.bigshotPowerupActivations).toBeDefined(); + expect(data.bigshotPowerupActivations).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bigshotPowerupActivations).toEqualTypeOf(); + expect(data.blocksDestroyed).toBeDefined(); + expect(data.blocksDestroyed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksDestroyed).toEqualTypeOf(); + expect(data.spleefTrail).toBeDefined(); + expectTypeOf(data.spleefTrail).toEqualTypeOf(); + expect(data.powerupActivations).toBeDefined(); + expect(data.powerupActivations).toBeGreaterThanOrEqual(0); + expectTypeOf(data.powerupActivations).toEqualTypeOf(); + expect(data.tripleshotPowerupActivations).toBeDefined(); + expect(data.tripleshotPowerupActivations).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tripleshotPowerupActivations).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/FarmHunt.test.ts b/src/Structures/MiniGames/Arcade/FarmHunt.test.ts new file mode 100644 index 000000000..8317d6c7d --- /dev/null +++ b/src/Structures/MiniGames/Arcade/FarmHunt.test.ts @@ -0,0 +1,60 @@ +import FarmHunt from './FarmHunt.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('FarmHunt', () => { + const data = new FarmHunt({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(FarmHunt); + expectTypeOf(data).toEqualTypeOf(); + expect(data.animalBowKills).toBeDefined(); + expect(data.animalBowKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.animalBowKills).toEqualTypeOf(); + expect(data.animalKills).toBeDefined(); + expect(data.animalKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.animalKills).toEqualTypeOf(); + expect(data.animalWins).toBeDefined(); + expect(data.animalWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.animalWins).toEqualTypeOf(); + expect(data.animalsBowKills).toBeDefined(); + expect(data.animalsBowKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.animalsBowKills).toEqualTypeOf(); + expect(data.bowKills).toBeDefined(); + expect(data.bowKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowKills).toEqualTypeOf(); + expect(data.dangerousTauntsUsed).toBeDefined(); + expect(data.dangerousTauntsUsed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.dangerousTauntsUsed).toEqualTypeOf(); + expect(data.fireworkTauntsUsed).toBeDefined(); + expect(data.fireworkTauntsUsed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fireworkTauntsUsed).toEqualTypeOf(); + expect(data.hunterBowKills).toBeDefined(); + expect(data.hunterBowKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hunterBowKills).toEqualTypeOf(); + expect(data.hunterKills).toBeDefined(); + expect(data.hunterKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hunterKills).toEqualTypeOf(); + expect(data.hunterWins).toBeDefined(); + expect(data.hunterWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hunterWins).toEqualTypeOf(); + expect(data.huntersBowKills).toBeDefined(); + expect(data.huntersBowKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.huntersBowKills).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.poopCollected).toBeDefined(); + expect(data.poopCollected).toBeGreaterThanOrEqual(0); + expectTypeOf(data.poopCollected).toEqualTypeOf(); + expect(data.riskyTauntsUsed).toBeDefined(); + expect(data.riskyTauntsUsed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.riskyTauntsUsed).toEqualTypeOf(); + expect(data.safeTauntsUsed).toBeDefined(); + expect(data.safeTauntsUsed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.safeTauntsUsed).toEqualTypeOf(); + expect(data.tauntsUsed).toBeDefined(); + expect(data.tauntsUsed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tauntsUsed).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/FootBall.test.ts b/src/Structures/MiniGames/Arcade/FootBall.test.ts new file mode 100644 index 000000000..81275f5a3 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/FootBall.test.ts @@ -0,0 +1,21 @@ +import FootBall from './FootBall.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('FootBall', () => { + const data = new FootBall({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(FootBall); + expectTypeOf(data).toEqualTypeOf(); + expect(data.goals).toBeDefined(); + expect(data.goals).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goals).toEqualTypeOf(); + expect(data.kicks).toBeDefined(); + expect(data.kicks).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kicks).toEqualTypeOf(); + expect(data.powerkicks).toBeDefined(); + expect(data.powerkicks).toBeGreaterThanOrEqual(0); + expectTypeOf(data.powerkicks).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/GalaxyWars.test.ts b/src/Structures/MiniGames/Arcade/GalaxyWars.test.ts new file mode 100644 index 000000000..389df472d --- /dev/null +++ b/src/Structures/MiniGames/Arcade/GalaxyWars.test.ts @@ -0,0 +1,45 @@ +import GalaxyWars from './GalaxyWars.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GalaxyWars', () => { + const data = new GalaxyWars({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GalaxyWars); + expectTypeOf(data).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.empireKills).toBeDefined(); + expect(data.empireKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.empireKills).toEqualTypeOf(); + expect(data.gameWins).toBeDefined(); + expect(data.gameWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gameWins).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.monthlyKills).toBeDefined(); + expect(data.monthlyKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.monthlyKills).toEqualTypeOf(); + expect(data.monthlyKillsA).toBeDefined(); + expect(data.monthlyKillsA).toBeGreaterThanOrEqual(0); + expectTypeOf(data.monthlyKillsA).toEqualTypeOf(); + expect(data.monthlyKillsB).toBeDefined(); + expect(data.monthlyKillsB).toBeGreaterThanOrEqual(0); + expectTypeOf(data.monthlyKillsB).toEqualTypeOf(); + expect(data.rebelKills).toBeDefined(); + expect(data.rebelKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rebelKills).toEqualTypeOf(); + expect(data.shotsFired).toBeDefined(); + expect(data.shotsFired).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shotsFired).toEqualTypeOf(); + expect(data.weeklyKills).toBeDefined(); + expect(data.weeklyKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.weeklyKills).toEqualTypeOf(); + expect(data.weeklyKillsA).toBeDefined(); + expect(data.weeklyKillsA).toBeGreaterThanOrEqual(0); + expectTypeOf(data.weeklyKillsA).toEqualTypeOf(); + expect(data.weeklyKillsB).toBeDefined(); + expect(data.weeklyKillsB).toBeGreaterThanOrEqual(0); + expectTypeOf(data.weeklyKillsB).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/GrinchSimulator.test.ts b/src/Structures/MiniGames/Arcade/GrinchSimulator.test.ts new file mode 100644 index 000000000..5aaad3f3b --- /dev/null +++ b/src/Structures/MiniGames/Arcade/GrinchSimulator.test.ts @@ -0,0 +1,33 @@ +import GrinchSimulator from './GrinchSimulator.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GrinchSimulator', () => { + const data = new GrinchSimulator({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GrinchSimulator); + expectTypeOf(data).toEqualTypeOf(); + expect(data.gifts).toBeDefined(); + expect(data.gifts).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gifts).toEqualTypeOf(); + expect(data.giftsTourney).toBeDefined(); + expect(data.giftsTourney).toBeGreaterThanOrEqual(0); + expectTypeOf(data.giftsTourney).toEqualTypeOf(); + expect(data.giftsTourneyGrinchSimulator1).toBeDefined(); + expect(data.giftsTourneyGrinchSimulator1).toBeGreaterThanOrEqual(0); + expectTypeOf(data.giftsTourneyGrinchSimulator1).toEqualTypeOf(); + expect(data.lossesTourney).toBeDefined(); + expect(data.lossesTourney).toBeGreaterThanOrEqual(0); + expectTypeOf(data.lossesTourney).toEqualTypeOf(); + expect(data.lossesTourneyGrinchSimulator1).toBeDefined(); + expect(data.lossesTourneyGrinchSimulator1).toBeGreaterThanOrEqual(0); + expectTypeOf(data.lossesTourneyGrinchSimulator1).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.winsTourney).toBeDefined(); + expect(data.winsTourney).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsTourney).toEqualTypeOf(); + expect(data.winsTourneyGrinchSimulator1).toBeDefined(); + expect(data.winsTourneyGrinchSimulator1).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsTourneyGrinchSimulator1).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/HalloweenSimulator.test.ts b/src/Structures/MiniGames/Arcade/HalloweenSimulator.test.ts new file mode 100644 index 000000000..4da551cff --- /dev/null +++ b/src/Structures/MiniGames/Arcade/HalloweenSimulator.test.ts @@ -0,0 +1,15 @@ +import HalloweenSimulator from './HalloweenSimulator.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('HalloweenSimulator', () => { + const data = new HalloweenSimulator({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(HalloweenSimulator); + expectTypeOf(data).toEqualTypeOf(); + expect(data.candyFound).toBeDefined(); + expect(data.candyFound).toBeGreaterThanOrEqual(0); + expectTypeOf(data.candyFound).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/HideAndSeek.test.ts b/src/Structures/MiniGames/Arcade/HideAndSeek.test.ts new file mode 100644 index 000000000..c6d57fdc1 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/HideAndSeek.test.ts @@ -0,0 +1,27 @@ +import HideAndSeek from './HideAndSeek.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('HideAndSeek', () => { + const data = new HideAndSeek({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(HideAndSeek); + expectTypeOf(data).toEqualTypeOf(); + expect(data.hiderWins).toBeDefined(); + expect(data.hiderWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hiderWins).toEqualTypeOf(); + expect(data.partyPooperHiderWins).toBeDefined(); + expect(data.partyPooperHiderWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.partyPooperHiderWins).toEqualTypeOf(); + expect(data.partyPooperSeekerWins).toBeDefined(); + expect(data.partyPooperSeekerWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.partyPooperSeekerWins).toEqualTypeOf(); + expect(data.propHuntHiderWins).toBeDefined(); + expect(data.propHuntHiderWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.propHuntHiderWins).toEqualTypeOf(); + expect(data.propHuntSeekerWins).toBeDefined(); + expect(data.propHuntSeekerWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.propHuntSeekerWins).toEqualTypeOf(); + expect(data.seekerWins).toBeDefined(); + expect(data.seekerWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.seekerWins).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/HoleInTheWall.test.ts b/src/Structures/MiniGames/Arcade/HoleInTheWall.test.ts new file mode 100644 index 000000000..f0228654c --- /dev/null +++ b/src/Structures/MiniGames/Arcade/HoleInTheWall.test.ts @@ -0,0 +1,24 @@ +import HoleInTheWall from './HoleInTheWall.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { ArcadeHoleInTheWallColor } from '../../../Types/Player.js'; + +test('HoleInTheWall', () => { + const data = new HoleInTheWall({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(HoleInTheWall); + expectTypeOf(data).toEqualTypeOf(); + expect(data.rounds).toBeDefined(); + expect(data.rounds).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rounds).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.color).toBeDefined(); + expectTypeOf(data.color).toEqualTypeOf(); + expect(data.recordF).toBeDefined(); + expect(data.recordF).toBeGreaterThanOrEqual(0); + expectTypeOf(data.recordF).toEqualTypeOf(); + expect(data.recordQ).toBeDefined(); + expect(data.recordQ).toBeGreaterThanOrEqual(0); + expectTypeOf(data.recordQ).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/HypixelSports.test.ts b/src/Structures/MiniGames/Arcade/HypixelSports.test.ts new file mode 100644 index 000000000..c00488298 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/HypixelSports.test.ts @@ -0,0 +1,12 @@ +import HypixelSports from './HypixelSports.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('HypixelSports', () => { + const data = new HypixelSports({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(HypixelSports); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/MiniWalls.test.ts b/src/Structures/MiniGames/Arcade/MiniWalls.test.ts new file mode 100644 index 000000000..a58bfc1c2 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/MiniWalls.test.ts @@ -0,0 +1,59 @@ +import MiniWalls from './MiniWalls.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('MiniWalls', () => { + const data = new MiniWalls({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(MiniWalls); + expectTypeOf(data).toEqualTypeOf(); + expect(data.arrowsHit).toBeDefined(); + expect(data.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arrowsHit).toEqualTypeOf(); + expect(data.arrowsHitTourney0).toBeDefined(); + expect(data.arrowsHitTourney0).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arrowsHitTourney0).toEqualTypeOf(); + expect(data.arrowsShot).toBeDefined(); + expect(data.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arrowsShot).toEqualTypeOf(); + expect(data.arrowsShotTourney0).toBeDefined(); + expect(data.arrowsShotTourney0).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arrowsShotTourney0).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.deathsTourney0).toBeDefined(); + expect(data.deathsTourney0).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deathsTourney0).toEqualTypeOf(); + expect(data.finalKills).toBeDefined(); + expect(data.finalKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.finalKills).toEqualTypeOf(); + expect(data.finalKillsTourney0).toBeDefined(); + expect(data.finalKillsTourney0).toBeGreaterThanOrEqual(0); + expectTypeOf(data.finalKillsTourney0).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.killsTourney0).toBeDefined(); + expect(data.killsTourney0).toBeGreaterThanOrEqual(0); + expectTypeOf(data.killsTourney0).toEqualTypeOf(); + expect(data.inventoryLayout).toBeDefined(); + expectTypeOf(data.inventoryLayout).toEqualTypeOf>(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.winsTourney0).toBeDefined(); + expect(data.winsTourney0).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsTourney0).toEqualTypeOf(); + expect(data.witherDamage).toBeDefined(); + expect(data.witherDamage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.witherDamage).toEqualTypeOf(); + expect(data.witherDamageTourney0).toBeDefined(); + expect(data.witherDamageTourney0).toBeGreaterThanOrEqual(0); + expectTypeOf(data.witherDamageTourney0).toEqualTypeOf(); + expect(data.witherKills).toBeDefined(); + expect(data.witherKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.witherKills).toEqualTypeOf(); + expect(data.witherKillsTourney0).toBeDefined(); + expect(data.witherKillsTourney0).toBeGreaterThanOrEqual(0); + expectTypeOf(data.witherKillsTourney0).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/OneInTheQuiver.test.ts b/src/Structures/MiniGames/Arcade/OneInTheQuiver.test.ts new file mode 100644 index 000000000..7266b9d2a --- /dev/null +++ b/src/Structures/MiniGames/Arcade/OneInTheQuiver.test.ts @@ -0,0 +1,27 @@ +import OneInTheQuiver from './OneInTheQuiver.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('OneInTheQuiver', () => { + const data = new OneInTheQuiver({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(OneInTheQuiver); + expectTypeOf(data).toEqualTypeOf(); + expect(data.bountyKills).toBeDefined(); + expect(data.bountyKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bountyKills).toEqualTypeOf(); + expect(data.bowKills).toBeDefined(); + expect(data.bowKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowKills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.swordKills).toBeDefined(); + expect(data.swordKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.swordKills).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/PartyGames/LawnMoower.test.ts b/src/Structures/MiniGames/Arcade/PartyGames/LawnMoower.test.ts new file mode 100644 index 000000000..6010da68a --- /dev/null +++ b/src/Structures/MiniGames/Arcade/PartyGames/LawnMoower.test.ts @@ -0,0 +1,9 @@ +import LawnMoower from './LawnMoower.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('LawnMoower', () => { + const data = new LawnMoower({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(LawnMoower); + expectTypeOf(data).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/PartyGames/PartyGames.test.ts b/src/Structures/MiniGames/Arcade/PartyGames/PartyGames.test.ts new file mode 100644 index 000000000..d23aca4ef --- /dev/null +++ b/src/Structures/MiniGames/Arcade/PartyGames/PartyGames.test.ts @@ -0,0 +1,90 @@ +import LawnMoower from './LawnMoower.js'; +import PartyGames from './PartyGames.js'; +import PartyGamesGame from './PartyGamesGame.js'; +import RPG16 from './RPG16.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PartyGames', () => { + const data = new PartyGames({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PartyGames); + expectTypeOf(data).toEqualTypeOf(); + expect(data.animalSlaughter).toBeDefined(); + expect(data.animalSlaughter).toBeInstanceOf(PartyGamesGame); + expectTypeOf(data.animalSlaughter).toEqualTypeOf(); + expect(data.anvilSpleef).toBeDefined(); + expect(data.anvilSpleef).toBeInstanceOf(PartyGamesGame); + expectTypeOf(data.anvilSpleef).toEqualTypeOf(); + expect(data.avalanche).toBeDefined(); + expect(data.avalanche).toBeInstanceOf(PartyGamesGame); + expectTypeOf(data.avalanche).toEqualTypeOf(); + expect(data.bombardment).toBeDefined(); + expect(data.bombardment).toBeInstanceOf(PartyGamesGame); + expectTypeOf(data.bombardment).toEqualTypeOf(); + expect(data.cannonPainting).toBeDefined(); + expect(data.cannonPainting).toBeInstanceOf(PartyGamesGame); + expectTypeOf(data.cannonPainting).toEqualTypeOf(); + expect(data.chickenRings).toBeDefined(); + expect(data.chickenRings).toBeInstanceOf(PartyGamesGame); + expectTypeOf(data.chickenRings).toEqualTypeOf(); + expect(data.dive).toBeDefined(); + expect(data.dive).toBeInstanceOf(PartyGamesGame); + expectTypeOf(data.dive).toEqualTypeOf(); + expect(data.fireLeapers).toBeDefined(); + expect(data.fireLeapers).toBeInstanceOf(PartyGamesGame); + expectTypeOf(data.fireLeapers).toEqualTypeOf(); + expect(data.frozenFloor).toBeDefined(); + expect(data.frozenFloor).toBeInstanceOf(PartyGamesGame); + expectTypeOf(data.frozenFloor).toEqualTypeOf(); + expect(data.highGround).toBeDefined(); + expect(data.highGround).toBeInstanceOf(PartyGamesGame); + expectTypeOf(data.highGround).toEqualTypeOf(); + expect(data.hoeHoeHoe).toBeDefined(); + expect(data.hoeHoeHoe).toBeInstanceOf(PartyGamesGame); + expectTypeOf(data.hoeHoeHoe).toEqualTypeOf(); + expect(data.jigsawRush).toBeDefined(); + expect(data.jigsawRush).toBeInstanceOf(PartyGamesGame); + expectTypeOf(data.jigsawRush).toEqualTypeOf(); + expect(data.jungleJump).toBeDefined(); + expect(data.jungleJump).toBeInstanceOf(PartyGamesGame); + expectTypeOf(data.jungleJump).toEqualTypeOf(); + expect(data.labEscape).toBeDefined(); + expect(data.labEscape).toBeInstanceOf(PartyGamesGame); + expectTypeOf(data.labEscape).toEqualTypeOf(); + expect(data.lawnMoower).toBeDefined(); + expect(data.lawnMoower).toBeInstanceOf(LawnMoower); + expectTypeOf(data.lawnMoower).toEqualTypeOf(); + expect(data.minecartRacing).toBeDefined(); + expect(data.minecartRacing).toBeInstanceOf(PartyGamesGame); + expectTypeOf(data.minecartRacing).toEqualTypeOf(); + expect(data.pigFishing).toBeDefined(); + expect(data.pigFishing).toBeInstanceOf(PartyGamesGame); + expectTypeOf(data.pigFishing).toEqualTypeOf(); + expect(data.pigJousting).toBeDefined(); + expect(data.pigJousting).toBeInstanceOf(PartyGamesGame); + expectTypeOf(data.pigJousting).toEqualTypeOf(); + expect(data.rpg16).toBeDefined(); + expect(data.rpg16).toBeInstanceOf(RPG16); + expectTypeOf(data.rpg16).toEqualTypeOf(); + expect(data.shootingRange).toBeDefined(); + expect(data.shootingRange).toBeInstanceOf(PartyGamesGame); + expectTypeOf(data.shootingRange).toEqualTypeOf(); + expect(data.spiderMaze).toBeDefined(); + expect(data.spiderMaze).toBeInstanceOf(PartyGamesGame); + expectTypeOf(data.spiderMaze).toEqualTypeOf(); + expect(data.superSheep).toBeDefined(); + expect(data.superSheep).toBeInstanceOf(PartyGamesGame); + expectTypeOf(data.superSheep).toEqualTypeOf(); + expect(data.theFloorIsLava).toBeDefined(); + expect(data.theFloorIsLava).toBeInstanceOf(PartyGamesGame); + expectTypeOf(data.theFloorIsLava).toEqualTypeOf(); + expect(data.trampolinio).toBeDefined(); + expect(data.trampolinio).toBeInstanceOf(PartyGamesGame); + expectTypeOf(data.trampolinio).toEqualTypeOf(); + expect(data.volcano).toBeDefined(); + expect(data.volcano).toBeInstanceOf(PartyGamesGame); + expectTypeOf(data.volcano).toEqualTypeOf(); + expect(data.workshop).toBeDefined(); + expect(data.workshop).toBeInstanceOf(PartyGamesGame); + expectTypeOf(data.workshop).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/PartyGames/PartyGamesGame.test.ts b/src/Structures/MiniGames/Arcade/PartyGames/PartyGamesGame.test.ts new file mode 100644 index 000000000..36a9c3d22 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/PartyGames/PartyGamesGame.test.ts @@ -0,0 +1,24 @@ +import PartyGamesGame from './PartyGamesGame.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PartyGamesGame', () => { + const data = new PartyGamesGame({ stats: 'meow' }, 'animal_slaughter'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PartyGamesGame); + expectTypeOf(data).toEqualTypeOf(); + expect(data.bestScore).toBeDefined(); + expect(data.bestScore).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bestScore).toEqualTypeOf(); + expect(data.bestTime).toBeDefined(); + expect(data.bestTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bestTime).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.roundWins).toBeDefined(); + expect(data.roundWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.roundWins).toEqualTypeOf(); + expect(data.totalScore).toBeDefined(); + expect(data.totalScore).toBeGreaterThanOrEqual(0); + expectTypeOf(data.totalScore).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/PartyGames/RPG16.test.ts b/src/Structures/MiniGames/Arcade/PartyGames/RPG16.test.ts new file mode 100644 index 000000000..15b5a3d35 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/PartyGames/RPG16.test.ts @@ -0,0 +1,9 @@ +import RPG16 from './RPG16.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('RPG16', () => { + const data = new RPG16({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RPG16); + expectTypeOf(data).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/SantaSays.test.ts b/src/Structures/MiniGames/Arcade/SantaSays.test.ts new file mode 100644 index 000000000..9bee95aaf --- /dev/null +++ b/src/Structures/MiniGames/Arcade/SantaSays.test.ts @@ -0,0 +1,21 @@ +import SantaSays from './SantaSays.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SantaSays', () => { + const data = new SantaSays({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SantaSays); + expectTypeOf(data).toEqualTypeOf(); + expect(data.roundWins).toBeDefined(); + expect(data.roundWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.roundWins).toEqualTypeOf(); + expect(data.rounds).toBeDefined(); + expect(data.rounds).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rounds).toEqualTypeOf(); + expect(data.topScore).toBeDefined(); + expect(data.topScore).toBeGreaterThanOrEqual(0); + expectTypeOf(data.topScore).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/SantaSimulator.test.ts b/src/Structures/MiniGames/Arcade/SantaSimulator.test.ts new file mode 100644 index 000000000..94a4d4c98 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/SantaSimulator.test.ts @@ -0,0 +1,18 @@ +import SantaSimulator from './SantaSimulator.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SantaSimulator', () => { + const data = new SantaSimulator({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SantaSimulator); + expectTypeOf(data).toEqualTypeOf(); + expect(data.delivered).toBeDefined(); + expect(data.delivered).toBeGreaterThanOrEqual(0); + expectTypeOf(data.delivered).toEqualTypeOf(); + expect(data.spotted).toBeDefined(); + expect(data.spotted).toBeGreaterThanOrEqual(0); + expectTypeOf(data.spotted).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/ScubaSimulator.test.ts b/src/Structures/MiniGames/Arcade/ScubaSimulator.test.ts new file mode 100644 index 000000000..9a05cc4c8 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/ScubaSimulator.test.ts @@ -0,0 +1,18 @@ +import ScubaSimulator from './ScubaSimulator.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('ScubaSimulator', () => { + const data = new ScubaSimulator({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(ScubaSimulator); + expectTypeOf(data).toEqualTypeOf(); + expect(data.itemsFound).toBeDefined(); + expect(data.itemsFound).toBeGreaterThanOrEqual(0); + expectTypeOf(data.itemsFound).toEqualTypeOf(); + expect(data.totalPoints).toBeDefined(); + expect(data.totalPoints).toBeGreaterThanOrEqual(0); + expectTypeOf(data.totalPoints).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/SimonSays.test.ts b/src/Structures/MiniGames/Arcade/SimonSays.test.ts new file mode 100644 index 000000000..9149b5f5f --- /dev/null +++ b/src/Structures/MiniGames/Arcade/SimonSays.test.ts @@ -0,0 +1,21 @@ +import SimonSays from './SimonSays.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SimonSays', () => { + const data = new SimonSays({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SimonSays); + expectTypeOf(data).toEqualTypeOf(); + expect(data.roundWins).toBeDefined(); + expect(data.roundWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.roundWins).toEqualTypeOf(); + expect(data.rounds).toBeDefined(); + expect(data.rounds).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rounds).toEqualTypeOf(); + expect(data.topScore).toBeDefined(); + expect(data.topScore).toBeGreaterThanOrEqual(0); + expectTypeOf(data.topScore).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/Soccer.test.ts b/src/Structures/MiniGames/Arcade/Soccer.test.ts new file mode 100644 index 000000000..e8791af16 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/Soccer.test.ts @@ -0,0 +1,21 @@ +import Soccer from './Soccer.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Soccer', () => { + const data = new Soccer({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Soccer); + expectTypeOf(data).toEqualTypeOf(); + expect(data.goals).toBeDefined(); + expect(data.goals).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goals).toEqualTypeOf(); + expect(data.kicks).toBeDefined(); + expect(data.kicks).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kicks).toEqualTypeOf(); + expect(data.powerkicks).toBeDefined(); + expect(data.powerkicks).toBeGreaterThanOrEqual(0); + expectTypeOf(data.powerkicks).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/ThrowOut.test.ts b/src/Structures/MiniGames/Arcade/ThrowOut.test.ts new file mode 100644 index 000000000..ba9305486 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/ThrowOut.test.ts @@ -0,0 +1,21 @@ +import ThrowOut from './ThrowOut.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { ArcadeThrowOutDisguise } from '../../../Types/Player.js'; + +test('ThrowOut', () => { + const data = new ThrowOut({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(ThrowOut); + expectTypeOf(data).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.disguise).toBeDefined(); + expectTypeOf(data.disguise).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/WoolHunt.test.ts b/src/Structures/MiniGames/Arcade/WoolHunt.test.ts new file mode 100644 index 000000000..0d6ee7a92 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/WoolHunt.test.ts @@ -0,0 +1,77 @@ +import WoolHunt from './WoolHunt.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('WoolHunt', () => { + const data = new WoolHunt({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(WoolHunt); + expectTypeOf(data).toEqualTypeOf(); + expect(data.assists).toBeDefined(); + expect(data.assists).toBeGreaterThanOrEqual(0); + expectTypeOf(data.assists).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.deathsToWoolholder).toBeDefined(); + expect(data.deathsToWoolholder).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deathsToWoolholder).toEqualTypeOf(); + expect(data.deathsWithWool).toBeDefined(); + expect(data.deathsWithWool).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deathsWithWool).toEqualTypeOf(); + expect(data.experiencedDraws).toBeDefined(); + expect(data.experiencedDraws).toBeGreaterThanOrEqual(0); + expectTypeOf(data.experiencedDraws).toEqualTypeOf(); + expect(data.experiencedLosses).toBeDefined(); + expect(data.experiencedLosses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.experiencedLosses).toEqualTypeOf(); + expect(data.experiencedWins).toBeDefined(); + expect(data.experiencedWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.experiencedWins).toEqualTypeOf(); + expect(data.fastestWin).toBeDefined(); + expect(data.fastestWin).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fastestWin).toEqualTypeOf(); + expect(data.fastestWoolCapture).toBeDefined(); + expect(data.fastestWoolCapture).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fastestWoolCapture).toEqualTypeOf(); + expect(data.goldEarned).toBeDefined(); + expect(data.goldEarned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goldEarned).toEqualTypeOf(); + expect(data.goldSpent).toBeDefined(); + expect(data.goldSpent).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goldSpent).toEqualTypeOf(); + expect(data.inventorylayout).toBeDefined(); + expectTypeOf(data.inventorylayout).toEqualTypeOf>(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.killsOnWoolholder).toBeDefined(); + expect(data.killsOnWoolholder).toBeGreaterThanOrEqual(0); + expectTypeOf(data.killsOnWoolholder).toEqualTypeOf(); + expect(data.killsWithWool).toBeDefined(); + expect(data.killsWithWool).toBeGreaterThanOrEqual(0); + expectTypeOf(data.killsWithWool).toEqualTypeOf(); + expect(data.longestGame).toBeDefined(); + expect(data.longestGame).toBeGreaterThanOrEqual(0); + expectTypeOf(data.longestGame).toEqualTypeOf(); + expect(data.mostGoldEarned).toBeDefined(); + expect(data.mostGoldEarned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mostGoldEarned).toEqualTypeOf(); + expect(data.mostKillsAndAssists).toBeDefined(); + expect(data.mostKillsAndAssists).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mostKillsAndAssists).toEqualTypeOf(); + expect(data.participatedDraws).toBeDefined(); + expect(data.participatedDraws).toBeGreaterThanOrEqual(0); + expectTypeOf(data.participatedDraws).toEqualTypeOf(); + expect(data.participatedLosses).toBeDefined(); + expect(data.participatedLosses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.participatedLosses).toEqualTypeOf(); + expect(data.participatedWins).toBeDefined(); + expect(data.participatedWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.participatedWins).toEqualTypeOf(); + expect(data.woolsCaptured).toBeDefined(); + expect(data.woolsCaptured).toBeGreaterThanOrEqual(0); + expectTypeOf(data.woolsCaptured).toEqualTypeOf(); + expect(data.woolsStolen).toBeDefined(); + expect(data.woolsStolen).toBeGreaterThanOrEqual(0); + expectTypeOf(data.woolsStolen).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/Zombies/Zombies.test.ts b/src/Structures/MiniGames/Arcade/Zombies/Zombies.test.ts new file mode 100644 index 000000000..948dd2c5c --- /dev/null +++ b/src/Structures/MiniGames/Arcade/Zombies/Zombies.test.ts @@ -0,0 +1,326 @@ +import Zombies from './Zombies.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Zombies', () => { + const data = new Zombies({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Zombies); + expectTypeOf(data).toEqualTypeOf(); + expect(data.basicZombieKills).toBeDefined(); + expect(data.basicZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.basicZombieKills).toEqualTypeOf(); + expect(data.basketballZombieKills).toBeDefined(); + expect(data.basketballZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.basketballZombieKills).toEqualTypeOf(); + expect(data.bestRoundZombies).toBeDefined(); + expect(data.bestRoundZombies).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bestRoundZombies).toEqualTypeOf(); + expect(data.blazeZombieKills).toBeDefined(); + expect(data.blazeZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blazeZombieKills).toEqualTypeOf(); + expect(data.blobZombieKills).toBeDefined(); + expect(data.blobZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blobZombieKills).toEqualTypeOf(); + expect(data.bombZombieKills).toBeDefined(); + expect(data.bombZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bombZombieKills).toEqualTypeOf(); + expect(data.broodmotherZombieKills).toBeDefined(); + expect(data.broodmotherZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.broodmotherZombieKills).toEqualTypeOf(); + expect(data.bulletsHit).toBeDefined(); + expect(data.bulletsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bulletsHit).toEqualTypeOf(); + expect(data.bulletsShot).toBeDefined(); + expect(data.bulletsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bulletsShot).toEqualTypeOf(); + expect(data.caveSpiderZombieKills).toBeDefined(); + expect(data.caveSpiderZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.caveSpiderZombieKills).toEqualTypeOf(); + expect(data.chargedCreeperZombieKills).toBeDefined(); + expect(data.chargedCreeperZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.chargedCreeperZombieKills).toEqualTypeOf(); + expect(data.chglugluZombieKills).toBeDefined(); + expect(data.chglugluZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.chglugluZombieKills).toEqualTypeOf(); + expect(data.clownZombieKills).toBeDefined(); + expect(data.clownZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.clownZombieKills).toEqualTypeOf(); + expect(data.corruptedPigmanZombieKills).toBeDefined(); + expect(data.corruptedPigmanZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.corruptedPigmanZombieKills).toEqualTypeOf(); + expect(data.creeperZombieKills).toBeDefined(); + expect(data.creeperZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.creeperZombieKills).toEqualTypeOf(); + expect(data.daBombZombieKills).toBeDefined(); + expect(data.daBombZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.daBombZombieKills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.doorsOpened).toBeDefined(); + expect(data.doorsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.doorsOpened).toEqualTypeOf(); + expect(data.drownedZombieKills).toBeDefined(); + expect(data.drownedZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.drownedZombieKills).toEqualTypeOf(); + expect(data.empoweredZombieKills).toBeDefined(); + expect(data.empoweredZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.empoweredZombieKills).toEqualTypeOf(); + expect(data.enderZombieKills).toBeDefined(); + expect(data.enderZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.enderZombieKills).toEqualTypeOf(); + expect(data.endermiteZombieKills).toBeDefined(); + expect(data.endermiteZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.endermiteZombieKills).toEqualTypeOf(); + expect(data.familyDaughterZombieKills).toBeDefined(); + expect(data.familyDaughterZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.familyDaughterZombieKills).toEqualTypeOf(); + expect(data.familyFatherZombieKills).toBeDefined(); + expect(data.familyFatherZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.familyFatherZombieKills).toEqualTypeOf(); + expect(data.familyMotherZombieKills).toBeDefined(); + expect(data.familyMotherZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.familyMotherZombieKills).toEqualTypeOf(); + expect(data.familyTwinBlueZombieKills).toBeDefined(); + expect(data.familyTwinBlueZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.familyTwinBlueZombieKills).toEqualTypeOf(); + expect(data.familyTwinRedZombieKills).toBeDefined(); + expect(data.familyTwinRedZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.familyTwinRedZombieKills).toEqualTypeOf(); + expect(data.fastestTime10).toBeDefined(); + expect(data.fastestTime10).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fastestTime10).toEqualTypeOf(); + expect(data.fastestTime20).toBeDefined(); + expect(data.fastestTime20).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fastestTime20).toEqualTypeOf(); + expect(data.fastestTime30).toBeDefined(); + expect(data.fastestTime30).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fastestTime30).toEqualTypeOf(); + expect(data.fireLordZombieKills).toBeDefined(); + expect(data.fireLordZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fireLordZombieKills).toEqualTypeOf(); + expect(data.fireZombieKills).toBeDefined(); + expect(data.fireZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fireZombieKills).toEqualTypeOf(); + expect(data.frostZombieZombieKills).toBeDefined(); + expect(data.frostZombieZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.frostZombieZombieKills).toEqualTypeOf(); + expect(data.ghastZombieKills).toBeDefined(); + expect(data.ghastZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ghastZombieKills).toEqualTypeOf(); + expect(data.giantRainbowZombieKills).toBeDefined(); + expect(data.giantRainbowZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.giantRainbowZombieKills).toEqualTypeOf(); + expect(data.giantZombieKills).toBeDefined(); + expect(data.giantZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.giantZombieKills).toEqualTypeOf(); + expect(data.guardZombieZombieKills).toBeDefined(); + expect(data.guardZombieZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.guardZombieZombieKills).toEqualTypeOf(); + expect(data.guardianZombieKills).toBeDefined(); + expect(data.guardianZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.guardianZombieKills).toEqualTypeOf(); + expect(data.headlessPigmanZombieKills).toBeDefined(); + expect(data.headlessPigmanZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.headlessPigmanZombieKills).toEqualTypeOf(); + expect(data.headshots).toBeDefined(); + expect(data.headshots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.headshots).toEqualTypeOf(); + expect(data.herobrineMinionZombieKills).toBeDefined(); + expect(data.herobrineMinionZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.herobrineMinionZombieKills).toEqualTypeOf(); + expect(data.herobrineZombieKills).toBeDefined(); + expect(data.herobrineZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.herobrineZombieKills).toEqualTypeOf(); + expect(data.humanZombieKills).toBeDefined(); + expect(data.humanZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.humanZombieKills).toEqualTypeOf(); + expect(data.infernoPigmanZombieKills).toBeDefined(); + expect(data.infernoPigmanZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.infernoPigmanZombieKills).toEqualTypeOf(); + expect(data.infernoZombieKills).toBeDefined(); + expect(data.infernoZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.infernoZombieKills).toEqualTypeOf(); + expect(data.invisibleZombieKills).toBeDefined(); + expect(data.invisibleZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.invisibleZombieKills).toEqualTypeOf(); + expect(data.ironGolemZombieKills).toBeDefined(); + expect(data.ironGolemZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ironGolemZombieKills).toEqualTypeOf(); + expect(data.kingDrownedZombieKills).toBeDefined(); + expect(data.kingDrownedZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kingDrownedZombieKills).toEqualTypeOf(); + expect(data.kingSlimeZombieKills).toBeDefined(); + expect(data.kingSlimeZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kingSlimeZombieKills).toEqualTypeOf(); + expect(data.knightDrownedZombieKills).toBeDefined(); + expect(data.knightDrownedZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.knightDrownedZombieKills).toEqualTypeOf(); + expect(data.magmaCubeZombieKills).toBeDefined(); + expect(data.magmaCubeZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.magmaCubeZombieKills).toEqualTypeOf(); + expect(data.magmaZombieKills).toBeDefined(); + expect(data.magmaZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.magmaZombieKills).toEqualTypeOf(); + expect(data.mcdonaldsPigmanZombieKills).toBeDefined(); + expect(data.mcdonaldsPigmanZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mcdonaldsPigmanZombieKills).toEqualTypeOf(); + expect(data.mcdonaldsZombieZombieKills).toBeDefined(); + expect(data.mcdonaldsZombieZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mcdonaldsZombieZombieKills).toEqualTypeOf(); + expect(data.megaBlobZombieKills).toBeDefined(); + expect(data.megaBlobZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megaBlobZombieKills).toEqualTypeOf(); + expect(data.megaMagmaZombieKills).toBeDefined(); + expect(data.megaMagmaZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megaMagmaZombieKills).toEqualTypeOf(); + expect(data.moltenZombieKills).toBeDefined(); + expect(data.moltenZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.moltenZombieKills).toEqualTypeOf(); + expect(data.murderPigmanZombieKills).toBeDefined(); + expect(data.murderPigmanZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.murderPigmanZombieKills).toEqualTypeOf(); + expect(data.murderZombieZombieKills).toBeDefined(); + expect(data.murderZombieZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.murderZombieZombieKills).toEqualTypeOf(); + expect(data.nurseZombieZombieKills).toBeDefined(); + expect(data.nurseZombieZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.nurseZombieZombieKills).toEqualTypeOf(); + expect(data.pigZombieZombieKills).toBeDefined(); + expect(data.pigZombieZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pigZombieZombieKills).toEqualTypeOf(); + expect(data.playersRevived).toBeDefined(); + expect(data.playersRevived).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playersRevived).toEqualTypeOf(); + expect(data.prisonerPigman2CellZombieKills).toBeDefined(); + expect(data.prisonerPigman2CellZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.prisonerPigman2CellZombieKills).toEqualTypeOf(); + expect(data.prisonerPigman2ZombieKills).toBeDefined(); + expect(data.prisonerPigman2ZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.prisonerPigman2ZombieKills).toEqualTypeOf(); + expect(data.prisonerPigmanCellZombieKills).toBeDefined(); + expect(data.prisonerPigmanCellZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.prisonerPigmanCellZombieKills).toEqualTypeOf(); + expect(data.prisonerPigmanZombieKills).toBeDefined(); + expect(data.prisonerPigmanZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.prisonerPigmanZombieKills).toEqualTypeOf(); + expect(data.prisonerSkeletonZombieKills).toBeDefined(); + expect(data.prisonerSkeletonZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.prisonerSkeletonZombieKills).toEqualTypeOf(); + expect(data.prisonerZombieAngry2ZombieKills).toBeDefined(); + expect(data.prisonerZombieAngry2ZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.prisonerZombieAngry2ZombieKills).toEqualTypeOf(); + expect(data.prisonerZombieAngry3ZombieKills).toBeDefined(); + expect(data.prisonerZombieAngry3ZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.prisonerZombieAngry3ZombieKills).toEqualTypeOf(); + expect(data.prisonerZombieAngryZombieKills).toBeDefined(); + expect(data.prisonerZombieAngryZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.prisonerZombieAngryZombieKills).toEqualTypeOf(); + expect(data.prisonerZombieCellZombieKills).toBeDefined(); + expect(data.prisonerZombieCellZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.prisonerZombieCellZombieKills).toEqualTypeOf(); + expect(data.prisonerZombieKills).toBeDefined(); + expect(data.prisonerZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.prisonerZombieKills).toEqualTypeOf(); + expect(data.rainbowZombieKills).toBeDefined(); + expect(data.rainbowZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rainbowZombieKills).toEqualTypeOf(); + expect(data.scubaZombieKills).toBeDefined(); + expect(data.scubaZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scubaZombieKills).toEqualTypeOf(); + expect(data.sentinelZombieKills).toBeDefined(); + expect(data.sentinelZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sentinelZombieKills).toEqualTypeOf(); + expect(data.shadySkeletonZombieKills).toBeDefined(); + expect(data.shadySkeletonZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shadySkeletonZombieKills).toEqualTypeOf(); + expect(data.silverfishZombieKills).toBeDefined(); + expect(data.silverfishZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.silverfishZombieKills).toEqualTypeOf(); + expect(data.skelefishZombieKills).toBeDefined(); + expect(data.skelefishZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skelefishZombieKills).toEqualTypeOf(); + expect(data.skeletonZombieKills).toBeDefined(); + expect(data.skeletonZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skeletonZombieKills).toEqualTypeOf(); + expect(data.slimeZombieKills).toBeDefined(); + expect(data.slimeZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slimeZombieKills).toEqualTypeOf(); + expect(data.slimeZombieZombieKills).toBeDefined(); + expect(data.slimeZombieZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slimeZombieZombieKills).toEqualTypeOf(); + expect(data.spaceBlasterZombieKills).toBeDefined(); + expect(data.spaceBlasterZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.spaceBlasterZombieKills).toEqualTypeOf(); + expect(data.spaceGruntZombieKills).toBeDefined(); + expect(data.spaceGruntZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.spaceGruntZombieKills).toEqualTypeOf(); + expect(data.tankDrownedZombieKills).toBeDefined(); + expect(data.tankDrownedZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tankDrownedZombieKills).toEqualTypeOf(); + expect(data.tankZombieZombieKills).toBeDefined(); + expect(data.tankZombieZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tankZombieZombieKills).toEqualTypeOf(); + expect(data.theOldOneZombieKills).toBeDefined(); + expect(data.theOldOneZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.theOldOneZombieKills).toEqualTypeOf(); + expect(data.theWardenZombieKills).toBeDefined(); + expect(data.theWardenZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.theWardenZombieKills).toEqualTypeOf(); + expect(data.timesKnockedDown).toBeDefined(); + expect(data.timesKnockedDown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.timesKnockedDown).toEqualTypeOf(); + expect(data.tntBabyZombieKills).toBeDefined(); + expect(data.tntBabyZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tntBabyZombieKills).toEqualTypeOf(); + expect(data.tntZombieKills).toBeDefined(); + expect(data.tntZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tntZombieKills).toEqualTypeOf(); + expect(data.totalRoundsSurvived).toBeDefined(); + expect(data.totalRoundsSurvived).toBeGreaterThanOrEqual(0); + expectTypeOf(data.totalRoundsSurvived).toEqualTypeOf(); + expect(data.werewolfZombieKills).toBeDefined(); + expect(data.werewolfZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.werewolfZombieKills).toEqualTypeOf(); + expect(data.windowsRepaired).toBeDefined(); + expect(data.windowsRepaired).toBeGreaterThanOrEqual(0); + expectTypeOf(data.windowsRepaired).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.witchZombieKills).toBeDefined(); + expect(data.witchZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.witchZombieKills).toEqualTypeOf(); + expect(data.witherSkeletonZombieKills).toBeDefined(); + expect(data.witherSkeletonZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.witherSkeletonZombieKills).toEqualTypeOf(); + expect(data.witherZombieKills).toBeDefined(); + expect(data.witherZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.witherZombieKills).toEqualTypeOf(); + expect(data.witherZombieZombieKills).toBeDefined(); + expect(data.witherZombieZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.witherZombieZombieKills).toEqualTypeOf(); + expect(data.wolfDrownedZombieKills).toBeDefined(); + expect(data.wolfDrownedZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wolfDrownedZombieKills).toEqualTypeOf(); + expect(data.wolfPetZombieKills).toBeDefined(); + expect(data.wolfPetZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wolfPetZombieKills).toEqualTypeOf(); + expect(data.wolfZombieKills).toBeDefined(); + expect(data.wolfZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wolfZombieKills).toEqualTypeOf(); + expect(data.worldEnderZombieKills).toBeDefined(); + expect(data.worldEnderZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.worldEnderZombieKills).toEqualTypeOf(); + expect(data.wormSmallZombieKills).toBeDefined(); + expect(data.wormSmallZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wormSmallZombieKills).toEqualTypeOf(); + expect(data.wormZombieKills).toBeDefined(); + expect(data.wormZombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wormZombieKills).toEqualTypeOf(); + expect(data.zombieKills).toBeDefined(); + expect(data.zombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.zombieKills).toEqualTypeOf(); + expect(data.hideTutorials).toBeDefined(); + expectTypeOf(data.hideTutorials).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/Zombies/ZombiesMap.test.ts b/src/Structures/MiniGames/Arcade/Zombies/ZombiesMap.test.ts new file mode 100644 index 000000000..b2a660405 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/Zombies/ZombiesMap.test.ts @@ -0,0 +1,42 @@ +import ZombiesMap from './ZombiesMap.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('ZombiesMap', () => { + const data = new ZombiesMap({ stats: 'meow' }, 'alienarcadium'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(ZombiesMap); + expectTypeOf(data).toEqualTypeOf(); + expect(data.bestRoundZombies).toBeDefined(); + expect(data.bestRoundZombies).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bestRoundZombies).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.fastestTime10).toBeDefined(); + expect(data.fastestTime10).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fastestTime10).toEqualTypeOf(); + expect(data.fastestTime20).toBeDefined(); + expect(data.fastestTime20).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fastestTime20).toEqualTypeOf(); + expect(data.fastestTime30).toBeDefined(); + expect(data.fastestTime30).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fastestTime30).toEqualTypeOf(); + expect(data.playersRevived).toBeDefined(); + expect(data.playersRevived).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playersRevived).toEqualTypeOf(); + expect(data.timesKnockedDown).toBeDefined(); + expect(data.timesKnockedDown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.timesKnockedDown).toEqualTypeOf(); + expect(data.totalRoundsSurvived).toBeDefined(); + expect(data.totalRoundsSurvived).toBeGreaterThanOrEqual(0); + expectTypeOf(data.totalRoundsSurvived).toEqualTypeOf(); + expect(data.windowsRepaired).toBeDefined(); + expect(data.windowsRepaired).toBeGreaterThanOrEqual(0); + expectTypeOf(data.windowsRepaired).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.zombieKills).toBeDefined(); + expect(data.zombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.zombieKills).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/Zombies/ZombiesMap.ts b/src/Structures/MiniGames/Arcade/Zombies/ZombiesMap.ts index 25dce8842..cdfec52cd 100644 --- a/src/Structures/MiniGames/Arcade/Zombies/ZombiesMap.ts +++ b/src/Structures/MiniGames/Arcade/Zombies/ZombiesMap.ts @@ -13,17 +13,17 @@ class ZombiesMap { wins: number; zombieKills: number; constructor(data: Record, map: ArcadeZombiesMaps) { - this.bestRoundZombies = data?.[`best_round_zombies_${map}`]; - this.deaths = data?.[`deaths_zombies_${map}`]; - this.fastestTime10 = data?.[`fastest_time_10_zombies_${map}`]; - this.fastestTime20 = data?.[`fastest_time_20_zombies_${map}`]; - this.fastestTime30 = data?.[`fastest_time_30_zombies_${map}`]; - this.playersRevived = data?.[`players_revived_zombies_${map}`]; - this.timesKnockedDown = data?.[`times_knocked_down_zombies_${map}`]; - this.totalRoundsSurvived = data?.[`total_rounds_survived_zombies_${map}`]; - this.windowsRepaired = data?.[`windows_repaired_zombies_${map}`]; - this.wins = data?.[`wins_zombies_${map}`]; - this.zombieKills = data?.[`zombie_kills_zombies_${map}`]; + this.bestRoundZombies = data?.[`best_round_zombies_${map}`] || 0; + this.deaths = data?.[`deaths_zombies_${map}`] || 0; + this.fastestTime10 = data?.[`fastest_time_10_zombies_${map}`] || 0; + this.fastestTime20 = data?.[`fastest_time_20_zombies_${map}`] || 0; + this.fastestTime30 = data?.[`fastest_time_30_zombies_${map}`] || 0; + this.playersRevived = data?.[`players_revived_zombies_${map}`] || 0; + this.timesKnockedDown = data?.[`times_knocked_down_zombies_${map}`] || 0; + this.totalRoundsSurvived = data?.[`total_rounds_survived_zombies_${map}`] || 0; + this.windowsRepaired = data?.[`windows_repaired_zombies_${map}`] || 0; + this.wins = data?.[`wins_zombies_${map}`] || 0; + this.zombieKills = data?.[`zombie_kills_zombies_${map}`] || 0; } } diff --git a/src/Structures/MiniGames/ArenaBrawl/ArenaBrawl.test.ts b/src/Structures/MiniGames/ArenaBrawl/ArenaBrawl.test.ts index ae753df14..41550fba6 100644 --- a/src/Structures/MiniGames/ArenaBrawl/ArenaBrawl.test.ts +++ b/src/Structures/MiniGames/ArenaBrawl/ArenaBrawl.test.ts @@ -5,6 +5,7 @@ import type { ArenaBrawlRunes } from '../../../Types/Player.js'; test('ArenaBrawl', () => { const data = new ArenaBrawl({ stats: 'meow' }); + expect(data).toBeDefined(); expect(data).toBeInstanceOf(ArenaBrawl); expectTypeOf(data).toEqualTypeOf(); expect(data.coins).toBeDefined(); @@ -25,9 +26,12 @@ test('ArenaBrawl', () => { expect(data.rune).toBeDefined(); expectTypeOf(data.rune).toEqualTypeOf(); expect(data['1v1']).toBeDefined(); + expect(data['1v1']).toBeInstanceOf(ArenaBrawlMode); expectTypeOf(data['1v1']).toEqualTypeOf(); expect(data['2v2']).toBeDefined(); + expect(data['2v2']).toBeInstanceOf(ArenaBrawlMode); expectTypeOf(data['2v2']).toEqualTypeOf(); expect(data['4v4']).toBeDefined(); + expect(data['4v4']).toBeInstanceOf(ArenaBrawlMode); expectTypeOf(data['4v4']).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/BedWars/BedWars.test.ts b/src/Structures/MiniGames/BedWars/BedWars.test.ts index f7e070bb4..ee969a01d 100644 --- a/src/Structures/MiniGames/BedWars/BedWars.test.ts +++ b/src/Structures/MiniGames/BedWars/BedWars.test.ts @@ -9,6 +9,7 @@ import type { BedWarsPrestige } from '../../../Types/Player.js'; test('BedWars', () => { const data = new BedWars({ stats: 'meow' }); + expect(data).toBeDefined(); expect(data).toBeInstanceOf(BedWars); expectTypeOf(data).toEqualTypeOf(); expect(data.tokens).toBeDefined(); @@ -73,12 +74,18 @@ test('BedWars', () => { expect(data.fours).toBeDefined(); expect(data.fours).toBeInstanceOf(BedWarsMode); expectTypeOf(data.fours).toEqualTypeOf(); + expect(data['4v4']).toBeDefined(); + expect(data['4v4']).toBeInstanceOf(BedWarsMode); + expectTypeOf(data['4v4']).toEqualTypeOf(); expect(data.dream).toBeDefined(); expect(data.dream).toBeInstanceOf(BedWarsDreamStats); expectTypeOf(data.dream).toEqualTypeOf(); expect(data.castle).toBeDefined(); expect(data.castle).toBeInstanceOf(BedWarsMode); expectTypeOf(data.castle).toEqualTypeOf(); + expect(data.oneBlock).toBeDefined(); + expect(data.oneBlock).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.oneBlock).toEqualTypeOf(); expect(data.practice).toBeDefined(); expect(data.practice).toBeInstanceOf(BedWarsPracticeStats); expectTypeOf(data.practice).toEqualTypeOf(); diff --git a/src/Structures/MiniGames/BedWars/BedWarsBeds.test.ts b/src/Structures/MiniGames/BedWars/BedWarsBeds.test.ts new file mode 100644 index 000000000..4ebbe74e4 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsBeds.test.ts @@ -0,0 +1,18 @@ +import BedWarsBeds from './BedWarsBeds.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsBeds', () => { + const data = new BedWarsBeds({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsBeds); + expectTypeOf(data).toEqualTypeOf(); + expect(data.broken).toBeDefined(); + expect(data.broken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.broken).toEqualTypeOf(); + expect(data.lost).toBeDefined(); + expect(data.lost).toBeGreaterThanOrEqual(0); + expectTypeOf(data.lost).toEqualTypeOf(); + expect(data.BLRatio).toBeDefined(); + expect(data.BLRatio).toBeGreaterThanOrEqual(0); + expectTypeOf(data.BLRatio).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsCollectedItems.test.ts b/src/Structures/MiniGames/BedWars/BedWarsCollectedItems.test.ts new file mode 100644 index 000000000..7cd0d5405 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsCollectedItems.test.ts @@ -0,0 +1,21 @@ +import BedWarsCollectedItems from './BedWarsCollectedItems.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsCollectedItems', () => { + const data = new BedWarsCollectedItems({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsCollectedItems); + expectTypeOf(data).toEqualTypeOf(); + expect(data.iron).toBeDefined(); + expect(data.iron).toBeGreaterThanOrEqual(0); + expectTypeOf(data.iron).toEqualTypeOf(); + expect(data.gold).toBeDefined(); + expect(data.gold).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gold).toEqualTypeOf(); + expect(data.diamond).toBeDefined(); + expect(data.diamond).toBeGreaterThanOrEqual(0); + expectTypeOf(data.diamond).toEqualTypeOf(); + expect(data.emerald).toBeDefined(); + expect(data.emerald).toBeGreaterThanOrEqual(0); + expectTypeOf(data.emerald).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsDreamMode.test.ts b/src/Structures/MiniGames/BedWars/BedWarsDreamMode.test.ts new file mode 100644 index 000000000..27f51dcc1 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsDreamMode.test.ts @@ -0,0 +1,16 @@ +import BedWarsDreamMode from './BedWarsDreamMode.js'; +import BedWarsMode from './BedWarsMode.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsDreamMode', () => { + const data = new BedWarsDreamMode({ stats: 'meow' }, 'armed'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsDreamMode); + expectTypeOf(data).toEqualTypeOf(); + expect(data.doubles).toBeDefined(); + expect(data.doubles).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.doubles).toEqualTypeOf(); + expect(data.fours).toBeDefined(); + expect(data.fours).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.fours).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsDreamStats.test.ts b/src/Structures/MiniGames/BedWars/BedWarsDreamStats.test.ts new file mode 100644 index 000000000..6abe946f2 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsDreamStats.test.ts @@ -0,0 +1,25 @@ +import BedWarsDreamMode from './BedWarsDreamMode.js'; +import BedWarsDreamStats from './BedWarsDreamStats.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsDreamStats', () => { + const data = new BedWarsDreamStats({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsDreamStats); + expectTypeOf(data).toEqualTypeOf(); + expect(data.ultimate).toBeDefined(); + expect(data.ultimate).toBeInstanceOf(BedWarsDreamMode); + expectTypeOf(data.ultimate).toEqualTypeOf(); + expect(data.rush).toBeDefined(); + expect(data.rush).toBeInstanceOf(BedWarsDreamMode); + expectTypeOf(data.rush).toEqualTypeOf(); + expect(data.armed).toBeDefined(); + expect(data.armed).toBeInstanceOf(BedWarsDreamMode); + expectTypeOf(data.armed).toEqualTypeOf(); + expect(data.lucky).toBeDefined(); + expect(data.lucky).toBeInstanceOf(BedWarsDreamMode); + expectTypeOf(data.lucky).toEqualTypeOf(); + expect(data.voidless).toBeDefined(); + expect(data.voidless).toBeInstanceOf(BedWarsDreamMode); + expectTypeOf(data.voidless).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsMode.test.ts b/src/Structures/MiniGames/BedWars/BedWarsMode.test.ts new file mode 100644 index 000000000..292cb3a26 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsMode.test.ts @@ -0,0 +1,49 @@ +import BedWarsBeds from './BedWarsBeds.js'; +import BedWarsMode from './BedWarsMode.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { BedWarsGamemodeName } from '../../../Types/Player.js'; + +test('BedWarsMode', () => { + const data = new BedWarsMode({ stats: 'meow' }, 'castle'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsMode); + expectTypeOf(data).toEqualTypeOf(); + expect(data.mode).toBeDefined(); + expectTypeOf(data.mode).toEqualTypeOf(); + expect(data.winStreak).toBeDefined(); + expect(data.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winStreak).toEqualTypeOf(); + expect(data.playedGames).toBeDefined(); + expect(data.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playedGames).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.finalKills).toBeDefined(); + expect(data.finalKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.finalKills).toEqualTypeOf(); + expect(data.finalDeaths).toBeDefined(); + expect(data.finalDeaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.finalDeaths).toEqualTypeOf(); + expect(data.beds).toBeDefined(); + expect(data.beds).toBeInstanceOf(BedWarsBeds); + expectTypeOf(data.beds).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.FKDR).toBeDefined(); + expect(data.FKDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.FKDR).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBase.test.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBase.test.ts new file mode 100644 index 000000000..104b7c31e --- /dev/null +++ b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBase.test.ts @@ -0,0 +1,13 @@ +import BedWarsPracticeBase from './BedWarsPracticeBase.js'; +import BedWarsPracticeModeAttempts from './BedWarsPracticeModeAttempts.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsPracticeBase', () => { + const data = new BedWarsPracticeBase({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsPracticeBase); + expectTypeOf(data).toEqualTypeOf(); + expect(data.attempts).toBeDefined(); + expect(data.attempts).toBeInstanceOf(BedWarsPracticeModeAttempts); + expectTypeOf(data.attempts).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBaseBlocksPlaced.test.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBaseBlocksPlaced.test.ts new file mode 100644 index 000000000..5cab5a3a4 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBaseBlocksPlaced.test.ts @@ -0,0 +1,12 @@ +import BedWarsPracticeBaseBlocksPlaced from './BedWarsPracticeBaseBlocksPlaced.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsPracticeBaseBlocksPlaced', () => { + const data = new BedWarsPracticeBaseBlocksPlaced({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsPracticeBaseBlocksPlaced); + expectTypeOf(data).toEqualTypeOf(); + expect(data.blocksPlaced).toBeDefined(); + expect(data.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksPlaced).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridging.test.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridging.test.ts new file mode 100644 index 000000000..56a070236 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridging.test.ts @@ -0,0 +1,13 @@ +import BedWarsPracticeBridging from './BedWarsPracticeBridging.js'; +import BedWarsPracticeBridgingRecords from './BedWarsPracticeBridgingRecords.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsPracticeBridging', () => { + const data = new BedWarsPracticeBridging({ stats: 'meow' }, {}); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsPracticeBridging); + expectTypeOf(data).toEqualTypeOf(); + expect(data.records).toBeDefined(); + expect(data.records).toBeInstanceOf(BedWarsPracticeBridgingRecords); + expectTypeOf(data.records).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridgingRecords.test.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridgingRecords.test.ts new file mode 100644 index 000000000..d588fa350 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridgingRecords.test.ts @@ -0,0 +1,19 @@ +import BedWarsPracticeBridgingRecords from './BedWarsPracticeBridgingRecords.js'; +import BedWarsPracticeRecord from './BedWarsPracticeRecord.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsPracticeBridgingRecords', () => { + const data = new BedWarsPracticeBridgingRecords({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsPracticeBridgingRecords); + expectTypeOf(data).toEqualTypeOf(); + expect(data.blocks30).toBeDefined(); + expect(data.blocks30).toBeInstanceOf(BedWarsPracticeRecord); + expectTypeOf(data.blocks30).toEqualTypeOf(); + expect(data.blocks50).toBeDefined(); + expect(data.blocks50).toBeInstanceOf(BedWarsPracticeRecord); + expectTypeOf(data.blocks50).toEqualTypeOf(); + expect(data.blocks100).toBeDefined(); + expect(data.blocks100).toBeInstanceOf(BedWarsPracticeRecord); + expectTypeOf(data.blocks100).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeModeAttempts.test.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeModeAttempts.test.ts new file mode 100644 index 000000000..2f47bdbbe --- /dev/null +++ b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeModeAttempts.test.ts @@ -0,0 +1,18 @@ +import BedWarsPracticeModeAttempts from './BedWarsPracticeModeAttempts.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsPracticeModeAttempts', () => { + const data = new BedWarsPracticeModeAttempts({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsPracticeModeAttempts); + expectTypeOf(data).toEqualTypeOf(); + expect(data.failed).toBeDefined(); + expect(data.failed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.failed).toEqualTypeOf(); + expect(data.successful).toBeDefined(); + expect(data.successful).toBeGreaterThanOrEqual(0); + expectTypeOf(data.successful).toEqualTypeOf(); + expect(data.total).toBeDefined(); + expect(data.total).toBeGreaterThanOrEqual(0); + expectTypeOf(data.total).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecord.test.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecord.test.ts new file mode 100644 index 000000000..6afcab295 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecord.test.ts @@ -0,0 +1,19 @@ +import BedWarsPracticeRecord from './BedWarsPracticeRecord.js'; +import BedWarsPracticeRecordElevation from './BedWarsPracticeRecordElevation.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsPracticeRecord', () => { + const data = new BedWarsPracticeRecord({ stats: 'meow' }, 100); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsPracticeRecord); + expectTypeOf(data).toEqualTypeOf(); + expect(data.elevationNone).toBeDefined(); + expect(data.elevationNone).toBeInstanceOf(BedWarsPracticeRecordElevation); + expectTypeOf(data.elevationNone).toEqualTypeOf(); + expect(data.elevationSlight).toBeDefined(); + expect(data.elevationSlight).toBeInstanceOf(BedWarsPracticeRecordElevation); + expectTypeOf(data.elevationSlight).toEqualTypeOf(); + expect(data.elevationStaircase).toBeDefined(); + expect(data.elevationStaircase).toBeInstanceOf(BedWarsPracticeRecordElevation); + expectTypeOf(data.elevationStaircase).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecordElevation.test.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecordElevation.test.ts new file mode 100644 index 000000000..1af77740b --- /dev/null +++ b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecordElevation.test.ts @@ -0,0 +1,15 @@ +import BedWarsPracticeRecordElevation from './BedWarsPracticeRecordElevation.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsPracticeRecordElevation', () => { + const data = new BedWarsPracticeRecordElevation({ stats: 'meow' }, 30, 'NONE'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsPracticeRecordElevation); + expectTypeOf(data).toEqualTypeOf(); + expect(data.straight).toBeDefined(); + expect(data.straight).toBeGreaterThanOrEqual(0); + expectTypeOf(data.straight).toEqualTypeOf(); + expect(data.diagonal).toBeDefined(); + expect(data.diagonal).toBeGreaterThanOrEqual(0); + expectTypeOf(data.diagonal).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeStats.test.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeStats.test.ts new file mode 100644 index 000000000..0499ea15e --- /dev/null +++ b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeStats.test.ts @@ -0,0 +1,27 @@ +import BedWarsPracticeBase from './BedWarsPracticeBase.js'; +import BedWarsPracticeBaseBlocksPlaced from './BedWarsPracticeBaseBlocksPlaced.js'; +import BedWarsPracticeBridging from './BedWarsPracticeBridging.js'; +import BedWarsPracticeStats from './BedWarsPracticeStats.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { BedWarsPracticeModes } from '../../../../Types/Player.js'; + +test('BedWarsPracticeStats', () => { + const data = new BedWarsPracticeStats({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsPracticeStats); + expectTypeOf(data).toEqualTypeOf(); + expect(data.selected).toBeDefined(); + expectTypeOf(data.selected).toEqualTypeOf(); + expect(data.bridging).toBeDefined(); + expect(data.bridging).toBeInstanceOf(BedWarsPracticeBridging); + expectTypeOf(data.bridging).toEqualTypeOf(); + expect(data.fireballJumping).toBeDefined(); + expect(data.fireballJumping).toBeInstanceOf(BedWarsPracticeBaseBlocksPlaced); + expectTypeOf(data.fireballJumping).toEqualTypeOf(); + expect(data.pearlClutching).toBeDefined(); + expect(data.pearlClutching).toBeInstanceOf(BedWarsPracticeBase); + expectTypeOf(data.pearlClutching).toEqualTypeOf(); + expect(data.MLG).toBeDefined(); + expect(data.MLG).toBeInstanceOf(BedWarsPracticeBaseBlocksPlaced); + expectTypeOf(data.MLG).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.test.ts b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.test.ts index 5ab3a774e..37eeb9632 100644 --- a/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.test.ts +++ b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.test.ts @@ -5,2237 +5,189 @@ import type { BlitzSurvivalGamesKits } from '../../../Types/Player.js'; test('BlitzSurvivalGames', () => { const data = new BlitzSurvivalGames({ stats: 'meow' }); + expect(data).toBeDefined(); expect(data).toBeInstanceOf(BlitzSurvivalGames); expectTypeOf(data).toEqualTypeOf(); expect(data.coins).toBeDefined(); + expect(data.coins).toBeGreaterThanOrEqual(0); expectTypeOf(data.coins).toEqualTypeOf(); expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.kills).toEqualTypeOf(); expect(data.kit).toBeDefined(); expectTypeOf(data.kit).toEqualTypeOf(); expect(data.killsSolo).toBeDefined(); + expect(data.killsSolo).toBeGreaterThanOrEqual(0); expectTypeOf(data.killsSolo).toEqualTypeOf(); expect(data.killsTeams).toBeDefined(); + expect(data.killsTeams).toBeGreaterThanOrEqual(0); expectTypeOf(data.killsTeams).toEqualTypeOf(); expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); expectTypeOf(data.deaths).toEqualTypeOf(); expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); expectTypeOf(data.KDR).toEqualTypeOf(); expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); expectTypeOf(data.wins).toEqualTypeOf(); expect(data.winsSolo).toBeDefined(); + expect(data.winsSolo).toBeGreaterThanOrEqual(0); expectTypeOf(data.winsSolo).toEqualTypeOf(); expect(data.winsTeam).toBeDefined(); + expect(data.winsTeam).toBeGreaterThanOrEqual(0); expectTypeOf(data.winsTeam).toEqualTypeOf(); expect(data.gamesPlayed).toBeDefined(); + expect(data.gamesPlayed).toBeGreaterThanOrEqual(0); expectTypeOf(data.gamesPlayed).toEqualTypeOf(); expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); expectTypeOf(data.losses).toEqualTypeOf(); expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); expectTypeOf(data.WLR).toEqualTypeOf(); expect(data.arrowsShot).toBeDefined(); + expect(data.arrowsShot).toBeGreaterThanOrEqual(0); expectTypeOf(data.arrowsShot).toEqualTypeOf(); expect(data.arrowsHit).toBeDefined(); + expect(data.arrowsHit).toBeGreaterThanOrEqual(0); expectTypeOf(data.arrowsHit).toEqualTypeOf(); expect(data.bowAccuracy).toBeDefined(); + expect(data.bowAccuracy).toBeGreaterThanOrEqual(0); expectTypeOf(data.bowAccuracy).toEqualTypeOf(); expect(data.damage).toBeDefined(); + expect(data.damage).toBeGreaterThanOrEqual(0); expectTypeOf(data.damage).toEqualTypeOf(); expect(data.damageTaken).toBeDefined(); + expect(data.damageTaken).toBeGreaterThanOrEqual(0); expectTypeOf(data.damageTaken).toEqualTypeOf(); expect(data.potionsDrunk).toBeDefined(); + expect(data.potionsDrunk).toBeGreaterThanOrEqual(0); expectTypeOf(data.potionsDrunk).toEqualTypeOf(); expect(data.potionsThrown).toBeDefined(); + expect(data.potionsThrown).toBeGreaterThanOrEqual(0); expectTypeOf(data.potionsThrown).toEqualTypeOf(); expect(data.mobsSpawned).toBeDefined(); + expect(data.mobsSpawned).toBeGreaterThanOrEqual(0); expectTypeOf(data.mobsSpawned).toEqualTypeOf(); expect(data.playTime).toBeDefined(); + expect(data.playTime).toBeGreaterThanOrEqual(0); expectTypeOf(data.playTime).toEqualTypeOf(); expect(data.blitzUses).toBeDefined(); + expect(data.blitzUses).toBeGreaterThanOrEqual(0); expectTypeOf(data.blitzUses).toEqualTypeOf(); expect(data.chestsOpened).toBeDefined(); + expect(data.chestsOpened).toBeGreaterThanOrEqual(0); expectTypeOf(data.chestsOpened).toEqualTypeOf(); expect(data.archer).toBeDefined(); + expect(data.archer).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.archer).toEqualTypeOf(); - expect(data.archer.level).toBeDefined(); - expect(data.archer.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.archer.level).toEqualTypeOf(); - expect(data.archer.exp).toBeDefined(); - expect(data.archer.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.archer.exp).toEqualTypeOf(); - expect(data.archer.kills).toBeDefined(); - expect(data.archer.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.archer.kills).toEqualTypeOf(); - expect(data.archer.deaths).toBeDefined(); - expect(data.archer.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.archer.deaths).toEqualTypeOf(); - expect(data.archer.KDR).toBeDefined(); - expect(data.archer.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.archer.KDR).toEqualTypeOf(); - expect(data.archer.wins).toBeDefined(); - expect(data.archer.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.archer.wins).toEqualTypeOf(); - expect(data.archer.gamesPlayed).toBeDefined(); - expect(data.archer.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.archer.gamesPlayed).toEqualTypeOf(); - expect(data.archer.losses).toBeDefined(); - expect(data.archer.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.archer.losses).toEqualTypeOf(); - expect(data.archer.WLR).toBeDefined(); - expect(data.archer.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.archer.WLR).toEqualTypeOf(); - expect(data.archer.arrowsShot).toBeDefined(); - expect(data.archer.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.archer.arrowsShot).toEqualTypeOf(); - expect(data.archer.arrowsHit).toBeDefined(); - expect(data.archer.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.archer.arrowsHit).toEqualTypeOf(); - expect(data.archer.bowAccuracy).toBeDefined(); - expect(data.archer.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.archer.bowAccuracy).toEqualTypeOf(); - expect(data.archer.damage).toBeDefined(); - expect(data.archer.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.archer.damage).toEqualTypeOf(); - expect(data.archer.damageTaken).toBeDefined(); - expect(data.archer.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.archer.damageTaken).toEqualTypeOf(); - expect(data.archer.potionsDrunk).toBeDefined(); - expect(data.archer.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.archer.potionsDrunk).toEqualTypeOf(); - expect(data.archer.potionsThrown).toBeDefined(); - expect(data.archer.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.archer.potionsThrown).toEqualTypeOf(); - expect(data.archer.playTime).toBeDefined(); - expect(data.archer.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.archer.playTime).toEqualTypeOf(); - expect(data.archer.mobsSpawned).toBeDefined(); - expect(data.archer.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.archer.mobsSpawned).toEqualTypeOf(); - expect(data.archer.chestsOpened).toBeDefined(); - expect(data.archer.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.archer.chestsOpened).toEqualTypeOf(); expect(data.meatmaster).toBeDefined(); + expect(data.meatmaster).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.meatmaster).toEqualTypeOf(); - expect(data.meatmaster.level).toBeDefined(); - expect(data.meatmaster.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.meatmaster.level).toEqualTypeOf(); - expect(data.meatmaster.exp).toBeDefined(); - expect(data.meatmaster.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.meatmaster.exp).toEqualTypeOf(); - expect(data.meatmaster.kills).toBeDefined(); - expect(data.meatmaster.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.meatmaster.kills).toEqualTypeOf(); - expect(data.meatmaster.deaths).toBeDefined(); - expect(data.meatmaster.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.meatmaster.deaths).toEqualTypeOf(); - expect(data.meatmaster.KDR).toBeDefined(); - expect(data.meatmaster.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.meatmaster.KDR).toEqualTypeOf(); - expect(data.meatmaster.wins).toBeDefined(); - expect(data.meatmaster.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.meatmaster.wins).toEqualTypeOf(); - expect(data.meatmaster.gamesPlayed).toBeDefined(); - expect(data.meatmaster.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.meatmaster.gamesPlayed).toEqualTypeOf(); - expect(data.meatmaster.losses).toBeDefined(); - expect(data.meatmaster.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.meatmaster.losses).toEqualTypeOf(); - expect(data.meatmaster.WLR).toBeDefined(); - expect(data.meatmaster.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.meatmaster.WLR).toEqualTypeOf(); - expect(data.meatmaster.arrowsShot).toBeDefined(); - expect(data.meatmaster.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.meatmaster.arrowsShot).toEqualTypeOf(); - expect(data.meatmaster.arrowsHit).toBeDefined(); - expect(data.meatmaster.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.meatmaster.arrowsHit).toEqualTypeOf(); - expect(data.meatmaster.bowAccuracy).toBeDefined(); - expect(data.meatmaster.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.meatmaster.bowAccuracy).toEqualTypeOf(); - expect(data.meatmaster.damage).toBeDefined(); - expect(data.meatmaster.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.meatmaster.damage).toEqualTypeOf(); - expect(data.meatmaster.damageTaken).toBeDefined(); - expect(data.meatmaster.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.meatmaster.damageTaken).toEqualTypeOf(); - expect(data.meatmaster.potionsDrunk).toBeDefined(); - expect(data.meatmaster.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.meatmaster.potionsDrunk).toEqualTypeOf(); - expect(data.meatmaster.potionsThrown).toBeDefined(); - expect(data.meatmaster.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.meatmaster.potionsThrown).toEqualTypeOf(); - expect(data.meatmaster.playTime).toBeDefined(); - expect(data.meatmaster.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.meatmaster.playTime).toEqualTypeOf(); - expect(data.meatmaster.mobsSpawned).toBeDefined(); - expect(data.meatmaster.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.meatmaster.mobsSpawned).toEqualTypeOf(); - expect(data.meatmaster.chestsOpened).toBeDefined(); - expect(data.meatmaster.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.meatmaster.chestsOpened).toEqualTypeOf(); expect(data.speleologist).toBeDefined(); + expect(data.speleologist).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.speleologist).toEqualTypeOf(); - expect(data.speleologist.level).toBeDefined(); - expect(data.speleologist.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.speleologist.level).toEqualTypeOf(); - expect(data.speleologist.exp).toBeDefined(); - expect(data.speleologist.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.speleologist.exp).toEqualTypeOf(); - expect(data.speleologist.kills).toBeDefined(); - expect(data.speleologist.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.speleologist.kills).toEqualTypeOf(); - expect(data.speleologist.deaths).toBeDefined(); - expect(data.speleologist.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.speleologist.deaths).toEqualTypeOf(); - expect(data.speleologist.KDR).toBeDefined(); - expect(data.speleologist.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.speleologist.KDR).toEqualTypeOf(); - expect(data.speleologist.wins).toBeDefined(); - expect(data.speleologist.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.speleologist.wins).toEqualTypeOf(); - expect(data.speleologist.gamesPlayed).toBeDefined(); - expect(data.speleologist.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.speleologist.gamesPlayed).toEqualTypeOf(); - expect(data.speleologist.losses).toBeDefined(); - expect(data.speleologist.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.speleologist.losses).toEqualTypeOf(); - expect(data.speleologist.WLR).toBeDefined(); - expect(data.speleologist.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.speleologist.WLR).toEqualTypeOf(); - expect(data.speleologist.arrowsShot).toBeDefined(); - expect(data.speleologist.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.speleologist.arrowsShot).toEqualTypeOf(); - expect(data.speleologist.arrowsHit).toBeDefined(); - expect(data.speleologist.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.speleologist.arrowsHit).toEqualTypeOf(); - expect(data.speleologist.bowAccuracy).toBeDefined(); - expect(data.speleologist.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.speleologist.bowAccuracy).toEqualTypeOf(); - expect(data.speleologist.damage).toBeDefined(); - expect(data.speleologist.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.speleologist.damage).toEqualTypeOf(); - expect(data.speleologist.damageTaken).toBeDefined(); - expect(data.speleologist.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.speleologist.damageTaken).toEqualTypeOf(); - expect(data.speleologist.potionsDrunk).toBeDefined(); - expect(data.speleologist.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.speleologist.potionsDrunk).toEqualTypeOf(); - expect(data.speleologist.potionsThrown).toBeDefined(); - expect(data.speleologist.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.speleologist.potionsThrown).toEqualTypeOf(); - expect(data.speleologist.playTime).toBeDefined(); - expect(data.speleologist.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.speleologist.playTime).toEqualTypeOf(); - expect(data.speleologist.mobsSpawned).toBeDefined(); - expect(data.speleologist.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.speleologist.mobsSpawned).toEqualTypeOf(); - expect(data.speleologist.chestsOpened).toBeDefined(); - expect(data.speleologist.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.speleologist.chestsOpened).toEqualTypeOf(); expect(data.baker).toBeDefined(); + expect(data.baker).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.baker).toEqualTypeOf(); - expect(data.baker.level).toBeDefined(); - expect(data.baker.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.baker.level).toEqualTypeOf(); - expect(data.baker.exp).toBeDefined(); - expect(data.baker.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.baker.exp).toEqualTypeOf(); - expect(data.baker.kills).toBeDefined(); - expect(data.baker.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.baker.kills).toEqualTypeOf(); - expect(data.baker.deaths).toBeDefined(); - expect(data.baker.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.baker.deaths).toEqualTypeOf(); - expect(data.baker.KDR).toBeDefined(); - expect(data.baker.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.baker.KDR).toEqualTypeOf(); - expect(data.baker.wins).toBeDefined(); - expect(data.baker.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.baker.wins).toEqualTypeOf(); - expect(data.baker.gamesPlayed).toBeDefined(); - expect(data.baker.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.baker.gamesPlayed).toEqualTypeOf(); - expect(data.baker.losses).toBeDefined(); - expect(data.baker.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.baker.losses).toEqualTypeOf(); - expect(data.baker.WLR).toBeDefined(); - expect(data.baker.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.baker.WLR).toEqualTypeOf(); - expect(data.baker.arrowsShot).toBeDefined(); - expect(data.baker.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.baker.arrowsShot).toEqualTypeOf(); - expect(data.baker.arrowsHit).toBeDefined(); - expect(data.baker.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.baker.arrowsHit).toEqualTypeOf(); - expect(data.baker.bowAccuracy).toBeDefined(); - expect(data.baker.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.baker.bowAccuracy).toEqualTypeOf(); - expect(data.baker.damage).toBeDefined(); - expect(data.baker.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.baker.damage).toEqualTypeOf(); - expect(data.baker.damageTaken).toBeDefined(); - expect(data.baker.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.baker.damageTaken).toEqualTypeOf(); - expect(data.baker.potionsDrunk).toBeDefined(); - expect(data.baker.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.baker.potionsDrunk).toEqualTypeOf(); - expect(data.baker.potionsThrown).toBeDefined(); - expect(data.baker.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.baker.potionsThrown).toEqualTypeOf(); - expect(data.baker.playTime).toBeDefined(); - expect(data.baker.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.baker.playTime).toEqualTypeOf(); - expect(data.baker.mobsSpawned).toBeDefined(); - expect(data.baker.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.baker.mobsSpawned).toEqualTypeOf(); - expect(data.baker.chestsOpened).toBeDefined(); - expect(data.baker.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.baker.chestsOpened).toEqualTypeOf(); expect(data.knight).toBeDefined(); + expect(data.knight).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.knight).toEqualTypeOf(); - expect(data.knight.level).toBeDefined(); - expect(data.knight.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.knight.level).toEqualTypeOf(); - expect(data.knight.exp).toBeDefined(); - expect(data.knight.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.knight.exp).toEqualTypeOf(); - expect(data.knight.kills).toBeDefined(); - expect(data.knight.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.knight.kills).toEqualTypeOf(); - expect(data.knight.deaths).toBeDefined(); - expect(data.knight.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.knight.deaths).toEqualTypeOf(); - expect(data.knight.KDR).toBeDefined(); - expect(data.knight.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.knight.KDR).toEqualTypeOf(); - expect(data.knight.wins).toBeDefined(); - expect(data.knight.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.knight.wins).toEqualTypeOf(); - expect(data.knight.gamesPlayed).toBeDefined(); - expect(data.knight.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.knight.gamesPlayed).toEqualTypeOf(); - expect(data.knight.losses).toBeDefined(); - expect(data.knight.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.knight.losses).toEqualTypeOf(); - expect(data.knight.WLR).toBeDefined(); - expect(data.knight.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.knight.WLR).toEqualTypeOf(); - expect(data.knight.arrowsShot).toBeDefined(); - expect(data.knight.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.knight.arrowsShot).toEqualTypeOf(); - expect(data.knight.arrowsHit).toBeDefined(); - expect(data.knight.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.knight.arrowsHit).toEqualTypeOf(); - expect(data.knight.bowAccuracy).toBeDefined(); - expect(data.knight.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.knight.bowAccuracy).toEqualTypeOf(); - expect(data.knight.damage).toBeDefined(); - expect(data.knight.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.knight.damage).toEqualTypeOf(); - expect(data.knight.damageTaken).toBeDefined(); - expect(data.knight.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.knight.damageTaken).toEqualTypeOf(); - expect(data.knight.potionsDrunk).toBeDefined(); - expect(data.knight.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.knight.potionsDrunk).toEqualTypeOf(); - expect(data.knight.potionsThrown).toBeDefined(); - expect(data.knight.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.knight.potionsThrown).toEqualTypeOf(); - expect(data.knight.playTime).toBeDefined(); - expect(data.knight.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.knight.playTime).toEqualTypeOf(); - expect(data.knight.mobsSpawned).toBeDefined(); - expect(data.knight.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.knight.mobsSpawned).toEqualTypeOf(); - expect(data.knight.chestsOpened).toBeDefined(); - expect(data.knight.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.knight.chestsOpened).toEqualTypeOf(); expect(data.guardian).toBeDefined(); + expect(data.guardian).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.guardian).toEqualTypeOf(); - expect(data.guardian.level).toBeDefined(); - expect(data.guardian.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.guardian.level).toEqualTypeOf(); - expect(data.guardian.exp).toBeDefined(); - expect(data.guardian.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.guardian.exp).toEqualTypeOf(); - expect(data.guardian.kills).toBeDefined(); - expect(data.guardian.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.guardian.kills).toEqualTypeOf(); - expect(data.guardian.deaths).toBeDefined(); - expect(data.guardian.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.guardian.deaths).toEqualTypeOf(); - expect(data.guardian.KDR).toBeDefined(); - expect(data.guardian.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.guardian.KDR).toEqualTypeOf(); - expect(data.guardian.wins).toBeDefined(); - expect(data.guardian.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.guardian.wins).toEqualTypeOf(); - expect(data.guardian.gamesPlayed).toBeDefined(); - expect(data.guardian.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.guardian.gamesPlayed).toEqualTypeOf(); - expect(data.guardian.losses).toBeDefined(); - expect(data.guardian.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.guardian.losses).toEqualTypeOf(); - expect(data.guardian.WLR).toBeDefined(); - expect(data.guardian.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.guardian.WLR).toEqualTypeOf(); - expect(data.guardian.arrowsShot).toBeDefined(); - expect(data.guardian.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.guardian.arrowsShot).toEqualTypeOf(); - expect(data.guardian.arrowsHit).toBeDefined(); - expect(data.guardian.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.guardian.arrowsHit).toEqualTypeOf(); - expect(data.guardian.bowAccuracy).toBeDefined(); - expect(data.guardian.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.guardian.bowAccuracy).toEqualTypeOf(); - expect(data.guardian.damage).toBeDefined(); - expect(data.guardian.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.guardian.damage).toEqualTypeOf(); - expect(data.guardian.damageTaken).toBeDefined(); - expect(data.guardian.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.guardian.damageTaken).toEqualTypeOf(); - expect(data.guardian.potionsDrunk).toBeDefined(); - expect(data.guardian.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.guardian.potionsDrunk).toEqualTypeOf(); - expect(data.guardian.potionsThrown).toBeDefined(); - expect(data.guardian.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.guardian.potionsThrown).toEqualTypeOf(); - expect(data.guardian.playTime).toBeDefined(); - expect(data.guardian.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.guardian.playTime).toEqualTypeOf(); - expect(data.guardian.mobsSpawned).toBeDefined(); - expect(data.guardian.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.guardian.mobsSpawned).toEqualTypeOf(); - expect(data.guardian.chestsOpened).toBeDefined(); - expect(data.guardian.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.guardian.chestsOpened).toEqualTypeOf(); expect(data.scout).toBeDefined(); + expect(data.scout).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.scout).toEqualTypeOf(); - expect(data.scout.level).toBeDefined(); - expect(data.scout.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.scout.level).toEqualTypeOf(); - expect(data.scout.exp).toBeDefined(); - expect(data.scout.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.scout.exp).toEqualTypeOf(); - expect(data.scout.kills).toBeDefined(); - expect(data.scout.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.scout.kills).toEqualTypeOf(); - expect(data.scout.deaths).toBeDefined(); - expect(data.scout.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.scout.deaths).toEqualTypeOf(); - expect(data.scout.KDR).toBeDefined(); - expect(data.scout.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.scout.KDR).toEqualTypeOf(); - expect(data.scout.wins).toBeDefined(); - expect(data.scout.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.scout.wins).toEqualTypeOf(); - expect(data.scout.gamesPlayed).toBeDefined(); - expect(data.scout.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.scout.gamesPlayed).toEqualTypeOf(); - expect(data.scout.losses).toBeDefined(); - expect(data.scout.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.scout.losses).toEqualTypeOf(); - expect(data.scout.WLR).toBeDefined(); - expect(data.scout.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.scout.WLR).toEqualTypeOf(); - expect(data.scout.arrowsShot).toBeDefined(); - expect(data.scout.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.scout.arrowsShot).toEqualTypeOf(); - expect(data.scout.arrowsHit).toBeDefined(); - expect(data.scout.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.scout.arrowsHit).toEqualTypeOf(); - expect(data.scout.bowAccuracy).toBeDefined(); - expect(data.scout.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.scout.bowAccuracy).toEqualTypeOf(); - expect(data.scout.damage).toBeDefined(); - expect(data.scout.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.scout.damage).toEqualTypeOf(); - expect(data.scout.damageTaken).toBeDefined(); - expect(data.scout.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.scout.damageTaken).toEqualTypeOf(); - expect(data.scout.potionsDrunk).toBeDefined(); - expect(data.scout.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.scout.potionsDrunk).toEqualTypeOf(); - expect(data.scout.potionsThrown).toBeDefined(); - expect(data.scout.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.scout.potionsThrown).toEqualTypeOf(); - expect(data.scout.playTime).toBeDefined(); - expect(data.scout.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.scout.playTime).toEqualTypeOf(); - expect(data.scout.mobsSpawned).toBeDefined(); - expect(data.scout.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.scout.mobsSpawned).toEqualTypeOf(); - expect(data.scout.chestsOpened).toBeDefined(); - expect(data.scout.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.scout.chestsOpened).toEqualTypeOf(); expect(data.hunter).toBeDefined(); + expect(data.hunter).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.hunter).toEqualTypeOf(); - expect(data.hunter.level).toBeDefined(); - expect(data.hunter.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hunter.level).toEqualTypeOf(); - expect(data.hunter.exp).toBeDefined(); - expect(data.hunter.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hunter.exp).toEqualTypeOf(); - expect(data.hunter.kills).toBeDefined(); - expect(data.hunter.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hunter.kills).toEqualTypeOf(); - expect(data.hunter.deaths).toBeDefined(); - expect(data.hunter.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hunter.deaths).toEqualTypeOf(); - expect(data.hunter.KDR).toBeDefined(); - expect(data.hunter.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hunter.KDR).toEqualTypeOf(); - expect(data.hunter.wins).toBeDefined(); - expect(data.hunter.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hunter.wins).toEqualTypeOf(); - expect(data.hunter.gamesPlayed).toBeDefined(); - expect(data.hunter.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hunter.gamesPlayed).toEqualTypeOf(); - expect(data.hunter.losses).toBeDefined(); - expect(data.hunter.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hunter.losses).toEqualTypeOf(); - expect(data.hunter.WLR).toBeDefined(); - expect(data.hunter.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hunter.WLR).toEqualTypeOf(); - expect(data.hunter.arrowsShot).toBeDefined(); - expect(data.hunter.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hunter.arrowsShot).toEqualTypeOf(); - expect(data.hunter.arrowsHit).toBeDefined(); - expect(data.hunter.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hunter.arrowsHit).toEqualTypeOf(); - expect(data.hunter.bowAccuracy).toBeDefined(); - expect(data.hunter.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hunter.bowAccuracy).toEqualTypeOf(); - expect(data.hunter.damage).toBeDefined(); - expect(data.hunter.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hunter.damage).toEqualTypeOf(); - expect(data.hunter.damageTaken).toBeDefined(); - expect(data.hunter.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hunter.damageTaken).toEqualTypeOf(); - expect(data.hunter.potionsDrunk).toBeDefined(); - expect(data.hunter.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hunter.potionsDrunk).toEqualTypeOf(); - expect(data.hunter.potionsThrown).toBeDefined(); - expect(data.hunter.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hunter.potionsThrown).toEqualTypeOf(); - expect(data.hunter.playTime).toBeDefined(); - expect(data.hunter.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hunter.playTime).toEqualTypeOf(); - expect(data.hunter.mobsSpawned).toBeDefined(); - expect(data.hunter.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hunter.mobsSpawned).toEqualTypeOf(); - expect(data.hunter.chestsOpened).toBeDefined(); - expect(data.hunter.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hunter.chestsOpened).toEqualTypeOf(); expect(data.hypeTrain).toBeDefined(); + expect(data.hypeTrain).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.hypeTrain).toEqualTypeOf(); - expect(data.hypeTrain.level).toBeDefined(); - expect(data.hypeTrain.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hypeTrain.level).toEqualTypeOf(); - expect(data.hypeTrain.exp).toBeDefined(); - expect(data.hypeTrain.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hypeTrain.exp).toEqualTypeOf(); - expect(data.hypeTrain.kills).toBeDefined(); - expect(data.hypeTrain.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hypeTrain.kills).toEqualTypeOf(); - expect(data.hypeTrain.deaths).toBeDefined(); - expect(data.hypeTrain.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hypeTrain.deaths).toEqualTypeOf(); - expect(data.hypeTrain.KDR).toBeDefined(); - expect(data.hypeTrain.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hypeTrain.KDR).toEqualTypeOf(); - expect(data.hypeTrain.wins).toBeDefined(); - expect(data.hypeTrain.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hypeTrain.wins).toEqualTypeOf(); - expect(data.hypeTrain.gamesPlayed).toBeDefined(); - expect(data.hypeTrain.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hypeTrain.gamesPlayed).toEqualTypeOf(); - expect(data.hypeTrain.losses).toBeDefined(); - expect(data.hypeTrain.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hypeTrain.losses).toEqualTypeOf(); - expect(data.hypeTrain.WLR).toBeDefined(); - expect(data.hypeTrain.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hypeTrain.WLR).toEqualTypeOf(); - expect(data.hypeTrain.arrowsShot).toBeDefined(); - expect(data.hypeTrain.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hypeTrain.arrowsShot).toEqualTypeOf(); - expect(data.hypeTrain.arrowsHit).toBeDefined(); - expect(data.hypeTrain.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hypeTrain.arrowsHit).toEqualTypeOf(); - expect(data.hypeTrain.bowAccuracy).toBeDefined(); - expect(data.hypeTrain.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hypeTrain.bowAccuracy).toEqualTypeOf(); - expect(data.hypeTrain.damage).toBeDefined(); - expect(data.hypeTrain.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hypeTrain.damage).toEqualTypeOf(); - expect(data.hypeTrain.damageTaken).toBeDefined(); - expect(data.hypeTrain.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hypeTrain.damageTaken).toEqualTypeOf(); - expect(data.hypeTrain.potionsDrunk).toBeDefined(); - expect(data.hypeTrain.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hypeTrain.potionsDrunk).toEqualTypeOf(); - expect(data.hypeTrain.potionsThrown).toBeDefined(); - expect(data.hypeTrain.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hypeTrain.potionsThrown).toEqualTypeOf(); - expect(data.hypeTrain.playTime).toBeDefined(); - expect(data.hypeTrain.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hypeTrain.playTime).toEqualTypeOf(); - expect(data.hypeTrain.mobsSpawned).toBeDefined(); - expect(data.hypeTrain.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hypeTrain.mobsSpawned).toEqualTypeOf(); - expect(data.hypeTrain.chestsOpened).toBeDefined(); - expect(data.hypeTrain.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.hypeTrain.chestsOpened).toEqualTypeOf(); expect(data.fisherman).toBeDefined(); + expect(data.fisherman).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.fisherman).toEqualTypeOf(); - expect(data.fisherman.level).toBeDefined(); - expect(data.fisherman.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fisherman.level).toEqualTypeOf(); - expect(data.fisherman.exp).toBeDefined(); - expect(data.fisherman.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fisherman.exp).toEqualTypeOf(); - expect(data.fisherman.kills).toBeDefined(); - expect(data.fisherman.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fisherman.kills).toEqualTypeOf(); - expect(data.fisherman.deaths).toBeDefined(); - expect(data.fisherman.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fisherman.deaths).toEqualTypeOf(); - expect(data.fisherman.KDR).toBeDefined(); - expect(data.fisherman.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fisherman.KDR).toEqualTypeOf(); - expect(data.fisherman.wins).toBeDefined(); - expect(data.fisherman.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fisherman.wins).toEqualTypeOf(); - expect(data.fisherman.gamesPlayed).toBeDefined(); - expect(data.fisherman.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fisherman.gamesPlayed).toEqualTypeOf(); - expect(data.fisherman.losses).toBeDefined(); - expect(data.fisherman.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fisherman.losses).toEqualTypeOf(); - expect(data.fisherman.WLR).toBeDefined(); - expect(data.fisherman.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fisherman.WLR).toEqualTypeOf(); - expect(data.fisherman.arrowsShot).toBeDefined(); - expect(data.fisherman.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fisherman.arrowsShot).toEqualTypeOf(); - expect(data.fisherman.arrowsHit).toBeDefined(); - expect(data.fisherman.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fisherman.arrowsHit).toEqualTypeOf(); - expect(data.fisherman.bowAccuracy).toBeDefined(); - expect(data.fisherman.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fisherman.bowAccuracy).toEqualTypeOf(); - expect(data.fisherman.damage).toBeDefined(); - expect(data.fisherman.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fisherman.damage).toEqualTypeOf(); - expect(data.fisherman.damageTaken).toBeDefined(); - expect(data.fisherman.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fisherman.damageTaken).toEqualTypeOf(); - expect(data.fisherman.potionsDrunk).toBeDefined(); - expect(data.fisherman.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fisherman.potionsDrunk).toEqualTypeOf(); - expect(data.fisherman.potionsThrown).toBeDefined(); - expect(data.fisherman.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fisherman.potionsThrown).toEqualTypeOf(); - expect(data.fisherman.playTime).toBeDefined(); - expect(data.fisherman.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fisherman.playTime).toEqualTypeOf(); - expect(data.fisherman.mobsSpawned).toBeDefined(); - expect(data.fisherman.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fisherman.mobsSpawned).toEqualTypeOf(); - expect(data.fisherman.chestsOpened).toBeDefined(); - expect(data.fisherman.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fisherman.chestsOpened).toEqualTypeOf(); expect(data.armorer).toBeDefined(); + expect(data.armorer).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.armorer).toEqualTypeOf(); - expect(data.armorer.level).toBeDefined(); - expect(data.armorer.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.armorer.level).toEqualTypeOf(); - expect(data.armorer.exp).toBeDefined(); - expect(data.armorer.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.armorer.exp).toEqualTypeOf(); - expect(data.armorer.kills).toBeDefined(); - expect(data.armorer.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.armorer.kills).toEqualTypeOf(); - expect(data.armorer.deaths).toBeDefined(); - expect(data.armorer.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.armorer.deaths).toEqualTypeOf(); - expect(data.armorer.KDR).toBeDefined(); - expect(data.armorer.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.armorer.KDR).toEqualTypeOf(); - expect(data.armorer.wins).toBeDefined(); - expect(data.armorer.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.armorer.wins).toEqualTypeOf(); - expect(data.armorer.gamesPlayed).toBeDefined(); - expect(data.armorer.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.armorer.gamesPlayed).toEqualTypeOf(); - expect(data.armorer.losses).toBeDefined(); - expect(data.armorer.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.armorer.losses).toEqualTypeOf(); - expect(data.armorer.WLR).toBeDefined(); - expect(data.armorer.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.armorer.WLR).toEqualTypeOf(); - expect(data.armorer.arrowsShot).toBeDefined(); - expect(data.armorer.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.armorer.arrowsShot).toEqualTypeOf(); - expect(data.armorer.arrowsHit).toBeDefined(); - expect(data.armorer.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.armorer.arrowsHit).toEqualTypeOf(); - expect(data.armorer.bowAccuracy).toBeDefined(); - expect(data.armorer.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.armorer.bowAccuracy).toEqualTypeOf(); - expect(data.armorer.damage).toBeDefined(); - expect(data.armorer.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.armorer.damage).toEqualTypeOf(); - expect(data.armorer.damageTaken).toBeDefined(); - expect(data.armorer.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.armorer.damageTaken).toEqualTypeOf(); - expect(data.armorer.potionsDrunk).toBeDefined(); - expect(data.armorer.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.armorer.potionsDrunk).toEqualTypeOf(); - expect(data.armorer.potionsThrown).toBeDefined(); - expect(data.armorer.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.armorer.potionsThrown).toEqualTypeOf(); - expect(data.armorer.playTime).toBeDefined(); - expect(data.armorer.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.armorer.playTime).toEqualTypeOf(); - expect(data.armorer.mobsSpawned).toBeDefined(); - expect(data.armorer.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.armorer.mobsSpawned).toEqualTypeOf(); - expect(data.armorer.chestsOpened).toBeDefined(); - expect(data.armorer.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.armorer.chestsOpened).toEqualTypeOf(); expect(data.horsetamer).toBeDefined(); + expect(data.horsetamer).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.horsetamer).toEqualTypeOf(); - expect(data.horsetamer.level).toBeDefined(); - expect(data.horsetamer.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.horsetamer.level).toEqualTypeOf(); - expect(data.horsetamer.exp).toBeDefined(); - expect(data.horsetamer.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.horsetamer.exp).toEqualTypeOf(); - expect(data.horsetamer.kills).toBeDefined(); - expect(data.horsetamer.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.horsetamer.kills).toEqualTypeOf(); - expect(data.horsetamer.deaths).toBeDefined(); - expect(data.horsetamer.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.horsetamer.deaths).toEqualTypeOf(); - expect(data.horsetamer.KDR).toBeDefined(); - expect(data.horsetamer.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.horsetamer.KDR).toEqualTypeOf(); - expect(data.horsetamer.wins).toBeDefined(); - expect(data.horsetamer.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.horsetamer.wins).toEqualTypeOf(); - expect(data.horsetamer.gamesPlayed).toBeDefined(); - expect(data.horsetamer.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.horsetamer.gamesPlayed).toEqualTypeOf(); - expect(data.horsetamer.losses).toBeDefined(); - expect(data.horsetamer.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.horsetamer.losses).toEqualTypeOf(); - expect(data.horsetamer.WLR).toBeDefined(); - expect(data.horsetamer.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.horsetamer.WLR).toEqualTypeOf(); - expect(data.horsetamer.arrowsShot).toBeDefined(); - expect(data.horsetamer.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.horsetamer.arrowsShot).toEqualTypeOf(); - expect(data.horsetamer.arrowsHit).toBeDefined(); - expect(data.horsetamer.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.horsetamer.arrowsHit).toEqualTypeOf(); - expect(data.horsetamer.bowAccuracy).toBeDefined(); - expect(data.horsetamer.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.horsetamer.bowAccuracy).toEqualTypeOf(); - expect(data.horsetamer.damage).toBeDefined(); - expect(data.horsetamer.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.horsetamer.damage).toEqualTypeOf(); - expect(data.horsetamer.damageTaken).toBeDefined(); - expect(data.horsetamer.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.horsetamer.damageTaken).toEqualTypeOf(); - expect(data.horsetamer.potionsDrunk).toBeDefined(); - expect(data.horsetamer.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.horsetamer.potionsDrunk).toEqualTypeOf(); - expect(data.horsetamer.potionsThrown).toBeDefined(); - expect(data.horsetamer.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.horsetamer.potionsThrown).toEqualTypeOf(); - expect(data.horsetamer.playTime).toBeDefined(); - expect(data.horsetamer.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.horsetamer.playTime).toEqualTypeOf(); - expect(data.horsetamer.mobsSpawned).toBeDefined(); - expect(data.horsetamer.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.horsetamer.mobsSpawned).toEqualTypeOf(); - expect(data.horsetamer.chestsOpened).toBeDefined(); - expect(data.horsetamer.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.horsetamer.chestsOpened).toEqualTypeOf(); expect(data.astronaut).toBeDefined(); + expect(data.astronaut).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.astronaut).toEqualTypeOf(); - expect(data.astronaut.level).toBeDefined(); - expect(data.astronaut.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.astronaut.level).toEqualTypeOf(); - expect(data.astronaut.exp).toBeDefined(); - expect(data.astronaut.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.astronaut.exp).toEqualTypeOf(); - expect(data.astronaut.kills).toBeDefined(); - expect(data.astronaut.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.astronaut.kills).toEqualTypeOf(); - expect(data.astronaut.deaths).toBeDefined(); - expect(data.astronaut.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.astronaut.deaths).toEqualTypeOf(); - expect(data.astronaut.KDR).toBeDefined(); - expect(data.astronaut.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.astronaut.KDR).toEqualTypeOf(); - expect(data.astronaut.wins).toBeDefined(); - expect(data.astronaut.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.astronaut.wins).toEqualTypeOf(); - expect(data.astronaut.gamesPlayed).toBeDefined(); - expect(data.astronaut.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.astronaut.gamesPlayed).toEqualTypeOf(); - expect(data.astronaut.losses).toBeDefined(); - expect(data.astronaut.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.astronaut.losses).toEqualTypeOf(); - expect(data.astronaut.WLR).toBeDefined(); - expect(data.astronaut.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.astronaut.WLR).toEqualTypeOf(); - expect(data.astronaut.arrowsShot).toBeDefined(); - expect(data.astronaut.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.astronaut.arrowsShot).toEqualTypeOf(); - expect(data.astronaut.arrowsHit).toBeDefined(); - expect(data.astronaut.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.astronaut.arrowsHit).toEqualTypeOf(); - expect(data.astronaut.bowAccuracy).toBeDefined(); - expect(data.astronaut.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.astronaut.bowAccuracy).toEqualTypeOf(); - expect(data.astronaut.damage).toBeDefined(); - expect(data.astronaut.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.astronaut.damage).toEqualTypeOf(); - expect(data.astronaut.damageTaken).toBeDefined(); - expect(data.astronaut.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.astronaut.damageTaken).toEqualTypeOf(); - expect(data.astronaut.potionsDrunk).toBeDefined(); - expect(data.astronaut.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.astronaut.potionsDrunk).toEqualTypeOf(); - expect(data.astronaut.potionsThrown).toBeDefined(); - expect(data.astronaut.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.astronaut.potionsThrown).toEqualTypeOf(); - expect(data.astronaut.playTime).toBeDefined(); - expect(data.astronaut.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.astronaut.playTime).toEqualTypeOf(); - expect(data.astronaut.mobsSpawned).toBeDefined(); - expect(data.astronaut.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.astronaut.mobsSpawned).toEqualTypeOf(); - expect(data.astronaut.chestsOpened).toBeDefined(); - expect(data.astronaut.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.astronaut.chestsOpened).toEqualTypeOf(); expect(data.troll).toBeDefined(); + expect(data.troll).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.troll).toEqualTypeOf(); - expect(data.troll.level).toBeDefined(); - expect(data.troll.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.troll.level).toEqualTypeOf(); - expect(data.troll.exp).toBeDefined(); - expect(data.troll.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.troll.exp).toEqualTypeOf(); - expect(data.troll.kills).toBeDefined(); - expect(data.troll.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.troll.kills).toEqualTypeOf(); - expect(data.troll.deaths).toBeDefined(); - expect(data.troll.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.troll.deaths).toEqualTypeOf(); - expect(data.troll.KDR).toBeDefined(); - expect(data.troll.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.troll.KDR).toEqualTypeOf(); - expect(data.troll.wins).toBeDefined(); - expect(data.troll.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.troll.wins).toEqualTypeOf(); - expect(data.troll.gamesPlayed).toBeDefined(); - expect(data.troll.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.troll.gamesPlayed).toEqualTypeOf(); - expect(data.troll.losses).toBeDefined(); - expect(data.troll.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.troll.losses).toEqualTypeOf(); - expect(data.troll.WLR).toBeDefined(); - expect(data.troll.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.troll.WLR).toEqualTypeOf(); - expect(data.troll.arrowsShot).toBeDefined(); - expect(data.troll.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.troll.arrowsShot).toEqualTypeOf(); - expect(data.troll.arrowsHit).toBeDefined(); - expect(data.troll.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.troll.arrowsHit).toEqualTypeOf(); - expect(data.troll.bowAccuracy).toBeDefined(); - expect(data.troll.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.troll.bowAccuracy).toEqualTypeOf(); - expect(data.troll.damage).toBeDefined(); - expect(data.troll.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.troll.damage).toEqualTypeOf(); - expect(data.troll.damageTaken).toBeDefined(); - expect(data.troll.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.troll.damageTaken).toEqualTypeOf(); - expect(data.troll.potionsDrunk).toBeDefined(); - expect(data.troll.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.troll.potionsDrunk).toEqualTypeOf(); - expect(data.troll.potionsThrown).toBeDefined(); - expect(data.troll.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.troll.potionsThrown).toEqualTypeOf(); - expect(data.troll.playTime).toBeDefined(); - expect(data.troll.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.troll.playTime).toEqualTypeOf(); - expect(data.troll.mobsSpawned).toBeDefined(); - expect(data.troll.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.troll.mobsSpawned).toEqualTypeOf(); - expect(data.troll.chestsOpened).toBeDefined(); - expect(data.troll.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.troll.chestsOpened).toEqualTypeOf(); expect(data.reaper).toBeDefined(); + expect(data.reaper).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.reaper).toEqualTypeOf(); - expect(data.reaper.level).toBeDefined(); - expect(data.reaper.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reaper.level).toEqualTypeOf(); - expect(data.reaper.exp).toBeDefined(); - expect(data.reaper.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reaper.exp).toEqualTypeOf(); - expect(data.reaper.kills).toBeDefined(); - expect(data.reaper.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reaper.kills).toEqualTypeOf(); - expect(data.reaper.deaths).toBeDefined(); - expect(data.reaper.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reaper.deaths).toEqualTypeOf(); - expect(data.reaper.KDR).toBeDefined(); - expect(data.reaper.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reaper.KDR).toEqualTypeOf(); - expect(data.reaper.wins).toBeDefined(); - expect(data.reaper.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reaper.wins).toEqualTypeOf(); - expect(data.reaper.gamesPlayed).toBeDefined(); - expect(data.reaper.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reaper.gamesPlayed).toEqualTypeOf(); - expect(data.reaper.losses).toBeDefined(); - expect(data.reaper.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reaper.losses).toEqualTypeOf(); - expect(data.reaper.WLR).toBeDefined(); - expect(data.reaper.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reaper.WLR).toEqualTypeOf(); - expect(data.reaper.arrowsShot).toBeDefined(); - expect(data.reaper.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reaper.arrowsShot).toEqualTypeOf(); - expect(data.reaper.arrowsHit).toBeDefined(); - expect(data.reaper.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reaper.arrowsHit).toEqualTypeOf(); - expect(data.reaper.bowAccuracy).toBeDefined(); - expect(data.reaper.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reaper.bowAccuracy).toEqualTypeOf(); - expect(data.reaper.damage).toBeDefined(); - expect(data.reaper.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reaper.damage).toEqualTypeOf(); - expect(data.reaper.damageTaken).toBeDefined(); - expect(data.reaper.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reaper.damageTaken).toEqualTypeOf(); - expect(data.reaper.potionsDrunk).toBeDefined(); - expect(data.reaper.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reaper.potionsDrunk).toEqualTypeOf(); - expect(data.reaper.potionsThrown).toBeDefined(); - expect(data.reaper.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reaper.potionsThrown).toEqualTypeOf(); - expect(data.reaper.playTime).toBeDefined(); - expect(data.reaper.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reaper.playTime).toEqualTypeOf(); - expect(data.reaper.mobsSpawned).toBeDefined(); - expect(data.reaper.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reaper.mobsSpawned).toEqualTypeOf(); - expect(data.reaper.chestsOpened).toBeDefined(); - expect(data.reaper.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reaper.chestsOpened).toEqualTypeOf(); expect(data.shark).toBeDefined(); + expect(data.shark).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.shark).toEqualTypeOf(); - expect(data.shark.level).toBeDefined(); - expect(data.shark.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shark.level).toEqualTypeOf(); - expect(data.shark.exp).toBeDefined(); - expect(data.shark.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shark.exp).toEqualTypeOf(); - expect(data.shark.kills).toBeDefined(); - expect(data.shark.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shark.kills).toEqualTypeOf(); - expect(data.shark.deaths).toBeDefined(); - expect(data.shark.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shark.deaths).toEqualTypeOf(); - expect(data.shark.KDR).toBeDefined(); - expect(data.shark.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shark.KDR).toEqualTypeOf(); - expect(data.shark.wins).toBeDefined(); - expect(data.shark.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shark.wins).toEqualTypeOf(); - expect(data.shark.gamesPlayed).toBeDefined(); - expect(data.shark.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shark.gamesPlayed).toEqualTypeOf(); - expect(data.shark.losses).toBeDefined(); - expect(data.shark.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shark.losses).toEqualTypeOf(); - expect(data.shark.WLR).toBeDefined(); - expect(data.shark.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shark.WLR).toEqualTypeOf(); - expect(data.shark.arrowsShot).toBeDefined(); - expect(data.shark.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shark.arrowsShot).toEqualTypeOf(); - expect(data.shark.arrowsHit).toBeDefined(); - expect(data.shark.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shark.arrowsHit).toEqualTypeOf(); - expect(data.shark.bowAccuracy).toBeDefined(); - expect(data.shark.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shark.bowAccuracy).toEqualTypeOf(); - expect(data.shark.damage).toBeDefined(); - expect(data.shark.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shark.damage).toEqualTypeOf(); - expect(data.shark.damageTaken).toBeDefined(); - expect(data.shark.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shark.damageTaken).toEqualTypeOf(); - expect(data.shark.potionsDrunk).toBeDefined(); - expect(data.shark.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shark.potionsDrunk).toEqualTypeOf(); - expect(data.shark.potionsThrown).toBeDefined(); - expect(data.shark.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shark.potionsThrown).toEqualTypeOf(); - expect(data.shark.playTime).toBeDefined(); - expect(data.shark.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shark.playTime).toEqualTypeOf(); - expect(data.shark.mobsSpawned).toBeDefined(); - expect(data.shark.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shark.mobsSpawned).toEqualTypeOf(); - expect(data.shark.chestsOpened).toBeDefined(); - expect(data.shark.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shark.chestsOpened).toEqualTypeOf(); expect(data.reddragon).toBeDefined(); + expect(data.reddragon).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.reddragon).toEqualTypeOf(); - expect(data.reddragon.level).toBeDefined(); - expect(data.reddragon.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reddragon.level).toEqualTypeOf(); - expect(data.reddragon.exp).toBeDefined(); - expect(data.reddragon.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reddragon.exp).toEqualTypeOf(); - expect(data.reddragon.kills).toBeDefined(); - expect(data.reddragon.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reddragon.kills).toEqualTypeOf(); - expect(data.reddragon.deaths).toBeDefined(); - expect(data.reddragon.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reddragon.deaths).toEqualTypeOf(); - expect(data.reddragon.KDR).toBeDefined(); - expect(data.reddragon.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reddragon.KDR).toEqualTypeOf(); - expect(data.reddragon.wins).toBeDefined(); - expect(data.reddragon.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reddragon.wins).toEqualTypeOf(); - expect(data.reddragon.gamesPlayed).toBeDefined(); - expect(data.reddragon.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reddragon.gamesPlayed).toEqualTypeOf(); - expect(data.reddragon.losses).toBeDefined(); - expect(data.reddragon.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reddragon.losses).toEqualTypeOf(); - expect(data.reddragon.WLR).toBeDefined(); - expect(data.reddragon.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reddragon.WLR).toEqualTypeOf(); - expect(data.reddragon.arrowsShot).toBeDefined(); - expect(data.reddragon.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reddragon.arrowsShot).toEqualTypeOf(); - expect(data.reddragon.arrowsHit).toBeDefined(); - expect(data.reddragon.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reddragon.arrowsHit).toEqualTypeOf(); - expect(data.reddragon.bowAccuracy).toBeDefined(); - expect(data.reddragon.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reddragon.bowAccuracy).toEqualTypeOf(); - expect(data.reddragon.damage).toBeDefined(); - expect(data.reddragon.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reddragon.damage).toEqualTypeOf(); - expect(data.reddragon.damageTaken).toBeDefined(); - expect(data.reddragon.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reddragon.damageTaken).toEqualTypeOf(); - expect(data.reddragon.potionsDrunk).toBeDefined(); - expect(data.reddragon.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reddragon.potionsDrunk).toEqualTypeOf(); - expect(data.reddragon.potionsThrown).toBeDefined(); - expect(data.reddragon.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reddragon.potionsThrown).toEqualTypeOf(); - expect(data.reddragon.playTime).toBeDefined(); - expect(data.reddragon.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reddragon.playTime).toEqualTypeOf(); - expect(data.reddragon.mobsSpawned).toBeDefined(); - expect(data.reddragon.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reddragon.mobsSpawned).toEqualTypeOf(); - expect(data.reddragon.chestsOpened).toBeDefined(); - expect(data.reddragon.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.reddragon.chestsOpened).toEqualTypeOf(); expect(data.toxicologist).toBeDefined(); + expect(data.toxicologist).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.toxicologist).toEqualTypeOf(); - expect(data.toxicologist.level).toBeDefined(); - expect(data.toxicologist.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.toxicologist.level).toEqualTypeOf(); - expect(data.toxicologist.exp).toBeDefined(); - expect(data.toxicologist.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.toxicologist.exp).toEqualTypeOf(); - expect(data.toxicologist.kills).toBeDefined(); - expect(data.toxicologist.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.toxicologist.kills).toEqualTypeOf(); - expect(data.toxicologist.deaths).toBeDefined(); - expect(data.toxicologist.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.toxicologist.deaths).toEqualTypeOf(); - expect(data.toxicologist.KDR).toBeDefined(); - expect(data.toxicologist.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.toxicologist.KDR).toEqualTypeOf(); - expect(data.toxicologist.wins).toBeDefined(); - expect(data.toxicologist.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.toxicologist.wins).toEqualTypeOf(); - expect(data.toxicologist.gamesPlayed).toBeDefined(); - expect(data.toxicologist.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.toxicologist.gamesPlayed).toEqualTypeOf(); - expect(data.toxicologist.losses).toBeDefined(); - expect(data.toxicologist.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.toxicologist.losses).toEqualTypeOf(); - expect(data.toxicologist.WLR).toBeDefined(); - expect(data.toxicologist.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.toxicologist.WLR).toEqualTypeOf(); - expect(data.toxicologist.arrowsShot).toBeDefined(); - expect(data.toxicologist.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.toxicologist.arrowsShot).toEqualTypeOf(); - expect(data.toxicologist.arrowsHit).toBeDefined(); - expect(data.toxicologist.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.toxicologist.arrowsHit).toEqualTypeOf(); - expect(data.toxicologist.bowAccuracy).toBeDefined(); - expect(data.toxicologist.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.toxicologist.bowAccuracy).toEqualTypeOf(); - expect(data.toxicologist.damage).toBeDefined(); - expect(data.toxicologist.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.toxicologist.damage).toEqualTypeOf(); - expect(data.toxicologist.damageTaken).toBeDefined(); - expect(data.toxicologist.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.toxicologist.damageTaken).toEqualTypeOf(); - expect(data.toxicologist.potionsDrunk).toBeDefined(); - expect(data.toxicologist.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.toxicologist.potionsDrunk).toEqualTypeOf(); - expect(data.toxicologist.potionsThrown).toBeDefined(); - expect(data.toxicologist.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.toxicologist.potionsThrown).toEqualTypeOf(); - expect(data.toxicologist.playTime).toBeDefined(); - expect(data.toxicologist.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.toxicologist.playTime).toEqualTypeOf(); - expect(data.toxicologist.mobsSpawned).toBeDefined(); - expect(data.toxicologist.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.toxicologist.mobsSpawned).toEqualTypeOf(); - expect(data.toxicologist.chestsOpened).toBeDefined(); - expect(data.toxicologist.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.toxicologist.chestsOpened).toEqualTypeOf(); expect(data.rogue).toBeDefined(); + expect(data.rogue).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.rogue).toEqualTypeOf(); - expect(data.rogue.level).toBeDefined(); - expect(data.rogue.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.rogue.level).toEqualTypeOf(); - expect(data.rogue.exp).toBeDefined(); - expect(data.rogue.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.rogue.exp).toEqualTypeOf(); - expect(data.rogue.kills).toBeDefined(); - expect(data.rogue.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.rogue.kills).toEqualTypeOf(); - expect(data.rogue.deaths).toBeDefined(); - expect(data.rogue.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.rogue.deaths).toEqualTypeOf(); - expect(data.rogue.KDR).toBeDefined(); - expect(data.rogue.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.rogue.KDR).toEqualTypeOf(); - expect(data.rogue.wins).toBeDefined(); - expect(data.rogue.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.rogue.wins).toEqualTypeOf(); - expect(data.rogue.gamesPlayed).toBeDefined(); - expect(data.rogue.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.rogue.gamesPlayed).toEqualTypeOf(); - expect(data.rogue.losses).toBeDefined(); - expect(data.rogue.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.rogue.losses).toEqualTypeOf(); - expect(data.rogue.WLR).toBeDefined(); - expect(data.rogue.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.rogue.WLR).toEqualTypeOf(); - expect(data.rogue.arrowsShot).toBeDefined(); - expect(data.rogue.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.rogue.arrowsShot).toEqualTypeOf(); - expect(data.rogue.arrowsHit).toBeDefined(); - expect(data.rogue.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.rogue.arrowsHit).toEqualTypeOf(); - expect(data.rogue.bowAccuracy).toBeDefined(); - expect(data.rogue.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.rogue.bowAccuracy).toEqualTypeOf(); - expect(data.rogue.damage).toBeDefined(); - expect(data.rogue.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.rogue.damage).toEqualTypeOf(); - expect(data.rogue.damageTaken).toBeDefined(); - expect(data.rogue.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.rogue.damageTaken).toEqualTypeOf(); - expect(data.rogue.potionsDrunk).toBeDefined(); - expect(data.rogue.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.rogue.potionsDrunk).toEqualTypeOf(); - expect(data.rogue.potionsThrown).toBeDefined(); - expect(data.rogue.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.rogue.potionsThrown).toEqualTypeOf(); - expect(data.rogue.playTime).toBeDefined(); - expect(data.rogue.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.rogue.playTime).toEqualTypeOf(); - expect(data.rogue.mobsSpawned).toBeDefined(); - expect(data.rogue.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.rogue.mobsSpawned).toEqualTypeOf(); - expect(data.rogue.chestsOpened).toBeDefined(); - expect(data.rogue.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.rogue.chestsOpened).toEqualTypeOf(); expect(data.warlock).toBeDefined(); + expect(data.warlock).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.warlock).toEqualTypeOf(); - expect(data.warlock.level).toBeDefined(); - expect(data.warlock.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.warlock.level).toEqualTypeOf(); - expect(data.warlock.exp).toBeDefined(); - expect(data.warlock.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.warlock.exp).toEqualTypeOf(); - expect(data.warlock.kills).toBeDefined(); - expect(data.warlock.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.warlock.kills).toEqualTypeOf(); - expect(data.warlock.deaths).toBeDefined(); - expect(data.warlock.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.warlock.deaths).toEqualTypeOf(); - expect(data.warlock.KDR).toBeDefined(); - expect(data.warlock.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.warlock.KDR).toEqualTypeOf(); - expect(data.warlock.wins).toBeDefined(); - expect(data.warlock.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.warlock.wins).toEqualTypeOf(); - expect(data.warlock.gamesPlayed).toBeDefined(); - expect(data.warlock.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.warlock.gamesPlayed).toEqualTypeOf(); - expect(data.warlock.losses).toBeDefined(); - expect(data.warlock.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.warlock.losses).toEqualTypeOf(); - expect(data.warlock.WLR).toBeDefined(); - expect(data.warlock.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.warlock.WLR).toEqualTypeOf(); - expect(data.warlock.arrowsShot).toBeDefined(); - expect(data.warlock.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.warlock.arrowsShot).toEqualTypeOf(); - expect(data.warlock.arrowsHit).toBeDefined(); - expect(data.warlock.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.warlock.arrowsHit).toEqualTypeOf(); - expect(data.warlock.bowAccuracy).toBeDefined(); - expect(data.warlock.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.warlock.bowAccuracy).toEqualTypeOf(); - expect(data.warlock.damage).toBeDefined(); - expect(data.warlock.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.warlock.damage).toEqualTypeOf(); - expect(data.warlock.damageTaken).toBeDefined(); - expect(data.warlock.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.warlock.damageTaken).toEqualTypeOf(); - expect(data.warlock.potionsDrunk).toBeDefined(); - expect(data.warlock.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.warlock.potionsDrunk).toEqualTypeOf(); - expect(data.warlock.potionsThrown).toBeDefined(); - expect(data.warlock.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.warlock.potionsThrown).toEqualTypeOf(); - expect(data.warlock.playTime).toBeDefined(); - expect(data.warlock.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.warlock.playTime).toEqualTypeOf(); - expect(data.warlock.mobsSpawned).toBeDefined(); - expect(data.warlock.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.warlock.mobsSpawned).toEqualTypeOf(); - expect(data.warlock.chestsOpened).toBeDefined(); - expect(data.warlock.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.warlock.chestsOpened).toEqualTypeOf(); expect(data.slimeyslime).toBeDefined(); + expect(data.slimeyslime).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.slimeyslime).toEqualTypeOf(); - expect(data.slimeyslime.level).toBeDefined(); - expect(data.slimeyslime.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.slimeyslime.level).toEqualTypeOf(); - expect(data.slimeyslime.exp).toBeDefined(); - expect(data.slimeyslime.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.slimeyslime.exp).toEqualTypeOf(); - expect(data.slimeyslime.kills).toBeDefined(); - expect(data.slimeyslime.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.slimeyslime.kills).toEqualTypeOf(); - expect(data.slimeyslime.deaths).toBeDefined(); - expect(data.slimeyslime.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.slimeyslime.deaths).toEqualTypeOf(); - expect(data.slimeyslime.KDR).toBeDefined(); - expect(data.slimeyslime.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.slimeyslime.KDR).toEqualTypeOf(); - expect(data.slimeyslime.wins).toBeDefined(); - expect(data.slimeyslime.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.slimeyslime.wins).toEqualTypeOf(); - expect(data.slimeyslime.gamesPlayed).toBeDefined(); - expect(data.slimeyslime.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.slimeyslime.gamesPlayed).toEqualTypeOf(); - expect(data.slimeyslime.losses).toBeDefined(); - expect(data.slimeyslime.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.slimeyslime.losses).toEqualTypeOf(); - expect(data.slimeyslime.WLR).toBeDefined(); - expect(data.slimeyslime.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.slimeyslime.WLR).toEqualTypeOf(); - expect(data.slimeyslime.arrowsShot).toBeDefined(); - expect(data.slimeyslime.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.slimeyslime.arrowsShot).toEqualTypeOf(); - expect(data.slimeyslime.arrowsHit).toBeDefined(); - expect(data.slimeyslime.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.slimeyslime.arrowsHit).toEqualTypeOf(); - expect(data.slimeyslime.bowAccuracy).toBeDefined(); - expect(data.slimeyslime.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.slimeyslime.bowAccuracy).toEqualTypeOf(); - expect(data.slimeyslime.damage).toBeDefined(); - expect(data.slimeyslime.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.slimeyslime.damage).toEqualTypeOf(); - expect(data.slimeyslime.damageTaken).toBeDefined(); - expect(data.slimeyslime.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.slimeyslime.damageTaken).toEqualTypeOf(); - expect(data.slimeyslime.potionsDrunk).toBeDefined(); - expect(data.slimeyslime.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.slimeyslime.potionsDrunk).toEqualTypeOf(); - expect(data.slimeyslime.potionsThrown).toBeDefined(); - expect(data.slimeyslime.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.slimeyslime.potionsThrown).toEqualTypeOf(); - expect(data.slimeyslime.playTime).toBeDefined(); - expect(data.slimeyslime.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.slimeyslime.playTime).toEqualTypeOf(); - expect(data.slimeyslime.mobsSpawned).toBeDefined(); - expect(data.slimeyslime.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.slimeyslime.mobsSpawned).toEqualTypeOf(); - expect(data.slimeyslime.chestsOpened).toBeDefined(); - expect(data.slimeyslime.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.slimeyslime.chestsOpened).toEqualTypeOf(); expect(data.jockey).toBeDefined(); + expect(data.jockey).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.jockey).toEqualTypeOf(); - expect(data.jockey.level).toBeDefined(); - expect(data.jockey.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.jockey.level).toEqualTypeOf(); - expect(data.jockey.exp).toBeDefined(); - expect(data.jockey.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.jockey.exp).toEqualTypeOf(); - expect(data.jockey.kills).toBeDefined(); - expect(data.jockey.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.jockey.kills).toEqualTypeOf(); - expect(data.jockey.deaths).toBeDefined(); - expect(data.jockey.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.jockey.deaths).toEqualTypeOf(); - expect(data.jockey.KDR).toBeDefined(); - expect(data.jockey.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.jockey.KDR).toEqualTypeOf(); - expect(data.jockey.wins).toBeDefined(); - expect(data.jockey.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.jockey.wins).toEqualTypeOf(); - expect(data.jockey.gamesPlayed).toBeDefined(); - expect(data.jockey.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.jockey.gamesPlayed).toEqualTypeOf(); - expect(data.jockey.losses).toBeDefined(); - expect(data.jockey.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.jockey.losses).toEqualTypeOf(); - expect(data.jockey.WLR).toBeDefined(); - expect(data.jockey.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.jockey.WLR).toEqualTypeOf(); - expect(data.jockey.arrowsShot).toBeDefined(); - expect(data.jockey.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.jockey.arrowsShot).toEqualTypeOf(); - expect(data.jockey.arrowsHit).toBeDefined(); - expect(data.jockey.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.jockey.arrowsHit).toEqualTypeOf(); - expect(data.jockey.bowAccuracy).toBeDefined(); - expect(data.jockey.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.jockey.bowAccuracy).toEqualTypeOf(); - expect(data.jockey.damage).toBeDefined(); - expect(data.jockey.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.jockey.damage).toEqualTypeOf(); - expect(data.jockey.damageTaken).toBeDefined(); - expect(data.jockey.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.jockey.damageTaken).toEqualTypeOf(); - expect(data.jockey.potionsDrunk).toBeDefined(); - expect(data.jockey.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.jockey.potionsDrunk).toEqualTypeOf(); - expect(data.jockey.potionsThrown).toBeDefined(); - expect(data.jockey.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.jockey.potionsThrown).toEqualTypeOf(); - expect(data.jockey.playTime).toBeDefined(); - expect(data.jockey.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.jockey.playTime).toEqualTypeOf(); - expect(data.jockey.mobsSpawned).toBeDefined(); - expect(data.jockey.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.jockey.mobsSpawned).toEqualTypeOf(); - expect(data.jockey.chestsOpened).toBeDefined(); - expect(data.jockey.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.jockey.chestsOpened).toEqualTypeOf(); expect(data.golem).toBeDefined(); + expect(data.golem).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.golem).toEqualTypeOf(); - expect(data.golem.level).toBeDefined(); - expect(data.golem.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.golem.level).toEqualTypeOf(); - expect(data.golem.exp).toBeDefined(); - expect(data.golem.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.golem.exp).toEqualTypeOf(); - expect(data.golem.kills).toBeDefined(); - expect(data.golem.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.golem.kills).toEqualTypeOf(); - expect(data.golem.deaths).toBeDefined(); - expect(data.golem.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.golem.deaths).toEqualTypeOf(); - expect(data.golem.KDR).toBeDefined(); - expect(data.golem.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.golem.KDR).toEqualTypeOf(); - expect(data.golem.wins).toBeDefined(); - expect(data.golem.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.golem.wins).toEqualTypeOf(); - expect(data.golem.gamesPlayed).toBeDefined(); - expect(data.golem.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.golem.gamesPlayed).toEqualTypeOf(); - expect(data.golem.losses).toBeDefined(); - expect(data.golem.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.golem.losses).toEqualTypeOf(); - expect(data.golem.WLR).toBeDefined(); - expect(data.golem.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.golem.WLR).toEqualTypeOf(); - expect(data.golem.arrowsShot).toBeDefined(); - expect(data.golem.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.golem.arrowsShot).toEqualTypeOf(); - expect(data.golem.arrowsHit).toBeDefined(); - expect(data.golem.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.golem.arrowsHit).toEqualTypeOf(); - expect(data.golem.bowAccuracy).toBeDefined(); - expect(data.golem.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.golem.bowAccuracy).toEqualTypeOf(); - expect(data.golem.damage).toBeDefined(); - expect(data.golem.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.golem.damage).toEqualTypeOf(); - expect(data.golem.damageTaken).toBeDefined(); - expect(data.golem.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.golem.damageTaken).toEqualTypeOf(); - expect(data.golem.potionsDrunk).toBeDefined(); - expect(data.golem.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.golem.potionsDrunk).toEqualTypeOf(); - expect(data.golem.potionsThrown).toBeDefined(); - expect(data.golem.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.golem.potionsThrown).toEqualTypeOf(); - expect(data.golem.playTime).toBeDefined(); - expect(data.golem.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.golem.playTime).toEqualTypeOf(); - expect(data.golem.mobsSpawned).toBeDefined(); - expect(data.golem.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.golem.mobsSpawned).toEqualTypeOf(); - expect(data.golem.chestsOpened).toBeDefined(); - expect(data.golem.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.golem.chestsOpened).toEqualTypeOf(); expect(data.viking).toBeDefined(); + expect(data.viking).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.viking).toEqualTypeOf(); - expect(data.viking.level).toBeDefined(); - expect(data.viking.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.viking.level).toEqualTypeOf(); - expect(data.viking.exp).toBeDefined(); - expect(data.viking.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.viking.exp).toEqualTypeOf(); - expect(data.viking.kills).toBeDefined(); - expect(data.viking.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.viking.kills).toEqualTypeOf(); - expect(data.viking.deaths).toBeDefined(); - expect(data.viking.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.viking.deaths).toEqualTypeOf(); - expect(data.viking.KDR).toBeDefined(); - expect(data.viking.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.viking.KDR).toEqualTypeOf(); - expect(data.viking.wins).toBeDefined(); - expect(data.viking.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.viking.wins).toEqualTypeOf(); - expect(data.viking.gamesPlayed).toBeDefined(); - expect(data.viking.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.viking.gamesPlayed).toEqualTypeOf(); - expect(data.viking.losses).toBeDefined(); - expect(data.viking.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.viking.losses).toEqualTypeOf(); - expect(data.viking.WLR).toBeDefined(); - expect(data.viking.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.viking.WLR).toEqualTypeOf(); - expect(data.viking.arrowsShot).toBeDefined(); - expect(data.viking.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.viking.arrowsShot).toEqualTypeOf(); - expect(data.viking.arrowsHit).toBeDefined(); - expect(data.viking.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.viking.arrowsHit).toEqualTypeOf(); - expect(data.viking.bowAccuracy).toBeDefined(); - expect(data.viking.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.viking.bowAccuracy).toEqualTypeOf(); - expect(data.viking.damage).toBeDefined(); - expect(data.viking.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.viking.damage).toEqualTypeOf(); - expect(data.viking.damageTaken).toBeDefined(); - expect(data.viking.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.viking.damageTaken).toEqualTypeOf(); - expect(data.viking.potionsDrunk).toBeDefined(); - expect(data.viking.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.viking.potionsDrunk).toEqualTypeOf(); - expect(data.viking.potionsThrown).toBeDefined(); - expect(data.viking.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.viking.potionsThrown).toEqualTypeOf(); - expect(data.viking.playTime).toBeDefined(); - expect(data.viking.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.viking.playTime).toEqualTypeOf(); - expect(data.viking.mobsSpawned).toBeDefined(); - expect(data.viking.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.viking.mobsSpawned).toEqualTypeOf(); - expect(data.viking.chestsOpened).toBeDefined(); - expect(data.viking.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.viking.chestsOpened).toEqualTypeOf(); expect(data.shadowKnight).toBeDefined(); + expect(data.shadowKnight).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.shadowKnight).toEqualTypeOf(); - expect(data.shadowKnight.level).toBeDefined(); - expect(data.shadowKnight.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shadowKnight.level).toEqualTypeOf(); - expect(data.shadowKnight.exp).toBeDefined(); - expect(data.shadowKnight.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shadowKnight.exp).toEqualTypeOf(); - expect(data.shadowKnight.kills).toBeDefined(); - expect(data.shadowKnight.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shadowKnight.kills).toEqualTypeOf(); - expect(data.shadowKnight.deaths).toBeDefined(); - expect(data.shadowKnight.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shadowKnight.deaths).toEqualTypeOf(); - expect(data.shadowKnight.KDR).toBeDefined(); - expect(data.shadowKnight.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shadowKnight.KDR).toEqualTypeOf(); - expect(data.shadowKnight.wins).toBeDefined(); - expect(data.shadowKnight.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shadowKnight.wins).toEqualTypeOf(); - expect(data.shadowKnight.gamesPlayed).toBeDefined(); - expect(data.shadowKnight.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shadowKnight.gamesPlayed).toEqualTypeOf(); - expect(data.shadowKnight.losses).toBeDefined(); - expect(data.shadowKnight.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shadowKnight.losses).toEqualTypeOf(); - expect(data.shadowKnight.WLR).toBeDefined(); - expect(data.shadowKnight.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shadowKnight.WLR).toEqualTypeOf(); - expect(data.shadowKnight.arrowsShot).toBeDefined(); - expect(data.shadowKnight.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shadowKnight.arrowsShot).toEqualTypeOf(); - expect(data.shadowKnight.arrowsHit).toBeDefined(); - expect(data.shadowKnight.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shadowKnight.arrowsHit).toEqualTypeOf(); - expect(data.shadowKnight.bowAccuracy).toBeDefined(); - expect(data.shadowKnight.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shadowKnight.bowAccuracy).toEqualTypeOf(); - expect(data.shadowKnight.damage).toBeDefined(); - expect(data.shadowKnight.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shadowKnight.damage).toEqualTypeOf(); - expect(data.shadowKnight.damageTaken).toBeDefined(); - expect(data.shadowKnight.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shadowKnight.damageTaken).toEqualTypeOf(); - expect(data.shadowKnight.potionsDrunk).toBeDefined(); - expect(data.shadowKnight.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shadowKnight.potionsDrunk).toEqualTypeOf(); - expect(data.shadowKnight.potionsThrown).toBeDefined(); - expect(data.shadowKnight.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shadowKnight.potionsThrown).toEqualTypeOf(); - expect(data.shadowKnight.playTime).toBeDefined(); - expect(data.shadowKnight.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shadowKnight.playTime).toEqualTypeOf(); - expect(data.shadowKnight.mobsSpawned).toBeDefined(); - expect(data.shadowKnight.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shadowKnight.mobsSpawned).toEqualTypeOf(); - expect(data.shadowKnight.chestsOpened).toBeDefined(); - expect(data.shadowKnight.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shadowKnight.chestsOpened).toEqualTypeOf(); expect(data.pigman).toBeDefined(); + expect(data.pigman).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.pigman).toEqualTypeOf(); - expect(data.pigman.level).toBeDefined(); - expect(data.pigman.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.pigman.level).toEqualTypeOf(); - expect(data.pigman.exp).toBeDefined(); - expect(data.pigman.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.pigman.exp).toEqualTypeOf(); - expect(data.pigman.kills).toBeDefined(); - expect(data.pigman.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.pigman.kills).toEqualTypeOf(); - expect(data.pigman.deaths).toBeDefined(); - expect(data.pigman.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.pigman.deaths).toEqualTypeOf(); - expect(data.pigman.KDR).toBeDefined(); - expect(data.pigman.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.pigman.KDR).toEqualTypeOf(); - expect(data.pigman.wins).toBeDefined(); - expect(data.pigman.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.pigman.wins).toEqualTypeOf(); - expect(data.pigman.gamesPlayed).toBeDefined(); - expect(data.pigman.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.pigman.gamesPlayed).toEqualTypeOf(); - expect(data.pigman.losses).toBeDefined(); - expect(data.pigman.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.pigman.losses).toEqualTypeOf(); - expect(data.pigman.WLR).toBeDefined(); - expect(data.pigman.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.pigman.WLR).toEqualTypeOf(); - expect(data.pigman.arrowsShot).toBeDefined(); - expect(data.pigman.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.pigman.arrowsShot).toEqualTypeOf(); - expect(data.pigman.arrowsHit).toBeDefined(); - expect(data.pigman.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.pigman.arrowsHit).toEqualTypeOf(); - expect(data.pigman.bowAccuracy).toBeDefined(); - expect(data.pigman.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.pigman.bowAccuracy).toEqualTypeOf(); - expect(data.pigman.damage).toBeDefined(); - expect(data.pigman.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.pigman.damage).toEqualTypeOf(); - expect(data.pigman.damageTaken).toBeDefined(); - expect(data.pigman.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.pigman.damageTaken).toEqualTypeOf(); - expect(data.pigman.potionsDrunk).toBeDefined(); - expect(data.pigman.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.pigman.potionsDrunk).toEqualTypeOf(); - expect(data.pigman.potionsThrown).toBeDefined(); - expect(data.pigman.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.pigman.potionsThrown).toEqualTypeOf(); - expect(data.pigman.playTime).toBeDefined(); - expect(data.pigman.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.pigman.playTime).toEqualTypeOf(); - expect(data.pigman.mobsSpawned).toBeDefined(); - expect(data.pigman.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.pigman.mobsSpawned).toEqualTypeOf(); - expect(data.pigman.chestsOpened).toBeDefined(); - expect(data.pigman.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.pigman.chestsOpened).toEqualTypeOf(); expect(data.paladin).toBeDefined(); + expect(data.paladin).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.paladin).toEqualTypeOf(); - expect(data.paladin.level).toBeDefined(); - expect(data.paladin.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.paladin.level).toEqualTypeOf(); - expect(data.paladin.exp).toBeDefined(); - expect(data.paladin.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.paladin.exp).toEqualTypeOf(); - expect(data.paladin.kills).toBeDefined(); - expect(data.paladin.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.paladin.kills).toEqualTypeOf(); - expect(data.paladin.deaths).toBeDefined(); - expect(data.paladin.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.paladin.deaths).toEqualTypeOf(); - expect(data.paladin.KDR).toBeDefined(); - expect(data.paladin.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.paladin.KDR).toEqualTypeOf(); - expect(data.paladin.wins).toBeDefined(); - expect(data.paladin.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.paladin.wins).toEqualTypeOf(); - expect(data.paladin.gamesPlayed).toBeDefined(); - expect(data.paladin.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.paladin.gamesPlayed).toEqualTypeOf(); - expect(data.paladin.losses).toBeDefined(); - expect(data.paladin.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.paladin.losses).toEqualTypeOf(); - expect(data.paladin.WLR).toBeDefined(); - expect(data.paladin.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.paladin.WLR).toEqualTypeOf(); - expect(data.paladin.arrowsShot).toBeDefined(); - expect(data.paladin.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.paladin.arrowsShot).toEqualTypeOf(); - expect(data.paladin.arrowsHit).toBeDefined(); - expect(data.paladin.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.paladin.arrowsHit).toEqualTypeOf(); - expect(data.paladin.bowAccuracy).toBeDefined(); - expect(data.paladin.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.paladin.bowAccuracy).toEqualTypeOf(); - expect(data.paladin.damage).toBeDefined(); - expect(data.paladin.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.paladin.damage).toEqualTypeOf(); - expect(data.paladin.damageTaken).toBeDefined(); - expect(data.paladin.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.paladin.damageTaken).toEqualTypeOf(); - expect(data.paladin.potionsDrunk).toBeDefined(); - expect(data.paladin.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.paladin.potionsDrunk).toEqualTypeOf(); - expect(data.paladin.potionsThrown).toBeDefined(); - expect(data.paladin.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.paladin.potionsThrown).toEqualTypeOf(); - expect(data.paladin.playTime).toBeDefined(); - expect(data.paladin.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.paladin.playTime).toEqualTypeOf(); - expect(data.paladin.mobsSpawned).toBeDefined(); - expect(data.paladin.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.paladin.mobsSpawned).toEqualTypeOf(); - expect(data.paladin.chestsOpened).toBeDefined(); - expect(data.paladin.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.paladin.chestsOpened).toEqualTypeOf(); expect(data.necromancer).toBeDefined(); + expect(data.necromancer).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.necromancer).toEqualTypeOf(); - expect(data.necromancer.level).toBeDefined(); - expect(data.necromancer.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.necromancer.level).toEqualTypeOf(); - expect(data.necromancer.exp).toBeDefined(); - expect(data.necromancer.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.necromancer.exp).toEqualTypeOf(); - expect(data.necromancer.kills).toBeDefined(); - expect(data.necromancer.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.necromancer.kills).toEqualTypeOf(); - expect(data.necromancer.deaths).toBeDefined(); - expect(data.necromancer.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.necromancer.deaths).toEqualTypeOf(); - expect(data.necromancer.KDR).toBeDefined(); - expect(data.necromancer.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.necromancer.KDR).toEqualTypeOf(); - expect(data.necromancer.wins).toBeDefined(); - expect(data.necromancer.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.necromancer.wins).toEqualTypeOf(); - expect(data.necromancer.gamesPlayed).toBeDefined(); - expect(data.necromancer.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.necromancer.gamesPlayed).toEqualTypeOf(); - expect(data.necromancer.losses).toBeDefined(); - expect(data.necromancer.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.necromancer.losses).toEqualTypeOf(); - expect(data.necromancer.WLR).toBeDefined(); - expect(data.necromancer.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.necromancer.WLR).toEqualTypeOf(); - expect(data.necromancer.arrowsShot).toBeDefined(); - expect(data.necromancer.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.necromancer.arrowsShot).toEqualTypeOf(); - expect(data.necromancer.arrowsHit).toBeDefined(); - expect(data.necromancer.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.necromancer.arrowsHit).toEqualTypeOf(); - expect(data.necromancer.bowAccuracy).toBeDefined(); - expect(data.necromancer.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.necromancer.bowAccuracy).toEqualTypeOf(); - expect(data.necromancer.damage).toBeDefined(); - expect(data.necromancer.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.necromancer.damage).toEqualTypeOf(); - expect(data.necromancer.damageTaken).toBeDefined(); - expect(data.necromancer.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.necromancer.damageTaken).toEqualTypeOf(); - expect(data.necromancer.potionsDrunk).toBeDefined(); - expect(data.necromancer.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.necromancer.potionsDrunk).toEqualTypeOf(); - expect(data.necromancer.potionsThrown).toBeDefined(); - expect(data.necromancer.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.necromancer.potionsThrown).toEqualTypeOf(); - expect(data.necromancer.playTime).toBeDefined(); - expect(data.necromancer.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.necromancer.playTime).toEqualTypeOf(); - expect(data.necromancer.mobsSpawned).toBeDefined(); - expect(data.necromancer.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.necromancer.mobsSpawned).toEqualTypeOf(); - expect(data.necromancer.chestsOpened).toBeDefined(); - expect(data.necromancer.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.necromancer.chestsOpened).toEqualTypeOf(); expect(data.florist).toBeDefined(); + expect(data.florist).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.florist).toEqualTypeOf(); - expect(data.florist.level).toBeDefined(); - expect(data.florist.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.florist.level).toEqualTypeOf(); - expect(data.florist.exp).toBeDefined(); - expect(data.florist.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.florist.exp).toEqualTypeOf(); - expect(data.florist.kills).toBeDefined(); - expect(data.florist.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.florist.kills).toEqualTypeOf(); - expect(data.florist.deaths).toBeDefined(); - expect(data.florist.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.florist.deaths).toEqualTypeOf(); - expect(data.florist.KDR).toBeDefined(); - expect(data.florist.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.florist.KDR).toEqualTypeOf(); - expect(data.florist.wins).toBeDefined(); - expect(data.florist.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.florist.wins).toEqualTypeOf(); - expect(data.florist.gamesPlayed).toBeDefined(); - expect(data.florist.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.florist.gamesPlayed).toEqualTypeOf(); - expect(data.florist.losses).toBeDefined(); - expect(data.florist.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.florist.losses).toEqualTypeOf(); - expect(data.florist.WLR).toBeDefined(); - expect(data.florist.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.florist.WLR).toEqualTypeOf(); - expect(data.florist.arrowsShot).toBeDefined(); - expect(data.florist.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.florist.arrowsShot).toEqualTypeOf(); - expect(data.florist.arrowsHit).toBeDefined(); - expect(data.florist.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.florist.arrowsHit).toEqualTypeOf(); - expect(data.florist.bowAccuracy).toBeDefined(); - expect(data.florist.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.florist.bowAccuracy).toEqualTypeOf(); - expect(data.florist.damage).toBeDefined(); - expect(data.florist.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.florist.damage).toEqualTypeOf(); - expect(data.florist.damageTaken).toBeDefined(); - expect(data.florist.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.florist.damageTaken).toEqualTypeOf(); - expect(data.florist.potionsDrunk).toBeDefined(); - expect(data.florist.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.florist.potionsDrunk).toEqualTypeOf(); - expect(data.florist.potionsThrown).toBeDefined(); - expect(data.florist.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.florist.potionsThrown).toEqualTypeOf(); - expect(data.florist.playTime).toBeDefined(); - expect(data.florist.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.florist.playTime).toEqualTypeOf(); - expect(data.florist.mobsSpawned).toBeDefined(); - expect(data.florist.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.florist.mobsSpawned).toEqualTypeOf(); - expect(data.florist.chestsOpened).toBeDefined(); - expect(data.florist.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.florist.chestsOpened).toEqualTypeOf(); expect(data.diver).toBeDefined(); + expect(data.diver).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.diver).toEqualTypeOf(); - expect(data.diver.level).toBeDefined(); - expect(data.diver.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.diver.level).toEqualTypeOf(); - expect(data.diver.exp).toBeDefined(); - expect(data.diver.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.diver.exp).toEqualTypeOf(); - expect(data.diver.kills).toBeDefined(); - expect(data.diver.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.diver.kills).toEqualTypeOf(); - expect(data.diver.deaths).toBeDefined(); - expect(data.diver.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.diver.deaths).toEqualTypeOf(); - expect(data.diver.KDR).toBeDefined(); - expect(data.diver.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.diver.KDR).toEqualTypeOf(); - expect(data.diver.wins).toBeDefined(); - expect(data.diver.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.diver.wins).toEqualTypeOf(); - expect(data.diver.gamesPlayed).toBeDefined(); - expect(data.diver.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.diver.gamesPlayed).toEqualTypeOf(); - expect(data.diver.losses).toBeDefined(); - expect(data.diver.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.diver.losses).toEqualTypeOf(); - expect(data.diver.WLR).toBeDefined(); - expect(data.diver.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.diver.WLR).toEqualTypeOf(); - expect(data.diver.arrowsShot).toBeDefined(); - expect(data.diver.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.diver.arrowsShot).toEqualTypeOf(); - expect(data.diver.arrowsHit).toBeDefined(); - expect(data.diver.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.diver.arrowsHit).toEqualTypeOf(); - expect(data.diver.bowAccuracy).toBeDefined(); - expect(data.diver.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.diver.bowAccuracy).toEqualTypeOf(); - expect(data.diver.damage).toBeDefined(); - expect(data.diver.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.diver.damage).toEqualTypeOf(); - expect(data.diver.damageTaken).toBeDefined(); - expect(data.diver.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.diver.damageTaken).toEqualTypeOf(); - expect(data.diver.potionsDrunk).toBeDefined(); - expect(data.diver.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.diver.potionsDrunk).toEqualTypeOf(); - expect(data.diver.potionsThrown).toBeDefined(); - expect(data.diver.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.diver.potionsThrown).toEqualTypeOf(); - expect(data.diver.playTime).toBeDefined(); - expect(data.diver.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.diver.playTime).toEqualTypeOf(); - expect(data.diver.mobsSpawned).toBeDefined(); - expect(data.diver.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.diver.mobsSpawned).toEqualTypeOf(); - expect(data.diver.chestsOpened).toBeDefined(); - expect(data.diver.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.diver.chestsOpened).toEqualTypeOf(); expect(data.arachnologist).toBeDefined(); + expect(data.arachnologist).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.arachnologist).toEqualTypeOf(); - expect(data.arachnologist.level).toBeDefined(); - expect(data.arachnologist.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arachnologist.level).toEqualTypeOf(); - expect(data.arachnologist.exp).toBeDefined(); - expect(data.arachnologist.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arachnologist.exp).toEqualTypeOf(); - expect(data.arachnologist.kills).toBeDefined(); - expect(data.arachnologist.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arachnologist.kills).toEqualTypeOf(); - expect(data.arachnologist.deaths).toBeDefined(); - expect(data.arachnologist.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arachnologist.deaths).toEqualTypeOf(); - expect(data.arachnologist.KDR).toBeDefined(); - expect(data.arachnologist.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arachnologist.KDR).toEqualTypeOf(); - expect(data.arachnologist.wins).toBeDefined(); - expect(data.arachnologist.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arachnologist.wins).toEqualTypeOf(); - expect(data.arachnologist.gamesPlayed).toBeDefined(); - expect(data.arachnologist.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arachnologist.gamesPlayed).toEqualTypeOf(); - expect(data.arachnologist.losses).toBeDefined(); - expect(data.arachnologist.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arachnologist.losses).toEqualTypeOf(); - expect(data.arachnologist.WLR).toBeDefined(); - expect(data.arachnologist.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arachnologist.WLR).toEqualTypeOf(); - expect(data.arachnologist.arrowsShot).toBeDefined(); - expect(data.arachnologist.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arachnologist.arrowsShot).toEqualTypeOf(); - expect(data.arachnologist.arrowsHit).toBeDefined(); - expect(data.arachnologist.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arachnologist.arrowsHit).toEqualTypeOf(); - expect(data.arachnologist.bowAccuracy).toBeDefined(); - expect(data.arachnologist.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arachnologist.bowAccuracy).toEqualTypeOf(); - expect(data.arachnologist.damage).toBeDefined(); - expect(data.arachnologist.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arachnologist.damage).toEqualTypeOf(); - expect(data.arachnologist.damageTaken).toBeDefined(); - expect(data.arachnologist.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arachnologist.damageTaken).toEqualTypeOf(); - expect(data.arachnologist.potionsDrunk).toBeDefined(); - expect(data.arachnologist.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arachnologist.potionsDrunk).toEqualTypeOf(); - expect(data.arachnologist.potionsThrown).toBeDefined(); - expect(data.arachnologist.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arachnologist.potionsThrown).toEqualTypeOf(); - expect(data.arachnologist.playTime).toBeDefined(); - expect(data.arachnologist.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arachnologist.playTime).toEqualTypeOf(); - expect(data.arachnologist.mobsSpawned).toBeDefined(); - expect(data.arachnologist.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arachnologist.mobsSpawned).toEqualTypeOf(); - expect(data.arachnologist.chestsOpened).toBeDefined(); - expect(data.arachnologist.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arachnologist.chestsOpened).toEqualTypeOf(); expect(data.blaze).toBeDefined(); + expect(data.blaze).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.blaze).toEqualTypeOf(); - expect(data.blaze.level).toBeDefined(); - expect(data.blaze.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blaze.level).toEqualTypeOf(); - expect(data.blaze.exp).toBeDefined(); - expect(data.blaze.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blaze.exp).toEqualTypeOf(); - expect(data.blaze.kills).toBeDefined(); - expect(data.blaze.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blaze.kills).toEqualTypeOf(); - expect(data.blaze.deaths).toBeDefined(); - expect(data.blaze.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blaze.deaths).toEqualTypeOf(); - expect(data.blaze.KDR).toBeDefined(); - expect(data.blaze.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blaze.KDR).toEqualTypeOf(); - expect(data.blaze.wins).toBeDefined(); - expect(data.blaze.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blaze.wins).toEqualTypeOf(); - expect(data.blaze.gamesPlayed).toBeDefined(); - expect(data.blaze.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blaze.gamesPlayed).toEqualTypeOf(); - expect(data.blaze.losses).toBeDefined(); - expect(data.blaze.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blaze.losses).toEqualTypeOf(); - expect(data.blaze.WLR).toBeDefined(); - expect(data.blaze.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blaze.WLR).toEqualTypeOf(); - expect(data.blaze.arrowsShot).toBeDefined(); - expect(data.blaze.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blaze.arrowsShot).toEqualTypeOf(); - expect(data.blaze.arrowsHit).toBeDefined(); - expect(data.blaze.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blaze.arrowsHit).toEqualTypeOf(); - expect(data.blaze.bowAccuracy).toBeDefined(); - expect(data.blaze.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blaze.bowAccuracy).toEqualTypeOf(); - expect(data.blaze.damage).toBeDefined(); - expect(data.blaze.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blaze.damage).toEqualTypeOf(); - expect(data.blaze.damageTaken).toBeDefined(); - expect(data.blaze.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blaze.damageTaken).toEqualTypeOf(); - expect(data.blaze.potionsDrunk).toBeDefined(); - expect(data.blaze.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blaze.potionsDrunk).toEqualTypeOf(); - expect(data.blaze.potionsThrown).toBeDefined(); - expect(data.blaze.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blaze.potionsThrown).toEqualTypeOf(); - expect(data.blaze.playTime).toBeDefined(); - expect(data.blaze.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blaze.playTime).toEqualTypeOf(); - expect(data.blaze.mobsSpawned).toBeDefined(); - expect(data.blaze.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blaze.mobsSpawned).toEqualTypeOf(); - expect(data.blaze.chestsOpened).toBeDefined(); - expect(data.blaze.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blaze.chestsOpened).toEqualTypeOf(); expect(data.wolftamer).toBeDefined(); + expect(data.wolftamer).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.wolftamer).toEqualTypeOf(); - expect(data.wolftamer.level).toBeDefined(); - expect(data.wolftamer.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wolftamer.level).toEqualTypeOf(); - expect(data.wolftamer.exp).toBeDefined(); - expect(data.wolftamer.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wolftamer.exp).toEqualTypeOf(); - expect(data.wolftamer.kills).toBeDefined(); - expect(data.wolftamer.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wolftamer.kills).toEqualTypeOf(); - expect(data.wolftamer.deaths).toBeDefined(); - expect(data.wolftamer.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wolftamer.deaths).toEqualTypeOf(); - expect(data.wolftamer.KDR).toBeDefined(); - expect(data.wolftamer.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wolftamer.KDR).toEqualTypeOf(); - expect(data.wolftamer.wins).toBeDefined(); - expect(data.wolftamer.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wolftamer.wins).toEqualTypeOf(); - expect(data.wolftamer.gamesPlayed).toBeDefined(); - expect(data.wolftamer.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wolftamer.gamesPlayed).toEqualTypeOf(); - expect(data.wolftamer.losses).toBeDefined(); - expect(data.wolftamer.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wolftamer.losses).toEqualTypeOf(); - expect(data.wolftamer.WLR).toBeDefined(); - expect(data.wolftamer.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wolftamer.WLR).toEqualTypeOf(); - expect(data.wolftamer.arrowsShot).toBeDefined(); - expect(data.wolftamer.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wolftamer.arrowsShot).toEqualTypeOf(); - expect(data.wolftamer.arrowsHit).toBeDefined(); - expect(data.wolftamer.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wolftamer.arrowsHit).toEqualTypeOf(); - expect(data.wolftamer.bowAccuracy).toBeDefined(); - expect(data.wolftamer.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wolftamer.bowAccuracy).toEqualTypeOf(); - expect(data.wolftamer.damage).toBeDefined(); - expect(data.wolftamer.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wolftamer.damage).toEqualTypeOf(); - expect(data.wolftamer.damageTaken).toBeDefined(); - expect(data.wolftamer.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wolftamer.damageTaken).toEqualTypeOf(); - expect(data.wolftamer.potionsDrunk).toBeDefined(); - expect(data.wolftamer.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wolftamer.potionsDrunk).toEqualTypeOf(); - expect(data.wolftamer.potionsThrown).toBeDefined(); - expect(data.wolftamer.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wolftamer.potionsThrown).toEqualTypeOf(); - expect(data.wolftamer.playTime).toBeDefined(); - expect(data.wolftamer.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wolftamer.playTime).toEqualTypeOf(); - expect(data.wolftamer.mobsSpawned).toBeDefined(); - expect(data.wolftamer.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wolftamer.mobsSpawned).toEqualTypeOf(); - expect(data.wolftamer.chestsOpened).toBeDefined(); - expect(data.wolftamer.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wolftamer.chestsOpened).toEqualTypeOf(); expect(data.tim).toBeDefined(); + expect(data.tim).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.tim).toEqualTypeOf(); - expect(data.tim.level).toBeDefined(); - expect(data.tim.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.tim.level).toEqualTypeOf(); - expect(data.tim.exp).toBeDefined(); - expect(data.tim.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.tim.exp).toEqualTypeOf(); - expect(data.tim.kills).toBeDefined(); - expect(data.tim.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.tim.kills).toEqualTypeOf(); - expect(data.tim.deaths).toBeDefined(); - expect(data.tim.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.tim.deaths).toEqualTypeOf(); - expect(data.tim.KDR).toBeDefined(); - expect(data.tim.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.tim.KDR).toEqualTypeOf(); - expect(data.tim.wins).toBeDefined(); - expect(data.tim.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.tim.wins).toEqualTypeOf(); - expect(data.tim.gamesPlayed).toBeDefined(); - expect(data.tim.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.tim.gamesPlayed).toEqualTypeOf(); - expect(data.tim.losses).toBeDefined(); - expect(data.tim.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.tim.losses).toEqualTypeOf(); - expect(data.tim.WLR).toBeDefined(); - expect(data.tim.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.tim.WLR).toEqualTypeOf(); - expect(data.tim.arrowsShot).toBeDefined(); - expect(data.tim.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.tim.arrowsShot).toEqualTypeOf(); - expect(data.tim.arrowsHit).toBeDefined(); - expect(data.tim.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.tim.arrowsHit).toEqualTypeOf(); - expect(data.tim.bowAccuracy).toBeDefined(); - expect(data.tim.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.tim.bowAccuracy).toEqualTypeOf(); - expect(data.tim.damage).toBeDefined(); - expect(data.tim.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.tim.damage).toEqualTypeOf(); - expect(data.tim.damageTaken).toBeDefined(); - expect(data.tim.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.tim.damageTaken).toEqualTypeOf(); - expect(data.tim.potionsDrunk).toBeDefined(); - expect(data.tim.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.tim.potionsDrunk).toEqualTypeOf(); - expect(data.tim.potionsThrown).toBeDefined(); - expect(data.tim.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.tim.potionsThrown).toEqualTypeOf(); - expect(data.tim.playTime).toBeDefined(); - expect(data.tim.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.tim.playTime).toEqualTypeOf(); - expect(data.tim.mobsSpawned).toBeDefined(); - expect(data.tim.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.tim.mobsSpawned).toEqualTypeOf(); - expect(data.tim.chestsOpened).toBeDefined(); - expect(data.tim.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.tim.chestsOpened).toEqualTypeOf(); expect(data.farmer).toBeDefined(); + expect(data.farmer).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.farmer).toEqualTypeOf(); - expect(data.farmer.level).toBeDefined(); - expect(data.farmer.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.farmer.level).toEqualTypeOf(); - expect(data.farmer.exp).toBeDefined(); - expect(data.farmer.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.farmer.exp).toEqualTypeOf(); - expect(data.farmer.kills).toBeDefined(); - expect(data.farmer.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.farmer.kills).toEqualTypeOf(); - expect(data.farmer.deaths).toBeDefined(); - expect(data.farmer.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.farmer.deaths).toEqualTypeOf(); - expect(data.farmer.KDR).toBeDefined(); - expect(data.farmer.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.farmer.KDR).toEqualTypeOf(); - expect(data.farmer.wins).toBeDefined(); - expect(data.farmer.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.farmer.wins).toEqualTypeOf(); - expect(data.farmer.gamesPlayed).toBeDefined(); - expect(data.farmer.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.farmer.gamesPlayed).toEqualTypeOf(); - expect(data.farmer.losses).toBeDefined(); - expect(data.farmer.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.farmer.losses).toEqualTypeOf(); - expect(data.farmer.WLR).toBeDefined(); - expect(data.farmer.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.farmer.WLR).toEqualTypeOf(); - expect(data.farmer.arrowsShot).toBeDefined(); - expect(data.farmer.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.farmer.arrowsShot).toEqualTypeOf(); - expect(data.farmer.arrowsHit).toBeDefined(); - expect(data.farmer.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.farmer.arrowsHit).toEqualTypeOf(); - expect(data.farmer.bowAccuracy).toBeDefined(); - expect(data.farmer.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.farmer.bowAccuracy).toEqualTypeOf(); - expect(data.farmer.damage).toBeDefined(); - expect(data.farmer.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.farmer.damage).toEqualTypeOf(); - expect(data.farmer.damageTaken).toBeDefined(); - expect(data.farmer.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.farmer.damageTaken).toEqualTypeOf(); - expect(data.farmer.potionsDrunk).toBeDefined(); - expect(data.farmer.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.farmer.potionsDrunk).toEqualTypeOf(); - expect(data.farmer.potionsThrown).toBeDefined(); - expect(data.farmer.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.farmer.potionsThrown).toEqualTypeOf(); - expect(data.farmer.playTime).toBeDefined(); - expect(data.farmer.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.farmer.playTime).toEqualTypeOf(); - expect(data.farmer.mobsSpawned).toBeDefined(); - expect(data.farmer.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.farmer.mobsSpawned).toEqualTypeOf(); - expect(data.farmer.chestsOpened).toBeDefined(); - expect(data.farmer.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.farmer.chestsOpened).toEqualTypeOf(); expect(data.creepertamer).toBeDefined(); + expect(data.creepertamer).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.creepertamer).toEqualTypeOf(); - expect(data.creepertamer.level).toBeDefined(); - expect(data.creepertamer.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.creepertamer.level).toEqualTypeOf(); - expect(data.creepertamer.exp).toBeDefined(); - expect(data.creepertamer.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.creepertamer.exp).toEqualTypeOf(); - expect(data.creepertamer.kills).toBeDefined(); - expect(data.creepertamer.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.creepertamer.kills).toEqualTypeOf(); - expect(data.creepertamer.deaths).toBeDefined(); - expect(data.creepertamer.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.creepertamer.deaths).toEqualTypeOf(); - expect(data.creepertamer.KDR).toBeDefined(); - expect(data.creepertamer.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.creepertamer.KDR).toEqualTypeOf(); - expect(data.creepertamer.wins).toBeDefined(); - expect(data.creepertamer.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.creepertamer.wins).toEqualTypeOf(); - expect(data.creepertamer.gamesPlayed).toBeDefined(); - expect(data.creepertamer.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.creepertamer.gamesPlayed).toEqualTypeOf(); - expect(data.creepertamer.losses).toBeDefined(); - expect(data.creepertamer.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.creepertamer.losses).toEqualTypeOf(); - expect(data.creepertamer.WLR).toBeDefined(); - expect(data.creepertamer.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.creepertamer.WLR).toEqualTypeOf(); - expect(data.creepertamer.arrowsShot).toBeDefined(); - expect(data.creepertamer.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.creepertamer.arrowsShot).toEqualTypeOf(); - expect(data.creepertamer.arrowsHit).toBeDefined(); - expect(data.creepertamer.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.creepertamer.arrowsHit).toEqualTypeOf(); - expect(data.creepertamer.bowAccuracy).toBeDefined(); - expect(data.creepertamer.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.creepertamer.bowAccuracy).toEqualTypeOf(); - expect(data.creepertamer.damage).toBeDefined(); - expect(data.creepertamer.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.creepertamer.damage).toEqualTypeOf(); - expect(data.creepertamer.damageTaken).toBeDefined(); - expect(data.creepertamer.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.creepertamer.damageTaken).toEqualTypeOf(); - expect(data.creepertamer.potionsDrunk).toBeDefined(); - expect(data.creepertamer.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.creepertamer.potionsDrunk).toEqualTypeOf(); - expect(data.creepertamer.potionsThrown).toBeDefined(); - expect(data.creepertamer.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.creepertamer.potionsThrown).toEqualTypeOf(); - expect(data.creepertamer.playTime).toBeDefined(); - expect(data.creepertamer.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.creepertamer.playTime).toEqualTypeOf(); - expect(data.creepertamer.mobsSpawned).toBeDefined(); - expect(data.creepertamer.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.creepertamer.mobsSpawned).toEqualTypeOf(); - expect(data.creepertamer.chestsOpened).toBeDefined(); - expect(data.creepertamer.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.creepertamer.chestsOpened).toEqualTypeOf(); expect(data.snowman).toBeDefined(); + expect(data.snowman).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.snowman).toEqualTypeOf(); - expect(data.snowman.level).toBeDefined(); - expect(data.snowman.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.snowman.level).toEqualTypeOf(); - expect(data.snowman.exp).toBeDefined(); - expect(data.snowman.exp).toBeGreaterThanOrEqual(0); - expectTypeOf(data.snowman.exp).toEqualTypeOf(); - expect(data.snowman.kills).toBeDefined(); - expect(data.snowman.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.snowman.kills).toEqualTypeOf(); - expect(data.snowman.deaths).toBeDefined(); - expect(data.snowman.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.snowman.deaths).toEqualTypeOf(); - expect(data.snowman.KDR).toBeDefined(); - expect(data.snowman.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.snowman.KDR).toEqualTypeOf(); - expect(data.snowman.wins).toBeDefined(); - expect(data.snowman.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.snowman.wins).toEqualTypeOf(); - expect(data.snowman.gamesPlayed).toBeDefined(); - expect(data.snowman.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.snowman.gamesPlayed).toEqualTypeOf(); - expect(data.snowman.losses).toBeDefined(); - expect(data.snowman.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.snowman.losses).toEqualTypeOf(); - expect(data.snowman.WLR).toBeDefined(); - expect(data.snowman.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.snowman.WLR).toEqualTypeOf(); - expect(data.snowman.arrowsShot).toBeDefined(); - expect(data.snowman.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.snowman.arrowsShot).toEqualTypeOf(); - expect(data.snowman.arrowsHit).toBeDefined(); - expect(data.snowman.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.snowman.arrowsHit).toEqualTypeOf(); - expect(data.snowman.bowAccuracy).toBeDefined(); - expect(data.snowman.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.snowman.bowAccuracy).toEqualTypeOf(); - expect(data.snowman.damage).toBeDefined(); - expect(data.snowman.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.snowman.damage).toEqualTypeOf(); - expect(data.snowman.damageTaken).toBeDefined(); - expect(data.snowman.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.snowman.damageTaken).toEqualTypeOf(); - expect(data.snowman.potionsDrunk).toBeDefined(); - expect(data.snowman.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.snowman.potionsDrunk).toEqualTypeOf(); - expect(data.snowman.potionsThrown).toBeDefined(); - expect(data.snowman.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.snowman.potionsThrown).toEqualTypeOf(); - expect(data.snowman.playTime).toBeDefined(); - expect(data.snowman.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.snowman.playTime).toEqualTypeOf(); - expect(data.snowman.mobsSpawned).toBeDefined(); - expect(data.snowman.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.snowman.mobsSpawned).toEqualTypeOf(); - expect(data.snowman.chestsOpened).toBeDefined(); - expect(data.snowman.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.snowman.chestsOpened).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesKit.test.ts b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesKit.test.ts new file mode 100644 index 000000000..126284ed2 --- /dev/null +++ b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesKit.test.ts @@ -0,0 +1,66 @@ +import BlitzSurvivalGamesKit from './BlitzSurvivalGamesKit.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BlitzSurvivalGamesKit', () => { + const data = new BlitzSurvivalGamesKit({ stats: 'meow' }, 'arachnologist'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expect(data.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.exp).toBeDefined(); + expect(data.exp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.exp).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.gamesPlayed).toBeDefined(); + expect(data.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gamesPlayed).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.arrowsShot).toBeDefined(); + expect(data.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arrowsShot).toEqualTypeOf(); + expect(data.arrowsHit).toBeDefined(); + expect(data.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arrowsHit).toEqualTypeOf(); + expect(data.bowAccuracy).toBeDefined(); + expect(data.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowAccuracy).toEqualTypeOf(); + expect(data.damage).toBeDefined(); + expect(data.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.damage).toEqualTypeOf(); + expect(data.damageTaken).toBeDefined(); + expect(data.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.damageTaken).toEqualTypeOf(); + expect(data.potionsDrunk).toBeDefined(); + expect(data.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.potionsDrunk).toEqualTypeOf(); + expect(data.potionsThrown).toBeDefined(); + expect(data.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.potionsThrown).toEqualTypeOf(); + expect(data.playTime).toBeDefined(); + expect(data.playTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playTime).toEqualTypeOf(); + expect(data.mobsSpawned).toBeDefined(); + expect(data.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mobsSpawned).toEqualTypeOf(); + expect(data.chestsOpened).toBeDefined(); + expect(data.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.chestsOpened).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BuildBattle/BuildBattle.test.ts b/src/Structures/MiniGames/BuildBattle/BuildBattle.test.ts new file mode 100644 index 000000000..d05d7b0d7 --- /dev/null +++ b/src/Structures/MiniGames/BuildBattle/BuildBattle.test.ts @@ -0,0 +1,123 @@ +import BuildBattle from './BuildBattle.js'; +import BuildBattleLastWin from './BuildBattleLastWin.js'; +import BuildBattleVotes from './BuildBattleVotes.js'; +import Emblem from '../Shared/Emblem/Emblem.js'; +import LeaderboardSettings from '../Shared/LeaderboardSettings.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { + BuildBattleBackdrop, + BuildBattleEmblemIcon, + BuildBattleHat, + BuildBattleIsland, + BuildBattleLeaderboardSettingsMode, + BuildBattleMovementTrail, + BuildBattlePackageItem, + BuildBattleSong, + BuildBattleSuit, + BuildBattleTitle, + BuildBattleVictoryDance, + ShopSort +} from '../../../Types/Player.js'; + +test('BuildBattle', () => { + const data = new BuildBattle({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BuildBattle); + expectTypeOf(data).toEqualTypeOf(); + expect(data.activeIsland).toBeDefined(); + expectTypeOf(data.activeIsland).toEqualTypeOf(); + expect(data.activeMovementTrail).toBeDefined(); + expectTypeOf(data.activeMovementTrail).toEqualTypeOf(); + expect(data.correctGuesses).toBeDefined(); + expect(data.correctGuesses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.correctGuesses).toEqualTypeOf(); + expect(data.emblem).toBeDefined(); + expectTypeOf(data.emblem).toEqualTypeOf>(); + expect(data.playedGames).toBeDefined(); + expect(data.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playedGames).toEqualTypeOf(); + expect(data.lastPurchasedSong).toBeDefined(); + expectTypeOf(data.lastPurchasedSong).toEqualTypeOf(); + expect(data.lastWon).toBeDefined(); + expect(data.lastWon).toBeInstanceOf(BuildBattleLastWin); + expectTypeOf(data.lastWon).toEqualTypeOf(); + expect(data.leaderboardSettings).toBeDefined(); + expectTypeOf(data.leaderboardSettings).toEqualTypeOf>(); + expect(data.loadout).toBeDefined(); + expectTypeOf(data.loadout).toEqualTypeOf(); + expect(data.monthlyTokensA).toBeDefined(); + expect(data.monthlyTokensA).toBeGreaterThanOrEqual(0); + expectTypeOf(data.monthlyTokensA).toEqualTypeOf(); + expect(data.monthlyTokensB).toBeDefined(); + expect(data.monthlyTokensB).toBeGreaterThanOrEqual(0); + expectTypeOf(data.monthlyTokensB).toEqualTypeOf(); + expect(data.monthlyTokens).toBeDefined(); + expect(data.monthlyTokens).toBeGreaterThanOrEqual(0); + expectTypeOf(data.monthlyTokens).toEqualTypeOf(); + expect(data.music).toBeDefined(); + expectTypeOf(data.music).toEqualTypeOf(); + expect(data.selectedHat).toBeDefined(); + expectTypeOf(data.selectedHat).toEqualTypeOf(); + expect(data.suit).toBeDefined(); + expectTypeOf(data.suit).toEqualTypeOf(); + expect(data.victoryDance).toBeDefined(); + expectTypeOf(data.victoryDance).toEqualTypeOf(); + expect(data.packages).toBeDefined(); + expectTypeOf(data.packages).toEqualTypeOf(); + expect(data.score).toBeDefined(); + expect(data.score).toBeGreaterThanOrEqual(0); + expectTypeOf(data.score).toEqualTypeOf(); + expect(data.title).toBeDefined(); + expectTypeOf(data.title).toEqualTypeOf(); + expect(data.selectedBackdrop).toBeDefined(); + expectTypeOf(data.selectedBackdrop).toEqualTypeOf(); + expect(data.shopSort).toBeDefined(); + expectTypeOf(data.shopSort).toEqualTypeOf(); + expect(data.shopSortEnableOwnedFirst).toBeDefined(); + expectTypeOf(data.shopSortEnableOwnedFirst).toEqualTypeOf(); + expect(data.soloMostPoints).toBeDefined(); + expect(data.soloMostPoints).toBeGreaterThanOrEqual(0); + expectTypeOf(data.soloMostPoints).toEqualTypeOf(); + expect(data.superVotes).toBeDefined(); + expect(data.superVotes).toBeGreaterThanOrEqual(0); + expectTypeOf(data.superVotes).toEqualTypeOf(); + expect(data.teamsMostPoints).toBeDefined(); + expect(data.teamsMostPoints).toBeGreaterThanOrEqual(0); + expectTypeOf(data.teamsMostPoints).toEqualTypeOf(); + expect(data.tokens).toBeDefined(); + expect(data.tokens).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tokens).toEqualTypeOf(); + expect(data.totalVotes).toBeDefined(); + expect(data.totalVotes).toBeGreaterThanOrEqual(0); + expectTypeOf(data.totalVotes).toEqualTypeOf(); + expect(data.weeklyTokensA).toBeDefined(); + expect(data.weeklyTokensA).toBeGreaterThanOrEqual(0); + expectTypeOf(data.weeklyTokensA).toEqualTypeOf(); + expect(data.weeklyTokensB).toBeDefined(); + expect(data.weeklyTokensB).toBeGreaterThanOrEqual(0); + expectTypeOf(data.weeklyTokensB).toEqualTypeOf(); + expect(data.votes).toBeDefined(); + expect(data.votes).toBeInstanceOf(BuildBattleVotes); + expectTypeOf(data.votes).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.winsGuessTheBuild).toBeDefined(); + expect(data.winsGuessTheBuild).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsGuessTheBuild).toEqualTypeOf(); + expect(data.winsHalloween).toBeDefined(); + expect(data.winsHalloween).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsHalloween).toEqualTypeOf(); + expect(data.winsSoloNormal).toBeDefined(); + expect(data.winsSoloNormal).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsSoloNormal).toEqualTypeOf(); + expect(data.winsSoloPro).toBeDefined(); + expect(data.winsSoloPro).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsSoloPro).toEqualTypeOf(); + expect(data.winsSpeedBuilders).toBeDefined(); + expect(data.winsSpeedBuilders).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsSpeedBuilders).toEqualTypeOf(); + expect(data.winsTeamsNormal).toBeDefined(); + expect(data.winsTeamsNormal).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsTeamsNormal).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BuildBattle/BuildBattleLastWin.test.ts b/src/Structures/MiniGames/BuildBattle/BuildBattleLastWin.test.ts new file mode 100644 index 000000000..709ec23e7 --- /dev/null +++ b/src/Structures/MiniGames/BuildBattle/BuildBattleLastWin.test.ts @@ -0,0 +1,19 @@ +import BuildBattleLastWin from './BuildBattleLastWin.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BuildBattleLastWin', () => { + const data = new BuildBattleLastWin({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BuildBattleLastWin); + expectTypeOf(data).toEqualTypeOf(); + expect(data.guessTheBuildAt).toBeDefined(); + expectTypeOf(data.guessTheBuildAt).toEqualTypeOf(); + expect(data.soloNormalAt).toBeDefined(); + expectTypeOf(data.soloNormalAt).toEqualTypeOf(); + expect(data.soloProAt).toBeDefined(); + expectTypeOf(data.soloProAt).toEqualTypeOf(); + expect(data.speedBuildersAt).toBeDefined(); + expectTypeOf(data.speedBuildersAt).toEqualTypeOf(); + expect(data.teamsNormalAt).toBeDefined(); + expectTypeOf(data.teamsNormalAt).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BuildBattle/BuildBattleVotes.test.ts b/src/Structures/MiniGames/BuildBattle/BuildBattleVotes.test.ts new file mode 100644 index 000000000..575d0629f --- /dev/null +++ b/src/Structures/MiniGames/BuildBattle/BuildBattleVotes.test.ts @@ -0,0 +1,1869 @@ +import BuildBattleVotes from './BuildBattleVotes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BuildBattleVotes', () => { + const data = new BuildBattleVotes({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BuildBattleVotes); + expectTypeOf(data).toEqualTypeOf(); + expect(data.abandoned).toBeDefined(); + expect(data.abandoned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.abandoned).toEqualTypeOf(); + expect(data.abandonedMansion).toBeDefined(); + expect(data.abandonedMansion).toBeGreaterThanOrEqual(0); + expectTypeOf(data.abandonedMansion).toEqualTypeOf(); + expect(data.adventCalendar).toBeDefined(); + expect(data.adventCalendar).toBeGreaterThanOrEqual(0); + expectTypeOf(data.adventCalendar).toEqualTypeOf(); + expect(data.airplane).toBeDefined(); + expect(data.airplane).toBeGreaterThanOrEqual(0); + expectTypeOf(data.airplane).toEqualTypeOf(); + expect(data.aladdin).toBeDefined(); + expect(data.aladdin).toBeGreaterThanOrEqual(0); + expectTypeOf(data.aladdin).toEqualTypeOf(); + expect(data.alien).toBeDefined(); + expect(data.alien).toBeGreaterThanOrEqual(0); + expectTypeOf(data.alien).toEqualTypeOf(); + expect(data.alienInvasion).toBeDefined(); + expect(data.alienInvasion).toBeGreaterThanOrEqual(0); + expectTypeOf(data.alienInvasion).toEqualTypeOf(); + expect(data.anchor).toBeDefined(); + expect(data.anchor).toBeGreaterThanOrEqual(0); + expectTypeOf(data.anchor).toEqualTypeOf(); + expect(data.ancient).toBeDefined(); + expect(data.ancient).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ancient).toEqualTypeOf(); + expect(data.angel).toBeDefined(); + expect(data.angel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.angel).toEqualTypeOf(); + expect(data.angry).toBeDefined(); + expect(data.angry).toBeGreaterThanOrEqual(0); + expectTypeOf(data.angry).toEqualTypeOf(); + expect(data.animal).toBeDefined(); + expect(data.animal).toBeGreaterThanOrEqual(0); + expectTypeOf(data.animal).toEqualTypeOf(); + expect(data.ant).toBeDefined(); + expect(data.ant).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ant).toEqualTypeOf(); + expect(data.apocalyptic).toBeDefined(); + expect(data.apocalyptic).toBeGreaterThanOrEqual(0); + expectTypeOf(data.apocalyptic).toEqualTypeOf(); + expect(data.apple).toBeDefined(); + expect(data.apple).toBeGreaterThanOrEqual(0); + expectTypeOf(data.apple).toEqualTypeOf(); + expect(data.aquarium).toBeDefined(); + expect(data.aquarium).toBeGreaterThanOrEqual(0); + expectTypeOf(data.aquarium).toEqualTypeOf(); + expect(data.arcade).toBeDefined(); + expect(data.arcade).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arcade).toEqualTypeOf(); + expect(data.arcadeMachine).toBeDefined(); + expect(data.arcadeMachine).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arcadeMachine).toEqualTypeOf(); + expect(data.archer).toBeDefined(); + expect(data.archer).toBeGreaterThanOrEqual(0); + expectTypeOf(data.archer).toEqualTypeOf(); + expect(data.arm).toBeDefined(); + expect(data.arm).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arm).toEqualTypeOf(); + expect(data.astronaut).toBeDefined(); + expect(data.astronaut).toBeGreaterThanOrEqual(0); + expectTypeOf(data.astronaut).toEqualTypeOf(); + expect(data.awards).toBeDefined(); + expect(data.awards).toBeGreaterThanOrEqual(0); + expectTypeOf(data.awards).toEqualTypeOf(); + expect(data.axe).toBeDefined(); + expect(data.axe).toBeGreaterThanOrEqual(0); + expectTypeOf(data.axe).toEqualTypeOf(); + expect(data.baby).toBeDefined(); + expect(data.baby).toBeGreaterThanOrEqual(0); + expectTypeOf(data.baby).toEqualTypeOf(); + expect(data.backpack).toBeDefined(); + expect(data.backpack).toBeGreaterThanOrEqual(0); + expectTypeOf(data.backpack).toEqualTypeOf(); + expect(data.bacon).toBeDefined(); + expect(data.bacon).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bacon).toEqualTypeOf(); + expect(data.bakery).toBeDefined(); + expect(data.bakery).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bakery).toEqualTypeOf(); + expect(data.baking).toBeDefined(); + expect(data.baking).toBeGreaterThanOrEqual(0); + expectTypeOf(data.baking).toEqualTypeOf(); + expect(data.balloon).toBeDefined(); + expect(data.balloon).toBeGreaterThanOrEqual(0); + expectTypeOf(data.balloon).toEqualTypeOf(); + expect(data.banana).toBeDefined(); + expect(data.banana).toBeGreaterThanOrEqual(0); + expectTypeOf(data.banana).toEqualTypeOf(); + expect(data.barbeque).toBeDefined(); + expect(data.barbeque).toBeGreaterThanOrEqual(0); + expectTypeOf(data.barbeque).toEqualTypeOf(); + expect(data.barn).toBeDefined(); + expect(data.barn).toBeGreaterThanOrEqual(0); + expectTypeOf(data.barn).toEqualTypeOf(); + expect(data.bat).toBeDefined(); + expect(data.bat).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bat).toEqualTypeOf(); + expect(data.bath).toBeDefined(); + expect(data.bath).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bath).toEqualTypeOf(); + expect(data.bats).toBeDefined(); + expect(data.bats).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bats).toEqualTypeOf(); + expect(data.battle).toBeDefined(); + expect(data.battle).toBeGreaterThanOrEqual(0); + expectTypeOf(data.battle).toEqualTypeOf(); + expect(data.baubles).toBeDefined(); + expect(data.baubles).toBeGreaterThanOrEqual(0); + expectTypeOf(data.baubles).toEqualTypeOf(); + expect(data.beach).toBeDefined(); + expect(data.beach).toBeGreaterThanOrEqual(0); + expectTypeOf(data.beach).toEqualTypeOf(); + expect(data.beanstalk).toBeDefined(); + expect(data.beanstalk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.beanstalk).toEqualTypeOf(); + expect(data.bear).toBeDefined(); + expect(data.bear).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bear).toEqualTypeOf(); + expect(data.beard).toBeDefined(); + expect(data.beard).toBeGreaterThanOrEqual(0); + expectTypeOf(data.beard).toEqualTypeOf(); + expect(data.bed).toBeDefined(); + expect(data.bed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bed).toEqualTypeOf(); + expect(data.bee).toBeDefined(); + expect(data.bee).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bee).toEqualTypeOf(); + expect(data.bell).toBeDefined(); + expect(data.bell).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bell).toEqualTypeOf(); + expect(data.bike).toBeDefined(); + expect(data.bike).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bike).toEqualTypeOf(); + expect(data.bikeRiding).toBeDefined(); + expect(data.bikeRiding).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bikeRiding).toEqualTypeOf(); + expect(data.bird).toBeDefined(); + expect(data.bird).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bird).toEqualTypeOf(); + expect(data.birdHouse).toBeDefined(); + expect(data.birdHouse).toBeGreaterThanOrEqual(0); + expectTypeOf(data.birdHouse).toEqualTypeOf(); + expect(data.birthday).toBeDefined(); + expect(data.birthday).toBeGreaterThanOrEqual(0); + expectTypeOf(data.birthday).toEqualTypeOf(); + expect(data.birthdayParty).toBeDefined(); + expect(data.birthdayParty).toBeGreaterThanOrEqual(0); + expectTypeOf(data.birthdayParty).toEqualTypeOf(); + expect(data.blaze).toBeDefined(); + expect(data.blaze).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blaze).toEqualTypeOf(); + expect(data.blizzard).toBeDefined(); + expect(data.blizzard).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blizzard).toEqualTypeOf(); + expect(data.block).toBeDefined(); + expect(data.block).toBeGreaterThanOrEqual(0); + expectTypeOf(data.block).toEqualTypeOf(); + expect(data.blocks).toBeDefined(); + expect(data.blocks).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocks).toEqualTypeOf(); + expect(data.boardGames).toBeDefined(); + expect(data.boardGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.boardGames).toEqualTypeOf(); + expect(data.boardgames).toBeDefined(); + expect(data.boardgames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.boardgames).toEqualTypeOf(); + expect(data.boat).toBeDefined(); + expect(data.boat).toBeGreaterThanOrEqual(0); + expectTypeOf(data.boat).toEqualTypeOf(); + expect(data.bobsledding).toBeDefined(); + expect(data.bobsledding).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bobsledding).toEqualTypeOf(); + expect(data.bones).toBeDefined(); + expect(data.bones).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bones).toEqualTypeOf(); + expect(data.boogeyman).toBeDefined(); + expect(data.boogeyman).toBeGreaterThanOrEqual(0); + expectTypeOf(data.boogeyman).toEqualTypeOf(); + expect(data.book).toBeDefined(); + expect(data.book).toBeGreaterThanOrEqual(0); + expectTypeOf(data.book).toEqualTypeOf(); + expect(data.boot).toBeDefined(); + expect(data.boot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.boot).toEqualTypeOf(); + expect(data.bottle).toBeDefined(); + expect(data.bottle).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bottle).toEqualTypeOf(); + expect(data.bouncyCastle).toBeDefined(); + expect(data.bouncyCastle).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bouncyCastle).toEqualTypeOf(); + expect(data.bowlingAlley).toBeDefined(); + expect(data.bowlingAlley).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowlingAlley).toEqualTypeOf(); + expect(data.box).toBeDefined(); + expect(data.box).toBeGreaterThanOrEqual(0); + expectTypeOf(data.box).toEqualTypeOf(); + expect(data.boxingRing).toBeDefined(); + expect(data.boxingRing).toBeGreaterThanOrEqual(0); + expectTypeOf(data.boxingRing).toEqualTypeOf(); + expect(data.boy).toBeDefined(); + expect(data.boy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.boy).toEqualTypeOf(); + expect(data.brain).toBeDefined(); + expect(data.brain).toBeGreaterThanOrEqual(0); + expectTypeOf(data.brain).toEqualTypeOf(); + expect(data.branch).toBeDefined(); + expect(data.branch).toBeGreaterThanOrEqual(0); + expectTypeOf(data.branch).toEqualTypeOf(); + expect(data.bread).toBeDefined(); + expect(data.bread).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bread).toEqualTypeOf(); + expect(data.breakfast).toBeDefined(); + expect(data.breakfast).toBeGreaterThanOrEqual(0); + expectTypeOf(data.breakfast).toEqualTypeOf(); + expect(data.brewingStand).toBeDefined(); + expect(data.brewingStand).toBeGreaterThanOrEqual(0); + expectTypeOf(data.brewingStand).toEqualTypeOf(); + expect(data.bridge).toBeDefined(); + expect(data.bridge).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridge).toEqualTypeOf(); + expect(data.brokenBridge).toBeDefined(); + expect(data.brokenBridge).toBeGreaterThanOrEqual(0); + expectTypeOf(data.brokenBridge).toEqualTypeOf(); + expect(data.broomstick).toBeDefined(); + expect(data.broomstick).toBeGreaterThanOrEqual(0); + expectTypeOf(data.broomstick).toEqualTypeOf(); + expect(data.bucket).toBeDefined(); + expect(data.bucket).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bucket).toEqualTypeOf(); + expect(data.bug).toBeDefined(); + expect(data.bug).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bug).toEqualTypeOf(); + expect(data.builder).toBeDefined(); + expect(data.builder).toBeGreaterThanOrEqual(0); + expectTypeOf(data.builder).toEqualTypeOf(); + expect(data.bunny).toBeDefined(); + expect(data.bunny).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bunny).toEqualTypeOf(); + expect(data.buried).toBeDefined(); + expect(data.buried).toBeGreaterThanOrEqual(0); + expectTypeOf(data.buried).toEqualTypeOf(); + expect(data.butterflies).toBeDefined(); + expect(data.butterflies).toBeGreaterThanOrEqual(0); + expectTypeOf(data.butterflies).toEqualTypeOf(); + expect(data.butterfly).toBeDefined(); + expect(data.butterfly).toBeGreaterThanOrEqual(0); + expectTypeOf(data.butterfly).toEqualTypeOf(); + expect(data.button).toBeDefined(); + expect(data.button).toBeGreaterThanOrEqual(0); + expectTypeOf(data.button).toEqualTypeOf(); + expect(data.cabin).toBeDefined(); + expect(data.cabin).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cabin).toEqualTypeOf(); + expect(data.cake).toBeDefined(); + expect(data.cake).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cake).toEqualTypeOf(); + expect(data.camel).toBeDefined(); + expect(data.camel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.camel).toEqualTypeOf(); + expect(data.camera).toBeDefined(); + expect(data.camera).toBeGreaterThanOrEqual(0); + expectTypeOf(data.camera).toEqualTypeOf(); + expect(data.camp).toBeDefined(); + expect(data.camp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.camp).toEqualTypeOf(); + expect(data.campfire).toBeDefined(); + expect(data.campfire).toBeGreaterThanOrEqual(0); + expectTypeOf(data.campfire).toEqualTypeOf(); + expect(data.camping).toBeDefined(); + expect(data.camping).toBeGreaterThanOrEqual(0); + expectTypeOf(data.camping).toEqualTypeOf(); + expect(data.campsite).toBeDefined(); + expect(data.campsite).toBeGreaterThanOrEqual(0); + expectTypeOf(data.campsite).toEqualTypeOf(); + expect(data.candle).toBeDefined(); + expect(data.candle).toBeGreaterThanOrEqual(0); + expectTypeOf(data.candle).toEqualTypeOf(); + expect(data.candlelight).toBeDefined(); + expect(data.candlelight).toBeGreaterThanOrEqual(0); + expectTypeOf(data.candlelight).toEqualTypeOf(); + expect(data.candles).toBeDefined(); + expect(data.candles).toBeGreaterThanOrEqual(0); + expectTypeOf(data.candles).toEqualTypeOf(); + expect(data.candy).toBeDefined(); + expect(data.candy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.candy).toEqualTypeOf(); + expect(data.candyBuckets).toBeDefined(); + expect(data.candyBuckets).toBeGreaterThanOrEqual(0); + expectTypeOf(data.candyBuckets).toEqualTypeOf(); + expect(data.candyCane).toBeDefined(); + expect(data.candyCane).toBeGreaterThanOrEqual(0); + expectTypeOf(data.candyCane).toEqualTypeOf(); + expect(data.cannon).toBeDefined(); + expect(data.cannon).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cannon).toEqualTypeOf(); + expect(data.car).toBeDefined(); + expect(data.car).toBeGreaterThanOrEqual(0); + expectTypeOf(data.car).toEqualTypeOf(); + expect(data.caribbean).toBeDefined(); + expect(data.caribbean).toBeGreaterThanOrEqual(0); + expectTypeOf(data.caribbean).toEqualTypeOf(); + expect(data.carnival).toBeDefined(); + expect(data.carnival).toBeGreaterThanOrEqual(0); + expectTypeOf(data.carnival).toEqualTypeOf(); + expect(data.carolling).toBeDefined(); + expect(data.carolling).toBeGreaterThanOrEqual(0); + expectTypeOf(data.carolling).toEqualTypeOf(); + expect(data.cart).toBeDefined(); + expect(data.cart).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cart).toEqualTypeOf(); + expect(data.cartoon).toBeDefined(); + expect(data.cartoon).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cartoon).toEqualTypeOf(); + expect(data.castle).toBeDefined(); + expect(data.castle).toBeGreaterThanOrEqual(0); + expectTypeOf(data.castle).toEqualTypeOf(); + expect(data.cat).toBeDefined(); + expect(data.cat).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cat).toEqualTypeOf(); + expect(data.catapult).toBeDefined(); + expect(data.catapult).toBeGreaterThanOrEqual(0); + expectTypeOf(data.catapult).toEqualTypeOf(); + expect(data.caterpillar).toBeDefined(); + expect(data.caterpillar).toBeGreaterThanOrEqual(0); + expectTypeOf(data.caterpillar).toEqualTypeOf(); + expect(data.cauldron).toBeDefined(); + expect(data.cauldron).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cauldron).toEqualTypeOf(); + expect(data.cave).toBeDefined(); + expect(data.cave).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cave).toEqualTypeOf(); + expect(data.celebration).toBeDefined(); + expect(data.celebration).toBeGreaterThanOrEqual(0); + expectTypeOf(data.celebration).toEqualTypeOf(); + expect(data.cellar).toBeDefined(); + expect(data.cellar).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cellar).toEqualTypeOf(); + expect(data.cheese).toBeDefined(); + expect(data.cheese).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cheese).toEqualTypeOf(); + expect(data.chemistry).toBeDefined(); + expect(data.chemistry).toBeGreaterThanOrEqual(0); + expectTypeOf(data.chemistry).toEqualTypeOf(); + expect(data.cherry).toBeDefined(); + expect(data.cherry).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cherry).toEqualTypeOf(); + expect(data.cherryBlossom).toBeDefined(); + expect(data.cherryBlossom).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cherryBlossom).toEqualTypeOf(); + expect(data.cherryBlossoms).toBeDefined(); + expect(data.cherryBlossoms).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cherryBlossoms).toEqualTypeOf(); + expect(data.chess).toBeDefined(); + expect(data.chess).toBeGreaterThanOrEqual(0); + expectTypeOf(data.chess).toEqualTypeOf(); + expect(data.chest).toBeDefined(); + expect(data.chest).toBeGreaterThanOrEqual(0); + expectTypeOf(data.chest).toEqualTypeOf(); + expect(data.chicken).toBeDefined(); + expect(data.chicken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.chicken).toEqualTypeOf(); + expect(data.chimney).toBeDefined(); + expect(data.chimney).toBeGreaterThanOrEqual(0); + expectTypeOf(data.chimney).toEqualTypeOf(); + expect(data.chocolate).toBeDefined(); + expect(data.chocolate).toBeGreaterThanOrEqual(0); + expectTypeOf(data.chocolate).toEqualTypeOf(); + expect(data.chocolateFactory).toBeDefined(); + expect(data.chocolateFactory).toBeGreaterThanOrEqual(0); + expectTypeOf(data.chocolateFactory).toEqualTypeOf(); + expect(data.choir).toBeDefined(); + expect(data.choir).toBeGreaterThanOrEqual(0); + expectTypeOf(data.choir).toEqualTypeOf(); + expect(data.christmasCard).toBeDefined(); + expect(data.christmasCard).toBeGreaterThanOrEqual(0); + expectTypeOf(data.christmasCard).toEqualTypeOf(); + expect(data.christmasDinner).toBeDefined(); + expect(data.christmasDinner).toBeGreaterThanOrEqual(0); + expectTypeOf(data.christmasDinner).toEqualTypeOf(); + expect(data.christmasEve).toBeDefined(); + expect(data.christmasEve).toBeGreaterThanOrEqual(0); + expectTypeOf(data.christmasEve).toEqualTypeOf(); + expect(data.christmasGift).toBeDefined(); + expect(data.christmasGift).toBeGreaterThanOrEqual(0); + expectTypeOf(data.christmasGift).toEqualTypeOf(); + expect(data.christmasMorning).toBeDefined(); + expect(data.christmasMorning).toBeGreaterThanOrEqual(0); + expectTypeOf(data.christmasMorning).toEqualTypeOf(); + expect(data.christmasTree).toBeDefined(); + expect(data.christmasTree).toBeGreaterThanOrEqual(0); + expectTypeOf(data.christmasTree).toEqualTypeOf(); + expect(data.cinema).toBeDefined(); + expect(data.cinema).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cinema).toEqualTypeOf(); + expect(data.circus).toBeDefined(); + expect(data.circus).toBeGreaterThanOrEqual(0); + expectTypeOf(data.circus).toEqualTypeOf(); + expect(data.clock).toBeDefined(); + expect(data.clock).toBeGreaterThanOrEqual(0); + expectTypeOf(data.clock).toEqualTypeOf(); + expect(data.cloud).toBeDefined(); + expect(data.cloud).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cloud).toEqualTypeOf(); + expect(data.clown).toBeDefined(); + expect(data.clown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.clown).toEqualTypeOf(); + expect(data.cobweb).toBeDefined(); + expect(data.cobweb).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cobweb).toEqualTypeOf(); + expect(data.coconut).toBeDefined(); + expect(data.coconut).toBeGreaterThanOrEqual(0); + expectTypeOf(data.coconut).toEqualTypeOf(); + expect(data.coffin).toBeDefined(); + expect(data.coffin).toBeGreaterThanOrEqual(0); + expectTypeOf(data.coffin).toEqualTypeOf(); + expect(data.comet).toBeDefined(); + expect(data.comet).toBeGreaterThanOrEqual(0); + expectTypeOf(data.comet).toEqualTypeOf(); + expect(data.computer).toBeDefined(); + expect(data.computer).toBeGreaterThanOrEqual(0); + expectTypeOf(data.computer).toEqualTypeOf(); + expect(data.cookieMountain).toBeDefined(); + expect(data.cookieMountain).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cookieMountain).toEqualTypeOf(); + expect(data.corpseBride).toBeDefined(); + expect(data.corpseBride).toBeGreaterThanOrEqual(0); + expectTypeOf(data.corpseBride).toEqualTypeOf(); + expect(data.costume).toBeDefined(); + expect(data.costume).toBeGreaterThanOrEqual(0); + expectTypeOf(data.costume).toEqualTypeOf(); + expect(data.cowboy).toBeDefined(); + expect(data.cowboy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cowboy).toEqualTypeOf(); + expect(data.crab).toBeDefined(); + expect(data.crab).toBeGreaterThanOrEqual(0); + expectTypeOf(data.crab).toEqualTypeOf(); + expect(data.craftingTable).toBeDefined(); + expect(data.craftingTable).toBeGreaterThanOrEqual(0); + expectTypeOf(data.craftingTable).toEqualTypeOf(); + expect(data.crane).toBeDefined(); + expect(data.crane).toBeGreaterThanOrEqual(0); + expectTypeOf(data.crane).toEqualTypeOf(); + expect(data.crayon).toBeDefined(); + expect(data.crayon).toBeGreaterThanOrEqual(0); + expectTypeOf(data.crayon).toEqualTypeOf(); + expect(data.crayons).toBeDefined(); + expect(data.crayons).toBeGreaterThanOrEqual(0); + expectTypeOf(data.crayons).toEqualTypeOf(); + expect(data.creeper).toBeDefined(); + expect(data.creeper).toBeGreaterThanOrEqual(0); + expectTypeOf(data.creeper).toEqualTypeOf(); + expect(data.crocodile).toBeDefined(); + expect(data.crocodile).toBeGreaterThanOrEqual(0); + expectTypeOf(data.crocodile).toEqualTypeOf(); + expect(data.crystalBall).toBeDefined(); + expect(data.crystalBall).toBeGreaterThanOrEqual(0); + expectTypeOf(data.crystalBall).toEqualTypeOf(); + expect(data.cup).toBeDefined(); + expect(data.cup).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cup).toEqualTypeOf(); + expect(data.curtain).toBeDefined(); + expect(data.curtain).toBeGreaterThanOrEqual(0); + expectTypeOf(data.curtain).toEqualTypeOf(); + expect(data.cushion).toBeDefined(); + expect(data.cushion).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cushion).toEqualTypeOf(); + expect(data.dancer).toBeDefined(); + expect(data.dancer).toBeGreaterThanOrEqual(0); + expectTypeOf(data.dancer).toEqualTypeOf(); + expect(data.darkWoods).toBeDefined(); + expect(data.darkWoods).toBeGreaterThanOrEqual(0); + expectTypeOf(data.darkWoods).toEqualTypeOf(); + expect(data.decoratedHouse).toBeDefined(); + expect(data.decoratedHouse).toBeGreaterThanOrEqual(0); + expectTypeOf(data.decoratedHouse).toEqualTypeOf(); + expect(data.demon).toBeDefined(); + expect(data.demon).toBeGreaterThanOrEqual(0); + expectTypeOf(data.demon).toEqualTypeOf(); + expect(data.dice).toBeDefined(); + expect(data.dice).toBeGreaterThanOrEqual(0); + expectTypeOf(data.dice).toEqualTypeOf(); + expect(data.dinosaur).toBeDefined(); + expect(data.dinosaur).toBeGreaterThanOrEqual(0); + expectTypeOf(data.dinosaur).toEqualTypeOf(); + expect(data.disco).toBeDefined(); + expect(data.disco).toBeGreaterThanOrEqual(0); + expectTypeOf(data.disco).toEqualTypeOf(); + expect(data.disguise).toBeDefined(); + expect(data.disguise).toBeGreaterThanOrEqual(0); + expectTypeOf(data.disguise).toEqualTypeOf(); + expect(data.doll).toBeDefined(); + expect(data.doll).toBeGreaterThanOrEqual(0); + expectTypeOf(data.doll).toEqualTypeOf(); + expect(data.dollhouse).toBeDefined(); + expect(data.dollhouse).toBeGreaterThanOrEqual(0); + expectTypeOf(data.dollhouse).toEqualTypeOf(); + expect(data.dolphin).toBeDefined(); + expect(data.dolphin).toBeGreaterThanOrEqual(0); + expectTypeOf(data.dolphin).toEqualTypeOf(); + expect(data.doorbell).toBeDefined(); + expect(data.doorbell).toBeGreaterThanOrEqual(0); + expectTypeOf(data.doorbell).toEqualTypeOf(); + expect(data.doughnut).toBeDefined(); + expect(data.doughnut).toBeGreaterThanOrEqual(0); + expectTypeOf(data.doughnut).toEqualTypeOf(); + expect(data.doughnuts).toBeDefined(); + expect(data.doughnuts).toBeGreaterThanOrEqual(0); + expectTypeOf(data.doughnuts).toEqualTypeOf(); + expect(data.dracula).toBeDefined(); + expect(data.dracula).toBeGreaterThanOrEqual(0); + expectTypeOf(data.dracula).toEqualTypeOf(); + expect(data.dragon).toBeDefined(); + expect(data.dragon).toBeGreaterThanOrEqual(0); + expectTypeOf(data.dragon).toEqualTypeOf(); + expect(data.dress).toBeDefined(); + expect(data.dress).toBeGreaterThanOrEqual(0); + expectTypeOf(data.dress).toEqualTypeOf(); + expect(data.drill).toBeDefined(); + expect(data.drill).toBeGreaterThanOrEqual(0); + expectTypeOf(data.drill).toEqualTypeOf(); + expect(data.drink).toBeDefined(); + expect(data.drink).toBeGreaterThanOrEqual(0); + expectTypeOf(data.drink).toEqualTypeOf(); + expect(data.droid).toBeDefined(); + expect(data.droid).toBeGreaterThanOrEqual(0); + expectTypeOf(data.droid).toEqualTypeOf(); + expect(data.drum).toBeDefined(); + expect(data.drum).toBeGreaterThanOrEqual(0); + expectTypeOf(data.drum).toEqualTypeOf(); + expect(data.dungeon).toBeDefined(); + expect(data.dungeon).toBeGreaterThanOrEqual(0); + expectTypeOf(data.dungeon).toEqualTypeOf(); + expect(data.earmuffs).toBeDefined(); + expect(data.earmuffs).toBeGreaterThanOrEqual(0); + expectTypeOf(data.earmuffs).toEqualTypeOf(); + expect(data.earth).toBeDefined(); + expect(data.earth).toBeGreaterThanOrEqual(0); + expectTypeOf(data.earth).toEqualTypeOf(); + expect(data.easterEgg).toBeDefined(); + expect(data.easterEgg).toBeGreaterThanOrEqual(0); + expectTypeOf(data.easterEgg).toEqualTypeOf(); + expect(data.eatingCompetition).toBeDefined(); + expect(data.eatingCompetition).toBeGreaterThanOrEqual(0); + expectTypeOf(data.eatingCompetition).toEqualTypeOf(); + expect(data.eggBasket).toBeDefined(); + expect(data.eggBasket).toBeGreaterThanOrEqual(0); + expectTypeOf(data.eggBasket).toEqualTypeOf(); + expect(data.egyptain).toBeDefined(); + expect(data.egyptain).toBeGreaterThanOrEqual(0); + expectTypeOf(data.egyptain).toEqualTypeOf(); + expect(data.egyptian).toBeDefined(); + expect(data.egyptian).toBeGreaterThanOrEqual(0); + expectTypeOf(data.egyptian).toEqualTypeOf(); + expect(data.eiffelTower).toBeDefined(); + expect(data.eiffelTower).toBeGreaterThanOrEqual(0); + expectTypeOf(data.eiffelTower).toEqualTypeOf(); + expect(data.elephant).toBeDefined(); + expect(data.elephant).toBeGreaterThanOrEqual(0); + expectTypeOf(data.elephant).toEqualTypeOf(); + expect(data.elf).toBeDefined(); + expect(data.elf).toBeGreaterThanOrEqual(0); + expectTypeOf(data.elf).toEqualTypeOf(); + expect(data.enderman).toBeDefined(); + expect(data.enderman).toBeGreaterThanOrEqual(0); + expectTypeOf(data.enderman).toEqualTypeOf(); + expect(data.engine).toBeDefined(); + expect(data.engine).toBeGreaterThanOrEqual(0); + expectTypeOf(data.engine).toEqualTypeOf(); + expect(data.ethereal).toBeDefined(); + expect(data.ethereal).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ethereal).toEqualTypeOf(); + expect(data.evergreenTree).toBeDefined(); + expect(data.evergreenTree).toBeGreaterThanOrEqual(0); + expectTypeOf(data.evergreenTree).toEqualTypeOf(); + expect(data.evilCat).toBeDefined(); + expect(data.evilCat).toBeGreaterThanOrEqual(0); + expectTypeOf(data.evilCat).toEqualTypeOf(); + expect(data.evilClown).toBeDefined(); + expect(data.evilClown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.evilClown).toEqualTypeOf(); + expect(data.extraterrestrial).toBeDefined(); + expect(data.extraterrestrial).toBeGreaterThanOrEqual(0); + expectTypeOf(data.extraterrestrial).toEqualTypeOf(); + expect(data.eye).toBeDefined(); + expect(data.eye).toBeGreaterThanOrEqual(0); + expectTypeOf(data.eye).toEqualTypeOf(); + expect(data.fairy).toBeDefined(); + expect(data.fairy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fairy).toEqualTypeOf(); + expect(data.family).toBeDefined(); + expect(data.family).toBeGreaterThanOrEqual(0); + expectTypeOf(data.family).toEqualTypeOf(); + expect(data.fancy).toBeDefined(); + expect(data.fancy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fancy).toEqualTypeOf(); + expect(data.fangs).toBeDefined(); + expect(data.fangs).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fangs).toEqualTypeOf(); + expect(data.fantasy).toBeDefined(); + expect(data.fantasy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fantasy).toEqualTypeOf(); + expect(data.farm).toBeDefined(); + expect(data.farm).toBeGreaterThanOrEqual(0); + expectTypeOf(data.farm).toEqualTypeOf(); + expect(data.farmersMarket).toBeDefined(); + expect(data.farmersMarket).toBeGreaterThanOrEqual(0); + expectTypeOf(data.farmersMarket).toEqualTypeOf(); + expect(data.feast).toBeDefined(); + expect(data.feast).toBeGreaterThanOrEqual(0); + expectTypeOf(data.feast).toEqualTypeOf(); + expect(data.feather).toBeDefined(); + expect(data.feather).toBeGreaterThanOrEqual(0); + expectTypeOf(data.feather).toEqualTypeOf(); + expect(data.fire).toBeDefined(); + expect(data.fire).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fire).toEqualTypeOf(); + expect(data.fireplace).toBeDefined(); + expect(data.fireplace).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fireplace).toEqualTypeOf(); + expect(data.firetruck).toBeDefined(); + expect(data.firetruck).toBeGreaterThanOrEqual(0); + expectTypeOf(data.firetruck).toEqualTypeOf(); + expect(data.firework).toBeDefined(); + expect(data.firework).toBeGreaterThanOrEqual(0); + expectTypeOf(data.firework).toEqualTypeOf(); + expect(data.fireworks).toBeDefined(); + expect(data.fireworks).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fireworks).toEqualTypeOf(); + expect(data.fishingRod).toBeDefined(); + expect(data.fishingRod).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fishingRod).toEqualTypeOf(); + expect(data.flag).toBeDefined(); + expect(data.flag).toBeGreaterThanOrEqual(0); + expectTypeOf(data.flag).toEqualTypeOf(); + expect(data.flamingo).toBeDefined(); + expect(data.flamingo).toBeGreaterThanOrEqual(0); + expectTypeOf(data.flamingo).toEqualTypeOf(); + expect(data.flashlight).toBeDefined(); + expect(data.flashlight).toBeGreaterThanOrEqual(0); + expectTypeOf(data.flashlight).toEqualTypeOf(); + expect(data.floatingIsland).toBeDefined(); + expect(data.floatingIsland).toBeGreaterThanOrEqual(0); + expectTypeOf(data.floatingIsland).toEqualTypeOf(); + expect(data.flower).toBeDefined(); + expect(data.flower).toBeGreaterThanOrEqual(0); + expectTypeOf(data.flower).toEqualTypeOf(); + expect(data.flowerPatch).toBeDefined(); + expect(data.flowerPatch).toBeGreaterThanOrEqual(0); + expectTypeOf(data.flowerPatch).toEqualTypeOf(); + expect(data.fly).toBeDefined(); + expect(data.fly).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fly).toEqualTypeOf(); + expect(data.flying).toBeDefined(); + expect(data.flying).toBeGreaterThanOrEqual(0); + expectTypeOf(data.flying).toEqualTypeOf(); + expect(data.flyingPig).toBeDefined(); + expect(data.flyingPig).toBeGreaterThanOrEqual(0); + expectTypeOf(data.flyingPig).toEqualTypeOf(); + expect(data.flyingSaucer).toBeDefined(); + expect(data.flyingSaucer).toBeGreaterThanOrEqual(0); + expectTypeOf(data.flyingSaucer).toEqualTypeOf(); + expect(data.foot).toBeDefined(); + expect(data.foot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.foot).toEqualTypeOf(); + expect(data.football).toBeDefined(); + expect(data.football).toBeGreaterThanOrEqual(0); + expectTypeOf(data.football).toEqualTypeOf(); + expect(data.forge).toBeDefined(); + expect(data.forge).toBeGreaterThanOrEqual(0); + expectTypeOf(data.forge).toEqualTypeOf(); + expect(data.fork).toBeDefined(); + expect(data.fork).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fork).toEqualTypeOf(); + expect(data.fortuneteller).toBeDefined(); + expect(data.fortuneteller).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fortuneteller).toEqualTypeOf(); + expect(data.fountain).toBeDefined(); + expect(data.fountain).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fountain).toEqualTypeOf(); + expect(data.frankenstein).toBeDefined(); + expect(data.frankenstein).toBeGreaterThanOrEqual(0); + expectTypeOf(data.frankenstein).toEqualTypeOf(); + expect(data.freezer).toBeDefined(); + expect(data.freezer).toBeGreaterThanOrEqual(0); + expectTypeOf(data.freezer).toEqualTypeOf(); + expect(data.fridge).toBeDefined(); + expect(data.fridge).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fridge).toEqualTypeOf(); + expect(data.frostyTheSnowman).toBeDefined(); + expect(data.frostyTheSnowman).toBeGreaterThanOrEqual(0); + expectTypeOf(data.frostyTheSnowman).toEqualTypeOf(); + expect(data.frozen).toBeDefined(); + expect(data.frozen).toBeGreaterThanOrEqual(0); + expectTypeOf(data.frozen).toEqualTypeOf(); + expect(data.fullMoon).toBeDefined(); + expect(data.fullMoon).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fullMoon).toEqualTypeOf(); + expect(data.futuristicHouse).toBeDefined(); + expect(data.futuristicHouse).toBeGreaterThanOrEqual(0); + expectTypeOf(data.futuristicHouse).toEqualTypeOf(); + expect(data.game).toBeDefined(); + expect(data.game).toBeGreaterThanOrEqual(0); + expectTypeOf(data.game).toEqualTypeOf(); + expect(data.garage).toBeDefined(); + expect(data.garage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.garage).toEqualTypeOf(); + expect(data.garden).toBeDefined(); + expect(data.garden).toBeGreaterThanOrEqual(0); + expectTypeOf(data.garden).toEqualTypeOf(); + expect(data.ghast).toBeDefined(); + expect(data.ghast).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ghast).toEqualTypeOf(); + expect(data.ghost).toBeDefined(); + expect(data.ghost).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ghost).toEqualTypeOf(); + expect(data.ghostShip).toBeDefined(); + expect(data.ghostShip).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ghostShip).toEqualTypeOf(); + expect(data.ghoul).toBeDefined(); + expect(data.ghoul).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ghoul).toEqualTypeOf(); + expect(data.giantPresents).toBeDefined(); + expect(data.giantPresents).toBeGreaterThanOrEqual(0); + expectTypeOf(data.giantPresents).toEqualTypeOf(); + expect(data.gifts).toBeDefined(); + expect(data.gifts).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gifts).toEqualTypeOf(); + expect(data.gingerbread).toBeDefined(); + expect(data.gingerbread).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gingerbread).toEqualTypeOf(); + expect(data.gingerbreadHouse).toBeDefined(); + expect(data.gingerbreadHouse).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gingerbreadHouse).toEqualTypeOf(); + expect(data.gingerbreadMan).toBeDefined(); + expect(data.gingerbreadMan).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gingerbreadMan).toEqualTypeOf(); + expect(data.giraffe).toBeDefined(); + expect(data.giraffe).toBeGreaterThanOrEqual(0); + expectTypeOf(data.giraffe).toEqualTypeOf(); + expect(data.girl).toBeDefined(); + expect(data.girl).toBeGreaterThanOrEqual(0); + expectTypeOf(data.girl).toEqualTypeOf(); + expect(data.glasses).toBeDefined(); + expect(data.glasses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.glasses).toEqualTypeOf(); + expect(data.glove).toBeDefined(); + expect(data.glove).toBeGreaterThanOrEqual(0); + expectTypeOf(data.glove).toEqualTypeOf(); + expect(data.goat).toBeDefined(); + expect(data.goat).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goat).toEqualTypeOf(); + expect(data.goblin).toBeDefined(); + expect(data.goblin).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goblin).toEqualTypeOf(); + expect(data.golem).toBeDefined(); + expect(data.golem).toBeGreaterThanOrEqual(0); + expectTypeOf(data.golem).toEqualTypeOf(); + expect(data.goose).toBeDefined(); + expect(data.goose).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goose).toEqualTypeOf(); + expect(data.gothic).toBeDefined(); + expect(data.gothic).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gothic).toEqualTypeOf(); + expect(data.gravestone).toBeDefined(); + expect(data.gravestone).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gravestone).toEqualTypeOf(); + expect(data.graveyard).toBeDefined(); + expect(data.graveyard).toBeGreaterThanOrEqual(0); + expectTypeOf(data.graveyard).toEqualTypeOf(); + expect(data.greekTemple).toBeDefined(); + expect(data.greekTemple).toBeGreaterThanOrEqual(0); + expectTypeOf(data.greekTemple).toEqualTypeOf(); + expect(data.grimReaper).toBeDefined(); + expect(data.grimReaper).toBeGreaterThanOrEqual(0); + expectTypeOf(data.grimReaper).toEqualTypeOf(); + expect(data.grinch).toBeDefined(); + expect(data.grinch).toBeGreaterThanOrEqual(0); + expectTypeOf(data.grinch).toEqualTypeOf(); + expect(data.guitar).toBeDefined(); + expect(data.guitar).toBeGreaterThanOrEqual(0); + expectTypeOf(data.guitar).toEqualTypeOf(); + expect(data.gym).toBeDefined(); + expect(data.gym).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gym).toEqualTypeOf(); + expect(data.halloweenCostumes).toBeDefined(); + expect(data.halloweenCostumes).toBeGreaterThanOrEqual(0); + expectTypeOf(data.halloweenCostumes).toEqualTypeOf(); + expect(data.halloweenParty).toBeDefined(); + expect(data.halloweenParty).toBeGreaterThanOrEqual(0); + expectTypeOf(data.halloweenParty).toEqualTypeOf(); + expect(data.halloweenTreats).toBeDefined(); + expect(data.halloweenTreats).toBeGreaterThanOrEqual(0); + expectTypeOf(data.halloweenTreats).toEqualTypeOf(); + expect(data.hamburger).toBeDefined(); + expect(data.hamburger).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hamburger).toEqualTypeOf(); + expect(data.hammer).toBeDefined(); + expect(data.hammer).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hammer).toEqualTypeOf(); + expect(data.hamster).toBeDefined(); + expect(data.hamster).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hamster).toEqualTypeOf(); + expect(data.hand).toBeDefined(); + expect(data.hand).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hand).toEqualTypeOf(); + expect(data.happy).toBeDefined(); + expect(data.happy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.happy).toEqualTypeOf(); + expect(data.harbor).toBeDefined(); + expect(data.harbor).toBeGreaterThanOrEqual(0); + expectTypeOf(data.harbor).toEqualTypeOf(); + expect(data.haunted).toBeDefined(); + expect(data.haunted).toBeGreaterThanOrEqual(0); + expectTypeOf(data.haunted).toEqualTypeOf(); + expect(data.hauntedForest).toBeDefined(); + expect(data.hauntedForest).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hauntedForest).toEqualTypeOf(); + expect(data.hauntedHouse).toBeDefined(); + expect(data.hauntedHouse).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hauntedHouse).toEqualTypeOf(); + expect(data.head).toBeDefined(); + expect(data.head).toBeGreaterThanOrEqual(0); + expectTypeOf(data.head).toEqualTypeOf(); + expect(data.headlessHorseman).toBeDefined(); + expect(data.headlessHorseman).toBeGreaterThanOrEqual(0); + expectTypeOf(data.headlessHorseman).toEqualTypeOf(); + expect(data.heart).toBeDefined(); + expect(data.heart).toBeGreaterThanOrEqual(0); + expectTypeOf(data.heart).toEqualTypeOf(); + expect(data.helicopter).toBeDefined(); + expect(data.helicopter).toBeGreaterThanOrEqual(0); + expectTypeOf(data.helicopter).toEqualTypeOf(); + expect(data.hikingTrail).toBeDefined(); + expect(data.hikingTrail).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hikingTrail).toEqualTypeOf(); + expect(data.holiday).toBeDefined(); + expect(data.holiday).toBeGreaterThanOrEqual(0); + expectTypeOf(data.holiday).toEqualTypeOf(); + expect(data.holly).toBeDefined(); + expect(data.holly).toBeGreaterThanOrEqual(0); + expectTypeOf(data.holly).toEqualTypeOf(); + expect(data.hotAirBalloon).toBeDefined(); + expect(data.hotAirBalloon).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hotAirBalloon).toEqualTypeOf(); + expect(data.hotChocolate).toBeDefined(); + expect(data.hotChocolate).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hotChocolate).toEqualTypeOf(); + expect(data.house).toBeDefined(); + expect(data.house).toBeGreaterThanOrEqual(0); + expectTypeOf(data.house).toEqualTypeOf(); + expect(data.howl).toBeDefined(); + expect(data.howl).toBeGreaterThanOrEqual(0); + expectTypeOf(data.howl).toEqualTypeOf(); + expect(data.hugeStocking).toBeDefined(); + expect(data.hugeStocking).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hugeStocking).toEqualTypeOf(); + expect(data.hurricane).toBeDefined(); + expect(data.hurricane).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hurricane).toEqualTypeOf(); + expect(data.hypixel).toBeDefined(); + expect(data.hypixel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hypixel).toEqualTypeOf(); + expect(data.hypixelSweater).toBeDefined(); + expect(data.hypixelSweater).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hypixelSweater).toEqualTypeOf(); + expect(data.iceCream).toBeDefined(); + expect(data.iceCream).toBeGreaterThanOrEqual(0); + expectTypeOf(data.iceCream).toEqualTypeOf(); + expect(data.iceFishing).toBeDefined(); + expect(data.iceFishing).toBeGreaterThanOrEqual(0); + expectTypeOf(data.iceFishing).toEqualTypeOf(); + expect(data.iceSkating).toBeDefined(); + expect(data.iceSkating).toBeGreaterThanOrEqual(0); + expectTypeOf(data.iceSkating).toEqualTypeOf(); + expect(data.igloo).toBeDefined(); + expect(data.igloo).toBeGreaterThanOrEqual(0); + expectTypeOf(data.igloo).toEqualTypeOf(); + expect(data.illusion).toBeDefined(); + expect(data.illusion).toBeGreaterThanOrEqual(0); + expectTypeOf(data.illusion).toEqualTypeOf(); + expect(data.imp).toBeDefined(); + expect(data.imp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.imp).toEqualTypeOf(); + expect(data.industrial).toBeDefined(); + expect(data.industrial).toBeGreaterThanOrEqual(0); + expectTypeOf(data.industrial).toEqualTypeOf(); + expect(data.insect).toBeDefined(); + expect(data.insect).toBeGreaterThanOrEqual(0); + expectTypeOf(data.insect).toEqualTypeOf(); + expect(data.ironman).toBeDefined(); + expect(data.ironman).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ironman).toEqualTypeOf(); + expect(data.island).toBeDefined(); + expect(data.island).toBeGreaterThanOrEqual(0); + expectTypeOf(data.island).toEqualTypeOf(); + expect(data.jackolantern).toBeDefined(); + expect(data.jackolantern).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jackolantern).toEqualTypeOf(); + expect(data.jellyfish).toBeDefined(); + expect(data.jellyfish).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jellyfish).toEqualTypeOf(); + expect(data.jetski).toBeDefined(); + expect(data.jetski).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jetski).toEqualTypeOf(); + expect(data.jewel).toBeDefined(); + expect(data.jewel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jewel).toEqualTypeOf(); + expect(data.jingleBell).toBeDefined(); + expect(data.jingleBell).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jingleBell).toEqualTypeOf(); + expect(data.jurassic).toBeDefined(); + expect(data.jurassic).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jurassic).toEqualTypeOf(); + expect(data.keyboard).toBeDefined(); + expect(data.keyboard).toBeGreaterThanOrEqual(0); + expectTypeOf(data.keyboard).toEqualTypeOf(); + expect(data.killerWhale).toBeDefined(); + expect(data.killerWhale).toBeGreaterThanOrEqual(0); + expectTypeOf(data.killerWhale).toEqualTypeOf(); + expect(data.king).toBeDefined(); + expect(data.king).toBeGreaterThanOrEqual(0); + expectTypeOf(data.king).toEqualTypeOf(); + expect(data.kite).toBeDefined(); + expect(data.kite).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kite).toEqualTypeOf(); + expect(data.kitten).toBeDefined(); + expect(data.kitten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kitten).toEqualTypeOf(); + expect(data.knight).toBeDefined(); + expect(data.knight).toBeGreaterThanOrEqual(0); + expectTypeOf(data.knight).toEqualTypeOf(); + expect(data.laboratory).toBeDefined(); + expect(data.laboratory).toBeGreaterThanOrEqual(0); + expectTypeOf(data.laboratory).toEqualTypeOf(); + expect(data.ladyBug).toBeDefined(); + expect(data.ladyBug).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ladyBug).toEqualTypeOf(); + expect(data.lantern).toBeDefined(); + expect(data.lantern).toBeGreaterThanOrEqual(0); + expectTypeOf(data.lantern).toEqualTypeOf(); + expect(data.leaf).toBeDefined(); + expect(data.leaf).toBeGreaterThanOrEqual(0); + expectTypeOf(data.leaf).toEqualTypeOf(); + expect(data.leg).toBeDefined(); + expect(data.leg).toBeGreaterThanOrEqual(0); + expectTypeOf(data.leg).toEqualTypeOf(); + expect(data.library).toBeDefined(); + expect(data.library).toBeGreaterThanOrEqual(0); + expectTypeOf(data.library).toEqualTypeOf(); + expect(data.light).toBeDefined(); + expect(data.light).toBeGreaterThanOrEqual(0); + expectTypeOf(data.light).toEqualTypeOf(); + expect(data.lightbulb).toBeDefined(); + expect(data.lightbulb).toBeGreaterThanOrEqual(0); + expectTypeOf(data.lightbulb).toEqualTypeOf(); + expect(data.lighthouse).toBeDefined(); + expect(data.lighthouse).toBeGreaterThanOrEqual(0); + expectTypeOf(data.lighthouse).toEqualTypeOf(); + expect(data.lion).toBeDefined(); + expect(data.lion).toBeGreaterThanOrEqual(0); + expectTypeOf(data.lion).toEqualTypeOf(); + expect(data.livingDead).toBeDefined(); + expect(data.livingDead).toBeGreaterThanOrEqual(0); + expectTypeOf(data.livingDead).toEqualTypeOf(); + expect(data.llama).toBeDefined(); + expect(data.llama).toBeGreaterThanOrEqual(0); + expectTypeOf(data.llama).toEqualTypeOf(); + expect(data.lodge).toBeDefined(); + expect(data.lodge).toBeGreaterThanOrEqual(0); + expectTypeOf(data.lodge).toEqualTypeOf(); + expect(data.lunchbox).toBeDefined(); + expect(data.lunchbox).toBeGreaterThanOrEqual(0); + expectTypeOf(data.lunchbox).toEqualTypeOf(); + expect(data.madScientist).toBeDefined(); + expect(data.madScientist).toBeGreaterThanOrEqual(0); + expectTypeOf(data.madScientist).toEqualTypeOf(); + expect(data.magic).toBeDefined(); + expect(data.magic).toBeGreaterThanOrEqual(0); + expectTypeOf(data.magic).toEqualTypeOf(); + expect(data.magicWand).toBeDefined(); + expect(data.magicWand).toBeGreaterThanOrEqual(0); + expectTypeOf(data.magicWand).toEqualTypeOf(); + expect(data.magician).toBeDefined(); + expect(data.magician).toBeGreaterThanOrEqual(0); + expectTypeOf(data.magician).toEqualTypeOf(); + expect(data.magnet).toBeDefined(); + expect(data.magnet).toBeGreaterThanOrEqual(0); + expectTypeOf(data.magnet).toEqualTypeOf(); + expect(data.mailBox).toBeDefined(); + expect(data.mailBox).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mailBox).toEqualTypeOf(); + expect(data.map).toBeDefined(); + expect(data.map).toBeGreaterThanOrEqual(0); + expectTypeOf(data.map).toEqualTypeOf(); + expect(data.mars).toBeDefined(); + expect(data.mars).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mars).toEqualTypeOf(); + expect(data.marshmallow).toBeDefined(); + expect(data.marshmallow).toBeGreaterThanOrEqual(0); + expectTypeOf(data.marshmallow).toEqualTypeOf(); + expect(data.marshmallows).toBeDefined(); + expect(data.marshmallows).toBeGreaterThanOrEqual(0); + expectTypeOf(data.marshmallows).toEqualTypeOf(); + expect(data.martians).toBeDefined(); + expect(data.martians).toBeGreaterThanOrEqual(0); + expectTypeOf(data.martians).toEqualTypeOf(); + expect(data.mask).toBeDefined(); + expect(data.mask).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mask).toEqualTypeOf(); + expect(data.maze).toBeDefined(); + expect(data.maze).toBeGreaterThanOrEqual(0); + expectTypeOf(data.maze).toEqualTypeOf(); + expect(data.meadow).toBeDefined(); + expect(data.meadow).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meadow).toEqualTypeOf(); + expect(data.medieval).toBeDefined(); + expect(data.medieval).toBeGreaterThanOrEqual(0); + expectTypeOf(data.medieval).toEqualTypeOf(); + expect(data.mermaid).toBeDefined(); + expect(data.mermaid).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mermaid).toEqualTypeOf(); + expect(data.meteorite).toBeDefined(); + expect(data.meteorite).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meteorite).toEqualTypeOf(); + expect(data.mice).toBeDefined(); + expect(data.mice).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mice).toEqualTypeOf(); + expect(data.midnight).toBeDefined(); + expect(data.midnight).toBeGreaterThanOrEqual(0); + expectTypeOf(data.midnight).toEqualTypeOf(); + expect(data.milk).toBeDefined(); + expect(data.milk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.milk).toEqualTypeOf(); + expect(data.milkAndCookies).toBeDefined(); + expect(data.milkAndCookies).toBeGreaterThanOrEqual(0); + expectTypeOf(data.milkAndCookies).toEqualTypeOf(); + expect(data.mincePie).toBeDefined(); + expect(data.mincePie).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mincePie).toEqualTypeOf(); + expect(data.mine).toBeDefined(); + expect(data.mine).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mine).toEqualTypeOf(); + expect(data.mistletoe).toBeDefined(); + expect(data.mistletoe).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mistletoe).toEqualTypeOf(); + expect(data.modernHome).toBeDefined(); + expect(data.modernHome).toBeGreaterThanOrEqual(0); + expectTypeOf(data.modernHome).toEqualTypeOf(); + expect(data.money).toBeDefined(); + expect(data.money).toBeGreaterThanOrEqual(0); + expectTypeOf(data.money).toEqualTypeOf(); + expect(data.monkey).toBeDefined(); + expect(data.monkey).toBeGreaterThanOrEqual(0); + expectTypeOf(data.monkey).toEqualTypeOf(); + expect(data.monster).toBeDefined(); + expect(data.monster).toBeGreaterThanOrEqual(0); + expectTypeOf(data.monster).toEqualTypeOf(); + expect(data.monsterTruck).toBeDefined(); + expect(data.monsterTruck).toBeGreaterThanOrEqual(0); + expectTypeOf(data.monsterTruck).toEqualTypeOf(); + expect(data.monument).toBeDefined(); + expect(data.monument).toBeGreaterThanOrEqual(0); + expectTypeOf(data.monument).toEqualTypeOf(); + expect(data.moon).toBeDefined(); + expect(data.moon).toBeGreaterThanOrEqual(0); + expectTypeOf(data.moon).toEqualTypeOf(); + expect(data.motorbike).toBeDefined(); + expect(data.motorbike).toBeGreaterThanOrEqual(0); + expectTypeOf(data.motorbike).toEqualTypeOf(); + expect(data.mouse).toBeDefined(); + expect(data.mouse).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mouse).toEqualTypeOf(); + expect(data.movie).toBeDefined(); + expect(data.movie).toBeGreaterThanOrEqual(0); + expectTypeOf(data.movie).toEqualTypeOf(); + expect(data.mummy).toBeDefined(); + expect(data.mummy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mummy).toEqualTypeOf(); + expect(data.museum).toBeDefined(); + expect(data.museum).toBeGreaterThanOrEqual(0); + expectTypeOf(data.museum).toEqualTypeOf(); + expect(data.mushroom).toBeDefined(); + expect(data.mushroom).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mushroom).toEqualTypeOf(); + expect(data.music).toBeDefined(); + expect(data.music).toBeGreaterThanOrEqual(0); + expectTypeOf(data.music).toEqualTypeOf(); + expect(data.mutant).toBeDefined(); + expect(data.mutant).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mutant).toEqualTypeOf(); + expect(data.mythical).toBeDefined(); + expect(data.mythical).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mythical).toEqualTypeOf(); + expect(data.nail).toBeDefined(); + expect(data.nail).toBeGreaterThanOrEqual(0); + expectTypeOf(data.nail).toEqualTypeOf(); + expect(data.neon).toBeDefined(); + expect(data.neon).toBeGreaterThanOrEqual(0); + expectTypeOf(data.neon).toEqualTypeOf(); + expect(data.nightmare).toBeDefined(); + expect(data.nightmare).toBeGreaterThanOrEqual(0); + expectTypeOf(data.nightmare).toEqualTypeOf(); + expect(data.ninja).toBeDefined(); + expect(data.ninja).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ninja).toEqualTypeOf(); + expect(data.northPole).toBeDefined(); + expect(data.northPole).toBeGreaterThanOrEqual(0); + expectTypeOf(data.northPole).toEqualTypeOf(); + expect(data.nose).toBeDefined(); + expect(data.nose).toBeGreaterThanOrEqual(0); + expectTypeOf(data.nose).toEqualTypeOf(); + expect(data.nostalgia).toBeDefined(); + expect(data.nostalgia).toBeGreaterThanOrEqual(0); + expectTypeOf(data.nostalgia).toEqualTypeOf(); + expect(data.ocean).toBeDefined(); + expect(data.ocean).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ocean).toEqualTypeOf(); + expect(data.octopus).toBeDefined(); + expect(data.octopus).toBeGreaterThanOrEqual(0); + expectTypeOf(data.octopus).toEqualTypeOf(); + expect(data.ogre).toBeDefined(); + expect(data.ogre).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ogre).toEqualTypeOf(); + expect(data.olympics).toBeDefined(); + expect(data.olympics).toBeGreaterThanOrEqual(0); + expectTypeOf(data.olympics).toEqualTypeOf(); + expect(data.orange).toBeDefined(); + expect(data.orange).toBeGreaterThanOrEqual(0); + expectTypeOf(data.orange).toEqualTypeOf(); + expect(data.oven).toBeDefined(); + expect(data.oven).toBeGreaterThanOrEqual(0); + expectTypeOf(data.oven).toEqualTypeOf(); + expect(data.owl).toBeDefined(); + expect(data.owl).toBeGreaterThanOrEqual(0); + expectTypeOf(data.owl).toEqualTypeOf(); + expect(data.package).toBeDefined(); + expect(data.package).toBeGreaterThanOrEqual(0); + expectTypeOf(data.package).toEqualTypeOf(); + expect(data.paint).toBeDefined(); + expect(data.paint).toBeGreaterThanOrEqual(0); + expectTypeOf(data.paint).toEqualTypeOf(); + expect(data.painting).toBeDefined(); + expect(data.painting).toBeGreaterThanOrEqual(0); + expectTypeOf(data.painting).toEqualTypeOf(); + expect(data.palace).toBeDefined(); + expect(data.palace).toBeGreaterThanOrEqual(0); + expectTypeOf(data.palace).toEqualTypeOf(); + expect(data.palmTree).toBeDefined(); + expect(data.palmTree).toBeGreaterThanOrEqual(0); + expectTypeOf(data.palmTree).toEqualTypeOf(); + expect(data.panda).toBeDefined(); + expect(data.panda).toBeGreaterThanOrEqual(0); + expectTypeOf(data.panda).toEqualTypeOf(); + expect(data.parachute).toBeDefined(); + expect(data.parachute).toBeGreaterThanOrEqual(0); + expectTypeOf(data.parachute).toEqualTypeOf(); + expect(data.park).toBeDefined(); + expect(data.park).toBeGreaterThanOrEqual(0); + expectTypeOf(data.park).toEqualTypeOf(); + expect(data.pastel).toBeDefined(); + expect(data.pastel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pastel).toEqualTypeOf(); + expect(data.pen).toBeDefined(); + expect(data.pen).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pen).toEqualTypeOf(); + expect(data.pencil).toBeDefined(); + expect(data.pencil).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pencil).toEqualTypeOf(); + expect(data.penguin).toBeDefined(); + expect(data.penguin).toBeGreaterThanOrEqual(0); + expectTypeOf(data.penguin).toEqualTypeOf(); + expect(data.phantom).toBeDefined(); + expect(data.phantom).toBeGreaterThanOrEqual(0); + expectTypeOf(data.phantom).toEqualTypeOf(); + expect(data.photograph).toBeDefined(); + expect(data.photograph).toBeGreaterThanOrEqual(0); + expectTypeOf(data.photograph).toEqualTypeOf(); + expect(data.piano).toBeDefined(); + expect(data.piano).toBeGreaterThanOrEqual(0); + expectTypeOf(data.piano).toEqualTypeOf(); + expect(data.picnic).toBeDefined(); + expect(data.picnic).toBeGreaterThanOrEqual(0); + expectTypeOf(data.picnic).toEqualTypeOf(); + expect(data.picture).toBeDefined(); + expect(data.picture).toBeGreaterThanOrEqual(0); + expectTypeOf(data.picture).toEqualTypeOf(); + expect(data.pie).toBeDefined(); + expect(data.pie).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pie).toEqualTypeOf(); + expect(data.piggyBank).toBeDefined(); + expect(data.piggyBank).toBeGreaterThanOrEqual(0); + expectTypeOf(data.piggyBank).toEqualTypeOf(); + expect(data.pineapple).toBeDefined(); + expect(data.pineapple).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pineapple).toEqualTypeOf(); + expect(data.pipe).toBeDefined(); + expect(data.pipe).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pipe).toEqualTypeOf(); + expect(data.pirate).toBeDefined(); + expect(data.pirate).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pirate).toEqualTypeOf(); + expect(data.pirates).toBeDefined(); + expect(data.pirates).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pirates).toEqualTypeOf(); + expect(data.pitchfork).toBeDefined(); + expect(data.pitchfork).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pitchfork).toEqualTypeOf(); + expect(data.pixelArt).toBeDefined(); + expect(data.pixelArt).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pixelArt).toEqualTypeOf(); + expect(data.plane).toBeDefined(); + expect(data.plane).toBeGreaterThanOrEqual(0); + expectTypeOf(data.plane).toEqualTypeOf(); + expect(data.plantPot).toBeDefined(); + expect(data.plantPot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.plantPot).toEqualTypeOf(); + expect(data.plate).toBeDefined(); + expect(data.plate).toBeGreaterThanOrEqual(0); + expectTypeOf(data.plate).toEqualTypeOf(); + expect(data.pogoStick).toBeDefined(); + expect(data.pogoStick).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pogoStick).toEqualTypeOf(); + expect(data.pogoSticks).toBeDefined(); + expect(data.pogoSticks).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pogoSticks).toEqualTypeOf(); + expect(data.pond).toBeDefined(); + expect(data.pond).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pond).toEqualTypeOf(); + expect(data.pool).toBeDefined(); + expect(data.pool).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pool).toEqualTypeOf(); + expect(data.poolParty).toBeDefined(); + expect(data.poolParty).toBeGreaterThanOrEqual(0); + expectTypeOf(data.poolParty).toEqualTypeOf(); + expect(data.poolTable).toBeDefined(); + expect(data.poolTable).toBeGreaterThanOrEqual(0); + expectTypeOf(data.poolTable).toEqualTypeOf(); + expect(data.popcorn).toBeDefined(); + expect(data.popcorn).toBeGreaterThanOrEqual(0); + expectTypeOf(data.popcorn).toEqualTypeOf(); + expect(data.popsicle).toBeDefined(); + expect(data.popsicle).toBeGreaterThanOrEqual(0); + expectTypeOf(data.popsicle).toEqualTypeOf(); + expect(data.postOffice).toBeDefined(); + expect(data.postOffice).toBeGreaterThanOrEqual(0); + expectTypeOf(data.postOffice).toEqualTypeOf(); + expect(data.pot).toBeDefined(); + expect(data.pot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pot).toEqualTypeOf(); + expect(data.potato).toBeDefined(); + expect(data.potato).toBeGreaterThanOrEqual(0); + expectTypeOf(data.potato).toEqualTypeOf(); + expect(data.potion).toBeDefined(); + expect(data.potion).toBeGreaterThanOrEqual(0); + expectTypeOf(data.potion).toEqualTypeOf(); + expect(data.pottedPlant).toBeDefined(); + expect(data.pottedPlant).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pottedPlant).toEqualTypeOf(); + expect(data.prehistoric).toBeDefined(); + expect(data.prehistoric).toBeGreaterThanOrEqual(0); + expectTypeOf(data.prehistoric).toEqualTypeOf(); + expect(data.presentsPile).toBeDefined(); + expect(data.presentsPile).toBeGreaterThanOrEqual(0); + expectTypeOf(data.presentsPile).toEqualTypeOf(); + expect(data.princess).toBeDefined(); + expect(data.princess).toBeGreaterThanOrEqual(0); + expectTypeOf(data.princess).toEqualTypeOf(); + expect(data.pumpkinCarving).toBeDefined(); + expect(data.pumpkinCarving).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pumpkinCarving).toEqualTypeOf(); + expect(data.pyramid).toBeDefined(); + expect(data.pyramid).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pyramid).toEqualTypeOf(); + expect(data.racecar).toBeDefined(); + expect(data.racecar).toBeGreaterThanOrEqual(0); + expectTypeOf(data.racecar).toEqualTypeOf(); + expect(data.rainbow).toBeDefined(); + expect(data.rainbow).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rainbow).toEqualTypeOf(); + expect(data.rainforest).toBeDefined(); + expect(data.rainforest).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rainforest).toEqualTypeOf(); + expect(data.rat).toBeDefined(); + expect(data.rat).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rat).toEqualTypeOf(); + expect(data.reindeer).toBeDefined(); + expect(data.reindeer).toBeGreaterThanOrEqual(0); + expectTypeOf(data.reindeer).toEqualTypeOf(); + expect(data.rhino).toBeDefined(); + expect(data.rhino).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rhino).toEqualTypeOf(); + expect(data.ring).toBeDefined(); + expect(data.ring).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ring).toEqualTypeOf(); + expect(data.robot).toBeDefined(); + expect(data.robot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.robot).toEqualTypeOf(); + expect(data.robots).toBeDefined(); + expect(data.robots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.robots).toEqualTypeOf(); + expect(data.rockingChair).toBeDefined(); + expect(data.rockingChair).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rockingChair).toEqualTypeOf(); + expect(data.rollercoaster).toBeDefined(); + expect(data.rollercoaster).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rollercoaster).toEqualTypeOf(); + expect(data.roman).toBeDefined(); + expect(data.roman).toBeGreaterThanOrEqual(0); + expectTypeOf(data.roman).toEqualTypeOf(); + expect(data.rubberDuck).toBeDefined(); + expect(data.rubberDuck).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rubberDuck).toEqualTypeOf(); + expect(data.rudolph).toBeDefined(); + expect(data.rudolph).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rudolph).toEqualTypeOf(); + expect(data.rustic).toBeDefined(); + expect(data.rustic).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rustic).toEqualTypeOf(); + expect(data.sackOfPresents).toBeDefined(); + expect(data.sackOfPresents).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sackOfPresents).toEqualTypeOf(); + expect(data.sad).toBeDefined(); + expect(data.sad).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sad).toEqualTypeOf(); + expect(data.safari).toBeDefined(); + expect(data.safari).toBeGreaterThanOrEqual(0); + expectTypeOf(data.safari).toEqualTypeOf(); + expect(data.sailboat).toBeDefined(); + expect(data.sailboat).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sailboat).toEqualTypeOf(); + expect(data.sandcastle).toBeDefined(); + expect(data.sandcastle).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sandcastle).toEqualTypeOf(); + expect(data.sandwich).toBeDefined(); + expect(data.sandwich).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sandwich).toEqualTypeOf(); + expect(data.santa).toBeDefined(); + expect(data.santa).toBeGreaterThanOrEqual(0); + expectTypeOf(data.santa).toEqualTypeOf(); + expect(data.santaClaus).toBeDefined(); + expect(data.santaClaus).toBeGreaterThanOrEqual(0); + expectTypeOf(data.santaClaus).toEqualTypeOf(); + expect(data.santasSleigh).toBeDefined(); + expect(data.santasSleigh).toBeGreaterThanOrEqual(0); + expectTypeOf(data.santasSleigh).toEqualTypeOf(); + expect(data.santasWorkshop).toBeDefined(); + expect(data.santasWorkshop).toBeGreaterThanOrEqual(0); + expectTypeOf(data.santasWorkshop).toEqualTypeOf(); + expect(data.scarecrow).toBeDefined(); + expect(data.scarecrow).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scarecrow).toEqualTypeOf(); + expect(data.scaryMovie).toBeDefined(); + expect(data.scaryMovie).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scaryMovie).toEqualTypeOf(); + expect(data.school).toBeDefined(); + expect(data.school).toBeGreaterThanOrEqual(0); + expectTypeOf(data.school).toEqualTypeOf(); + expect(data.schoolBus).toBeDefined(); + expect(data.schoolBus).toBeGreaterThanOrEqual(0); + expectTypeOf(data.schoolBus).toEqualTypeOf(); + expect(data.scifi).toBeDefined(); + expect(data.scifi).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scifi).toEqualTypeOf(); + expect(data.scientist).toBeDefined(); + expect(data.scientist).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scientist).toEqualTypeOf(); + expect(data.scissors).toBeDefined(); + expect(data.scissors).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scissors).toEqualTypeOf(); + expect(data.screw).toBeDefined(); + expect(data.screw).toBeGreaterThanOrEqual(0); + expectTypeOf(data.screw).toEqualTypeOf(); + expect(data.scythe).toBeDefined(); + expect(data.scythe).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scythe).toEqualTypeOf(); + expect(data.selfPortrait).toBeDefined(); + expect(data.selfPortrait).toBeGreaterThanOrEqual(0); + expectTypeOf(data.selfPortrait).toEqualTypeOf(); + expect(data.sewer).toBeDefined(); + expect(data.sewer).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sewer).toEqualTypeOf(); + expect(data.shark).toBeDefined(); + expect(data.shark).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shark).toEqualTypeOf(); + expect(data.sheep).toBeDefined(); + expect(data.sheep).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sheep).toEqualTypeOf(); + expect(data.shell).toBeDefined(); + expect(data.shell).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shell).toEqualTypeOf(); + expect(data.shepherd).toBeDefined(); + expect(data.shepherd).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shepherd).toEqualTypeOf(); + expect(data.shipwreck).toBeDefined(); + expect(data.shipwreck).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shipwreck).toEqualTypeOf(); + expect(data.shoe).toBeDefined(); + expect(data.shoe).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shoe).toEqualTypeOf(); + expect(data.shopping).toBeDefined(); + expect(data.shopping).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shopping).toEqualTypeOf(); + expect(data.shovel).toBeDefined(); + expect(data.shovel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shovel).toEqualTypeOf(); + expect(data.skateboard).toBeDefined(); + expect(data.skateboard).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skateboard).toEqualTypeOf(); + expect(data.skatepark).toBeDefined(); + expect(data.skatepark).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skatepark).toEqualTypeOf(); + expect(data.skatingRink).toBeDefined(); + expect(data.skatingRink).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skatingRink).toEqualTypeOf(); + expect(data.skeleton).toBeDefined(); + expect(data.skeleton).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skeleton).toEqualTypeOf(); + expect(data.skeletonJockey).toBeDefined(); + expect(data.skeletonJockey).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skeletonJockey).toEqualTypeOf(); + expect(data.skiCabin).toBeDefined(); + expect(data.skiCabin).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skiCabin).toEqualTypeOf(); + expect(data.skull).toBeDefined(); + expect(data.skull).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skull).toEqualTypeOf(); + expect(data.skydiver).toBeDefined(); + expect(data.skydiver).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skydiver).toEqualTypeOf(); + expect(data.sled).toBeDefined(); + expect(data.sled).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sled).toEqualTypeOf(); + expect(data.slenderman).toBeDefined(); + expect(data.slenderman).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slenderman).toEqualTypeOf(); + expect(data.slime).toBeDefined(); + expect(data.slime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.slime).toEqualTypeOf(); + expect(data.snail).toBeDefined(); + expect(data.snail).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snail).toEqualTypeOf(); + expect(data.snake).toBeDefined(); + expect(data.snake).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snake).toEqualTypeOf(); + expect(data.snowAngel).toBeDefined(); + expect(data.snowAngel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowAngel).toEqualTypeOf(); + expect(data.snowFort).toBeDefined(); + expect(data.snowFort).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowFort).toEqualTypeOf(); + expect(data.snowGlobe).toBeDefined(); + expect(data.snowGlobe).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowGlobe).toEqualTypeOf(); + expect(data.snowballFight).toBeDefined(); + expect(data.snowballFight).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowballFight).toEqualTypeOf(); + expect(data.snowflake).toBeDefined(); + expect(data.snowflake).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowflake).toEqualTypeOf(); + expect(data.snowman).toBeDefined(); + expect(data.snowman).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowman).toEqualTypeOf(); + expect(data.snowyForest).toBeDefined(); + expect(data.snowyForest).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowyForest).toEqualTypeOf(); + expect(data.solarPanels).toBeDefined(); + expect(data.solarPanels).toBeGreaterThanOrEqual(0); + expectTypeOf(data.solarPanels).toEqualTypeOf(); + expect(data.solarSystem).toBeDefined(); + expect(data.solarSystem).toBeGreaterThanOrEqual(0); + expectTypeOf(data.solarSystem).toEqualTypeOf(); + expect(data.soldier).toBeDefined(); + expect(data.soldier).toBeGreaterThanOrEqual(0); + expectTypeOf(data.soldier).toEqualTypeOf(); + expect(data.sorcerer).toBeDefined(); + expect(data.sorcerer).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sorcerer).toEqualTypeOf(); + expect(data.soup).toBeDefined(); + expect(data.soup).toBeGreaterThanOrEqual(0); + expectTypeOf(data.soup).toEqualTypeOf(); + expect(data.space).toBeDefined(); + expect(data.space).toBeGreaterThanOrEqual(0); + expectTypeOf(data.space).toEqualTypeOf(); + expect(data.spaceship).toBeDefined(); + expect(data.spaceship).toBeGreaterThanOrEqual(0); + expectTypeOf(data.spaceship).toEqualTypeOf(); + expect(data.spellbook).toBeDefined(); + expect(data.spellbook).toBeGreaterThanOrEqual(0); + expectTypeOf(data.spellbook).toEqualTypeOf(); + expect(data.spider).toBeDefined(); + expect(data.spider).toBeGreaterThanOrEqual(0); + expectTypeOf(data.spider).toEqualTypeOf(); + expect(data.spiderWeb).toBeDefined(); + expect(data.spiderWeb).toBeGreaterThanOrEqual(0); + expectTypeOf(data.spiderWeb).toEqualTypeOf(); + expect(data.spirit).toBeDefined(); + expect(data.spirit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.spirit).toEqualTypeOf(); + expect(data.spirits).toBeDefined(); + expect(data.spirits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.spirits).toEqualTypeOf(); + expect(data.sponge).toBeDefined(); + expect(data.sponge).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sponge).toEqualTypeOf(); + expect(data.spookyTree).toBeDefined(); + expect(data.spookyTree).toBeGreaterThanOrEqual(0); + expectTypeOf(data.spookyTree).toEqualTypeOf(); + expect(data.spring).toBeDefined(); + expect(data.spring).toBeGreaterThanOrEqual(0); + expectTypeOf(data.spring).toEqualTypeOf(); + expect(data.spy).toBeDefined(); + expect(data.spy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.spy).toEqualTypeOf(); + expect(data.stadium).toBeDefined(); + expect(data.stadium).toBeGreaterThanOrEqual(0); + expectTypeOf(data.stadium).toEqualTypeOf(); + expect(data.stamp).toBeDefined(); + expect(data.stamp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.stamp).toEqualTypeOf(); + expect(data.star).toBeDefined(); + expect(data.star).toBeGreaterThanOrEqual(0); + expectTypeOf(data.star).toEqualTypeOf(); + expect(data.starryNight).toBeDefined(); + expect(data.starryNight).toBeGreaterThanOrEqual(0); + expectTypeOf(data.starryNight).toEqualTypeOf(); + expect(data.steamLocomotive).toBeDefined(); + expect(data.steamLocomotive).toBeGreaterThanOrEqual(0); + expectTypeOf(data.steamLocomotive).toEqualTypeOf(); + expect(data.steamPunk).toBeDefined(); + expect(data.steamPunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.steamPunk).toEqualTypeOf(); + expect(data.steampunk).toBeDefined(); + expect(data.steampunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.steampunk).toEqualTypeOf(); + expect(data.stick).toBeDefined(); + expect(data.stick).toBeGreaterThanOrEqual(0); + expectTypeOf(data.stick).toEqualTypeOf(); + expect(data.stocking).toBeDefined(); + expect(data.stocking).toBeGreaterThanOrEqual(0); + expectTypeOf(data.stocking).toEqualTypeOf(); + expect(data.sun).toBeDefined(); + expect(data.sun).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sun).toEqualTypeOf(); + expect(data.sunset).toBeDefined(); + expect(data.sunset).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sunset).toEqualTypeOf(); + expect(data.superHero).toBeDefined(); + expect(data.superHero).toBeGreaterThanOrEqual(0); + expectTypeOf(data.superHero).toEqualTypeOf(); + expect(data.superhero).toBeDefined(); + expect(data.superhero).toBeGreaterThanOrEqual(0); + expectTypeOf(data.superhero).toEqualTypeOf(); + expect(data.supernatural).toBeDefined(); + expect(data.supernatural).toBeGreaterThanOrEqual(0); + expectTypeOf(data.supernatural).toEqualTypeOf(); + expect(data.surfboard).toBeDefined(); + expect(data.surfboard).toBeGreaterThanOrEqual(0); + expectTypeOf(data.surfboard).toEqualTypeOf(); + expect(data.surprise).toBeDefined(); + expect(data.surprise).toBeGreaterThanOrEqual(0); + expectTypeOf(data.surprise).toEqualTypeOf(); + expect(data.surreal).toBeDefined(); + expect(data.surreal).toBeGreaterThanOrEqual(0); + expectTypeOf(data.surreal).toEqualTypeOf(); + expect(data.sushi).toBeDefined(); + expect(data.sushi).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sushi).toEqualTypeOf(); + expect(data.swamp).toBeDefined(); + expect(data.swamp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.swamp).toEqualTypeOf(); + expect(data.sweet).toBeDefined(); + expect(data.sweet).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sweet).toEqualTypeOf(); + expect(data.sweets).toBeDefined(); + expect(data.sweets).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sweets).toEqualTypeOf(); + expect(data.swing).toBeDefined(); + expect(data.swing).toBeGreaterThanOrEqual(0); + expectTypeOf(data.swing).toEqualTypeOf(); + expect(data.sword).toBeDefined(); + expect(data.sword).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sword).toEqualTypeOf(); + expect(data.talentShow).toBeDefined(); + expect(data.talentShow).toBeGreaterThanOrEqual(0); + expectTypeOf(data.talentShow).toEqualTypeOf(); + expect(data.tank).toBeDefined(); + expect(data.tank).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tank).toEqualTypeOf(); + expect(data.tarantula).toBeDefined(); + expect(data.tarantula).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tarantula).toEqualTypeOf(); + expect(data.teddyBear).toBeDefined(); + expect(data.teddyBear).toBeGreaterThanOrEqual(0); + expectTypeOf(data.teddyBear).toEqualTypeOf(); + expect(data.temple).toBeDefined(); + expect(data.temple).toBeGreaterThanOrEqual(0); + expectTypeOf(data.temple).toEqualTypeOf(); + expect(data.tennis).toBeDefined(); + expect(data.tennis).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tennis).toEqualTypeOf(); + expect(data.tent).toBeDefined(); + expect(data.tent).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tent).toEqualTypeOf(); + expect(data.test).toBeDefined(); + expect(data.test).toBeGreaterThanOrEqual(0); + expectTypeOf(data.test).toEqualTypeOf(); + expect(data.tests).toBeDefined(); + expect(data.tests).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tests).toEqualTypeOf(); + expect(data.theBestToyEver).toBeDefined(); + expect(data.theBestToyEver).toBeGreaterThanOrEqual(0); + expectTypeOf(data.theBestToyEver).toEqualTypeOf(); + expect(data.theFuture).toBeDefined(); + expect(data.theFuture).toBeGreaterThanOrEqual(0); + expectTypeOf(data.theFuture).toEqualTypeOf(); + expect(data.theGrinch).toBeDefined(); + expect(data.theGrinch).toBeGreaterThanOrEqual(0); + expectTypeOf(data.theGrinch).toEqualTypeOf(); + expect(data.theater).toBeDefined(); + expect(data.theater).toBeGreaterThanOrEqual(0); + expectTypeOf(data.theater).toEqualTypeOf(); + expect(data.themePark).toBeDefined(); + expect(data.themePark).toBeGreaterThanOrEqual(0); + expectTypeOf(data.themePark).toEqualTypeOf(); + expect(data.throne).toBeDefined(); + expect(data.throne).toBeGreaterThanOrEqual(0); + expectTypeOf(data.throne).toEqualTypeOf(); + expect(data.thunderAndLightning).toBeDefined(); + expect(data.thunderAndLightning).toBeGreaterThanOrEqual(0); + expectTypeOf(data.thunderAndLightning).toEqualTypeOf(); + expect(data.ticket).toBeDefined(); + expect(data.ticket).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ticket).toEqualTypeOf(); + expect(data.tiger).toBeDefined(); + expect(data.tiger).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tiger).toEqualTypeOf(); + expect(data.tomb).toBeDefined(); + expect(data.tomb).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tomb).toEqualTypeOf(); + expect(data.tombstone).toBeDefined(); + expect(data.tombstone).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tombstone).toEqualTypeOf(); + expect(data.tooth).toBeDefined(); + expect(data.tooth).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tooth).toEqualTypeOf(); + expect(data.toothpaste).toBeDefined(); + expect(data.toothpaste).toBeGreaterThanOrEqual(0); + expectTypeOf(data.toothpaste).toEqualTypeOf(); + expect(data.topHat).toBeDefined(); + expect(data.topHat).toBeGreaterThanOrEqual(0); + expectTypeOf(data.topHat).toEqualTypeOf(); + expect(data.torch).toBeDefined(); + expect(data.torch).toBeGreaterThanOrEqual(0); + expectTypeOf(data.torch).toEqualTypeOf(); + expect(data.tornado).toBeDefined(); + expect(data.tornado).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tornado).toEqualTypeOf(); + expect(data.tower).toBeDefined(); + expect(data.tower).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tower).toEqualTypeOf(); + expect(data.towerOfPisa).toBeDefined(); + expect(data.towerOfPisa).toBeGreaterThanOrEqual(0); + expectTypeOf(data.towerOfPisa).toEqualTypeOf(); + expect(data.toyBox).toBeDefined(); + expect(data.toyBox).toBeGreaterThanOrEqual(0); + expectTypeOf(data.toyBox).toEqualTypeOf(); + expect(data.toyFactory).toBeDefined(); + expect(data.toyFactory).toBeGreaterThanOrEqual(0); + expectTypeOf(data.toyFactory).toEqualTypeOf(); + expect(data.toys).toBeDefined(); + expect(data.toys).toBeGreaterThanOrEqual(0); + expectTypeOf(data.toys).toEqualTypeOf(); + expect(data.tractor).toBeDefined(); + expect(data.tractor).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tractor).toEqualTypeOf(); + expect(data.train).toBeDefined(); + expect(data.train).toBeGreaterThanOrEqual(0); + expectTypeOf(data.train).toEqualTypeOf(); + expect(data.trainStation).toBeDefined(); + expect(data.trainStation).toBeGreaterThanOrEqual(0); + expectTypeOf(data.trainStation).toEqualTypeOf(); + expect(data.trainstation).toBeDefined(); + expect(data.trainstation).toBeGreaterThanOrEqual(0); + expectTypeOf(data.trainstation).toEqualTypeOf(); + expect(data.trampoline).toBeDefined(); + expect(data.trampoline).toBeGreaterThanOrEqual(0); + expectTypeOf(data.trampoline).toEqualTypeOf(); + expect(data.treasure).toBeDefined(); + expect(data.treasure).toBeGreaterThanOrEqual(0); + expectTypeOf(data.treasure).toEqualTypeOf(); + expect(data.treasureChest).toBeDefined(); + expect(data.treasureChest).toBeGreaterThanOrEqual(0); + expectTypeOf(data.treasureChest).toEqualTypeOf(); + expect(data.treehouse).toBeDefined(); + expect(data.treehouse).toBeGreaterThanOrEqual(0); + expectTypeOf(data.treehouse).toEqualTypeOf(); + expect(data.trickortreating).toBeDefined(); + expect(data.trickortreating).toBeGreaterThanOrEqual(0); + expectTypeOf(data.trickortreating).toEqualTypeOf(); + expect(data.troll).toBeDefined(); + expect(data.troll).toBeGreaterThanOrEqual(0); + expectTypeOf(data.troll).toEqualTypeOf(); + expect(data.truck).toBeDefined(); + expect(data.truck).toBeGreaterThanOrEqual(0); + expectTypeOf(data.truck).toEqualTypeOf(); + expect(data.turkey).toBeDefined(); + expect(data.turkey).toBeGreaterThanOrEqual(0); + expectTypeOf(data.turkey).toEqualTypeOf(); + expect(data.turtle).toBeDefined(); + expect(data.turtle).toBeGreaterThanOrEqual(0); + expectTypeOf(data.turtle).toEqualTypeOf(); + expect(data.usa).toBeDefined(); + expect(data.usa).toBeGreaterThanOrEqual(0); + expectTypeOf(data.usa).toEqualTypeOf(); + expect(data.umbrella).toBeDefined(); + expect(data.umbrella).toBeGreaterThanOrEqual(0); + expectTypeOf(data.umbrella).toEqualTypeOf(); + expect(data.undead).toBeDefined(); + expect(data.undead).toBeGreaterThanOrEqual(0); + expectTypeOf(data.undead).toEqualTypeOf(); + expect(data.underTheSea).toBeDefined(); + expect(data.underTheSea).toBeGreaterThanOrEqual(0); + expectTypeOf(data.underTheSea).toEqualTypeOf(); + expect(data.underground).toBeDefined(); + expect(data.underground).toBeGreaterThanOrEqual(0); + expectTypeOf(data.underground).toEqualTypeOf(); + expect(data.unicorn).toBeDefined(); + expect(data.unicorn).toBeGreaterThanOrEqual(0); + expectTypeOf(data.unicorn).toEqualTypeOf(); + expect(data.vampire).toBeDefined(); + expect(data.vampire).toBeGreaterThanOrEqual(0); + expectTypeOf(data.vampire).toEqualTypeOf(); + expect(data.vegetableGarden).toBeDefined(); + expect(data.vegetableGarden).toBeGreaterThanOrEqual(0); + expectTypeOf(data.vegetableGarden).toEqualTypeOf(); + expect(data.vehicle).toBeDefined(); + expect(data.vehicle).toBeGreaterThanOrEqual(0); + expectTypeOf(data.vehicle).toEqualTypeOf(); + expect(data.vendingMachine).toBeDefined(); + expect(data.vendingMachine).toBeGreaterThanOrEqual(0); + expectTypeOf(data.vendingMachine).toEqualTypeOf(); + expect(data.videoGame).toBeDefined(); + expect(data.videoGame).toBeGreaterThanOrEqual(0); + expectTypeOf(data.videoGame).toEqualTypeOf(); + expect(data.viking).toBeDefined(); + expect(data.viking).toBeGreaterThanOrEqual(0); + expectTypeOf(data.viking).toEqualTypeOf(); + expect(data.volcano).toBeDefined(); + expect(data.volcano).toBeGreaterThanOrEqual(0); + expectTypeOf(data.volcano).toEqualTypeOf(); + expect(data.volcanoEruption).toBeDefined(); + expect(data.volcanoEruption).toBeGreaterThanOrEqual(0); + expectTypeOf(data.volcanoEruption).toEqualTypeOf(); + expect(data.volleyballCourt).toBeDefined(); + expect(data.volleyballCourt).toBeGreaterThanOrEqual(0); + expectTypeOf(data.volleyballCourt).toEqualTypeOf(); + expect(data.wallet).toBeDefined(); + expect(data.wallet).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wallet).toEqualTypeOf(); + expect(data.warlock).toBeDefined(); + expect(data.warlock).toBeGreaterThanOrEqual(0); + expectTypeOf(data.warlock).toEqualTypeOf(); + expect(data.watch).toBeDefined(); + expect(data.watch).toBeGreaterThanOrEqual(0); + expectTypeOf(data.watch).toEqualTypeOf(); + expect(data.waterBucket).toBeDefined(); + expect(data.waterBucket).toBeGreaterThanOrEqual(0); + expectTypeOf(data.waterBucket).toEqualTypeOf(); + expect(data.waterfall).toBeDefined(); + expect(data.waterfall).toBeGreaterThanOrEqual(0); + expectTypeOf(data.waterfall).toEqualTypeOf(); + expect(data.web).toBeDefined(); + expect(data.web).toBeGreaterThanOrEqual(0); + expectTypeOf(data.web).toEqualTypeOf(); + expect(data.weightlifting).toBeDefined(); + expect(data.weightlifting).toBeGreaterThanOrEqual(0); + expectTypeOf(data.weightlifting).toEqualTypeOf(); + expect(data.werewolf).toBeDefined(); + expect(data.werewolf).toBeGreaterThanOrEqual(0); + expectTypeOf(data.werewolf).toEqualTypeOf(); + expect(data.western).toBeDefined(); + expect(data.western).toBeGreaterThanOrEqual(0); + expectTypeOf(data.western).toEqualTypeOf(); + expect(data.whale).toBeDefined(); + expect(data.whale).toBeGreaterThanOrEqual(0); + expectTypeOf(data.whale).toEqualTypeOf(); + expect(data.wheel).toBeDefined(); + expect(data.wheel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wheel).toEqualTypeOf(); + expect(data.wickedWitch).toBeDefined(); + expect(data.wickedWitch).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wickedWitch).toEqualTypeOf(); + expect(data.windmill).toBeDefined(); + expect(data.windmill).toBeGreaterThanOrEqual(0); + expectTypeOf(data.windmill).toEqualTypeOf(); + expect(data.winterSuit).toBeDefined(); + expect(data.winterSuit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winterSuit).toEqualTypeOf(); + expect(data.wisemen).toBeDefined(); + expect(data.wisemen).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wisemen).toEqualTypeOf(); + expect(data.wish).toBeDefined(); + expect(data.wish).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wish).toEqualTypeOf(); + expect(data.witch).toBeDefined(); + expect(data.witch).toBeGreaterThanOrEqual(0); + expectTypeOf(data.witch).toEqualTypeOf(); + expect(data.witchHut).toBeDefined(); + expect(data.witchHut).toBeGreaterThanOrEqual(0); + expectTypeOf(data.witchHut).toEqualTypeOf(); + expect(data.witchcraft).toBeDefined(); + expect(data.witchcraft).toBeGreaterThanOrEqual(0); + expectTypeOf(data.witchcraft).toEqualTypeOf(); + expect(data.witchesHat).toBeDefined(); + expect(data.witchesHat).toBeGreaterThanOrEqual(0); + expectTypeOf(data.witchesHat).toEqualTypeOf(); + expect(data.wizard).toBeDefined(); + expect(data.wizard).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wizard).toEqualTypeOf(); + expect(data.wolves).toBeDefined(); + expect(data.wolves).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wolves).toEqualTypeOf(); + expect(data.wonderland).toBeDefined(); + expect(data.wonderland).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wonderland).toEqualTypeOf(); + expect(data.world).toBeDefined(); + expect(data.world).toBeGreaterThanOrEqual(0); + expectTypeOf(data.world).toEqualTypeOf(); + expect(data.worm).toBeDefined(); + expect(data.worm).toBeGreaterThanOrEqual(0); + expectTypeOf(data.worm).toEqualTypeOf(); + expect(data.wreath).toBeDefined(); + expect(data.wreath).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wreath).toEqualTypeOf(); + expect(data.yuleLog).toBeDefined(); + expect(data.yuleLog).toBeGreaterThanOrEqual(0); + expectTypeOf(data.yuleLog).toEqualTypeOf(); + expect(data.zebra).toBeDefined(); + expect(data.zebra).toBeGreaterThanOrEqual(0); + expectTypeOf(data.zebra).toEqualTypeOf(); + expect(data.zombie).toBeDefined(); + expect(data.zombie).toBeGreaterThanOrEqual(0); + expectTypeOf(data.zombie).toEqualTypeOf(); + expect(data.zombieApocalypse).toBeDefined(); + expect(data.zombieApocalypse).toBeGreaterThanOrEqual(0); + expectTypeOf(data.zombieApocalypse).toEqualTypeOf(); + expect(data.zombiePigman).toBeDefined(); + expect(data.zombiePigman).toBeGreaterThanOrEqual(0); + expectTypeOf(data.zombiePigman).toEqualTypeOf(); + expect(data.zombies).toBeDefined(); + expect(data.zombies).toBeGreaterThanOrEqual(0); + expectTypeOf(data.zombies).toEqualTypeOf(); + expect(data.zoo).toBeDefined(); + expect(data.zoo).toBeGreaterThanOrEqual(0); + expectTypeOf(data.zoo).toEqualTypeOf(); + expect(data.null).toBeDefined(); + expect(data.null).toBeGreaterThanOrEqual(0); + expectTypeOf(data.null).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/CopsAndCrims/CopsAndCrims.test.ts b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrims.test.ts index 29e79e905..af6d3c254 100644 --- a/src/Structures/MiniGames/CopsAndCrims/CopsAndCrims.test.ts +++ b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrims.test.ts @@ -5,6 +5,7 @@ import { expect, expectTypeOf, test } from 'vitest'; test('CopsAndCrims', () => { const data = new CopsAndCrims({ stats: 'meow' }); + expect(data).toBeDefined(); expect(data).toBeInstanceOf(CopsAndCrims); expectTypeOf(data).toEqualTypeOf(); expect(data.coins).toBeDefined(); @@ -137,29 +138,42 @@ test('CopsAndCrims', () => { expect(data.packages).toBeDefined(); expectTypeOf(data.packages).toEqualTypeOf(); expect(data.smg).toBeDefined(); + expect(data.smg).toBeInstanceOf(CopsAndCrimsGun); expectTypeOf(data.smg).toEqualTypeOf(); expect(data.rifle).toBeDefined(); + expect(data.rifle).toBeInstanceOf(CopsAndCrimsGun); expectTypeOf(data.rifle).toEqualTypeOf(); expect(data.carbine).toBeDefined(); + expect(data.carbine).toBeInstanceOf(CopsAndCrimsGun); expectTypeOf(data.carbine).toEqualTypeOf(); expect(data.magnum).toBeDefined(); + expect(data.magnum).toBeInstanceOf(CopsAndCrimsGun); expectTypeOf(data.magnum).toEqualTypeOf(); expect(data.shotgun).toBeDefined(); + expect(data.shotgun).toBeInstanceOf(CopsAndCrimsGun); expectTypeOf(data.shotgun).toEqualTypeOf(); expect(data.sniper).toBeDefined(); + expect(data.sniper).toBeInstanceOf(CopsAndCrimsGun); expectTypeOf(data.sniper).toEqualTypeOf(); expect(data.scopedRifle).toBeDefined(); + expect(data.scopedRifle).toBeInstanceOf(CopsAndCrimsGun); expectTypeOf(data.scopedRifle).toEqualTypeOf(); expect(data.handgun).toBeDefined(); + expect(data.handgun).toBeInstanceOf(CopsAndCrimsGun); expectTypeOf(data.handgun).toEqualTypeOf(); expect(data.autoShotgun).toBeDefined(); + expect(data.autoShotgun).toBeInstanceOf(CopsAndCrimsGun); expectTypeOf(data.autoShotgun).toEqualTypeOf(); expect(data.bullpup).toBeDefined(); + expect(data.bullpup).toBeInstanceOf(CopsAndCrimsGun); expectTypeOf(data.bullpup).toEqualTypeOf(); expect(data.knife).toBeDefined(); + expect(data.knife).toBeInstanceOf(CopsAndCrimsGun); expectTypeOf(data.knife).toEqualTypeOf(); expect(data.deathmatch).toBeDefined(); + expect(data.deathmatch).toBeInstanceOf(CopsAndCrimsGamemode); expectTypeOf(data.deathmatch).toEqualTypeOf(); expect(data.gungame).toBeDefined(); + expect(data.gungame).toBeInstanceOf(CopsAndCrimsGamemode); expectTypeOf(data.gungame).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGamemode.test.ts b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGamemode.test.ts index e3662ff7b..7beb3915c 100644 --- a/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGamemode.test.ts +++ b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGamemode.test.ts @@ -3,6 +3,7 @@ import { expect, expectTypeOf, test } from 'vitest'; test('CopsAndCrimsGamemode', () => { const data = new CopsAndCrimsGamemode({ stats: 'meow' }, 'deathmatch'); + expect(data).toBeDefined(); expect(data).toBeInstanceOf(CopsAndCrimsGamemode); expectTypeOf(data).toEqualTypeOf(); expect(data.kills).toBeDefined(); diff --git a/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.test.ts b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.test.ts index 80ceb5f01..2636c957d 100644 --- a/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.test.ts +++ b/src/Structures/MiniGames/CopsAndCrims/CopsAndCrimsGun.test.ts @@ -3,7 +3,8 @@ import { expect, expectTypeOf, test } from 'vitest'; import type { CopsAndCrimsGuns } from '../../../Types/Player.js'; test('CopsAndCrimsGun', () => { - const data = new CopsAndCrimsGun({ stats: 'meow' }, 'smg'); + const data = new CopsAndCrimsGun({ stats: 'meow' }, 'auto_shotgun'); + expect(data).toBeDefined(); expect(data).toBeInstanceOf(CopsAndCrimsGun); expectTypeOf(data).toEqualTypeOf(); expect(data.gunName).toBeDefined(); diff --git a/src/Structures/MiniGames/Duels/Duels.test.ts b/src/Structures/MiniGames/Duels/Duels.test.ts index 6eb00e646..c9cab0797 100644 --- a/src/Structures/MiniGames/Duels/Duels.test.ts +++ b/src/Structures/MiniGames/Duels/Duels.test.ts @@ -9,6 +9,7 @@ import { expect, expectTypeOf, test } from 'vitest'; test('Duels', () => { const data = new Duels({ stats: 'meow' }); + expect(data).toBeDefined(); expect(data).toBeInstanceOf(Duels); expectTypeOf(data).toEqualTypeOf(); expect(data.tokens).toBeDefined(); @@ -74,1787 +75,45 @@ test('Duels', () => { expect(data.goldenApplesEaten).toBeGreaterThanOrEqual(0); expectTypeOf(data.goldenApplesEaten).toEqualTypeOf(); expect(data.uhc).toBeDefined(); + expect(data.uhc).toBeInstanceOf(DuelsUHC); expectTypeOf(data.uhc).toEqualTypeOf(); - expectTypeOf(data.uhc.title).toEqualTypeOf(); - expect(data.uhc.winStreak).toBeDefined(); - expect(data.uhc.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.winStreak).toEqualTypeOf(); - expect(data.uhc.bestWinStreak).toBeDefined(); - expect(data.uhc.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.bestWinStreak).toEqualTypeOf(); - expect(data.uhc.solo).toBeDefined(); - expectTypeOf(data.uhc.solo).toEqualTypeOf(); - expectTypeOf(data.uhc.solo.title).toEqualTypeOf(); - expect(data.uhc.solo.winStreak).toBeDefined(); - expect(data.uhc.solo.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.solo.winStreak).toEqualTypeOf(); - expect(data.uhc.solo.bestWinStreak).toBeDefined(); - expect(data.uhc.solo.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.solo.bestWinStreak).toEqualTypeOf(); - expect(data.uhc.solo.kills).toBeDefined(); - expect(data.uhc.solo.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.solo.kills).toEqualTypeOf(); - expect(data.uhc.solo.deaths).toBeDefined(); - expect(data.uhc.solo.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.solo.deaths).toEqualTypeOf(); - expect(data.uhc.solo.KDR).toBeDefined(); - expect(data.uhc.solo.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.solo.KDR).toEqualTypeOf(); - expect(data.uhc.solo.wins).toBeDefined(); - expect(data.uhc.solo.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.solo.wins).toEqualTypeOf(); - expect(data.uhc.solo.losses).toBeDefined(); - expect(data.uhc.solo.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.solo.losses).toEqualTypeOf(); - expect(data.uhc.solo.WLR).toBeDefined(); - expect(data.uhc.solo.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.solo.WLR).toEqualTypeOf(); - expect(data.uhc.solo.playedGames).toBeDefined(); - expect(data.uhc.solo.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.solo.playedGames).toEqualTypeOf(); - expect(data.uhc.solo.swings).toBeDefined(); - expect(data.uhc.solo.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.solo.swings).toEqualTypeOf(); - expect(data.uhc.solo.hits).toBeDefined(); - expect(data.uhc.solo.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.solo.hits).toEqualTypeOf(); - expect(data.uhc.solo.meleeAccuracy).toBeDefined(); - expect(data.uhc.solo.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.solo.meleeAccuracy).toEqualTypeOf(); - expect(data.uhc.solo.bowShots).toBeDefined(); - expect(data.uhc.solo.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.solo.bowShots).toEqualTypeOf(); - expect(data.uhc.solo.bowHits).toBeDefined(); - expect(data.uhc.solo.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.solo.bowHits).toEqualTypeOf(); - expect(data.uhc.solo.bowAccuracy).toBeDefined(); - expect(data.uhc.solo.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.solo.bowAccuracy).toEqualTypeOf(); - expect(data.uhc.solo.blocksPlaced).toBeDefined(); - expect(data.uhc.solo.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.solo.blocksPlaced).toEqualTypeOf(); - expect(data.uhc.solo.healthRegenerated).toBeDefined(); - expect(data.uhc.solo.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.solo.healthRegenerated).toEqualTypeOf(); - expect(data.uhc.solo.goldenApplesEaten).toBeDefined(); - expect(data.uhc.solo.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.solo.goldenApplesEaten).toEqualTypeOf(); - expect(data.uhc.doubles).toBeDefined(); - expectTypeOf(data.uhc.doubles).toEqualTypeOf(); - expectTypeOf(data.uhc.doubles.title).toEqualTypeOf(); - expect(data.uhc.doubles.winStreak).toBeDefined(); - expect(data.uhc.doubles.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.doubles.winStreak).toEqualTypeOf(); - expect(data.uhc.doubles.bestWinStreak).toBeDefined(); - expect(data.uhc.doubles.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.doubles.bestWinStreak).toEqualTypeOf(); - expect(data.uhc.doubles.kills).toBeDefined(); - expect(data.uhc.doubles.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.doubles.kills).toEqualTypeOf(); - expect(data.uhc.doubles.deaths).toBeDefined(); - expect(data.uhc.doubles.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.doubles.deaths).toEqualTypeOf(); - expect(data.uhc.doubles.KDR).toBeDefined(); - expect(data.uhc.doubles.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.doubles.KDR).toEqualTypeOf(); - expect(data.uhc.doubles.wins).toBeDefined(); - expect(data.uhc.doubles.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.doubles.wins).toEqualTypeOf(); - expect(data.uhc.doubles.losses).toBeDefined(); - expect(data.uhc.doubles.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.doubles.losses).toEqualTypeOf(); - expect(data.uhc.doubles.WLR).toBeDefined(); - expect(data.uhc.doubles.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.doubles.WLR).toEqualTypeOf(); - expect(data.uhc.doubles.playedGames).toBeDefined(); - expect(data.uhc.doubles.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.doubles.playedGames).toEqualTypeOf(); - expect(data.uhc.doubles.swings).toBeDefined(); - expect(data.uhc.doubles.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.doubles.swings).toEqualTypeOf(); - expect(data.uhc.doubles.hits).toBeDefined(); - expect(data.uhc.doubles.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.doubles.hits).toEqualTypeOf(); - expect(data.uhc.doubles.meleeAccuracy).toBeDefined(); - expect(data.uhc.doubles.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.doubles.meleeAccuracy).toEqualTypeOf(); - expect(data.uhc.doubles.bowShots).toBeDefined(); - expect(data.uhc.doubles.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.doubles.bowShots).toEqualTypeOf(); - expect(data.uhc.doubles.bowHits).toBeDefined(); - expect(data.uhc.doubles.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.doubles.bowHits).toEqualTypeOf(); - expect(data.uhc.doubles.bowAccuracy).toBeDefined(); - expect(data.uhc.doubles.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.doubles.bowAccuracy).toEqualTypeOf(); - expect(data.uhc.doubles.blocksPlaced).toBeDefined(); - expect(data.uhc.doubles.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.doubles.blocksPlaced).toEqualTypeOf(); - expect(data.uhc.doubles.healthRegenerated).toBeDefined(); - expect(data.uhc.doubles.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.doubles.healthRegenerated).toEqualTypeOf(); - expect(data.uhc.doubles.goldenApplesEaten).toBeDefined(); - expect(data.uhc.doubles.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.doubles.goldenApplesEaten).toEqualTypeOf(); - expect(data.uhc.fours).toBeDefined(); - expectTypeOf(data.uhc.fours).toEqualTypeOf(); - expectTypeOf(data.uhc.fours.title).toEqualTypeOf(); - expect(data.uhc.fours.winStreak).toBeDefined(); - expect(data.uhc.fours.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.fours.winStreak).toEqualTypeOf(); - expect(data.uhc.fours.bestWinStreak).toBeDefined(); - expect(data.uhc.fours.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.fours.bestWinStreak).toEqualTypeOf(); - expect(data.uhc.fours.kills).toBeDefined(); - expect(data.uhc.fours.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.fours.kills).toEqualTypeOf(); - expect(data.uhc.fours.deaths).toBeDefined(); - expect(data.uhc.fours.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.fours.deaths).toEqualTypeOf(); - expect(data.uhc.fours.KDR).toBeDefined(); - expect(data.uhc.fours.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.fours.KDR).toEqualTypeOf(); - expect(data.uhc.fours.wins).toBeDefined(); - expect(data.uhc.fours.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.fours.wins).toEqualTypeOf(); - expect(data.uhc.fours.losses).toBeDefined(); - expect(data.uhc.fours.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.fours.losses).toEqualTypeOf(); - expect(data.uhc.fours.WLR).toBeDefined(); - expect(data.uhc.fours.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.fours.WLR).toEqualTypeOf(); - expect(data.uhc.fours.playedGames).toBeDefined(); - expect(data.uhc.fours.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.fours.playedGames).toEqualTypeOf(); - expect(data.uhc.fours.swings).toBeDefined(); - expect(data.uhc.fours.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.fours.swings).toEqualTypeOf(); - expect(data.uhc.fours.hits).toBeDefined(); - expect(data.uhc.fours.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.fours.hits).toEqualTypeOf(); - expect(data.uhc.fours.meleeAccuracy).toBeDefined(); - expect(data.uhc.fours.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.fours.meleeAccuracy).toEqualTypeOf(); - expect(data.uhc.fours.bowShots).toBeDefined(); - expect(data.uhc.fours.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.fours.bowShots).toEqualTypeOf(); - expect(data.uhc.fours.bowHits).toBeDefined(); - expect(data.uhc.fours.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.fours.bowHits).toEqualTypeOf(); - expect(data.uhc.fours.bowAccuracy).toBeDefined(); - expect(data.uhc.fours.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.fours.bowAccuracy).toEqualTypeOf(); - expect(data.uhc.fours.blocksPlaced).toBeDefined(); - expect(data.uhc.fours.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.fours.blocksPlaced).toEqualTypeOf(); - expect(data.uhc.fours.healthRegenerated).toBeDefined(); - expect(data.uhc.fours.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.fours.healthRegenerated).toEqualTypeOf(); - expect(data.uhc.fours.goldenApplesEaten).toBeDefined(); - expect(data.uhc.fours.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.fours.goldenApplesEaten).toEqualTypeOf(); - expect(data.uhc.deathmatch).toBeDefined(); - expectTypeOf(data.uhc.deathmatch).toEqualTypeOf(); - expectTypeOf(data.uhc.deathmatch.title).toEqualTypeOf(); - expect(data.uhc.deathmatch.winStreak).toBeDefined(); - expect(data.uhc.deathmatch.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.deathmatch.winStreak).toEqualTypeOf(); - expect(data.uhc.deathmatch.bestWinStreak).toBeDefined(); - expect(data.uhc.deathmatch.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.deathmatch.bestWinStreak).toEqualTypeOf(); - expect(data.uhc.deathmatch.kills).toBeDefined(); - expect(data.uhc.deathmatch.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.deathmatch.kills).toEqualTypeOf(); - expect(data.uhc.deathmatch.deaths).toBeDefined(); - expect(data.uhc.deathmatch.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.deathmatch.deaths).toEqualTypeOf(); - expect(data.uhc.deathmatch.KDR).toBeDefined(); - expect(data.uhc.deathmatch.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.deathmatch.KDR).toEqualTypeOf(); - expect(data.uhc.deathmatch.wins).toBeDefined(); - expect(data.uhc.deathmatch.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.deathmatch.wins).toEqualTypeOf(); - expect(data.uhc.deathmatch.losses).toBeDefined(); - expect(data.uhc.deathmatch.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.deathmatch.losses).toEqualTypeOf(); - expect(data.uhc.deathmatch.WLR).toBeDefined(); - expect(data.uhc.deathmatch.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.deathmatch.WLR).toEqualTypeOf(); - expect(data.uhc.deathmatch.playedGames).toBeDefined(); - expect(data.uhc.deathmatch.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.deathmatch.playedGames).toEqualTypeOf(); - expect(data.uhc.deathmatch.swings).toBeDefined(); - expect(data.uhc.deathmatch.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.deathmatch.swings).toEqualTypeOf(); - expect(data.uhc.deathmatch.hits).toBeDefined(); - expect(data.uhc.deathmatch.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.deathmatch.hits).toEqualTypeOf(); - expect(data.uhc.deathmatch.meleeAccuracy).toBeDefined(); - expect(data.uhc.deathmatch.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.deathmatch.meleeAccuracy).toEqualTypeOf(); - expect(data.uhc.deathmatch.bowShots).toBeDefined(); - expect(data.uhc.deathmatch.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.deathmatch.bowShots).toEqualTypeOf(); - expect(data.uhc.deathmatch.bowHits).toBeDefined(); - expect(data.uhc.deathmatch.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.deathmatch.bowHits).toEqualTypeOf(); - expect(data.uhc.deathmatch.bowAccuracy).toBeDefined(); - expect(data.uhc.deathmatch.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.deathmatch.bowAccuracy).toEqualTypeOf(); - expect(data.uhc.deathmatch.blocksPlaced).toBeDefined(); - expect(data.uhc.deathmatch.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.deathmatch.blocksPlaced).toEqualTypeOf(); - expect(data.uhc.deathmatch.healthRegenerated).toBeDefined(); - expect(data.uhc.deathmatch.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.deathmatch.healthRegenerated).toEqualTypeOf(); - expect(data.uhc.deathmatch.goldenApplesEaten).toBeDefined(); - expect(data.uhc.deathmatch.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.deathmatch.goldenApplesEaten).toEqualTypeOf(); - expect(data.uhc.kills).toBeDefined(); - expect(data.uhc.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.kills).toEqualTypeOf(); - expect(data.uhc.deaths).toBeDefined(); - expect(data.uhc.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.deaths).toEqualTypeOf(); - expect(data.uhc.KDR).toBeDefined(); - expect(data.uhc.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.KDR).toEqualTypeOf(); - expect(data.uhc.wins).toBeDefined(); - expect(data.uhc.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.wins).toEqualTypeOf(); - expect(data.uhc.losses).toBeDefined(); - expect(data.uhc.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.losses).toEqualTypeOf(); - expect(data.uhc.WLR).toBeDefined(); - expect(data.uhc.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.WLR).toEqualTypeOf(); - expect(data.uhc.playedGames).toBeDefined(); - expect(data.uhc.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.playedGames).toEqualTypeOf(); - expect(data.uhc.swings).toBeDefined(); - expect(data.uhc.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.swings).toEqualTypeOf(); - expect(data.uhc.hits).toBeDefined(); - expect(data.uhc.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.hits).toEqualTypeOf(); - expect(data.uhc.meleeAccuracy).toBeDefined(); - expect(data.uhc.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.meleeAccuracy).toEqualTypeOf(); - expect(data.uhc.bowShots).toBeDefined(); - expect(data.uhc.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.bowShots).toEqualTypeOf(); - expect(data.uhc.bowHits).toBeDefined(); - expect(data.uhc.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.bowHits).toEqualTypeOf(); - expect(data.uhc.bowAccuracy).toBeDefined(); - expect(data.uhc.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.bowAccuracy).toEqualTypeOf(); - expect(data.uhc.blocksPlaced).toBeDefined(); - expect(data.uhc.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.blocksPlaced).toEqualTypeOf(); - expect(data.uhc.healthRegenerated).toBeDefined(); - expect(data.uhc.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.healthRegenerated).toEqualTypeOf(); - expect(data.uhc.goldenApplesEaten).toBeDefined(); - expect(data.uhc.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.uhc.goldenApplesEaten).toEqualTypeOf(); expect(data.skywars).toBeDefined(); + expect(data.skywars).toBeInstanceOf(DuelsSkyWars); expectTypeOf(data.skywars).toEqualTypeOf(); - expect(data.skywars.title).toBeDefined(); - expectTypeOf(data.skywars.title).toEqualTypeOf(); - expect(data.skywars.winStreak).toBeDefined(); - expect(data.skywars.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.winStreak).toEqualTypeOf(); - expect(data.skywars.bestWinStreak).toBeDefined(); - expect(data.skywars.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.bestWinStreak).toEqualTypeOf(); - expect(data.skywars.solo).toBeDefined(); - expectTypeOf(data.skywars.solo).toEqualTypeOf(); - expect(data.skywars.solo.title).toBeDefined(); - expectTypeOf(data.skywars.solo.title).toEqualTypeOf(); - expect(data.skywars.solo.winStreak).toBeDefined(); - expect(data.skywars.solo.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.solo.winStreak).toEqualTypeOf(); - expect(data.skywars.solo.bestWinStreak).toBeDefined(); - expect(data.skywars.solo.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.solo.bestWinStreak).toEqualTypeOf(); - expect(data.skywars.solo.kills).toBeDefined(); - expect(data.skywars.solo.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.solo.kills).toEqualTypeOf(); - expect(data.skywars.solo.deaths).toBeDefined(); - expect(data.skywars.solo.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.solo.deaths).toEqualTypeOf(); - expect(data.skywars.solo.KDR).toBeDefined(); - expect(data.skywars.solo.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.solo.KDR).toEqualTypeOf(); - expect(data.skywars.solo.wins).toBeDefined(); - expect(data.skywars.solo.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.solo.wins).toEqualTypeOf(); - expect(data.skywars.solo.losses).toBeDefined(); - expect(data.skywars.solo.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.solo.losses).toEqualTypeOf(); - expect(data.skywars.solo.WLR).toBeDefined(); - expect(data.skywars.solo.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.solo.WLR).toEqualTypeOf(); - expect(data.skywars.solo.playedGames).toBeDefined(); - expect(data.skywars.solo.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.solo.playedGames).toEqualTypeOf(); - expect(data.skywars.solo.swings).toBeDefined(); - expect(data.skywars.solo.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.solo.swings).toEqualTypeOf(); - expect(data.skywars.solo.hits).toBeDefined(); - expect(data.skywars.solo.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.solo.hits).toEqualTypeOf(); - expect(data.skywars.solo.meleeAccuracy).toBeDefined(); - expect(data.skywars.solo.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.solo.meleeAccuracy).toEqualTypeOf(); - expect(data.skywars.solo.bowShots).toBeDefined(); - expect(data.skywars.solo.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.solo.bowShots).toEqualTypeOf(); - expect(data.skywars.solo.bowHits).toBeDefined(); - expect(data.skywars.solo.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.solo.bowHits).toEqualTypeOf(); - expect(data.skywars.solo.bowAccuracy).toBeDefined(); - expect(data.skywars.solo.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.solo.bowAccuracy).toEqualTypeOf(); - expect(data.skywars.solo.blocksPlaced).toBeDefined(); - expect(data.skywars.solo.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.solo.blocksPlaced).toEqualTypeOf(); - expect(data.skywars.solo.healthRegenerated).toBeDefined(); - expect(data.skywars.solo.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.solo.healthRegenerated).toEqualTypeOf(); - expect(data.skywars.solo.goldenApplesEaten).toBeDefined(); - expect(data.skywars.solo.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.solo.goldenApplesEaten).toEqualTypeOf(); - expect(data.skywars.doubles).toBeDefined(); - expectTypeOf(data.skywars.doubles).toEqualTypeOf(); - expect(data.skywars.doubles.title).toBeDefined(); - expectTypeOf(data.skywars.doubles.title).toEqualTypeOf(); - expect(data.skywars.doubles.winStreak).toBeDefined(); - expect(data.skywars.doubles.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.doubles.winStreak).toEqualTypeOf(); - expect(data.skywars.doubles.bestWinStreak).toBeDefined(); - expect(data.skywars.doubles.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.doubles.bestWinStreak).toEqualTypeOf(); - expect(data.skywars.doubles.kills).toBeDefined(); - expect(data.skywars.doubles.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.doubles.kills).toEqualTypeOf(); - expect(data.skywars.doubles.deaths).toBeDefined(); - expect(data.skywars.doubles.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.doubles.deaths).toEqualTypeOf(); - expect(data.skywars.doubles.KDR).toBeDefined(); - expect(data.skywars.doubles.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.doubles.KDR).toEqualTypeOf(); - expect(data.skywars.doubles.wins).toBeDefined(); - expect(data.skywars.doubles.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.doubles.wins).toEqualTypeOf(); - expect(data.skywars.doubles.losses).toBeDefined(); - expect(data.skywars.doubles.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.doubles.losses).toEqualTypeOf(); - expect(data.skywars.doubles.WLR).toBeDefined(); - expect(data.skywars.doubles.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.doubles.WLR).toEqualTypeOf(); - expect(data.skywars.doubles.playedGames).toBeDefined(); - expect(data.skywars.doubles.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.doubles.playedGames).toEqualTypeOf(); - expect(data.skywars.doubles.swings).toBeDefined(); - expect(data.skywars.doubles.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.doubles.swings).toEqualTypeOf(); - expect(data.skywars.doubles.hits).toBeDefined(); - expect(data.skywars.doubles.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.doubles.hits).toEqualTypeOf(); - expect(data.skywars.doubles.meleeAccuracy).toBeDefined(); - expect(data.skywars.doubles.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.doubles.meleeAccuracy).toEqualTypeOf(); - expect(data.skywars.doubles.bowShots).toBeDefined(); - expect(data.skywars.doubles.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.doubles.bowShots).toEqualTypeOf(); - expect(data.skywars.doubles.bowHits).toBeDefined(); - expect(data.skywars.doubles.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.doubles.bowHits).toEqualTypeOf(); - expect(data.skywars.doubles.bowAccuracy).toBeDefined(); - expect(data.skywars.doubles.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.doubles.bowAccuracy).toEqualTypeOf(); - expect(data.skywars.doubles.blocksPlaced).toBeDefined(); - expect(data.skywars.doubles.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.doubles.blocksPlaced).toEqualTypeOf(); - expect(data.skywars.doubles.healthRegenerated).toBeDefined(); - expect(data.skywars.doubles.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.doubles.healthRegenerated).toEqualTypeOf(); - expect(data.skywars.doubles.goldenApplesEaten).toBeDefined(); - expect(data.skywars.doubles.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.doubles.goldenApplesEaten).toEqualTypeOf(); - expect(data.skywars.kills).toBeDefined(); - expect(data.skywars.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.kills).toEqualTypeOf(); - expect(data.skywars.deaths).toBeDefined(); - expect(data.skywars.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.deaths).toEqualTypeOf(); - expect(data.skywars.KDR).toBeDefined(); - expect(data.skywars.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.KDR).toEqualTypeOf(); - expect(data.skywars.wins).toBeDefined(); - expect(data.skywars.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.wins).toEqualTypeOf(); - expect(data.skywars.losses).toBeDefined(); - expect(data.skywars.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.losses).toEqualTypeOf(); - expect(data.skywars.WLR).toBeDefined(); - expect(data.skywars.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.WLR).toEqualTypeOf(); - expect(data.skywars.playedGames).toBeDefined(); - expect(data.skywars.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.playedGames).toEqualTypeOf(); - expect(data.skywars.swings).toBeDefined(); - expect(data.skywars.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.swings).toEqualTypeOf(); - expect(data.skywars.hits).toBeDefined(); - expect(data.skywars.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.hits).toEqualTypeOf(); - expect(data.skywars.meleeAccuracy).toBeDefined(); - expect(data.skywars.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.meleeAccuracy).toEqualTypeOf(); - expect(data.skywars.bowShots).toBeDefined(); - expect(data.skywars.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.bowShots).toEqualTypeOf(); - expect(data.skywars.bowHits).toBeDefined(); - expect(data.skywars.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.bowHits).toEqualTypeOf(); - expect(data.skywars.bowAccuracy).toBeDefined(); - expect(data.skywars.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.bowAccuracy).toEqualTypeOf(); - expect(data.skywars.blocksPlaced).toBeDefined(); - expect(data.skywars.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.blocksPlaced).toEqualTypeOf(); - expect(data.skywars.healthRegenerated).toBeDefined(); - expect(data.skywars.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.healthRegenerated).toEqualTypeOf(); - expect(data.skywars.goldenApplesEaten).toBeDefined(); - expect(data.skywars.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.skywars.goldenApplesEaten).toEqualTypeOf(); expect(data.megawalls).toBeDefined(); + expect(data.megawalls).toBeInstanceOf(DuelsMegaWalls); expectTypeOf(data.megawalls).toEqualTypeOf(); - expect(data.megawalls.title).toBeDefined(); - expectTypeOf(data.megawalls.title).toEqualTypeOf(); - expect(data.megawalls.winStreak).toBeDefined(); - expect(data.megawalls.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.winStreak).toEqualTypeOf(); - expect(data.megawalls.bestWinStreak).toBeDefined(); - expect(data.megawalls.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.bestWinStreak).toEqualTypeOf(); - expect(data.megawalls.solo).toBeDefined(); - expectTypeOf(data.megawalls.solo).toEqualTypeOf(); - expect(data.megawalls.solo.title).toBeDefined(); - expectTypeOf(data.megawalls.solo.title).toEqualTypeOf(); - expect(data.megawalls.solo.winStreak).toBeDefined(); - expect(data.megawalls.solo.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.solo.winStreak).toEqualTypeOf(); - expect(data.megawalls.solo.bestWinStreak).toBeDefined(); - expect(data.megawalls.solo.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.solo.bestWinStreak).toEqualTypeOf(); - expect(data.megawalls.solo.kills).toBeDefined(); - expect(data.megawalls.solo.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.solo.kills).toEqualTypeOf(); - expect(data.megawalls.solo.deaths).toBeDefined(); - expect(data.megawalls.solo.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.solo.deaths).toEqualTypeOf(); - expect(data.megawalls.solo.KDR).toBeDefined(); - expect(data.megawalls.solo.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.solo.KDR).toEqualTypeOf(); - expect(data.megawalls.solo.wins).toBeDefined(); - expect(data.megawalls.solo.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.solo.wins).toEqualTypeOf(); - expect(data.megawalls.solo.losses).toBeDefined(); - expect(data.megawalls.solo.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.solo.losses).toEqualTypeOf(); - expect(data.megawalls.solo.WLR).toBeDefined(); - expect(data.megawalls.solo.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.solo.WLR).toEqualTypeOf(); - expect(data.megawalls.solo.playedGames).toBeDefined(); - expect(data.megawalls.solo.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.solo.playedGames).toEqualTypeOf(); - expect(data.megawalls.solo.swings).toBeDefined(); - expect(data.megawalls.solo.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.solo.swings).toEqualTypeOf(); - expect(data.megawalls.solo.hits).toBeDefined(); - expect(data.megawalls.solo.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.solo.hits).toEqualTypeOf(); - expect(data.megawalls.solo.meleeAccuracy).toBeDefined(); - expect(data.megawalls.solo.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.solo.meleeAccuracy).toEqualTypeOf(); - expect(data.megawalls.solo.bowShots).toBeDefined(); - expect(data.megawalls.solo.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.solo.bowShots).toEqualTypeOf(); - expect(data.megawalls.solo.bowHits).toBeDefined(); - expect(data.megawalls.solo.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.solo.bowHits).toEqualTypeOf(); - expect(data.megawalls.solo.bowAccuracy).toBeDefined(); - expect(data.megawalls.solo.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.solo.bowAccuracy).toEqualTypeOf(); - expect(data.megawalls.solo.blocksPlaced).toBeDefined(); - expect(data.megawalls.solo.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.solo.blocksPlaced).toEqualTypeOf(); - expect(data.megawalls.solo.healthRegenerated).toBeDefined(); - expect(data.megawalls.solo.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.solo.healthRegenerated).toEqualTypeOf(); - expect(data.megawalls.solo.goldenApplesEaten).toBeDefined(); - expect(data.megawalls.solo.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.solo.goldenApplesEaten).toEqualTypeOf(); - expect(data.megawalls.doubles).toBeDefined(); - expectTypeOf(data.megawalls.doubles).toEqualTypeOf(); - expect(data.megawalls.doubles.title).toBeDefined(); - expectTypeOf(data.megawalls.doubles.title).toEqualTypeOf(); - expect(data.megawalls.doubles.winStreak).toBeDefined(); - expect(data.megawalls.doubles.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.doubles.winStreak).toEqualTypeOf(); - expect(data.megawalls.doubles.bestWinStreak).toBeDefined(); - expect(data.megawalls.doubles.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.doubles.bestWinStreak).toEqualTypeOf(); - expect(data.megawalls.doubles.kills).toBeDefined(); - expect(data.megawalls.doubles.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.doubles.kills).toEqualTypeOf(); - expect(data.megawalls.doubles.deaths).toBeDefined(); - expect(data.megawalls.doubles.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.doubles.deaths).toEqualTypeOf(); - expect(data.megawalls.doubles.KDR).toBeDefined(); - expect(data.megawalls.doubles.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.doubles.KDR).toEqualTypeOf(); - expect(data.megawalls.doubles.wins).toBeDefined(); - expect(data.megawalls.doubles.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.doubles.wins).toEqualTypeOf(); - expect(data.megawalls.doubles.losses).toBeDefined(); - expect(data.megawalls.doubles.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.doubles.losses).toEqualTypeOf(); - expect(data.megawalls.doubles.WLR).toBeDefined(); - expect(data.megawalls.doubles.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.doubles.WLR).toEqualTypeOf(); - expect(data.megawalls.doubles.playedGames).toBeDefined(); - expect(data.megawalls.doubles.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.doubles.playedGames).toEqualTypeOf(); - expect(data.megawalls.doubles.swings).toBeDefined(); - expect(data.megawalls.doubles.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.doubles.swings).toEqualTypeOf(); - expect(data.megawalls.doubles.hits).toBeDefined(); - expect(data.megawalls.doubles.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.doubles.hits).toEqualTypeOf(); - expect(data.megawalls.doubles.meleeAccuracy).toBeDefined(); - expect(data.megawalls.doubles.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.doubles.meleeAccuracy).toEqualTypeOf(); - expect(data.megawalls.doubles.bowShots).toBeDefined(); - expect(data.megawalls.doubles.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.doubles.bowShots).toEqualTypeOf(); - expect(data.megawalls.doubles.bowHits).toBeDefined(); - expect(data.megawalls.doubles.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.doubles.bowHits).toEqualTypeOf(); - expect(data.megawalls.doubles.bowAccuracy).toBeDefined(); - expect(data.megawalls.doubles.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.doubles.bowAccuracy).toEqualTypeOf(); - expect(data.megawalls.doubles.blocksPlaced).toBeDefined(); - expect(data.megawalls.doubles.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.doubles.blocksPlaced).toEqualTypeOf(); - expect(data.megawalls.doubles.healthRegenerated).toBeDefined(); - expect(data.megawalls.doubles.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.doubles.healthRegenerated).toEqualTypeOf(); - expect(data.megawalls.doubles.goldenApplesEaten).toBeDefined(); - expect(data.megawalls.doubles.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.doubles.goldenApplesEaten).toEqualTypeOf(); - expect(data.megawalls.kills).toBeDefined(); - expect(data.megawalls.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.kills).toEqualTypeOf(); - expect(data.megawalls.deaths).toBeDefined(); - expect(data.megawalls.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.deaths).toEqualTypeOf(); - expect(data.megawalls.KDR).toBeDefined(); - expect(data.megawalls.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.KDR).toEqualTypeOf(); - expect(data.megawalls.wins).toBeDefined(); - expect(data.megawalls.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.wins).toEqualTypeOf(); - expect(data.megawalls.losses).toBeDefined(); - expect(data.megawalls.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.losses).toEqualTypeOf(); - expect(data.megawalls.WLR).toBeDefined(); - expect(data.megawalls.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.WLR).toEqualTypeOf(); - expect(data.megawalls.playedGames).toBeDefined(); - expect(data.megawalls.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.playedGames).toEqualTypeOf(); - expect(data.megawalls.swings).toBeDefined(); - expect(data.megawalls.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.swings).toEqualTypeOf(); - expect(data.megawalls.hits).toBeDefined(); - expect(data.megawalls.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.hits).toEqualTypeOf(); - expect(data.megawalls.meleeAccuracy).toBeDefined(); - expect(data.megawalls.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.meleeAccuracy).toEqualTypeOf(); - expect(data.megawalls.bowShots).toBeDefined(); - expect(data.megawalls.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.bowShots).toEqualTypeOf(); - expect(data.megawalls.bowHits).toBeDefined(); - expect(data.megawalls.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.bowHits).toEqualTypeOf(); - expect(data.megawalls.bowAccuracy).toBeDefined(); - expect(data.megawalls.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.bowAccuracy).toEqualTypeOf(); - expect(data.megawalls.blocksPlaced).toBeDefined(); - expect(data.megawalls.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.blocksPlaced).toEqualTypeOf(); - expect(data.megawalls.healthRegenerated).toBeDefined(); - expect(data.megawalls.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.healthRegenerated).toEqualTypeOf(); - expect(data.megawalls.goldenApplesEaten).toBeDefined(); - expect(data.megawalls.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.megawalls.goldenApplesEaten).toEqualTypeOf(); expect(data.blitz).toBeDefined(); + expect(data.blitz).toBeInstanceOf(DuelsGamemode); expectTypeOf(data.blitz).toEqualTypeOf(); - expectTypeOf(data.blitz.title).toEqualTypeOf(); - expect(data.blitz.winStreak).toBeDefined(); - expect(data.blitz.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blitz.winStreak).toEqualTypeOf(); - expect(data.blitz.bestWinStreak).toBeDefined(); - expect(data.blitz.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blitz.bestWinStreak).toEqualTypeOf(); - expect(data.blitz.kills).toBeDefined(); - expect(data.blitz.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blitz.kills).toEqualTypeOf(); - expect(data.blitz.deaths).toBeDefined(); - expect(data.blitz.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blitz.deaths).toEqualTypeOf(); - expect(data.blitz.KDR).toBeDefined(); - expect(data.blitz.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blitz.KDR).toEqualTypeOf(); - expect(data.blitz.wins).toBeDefined(); - expect(data.blitz.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blitz.wins).toEqualTypeOf(); - expect(data.blitz.losses).toBeDefined(); - expect(data.blitz.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blitz.losses).toEqualTypeOf(); - expect(data.blitz.WLR).toBeDefined(); - expect(data.blitz.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blitz.WLR).toEqualTypeOf(); - expect(data.blitz.playedGames).toBeDefined(); - expect(data.blitz.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blitz.playedGames).toEqualTypeOf(); - expect(data.blitz.swings).toBeDefined(); - expect(data.blitz.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blitz.swings).toEqualTypeOf(); - expect(data.blitz.hits).toBeDefined(); - expect(data.blitz.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blitz.hits).toEqualTypeOf(); - expect(data.blitz.meleeAccuracy).toBeDefined(); - expect(data.blitz.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blitz.meleeAccuracy).toEqualTypeOf(); - expect(data.blitz.bowShots).toBeDefined(); - expect(data.blitz.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blitz.bowShots).toEqualTypeOf(); - expect(data.blitz.bowHits).toBeDefined(); - expect(data.blitz.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blitz.bowHits).toEqualTypeOf(); - expect(data.blitz.bowAccuracy).toBeDefined(); - expect(data.blitz.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blitz.bowAccuracy).toEqualTypeOf(); - expect(data.blitz.blocksPlaced).toBeDefined(); - expect(data.blitz.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blitz.blocksPlaced).toEqualTypeOf(); - expect(data.blitz.healthRegenerated).toBeDefined(); - expect(data.blitz.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blitz.healthRegenerated).toEqualTypeOf(); - expect(data.blitz.goldenApplesEaten).toBeDefined(); - expect(data.blitz.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blitz.goldenApplesEaten).toEqualTypeOf(); expect(data.op).toBeDefined(); + expect(data.op).toBeInstanceOf(DuelsOP); expectTypeOf(data.op).toEqualTypeOf(); - expect(data.op.title).toBeDefined(); - expectTypeOf(data.op.title).toEqualTypeOf(); - expect(data.op.winStreak).toBeDefined(); - expect(data.op.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.winStreak).toEqualTypeOf(); - expect(data.op.bestWinStreak).toBeDefined(); - expect(data.op.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.bestWinStreak).toEqualTypeOf(); - expect(data.op.solo).toBeDefined(); - expectTypeOf(data.op.solo).toEqualTypeOf(); - expect(data.op.solo.title).toBeDefined(); - expectTypeOf(data.op.solo.title).toEqualTypeOf(); - expect(data.op.solo.winStreak).toBeDefined(); - expect(data.op.solo.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.solo.winStreak).toEqualTypeOf(); - expect(data.op.solo.bestWinStreak).toBeDefined(); - expect(data.op.solo.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.solo.bestWinStreak).toEqualTypeOf(); - expect(data.op.solo.kills).toBeDefined(); - expect(data.op.solo.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.solo.kills).toEqualTypeOf(); - expect(data.op.solo.deaths).toBeDefined(); - expect(data.op.solo.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.solo.deaths).toEqualTypeOf(); - expect(data.op.solo.KDR).toBeDefined(); - expect(data.op.solo.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.solo.KDR).toEqualTypeOf(); - expect(data.op.solo.wins).toBeDefined(); - expect(data.op.solo.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.solo.wins).toEqualTypeOf(); - expect(data.op.solo.losses).toBeDefined(); - expect(data.op.solo.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.solo.losses).toEqualTypeOf(); - expect(data.op.solo.WLR).toBeDefined(); - expect(data.op.solo.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.solo.WLR).toEqualTypeOf(); - expect(data.op.solo.playedGames).toBeDefined(); - expect(data.op.solo.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.solo.playedGames).toEqualTypeOf(); - expect(data.op.solo.swings).toBeDefined(); - expect(data.op.solo.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.solo.swings).toEqualTypeOf(); - expect(data.op.solo.hits).toBeDefined(); - expect(data.op.solo.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.solo.hits).toEqualTypeOf(); - expect(data.op.solo.meleeAccuracy).toBeDefined(); - expect(data.op.solo.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.solo.meleeAccuracy).toEqualTypeOf(); - expect(data.op.solo.bowShots).toBeDefined(); - expect(data.op.solo.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.solo.bowShots).toEqualTypeOf(); - expect(data.op.solo.bowHits).toBeDefined(); - expect(data.op.solo.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.solo.bowHits).toEqualTypeOf(); - expect(data.op.solo.bowAccuracy).toBeDefined(); - expect(data.op.solo.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.solo.bowAccuracy).toEqualTypeOf(); - expect(data.op.solo.blocksPlaced).toBeDefined(); - expect(data.op.solo.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.solo.blocksPlaced).toEqualTypeOf(); - expect(data.op.solo.healthRegenerated).toBeDefined(); - expect(data.op.solo.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.solo.healthRegenerated).toEqualTypeOf(); - expect(data.op.solo.goldenApplesEaten).toBeDefined(); - expect(data.op.solo.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.solo.goldenApplesEaten).toEqualTypeOf(); - expect(data.op.doubles).toBeDefined(); - expectTypeOf(data.op.doubles).toEqualTypeOf(); - expect(data.op.doubles.title).toBeDefined(); - expectTypeOf(data.op.doubles.title).toEqualTypeOf(); - expect(data.op.doubles.winStreak).toBeDefined(); - expect(data.op.doubles.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.doubles.winStreak).toEqualTypeOf(); - expect(data.op.doubles.bestWinStreak).toBeDefined(); - expect(data.op.doubles.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.doubles.bestWinStreak).toEqualTypeOf(); - expect(data.op.doubles.kills).toBeDefined(); - expect(data.op.doubles.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.doubles.kills).toEqualTypeOf(); - expect(data.op.doubles.deaths).toBeDefined(); - expect(data.op.doubles.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.doubles.deaths).toEqualTypeOf(); - expect(data.op.doubles.KDR).toBeDefined(); - expect(data.op.doubles.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.doubles.KDR).toEqualTypeOf(); - expect(data.op.doubles.wins).toBeDefined(); - expect(data.op.doubles.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.doubles.wins).toEqualTypeOf(); - expect(data.op.doubles.losses).toBeDefined(); - expect(data.op.doubles.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.doubles.losses).toEqualTypeOf(); - expect(data.op.doubles.WLR).toBeDefined(); - expect(data.op.doubles.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.doubles.WLR).toEqualTypeOf(); - expect(data.op.doubles.playedGames).toBeDefined(); - expect(data.op.doubles.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.doubles.playedGames).toEqualTypeOf(); - expect(data.op.doubles.swings).toBeDefined(); - expect(data.op.doubles.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.doubles.swings).toEqualTypeOf(); - expect(data.op.doubles.hits).toBeDefined(); - expect(data.op.doubles.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.doubles.hits).toEqualTypeOf(); - expect(data.op.doubles.meleeAccuracy).toBeDefined(); - expect(data.op.doubles.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.doubles.meleeAccuracy).toEqualTypeOf(); - expect(data.op.doubles.bowShots).toBeDefined(); - expect(data.op.doubles.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.doubles.bowShots).toEqualTypeOf(); - expect(data.op.doubles.bowHits).toBeDefined(); - expect(data.op.doubles.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.doubles.bowHits).toEqualTypeOf(); - expect(data.op.doubles.bowAccuracy).toBeDefined(); - expect(data.op.doubles.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.doubles.bowAccuracy).toEqualTypeOf(); - expect(data.op.doubles.blocksPlaced).toBeDefined(); - expect(data.op.doubles.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.doubles.blocksPlaced).toEqualTypeOf(); - expect(data.op.doubles.healthRegenerated).toBeDefined(); - expect(data.op.doubles.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.doubles.healthRegenerated).toEqualTypeOf(); - expect(data.op.doubles.goldenApplesEaten).toBeDefined(); - expect(data.op.doubles.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.doubles.goldenApplesEaten).toEqualTypeOf(); - expect(data.op.kills).toBeDefined(); - expect(data.op.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.kills).toEqualTypeOf(); - expect(data.op.deaths).toBeDefined(); - expect(data.op.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.deaths).toEqualTypeOf(); - expect(data.op.KDR).toBeDefined(); - expect(data.op.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.KDR).toEqualTypeOf(); - expect(data.op.wins).toBeDefined(); - expect(data.op.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.wins).toEqualTypeOf(); - expect(data.op.losses).toBeDefined(); - expect(data.op.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.losses).toEqualTypeOf(); - expect(data.op.WLR).toBeDefined(); - expect(data.op.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.WLR).toEqualTypeOf(); - expect(data.op.playedGames).toBeDefined(); - expect(data.op.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.playedGames).toEqualTypeOf(); - expect(data.op.swings).toBeDefined(); - expect(data.op.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.swings).toEqualTypeOf(); - expect(data.op.hits).toBeDefined(); - expect(data.op.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.hits).toEqualTypeOf(); - expect(data.op.meleeAccuracy).toBeDefined(); - expect(data.op.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.meleeAccuracy).toEqualTypeOf(); - expect(data.op.bowShots).toBeDefined(); - expect(data.op.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.bowShots).toEqualTypeOf(); - expect(data.op.bowHits).toBeDefined(); - expect(data.op.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.bowHits).toEqualTypeOf(); - expect(data.op.bowAccuracy).toBeDefined(); - expect(data.op.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.bowAccuracy).toEqualTypeOf(); - expect(data.op.blocksPlaced).toBeDefined(); - expect(data.op.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.blocksPlaced).toEqualTypeOf(); - expect(data.op.healthRegenerated).toBeDefined(); - expect(data.op.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.healthRegenerated).toEqualTypeOf(); - expect(data.op.goldenApplesEaten).toBeDefined(); - expect(data.op.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.op.goldenApplesEaten).toEqualTypeOf(); expect(data.classic).toBeDefined(); + expect(data.classic).toBeInstanceOf(DuelsGamemode); expectTypeOf(data.classic).toEqualTypeOf(); - expectTypeOf(data.classic.title).toEqualTypeOf(); - expect(data.classic.winStreak).toBeDefined(); - expect(data.classic.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.classic.winStreak).toEqualTypeOf(); - expect(data.classic.bestWinStreak).toBeDefined(); - expect(data.classic.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.classic.bestWinStreak).toEqualTypeOf(); - expect(data.classic.kills).toBeDefined(); - expect(data.classic.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.classic.kills).toEqualTypeOf(); - expect(data.classic.deaths).toBeDefined(); - expect(data.classic.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.classic.deaths).toEqualTypeOf(); - expect(data.classic.KDR).toBeDefined(); - expect(data.classic.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.classic.KDR).toEqualTypeOf(); - expect(data.classic.wins).toBeDefined(); - expect(data.classic.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.classic.wins).toEqualTypeOf(); - expect(data.classic.losses).toBeDefined(); - expect(data.classic.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.classic.losses).toEqualTypeOf(); - expect(data.classic.WLR).toBeDefined(); - expect(data.classic.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.classic.WLR).toEqualTypeOf(); - expect(data.classic.playedGames).toBeDefined(); - expect(data.classic.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.classic.playedGames).toEqualTypeOf(); - expect(data.classic.swings).toBeDefined(); - expect(data.classic.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.classic.swings).toEqualTypeOf(); - expect(data.classic.hits).toBeDefined(); - expect(data.classic.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.classic.hits).toEqualTypeOf(); - expect(data.classic.meleeAccuracy).toBeDefined(); - expect(data.classic.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.classic.meleeAccuracy).toEqualTypeOf(); - expect(data.classic.bowShots).toBeDefined(); - expect(data.classic.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.classic.bowShots).toEqualTypeOf(); - expect(data.classic.bowHits).toBeDefined(); - expect(data.classic.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.classic.bowHits).toEqualTypeOf(); - expect(data.classic.bowAccuracy).toBeDefined(); - expect(data.classic.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.classic.bowAccuracy).toEqualTypeOf(); - expect(data.classic.blocksPlaced).toBeDefined(); - expect(data.classic.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.classic.blocksPlaced).toEqualTypeOf(); - expect(data.classic.healthRegenerated).toBeDefined(); - expect(data.classic.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.classic.healthRegenerated).toEqualTypeOf(); - expect(data.classic.goldenApplesEaten).toBeDefined(); - expect(data.classic.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.classic.goldenApplesEaten).toEqualTypeOf(); expect(data.bow).toBeDefined(); + expect(data.bow).toBeInstanceOf(DuelsGamemode); expectTypeOf(data.bow).toEqualTypeOf(); - expectTypeOf(data.bow.title).toEqualTypeOf(); - expect(data.bow.winStreak).toBeDefined(); - expect(data.bow.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bow.winStreak).toEqualTypeOf(); - expect(data.bow.bestWinStreak).toBeDefined(); - expect(data.bow.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bow.bestWinStreak).toEqualTypeOf(); - expect(data.bow.kills).toBeDefined(); - expect(data.bow.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bow.kills).toEqualTypeOf(); - expect(data.bow.deaths).toBeDefined(); - expect(data.bow.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bow.deaths).toEqualTypeOf(); - expect(data.bow.KDR).toBeDefined(); - expect(data.bow.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bow.KDR).toEqualTypeOf(); - expect(data.bow.wins).toBeDefined(); - expect(data.bow.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bow.wins).toEqualTypeOf(); - expect(data.bow.losses).toBeDefined(); - expect(data.bow.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bow.losses).toEqualTypeOf(); - expect(data.bow.WLR).toBeDefined(); - expect(data.bow.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bow.WLR).toEqualTypeOf(); - expect(data.bow.playedGames).toBeDefined(); - expect(data.bow.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bow.playedGames).toEqualTypeOf(); - expect(data.bow.swings).toBeDefined(); - expect(data.bow.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bow.swings).toEqualTypeOf(); - expect(data.bow.hits).toBeDefined(); - expect(data.bow.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bow.hits).toEqualTypeOf(); - expect(data.bow.meleeAccuracy).toBeDefined(); - expect(data.bow.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bow.meleeAccuracy).toEqualTypeOf(); - expect(data.bow.bowShots).toBeDefined(); - expect(data.bow.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bow.bowShots).toEqualTypeOf(); - expect(data.bow.bowHits).toBeDefined(); - expect(data.bow.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bow.bowHits).toEqualTypeOf(); - expect(data.bow.bowAccuracy).toBeDefined(); - expect(data.bow.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bow.bowAccuracy).toEqualTypeOf(); - expect(data.bow.blocksPlaced).toBeDefined(); - expect(data.bow.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bow.blocksPlaced).toEqualTypeOf(); - expect(data.bow.healthRegenerated).toBeDefined(); - expect(data.bow.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bow.healthRegenerated).toEqualTypeOf(); - expect(data.bow.goldenApplesEaten).toBeDefined(); - expect(data.bow.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bow.goldenApplesEaten).toEqualTypeOf(); expect(data.noDebuff).toBeDefined(); + expect(data.noDebuff).toBeInstanceOf(DuelsGamemode); expectTypeOf(data.noDebuff).toEqualTypeOf(); - expectTypeOf(data.noDebuff.title).toEqualTypeOf(); - expect(data.noDebuff.winStreak).toBeDefined(); - expect(data.noDebuff.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.noDebuff.winStreak).toEqualTypeOf(); - expect(data.noDebuff.bestWinStreak).toBeDefined(); - expect(data.noDebuff.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.noDebuff.bestWinStreak).toEqualTypeOf(); - expect(data.noDebuff.kills).toBeDefined(); - expect(data.noDebuff.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.noDebuff.kills).toEqualTypeOf(); - expect(data.noDebuff.deaths).toBeDefined(); - expect(data.noDebuff.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.noDebuff.deaths).toEqualTypeOf(); - expect(data.noDebuff.KDR).toBeDefined(); - expect(data.noDebuff.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.noDebuff.KDR).toEqualTypeOf(); - expect(data.noDebuff.wins).toBeDefined(); - expect(data.noDebuff.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.noDebuff.wins).toEqualTypeOf(); - expect(data.noDebuff.losses).toBeDefined(); - expect(data.noDebuff.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.noDebuff.losses).toEqualTypeOf(); - expect(data.noDebuff.WLR).toBeDefined(); - expect(data.noDebuff.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.noDebuff.WLR).toEqualTypeOf(); - expect(data.noDebuff.playedGames).toBeDefined(); - expect(data.noDebuff.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.noDebuff.playedGames).toEqualTypeOf(); - expect(data.noDebuff.swings).toBeDefined(); - expect(data.noDebuff.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.noDebuff.swings).toEqualTypeOf(); - expect(data.noDebuff.hits).toBeDefined(); - expect(data.noDebuff.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.noDebuff.hits).toEqualTypeOf(); - expect(data.noDebuff.meleeAccuracy).toBeDefined(); - expect(data.noDebuff.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.noDebuff.meleeAccuracy).toEqualTypeOf(); - expect(data.noDebuff.bowShots).toBeDefined(); - expect(data.noDebuff.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.noDebuff.bowShots).toEqualTypeOf(); - expect(data.noDebuff.bowHits).toBeDefined(); - expect(data.noDebuff.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.noDebuff.bowHits).toEqualTypeOf(); - expect(data.noDebuff.bowAccuracy).toBeDefined(); - expect(data.noDebuff.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.noDebuff.bowAccuracy).toEqualTypeOf(); - expect(data.noDebuff.blocksPlaced).toBeDefined(); - expect(data.noDebuff.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.noDebuff.blocksPlaced).toEqualTypeOf(); - expect(data.noDebuff.healthRegenerated).toBeDefined(); - expect(data.noDebuff.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.noDebuff.healthRegenerated).toEqualTypeOf(); - expect(data.noDebuff.goldenApplesEaten).toBeDefined(); - expect(data.noDebuff.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.noDebuff.goldenApplesEaten).toEqualTypeOf(); expect(data.combo).toBeDefined(); + expect(data.combo).toBeInstanceOf(DuelsGamemode); expectTypeOf(data.combo).toEqualTypeOf(); - expectTypeOf(data.combo.title).toEqualTypeOf(); - expect(data.combo.winStreak).toBeDefined(); - expect(data.combo.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.combo.winStreak).toEqualTypeOf(); - expect(data.combo.bestWinStreak).toBeDefined(); - expect(data.combo.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.combo.bestWinStreak).toEqualTypeOf(); - expect(data.combo.kills).toBeDefined(); - expect(data.combo.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.combo.kills).toEqualTypeOf(); - expect(data.combo.deaths).toBeDefined(); - expect(data.combo.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.combo.deaths).toEqualTypeOf(); - expect(data.combo.KDR).toBeDefined(); - expect(data.combo.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.combo.KDR).toEqualTypeOf(); - expect(data.combo.wins).toBeDefined(); - expect(data.combo.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.combo.wins).toEqualTypeOf(); - expect(data.combo.losses).toBeDefined(); - expect(data.combo.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.combo.losses).toEqualTypeOf(); - expect(data.combo.WLR).toBeDefined(); - expect(data.combo.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.combo.WLR).toEqualTypeOf(); - expect(data.combo.playedGames).toBeDefined(); - expect(data.combo.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.combo.playedGames).toEqualTypeOf(); - expect(data.combo.swings).toBeDefined(); - expect(data.combo.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.combo.swings).toEqualTypeOf(); - expect(data.combo.hits).toBeDefined(); - expect(data.combo.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.combo.hits).toEqualTypeOf(); - expect(data.combo.meleeAccuracy).toBeDefined(); - expect(data.combo.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.combo.meleeAccuracy).toEqualTypeOf(); - expect(data.combo.bowShots).toBeDefined(); - expect(data.combo.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.combo.bowShots).toEqualTypeOf(); - expect(data.combo.bowHits).toBeDefined(); - expect(data.combo.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.combo.bowHits).toEqualTypeOf(); - expect(data.combo.bowAccuracy).toBeDefined(); - expect(data.combo.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.combo.bowAccuracy).toEqualTypeOf(); - expect(data.combo.blocksPlaced).toBeDefined(); - expect(data.combo.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.combo.blocksPlaced).toEqualTypeOf(); - expect(data.combo.healthRegenerated).toBeDefined(); - expect(data.combo.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.combo.healthRegenerated).toEqualTypeOf(); - expect(data.combo.goldenApplesEaten).toBeDefined(); - expect(data.combo.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.combo.goldenApplesEaten).toEqualTypeOf(); expect(data.bowSpleef).toBeDefined(); + expect(data.bowSpleef).toBeInstanceOf(DuelsGamemode); expectTypeOf(data.bowSpleef).toEqualTypeOf(); - expectTypeOf(data.bowSpleef.title).toEqualTypeOf(); - expect(data.bowSpleef.winStreak).toBeDefined(); - expect(data.bowSpleef.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowSpleef.winStreak).toEqualTypeOf(); - expect(data.bowSpleef.bestWinStreak).toBeDefined(); - expect(data.bowSpleef.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowSpleef.bestWinStreak).toEqualTypeOf(); - expect(data.bowSpleef.kills).toBeDefined(); - expect(data.bowSpleef.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowSpleef.kills).toEqualTypeOf(); - expect(data.bowSpleef.deaths).toBeDefined(); - expect(data.bowSpleef.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowSpleef.deaths).toEqualTypeOf(); - expect(data.bowSpleef.KDR).toBeDefined(); - expect(data.bowSpleef.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowSpleef.KDR).toEqualTypeOf(); - expect(data.bowSpleef.wins).toBeDefined(); - expect(data.bowSpleef.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowSpleef.wins).toEqualTypeOf(); - expect(data.bowSpleef.losses).toBeDefined(); - expect(data.bowSpleef.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowSpleef.losses).toEqualTypeOf(); - expect(data.bowSpleef.WLR).toBeDefined(); - expect(data.bowSpleef.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowSpleef.WLR).toEqualTypeOf(); - expect(data.bowSpleef.playedGames).toBeDefined(); - expect(data.bowSpleef.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowSpleef.playedGames).toEqualTypeOf(); - expect(data.bowSpleef.swings).toBeDefined(); - expect(data.bowSpleef.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowSpleef.swings).toEqualTypeOf(); - expect(data.bowSpleef.hits).toBeDefined(); - expect(data.bowSpleef.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowSpleef.hits).toEqualTypeOf(); - expect(data.bowSpleef.meleeAccuracy).toBeDefined(); - expect(data.bowSpleef.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowSpleef.meleeAccuracy).toEqualTypeOf(); - expect(data.bowSpleef.bowShots).toBeDefined(); - expect(data.bowSpleef.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowSpleef.bowShots).toEqualTypeOf(); - expect(data.bowSpleef.bowHits).toBeDefined(); - expect(data.bowSpleef.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowSpleef.bowHits).toEqualTypeOf(); - expect(data.bowSpleef.bowAccuracy).toBeDefined(); - expect(data.bowSpleef.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowSpleef.bowAccuracy).toEqualTypeOf(); - expect(data.bowSpleef.blocksPlaced).toBeDefined(); - expect(data.bowSpleef.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowSpleef.blocksPlaced).toEqualTypeOf(); - expect(data.bowSpleef.healthRegenerated).toBeDefined(); - expect(data.bowSpleef.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowSpleef.healthRegenerated).toEqualTypeOf(); - expect(data.bowSpleef.goldenApplesEaten).toBeDefined(); - expect(data.bowSpleef.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowSpleef.goldenApplesEaten).toEqualTypeOf(); expect(data.sumo).toBeDefined(); + expect(data.sumo).toBeInstanceOf(DuelsGamemode); expectTypeOf(data.sumo).toEqualTypeOf(); - expectTypeOf(data.sumo.title).toEqualTypeOf(); - expect(data.sumo.winStreak).toBeDefined(); - expect(data.sumo.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.sumo.winStreak).toEqualTypeOf(); - expect(data.sumo.bestWinStreak).toBeDefined(); - expect(data.sumo.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.sumo.bestWinStreak).toEqualTypeOf(); - expect(data.sumo.kills).toBeDefined(); - expect(data.sumo.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.sumo.kills).toEqualTypeOf(); - expect(data.sumo.deaths).toBeDefined(); - expect(data.sumo.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.sumo.deaths).toEqualTypeOf(); - expect(data.sumo.KDR).toBeDefined(); - expect(data.sumo.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.sumo.KDR).toEqualTypeOf(); - expect(data.sumo.wins).toBeDefined(); - expect(data.sumo.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.sumo.wins).toEqualTypeOf(); - expect(data.sumo.losses).toBeDefined(); - expect(data.sumo.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.sumo.losses).toEqualTypeOf(); - expect(data.sumo.WLR).toBeDefined(); - expect(data.sumo.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.sumo.WLR).toEqualTypeOf(); - expect(data.sumo.playedGames).toBeDefined(); - expect(data.sumo.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.sumo.playedGames).toEqualTypeOf(); - expect(data.sumo.swings).toBeDefined(); - expect(data.sumo.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.sumo.swings).toEqualTypeOf(); - expect(data.sumo.hits).toBeDefined(); - expect(data.sumo.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.sumo.hits).toEqualTypeOf(); - expect(data.sumo.meleeAccuracy).toBeDefined(); - expect(data.sumo.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.sumo.meleeAccuracy).toEqualTypeOf(); - expect(data.sumo.bowShots).toBeDefined(); - expect(data.sumo.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.sumo.bowShots).toEqualTypeOf(); - expect(data.sumo.bowHits).toBeDefined(); - expect(data.sumo.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.sumo.bowHits).toEqualTypeOf(); - expect(data.sumo.bowAccuracy).toBeDefined(); - expect(data.sumo.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.sumo.bowAccuracy).toEqualTypeOf(); - expect(data.sumo.blocksPlaced).toBeDefined(); - expect(data.sumo.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.sumo.blocksPlaced).toEqualTypeOf(); - expect(data.sumo.healthRegenerated).toBeDefined(); - expect(data.sumo.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.sumo.healthRegenerated).toEqualTypeOf(); - expect(data.sumo.goldenApplesEaten).toBeDefined(); - expect(data.sumo.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.sumo.goldenApplesEaten).toEqualTypeOf(); expect(data.bridge).toBeDefined(); + expect(data.bridge).toBeInstanceOf(DuelsBridge); expectTypeOf(data.bridge).toEqualTypeOf(); - expect(data.bridge.title).toBeDefined(); - expectTypeOf(data.bridge.title).toEqualTypeOf(); - expect(data.bridge.winStreak).toBeDefined(); - expect(data.bridge.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.winStreak).toEqualTypeOf(); - expect(data.bridge.bestWinStreak).toBeDefined(); - expect(data.bridge.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.bestWinStreak).toEqualTypeOf(); - expect(data.bridge.solo).toBeDefined(); - expectTypeOf(data.bridge.solo).toEqualTypeOf(); - expect(data.bridge.solo.title).toBeDefined(); - expectTypeOf(data.bridge.solo.title).toEqualTypeOf(); - expect(data.bridge.solo.winStreak).toBeDefined(); - expect(data.bridge.solo.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.solo.winStreak).toEqualTypeOf(); - expect(data.bridge.solo.bestWinStreak).toBeDefined(); - expect(data.bridge.solo.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.solo.bestWinStreak).toEqualTypeOf(); - expect(data.bridge.solo.kills).toBeDefined(); - expect(data.bridge.solo.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.solo.kills).toEqualTypeOf(); - expect(data.bridge.solo.deaths).toBeDefined(); - expect(data.bridge.solo.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.solo.deaths).toEqualTypeOf(); - expect(data.bridge.solo.KDR).toBeDefined(); - expect(data.bridge.solo.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.solo.KDR).toEqualTypeOf(); - expect(data.bridge.solo.wins).toBeDefined(); - expect(data.bridge.solo.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.solo.wins).toEqualTypeOf(); - expect(data.bridge.solo.losses).toBeDefined(); - expect(data.bridge.solo.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.solo.losses).toEqualTypeOf(); - expect(data.bridge.solo.WLR).toBeDefined(); - expect(data.bridge.solo.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.solo.WLR).toEqualTypeOf(); - expect(data.bridge.solo.playedGames).toBeDefined(); - expect(data.bridge.solo.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.solo.playedGames).toEqualTypeOf(); - expect(data.bridge.solo.swings).toBeDefined(); - expect(data.bridge.solo.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.solo.swings).toEqualTypeOf(); - expect(data.bridge.solo.hits).toBeDefined(); - expect(data.bridge.solo.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.solo.hits).toEqualTypeOf(); - expect(data.bridge.solo.meleeAccuracy).toBeDefined(); - expect(data.bridge.solo.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.solo.meleeAccuracy).toEqualTypeOf(); - expect(data.bridge.solo.bowShots).toBeDefined(); - expect(data.bridge.solo.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.solo.bowShots).toEqualTypeOf(); - expect(data.bridge.solo.bowHits).toBeDefined(); - expect(data.bridge.solo.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.solo.bowHits).toEqualTypeOf(); - expect(data.bridge.solo.bowAccuracy).toBeDefined(); - expect(data.bridge.solo.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.solo.bowAccuracy).toEqualTypeOf(); - expect(data.bridge.solo.blocksPlaced).toBeDefined(); - expect(data.bridge.solo.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.solo.blocksPlaced).toEqualTypeOf(); - expect(data.bridge.solo.healthRegenerated).toBeDefined(); - expect(data.bridge.solo.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.solo.healthRegenerated).toEqualTypeOf(); - expect(data.bridge.solo.goldenApplesEaten).toBeDefined(); - expect(data.bridge.solo.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.solo.goldenApplesEaten).toEqualTypeOf(); - expect(data.bridge.doubles).toBeDefined(); - expectTypeOf(data.bridge.doubles).toEqualTypeOf(); - expect(data.bridge.doubles.title).toBeDefined(); - expectTypeOf(data.bridge.doubles.title).toEqualTypeOf(); - expect(data.bridge.doubles.winStreak).toBeDefined(); - expect(data.bridge.doubles.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.doubles.winStreak).toEqualTypeOf(); - expect(data.bridge.doubles.bestWinStreak).toBeDefined(); - expect(data.bridge.doubles.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.doubles.bestWinStreak).toEqualTypeOf(); - expect(data.bridge.doubles.kills).toBeDefined(); - expect(data.bridge.doubles.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.doubles.kills).toEqualTypeOf(); - expect(data.bridge.doubles.deaths).toBeDefined(); - expect(data.bridge.doubles.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.doubles.deaths).toEqualTypeOf(); - expect(data.bridge.doubles.KDR).toBeDefined(); - expect(data.bridge.doubles.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.doubles.KDR).toEqualTypeOf(); - expect(data.bridge.doubles.wins).toBeDefined(); - expect(data.bridge.doubles.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.doubles.wins).toEqualTypeOf(); - expect(data.bridge.doubles.losses).toBeDefined(); - expect(data.bridge.doubles.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.doubles.losses).toEqualTypeOf(); - expect(data.bridge.doubles.WLR).toBeDefined(); - expect(data.bridge.doubles.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.doubles.WLR).toEqualTypeOf(); - expect(data.bridge.doubles.playedGames).toBeDefined(); - expect(data.bridge.doubles.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.doubles.playedGames).toEqualTypeOf(); - expect(data.bridge.doubles.swings).toBeDefined(); - expect(data.bridge.doubles.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.doubles.swings).toEqualTypeOf(); - expect(data.bridge.doubles.hits).toBeDefined(); - expect(data.bridge.doubles.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.doubles.hits).toEqualTypeOf(); - expect(data.bridge.doubles.meleeAccuracy).toBeDefined(); - expect(data.bridge.doubles.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.doubles.meleeAccuracy).toEqualTypeOf(); - expect(data.bridge.doubles.bowShots).toBeDefined(); - expect(data.bridge.doubles.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.doubles.bowShots).toEqualTypeOf(); - expect(data.bridge.doubles.bowHits).toBeDefined(); - expect(data.bridge.doubles.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.doubles.bowHits).toEqualTypeOf(); - expect(data.bridge.doubles.bowAccuracy).toBeDefined(); - expect(data.bridge.doubles.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.doubles.bowAccuracy).toEqualTypeOf(); - expect(data.bridge.doubles.blocksPlaced).toBeDefined(); - expect(data.bridge.doubles.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.doubles.blocksPlaced).toEqualTypeOf(); - expect(data.bridge.doubles.healthRegenerated).toBeDefined(); - expect(data.bridge.doubles.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.doubles.healthRegenerated).toEqualTypeOf(); - expect(data.bridge.doubles.goldenApplesEaten).toBeDefined(); - expect(data.bridge.doubles.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.doubles.goldenApplesEaten).toEqualTypeOf(); - expect(data.bridge.threes).toBeDefined(); - expectTypeOf(data.bridge.threes).toEqualTypeOf(); - expect(data.bridge.threes.title).toBeDefined(); - expectTypeOf(data.bridge.threes.title).toEqualTypeOf(); - expect(data.bridge.threes.winStreak).toBeDefined(); - expect(data.bridge.threes.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.threes.winStreak).toEqualTypeOf(); - expect(data.bridge.threes.bestWinStreak).toBeDefined(); - expect(data.bridge.threes.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.threes.bestWinStreak).toEqualTypeOf(); - expect(data.bridge.threes.kills).toBeDefined(); - expect(data.bridge.threes.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.threes.kills).toEqualTypeOf(); - expect(data.bridge.threes.deaths).toBeDefined(); - expect(data.bridge.threes.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.threes.deaths).toEqualTypeOf(); - expect(data.bridge.threes.KDR).toBeDefined(); - expect(data.bridge.threes.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.threes.KDR).toEqualTypeOf(); - expect(data.bridge.threes.wins).toBeDefined(); - expect(data.bridge.threes.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.threes.wins).toEqualTypeOf(); - expect(data.bridge.threes.losses).toBeDefined(); - expect(data.bridge.threes.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.threes.losses).toEqualTypeOf(); - expect(data.bridge.threes.WLR).toBeDefined(); - expect(data.bridge.threes.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.threes.WLR).toEqualTypeOf(); - expect(data.bridge.threes.playedGames).toBeDefined(); - expect(data.bridge.threes.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.threes.playedGames).toEqualTypeOf(); - expect(data.bridge.threes.swings).toBeDefined(); - expect(data.bridge.threes.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.threes.swings).toEqualTypeOf(); - expect(data.bridge.threes.hits).toBeDefined(); - expect(data.bridge.threes.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.threes.hits).toEqualTypeOf(); - expect(data.bridge.threes.meleeAccuracy).toBeDefined(); - expect(data.bridge.threes.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.threes.meleeAccuracy).toEqualTypeOf(); - expect(data.bridge.threes.bowShots).toBeDefined(); - expect(data.bridge.threes.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.threes.bowShots).toEqualTypeOf(); - expect(data.bridge.threes.bowHits).toBeDefined(); - expect(data.bridge.threes.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.threes.bowHits).toEqualTypeOf(); - expect(data.bridge.threes.bowAccuracy).toBeDefined(); - expect(data.bridge.threes.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.threes.bowAccuracy).toEqualTypeOf(); - expect(data.bridge.threes.blocksPlaced).toBeDefined(); - expect(data.bridge.threes.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.threes.blocksPlaced).toEqualTypeOf(); - expect(data.bridge.threes.healthRegenerated).toBeDefined(); - expect(data.bridge.threes.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.threes.healthRegenerated).toEqualTypeOf(); - expect(data.bridge.threes.goldenApplesEaten).toBeDefined(); - expect(data.bridge.threes.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.threes.goldenApplesEaten).toEqualTypeOf(); - expect(data.bridge.fours).toBeDefined(); - expectTypeOf(data.bridge.fours).toEqualTypeOf(); - expect(data.bridge.fours.title).toBeDefined(); - expectTypeOf(data.bridge.fours.title).toEqualTypeOf(); - expect(data.bridge.fours.winStreak).toBeDefined(); - expect(data.bridge.fours.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.fours.winStreak).toEqualTypeOf(); - expect(data.bridge.fours.bestWinStreak).toBeDefined(); - expect(data.bridge.fours.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.fours.bestWinStreak).toEqualTypeOf(); - expect(data.bridge.fours.kills).toBeDefined(); - expect(data.bridge.fours.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.fours.kills).toEqualTypeOf(); - expect(data.bridge.fours.deaths).toBeDefined(); - expect(data.bridge.fours.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.fours.deaths).toEqualTypeOf(); - expect(data.bridge.fours.KDR).toBeDefined(); - expect(data.bridge.fours.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.fours.KDR).toEqualTypeOf(); - expect(data.bridge.fours.wins).toBeDefined(); - expect(data.bridge.fours.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.fours.wins).toEqualTypeOf(); - expect(data.bridge.fours.losses).toBeDefined(); - expect(data.bridge.fours.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.fours.losses).toEqualTypeOf(); - expect(data.bridge.fours.WLR).toBeDefined(); - expect(data.bridge.fours.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.fours.WLR).toEqualTypeOf(); - expect(data.bridge.fours.playedGames).toBeDefined(); - expect(data.bridge.fours.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.fours.playedGames).toEqualTypeOf(); - expect(data.bridge.fours.swings).toBeDefined(); - expect(data.bridge.fours.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.fours.swings).toEqualTypeOf(); - expect(data.bridge.fours.hits).toBeDefined(); - expect(data.bridge.fours.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.fours.hits).toEqualTypeOf(); - expect(data.bridge.fours.meleeAccuracy).toBeDefined(); - expect(data.bridge.fours.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.fours.meleeAccuracy).toEqualTypeOf(); - expect(data.bridge.fours.bowShots).toBeDefined(); - expect(data.bridge.fours.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.fours.bowShots).toEqualTypeOf(); - expect(data.bridge.fours.bowHits).toBeDefined(); - expect(data.bridge.fours.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.fours.bowHits).toEqualTypeOf(); - expect(data.bridge.fours.bowAccuracy).toBeDefined(); - expect(data.bridge.fours.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.fours.bowAccuracy).toEqualTypeOf(); - expect(data.bridge.fours.blocksPlaced).toBeDefined(); - expect(data.bridge.fours.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.fours.blocksPlaced).toEqualTypeOf(); - expect(data.bridge.fours.healthRegenerated).toBeDefined(); - expect(data.bridge.fours.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.fours.healthRegenerated).toEqualTypeOf(); - expect(data.bridge.fours.goldenApplesEaten).toBeDefined(); - expect(data.bridge.fours.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.fours.goldenApplesEaten).toEqualTypeOf(); - expect(data.bridge['2v2v2v2']).toBeDefined(); - expectTypeOf(data.bridge['2v2v2v2']).toEqualTypeOf(); - expect(data.bridge['2v2v2v2'].title).toBeDefined(); - expectTypeOf(data.bridge['2v2v2v2'].title).toEqualTypeOf(); - expect(data.bridge['2v2v2v2'].winStreak).toBeDefined(); - expect(data.bridge['2v2v2v2'].winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['2v2v2v2'].winStreak).toEqualTypeOf(); - expect(data.bridge['2v2v2v2'].bestWinStreak).toBeDefined(); - expect(data.bridge['2v2v2v2'].bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['2v2v2v2'].bestWinStreak).toEqualTypeOf(); - expect(data.bridge['2v2v2v2'].kills).toBeDefined(); - expect(data.bridge['2v2v2v2'].kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['2v2v2v2'].kills).toEqualTypeOf(); - expect(data.bridge['2v2v2v2'].deaths).toBeDefined(); - expect(data.bridge['2v2v2v2'].deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['2v2v2v2'].deaths).toEqualTypeOf(); - expect(data.bridge['2v2v2v2'].KDR).toBeDefined(); - expect(data.bridge['2v2v2v2'].KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['2v2v2v2'].KDR).toEqualTypeOf(); - expect(data.bridge['2v2v2v2'].wins).toBeDefined(); - expect(data.bridge['2v2v2v2'].wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['2v2v2v2'].wins).toEqualTypeOf(); - expect(data.bridge['2v2v2v2'].losses).toBeDefined(); - expect(data.bridge['2v2v2v2'].losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['2v2v2v2'].losses).toEqualTypeOf(); - expect(data.bridge['2v2v2v2'].WLR).toBeDefined(); - expect(data.bridge['2v2v2v2'].WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['2v2v2v2'].WLR).toEqualTypeOf(); - expect(data.bridge['2v2v2v2'].playedGames).toBeDefined(); - expect(data.bridge['2v2v2v2'].playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['2v2v2v2'].playedGames).toEqualTypeOf(); - expect(data.bridge['2v2v2v2'].swings).toBeDefined(); - expect(data.bridge['2v2v2v2'].swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['2v2v2v2'].swings).toEqualTypeOf(); - expect(data.bridge['2v2v2v2'].hits).toBeDefined(); - expect(data.bridge['2v2v2v2'].hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['2v2v2v2'].hits).toEqualTypeOf(); - expect(data.bridge['2v2v2v2'].meleeAccuracy).toBeDefined(); - expect(data.bridge['2v2v2v2'].meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['2v2v2v2'].meleeAccuracy).toEqualTypeOf(); - expect(data.bridge['2v2v2v2'].bowShots).toBeDefined(); - expect(data.bridge['2v2v2v2'].bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['2v2v2v2'].bowShots).toEqualTypeOf(); - expect(data.bridge['2v2v2v2'].bowHits).toBeDefined(); - expect(data.bridge['2v2v2v2'].bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['2v2v2v2'].bowHits).toEqualTypeOf(); - expect(data.bridge['2v2v2v2'].bowAccuracy).toBeDefined(); - expect(data.bridge['2v2v2v2'].bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['2v2v2v2'].bowAccuracy).toEqualTypeOf(); - expect(data.bridge['2v2v2v2'].blocksPlaced).toBeDefined(); - expect(data.bridge['2v2v2v2'].blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['2v2v2v2'].blocksPlaced).toEqualTypeOf(); - expect(data.bridge['2v2v2v2'].healthRegenerated).toBeDefined(); - expect(data.bridge['2v2v2v2'].healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['2v2v2v2'].healthRegenerated).toEqualTypeOf(); - expect(data.bridge['2v2v2v2'].goldenApplesEaten).toBeDefined(); - expect(data.bridge['2v2v2v2'].goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['2v2v2v2'].goldenApplesEaten).toEqualTypeOf(); - expect(data.bridge['3v3v3v3']).toBeDefined(); - expectTypeOf(data.bridge['3v3v3v3']).toEqualTypeOf(); - expect(data.bridge['3v3v3v3'].title).toBeDefined(); - expectTypeOf(data.bridge['3v3v3v3'].title).toEqualTypeOf(); - expect(data.bridge['3v3v3v3'].winStreak).toBeDefined(); - expect(data.bridge['3v3v3v3'].winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['3v3v3v3'].winStreak).toEqualTypeOf(); - expect(data.bridge['3v3v3v3'].bestWinStreak).toBeDefined(); - expect(data.bridge['3v3v3v3'].bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['3v3v3v3'].bestWinStreak).toEqualTypeOf(); - expect(data.bridge['3v3v3v3'].kills).toBeDefined(); - expect(data.bridge['3v3v3v3'].kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['3v3v3v3'].kills).toEqualTypeOf(); - expect(data.bridge['3v3v3v3'].deaths).toBeDefined(); - expect(data.bridge['3v3v3v3'].deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['3v3v3v3'].deaths).toEqualTypeOf(); - expect(data.bridge['3v3v3v3'].KDR).toBeDefined(); - expect(data.bridge['3v3v3v3'].KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['3v3v3v3'].KDR).toEqualTypeOf(); - expect(data.bridge['3v3v3v3'].wins).toBeDefined(); - expect(data.bridge['3v3v3v3'].wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['3v3v3v3'].wins).toEqualTypeOf(); - expect(data.bridge['3v3v3v3'].losses).toBeDefined(); - expect(data.bridge['3v3v3v3'].losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['3v3v3v3'].losses).toEqualTypeOf(); - expect(data.bridge['3v3v3v3'].WLR).toBeDefined(); - expect(data.bridge['3v3v3v3'].WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['3v3v3v3'].WLR).toEqualTypeOf(); - expect(data.bridge['3v3v3v3'].playedGames).toBeDefined(); - expect(data.bridge['3v3v3v3'].playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['3v3v3v3'].playedGames).toEqualTypeOf(); - expect(data.bridge['3v3v3v3'].swings).toBeDefined(); - expect(data.bridge['3v3v3v3'].swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['3v3v3v3'].swings).toEqualTypeOf(); - expect(data.bridge['3v3v3v3'].hits).toBeDefined(); - expect(data.bridge['3v3v3v3'].hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['3v3v3v3'].hits).toEqualTypeOf(); - expect(data.bridge['3v3v3v3'].meleeAccuracy).toBeDefined(); - expect(data.bridge['3v3v3v3'].meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['3v3v3v3'].meleeAccuracy).toEqualTypeOf(); - expect(data.bridge['3v3v3v3'].bowShots).toBeDefined(); - expect(data.bridge['3v3v3v3'].bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['3v3v3v3'].bowShots).toEqualTypeOf(); - expect(data.bridge['3v3v3v3'].bowHits).toBeDefined(); - expect(data.bridge['3v3v3v3'].bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['3v3v3v3'].bowHits).toEqualTypeOf(); - expect(data.bridge['3v3v3v3'].bowAccuracy).toBeDefined(); - expect(data.bridge['3v3v3v3'].bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['3v3v3v3'].bowAccuracy).toEqualTypeOf(); - expect(data.bridge['3v3v3v3'].blocksPlaced).toBeDefined(); - expect(data.bridge['3v3v3v3'].blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['3v3v3v3'].blocksPlaced).toEqualTypeOf(); - expect(data.bridge['3v3v3v3'].healthRegenerated).toBeDefined(); - expect(data.bridge['3v3v3v3'].healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['3v3v3v3'].healthRegenerated).toEqualTypeOf(); - expect(data.bridge['3v3v3v3'].goldenApplesEaten).toBeDefined(); - expect(data.bridge['3v3v3v3'].goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge['3v3v3v3'].goldenApplesEaten).toEqualTypeOf(); - expect(data.bridge.ctf).toBeDefined(); - expectTypeOf(data.bridge.ctf).toEqualTypeOf(); - expect(data.bridge.ctf.title).toBeDefined(); - expectTypeOf(data.bridge.ctf.title).toEqualTypeOf(); - expect(data.bridge.ctf.winStreak).toBeDefined(); - expect(data.bridge.ctf.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.ctf.winStreak).toEqualTypeOf(); - expect(data.bridge.ctf.bestWinStreak).toBeDefined(); - expect(data.bridge.ctf.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.ctf.bestWinStreak).toEqualTypeOf(); - expect(data.bridge.ctf.kills).toBeDefined(); - expect(data.bridge.ctf.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.ctf.kills).toEqualTypeOf(); - expect(data.bridge.ctf.deaths).toBeDefined(); - expect(data.bridge.ctf.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.ctf.deaths).toEqualTypeOf(); - expect(data.bridge.ctf.KDR).toBeDefined(); - expect(data.bridge.ctf.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.ctf.KDR).toEqualTypeOf(); - expect(data.bridge.ctf.wins).toBeDefined(); - expect(data.bridge.ctf.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.ctf.wins).toEqualTypeOf(); - expect(data.bridge.ctf.losses).toBeDefined(); - expect(data.bridge.ctf.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.ctf.losses).toEqualTypeOf(); - expect(data.bridge.ctf.WLR).toBeDefined(); - expect(data.bridge.ctf.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.ctf.WLR).toEqualTypeOf(); - expect(data.bridge.ctf.playedGames).toBeDefined(); - expect(data.bridge.ctf.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.ctf.playedGames).toEqualTypeOf(); - expect(data.bridge.ctf.swings).toBeDefined(); - expect(data.bridge.ctf.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.ctf.swings).toEqualTypeOf(); - expect(data.bridge.ctf.hits).toBeDefined(); - expect(data.bridge.ctf.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.ctf.hits).toEqualTypeOf(); - expect(data.bridge.ctf.meleeAccuracy).toBeDefined(); - expect(data.bridge.ctf.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.ctf.meleeAccuracy).toEqualTypeOf(); - expect(data.bridge.ctf.bowShots).toBeDefined(); - expect(data.bridge.ctf.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.ctf.bowShots).toEqualTypeOf(); - expect(data.bridge.ctf.bowHits).toBeDefined(); - expect(data.bridge.ctf.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.ctf.bowHits).toEqualTypeOf(); - expect(data.bridge.ctf.bowAccuracy).toBeDefined(); - expect(data.bridge.ctf.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.ctf.bowAccuracy).toEqualTypeOf(); - expect(data.bridge.ctf.blocksPlaced).toBeDefined(); - expect(data.bridge.ctf.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.ctf.blocksPlaced).toEqualTypeOf(); - expect(data.bridge.ctf.healthRegenerated).toBeDefined(); - expect(data.bridge.ctf.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.ctf.healthRegenerated).toEqualTypeOf(); - expect(data.bridge.ctf.goldenApplesEaten).toBeDefined(); - expect(data.bridge.ctf.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.ctf.goldenApplesEaten).toEqualTypeOf(); - expect(data.bridge.kills).toBeDefined(); - expect(data.bridge.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.kills).toEqualTypeOf(); - expect(data.bridge.deaths).toBeDefined(); - expect(data.bridge.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.deaths).toEqualTypeOf(); - expect(data.bridge.KDR).toBeDefined(); - expect(data.bridge.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.KDR).toEqualTypeOf(); - expect(data.bridge.wins).toBeDefined(); - expect(data.bridge.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.wins).toEqualTypeOf(); - expect(data.bridge.losses).toBeDefined(); - expect(data.bridge.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.losses).toEqualTypeOf(); - expect(data.bridge.WLR).toBeDefined(); - expect(data.bridge.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.WLR).toEqualTypeOf(); - expect(data.bridge.playedGames).toBeDefined(); - expect(data.bridge.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.playedGames).toEqualTypeOf(); - expect(data.bridge.swings).toBeDefined(); - expect(data.bridge.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.swings).toEqualTypeOf(); - expect(data.bridge.hits).toBeDefined(); - expect(data.bridge.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.hits).toEqualTypeOf(); - expect(data.bridge.meleeAccuracy).toBeDefined(); - expect(data.bridge.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.meleeAccuracy).toEqualTypeOf(); - expect(data.bridge.bowShots).toBeDefined(); - expect(data.bridge.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.bowShots).toEqualTypeOf(); - expect(data.bridge.bowHits).toBeDefined(); - expect(data.bridge.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.bowHits).toEqualTypeOf(); - expect(data.bridge.bowAccuracy).toBeDefined(); - expect(data.bridge.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.bowAccuracy).toEqualTypeOf(); - expect(data.bridge.blocksPlaced).toBeDefined(); - expect(data.bridge.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.blocksPlaced).toEqualTypeOf(); - expect(data.bridge.healthRegenerated).toBeDefined(); - expect(data.bridge.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.healthRegenerated).toEqualTypeOf(); - expect(data.bridge.goldenApplesEaten).toBeDefined(); - expect(data.bridge.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bridge.goldenApplesEaten).toEqualTypeOf(); expect(data.parkour).toBeDefined(); + expect(data.parkour).toBeInstanceOf(DuelsGamemode); expectTypeOf(data.parkour).toEqualTypeOf(); - expectTypeOf(data.parkour.title).toEqualTypeOf(); - expect(data.parkour.winStreak).toBeDefined(); - expect(data.parkour.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.parkour.winStreak).toEqualTypeOf(); - expect(data.parkour.bestWinStreak).toBeDefined(); - expect(data.parkour.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.parkour.bestWinStreak).toEqualTypeOf(); - expect(data.parkour.kills).toBeDefined(); - expect(data.parkour.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.parkour.kills).toEqualTypeOf(); - expect(data.parkour.deaths).toBeDefined(); - expect(data.parkour.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.parkour.deaths).toEqualTypeOf(); - expect(data.parkour.KDR).toBeDefined(); - expect(data.parkour.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.parkour.KDR).toEqualTypeOf(); - expect(data.parkour.wins).toBeDefined(); - expect(data.parkour.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.parkour.wins).toEqualTypeOf(); - expect(data.parkour.losses).toBeDefined(); - expect(data.parkour.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.parkour.losses).toEqualTypeOf(); - expect(data.parkour.WLR).toBeDefined(); - expect(data.parkour.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.parkour.WLR).toEqualTypeOf(); - expect(data.parkour.playedGames).toBeDefined(); - expect(data.parkour.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.parkour.playedGames).toEqualTypeOf(); - expect(data.parkour.swings).toBeDefined(); - expect(data.parkour.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.parkour.swings).toEqualTypeOf(); - expect(data.parkour.hits).toBeDefined(); - expect(data.parkour.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.parkour.hits).toEqualTypeOf(); - expect(data.parkour.meleeAccuracy).toBeDefined(); - expect(data.parkour.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.parkour.meleeAccuracy).toEqualTypeOf(); - expect(data.parkour.bowShots).toBeDefined(); - expect(data.parkour.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.parkour.bowShots).toEqualTypeOf(); - expect(data.parkour.bowHits).toBeDefined(); - expect(data.parkour.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.parkour.bowHits).toEqualTypeOf(); - expect(data.parkour.bowAccuracy).toBeDefined(); - expect(data.parkour.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.parkour.bowAccuracy).toEqualTypeOf(); - expect(data.parkour.blocksPlaced).toBeDefined(); - expect(data.parkour.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.parkour.blocksPlaced).toEqualTypeOf(); - expect(data.parkour.healthRegenerated).toBeDefined(); - expect(data.parkour.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.parkour.healthRegenerated).toEqualTypeOf(); - expect(data.parkour.goldenApplesEaten).toBeDefined(); - expect(data.parkour.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.parkour.goldenApplesEaten).toEqualTypeOf(); expect(data.arena).toBeDefined(); + expect(data.arena).toBeInstanceOf(DuelsGamemode); expectTypeOf(data.arena).toEqualTypeOf(); - expectTypeOf(data.arena.title).toEqualTypeOf(); - expect(data.arena.winStreak).toBeDefined(); - expect(data.arena.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arena.winStreak).toEqualTypeOf(); - expect(data.arena.bestWinStreak).toBeDefined(); - expect(data.arena.bestWinStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arena.bestWinStreak).toEqualTypeOf(); - expect(data.arena.kills).toBeDefined(); - expect(data.arena.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arena.kills).toEqualTypeOf(); - expect(data.arena.deaths).toBeDefined(); - expect(data.arena.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arena.deaths).toEqualTypeOf(); - expect(data.arena.KDR).toBeDefined(); - expect(data.arena.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arena.KDR).toEqualTypeOf(); - expect(data.arena.wins).toBeDefined(); - expect(data.arena.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arena.wins).toEqualTypeOf(); - expect(data.arena.losses).toBeDefined(); - expect(data.arena.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arena.losses).toEqualTypeOf(); - expect(data.arena.WLR).toBeDefined(); - expect(data.arena.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arena.WLR).toEqualTypeOf(); - expect(data.arena.playedGames).toBeDefined(); - expect(data.arena.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arena.playedGames).toEqualTypeOf(); - expect(data.arena.swings).toBeDefined(); - expect(data.arena.swings).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arena.swings).toEqualTypeOf(); - expect(data.arena.hits).toBeDefined(); - expect(data.arena.hits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arena.hits).toEqualTypeOf(); - expect(data.arena.meleeAccuracy).toBeDefined(); - expect(data.arena.meleeAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arena.meleeAccuracy).toEqualTypeOf(); - expect(data.arena.bowShots).toBeDefined(); - expect(data.arena.bowShots).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arena.bowShots).toEqualTypeOf(); - expect(data.arena.bowHits).toBeDefined(); - expect(data.arena.bowHits).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arena.bowHits).toEqualTypeOf(); - expect(data.arena.bowAccuracy).toBeDefined(); - expect(data.arena.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arena.bowAccuracy).toEqualTypeOf(); - expect(data.arena.blocksPlaced).toBeDefined(); - expect(data.arena.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arena.blocksPlaced).toEqualTypeOf(); - expect(data.arena.healthRegenerated).toBeDefined(); - expect(data.arena.healthRegenerated).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arena.healthRegenerated).toEqualTypeOf(); - expect(data.arena.goldenApplesEaten).toBeDefined(); - expect(data.arena.goldenApplesEaten).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arena.goldenApplesEaten).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/Duels/DuelsBridge.test.ts b/src/Structures/MiniGames/Duels/DuelsBridge.test.ts new file mode 100644 index 000000000..a005ba221 --- /dev/null +++ b/src/Structures/MiniGames/Duels/DuelsBridge.test.ts @@ -0,0 +1,87 @@ +import DuelsBridge from './DuelsBridge.js'; +import DuelsGamemode from './DuelsGamemode.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('DuelsBridge', () => { + const data = new DuelsBridge({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(DuelsBridge); + expectTypeOf(data).toEqualTypeOf(); + expect(data.title).toBeDefined(); + expectTypeOf(data.title).toEqualTypeOf(); + expect(data.winStreak).toBeDefined(); + expect(data.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winStreak).toEqualTypeOf(); + expect(data.bestWinStreak).toBeDefined(); + expect(data.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bestWinStreak).toEqualTypeOf(); + expect(data.solo).toBeDefined(); + expect(data.solo).toBeInstanceOf(DuelsGamemode); + expectTypeOf(data.solo).toEqualTypeOf(); + expect(data.doubles).toBeDefined(); + expect(data.doubles).toBeInstanceOf(DuelsGamemode); + expectTypeOf(data.doubles).toEqualTypeOf(); + expect(data.threes).toBeDefined(); + expect(data.threes).toBeInstanceOf(DuelsGamemode); + expectTypeOf(data.threes).toEqualTypeOf(); + expect(data.fours).toBeDefined(); + expect(data.fours).toBeInstanceOf(DuelsGamemode); + expectTypeOf(data.fours).toEqualTypeOf(); + expect(data['2v2v2v2']).toBeDefined(); + expect(data['2v2v2v2']).toBeInstanceOf(DuelsGamemode); + expectTypeOf(data['2v2v2v2']).toEqualTypeOf(); + expect(data['3v3v3v3']).toBeDefined(); + expect(data['3v3v3v3']).toBeInstanceOf(DuelsGamemode); + expectTypeOf(data['3v3v3v3']).toEqualTypeOf(); + expect(data.ctf).toBeDefined(); + expect(data.ctf).toBeInstanceOf(DuelsGamemode); + expectTypeOf(data.ctf).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.playedGames).toBeDefined(); + expect(data.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playedGames).toEqualTypeOf(); + expect(data.swings).toBeDefined(); + expect(data.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.swings).toEqualTypeOf(); + expect(data.hits).toBeDefined(); + expect(data.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hits).toEqualTypeOf(); + expect(data.meleeAccuracy).toBeDefined(); + expect(data.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meleeAccuracy).toEqualTypeOf(); + expect(data.bowShots).toBeDefined(); + expect(data.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowShots).toEqualTypeOf(); + expect(data.bowHits).toBeDefined(); + expect(data.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowHits).toEqualTypeOf(); + expect(data.bowAccuracy).toBeDefined(); + expect(data.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowAccuracy).toEqualTypeOf(); + expect(data.blocksPlaced).toBeDefined(); + expect(data.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksPlaced).toEqualTypeOf(); + expect(data.healthRegenerated).toBeDefined(); + expect(data.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.healthRegenerated).toEqualTypeOf(); + expect(data.goldenApplesEaten).toBeDefined(); + expect(data.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goldenApplesEaten).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Duels/DuelsGamemode.test.ts b/src/Structures/MiniGames/Duels/DuelsGamemode.test.ts new file mode 100644 index 000000000..4461a879e --- /dev/null +++ b/src/Structures/MiniGames/Duels/DuelsGamemode.test.ts @@ -0,0 +1,65 @@ +import DuelsGamemode from './DuelsGamemode.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('DuelsGamemode', () => { + const data = new DuelsGamemode({ stats: 'meow' }, '2v2v2v2'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(DuelsGamemode); + expectTypeOf(data).toEqualTypeOf(); + expect(data.title).toBeDefined(); + expectTypeOf(data.title).toEqualTypeOf(); + expect(data.winStreak).toBeDefined(); + expect(data.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winStreak).toEqualTypeOf(); + expect(data.bestWinStreak).toBeDefined(); + expect(data.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bestWinStreak).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.playedGames).toBeDefined(); + expect(data.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playedGames).toEqualTypeOf(); + expect(data.swings).toBeDefined(); + expect(data.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.swings).toEqualTypeOf(); + expect(data.hits).toBeDefined(); + expect(data.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hits).toEqualTypeOf(); + expect(data.meleeAccuracy).toBeDefined(); + expect(data.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meleeAccuracy).toEqualTypeOf(); + expect(data.bowShots).toBeDefined(); + expect(data.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowShots).toEqualTypeOf(); + expect(data.bowHits).toBeDefined(); + expect(data.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowHits).toEqualTypeOf(); + expect(data.bowAccuracy).toBeDefined(); + expect(data.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowAccuracy).toEqualTypeOf(); + expect(data.blocksPlaced).toBeDefined(); + expect(data.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksPlaced).toEqualTypeOf(); + expect(data.healthRegenerated).toBeDefined(); + expect(data.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.healthRegenerated).toEqualTypeOf(); + expect(data.goldenApplesEaten).toBeDefined(); + expect(data.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goldenApplesEaten).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Duels/DuelsMegaWalls.test.ts b/src/Structures/MiniGames/Duels/DuelsMegaWalls.test.ts new file mode 100644 index 000000000..e69b88811 --- /dev/null +++ b/src/Structures/MiniGames/Duels/DuelsMegaWalls.test.ts @@ -0,0 +1,72 @@ +import DuelsGamemode from './DuelsGamemode.js'; +import DuelsMegaWalls from './DuelsMegaWalls.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('DuelsMegaWalls', () => { + const data = new DuelsMegaWalls({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(DuelsMegaWalls); + expectTypeOf(data).toEqualTypeOf(); + expect(data.title).toBeDefined(); + expectTypeOf(data.title).toEqualTypeOf(); + expect(data.winStreak).toBeDefined(); + expect(data.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winStreak).toEqualTypeOf(); + expect(data.bestWinStreak).toBeDefined(); + expect(data.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bestWinStreak).toEqualTypeOf(); + expect(data.solo).toBeDefined(); + expect(data.solo).toBeInstanceOf(DuelsGamemode); + expectTypeOf(data.solo).toEqualTypeOf(); + expect(data.doubles).toBeDefined(); + expect(data.doubles).toBeInstanceOf(DuelsGamemode); + expectTypeOf(data.doubles).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.playedGames).toBeDefined(); + expect(data.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playedGames).toEqualTypeOf(); + expect(data.swings).toBeDefined(); + expect(data.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.swings).toEqualTypeOf(); + expect(data.hits).toBeDefined(); + expect(data.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hits).toEqualTypeOf(); + expect(data.meleeAccuracy).toBeDefined(); + expect(data.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meleeAccuracy).toEqualTypeOf(); + expect(data.bowShots).toBeDefined(); + expect(data.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowShots).toEqualTypeOf(); + expect(data.bowHits).toBeDefined(); + expect(data.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowHits).toEqualTypeOf(); + expect(data.bowAccuracy).toBeDefined(); + expect(data.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowAccuracy).toEqualTypeOf(); + expect(data.blocksPlaced).toBeDefined(); + expect(data.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksPlaced).toEqualTypeOf(); + expect(data.healthRegenerated).toBeDefined(); + expect(data.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.healthRegenerated).toEqualTypeOf(); + expect(data.goldenApplesEaten).toBeDefined(); + expect(data.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goldenApplesEaten).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Duels/DuelsOP.test.ts b/src/Structures/MiniGames/Duels/DuelsOP.test.ts new file mode 100644 index 000000000..0d6523adc --- /dev/null +++ b/src/Structures/MiniGames/Duels/DuelsOP.test.ts @@ -0,0 +1,72 @@ +import DuelsGamemode from './DuelsGamemode.js'; +import DuelsOP from './DuelsOP.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('DuelsOP', () => { + const data = new DuelsOP({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(DuelsOP); + expectTypeOf(data).toEqualTypeOf(); + expect(data.title).toBeDefined(); + expectTypeOf(data.title).toEqualTypeOf(); + expect(data.winStreak).toBeDefined(); + expect(data.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winStreak).toEqualTypeOf(); + expect(data.bestWinStreak).toBeDefined(); + expect(data.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bestWinStreak).toEqualTypeOf(); + expect(data.solo).toBeDefined(); + expect(data.solo).toBeInstanceOf(DuelsGamemode); + expectTypeOf(data.solo).toEqualTypeOf(); + expect(data.doubles).toBeDefined(); + expect(data.doubles).toBeInstanceOf(DuelsGamemode); + expectTypeOf(data.doubles).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.playedGames).toBeDefined(); + expect(data.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playedGames).toEqualTypeOf(); + expect(data.swings).toBeDefined(); + expect(data.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.swings).toEqualTypeOf(); + expect(data.hits).toBeDefined(); + expect(data.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hits).toEqualTypeOf(); + expect(data.meleeAccuracy).toBeDefined(); + expect(data.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meleeAccuracy).toEqualTypeOf(); + expect(data.bowShots).toBeDefined(); + expect(data.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowShots).toEqualTypeOf(); + expect(data.bowHits).toBeDefined(); + expect(data.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowHits).toEqualTypeOf(); + expect(data.bowAccuracy).toBeDefined(); + expect(data.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowAccuracy).toEqualTypeOf(); + expect(data.blocksPlaced).toBeDefined(); + expect(data.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksPlaced).toEqualTypeOf(); + expect(data.healthRegenerated).toBeDefined(); + expect(data.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.healthRegenerated).toEqualTypeOf(); + expect(data.goldenApplesEaten).toBeDefined(); + expect(data.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goldenApplesEaten).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Duels/DuelsSkyWars.test.ts b/src/Structures/MiniGames/Duels/DuelsSkyWars.test.ts new file mode 100644 index 000000000..db1260fda --- /dev/null +++ b/src/Structures/MiniGames/Duels/DuelsSkyWars.test.ts @@ -0,0 +1,72 @@ +import DuelsGamemode from './DuelsGamemode.js'; +import DuelsSkyWars from './DuelsSkyWars.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('DuelsSkyWars', () => { + const data = new DuelsSkyWars({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(DuelsSkyWars); + expectTypeOf(data).toEqualTypeOf(); + expect(data.title).toBeDefined(); + expectTypeOf(data.title).toEqualTypeOf(); + expect(data.winStreak).toBeDefined(); + expect(data.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winStreak).toEqualTypeOf(); + expect(data.bestWinStreak).toBeDefined(); + expect(data.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bestWinStreak).toEqualTypeOf(); + expect(data.solo).toBeDefined(); + expect(data.solo).toBeInstanceOf(DuelsGamemode); + expectTypeOf(data.solo).toEqualTypeOf(); + expect(data.doubles).toBeDefined(); + expect(data.doubles).toBeInstanceOf(DuelsGamemode); + expectTypeOf(data.doubles).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.playedGames).toBeDefined(); + expect(data.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playedGames).toEqualTypeOf(); + expect(data.swings).toBeDefined(); + expect(data.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.swings).toEqualTypeOf(); + expect(data.hits).toBeDefined(); + expect(data.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hits).toEqualTypeOf(); + expect(data.meleeAccuracy).toBeDefined(); + expect(data.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meleeAccuracy).toEqualTypeOf(); + expect(data.bowShots).toBeDefined(); + expect(data.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowShots).toEqualTypeOf(); + expect(data.bowHits).toBeDefined(); + expect(data.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowHits).toEqualTypeOf(); + expect(data.bowAccuracy).toBeDefined(); + expect(data.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowAccuracy).toEqualTypeOf(); + expect(data.blocksPlaced).toBeDefined(); + expect(data.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksPlaced).toEqualTypeOf(); + expect(data.healthRegenerated).toBeDefined(); + expect(data.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.healthRegenerated).toEqualTypeOf(); + expect(data.goldenApplesEaten).toBeDefined(); + expect(data.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goldenApplesEaten).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Duels/DuelsUHC.test.ts b/src/Structures/MiniGames/Duels/DuelsUHC.test.ts new file mode 100644 index 000000000..7fcd1c565 --- /dev/null +++ b/src/Structures/MiniGames/Duels/DuelsUHC.test.ts @@ -0,0 +1,78 @@ +import DuelsGamemode from './DuelsGamemode.js'; +import DuelsUHC from './DuelsUHC.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('DuelsUHC', () => { + const data = new DuelsUHC({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(DuelsUHC); + expectTypeOf(data).toEqualTypeOf(); + expect(data.title).toBeDefined(); + expectTypeOf(data.title).toEqualTypeOf(); + expect(data.winStreak).toBeDefined(); + expect(data.winStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winStreak).toEqualTypeOf(); + expect(data.bestWinStreak).toBeDefined(); + expect(data.bestWinStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bestWinStreak).toEqualTypeOf(); + expect(data.solo).toBeDefined(); + expect(data.solo).toBeInstanceOf(DuelsGamemode); + expectTypeOf(data.solo).toEqualTypeOf(); + expect(data.doubles).toBeDefined(); + expect(data.doubles).toBeInstanceOf(DuelsGamemode); + expectTypeOf(data.doubles).toEqualTypeOf(); + expect(data.fours).toBeDefined(); + expect(data.fours).toBeInstanceOf(DuelsGamemode); + expectTypeOf(data.fours).toEqualTypeOf(); + expect(data.deathmatch).toBeDefined(); + expect(data.deathmatch).toBeInstanceOf(DuelsGamemode); + expectTypeOf(data.deathmatch).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); + expect(data.playedGames).toBeDefined(); + expect(data.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playedGames).toEqualTypeOf(); + expect(data.swings).toBeDefined(); + expect(data.swings).toBeGreaterThanOrEqual(0); + expectTypeOf(data.swings).toEqualTypeOf(); + expect(data.hits).toBeDefined(); + expect(data.hits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hits).toEqualTypeOf(); + expect(data.meleeAccuracy).toBeDefined(); + expect(data.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meleeAccuracy).toEqualTypeOf(); + expect(data.bowShots).toBeDefined(); + expect(data.bowShots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowShots).toEqualTypeOf(); + expect(data.bowHits).toBeDefined(); + expect(data.bowHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowHits).toEqualTypeOf(); + expect(data.bowAccuracy).toBeDefined(); + expect(data.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowAccuracy).toEqualTypeOf(); + expect(data.blocksPlaced).toBeDefined(); + expect(data.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksPlaced).toEqualTypeOf(); + expect(data.healthRegenerated).toBeDefined(); + expect(data.healthRegenerated).toBeGreaterThanOrEqual(0); + expectTypeOf(data.healthRegenerated).toEqualTypeOf(); + expect(data.goldenApplesEaten).toBeDefined(); + expect(data.goldenApplesEaten).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goldenApplesEaten).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/MegaWalls/MegaWalls.test.ts b/src/Structures/MiniGames/MegaWalls/MegaWalls.test.ts index f098f131d..b920ef1dc 100644 --- a/src/Structures/MiniGames/MegaWalls/MegaWalls.test.ts +++ b/src/Structures/MiniGames/MegaWalls/MegaWalls.test.ts @@ -8,7 +8,7 @@ test('MegaWalls', () => { const data = new MegaWalls({ stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(MegaWalls); - expectTypeOf(data).toMatchTypeOf(); + expectTypeOf(data).toEqualTypeOf(); expect(data.selectedClass).toBeDefined(); expectTypeOf(data.selectedClass).toEqualTypeOf(); expect(data.coins).toBeDefined(); @@ -72,58 +72,87 @@ test('MegaWalls', () => { expect(data.damageDealt).toBeGreaterThanOrEqual(0); expectTypeOf(data.damageDealt).toEqualTypeOf(); expect(data.faceOff).toBeDefined(); + expect(data.faceOff).toBeInstanceOf(MegaWallsModeStats); expectTypeOf(data.faceOff).toEqualTypeOf(); expect(data.casualBrawl).toBeDefined(); + expect(data.casualBrawl).toBeInstanceOf(MegaWallsModeStats); expectTypeOf(data.casualBrawl).toEqualTypeOf(); expect(data.cow).toBeDefined(); + expect(data.cow).toBeInstanceOf(MegaWallsKitStats); expectTypeOf(data.cow).toEqualTypeOf(); expect(data.hunter).toBeDefined(); + expect(data.hunter).toBeInstanceOf(MegaWallsKitStats); expectTypeOf(data.hunter).toEqualTypeOf(); expect(data.shark).toBeDefined(); + expect(data.shark).toBeInstanceOf(MegaWallsKitStats); expectTypeOf(data.shark).toEqualTypeOf(); expect(data.arcanist).toBeDefined(); + expect(data.arcanist).toBeInstanceOf(MegaWallsKitStats); expectTypeOf(data.arcanist).toEqualTypeOf(); expect(data.deadlord).toBeDefined(); + expect(data.deadlord).toBeInstanceOf(MegaWallsKitStats); expectTypeOf(data.deadlord).toEqualTypeOf(); expect(data.golem).toBeDefined(); + expect(data.golem).toBeInstanceOf(MegaWallsKitStats); expectTypeOf(data.golem).toEqualTypeOf(); expect(data.herobrine).toBeDefined(); + expect(data.herobrine).toBeInstanceOf(MegaWallsKitStats); expectTypeOf(data.herobrine).toEqualTypeOf(); expect(data.pigman).toBeDefined(); + expect(data.pigman).toBeInstanceOf(MegaWallsKitStats); expectTypeOf(data.pigman).toEqualTypeOf(); expect(data.zombie).toBeDefined(); + expect(data.zombie).toBeInstanceOf(MegaWallsKitStats); expectTypeOf(data.zombie).toEqualTypeOf(); expect(data.blaze).toBeDefined(); + expect(data.blaze).toBeInstanceOf(MegaWallsKitStats); expectTypeOf(data.blaze).toEqualTypeOf(); expect(data.enderman).toBeDefined(); + expect(data.enderman).toBeInstanceOf(MegaWallsKitStats); expectTypeOf(data.enderman).toEqualTypeOf(); expect(data.shaman).toBeDefined(); + expect(data.shaman).toBeInstanceOf(MegaWallsKitStats); expectTypeOf(data.shaman).toEqualTypeOf(); + expect(data.squid).toBeDefined(); + expect(data.squid).toBeInstanceOf(MegaWallsKitStats); expectTypeOf(data.squid).toEqualTypeOf(); expect(data.creeper).toBeDefined(); + expect(data.creeper).toBeInstanceOf(MegaWallsKitStats); expectTypeOf(data.creeper).toEqualTypeOf(); expect(data.pirate).toBeDefined(); + expect(data.pirate).toBeInstanceOf(MegaWallsKitStats); expectTypeOf(data.pirate).toEqualTypeOf(); expect(data.sheep).toBeDefined(); + expect(data.sheep).toBeInstanceOf(MegaWallsKitStats); expectTypeOf(data.sheep).toEqualTypeOf(); expect(data.skeleton).toBeDefined(); + expect(data.skeleton).toBeInstanceOf(MegaWallsKitStats); expectTypeOf(data.skeleton).toEqualTypeOf(); expect(data.spider).toBeDefined(); + expect(data.spider).toBeInstanceOf(MegaWallsKitStats); expectTypeOf(data.spider).toEqualTypeOf(); expect(data.werewolf).toBeDefined(); + expect(data.werewolf).toBeInstanceOf(MegaWallsKitStats); expectTypeOf(data.werewolf).toEqualTypeOf(); expect(data.angel).toBeDefined(); + expect(data.angel).toBeInstanceOf(MegaWallsKitStats); expectTypeOf(data.angel).toEqualTypeOf(); expect(data.assassin).toBeDefined(); + expect(data.assassin).toBeInstanceOf(MegaWallsKitStats); expectTypeOf(data.assassin).toEqualTypeOf(); expect(data.automaton).toBeDefined(); + expect(data.automaton).toBeInstanceOf(MegaWallsKitStats); expectTypeOf(data.automaton).toEqualTypeOf(); expect(data.moleman).toBeDefined(); + expect(data.moleman).toBeInstanceOf(MegaWallsKitStats); expectTypeOf(data.moleman).toEqualTypeOf(); expect(data.phoenix).toBeDefined(); + expect(data.phoenix).toBeInstanceOf(MegaWallsKitStats); expectTypeOf(data.phoenix).toEqualTypeOf(); expect(data.renegade).toBeDefined(); + expect(data.renegade).toBeInstanceOf(MegaWallsKitStats); expectTypeOf(data.renegade).toEqualTypeOf(); expect(data.snowman).toBeDefined(); + expect(data.snowman).toBeInstanceOf(MegaWallsKitStats); expectTypeOf(data.snowman).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/MegaWalls/MegaWallsKitStats.test.ts b/src/Structures/MiniGames/MegaWalls/MegaWallsKitStats.test.ts index c69867ce1..20743c3f4 100644 --- a/src/Structures/MiniGames/MegaWalls/MegaWallsKitStats.test.ts +++ b/src/Structures/MiniGames/MegaWalls/MegaWallsKitStats.test.ts @@ -6,7 +6,7 @@ test('MegaWallsKitStats', () => { const data = new MegaWallsKitStats({ stats: 'meow' }, 'angel'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(MegaWallsKitStats); - expectTypeOf(data).toMatchTypeOf(); + expectTypeOf(data).toEqualTypeOf(); expect(data.kills).toBeDefined(); expect(data.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.kills).toEqualTypeOf(); @@ -65,7 +65,9 @@ test('MegaWallsKitStats', () => { expect(data.damageDealt).toBeGreaterThanOrEqual(0); expectTypeOf(data.damageDealt).toEqualTypeOf(); expect(data.faceOff).toBeDefined(); + expect(data.faceOff).toBeInstanceOf(MegaWallsModeStats); expectTypeOf(data.faceOff).toEqualTypeOf(); expect(data.casualBrawl).toBeDefined(); + expect(data.casualBrawl).toBeInstanceOf(MegaWallsModeStats); expectTypeOf(data.casualBrawl).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/MegaWalls/MegaWallsModeStats.test.ts b/src/Structures/MiniGames/MegaWalls/MegaWallsModeStats.test.ts index 5126b06b8..340a0e0f7 100644 --- a/src/Structures/MiniGames/MegaWalls/MegaWallsModeStats.test.ts +++ b/src/Structures/MiniGames/MegaWalls/MegaWallsModeStats.test.ts @@ -2,10 +2,10 @@ import MegaWallsModeStats from './MegaWallsModeStats.js'; import { expect, expectTypeOf, test } from 'vitest'; test('MegaWallsModeStats', () => { - const data = new MegaWallsModeStats({ stats: 'meow' }, 'face_off'); + const data = new MegaWallsModeStats({ stats: 'meow' }, 'face_off', 'angel'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(MegaWallsModeStats); - expectTypeOf(data).toMatchTypeOf(); + expectTypeOf(data).toEqualTypeOf(); expect(data.kills).toBeDefined(); expect(data.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.kills).toEqualTypeOf(); diff --git a/src/Structures/MiniGames/MurderMystery/MurderMystery.test.ts b/src/Structures/MiniGames/MurderMystery/MurderMystery.test.ts new file mode 100644 index 000000000..0f7543db1 --- /dev/null +++ b/src/Structures/MiniGames/MurderMystery/MurderMystery.test.ts @@ -0,0 +1,292 @@ +import Emblem from '../Shared/Emblem/Emblem.js'; +import LeaderboardSettings from '../Shared/LeaderboardSettings.js'; +import MurderMystery from './MurderMystery.js'; +import MurderMysteryDescent from './MurderMysteryDescent.js'; +import MurderMysteryFavorites from './MurderMysteryFavorites.js'; +import MurderMysteryGamemode from './MurderMysteryGamemode.js'; +import MurderMysteryKnifeSkinPrestige from './MurderMysteryKnifeSkinPrestige.js'; +import MurderMysteryMap from './MurderMysteryMap.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { + MurderMysteryAnimatedHat, + MurderMysteryDeathCry, + MurderMysteryDescentMode, + MurderMysteryEmblemIcon, + MurderMysteryGesture, + MurderMysteryGravestone, + MurderMysteryItem, + MurderMysteryKillNote, + MurderMysteryKnifeSkin, + MurderMysteryLastWords, + MurderMysteryMapName, + MurderMysteryProjectileTrail, + MurderMysteryRole, + MurderMysteryVictoryDance, + ShopSort +} from '../../../Types/Player.js'; + +test('MurderMystery', () => { + const data = new MurderMystery({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(MurderMystery); + expectTypeOf(data).toEqualTypeOf(); + expect(data.activeAnimatedHat).toBeDefined(); + expectTypeOf(data.activeAnimatedHat).toEqualTypeOf(); + expect(data.activeDeathCry).toBeDefined(); + expectTypeOf(data.activeDeathCry).toEqualTypeOf(); + expect(data.activeGesture).toBeDefined(); + expectTypeOf(data.activeGesture).toEqualTypeOf(); + expect(data.activeGravestone).toBeDefined(); + expectTypeOf(data.activeGravestone).toEqualTypeOf(); + expect(data.activeKillNote).toBeDefined(); + expectTypeOf(data.activeKillNote).toEqualTypeOf(); + expect(data.activeKnifeSkin).toBeDefined(); + expectTypeOf(data.activeKnifeSkin).toEqualTypeOf(); + expect(data.activeLastWords).toBeDefined(); + expectTypeOf(data.activeLastWords).toEqualTypeOf(); + expect(data.activeProjectileTrail).toBeDefined(); + expectTypeOf(data.activeProjectileTrail).toEqualTypeOf(); + expect(data.activeVictoryDance).toBeDefined(); + expectTypeOf(data.activeVictoryDance).toEqualTypeOf(); + expect(data.alphaWins).toBeDefined(); + expect(data.alphaWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.alphaWins).toEqualTypeOf(); + expect(data.bowKills).toBeDefined(); + expect(data.bowKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowKills).toEqualTypeOf(); + expect(data.chestHistoryNew).toBeDefined(); + expectTypeOf(data.chestHistoryNew).toEqualTypeOf(); + expect(data.tokens).toBeDefined(); + expect(data.tokens).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tokens).toEqualTypeOf(); + expect(data.tokensPickedUp).toBeDefined(); + expect(data.tokensPickedUp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tokensPickedUp).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.descent).toBeDefined(); + expect(data.descent).toBeInstanceOf(MurderMysteryDescent); + expectTypeOf(data.descent).toEqualTypeOf(); + expect(data.detectiveWins).toBeDefined(); + expect(data.detectiveWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.detectiveWins).toEqualTypeOf(); + expect(data.doEmblemsInGame).toBeDefined(); + expectTypeOf(data.doEmblemsInGame).toEqualTypeOf(); + expect(data.doHeartbeatSounds).toBeDefined(); + expectTypeOf(data.doHeartbeatSounds).toEqualTypeOf(); + expect(data.doHints).toBeDefined(); + expectTypeOf(data.doHints).toEqualTypeOf(); + expect(data.emblem).toBeDefined(); + expectTypeOf(data.emblem).toEqualTypeOf>(); + expect(data.favoriteDescentMode).toBeDefined(); + expectTypeOf(data.favoriteDescentMode).toEqualTypeOf(); + expect(data.favorites).toBeDefined(); + expect(data.favorites).toBeInstanceOf(MurderMysteryFavorites); + expectTypeOf(data.favorites).toEqualTypeOf(); + expect(data.games).toBeDefined(); + expect(data.games).toBeGreaterThanOrEqual(0); + expectTypeOf(data.games).toEqualTypeOf(); + expect(data.grantedChests).toBeDefined(); + expect(data.grantedChests).toBeGreaterThanOrEqual(0); + expectTypeOf(data.grantedChests).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.knifeSkinPrestiges).toBeDefined(); + expect(data.knifeSkinPrestiges).toBeInstanceOf(MurderMysteryKnifeSkinPrestige); + expectTypeOf(data.knifeSkinPrestiges).toEqualTypeOf(); + expect(data.leaderboardSettings).toBeDefined(); + expectTypeOf(data.leaderboardSettings).toEqualTypeOf>(); + expect(data.knifeKills).toBeDefined(); + expect(data.knifeKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.knifeKills).toEqualTypeOf(); + expect(data.lastOneAlive).toBeDefined(); + expect(data.lastOneAlive).toBeGreaterThanOrEqual(0); + expectTypeOf(data.lastOneAlive).toEqualTypeOf(); + expect(data.longestTimeAsSurvivorSeconds).toBeDefined(); + expect(data.longestTimeAsSurvivorSeconds).toBeGreaterThanOrEqual(0); + expectTypeOf(data.longestTimeAsSurvivorSeconds).toEqualTypeOf(); + expect(data.mapsConsumablesUsed).toBeDefined(); + expectTypeOf(data.mapsConsumablesUsed).toEqualTypeOf(); + expect(data.mapsMurdererTrapKills).toBeDefined(); + expectTypeOf(data.mapsMurdererTrapKills).toEqualTypeOf(); + expect(data.chestHistory).toBeDefined(); + expectTypeOf(data.chestHistory).toEqualTypeOf(); + expect(data.chests).toBeDefined(); + expect(data.chests).toBeGreaterThanOrEqual(0); + expectTypeOf(data.chests).toEqualTypeOf(); + expect(data.christmasChests).toBeDefined(); + expect(data.christmasChests).toBeGreaterThanOrEqual(0); + expectTypeOf(data.christmasChests).toEqualTypeOf(); + expect(data.easterChests).toBeDefined(); + expect(data.easterChests).toBeGreaterThanOrEqual(0); + expectTypeOf(data.easterChests).toEqualTypeOf(); + expect(data.goldenChests).toBeDefined(); + expect(data.goldenChests).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goldenChests).toEqualTypeOf(); + expect(data.halloweenChests).toBeDefined(); + expect(data.halloweenChests).toBeGreaterThanOrEqual(0); + expectTypeOf(data.halloweenChests).toEqualTypeOf(); + expect(data.lunarChests).toBeDefined(); + expect(data.lunarChests).toBeGreaterThanOrEqual(0); + expectTypeOf(data.lunarChests).toEqualTypeOf(); + expect(data.merryChests).toBeDefined(); + expect(data.merryChests).toBeGreaterThanOrEqual(0); + expectTypeOf(data.merryChests).toEqualTypeOf(); + expect(data.murdererWins).toBeDefined(); + expect(data.murdererWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.murdererWins).toEqualTypeOf(); + expect(data.books).toBeDefined(); + expectTypeOf(data.books).toEqualTypeOf(); + expect(data.quickestDetectiveWinTimeSeconds).toBeDefined(); + expect(data.quickestDetectiveWinTimeSeconds).toBeGreaterThanOrEqual(0); + expectTypeOf(data.quickestDetectiveWinTimeSeconds).toEqualTypeOf(); + expect(data.quickestMurdererWinTimeSeconds).toBeDefined(); + expect(data.quickestMurdererWinTimeSeconds).toBeGreaterThanOrEqual(0); + expectTypeOf(data.quickestMurdererWinTimeSeconds).toEqualTypeOf(); + expect(data.quickestShowdownWinTimeSeconds).toBeDefined(); + expect(data.quickestShowdownWinTimeSeconds).toBeGreaterThanOrEqual(0); + expectTypeOf(data.quickestShowdownWinTimeSeconds).toEqualTypeOf(); + expect(data.shopSort).toBeDefined(); + expectTypeOf(data.shopSort).toEqualTypeOf(); + expect(data.shopSortEnableOwnedFirst).toBeDefined(); + expectTypeOf(data.shopSortEnableOwnedFirst).toEqualTypeOf(); + expect(data.showdownPotg).toBeDefined(); + expect(data.showdownPotg).toBeGreaterThanOrEqual(0); + expectTypeOf(data.showdownPotg).toEqualTypeOf(); + expect(data.showQueueBook).toBeDefined(); + expectTypeOf(data.showQueueBook).toEqualTypeOf(); + expect(data.spookyOpenAch).toBeDefined(); + expect(data.spookyOpenAch).toBeGreaterThanOrEqual(0); + expectTypeOf(data.spookyOpenAch).toEqualTypeOf(); + expect(data.suicides).toBeDefined(); + expect(data.suicides).toBeGreaterThanOrEqual(0); + expectTypeOf(data.suicides).toEqualTypeOf(); + expect(data.survivorWins).toBeDefined(); + expect(data.survivorWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.survivorWins).toEqualTypeOf(); + expect(data.thrownKnifeKills).toBeDefined(); + expect(data.thrownKnifeKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.thrownKnifeKills).toEqualTypeOf(); + expect(data.totalTimeSurvivedSeconds).toBeDefined(); + expect(data.totalTimeSurvivedSeconds).toBeGreaterThanOrEqual(0); + expectTypeOf(data.totalTimeSurvivedSeconds).toEqualTypeOf(); + expect(data.trapKills).toBeDefined(); + expect(data.trapKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.trapKills).toEqualTypeOf(); + expect(data.wasHero).toBeDefined(); + expect(data.wasHero).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wasHero).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.openedChests).toBeDefined(); + expect(data.openedChests).toBeGreaterThanOrEqual(0); + expectTypeOf(data.openedChests).toEqualTypeOf(); + expect(data.openedCommons).toBeDefined(); + expect(data.openedCommons).toBeGreaterThanOrEqual(0); + expectTypeOf(data.openedCommons).toEqualTypeOf(); + expect(data.openedEpics).toBeDefined(); + expect(data.openedEpics).toBeGreaterThanOrEqual(0); + expectTypeOf(data.openedEpics).toEqualTypeOf(); + expect(data.openedLegendaries).toBeDefined(); + expect(data.openedLegendaries).toBeGreaterThanOrEqual(0); + expectTypeOf(data.openedLegendaries).toEqualTypeOf(); + expect(data.openedRares).toBeDefined(); + expect(data.openedRares).toBeGreaterThanOrEqual(0); + expectTypeOf(data.openedRares).toEqualTypeOf(); + expect(data.ancientTomb).toBeDefined(); + expect(data.ancientTomb).toBeInstanceOf(MurderMysteryMap); + expectTypeOf(data.ancientTomb).toEqualTypeOf(); + expect(data.aquarium).toBeDefined(); + expect(data.aquarium).toBeInstanceOf(MurderMysteryMap); + expectTypeOf(data.aquarium).toEqualTypeOf(); + expect(data.archives).toBeDefined(); + expect(data.archives).toBeInstanceOf(MurderMysteryMap); + expectTypeOf(data.archives).toEqualTypeOf(); + expect(data.archivesTopFloor).toBeDefined(); + expect(data.archivesTopFloor).toBeInstanceOf(MurderMysteryMap); + expectTypeOf(data.archivesTopFloor).toEqualTypeOf(); + expect(data.cattleridgeFarm).toBeDefined(); + expect(data.cattleridgeFarm).toBeInstanceOf(MurderMysteryMap); + expectTypeOf(data.cattleridgeFarm).toEqualTypeOf(); + expect(data.cruiseShip).toBeDefined(); + expect(data.cruiseShip).toBeInstanceOf(MurderMysteryMap); + expectTypeOf(data.cruiseShip).toEqualTypeOf(); + expect(data.darkfall).toBeDefined(); + expect(data.darkfall).toBeInstanceOf(MurderMysteryMap); + expectTypeOf(data.darkfall).toEqualTypeOf(); + expect(data.easterWorld).toBeDefined(); + expect(data.easterWorld).toBeInstanceOf(MurderMysteryMap); + expectTypeOf(data.easterWorld).toEqualTypeOf(); + expect(data.goldRush).toBeDefined(); + expect(data.goldRush).toBeInstanceOf(MurderMysteryMap); + expectTypeOf(data.goldRush).toEqualTypeOf(); + expect(data.headquarters).toBeDefined(); + expect(data.headquarters).toBeInstanceOf(MurderMysteryMap); + expectTypeOf(data.headquarters).toEqualTypeOf(); + expect(data.hollywood).toBeDefined(); + expect(data.hollywood).toBeInstanceOf(MurderMysteryMap); + expectTypeOf(data.hollywood).toEqualTypeOf(); + expect(data.hypixelWorld).toBeDefined(); + expect(data.hypixelWorld).toBeInstanceOf(MurderMysteryMap); + expectTypeOf(data.hypixelWorld).toEqualTypeOf(); + expect(data.library).toBeDefined(); + expect(data.library).toBeInstanceOf(MurderMysteryMap); + expectTypeOf(data.library).toEqualTypeOf(); + expect(data.mountain).toBeDefined(); + expect(data.mountain).toBeInstanceOf(MurderMysteryMap); + expectTypeOf(data.mountain).toEqualTypeOf(); + expect(data.sanPeratico).toBeDefined(); + expect(data.sanPeratico).toBeInstanceOf(MurderMysteryMap); + expectTypeOf(data.sanPeratico).toEqualTypeOf(); + expect(data.sanPeraticoV2).toBeDefined(); + expect(data.sanPeraticoV2).toBeInstanceOf(MurderMysteryMap); + expectTypeOf(data.sanPeraticoV2).toEqualTypeOf(); + expect(data.skywayPier).toBeDefined(); + expect(data.skywayPier).toBeInstanceOf(MurderMysteryMap); + expectTypeOf(data.skywayPier).toEqualTypeOf(); + expect(data.snowfall).toBeDefined(); + expect(data.snowfall).toBeInstanceOf(MurderMysteryMap); + expectTypeOf(data.snowfall).toEqualTypeOf(); + expect(data.snowglobe).toBeDefined(); + expect(data.snowglobe).toBeInstanceOf(MurderMysteryMap); + expectTypeOf(data.snowglobe).toEqualTypeOf(); + expect(data.spookyMansion).toBeDefined(); + expect(data.spookyMansion).toBeInstanceOf(MurderMysteryMap); + expectTypeOf(data.spookyMansion).toEqualTypeOf(); + expect(data.subway).toBeDefined(); + expect(data.subway).toBeInstanceOf(MurderMysteryMap); + expectTypeOf(data.subway).toEqualTypeOf(); + expect(data.towerfall).toBeDefined(); + expect(data.towerfall).toBeInstanceOf(MurderMysteryMap); + expectTypeOf(data.towerfall).toEqualTypeOf(); + expect(data.transport).toBeDefined(); + expect(data.transport).toBeInstanceOf(MurderMysteryMap); + expectTypeOf(data.transport).toEqualTypeOf(); + expect(data.villa).toBeDefined(); + expect(data.villa).toBeInstanceOf(MurderMysteryMap); + expectTypeOf(data.villa).toEqualTypeOf(); + expect(data.widowsDen).toBeDefined(); + expect(data.widowsDen).toBeInstanceOf(MurderMysteryMap); + expectTypeOf(data.widowsDen).toEqualTypeOf(); + expect(data.assassins).toBeDefined(); + expect(data.assassins).toBeInstanceOf(MurderMysteryGamemode); + expectTypeOf(data.assassins).toEqualTypeOf(); + expect(data.classic).toBeDefined(); + expect(data.classic).toBeInstanceOf(MurderMysteryGamemode); + expectTypeOf(data.classic).toEqualTypeOf(); + expect(data.doubleUp).toBeDefined(); + expect(data.doubleUp).toBeInstanceOf(MurderMysteryGamemode); + expectTypeOf(data.doubleUp).toEqualTypeOf(); + expect(data.hardcode).toBeDefined(); + expect(data.hardcode).toBeInstanceOf(MurderMysteryGamemode); + expectTypeOf(data.hardcode).toEqualTypeOf(); + expect(data.infection).toBeDefined(); + expect(data.infection).toBeInstanceOf(MurderMysteryGamemode); + expectTypeOf(data.infection).toEqualTypeOf(); + expect(data.showdown).toBeDefined(); + expect(data.showdown).toBeInstanceOf(MurderMysteryGamemode); + expectTypeOf(data.showdown).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/MurderMystery/MurderMysteryDescent.test.ts b/src/Structures/MiniGames/MurderMystery/MurderMysteryDescent.test.ts new file mode 100644 index 000000000..d27aa1714 --- /dev/null +++ b/src/Structures/MiniGames/MurderMystery/MurderMysteryDescent.test.ts @@ -0,0 +1,163 @@ +import MurderMysteryDescent from './MurderMysteryDescent.js'; +import MurderMysteryDescentItem from './MurderMysteryDescentItem.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('MurderMysteryDescent', () => { + const data = new MurderMysteryDescent({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(MurderMysteryDescent); + expectTypeOf(data).toEqualTypeOf(); + expect(data.Armed).toBeDefined(); + expect(data.Armed).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.Armed).toEqualTypeOf(); + expect(data.bloodLust).toBeDefined(); + expect(data.bloodLust).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.bloodLust).toEqualTypeOf(); + expect(data.bountyHunter).toBeDefined(); + expect(data.bountyHunter).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.bountyHunter).toEqualTypeOf(); + expect(data.cleanJob).toBeDefined(); + expect(data.cleanJob).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.cleanJob).toEqualTypeOf(); + expect(data.Collateral).toBeDefined(); + expect(data.Collateral).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.Collateral).toEqualTypeOf(); + expect(data.contagionContained).toBeDefined(); + expect(data.contagionContained).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.contagionContained).toEqualTypeOf(); + expect(data.Cornucopia).toBeDefined(); + expect(data.Cornucopia).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.Cornucopia).toEqualTypeOf(); + expect(data.crimsonJoy).toBeDefined(); + expect(data.crimsonJoy).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.crimsonJoy).toEqualTypeOf(); + expect(data.crowdControl).toBeDefined(); + expect(data.crowdControl).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.crowdControl).toEqualTypeOf(); + expect(data.cuttingTheroots).toBeDefined(); + expect(data.cuttingTheroots).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.cuttingTheroots).toEqualTypeOf(); + expect(data.deadlyPrecision).toBeDefined(); + expect(data.deadlyPrecision).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.deadlyPrecision).toEqualTypeOf(); + expect(data.deadorAlive).toBeDefined(); + expect(data.deadorAlive).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.deadorAlive).toEqualTypeOf(); + expect(data.deathDefy).toBeDefined(); + expect(data.deathDefy).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.deathDefy).toEqualTypeOf(); + expect(data.distanttransMission).toBeDefined(); + expect(data.distanttransMission).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.distanttransMission).toEqualTypeOf(); + expect(data.doubleDosage).toBeDefined(); + expect(data.doubleDosage).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.doubleDosage).toEqualTypeOf(); + expect(data.dualProficiency).toBeDefined(); + expect(data.dualProficiency).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.dualProficiency).toEqualTypeOf(); + expect(data.exponentiation).toBeDefined(); + expect(data.exponentiation).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.exponentiation).toEqualTypeOf(); + expect(data.eyeonPrey).toBeDefined(); + expect(data.eyeonPrey).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.eyeonPrey).toEqualTypeOf(); + expect(data.firstJob).toBeDefined(); + expect(data.firstJob).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.firstJob).toEqualTypeOf(); + expect(data.firstOfMany).toBeDefined(); + expect(data.firstOfMany).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.firstOfMany).toEqualTypeOf(); + expect(data.firstSteps).toBeDefined(); + expect(data.firstSteps).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.firstSteps).toEqualTypeOf(); + expect(data.grandSlam).toBeDefined(); + expect(data.grandSlam).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.grandSlam).toEqualTypeOf(); + expect(data.hero).toBeDefined(); + expect(data.hero).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.hero).toEqualTypeOf(); + expect(data.highRoller).toBeDefined(); + expect(data.highRoller).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.highRoller).toEqualTypeOf(); + expect(data.holdGround).toBeDefined(); + expect(data.holdGround).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.holdGround).toEqualTypeOf(); + expect(data.huntsman).toBeDefined(); + expect(data.huntsman).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.huntsman).toEqualTypeOf(); + expect(data.jobSearch).toBeDefined(); + expect(data.jobSearch).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.jobSearch).toEqualTypeOf(); + expect(data.lawMaker).toBeDefined(); + expect(data.lawMaker).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.lawMaker).toEqualTypeOf(); + expect(data.Legacy).toBeDefined(); + expect(data.Legacy).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.Legacy).toEqualTypeOf(); + expect(data.localSpecialty).toBeDefined(); + expect(data.localSpecialty).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.localSpecialty).toEqualTypeOf(); + expect(data.lurkingContagion).toBeDefined(); + expect(data.lurkingContagion).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.lurkingContagion).toEqualTypeOf(); + expect(data.makeshiftShield).toBeDefined(); + expect(data.makeshiftShield).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.makeshiftShield).toEqualTypeOf(); + expect(data.mowingDown).toBeDefined(); + expect(data.mowingDown).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.mowingDown).toEqualTypeOf(); + expect(data.oneOfUs).toBeDefined(); + expect(data.oneOfUs).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.oneOfUs).toEqualTypeOf(); + expect(data.paneKiller).toBeDefined(); + expect(data.paneKiller).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.paneKiller).toEqualTypeOf(); + expect(data.patientZero).toBeDefined(); + expect(data.patientZero).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.patientZero).toEqualTypeOf(); + expect(data.postPandemic).toBeDefined(); + expect(data.postPandemic).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.postPandemic).toEqualTypeOf(); + expect(data.pythagoreanDisposal).toBeDefined(); + expect(data.pythagoreanDisposal).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.pythagoreanDisposal).toEqualTypeOf(); + expect(data.quickDraw).toBeDefined(); + expect(data.quickDraw).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.quickDraw).toEqualTypeOf(); + expect(data.reloaded).toBeDefined(); + expect(data.reloaded).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.reloaded).toEqualTypeOf(); + expect(data.seasonedHitman).toBeDefined(); + expect(data.seasonedHitman).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.seasonedHitman).toEqualTypeOf(); + expect(data.selfDefense).toBeDefined(); + expect(data.selfDefense).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.selfDefense).toEqualTypeOf(); + expect(data.serialTrapper).toBeDefined(); + expect(data.serialTrapper).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.serialTrapper).toEqualTypeOf(); + expect(data.silverBullet).toBeDefined(); + expect(data.silverBullet).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.silverBullet).toEqualTypeOf(); + expect(data.slaughterHouse).toBeDefined(); + expect(data.slaughterHouse).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.slaughterHouse).toEqualTypeOf(); + expect(data.sneaky).toBeDefined(); + expect(data.sneaky).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.sneaky).toEqualTypeOf(); + expect(data.survival).toBeDefined(); + expect(data.survival).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.survival).toEqualTypeOf(); + expect(data.totaloutBreak).toBeDefined(); + expect(data.totaloutBreak).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.totaloutBreak).toEqualTypeOf(); + expect(data.trapping101).toBeDefined(); + expect(data.trapping101).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.trapping101).toEqualTypeOf(); + expect(data.trulyMad).toBeDefined(); + expect(data.trulyMad).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.trulyMad).toEqualTypeOf(); + expect(data.viralKnife).toBeDefined(); + expect(data.viralKnife).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data.viralKnife).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/MurderMystery/MurderMysteryDescentItem.test.ts b/src/Structures/MiniGames/MurderMystery/MurderMysteryDescentItem.test.ts new file mode 100644 index 000000000..96cd56fc5 --- /dev/null +++ b/src/Structures/MiniGames/MurderMystery/MurderMysteryDescentItem.test.ts @@ -0,0 +1,14 @@ +import MurderMysteryDescentItem from './MurderMysteryDescentItem.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('MurderMysteryDescentItem', () => { + const data = new MurderMysteryDescentItem({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(MurderMysteryDescentItem); + expectTypeOf(data).toEqualTypeOf(); + expect(data.claimed).toBeDefined(); + expectTypeOf(data.claimed).toEqualTypeOf(); + expect(data.progress).toBeDefined(); + expect(data.progress).toBeGreaterThanOrEqual(0); + expectTypeOf(data.progress).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/MurderMystery/MurderMysteryFavorites.test.ts b/src/Structures/MiniGames/MurderMystery/MurderMysteryFavorites.test.ts new file mode 100644 index 000000000..03e313ad5 --- /dev/null +++ b/src/Structures/MiniGames/MurderMystery/MurderMysteryFavorites.test.ts @@ -0,0 +1,38 @@ +import MurderMysteryFavorites from './MurderMysteryFavorites.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { + MurderMysteryAnimatedHatRaw, + MurderMysteryDeathCryRaw, + MurderMysteryGestureRaw, + MurderMysteryGravestoneRaw, + MurderMysteryKillNoteRaw, + MurderMysteryKnifeSkinRaw, + MurderMysteryLastWordsRaw, + MurderMysteryProjectileTrailRaw, + MurderMysteryVictoryDanceRaw +} from '../../../Types/Player.js'; + +test('MurderMysteryFavorites', () => { + const data = new MurderMysteryFavorites({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(MurderMysteryFavorites); + expectTypeOf(data).toEqualTypeOf(); + expect(data.animatedHat).toBeDefined(); + expectTypeOf(data.animatedHat).toEqualTypeOf(); + expect(data.deathCry).toBeDefined(); + expectTypeOf(data.deathCry).toEqualTypeOf(); + expect(data.gesture).toBeDefined(); + expectTypeOf(data.gesture).toEqualTypeOf(); + expect(data.gravestone).toBeDefined(); + expectTypeOf(data.gravestone).toEqualTypeOf(); + expect(data.killNote).toBeDefined(); + expectTypeOf(data.killNote).toEqualTypeOf(); + expect(data.knifeSkin).toBeDefined(); + expectTypeOf(data.knifeSkin).toEqualTypeOf(); + expect(data.lastWords).toBeDefined(); + expectTypeOf(data.lastWords).toEqualTypeOf(); + expect(data.projectileTrail).toBeDefined(); + expectTypeOf(data.projectileTrail).toEqualTypeOf(); + expect(data.victoryDance).toBeDefined(); + expectTypeOf(data.victoryDance).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/MurderMystery/MurderMysteryGamemode.test.ts b/src/Structures/MiniGames/MurderMystery/MurderMysteryGamemode.test.ts new file mode 100644 index 000000000..4fc6b6da9 --- /dev/null +++ b/src/Structures/MiniGames/MurderMystery/MurderMysteryGamemode.test.ts @@ -0,0 +1,66 @@ +import MurderMysteryGamemode from './MurderMysteryGamemode.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('MurderMysteryGamemode', () => { + const data = new MurderMysteryGamemode({ stats: 'meow' }, 'MURDER_ASSASSINS', 'ancient_tomb'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(MurderMysteryGamemode); + expectTypeOf(data).toEqualTypeOf(); + expect(data.alphaWins).toBeDefined(); + expect(data.alphaWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.alphaWins).toEqualTypeOf(); + expect(data.bowKills).toBeDefined(); + expect(data.bowKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowKills).toEqualTypeOf(); + expect(data.tokensPickedUp).toBeDefined(); + expect(data.tokensPickedUp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tokensPickedUp).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.detectiveWins).toBeDefined(); + expect(data.detectiveWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.detectiveWins).toEqualTypeOf(); + expect(data.games).toBeDefined(); + expect(data.games).toBeGreaterThanOrEqual(0); + expectTypeOf(data.games).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.lastOneAlive).toBeDefined(); + expect(data.lastOneAlive).toBeGreaterThanOrEqual(0); + expectTypeOf(data.lastOneAlive).toEqualTypeOf(); + expect(data.longestTimeAsSurvivorSeconds).toBeDefined(); + expect(data.longestTimeAsSurvivorSeconds).toBeGreaterThanOrEqual(0); + expectTypeOf(data.longestTimeAsSurvivorSeconds).toEqualTypeOf(); + expect(data.murdererWins).toBeDefined(); + expect(data.murdererWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.murdererWins).toEqualTypeOf(); + expect(data.quickestDetectiveWinTimeSeconds).toBeDefined(); + expect(data.quickestDetectiveWinTimeSeconds).toBeGreaterThanOrEqual(0); + expectTypeOf(data.quickestDetectiveWinTimeSeconds).toEqualTypeOf(); + expect(data.quickestMurdererWinTimeSeconds).toBeDefined(); + expect(data.quickestMurdererWinTimeSeconds).toBeGreaterThanOrEqual(0); + expectTypeOf(data.quickestMurdererWinTimeSeconds).toEqualTypeOf(); + expect(data.quickestShowdownWinTimeSeconds).toBeDefined(); + expect(data.quickestShowdownWinTimeSeconds).toBeGreaterThanOrEqual(0); + expectTypeOf(data.quickestShowdownWinTimeSeconds).toEqualTypeOf(); + expect(data.showdownPotg).toBeDefined(); + expect(data.showdownPotg).toBeGreaterThanOrEqual(0); + expectTypeOf(data.showdownPotg).toEqualTypeOf(); + expect(data.suicides).toBeDefined(); + expect(data.suicides).toBeGreaterThanOrEqual(0); + expectTypeOf(data.suicides).toEqualTypeOf(); + expect(data.survivorWins).toBeDefined(); + expect(data.survivorWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.survivorWins).toEqualTypeOf(); + expect(data.totalTimeSurvivedSeconds).toBeDefined(); + expect(data.totalTimeSurvivedSeconds).toBeGreaterThanOrEqual(0); + expectTypeOf(data.totalTimeSurvivedSeconds).toEqualTypeOf(); + expect(data.wasHero).toBeDefined(); + expect(data.wasHero).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wasHero).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/MurderMystery/MurderMysteryGamemode.ts b/src/Structures/MiniGames/MurderMystery/MurderMysteryGamemode.ts index a88ae9d5c..8acb6b813 100644 --- a/src/Structures/MiniGames/MurderMystery/MurderMysteryGamemode.ts +++ b/src/Structures/MiniGames/MurderMystery/MurderMysteryGamemode.ts @@ -22,25 +22,25 @@ class MurderMysteryGamemode { wins: number; constructor(data: Record, gamemode: MurderMysteryMode, map?: MurderMysteryMapName) { const key = `${gamemode}${map ? `_${map}` : ''}`; - this.alphaWins = data?.[`alpha_wins_${key}`]; - this.bowKills = data?.[`bow_kills_${key}`]; - this.tokensPickedUp = data?.[`coins_pickedup_${key}`]; - this.deaths = data?.[`deaths_${key}`]; - this.detectiveWins = data?.[`detective_wins_${key}`]; - this.games = data?.[`games_${key}`]; - this.kills = data?.[`kills_${key}`]; - this.lastOneAlive = data?.[`last_one_alive_${key}`]; - this.longestTimeAsSurvivorSeconds = data?.[`longest_time_as_survivor_seconds_${key}`]; - this.murdererWins = data?.[`murderer_wins_${key}`]; - this.quickestDetectiveWinTimeSeconds = data?.[`quickest_detective_win_time_seconds_${key}`]; - this.quickestMurdererWinTimeSeconds = data?.[`quickest_murderer_win_time_seconds_${key}`]; - this.quickestShowdownWinTimeSeconds = data?.[`quickest_showdown_win_time_seconds_${key}`]; - this.showdownPotg = data?.[`showdown_potg_${key}`]; - this.suicides = data?.[`suicides_${key}`]; - this.survivorWins = data?.[`survivor_wins_${key}`]; - this.totalTimeSurvivedSeconds = data?.[`total_time_survived_seconds_${key}`]; - this.wasHero = data?.[`was_hero_${key}`]; - this.wins = data?.[`wins_${key}`]; + this.alphaWins = data?.[`alpha_wins_${key}`] || 0; + this.bowKills = data?.[`bow_kills_${key}`] || 0; + this.tokensPickedUp = data?.[`coins_pickedup_${key}`] || 0; + this.deaths = data?.[`deaths_${key}`] || 0; + this.detectiveWins = data?.[`detective_wins_${key}`] || 0; + this.games = data?.[`games_${key}`] || 0; + this.kills = data?.[`kills_${key}`] || 0; + this.lastOneAlive = data?.[`last_one_alive_${key}`] || 0; + this.longestTimeAsSurvivorSeconds = data?.[`longest_time_as_survivor_seconds_${key}`] || 0; + this.murdererWins = data?.[`murderer_wins_${key}`] || 0; + this.quickestDetectiveWinTimeSeconds = data?.[`quickest_detective_win_time_seconds_${key}`] || 0; + this.quickestMurdererWinTimeSeconds = data?.[`quickest_murderer_win_time_seconds_${key}`] || 0; + this.quickestShowdownWinTimeSeconds = data?.[`quickest_showdown_win_time_seconds_${key}`] || 0; + this.showdownPotg = data?.[`showdown_potg_${key}`] || 0; + this.suicides = data?.[`suicides_${key}`] || 0; + this.survivorWins = data?.[`survivor_wins_${key}`] || 0; + this.totalTimeSurvivedSeconds = data?.[`total_time_survived_seconds_${key}`] || 0; + this.wasHero = data?.[`was_hero_${key}`] || 0; + this.wins = data?.[`wins_${key}`] || 0; } } diff --git a/src/Structures/MiniGames/MurderMystery/MurderMysteryKnifeSkinPrestige.test.ts b/src/Structures/MiniGames/MurderMystery/MurderMysteryKnifeSkinPrestige.test.ts new file mode 100644 index 000000000..797e5eed9 --- /dev/null +++ b/src/Structures/MiniGames/MurderMystery/MurderMysteryKnifeSkinPrestige.test.ts @@ -0,0 +1,16 @@ +import MurderMysteryKnifeSkinPrestige from './MurderMysteryKnifeSkinPrestige.js'; +import MurderMysteryKnifeSkinPrestigeXp from './MurderMysteryKnifeSkinPrestigeXp.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { MurderMysteryKnifeSkinRaw } from '../../../Types/Player.js'; + +test('MurderMysteryKnifeSkinPrestige', () => { + const data = new MurderMysteryKnifeSkinPrestige({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(MurderMysteryKnifeSkinPrestige); + expectTypeOf(data).toEqualTypeOf(); + expect(data.usePrestige).toBeDefined(); + expectTypeOf(data.usePrestige).toEqualTypeOf(); + expect(data.xp).toBeDefined(); + expect(data.xp).toBeInstanceOf(MurderMysteryKnifeSkinPrestigeXp); + expectTypeOf(data.xp).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/MurderMystery/MurderMysteryKnifeSkinPrestigeXp.test.ts b/src/Structures/MiniGames/MurderMystery/MurderMysteryKnifeSkinPrestigeXp.test.ts new file mode 100644 index 000000000..2a4a55f5a --- /dev/null +++ b/src/Structures/MiniGames/MurderMystery/MurderMysteryKnifeSkinPrestigeXp.test.ts @@ -0,0 +1,138 @@ +import MurderMysteryKnifeSkinPrestigeXp from './MurderMysteryKnifeSkinPrestigeXp.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('MurderMysteryKnifeSkinPrestigeXp', () => { + const data = new MurderMysteryKnifeSkinPrestigeXp({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(MurderMysteryKnifeSkinPrestigeXp); + expectTypeOf(data).toEqualTypeOf(); + expect(data['10000Spoons']).toBeDefined(); + expect(data['10000Spoons']).toBeGreaterThanOrEqual(0); + expectTypeOf(data['10000Spoons']).toEqualTypeOf(); + expect(data.apple).toBeDefined(); + expect(data.apple).toBeGreaterThanOrEqual(0); + expectTypeOf(data.apple).toEqualTypeOf(); + expect(data.bastedTurkey).toBeDefined(); + expect(data.bastedTurkey).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bastedTurkey).toEqualTypeOf(); + expect(data.blazeStick).toBeDefined(); + expect(data.blazeStick).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blazeStick).toEqualTypeOf(); + expect(data.bloodyBrick).toBeDefined(); + expect(data.bloodyBrick).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bloodyBrick).toEqualTypeOf(); + expect(data.bone).toBeDefined(); + expect(data.bone).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bone).toEqualTypeOf(); + expect(data.campfireLeftovers).toBeDefined(); + expect(data.campfireLeftovers).toBeGreaterThanOrEqual(0); + expectTypeOf(data.campfireLeftovers).toEqualTypeOf(); + expect(data.carrotOnStick).toBeDefined(); + expect(data.carrotOnStick).toBeGreaterThanOrEqual(0); + expectTypeOf(data.carrotOnStick).toEqualTypeOf(); + expect(data.cheapo).toBeDefined(); + expect(data.cheapo).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cheapo).toEqualTypeOf(); + expect(data.cheese).toBeDefined(); + expect(data.cheese).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cheese).toEqualTypeOf(); + expect(data.chewedBush).toBeDefined(); + expect(data.chewedBush).toBeGreaterThanOrEqual(0); + expectTypeOf(data.chewedBush).toEqualTypeOf(); + expect(data.diamondShovel).toBeDefined(); + expect(data.diamondShovel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.diamondShovel).toEqualTypeOf(); + expect(data.doubleDeathScythe).toBeDefined(); + expect(data.doubleDeathScythe).toBeGreaterThanOrEqual(0); + expectTypeOf(data.doubleDeathScythe).toEqualTypeOf(); + expect(data.dragonEgg).toBeDefined(); + expect(data.dragonEgg).toBeGreaterThanOrEqual(0); + expectTypeOf(data.dragonEgg).toEqualTypeOf(); + expect(data.earthenDagger).toBeDefined(); + expect(data.earthenDagger).toBeGreaterThanOrEqual(0); + expectTypeOf(data.earthenDagger).toEqualTypeOf(); + expect(data.easterBasket).toBeDefined(); + expect(data.easterBasket).toBeGreaterThanOrEqual(0); + expectTypeOf(data.easterBasket).toEqualTypeOf(); + expect(data.farmingImplement).toBeDefined(); + expect(data.farmingImplement).toBeGreaterThanOrEqual(0); + expectTypeOf(data.farmingImplement).toEqualTypeOf(); + expect(data.feather).toBeDefined(); + expect(data.feather).toBeGreaterThanOrEqual(0); + expectTypeOf(data.feather).toEqualTypeOf(); + expect(data.fragilePlant).toBeDefined(); + expect(data.fragilePlant).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fragilePlant).toEqualTypeOf(); + expect(data.frisbee).toBeDefined(); + expect(data.frisbee).toBeGreaterThanOrEqual(0); + expectTypeOf(data.frisbee).toEqualTypeOf(); + expect(data.glisteningMelon).toBeDefined(); + expect(data.glisteningMelon).toBeGreaterThanOrEqual(0); + expectTypeOf(data.glisteningMelon).toEqualTypeOf(); + expect(data.goldDigger).toBeDefined(); + expect(data.goldDigger).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goldDigger).toEqualTypeOf(); + expect(data.grilledSteak).toBeDefined(); + expect(data.grilledSteak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.grilledSteak).toEqualTypeOf(); + expect(data.grimoire).toBeDefined(); + expect(data.grimoire).toBeGreaterThanOrEqual(0); + expectTypeOf(data.grimoire).toEqualTypeOf(); + expect(data.iceShard).toBeDefined(); + expect(data.iceShard).toBeGreaterThanOrEqual(0); + expectTypeOf(data.iceShard).toEqualTypeOf(); + expect(data.mouseTrap).toBeDefined(); + expect(data.mouseTrap).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mouseTrap).toEqualTypeOf(); + expect(data.prickly).toBeDefined(); + expect(data.prickly).toBeGreaterThanOrEqual(0); + expectTypeOf(data.prickly).toEqualTypeOf(); + expect(data.pumpkinPie).toBeDefined(); + expect(data.pumpkinPie).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pumpkinPie).toEqualTypeOf(); + expect(data.rudolphsNose).toBeDefined(); + expect(data.rudolphsNose).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rudolphsNose).toEqualTypeOf(); + expect(data.rudolphsSnack).toBeDefined(); + expect(data.rudolphsSnack).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rudolphsSnack).toEqualTypeOf(); + expect(data.salmon).toBeDefined(); + expect(data.salmon).toBeGreaterThanOrEqual(0); + expectTypeOf(data.salmon).toEqualTypeOf(); + expect(data.scythe).toBeDefined(); + expect(data.scythe).toBeGreaterThanOrEqual(0); + expectTypeOf(data.scythe).toEqualTypeOf(); + expect(data.shears).toBeDefined(); + expect(data.shears).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shears).toEqualTypeOf(); + expect(data.shinySnack).toBeDefined(); + expect(data.shinySnack).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shinySnack).toEqualTypeOf(); + expect(data.shovel).toBeDefined(); + expect(data.shovel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shovel).toEqualTypeOf(); + expect(data.shred).toBeDefined(); + expect(data.shred).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shred).toEqualTypeOf(); + expect(data.sprayPaintedShovel).toBeDefined(); + expect(data.sprayPaintedShovel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sprayPaintedShovel).toEqualTypeOf(); + expect(data.stake).toBeDefined(); + expect(data.stake).toBeGreaterThanOrEqual(0); + expectTypeOf(data.stake).toEqualTypeOf(); + expect(data.stick).toBeDefined(); + expect(data.stick).toBeGreaterThanOrEqual(0); + expectTypeOf(data.stick).toEqualTypeOf(); + expect(data.stickWithHat).toBeDefined(); + expect(data.stickWithHat).toBeGreaterThanOrEqual(0); + expectTypeOf(data.stickWithHat).toEqualTypeOf(); + expect(data.sweetTreat).toBeDefined(); + expect(data.sweetTreat).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sweetTreat).toEqualTypeOf(); + expect(data.timber).toBeDefined(); + expect(data.timber).toBeGreaterThanOrEqual(0); + expectTypeOf(data.timber).toEqualTypeOf(); + expect(data.woodAxe).toBeDefined(); + expect(data.woodAxe).toBeGreaterThanOrEqual(0); + expectTypeOf(data.woodAxe).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/MurderMystery/MurderMysteryMap.test.ts b/src/Structures/MiniGames/MurderMystery/MurderMysteryMap.test.ts new file mode 100644 index 000000000..31948ddeb --- /dev/null +++ b/src/Structures/MiniGames/MurderMystery/MurderMysteryMap.test.ts @@ -0,0 +1,85 @@ +import MurderMysteryGamemode from './MurderMysteryGamemode.js'; +import MurderMysteryMap from './MurderMysteryMap.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('MurderMysteryMap', () => { + const data = new MurderMysteryMap({ stats: 'meow' }, 'ancient_tomb'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(MurderMysteryMap); + expectTypeOf(data).toEqualTypeOf(); + expect(data.alphaWins).toBeDefined(); + expect(data.alphaWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.alphaWins).toEqualTypeOf(); + expect(data.bowKills).toBeDefined(); + expect(data.bowKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowKills).toEqualTypeOf(); + expect(data.tokensPickedUp).toBeDefined(); + expect(data.tokensPickedUp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tokensPickedUp).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.detectiveWins).toBeDefined(); + expect(data.detectiveWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.detectiveWins).toEqualTypeOf(); + expect(data.games).toBeDefined(); + expect(data.games).toBeGreaterThanOrEqual(0); + expectTypeOf(data.games).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.lastOneAlive).toBeDefined(); + expect(data.lastOneAlive).toBeGreaterThanOrEqual(0); + expectTypeOf(data.lastOneAlive).toEqualTypeOf(); + expect(data.longestTimeAsSurvivorSeconds).toBeDefined(); + expect(data.longestTimeAsSurvivorSeconds).toBeGreaterThanOrEqual(0); + expectTypeOf(data.longestTimeAsSurvivorSeconds).toEqualTypeOf(); + expect(data.murdererWins).toBeDefined(); + expect(data.murdererWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.murdererWins).toEqualTypeOf(); + expect(data.quickestDetectiveWinTimeSeconds).toBeDefined(); + expect(data.quickestDetectiveWinTimeSeconds).toBeGreaterThanOrEqual(0); + expectTypeOf(data.quickestDetectiveWinTimeSeconds).toEqualTypeOf(); + expect(data.quickestMurdererWinTimeSeconds).toBeDefined(); + expect(data.quickestMurdererWinTimeSeconds).toBeGreaterThanOrEqual(0); + expectTypeOf(data.quickestMurdererWinTimeSeconds).toEqualTypeOf(); + expect(data.quickestShowdownWinTimeSeconds).toBeDefined(); + expect(data.quickestShowdownWinTimeSeconds).toBeGreaterThanOrEqual(0); + expectTypeOf(data.quickestShowdownWinTimeSeconds).toEqualTypeOf(); + expect(data.showdownPotg).toBeDefined(); + expect(data.showdownPotg).toBeGreaterThanOrEqual(0); + expectTypeOf(data.showdownPotg).toEqualTypeOf(); + expect(data.suicides).toBeDefined(); + expect(data.suicides).toBeGreaterThanOrEqual(0); + expectTypeOf(data.suicides).toEqualTypeOf(); + expect(data.survivorWins).toBeDefined(); + expect(data.survivorWins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.survivorWins).toEqualTypeOf(); + expect(data.totalTimeSurvivedSeconds).toBeDefined(); + expect(data.totalTimeSurvivedSeconds).toBeGreaterThanOrEqual(0); + expectTypeOf(data.totalTimeSurvivedSeconds).toEqualTypeOf(); + expect(data.wasHero).toBeDefined(); + expect(data.wasHero).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wasHero).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.assassins).toBeDefined(); + expect(data.assassins).toBeInstanceOf(MurderMysteryGamemode); + expectTypeOf(data.assassins).toEqualTypeOf(); + expect(data.classic).toBeDefined(); + expect(data.classic).toBeInstanceOf(MurderMysteryGamemode); + expectTypeOf(data.classic).toEqualTypeOf(); + expect(data.doubleUp).toBeDefined(); + expect(data.doubleUp).toBeInstanceOf(MurderMysteryGamemode); + expectTypeOf(data.doubleUp).toEqualTypeOf(); + expect(data.hardcode).toBeDefined(); + expect(data.hardcode).toBeInstanceOf(MurderMysteryGamemode); + expectTypeOf(data.hardcode).toEqualTypeOf(); + expect(data.infection).toBeDefined(); + expect(data.infection).toBeInstanceOf(MurderMysteryGamemode); + expectTypeOf(data.infection).toEqualTypeOf(); + expect(data.showdown).toBeDefined(); + expect(data.showdown).toBeInstanceOf(MurderMysteryGamemode); + expectTypeOf(data.showdown).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/MurderMystery/MurderMysteryMap.ts b/src/Structures/MiniGames/MurderMystery/MurderMysteryMap.ts index 10c6bd6e3..c1136ccbc 100644 --- a/src/Structures/MiniGames/MurderMystery/MurderMysteryMap.ts +++ b/src/Structures/MiniGames/MurderMystery/MurderMysteryMap.ts @@ -28,25 +28,25 @@ class MurderMysteryMap { infection: MurderMysteryGamemode; showdown: MurderMysteryGamemode; constructor(data: Record, map: MurderMysteryMapName) { - this.alphaWins = data?.[`alpha_wins_${map}`]; - this.bowKills = data?.[`bow_kills_${map}`]; - this.tokensPickedUp = data?.[`coins_pickedup_${map}`]; - this.deaths = data?.[`deaths_${map}`]; - this.detectiveWins = data?.[`detective_wins_${map}`]; - this.games = data?.[`games_${map}`]; - this.kills = data?.[`kills_${map}`]; - this.lastOneAlive = data?.[`last_one_alive_${map}`]; - this.longestTimeAsSurvivorSeconds = data?.[`longest_time_as_survivor_seconds_${map}`]; - this.murdererWins = data?.[`murderer_wins_${map}`]; - this.quickestDetectiveWinTimeSeconds = data?.[`quickest_detective_win_time_seconds_${map}`]; - this.quickestMurdererWinTimeSeconds = data?.[`quickest_murderer_win_time_seconds_${map}`]; - this.quickestShowdownWinTimeSeconds = data?.[`quickest_showdown_win_time_seconds_${map}`]; - this.showdownPotg = data?.[`showdown_potg_${map}`]; - this.suicides = data?.[`suicides_${map}`]; - this.survivorWins = data?.[`survivor_wins_${map}`]; - this.totalTimeSurvivedSeconds = data?.[`total_time_survived_seconds_${map}`]; - this.wasHero = data?.[`was_hero_${map}`]; - this.wins = data?.[`wins_${map}`]; + this.alphaWins = data?.[`alpha_wins_${map}`] || 0; + this.bowKills = data?.[`bow_kills_${map}`] || 0; + this.tokensPickedUp = data?.[`coins_pickedup_${map}`] || 0; + this.deaths = data?.[`deaths_${map}`] || 0; + this.detectiveWins = data?.[`detective_wins_${map}`] || 0; + this.games = data?.[`games_${map}`] || 0; + this.kills = data?.[`kills_${map}`] || 0; + this.lastOneAlive = data?.[`last_one_alive_${map}`] || 0; + this.longestTimeAsSurvivorSeconds = data?.[`longest_time_as_survivor_seconds_${map}`] || 0; + this.murdererWins = data?.[`murderer_wins_${map}`] || 0; + this.quickestDetectiveWinTimeSeconds = data?.[`quickest_detective_win_time_seconds_${map}`] || 0; + this.quickestMurdererWinTimeSeconds = data?.[`quickest_murderer_win_time_seconds_${map}`] || 0; + this.quickestShowdownWinTimeSeconds = data?.[`quickest_showdown_win_time_seconds_${map}`] || 0; + this.showdownPotg = data?.[`showdown_potg_${map}`] || 0; + this.suicides = data?.[`suicides_${map}`] || 0; + this.survivorWins = data?.[`survivor_wins_${map}`] || 0; + this.totalTimeSurvivedSeconds = data?.[`total_time_survived_seconds_${map}`] || 0; + this.wasHero = data?.[`was_hero_${map}`] || 0; + this.wins = data?.[`wins_${map}`] || 0; this.assassins = new MurderMysteryGamemode(data, 'MURDER_ASSASSINS', map); this.classic = new MurderMysteryGamemode(data, 'MURDER_CLASSIC', map); this.doubleUp = new MurderMysteryGamemode(data, 'MURDER_DOUBLE_UP', map); diff --git a/src/Structures/MiniGames/Paintball.test.ts b/src/Structures/MiniGames/Paintball.test.ts index 0a67a484f..0274ecb3a 100644 --- a/src/Structures/MiniGames/Paintball.test.ts +++ b/src/Structures/MiniGames/Paintball.test.ts @@ -1,5 +1,6 @@ import Paintball from './Paintball.js'; import { expect, expectTypeOf, test } from 'vitest'; +import type { PaintballHats } from '../../Types/Player.js'; test('Paintball', () => { const data = new Paintball({ stats: 'meow' }); @@ -31,6 +32,7 @@ test('Paintball', () => { expect(data.forceFieldTime).toBeGreaterThanOrEqual(0); expectTypeOf(data.forceFieldTime).toEqualTypeOf(); expect(data.hat).toBeDefined(); + expectTypeOf(data.hat).toEqualTypeOf(); expect(data.adrenaline).toBeDefined(); expect(data.adrenaline).toBeGreaterThanOrEqual(0); expectTypeOf(data.adrenaline).toEqualTypeOf(); diff --git a/src/Structures/MiniGames/Pit/Pit.test.ts b/src/Structures/MiniGames/Pit/Pit.test.ts index 669bcdc1d..c71d54ac4 100644 --- a/src/Structures/MiniGames/Pit/Pit.test.ts +++ b/src/Structures/MiniGames/Pit/Pit.test.ts @@ -1,4 +1,3 @@ -import Client from '../../../Client.js'; import Pit from './Pit.js'; import PitInventoryItem from './PitInventoryItem.js'; import { expect, expectTypeOf, test } from 'vitest'; @@ -6,218 +5,91 @@ import type { PitArmor } from '../../../Types/Player.js'; test('Pit', () => { const data = new Pit({ stats: 'meow' }); + expect(data).toBeDefined(); expect(data).toBeInstanceOf(Pit); + expectTypeOf(data).toEqualTypeOf(); expect(data.prestige).toBeDefined(); - expectTypeOf(data.prestige).toEqualTypeOf(); expect(data.prestige).toBeGreaterThanOrEqual(0); + expectTypeOf(data.prestige).toEqualTypeOf(); expect(data.xp).toBeDefined(); - expectTypeOf(data.xp).toEqualTypeOf(); expect(data.xp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.xp).toEqualTypeOf(); expect(data.level).toBeDefined(); - expectTypeOf(data.level).toEqualTypeOf(); expect(data.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.level).toEqualTypeOf(); expect(data.kills).toBeDefined(); - expectTypeOf(data.kills).toEqualTypeOf(); expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); expect(data.deaths).toBeDefined(); - expectTypeOf(data.deaths).toEqualTypeOf(); expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); expect(data.KDR).toBeDefined(); - expectTypeOf(data.KDR).toEqualTypeOf(); expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); expect(data.assists).toBeDefined(); - expectTypeOf(data.assists).toEqualTypeOf(); expect(data.assists).toBeGreaterThanOrEqual(0); + expectTypeOf(data.assists).toEqualTypeOf(); expect(data.maxKillStreak).toBeDefined(); - expectTypeOf(data.maxKillStreak).toEqualTypeOf(); expect(data.maxKillStreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.maxKillStreak).toEqualTypeOf(); expect(data.playtime).toBeDefined(); - expectTypeOf(data.playtime).toEqualTypeOf(); expect(data.playtime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playtime).toEqualTypeOf(); expect(data.joins).toBeDefined(); - expectTypeOf(data.joins).toEqualTypeOf(); expect(data.joins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.joins).toEqualTypeOf(); expect(data.damageReceived).toBeDefined(); - expectTypeOf(data.damageReceived).toEqualTypeOf(); expect(data.damageReceived).toBeGreaterThanOrEqual(0); + expectTypeOf(data.damageReceived).toEqualTypeOf(); expect(data.damageDealt).toBeDefined(); - expectTypeOf(data.damageDealt).toEqualTypeOf(); expect(data.damageDealt).toBeGreaterThanOrEqual(0); + expectTypeOf(data.damageDealt).toEqualTypeOf(); expect(data.damageRatio).toBeDefined(); - expectTypeOf(data.damageRatio).toEqualTypeOf(); expect(data.damageRatio).toBeGreaterThanOrEqual(0); + expectTypeOf(data.damageRatio).toEqualTypeOf(); expect(data.meleeDamageReceived).toBeDefined(); - expectTypeOf(data.meleeDamageReceived).toEqualTypeOf(); expect(data.meleeDamageReceived).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meleeDamageReceived).toEqualTypeOf(); expect(data.meleeDamageDealt).toBeDefined(); - expectTypeOf(data.meleeDamageDealt).toEqualTypeOf(); expect(data.meleeDamageDealt).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meleeDamageDealt).toEqualTypeOf(); expect(data.swordHits).toBeDefined(); - expectTypeOf(data.swordHits).toEqualTypeOf(); expect(data.swordHits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.swordHits).toEqualTypeOf(); expect(data.leftClicks).toBeDefined(); - expectTypeOf(data.leftClicks).toEqualTypeOf(); expect(data.leftClicks).toBeGreaterThanOrEqual(0); + expectTypeOf(data.leftClicks).toEqualTypeOf(); expect(data.meleeAccuracy).toBeDefined(); - expectTypeOf(data.meleeAccuracy).toEqualTypeOf(); expect(data.meleeAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meleeAccuracy).toEqualTypeOf(); expect(data.meleeDamageRatio).toBeDefined(); - expectTypeOf(data.meleeDamageRatio).toEqualTypeOf(); expect(data.meleeDamageRatio).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meleeDamageRatio).toEqualTypeOf(); expect(data.bowDamageReceived).toBeDefined(); - expectTypeOf(data.bowDamageReceived).toEqualTypeOf(); expect(data.bowDamageReceived).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowDamageReceived).toEqualTypeOf(); expect(data.bowDamageDealt).toBeDefined(); - expectTypeOf(data.bowDamageDealt).toEqualTypeOf(); expect(data.bowDamageDealt).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowDamageDealt).toEqualTypeOf(); expect(data.arrowsHit).toBeDefined(); - expectTypeOf(data.arrowsHit).toEqualTypeOf(); expect(data.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arrowsHit).toEqualTypeOf(); expect(data.arrowsFired).toBeDefined(); - expectTypeOf(data.arrowsFired).toEqualTypeOf(); expect(data.arrowsFired).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arrowsFired).toEqualTypeOf(); expect(data.bowAccuracy).toBeDefined(); - expectTypeOf(data.bowAccuracy).toEqualTypeOf(); expect(data.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowAccuracy).toEqualTypeOf(); expect(data.bowDamageRatio).toBeDefined(); - expectTypeOf(data.bowDamageRatio).toEqualTypeOf(); expect(data.bowDamageRatio).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowDamageRatio).toEqualTypeOf(); expect(data.goldenHeadsEaten).toBeDefined(); - expectTypeOf(data.goldenHeadsEaten).toEqualTypeOf(); expect(data.goldenHeadsEaten).toBeGreaterThanOrEqual(0); -}); - -test('Pit Inventory', async () => { - const client = new Client(process.env.HYPIXEL_KEY ?? '', { cache: false, checkForUpdates: false, rateLimit: 'NONE' }); - client.requestHandler.setBaseURL(process.env.HYPIXEL_URL); - const data = await client.getPlayer('3457688aa57c4d71ab9d22b04f9160db'); - expect(data.isRaw()).toBe(false); - if (data.isRaw()) return; - expect(data.stats.Pit.getInventory).toBeDefined(); - expectTypeOf(data.stats.Pit.getInventory).toEqualTypeOf<() => Promise>(); - expect(data.stats.Pit.getInventory).toBeInstanceOf(Function); - const pitInventory = await data.stats.Pit.getInventory(); - expect(pitInventory).toBeDefined(); - pitInventory.forEach((item: PitInventoryItem) => { - expect(item).toBeDefined(); - expect(item).toBeInstanceOf(PitInventoryItem); - expectTypeOf(item).toEqualTypeOf(); - expect(item.itemId).toBeDefined(); - expectTypeOf(item.itemId).toEqualTypeOf(); - expect(item.count).toBeDefined(); - expectTypeOf(item.count).toEqualTypeOf(); - expect(item.name).toBeDefined(); - expectTypeOf(item.name).toEqualTypeOf(); - expect(item.lore).toBeDefined(); - expectTypeOf(item.lore).toEqualTypeOf(); - expect(item.loreArray).toBeDefined(); - expectTypeOf(item.loreArray).toEqualTypeOf(); - expect(item.extraAttributes).toBeDefined(); - expectTypeOf(item.extraAttributes).toEqualTypeOf(); - }); - expect(data.stats.Pit.getEnterChest).toBeDefined(); - expectTypeOf(data.stats.Pit.getEnterChest).toEqualTypeOf<() => Promise>(); - expect(data.stats.Pit.getEnterChest).toBeInstanceOf(Function); - const pitEnterChest = await data.stats.Pit.getEnterChest(); - expect(pitEnterChest).toBeDefined(); - pitEnterChest.forEach((item: PitInventoryItem) => { - expect(item).toBeDefined(); - expect(item).toBeInstanceOf(PitInventoryItem); - expectTypeOf(item).toEqualTypeOf(); - expect(item.itemId).toBeDefined(); - expectTypeOf(item.itemId).toEqualTypeOf(); - expect(item.count).toBeDefined(); - expectTypeOf(item.count).toEqualTypeOf(); - expect(item.name).toBeDefined(); - expectTypeOf(item.name).toEqualTypeOf(); - expect(item.lore).toBeDefined(); - expectTypeOf(item.lore).toEqualTypeOf(); - expect(item.loreArray).toBeDefined(); - expectTypeOf(item.loreArray).toEqualTypeOf(); - expect(item.extraAttributes).toBeDefined(); - expectTypeOf(item.extraAttributes).toEqualTypeOf(); - }); - expect(data.stats.Pit.getArmor).toBeDefined(); - expectTypeOf(data.stats.Pit.getArmor).toEqualTypeOf<() => Promise>(); - expect(data.stats.Pit.getArmor).toBeInstanceOf(Function); - const pitArmor = await data.stats.Pit.getArmor(); - expect(pitArmor).toBeDefined(); - expectTypeOf(pitArmor).toEqualTypeOf(); - expect(pitArmor.helmet).toBeDefined(); - expectTypeOf(pitArmor.helmet).toEqualTypeOf(); - if (pitArmor.helmet !== null) { - expect(pitArmor.helmet).toBeDefined(); - expect(pitArmor.helmet).toBeInstanceOf(PitInventoryItem); - expectTypeOf(pitArmor.helmet).toEqualTypeOf(); - expect(pitArmor.helmet.itemId).toBeDefined(); - expectTypeOf(pitArmor.helmet.itemId).toEqualTypeOf(); - expect(pitArmor.helmet.count).toBeDefined(); - expectTypeOf(pitArmor.helmet.count).toEqualTypeOf(); - expect(pitArmor.helmet.name).toBeDefined(); - expectTypeOf(pitArmor.helmet.name).toEqualTypeOf(); - expect(pitArmor.helmet.lore).toBeDefined(); - expectTypeOf(pitArmor.helmet.lore).toEqualTypeOf(); - expect(pitArmor.helmet.loreArray).toBeDefined(); - expectTypeOf(pitArmor.helmet.loreArray).toEqualTypeOf(); - expect(pitArmor.helmet.extraAttributes).toBeDefined(); - expectTypeOf(pitArmor.helmet.extraAttributes).toEqualTypeOf(); - } - expect(pitArmor.chestplate).toBeDefined(); - expectTypeOf(pitArmor.chestplate).toEqualTypeOf(); - if (pitArmor.chestplate !== null) { - expect(pitArmor.chestplate).toBeDefined(); - expect(pitArmor.chestplate).toBeInstanceOf(PitInventoryItem); - expectTypeOf(pitArmor.chestplate).toEqualTypeOf(); - expect(pitArmor.chestplate.itemId).toBeDefined(); - expectTypeOf(pitArmor.chestplate.itemId).toEqualTypeOf(); - expect(pitArmor.chestplate.count).toBeDefined(); - expectTypeOf(pitArmor.chestplate.count).toEqualTypeOf(); - expect(pitArmor.chestplate.name).toBeDefined(); - expectTypeOf(pitArmor.chestplate.name).toEqualTypeOf(); - expect(pitArmor.chestplate.lore).toBeDefined(); - expectTypeOf(pitArmor.chestplate.lore).toEqualTypeOf(); - expect(pitArmor.chestplate.loreArray).toBeDefined(); - expectTypeOf(pitArmor.chestplate.loreArray).toEqualTypeOf(); - expect(pitArmor.chestplate.extraAttributes).toBeDefined(); - expectTypeOf(pitArmor.chestplate.extraAttributes).toEqualTypeOf(); - } - expect(pitArmor.leggings).toBeDefined(); - expectTypeOf(pitArmor.leggings).toEqualTypeOf(); - if (pitArmor.leggings !== null) { - expect(pitArmor.leggings).toBeDefined(); - expect(pitArmor.leggings).toBeInstanceOf(PitInventoryItem); - expectTypeOf(pitArmor.leggings).toEqualTypeOf(); - expect(pitArmor.leggings.itemId).toBeDefined(); - expectTypeOf(pitArmor.leggings.itemId).toEqualTypeOf(); - expect(pitArmor.leggings.count).toBeDefined(); - expectTypeOf(pitArmor.leggings.count).toEqualTypeOf(); - expect(pitArmor.leggings.name).toBeDefined(); - expectTypeOf(pitArmor.leggings.name).toEqualTypeOf(); - expect(pitArmor.leggings.lore).toBeDefined(); - expectTypeOf(pitArmor.leggings.lore).toEqualTypeOf(); - expect(pitArmor.leggings.loreArray).toBeDefined(); - expectTypeOf(pitArmor.leggings.loreArray).toEqualTypeOf(); - expect(pitArmor.leggings.extraAttributes).toBeDefined(); - expectTypeOf(pitArmor.leggings.extraAttributes).toEqualTypeOf(); - } - expect(pitArmor.boots).toBeDefined(); - expectTypeOf(pitArmor.boots).toEqualTypeOf(); - if (pitArmor.boots !== null) { - expect(pitArmor.boots).toBeDefined(); - expect(pitArmor.boots).toBeInstanceOf(PitInventoryItem); - expectTypeOf(pitArmor.boots).toEqualTypeOf(); - expect(pitArmor.boots.itemId).toBeDefined(); - expectTypeOf(pitArmor.boots.itemId).toEqualTypeOf(); - expect(pitArmor.boots.count).toBeDefined(); - expectTypeOf(pitArmor.boots.count).toEqualTypeOf(); - expect(pitArmor.boots.name).toBeDefined(); - expectTypeOf(pitArmor.boots.name).toEqualTypeOf(); - expect(pitArmor.boots.lore).toBeDefined(); - expectTypeOf(pitArmor.boots.lore).toEqualTypeOf(); - expect(pitArmor.boots.loreArray).toBeDefined(); - expectTypeOf(pitArmor.boots.loreArray).toEqualTypeOf(); - expect(pitArmor.boots.extraAttributes).toBeDefined(); - expectTypeOf(pitArmor.boots.extraAttributes).toEqualTypeOf(); - } - client.destroy(); + expectTypeOf(data.goldenHeadsEaten).toEqualTypeOf(); + expect(data.getInventory).toBeDefined(); + expectTypeOf(data.getInventory).toEqualTypeOf<() => Promise>(); + expect(data.getEnterChest).toBeDefined(); + expectTypeOf(data.getEnterChest).toEqualTypeOf<() => Promise>(); + expect(data.getArmor).toBeDefined(); + expectTypeOf(data.getArmor).toEqualTypeOf<() => Promise>(); }); diff --git a/src/Structures/MiniGames/Pit/PitInventoryItem.test.ts b/src/Structures/MiniGames/Pit/PitInventoryItem.test.ts new file mode 100644 index 000000000..88e830cec --- /dev/null +++ b/src/Structures/MiniGames/Pit/PitInventoryItem.test.ts @@ -0,0 +1,23 @@ +import PitInventoryItem from './PitInventoryItem.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('PitInventoryItem', () => { + const data = new PitInventoryItem({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(PitInventoryItem); + expectTypeOf(data).toEqualTypeOf(); + expect(data.itemId).toBeDefined(); + expect(data.itemId).toBeGreaterThanOrEqual(0); + expectTypeOf(data.itemId).toEqualTypeOf(); + expect(data.count).toBeDefined(); + expect(data.count).toBeGreaterThanOrEqual(0); + expectTypeOf(data.count).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.lore).toBeDefined(); + expectTypeOf(data.lore).toEqualTypeOf(); + expect(data.loreArray).toBeDefined(); + expectTypeOf(data.loreArray).toEqualTypeOf(); + expect(data.extraAttributes).toBeDefined(); + expectTypeOf(data.extraAttributes).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Quakecraft/Quakecraft.test.ts b/src/Structures/MiniGames/Quakecraft/Quakecraft.test.ts index 7193fe0a8..20c4aea6c 100644 --- a/src/Structures/MiniGames/Quakecraft/Quakecraft.test.ts +++ b/src/Structures/MiniGames/Quakecraft/Quakecraft.test.ts @@ -20,8 +20,10 @@ test('Quakecraft', () => { expect(data.coins).toBeGreaterThanOrEqual(0); expectTypeOf(data.coins).toEqualTypeOf(); expect(data.solo).toBeDefined(); + expect(data.solo).toBeInstanceOf(QuakecraftMode); expectTypeOf(data.solo).toEqualTypeOf(); expect(data.teams).toBeDefined(); + expect(data.teams).toBeInstanceOf(QuakecraftMode); expectTypeOf(data.teams).toEqualTypeOf(); expect(data.wins).toBeDefined(); expect(data.wins).toBeGreaterThanOrEqual(0); diff --git a/src/Structures/MiniGames/Shared/Emblem/Emblem.test.ts b/src/Structures/MiniGames/Shared/Emblem/Emblem.test.ts new file mode 100644 index 000000000..c247e8018 --- /dev/null +++ b/src/Structures/MiniGames/Shared/Emblem/Emblem.test.ts @@ -0,0 +1,19 @@ +import Emblem from './Emblem.js'; +import EmblemColors from './EmblemColors.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { BuildBattleEmblemIcon } from '../../../../Types/Player.ts'; +import type { ColorCode } from '../../../../Types/Color.js'; + +test('Emblem', () => { + const data = new Emblem({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Emblem); + expectTypeOf(data).toEqualTypeOf>(); + expect(data.colorUnlocked).toBeDefined(); + expect(data.colorUnlocked).toBeInstanceOf(EmblemColors); + expectTypeOf(data.colorUnlocked).toEqualTypeOf(); + expect(data.selectedColor).toBeDefined(); + expectTypeOf(data.selectedColor).toEqualTypeOf(); + expect(data.selectedIcon).toBeDefined(); + expectTypeOf(data.selectedIcon).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Shared/Emblem/EmblemColors.test.ts b/src/Structures/MiniGames/Shared/Emblem/EmblemColors.test.ts new file mode 100644 index 000000000..ffd5aa1ed --- /dev/null +++ b/src/Structures/MiniGames/Shared/Emblem/EmblemColors.test.ts @@ -0,0 +1,37 @@ +import EmblemColors from './EmblemColors.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('EmblemColors', () => { + const data = new EmblemColors({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(EmblemColors); + expectTypeOf(data).toEqualTypeOf(); + expect(data.aqua).toBeDefined(); + expectTypeOf(data.aqua).toEqualTypeOf(); + expect(data.black).toBeDefined(); + expectTypeOf(data.black).toEqualTypeOf(); + expect(data.blue).toBeDefined(); + expectTypeOf(data.blue).toEqualTypeOf(); + expect(data.darkAqua).toBeDefined(); + expectTypeOf(data.darkAqua).toEqualTypeOf(); + expect(data.darkBlue).toBeDefined(); + expectTypeOf(data.darkBlue).toEqualTypeOf(); + expect(data.darkGray).toBeDefined(); + expectTypeOf(data.darkGray).toEqualTypeOf(); + expect(data.darkGreen).toBeDefined(); + expectTypeOf(data.darkGreen).toEqualTypeOf(); + expect(data.darkPurple).toBeDefined(); + expectTypeOf(data.darkPurple).toEqualTypeOf(); + expect(data.darkRed).toBeDefined(); + expectTypeOf(data.darkRed).toEqualTypeOf(); + expect(data.gray).toBeDefined(); + expectTypeOf(data.gray).toEqualTypeOf(); + expect(data.green).toBeDefined(); + expectTypeOf(data.green).toEqualTypeOf(); + expect(data.lightPurple).toBeDefined(); + expectTypeOf(data.lightPurple).toEqualTypeOf(); + expect(data.red).toBeDefined(); + expectTypeOf(data.red).toEqualTypeOf(); + expect(data.yellow).toBeDefined(); + expectTypeOf(data.yellow).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Shared/LeaderboardSettings.test.ts b/src/Structures/MiniGames/Shared/LeaderboardSettings.test.ts new file mode 100644 index 000000000..bb0b4c018 --- /dev/null +++ b/src/Structures/MiniGames/Shared/LeaderboardSettings.test.ts @@ -0,0 +1,14 @@ +import LeaderboardSettings from './LeaderboardSettings.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { BuildBattleLeaderboardSettingsMode, LeaderboardSettingsResetType } from '../../../Types/Player.js'; + +test('LeaderboardSettings', () => { + const data = new LeaderboardSettings({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(LeaderboardSettings); + expectTypeOf(data).toEqualTypeOf>(); + expect(data.mode).toBeDefined(); + expectTypeOf(data.mode).toEqualTypeOf(); + expect(data.resetType).toBeDefined(); + expectTypeOf(data.resetType).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/Skywars.test.ts b/src/Structures/MiniGames/SkyWars/SkyWars.test.ts similarity index 95% rename from src/Structures/MiniGames/SkyWars/Skywars.test.ts rename to src/Structures/MiniGames/SkyWars/SkyWars.test.ts index 4b59d5502..a3cc4443e 100644 --- a/src/Structures/MiniGames/SkyWars/Skywars.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWars.test.ts @@ -128,15 +128,21 @@ test('SkyWars', () => { expect(data.enderpearlsThrown).toBeGreaterThanOrEqual(0); expectTypeOf(data.enderpearlsThrown).toEqualTypeOf(); expect(data.solo).toBeDefined(); + expect(data.solo).toBeInstanceOf(SkyWarsModeStats); expectTypeOf(data.solo).toEqualTypeOf(); expect(data.team).toBeDefined(); + expect(data.team).toBeInstanceOf(SkyWarsModeStats); expectTypeOf(data.team).toEqualTypeOf(); expect(data.mega).toBeDefined(); + expect(data.mega).toBeInstanceOf(SkyWarsMode); expectTypeOf(data.mega).toEqualTypeOf(); expect(data.megaDoubles).toBeDefined(); + expect(data.megaDoubles).toBeInstanceOf(SkyWarsMode); expectTypeOf(data.megaDoubles).toEqualTypeOf(); expect(data.lab).toBeDefined(); + expect(data.lab).toBeInstanceOf(SkyWarsMode); expectTypeOf(data.lab).toEqualTypeOf(); expect(data.packages).toBeDefined(); + expect(data.packages).toBeInstanceOf(SkyWarsPackages); expectTypeOf(data.packages).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsMode.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsMode.test.ts index a3fadb4cd..6a40af230 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsMode.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsMode.test.ts @@ -1,7 +1,7 @@ import SkyWarsMode from './SkyWarsMode.js'; import { expect, expectTypeOf, test } from 'vitest'; -test('SkyWars (Mode)', () => { +test('SkyWarsMode', () => { const data = new SkyWarsMode({ stats: 'meow' }, 'lab'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyWarsMode); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsModeStats.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsModeStats.test.ts index 3b5024fab..2dc0d5948 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsModeStats.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsModeStats.test.ts @@ -3,7 +3,7 @@ import SkyWarsModeStats from './SkyWarsModeStats.js'; import { expect, expectTypeOf, test } from 'vitest'; import type { SkyWarsKitNames } from '../../../Types/Player.js'; -test('SkyWars (Mode Stats)', () => { +test('SkyWarsModeStats', () => { const data = new SkyWarsModeStats({ stats: 'meow' }, 'solo'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyWarsModeStats); @@ -80,7 +80,9 @@ test('SkyWars (Mode Stats)', () => { expect(data.heads).toBeGreaterThanOrEqual(0); expectTypeOf(data.heads).toEqualTypeOf(); expect(data.normal).toBeDefined(); + expect(data.normal).toBeInstanceOf(SkyWarsMode); expectTypeOf(data.normal).toEqualTypeOf(); expect(data.insane).toBeDefined(); + expect(data.insane).toBeInstanceOf(SkyWarsMode); expectTypeOf(data.insane).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsPackages.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsPackages.test.ts new file mode 100644 index 000000000..24f45d741 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsPackages.test.ts @@ -0,0 +1,19 @@ +import SkyWarsKits from './SkyWarsKits.js'; +import SkyWarsPackages from './SkyWarsPackages.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsPackages', () => { + const data = new SkyWarsPackages([]); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsPackages); + expectTypeOf(data).toEqualTypeOf(); + expect(data.rawPackages).toBeDefined(); + expectTypeOf(data.rawPackages).toEqualTypeOf>(); + expect(data.cages).toBeDefined(); + expectTypeOf(data.cages).toEqualTypeOf(); + expect(data.kits).toBeDefined(); + expect(data.kits).toBeInstanceOf(SkyWarsKits); + expectTypeOf(data.kits).toEqualTypeOf(); + expect(data.achievements).toBeDefined(); + expectTypeOf(data.achievements).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsPackages.ts b/src/Structures/MiniGames/SkyWars/SkyWarsPackages.ts index 7f1f934fa..1ae830715 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsPackages.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsPackages.ts @@ -5,8 +5,8 @@ class SkyWarsPackages { cages: any; kits: SkyWarsKits; achievements: any; - constructor(data: Record) { - this.rawPackages = data; + constructor(data: Record[]) { + this.rawPackages = data || []; this.cages = this.parseCages(); this.kits = new SkyWarsKits(data); this.achievements = this.rawPackages diff --git a/src/Structures/MiniGames/SmashHeroes/SmashHeoresHero.test.ts b/src/Structures/MiniGames/SmashHeroes/SmashHeoresHero.test.ts new file mode 100644 index 000000000..a4a1580d9 --- /dev/null +++ b/src/Structures/MiniGames/SmashHeroes/SmashHeoresHero.test.ts @@ -0,0 +1,42 @@ +import SmashHeoresHero from './SmashHeoresHero.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { SmashHeoresHeros } from '../../../Types/Player.js'; + +test('SmashHeoresHero', () => { + const data = new SmashHeoresHero({ stats: 'meow' }, 'BOTMUN'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SmashHeoresHero); + expectTypeOf(data).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expect(data.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.xp).toBeDefined(); + expect(data.xp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.xp).toEqualTypeOf(); + expect(data.prestige).toBeDefined(); + expect(data.prestige).toBeGreaterThanOrEqual(0); + expectTypeOf(data.prestige).toEqualTypeOf(); + expect(data.playedGames).toBeDefined(); + expect(data.playedGames).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playedGames).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SmashHeroes/SmashHeroes.test.ts b/src/Structures/MiniGames/SmashHeroes/SmashHeroes.test.ts index 650772d0d..30ed3b76d 100644 --- a/src/Structures/MiniGames/SmashHeroes/SmashHeroes.test.ts +++ b/src/Structures/MiniGames/SmashHeroes/SmashHeroes.test.ts @@ -43,43 +43,62 @@ test('SmashHeroes', () => { expect(data.smashed).toBeGreaterThanOrEqual(0); expectTypeOf(data.smashed).toEqualTypeOf(); expect(data['1v1v1v1']).toBeDefined(); + expect(data['1v1v1v1']).toBeInstanceOf(SmashHeroesMode); expectTypeOf(data['1v1v1v1']).toEqualTypeOf(); expect(data['2v2']).toBeDefined(); + expect(data['2v2']).toBeInstanceOf(SmashHeroesMode); expectTypeOf(data['2v2']).toEqualTypeOf(); expect(data['2v2v2']).toBeDefined(); + expect(data['2v2v2']).toBeInstanceOf(SmashHeroesMode); expectTypeOf(data['2v2v2']).toEqualTypeOf(); expect(data.activeHero).toBeDefined(); expectTypeOf(data.activeHero).toEqualTypeOf(); expect(data.theBulk).toBeDefined(); + expect(data.theBulk).toBeInstanceOf(SmashHeoresHero); expectTypeOf(data.theBulk).toEqualTypeOf(); expect(data.cakeMonster).toBeDefined(); + expect(data.cakeMonster).toBeInstanceOf(SmashHeoresHero); expectTypeOf(data.cakeMonster).toEqualTypeOf(); expect(data.generalCluck).toBeDefined(); + expect(data.generalCluck).toBeInstanceOf(SmashHeoresHero); expectTypeOf(data.generalCluck).toEqualTypeOf(); expect(data.botmun).toBeDefined(); + expect(data.botmun).toBeInstanceOf(SmashHeoresHero); expectTypeOf(data.botmun).toEqualTypeOf(); expect(data.marauder).toBeDefined(); + expect(data.marauder).toBeInstanceOf(SmashHeoresHero); expectTypeOf(data.marauder).toEqualTypeOf(); expect(data.pug).toBeDefined(); + expect(data.pug).toBeInstanceOf(SmashHeoresHero); expectTypeOf(data.pug).toEqualTypeOf(); expect(data.tinman).toBeDefined(); + expect(data.tinman).toBeInstanceOf(SmashHeoresHero); expectTypeOf(data.tinman).toEqualTypeOf(); expect(data.spoderman).toBeDefined(); + expect(data.spoderman).toBeInstanceOf(SmashHeoresHero); expectTypeOf(data.spoderman).toEqualTypeOf(); expect(data.frosty).toBeDefined(); + expect(data.frosty).toBeInstanceOf(SmashHeoresHero); expectTypeOf(data.frosty).toEqualTypeOf(); expect(data.sergeantShield).toBeDefined(); + expect(data.sergeantShield).toBeInstanceOf(SmashHeoresHero); expectTypeOf(data.sergeantShield).toEqualTypeOf(); expect(data.skullfire).toBeDefined(); + expect(data.skullfire).toBeInstanceOf(SmashHeoresHero); expectTypeOf(data.skullfire).toEqualTypeOf(); expect(data.goku).toBeDefined(); + expect(data.goku).toBeInstanceOf(SmashHeoresHero); expectTypeOf(data.goku).toEqualTypeOf(); expect(data.sanic).toBeDefined(); + expect(data.sanic).toBeInstanceOf(SmashHeoresHero); expectTypeOf(data.sanic).toEqualTypeOf(); expect(data.duskCrawler).toBeDefined(); + expect(data.duskCrawler).toBeInstanceOf(SmashHeoresHero); expectTypeOf(data.duskCrawler).toEqualTypeOf(); expect(data.shoopDaWhoop).toBeDefined(); + expect(data.shoopDaWhoop).toBeInstanceOf(SmashHeoresHero); expectTypeOf(data.shoopDaWhoop).toEqualTypeOf(); expect(data.greenHood).toBeDefined(); + expect(data.greenHood).toBeInstanceOf(SmashHeoresHero); expectTypeOf(data.greenHood).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/SmashHeroes/SmashHeroesMode.test.ts b/src/Structures/MiniGames/SmashHeroes/SmashHeroesMode.test.ts new file mode 100644 index 000000000..420ba1a68 --- /dev/null +++ b/src/Structures/MiniGames/SmashHeroes/SmashHeroesMode.test.ts @@ -0,0 +1,27 @@ +import SmashHeroesMode from './SmashHeroesMode.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SmashHeroesMode', () => { + const data = new SmashHeroesMode({ stats: 'meow' }, '2v2'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SmashHeroesMode); + expectTypeOf(data).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLR).toBeDefined(); + expect(data.WLR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLR).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SpeedUHC/SpeedUHC.test.ts b/src/Structures/MiniGames/SpeedUHC/SpeedUHC.test.ts index 2384df0c3..2ea5db536 100644 --- a/src/Structures/MiniGames/SpeedUHC/SpeedUHC.test.ts +++ b/src/Structures/MiniGames/SpeedUHC/SpeedUHC.test.ts @@ -53,15 +53,21 @@ test('SpeedUHC', () => { expect(data.assists).toBeGreaterThanOrEqual(0); expectTypeOf(data.assists).toEqualTypeOf(); expect(data.solo).toBeDefined(); + expect(data.solo).toBeInstanceOf(SpeedUHCMode); expectTypeOf(data.solo).toEqualTypeOf(); expect(data.soloNormal).toBeDefined(); + expect(data.soloNormal).toBeInstanceOf(SpeedUHCMode); expectTypeOf(data.soloNormal).toEqualTypeOf(); expect(data.soloInsane).toBeDefined(); + expect(data.soloInsane).toBeInstanceOf(SpeedUHCMode); expectTypeOf(data.soloInsane).toEqualTypeOf(); expect(data.team).toBeDefined(); + expect(data.team).toBeInstanceOf(SpeedUHCMode); expectTypeOf(data.team).toEqualTypeOf(); expect(data.teamNormal).toBeDefined(); + expect(data.teamNormal).toBeInstanceOf(SpeedUHCMode); expectTypeOf(data.teamNormal).toEqualTypeOf(); expect(data.teamInsane).toBeDefined(); + expect(data.teamInsane).toBeInstanceOf(SpeedUHCMode); expectTypeOf(data.teamInsane).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/SpeedUHC/SpeedUHCMode.test.ts b/src/Structures/MiniGames/SpeedUHC/SpeedUHCMode.test.ts index 2ff16fde1..3456dc36b 100644 --- a/src/Structures/MiniGames/SpeedUHC/SpeedUHCMode.test.ts +++ b/src/Structures/MiniGames/SpeedUHC/SpeedUHCMode.test.ts @@ -1,7 +1,7 @@ import SpeedUHCMode from './SpeedUHCMode.js'; import { expect, expectTypeOf, test } from 'vitest'; -test('SpeedUHC', () => { +test('SpeedUHCMode', () => { const data = new SpeedUHCMode({ stats: 'meow' }, 'solo'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SpeedUHCMode); diff --git a/src/Structures/MiniGames/TNTGames/TNTGames.test.ts b/src/Structures/MiniGames/TNTGames/TNTGames.test.ts index b77b4ab09..ef9689ed0 100644 --- a/src/Structures/MiniGames/TNTGames/TNTGames.test.ts +++ b/src/Structures/MiniGames/TNTGames/TNTGames.test.ts @@ -21,13 +21,18 @@ test('TNTGames', () => { expect(data.wins).toBeGreaterThanOrEqual(0); expectTypeOf(data.wins).toEqualTypeOf(); expect(data.tntrun).toBeDefined(); + expect(data.tntrun).toBeInstanceOf(TNTRun); expectTypeOf(data.tntrun).toEqualTypeOf(); expect(data.pvpRun).toBeDefined(); + expect(data.pvpRun).toBeInstanceOf(PVPRun); expectTypeOf(data.pvpRun).toEqualTypeOf(); expect(data.bowSpleef).toBeDefined(); + expect(data.bowSpleef).toBeInstanceOf(BowSpleef); expectTypeOf(data.bowSpleef).toEqualTypeOf(); expect(data.tnttag).toBeDefined(); + expect(data.tnttag).toBeInstanceOf(TNTTag); expectTypeOf(data.tnttag).toEqualTypeOf(); expect(data.wizards).toBeDefined(); + expect(data.wizards).toBeInstanceOf(TNTWizards); expectTypeOf(data.wizards).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/TurboKartRacers/TurboKartRacers.test.ts b/src/Structures/MiniGames/TurboKartRacers/TurboKartRacers.test.ts index 9cc630285..22a9b4419 100644 --- a/src/Structures/MiniGames/TurboKartRacers/TurboKartRacers.test.ts +++ b/src/Structures/MiniGames/TurboKartRacers/TurboKartRacers.test.ts @@ -32,14 +32,19 @@ test('TurboKartRacers', () => { expect(data.horn).toBeDefined(); expectTypeOf(data.horn).toEqualTypeOf(); expect(data.retro).toBeDefined(); + expect(data.retro).toBeInstanceOf(TurboKartRacersMap); expectTypeOf(data.retro).toEqualTypeOf(); expect(data.hypixelgp).toBeDefined(); + expect(data.hypixelgp).toBeInstanceOf(TurboKartRacersMap); expectTypeOf(data.hypixelgp).toEqualTypeOf(); expect(data.olympus).toBeDefined(); + expect(data.olympus).toBeInstanceOf(TurboKartRacersMap); expectTypeOf(data.olympus).toEqualTypeOf(); expect(data.junglerush).toBeDefined(); + expect(data.junglerush).toBeInstanceOf(TurboKartRacersMap); expectTypeOf(data.junglerush).toEqualTypeOf(); expect(data.canyon).toBeDefined(); + expect(data.canyon).toBeInstanceOf(TurboKartRacersMap); expectTypeOf(data.canyon).toEqualTypeOf(); expect(data.bananaHitsReceived).toBeDefined(); expect(data.bananaHitsReceived).toBeGreaterThanOrEqual(0); diff --git a/src/Structures/MiniGames/TurboKartRacers/TurboKartRacersMap.test.ts b/src/Structures/MiniGames/TurboKartRacers/TurboKartRacersMap.test.ts index 534c4dc26..670bafc2a 100644 --- a/src/Structures/MiniGames/TurboKartRacers/TurboKartRacersMap.test.ts +++ b/src/Structures/MiniGames/TurboKartRacers/TurboKartRacersMap.test.ts @@ -2,8 +2,8 @@ import TurboKartRacersMap from './TurboKartRacersMap.js'; import { expect, expectTypeOf, test } from 'vitest'; import type { TurboKartRacersMaps } from '../../../Types/Player.js'; -test('TurboKartRacers', () => { - const data = new TurboKartRacersMap({ stats: 'meow' }, 'retro'); +test('TurboKartRacersMap', () => { + const data = new TurboKartRacersMap({ stats: 'meow' }, 'canyon'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(TurboKartRacersMap); expectTypeOf(data).toEqualTypeOf(); diff --git a/src/Structures/MiniGames/UHC/UHC.test.ts b/src/Structures/MiniGames/UHC/UHC.test.ts index 7c1dcf671..e3e188390 100644 --- a/src/Structures/MiniGames/UHC/UHC.test.ts +++ b/src/Structures/MiniGames/UHC/UHC.test.ts @@ -17,18 +17,25 @@ test('UHC', () => { expect(data.kit).toBeDefined(); expectTypeOf(data.kit).toEqualTypeOf(); expect(data.solo).toBeDefined(); + expect(data.solo).toBeInstanceOf(UHCGamemode); expectTypeOf(data.solo).toEqualTypeOf(); expect(data.team).toBeDefined(); + expect(data.team).toBeInstanceOf(UHCGamemode); expectTypeOf(data.team).toEqualTypeOf(); expect(data.redVsBlue).toBeDefined(); + expect(data.redVsBlue).toBeInstanceOf(UHCGamemode); expectTypeOf(data.redVsBlue).toEqualTypeOf(); expect(data.noDiamond).toBeDefined(); + expect(data.noDiamond).toBeInstanceOf(UHCGamemode); expectTypeOf(data.noDiamond).toEqualTypeOf(); expect(data.brawl).toBeDefined(); + expect(data.brawl).toBeInstanceOf(UHCGamemode); expectTypeOf(data.brawl).toEqualTypeOf(); expect(data.soloBrawl).toBeDefined(); + expect(data.soloBrawl).toBeInstanceOf(UHCGamemode); expectTypeOf(data.soloBrawl).toEqualTypeOf(); expect(data.duoBrawl).toBeDefined(); + expect(data.duoBrawl).toBeInstanceOf(UHCGamemode); expectTypeOf(data.duoBrawl).toEqualTypeOf(); expect(data.wins).toBeDefined(); expect(data.wins).toBeGreaterThanOrEqual(0); diff --git a/src/Structures/MiniGames/UHC/UHCGamemode.test.ts b/src/Structures/MiniGames/UHC/UHCGamemode.test.ts index bd98fd274..d05726eb8 100644 --- a/src/Structures/MiniGames/UHC/UHCGamemode.test.ts +++ b/src/Structures/MiniGames/UHC/UHCGamemode.test.ts @@ -2,7 +2,7 @@ import UHCGamemode from './UHCGamemode.js'; import { expect, expectTypeOf, test } from 'vitest'; test('UHCGamemode', () => { - const data = new UHCGamemode({ stats: 'meow' }); + const data = new UHCGamemode({ stats: 'meow' }, 'brawl'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(UHCGamemode); expectTypeOf(data).toEqualTypeOf(); @@ -12,6 +12,9 @@ test('UHCGamemode', () => { expect(data.deaths).toBeDefined(); expect(data.deaths).toBeGreaterThanOrEqual(0); expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDR).toBeDefined(); + expect(data.KDR).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDR).toEqualTypeOf(); expect(data.wins).toBeDefined(); expect(data.wins).toBeGreaterThanOrEqual(0); expectTypeOf(data.wins).toEqualTypeOf(); diff --git a/src/Structures/MiniGames/VampireZ/VampireZ.test.ts b/src/Structures/MiniGames/VampireZ/VampireZ.test.ts index 3e6b303db..7403200c2 100644 --- a/src/Structures/MiniGames/VampireZ/VampireZ.test.ts +++ b/src/Structures/MiniGames/VampireZ/VampireZ.test.ts @@ -19,8 +19,10 @@ test('VampireZ', () => { expect(data.zombieKills).toBeGreaterThanOrEqual(0); expectTypeOf(data.zombieKills).toEqualTypeOf(); expect(data.human).toBeDefined(); + expect(data.human).toBeInstanceOf(VampireZRole); expectTypeOf(data.human).toEqualTypeOf(); expect(data.vampire).toBeDefined(); + expect(data.vampire).toBeInstanceOf(VampireZRole); expectTypeOf(data.vampire).toEqualTypeOf(); expect(data.kills).toBeDefined(); expect(data.kills).toBeGreaterThanOrEqual(0); diff --git a/src/Structures/MiniGames/Warlords/Warlords.test.ts b/src/Structures/MiniGames/Warlords/Warlords.test.ts index 638f03c3a..30e255817 100644 --- a/src/Structures/MiniGames/Warlords/Warlords.test.ts +++ b/src/Structures/MiniGames/Warlords/Warlords.test.ts @@ -38,35 +38,51 @@ test('Warlords', () => { expect(data.class).toBeDefined(); expectTypeOf(data.class).toEqualTypeOf(); expect(data.pyromancer).toBeDefined(); + expect(data.pyromancer).toBeInstanceOf(WarlordsClass); expectTypeOf(data.pyromancer).toEqualTypeOf(); expect(data.mage).toBeDefined(); + expect(data.mage).toBeInstanceOf(WarlordsClass); expectTypeOf(data.mage).toEqualTypeOf(); expect(data.thunderlord).toBeDefined(); + expect(data.thunderlord).toBeInstanceOf(WarlordsClass); expectTypeOf(data.thunderlord).toEqualTypeOf(); expect(data.shaman).toBeDefined(); + expect(data.shaman).toBeInstanceOf(WarlordsClass); expectTypeOf(data.shaman).toEqualTypeOf(); expect(data.earthwarden).toBeDefined(); + expect(data.earthwarden).toBeInstanceOf(WarlordsClass); expectTypeOf(data.earthwarden).toEqualTypeOf(); expect(data.aquamancer).toBeDefined(); + expect(data.aquamancer).toBeInstanceOf(WarlordsClass); expectTypeOf(data.aquamancer).toEqualTypeOf(); expect(data.paladin).toBeDefined(); + expect(data.paladin).toBeInstanceOf(WarlordsClass); expectTypeOf(data.paladin).toEqualTypeOf(); expect(data.avenger).toBeDefined(); + expect(data.avenger).toBeInstanceOf(WarlordsClass); expectTypeOf(data.avenger).toEqualTypeOf(); expect(data.warrior).toBeDefined(); + expect(data.warrior).toBeInstanceOf(WarlordsClass); expectTypeOf(data.warrior).toEqualTypeOf(); expect(data.defender).toBeDefined(); + expect(data.defender).toBeInstanceOf(WarlordsClass); expectTypeOf(data.defender).toEqualTypeOf(); expect(data.cryomancer).toBeDefined(); + expect(data.cryomancer).toBeInstanceOf(WarlordsClass); expectTypeOf(data.cryomancer).toEqualTypeOf(); expect(data.crusader).toBeDefined(); + expect(data.crusader).toBeInstanceOf(WarlordsClass); expectTypeOf(data.crusader).toEqualTypeOf(); expect(data.berserker).toBeDefined(); + expect(data.berserker).toBeInstanceOf(WarlordsClass); expectTypeOf(data.berserker).toEqualTypeOf(); expect(data.protector).toBeDefined(); + expect(data.protector).toBeInstanceOf(WarlordsClass); expectTypeOf(data.protector).toEqualTypeOf(); expect(data.revenant).toBeDefined(); + expect(data.revenant).toBeInstanceOf(WarlordsClass); expectTypeOf(data.revenant).toEqualTypeOf(); expect(data.spiritguard).toBeDefined(); + expect(data.spiritguard).toBeInstanceOf(WarlordsClass); expectTypeOf(data.spiritguard).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/WoolGames/WoolGames.test.ts b/src/Structures/MiniGames/WoolGames/WoolGames.test.ts index 799f61f82..3a292d045 100644 --- a/src/Structures/MiniGames/WoolGames/WoolGames.test.ts +++ b/src/Structures/MiniGames/WoolGames/WoolGames.test.ts @@ -33,9 +33,12 @@ test('WoolGames', () => { expect(data.playtime).toBeGreaterThanOrEqual(0); expectTypeOf(data.playtime).toEqualTypeOf(); expect(data.woolWars).toBeDefined(); + expect(data.woolWars).toBeInstanceOf(WoolWars); expectTypeOf(data.woolWars).toEqualTypeOf(); expect(data.captureTheWool).toBeDefined(); + expect(data.captureTheWool).toBeInstanceOf(CaptureTheWool); expectTypeOf(data.captureTheWool).toEqualTypeOf(); expect(data.sheepWars).toBeDefined(); + expect(data.sheepWars).toBeInstanceOf(SheepWars); expectTypeOf(data.sheepWars).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/WoolGames/WoolWars.test.ts b/src/Structures/MiniGames/WoolGames/WoolWars.test.ts index 23cc10672..6fc29b07c 100644 --- a/src/Structures/MiniGames/WoolGames/WoolWars.test.ts +++ b/src/Structures/MiniGames/WoolGames/WoolWars.test.ts @@ -41,15 +41,21 @@ test('WoolWars', () => { expect(data.powerUps).toBeGreaterThanOrEqual(0); expectTypeOf(data.powerUps).toEqualTypeOf(); expect(data.assault).toBeDefined(); + expect(data.assault).toBeInstanceOf(WoolWarsClass); expectTypeOf(data.assault).toEqualTypeOf(); expect(data.tank).toBeDefined(); + expect(data.tank).toBeInstanceOf(WoolWarsClass); expectTypeOf(data.tank).toEqualTypeOf(); expect(data.golem).toBeDefined(); + expect(data.golem).toBeInstanceOf(WoolWarsClass); expectTypeOf(data.golem).toEqualTypeOf(); expect(data.swordsman).toBeDefined(); + expect(data.swordsman).toBeInstanceOf(WoolWarsClass); expectTypeOf(data.swordsman).toEqualTypeOf(); expect(data.engineer).toBeDefined(); + expect(data.engineer).toBeInstanceOf(WoolWarsClass); expectTypeOf(data.engineer).toEqualTypeOf(); expect(data.archer).toBeDefined(); + expect(data.archer).toBeInstanceOf(WoolWarsClass); expectTypeOf(data.archer).toEqualTypeOf(); }); diff --git a/src/Structures/Player/Player.test.ts b/src/Structures/Player/Player.test.ts index eecac6106..701626a90 100644 --- a/src/Structures/Player/Player.test.ts +++ b/src/Structures/Player/Player.test.ts @@ -1,24 +1,24 @@ +import Guild from '../Guild/Guild.js'; +import House from '../House.js'; import Player from './Player.js'; +import PlayerAchievements from './PlayerAchievements/PlayerAchievements.js'; +import PlayerAdventRewards from './PlayerAdventRewards/PlayerAdventRewards.js'; import PlayerCosmetics from './PlayerCosmetics/PlayerCosmetics.js'; import PlayerGifting from './PlayerGifting.js'; import PlayerHousing from './PlayerHousing/PlayerHousing.js'; +import PlayerParkour from './PlayerParkour.js'; import PlayerQuests from './PlayerQuests/PlayerQuests.js'; import PlayerRankPurchase from './PlayerRankPurchase.js'; import PlayerRewards from './PlayerRewards/PlayerRewards.js'; +import PlayerScorpiusBribe from './PlayerScorpiusBribe.js'; import PlayerSocialMedia from './PlayerSocialMedia.js'; +import PlayerStats from './PlayerStats.js'; +import RecentGame from '../RecentGame.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type Guild from '../Guild/Guild.js'; -import type House from '../House.js'; -import type PlayerAchievements from './PlayerAchievements/PlayerAchievements.js'; -import type PlayerAdventRewards from './PlayerAdventRewards/PlayerAdventRewards.js'; -import type PlayerParkour from './PlayerParkour.js'; -import type PlayerScorpiusBribe from './PlayerScorpiusBribe.js'; -import type PlayerStats from './PlayerStats.js'; -import type RecentGame from '../RecentGame.js'; import type { ChatChannel, Language, LevelProgress, PlayerRank } from '../../Types/Player.js'; test('Player', () => { - const data = new Player({ stats: 'meow' }, { guild: null, houses: null, recentGames: null }); + const data = new Player({ stats: 'meow' }, {}); expect(data).toBeDefined(); expect(data).toBeInstanceOf(Player); expectTypeOf(data).toEqualTypeOf(); @@ -27,28 +27,25 @@ test('Player', () => { expect(data.uuid).toBeDefined(); expectTypeOf(data.uuid).toEqualTypeOf(); expect(data.rank).toBeDefined(); - expect(data.rank).toBeNull(); expectTypeOf(data.rank).toEqualTypeOf(); expect(data.firstLoginAt).toBeDefined(); - expect(data.firstLoginAt).toBeNull(); expectTypeOf(data.firstLoginAt).toEqualTypeOf(); expect(data.lastLoginAt).toBeDefined(); - expect(data.lastLoginAt).toBeNull(); expectTypeOf(data.lastLoginAt).toEqualTypeOf(); expect(data.lastLogoutAt).toBeDefined(); - expect(data.lastLogoutAt).toBeNull(); expectTypeOf(data.lastLogoutAt).toEqualTypeOf(); expect(data.achievements).toBeDefined(); + expect(data.achievements).toBeInstanceOf(PlayerAchievements); expectTypeOf(data.achievements).toEqualTypeOf(); expect(data.karma).toBeDefined(); expect(data.karma).toBeGreaterThanOrEqual(0); expectTypeOf(data.karma).toEqualTypeOf(); expect(data.stats).toBeDefined(); + expect(data.stats).toBeInstanceOf(PlayerStats); expectTypeOf(data.stats).toEqualTypeOf(); expect(data.level).toBeDefined(); expectTypeOf(data.level).toEqualTypeOf(); expect(data.claimedCenturyCakeAt).toBeDefined(); - expect(data.claimedCenturyCakeAt).toBeNull(); expectTypeOf(data.claimedCenturyCakeAt).toEqualTypeOf(); expect(data.language).toBeDefined(); expectTypeOf(data.language).toEqualTypeOf(); @@ -86,12 +83,9 @@ test('Player', () => { expect(data.scorpiusBribes).toBeDefined(); expectTypeOf(data.scorpiusBribes).toEqualTypeOf(); expect(data.guild).toBeDefined(); - expect(data.guild).toBeNull(); expectTypeOf(data.guild).toEqualTypeOf(); expect(data.houses).toBeDefined(); - expect(data.houses).toBeNull(); expectTypeOf(data.houses).toEqualTypeOf(); expect(data.recentGames).toBeDefined(); - expect(data.recentGames).toBeNull(); expectTypeOf(data.recentGames).toEqualTypeOf(); }); diff --git a/src/Structures/Player/Player.ts b/src/Structures/Player/Player.ts index 6f07693ab..d811a93a2 100644 --- a/src/Structures/Player/Player.ts +++ b/src/Structures/Player/Player.ts @@ -48,7 +48,7 @@ class Player { recentGames: RecentGame[] | null; constructor( data: Record, - extra: { guild: Guild | null; houses: House[] | null; recentGames: RecentGame[] | null } + extra: { guild?: Guild | null; houses?: House[] | null; recentGames?: RecentGame[] | null } ) { this.nickname = data?.displayname || 'UNKNOWN'; this.uuid = data?.uuid || 'UNKNOWN'; @@ -86,9 +86,9 @@ class Player { .filter((key) => key.startsWith('scorpius_bribe_')) .map((bribe) => new PlayerScorpiusBribe(data[bribe], bribe.split('scorpius_bribe_')[1] || 'UNKNOWN')) || []; - this.guild = extra.guild; - this.houses = extra.houses; - this.recentGames = extra.recentGames; + this.guild = extra.guild || null; + this.houses = extra.houses || null; + this.recentGames = extra.recentGames || null; } private getRank(player: Record): PlayerRank { diff --git a/src/Structures/Player/PlayerAchievements/PlayerAchievements.test.ts b/src/Structures/Player/PlayerAchievements/PlayerAchievements.test.ts index a24b52848..fc3d2ff2b 100644 --- a/src/Structures/Player/PlayerAchievements/PlayerAchievements.test.ts +++ b/src/Structures/Player/PlayerAchievements/PlayerAchievements.test.ts @@ -10,6 +10,7 @@ test('PlayerAchievements', () => { expect(data).toBeInstanceOf(PlayerAchievements); expectTypeOf(data).toEqualTypeOf(); expect(data.points).toBeDefined(); + expect(data.points).toBeGreaterThanOrEqual(0); expectTypeOf(data.points).toEqualTypeOf(); expect(data.rewards).toBeDefined(); expect(data.rewards).toBeInstanceOf(PlayerAchievementsRewards); diff --git a/src/Structures/Player/PlayerAchievements/PlayerAchievementsTotem.test.ts b/src/Structures/Player/PlayerAchievements/PlayerAchievementsTotem.test.ts index 452657fd2..be7f72a79 100644 --- a/src/Structures/Player/PlayerAchievements/PlayerAchievementsTotem.test.ts +++ b/src/Structures/Player/PlayerAchievements/PlayerAchievementsTotem.test.ts @@ -1,6 +1,6 @@ import PlayerAchievementsTotem from './PlayerAchievementsTotem.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type { PlayerAchievementsTotemColors, PlayerAchievementsTotemParts } from '../../../Types/Player.ts'; +import type { PlayerAchievementsTotemColors, PlayerAchievementsTotemParts } from '../../../Types/Player.js'; test('PlayerAchievementsTotem', () => { const data = new PlayerAchievementsTotem({ stats: 'meow' }); @@ -13,18 +13,10 @@ test('PlayerAchievementsTotem', () => { expect(data.allowedMaxHeight).toBeGreaterThanOrEqual(0); expectTypeOf(data.allowedMaxHeight).toEqualTypeOf(); expect(data.unlockedParts).toBeDefined(); - data.unlockedParts.forEach((unlockedPart) => { - expect(unlockedPart).toBeDefined(); - expectTypeOf(unlockedPart).toEqualTypeOf(); - }); expectTypeOf(data.unlockedParts).toEqualTypeOf(); expect(data.selectedParts).toBeDefined(); expectTypeOf(data.selectedParts).toEqualTypeOf>(); expect(data.unlockedColors).toBeDefined(); - data.unlockedColors.forEach((unlockedColor) => { - expect(unlockedColor).toBeDefined(); - expectTypeOf(unlockedColor).toEqualTypeOf(); - }); expectTypeOf(data.unlockedColors).toEqualTypeOf(); expect(data.selectedColors).toBeDefined(); expectTypeOf(data.selectedColors).toEqualTypeOf>(); diff --git a/src/Structures/Player/PlayerAdventRewards/PlayerAdventRewards.test.ts b/src/Structures/Player/PlayerAdventRewards/PlayerAdventRewards.test.ts index 50e94200c..72d37f05e 100644 --- a/src/Structures/Player/PlayerAdventRewards/PlayerAdventRewards.test.ts +++ b/src/Structures/Player/PlayerAdventRewards/PlayerAdventRewards.test.ts @@ -3,11 +3,12 @@ import PlayerAdventRewardsDay from './PlayerAdventRewardsDay.js'; import { expect, expectTypeOf, test } from 'vitest'; test('PlayerAdventRewards', () => { - const data = new PlayerAdventRewards({ stats: 'meow' }, '2000'); + const data = new PlayerAdventRewards({ stats: 'meow' }, '100'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(PlayerAdventRewards); expectTypeOf(data).toEqualTypeOf(); expect(data.year).toBeDefined(); + expect(data.year).toBeGreaterThanOrEqual(0); expectTypeOf(data.year).toEqualTypeOf(); expect(data.day1).toBeDefined(); expect(data.day1).toBeInstanceOf(PlayerAdventRewardsDay); diff --git a/src/Structures/Player/PlayerAdventRewards/PlayerAdventRewardsDay.test.ts b/src/Structures/Player/PlayerAdventRewards/PlayerAdventRewardsDay.test.ts index eb774eb3e..6745dd11e 100644 --- a/src/Structures/Player/PlayerAdventRewards/PlayerAdventRewardsDay.test.ts +++ b/src/Structures/Player/PlayerAdventRewards/PlayerAdventRewardsDay.test.ts @@ -2,11 +2,12 @@ import PlayerAdventRewardsDay from './PlayerAdventRewardsDay.js'; import { expect, expectTypeOf, test } from 'vitest'; test('PlayerAdventRewardsDay', () => { - const data = new PlayerAdventRewardsDay({ stats: 'meow' }, 'meow'); + const data = new PlayerAdventRewardsDay({ stats: 'meow' }, '0'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(PlayerAdventRewardsDay); expectTypeOf(data).toEqualTypeOf(); expect(data.day).toBeDefined(); + expect(data.day).toBeGreaterThanOrEqual(0); expectTypeOf(data.day).toEqualTypeOf(); expect(data.claimed).toBeDefined(); expectTypeOf(data.claimed).toEqualTypeOf(); diff --git a/src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPet.test.ts b/src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPet.test.ts index 4de59607c..234741a69 100644 --- a/src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPet.test.ts +++ b/src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPet.test.ts @@ -3,7 +3,7 @@ import { expect, expectTypeOf, test } from 'vitest'; import type { PlayerCosmeticsPetName } from '../../../../Types/Player.js'; test('PlayerCosmeticsPet', () => { - const data = new PlayerCosmeticsPet('meow', { stats: 'meow' }); + const data = new PlayerCosmeticsPet('mrrp', { stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(PlayerCosmeticsPet); expectTypeOf(data).toEqualTypeOf(); diff --git a/src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPets.test.ts b/src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPets.test.ts index 13b830610..134871b52 100644 --- a/src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPets.test.ts +++ b/src/Structures/Player/PlayerCosmetics/Pets/PlayerCosmeticsPets.test.ts @@ -4,7 +4,7 @@ import PlayerCosmeticsPetsConsumables from './PlayerCosmeticsPetsConsumables.js' import { expect, expectTypeOf, test } from 'vitest'; test('PlayerCosmeticsPets', () => { - const data = new PlayerCosmeticsPets({ stats: 'meow' }, ['meow']); + const data = new PlayerCosmeticsPets({ stats: 'meow' }, []); expect(data).toBeDefined(); expect(data).toBeInstanceOf(PlayerCosmeticsPets); expectTypeOf(data).toEqualTypeOf(); @@ -16,9 +16,5 @@ test('PlayerCosmeticsPets', () => { expect(data.consumables).toBeInstanceOf(PlayerCosmeticsPetsConsumables); expectTypeOf(data.consumables).toEqualTypeOf(); expect(data.pets).toBeDefined(); - data.pets.forEach((pet) => { - expect(pet).toBeDefined(); - expectTypeOf(pet).toEqualTypeOf(); - }); expectTypeOf(data.pets).toEqualTypeOf(); }); diff --git a/src/Structures/Player/PlayerCosmetics/PlayerCosmetics.test.ts b/src/Structures/Player/PlayerCosmetics/PlayerCosmetics.test.ts index c62ab9202..a1bc4cc70 100644 --- a/src/Structures/Player/PlayerCosmetics/PlayerCosmetics.test.ts +++ b/src/Structures/Player/PlayerCosmetics/PlayerCosmetics.test.ts @@ -29,63 +29,28 @@ test('PlayerCosmetics', () => { expect(data.cosmetics).toBeDefined(); expectTypeOf(data.cosmetics).toEqualTypeOf(); expect(data.pets).toBeDefined(); + expect(data.pets).toBeInstanceOf(PlayerCosmeticsPets); expectTypeOf(data.pets).toEqualTypeOf(); expect(data.unlockedSuits).toBeDefined(); - data.unlockedSuits.forEach((unlockedSuit) => { - expect(unlockedSuit).toBeDefined(); - expectTypeOf(unlockedSuit).toEqualTypeOf(); - }); expectTypeOf(data.unlockedSuits).toEqualTypeOf(); expect(data.unlockedHats).toBeDefined(); - data.unlockedHats.forEach((unlockedHat) => { - expect(unlockedHat).toBeDefined(); - expectTypeOf(unlockedHat).toEqualTypeOf(); - }); expectTypeOf(data.unlockedHats).toEqualTypeOf(); expect(data.selectedGadget).toBeDefined(); expectTypeOf(data.selectedGadget).toEqualTypeOf(); expect(data.unlockedGadgets).toBeDefined(); - data.unlockedGadgets.forEach((unlockedGadget) => { - expect(unlockedGadget).toBeDefined(); - expectTypeOf(unlockedGadget).toEqualTypeOf(); - }); expectTypeOf(data.unlockedGadgets).toEqualTypeOf(); expect(data.unlockedMorphs).toBeDefined(); - data.unlockedMorphs.forEach((unlockedMorph) => { - expect(unlockedMorph).toBeDefined(); - expectTypeOf(unlockedMorph).toEqualTypeOf(); - }); expectTypeOf(data.unlockedMorphs).toEqualTypeOf(); expect(data.unlockedCloaks).toBeDefined(); - data.unlockedCloaks.forEach((unlockedCloak) => { - expect(unlockedCloak).toBeDefined(); - expectTypeOf(unlockedCloak).toEqualTypeOf(); - }); expectTypeOf(data.unlockedCloaks).toEqualTypeOf(); expect(data.unlockedTaunts).toBeDefined(); - data.unlockedTaunts.forEach((unlockedTaunt) => { - expect(unlockedTaunt).toBeDefined(); - expectTypeOf(unlockedTaunt).toEqualTypeOf(); - }); expectTypeOf(data.unlockedTaunts).toEqualTypeOf(); expect(data.unlockedRankColors).toBeDefined(); - data.unlockedRankColors.forEach((unlockedRankColor) => { - expect(unlockedRankColor).toBeDefined(); - expectTypeOf(unlockedRankColor).toEqualTypeOf(); - }); expectTypeOf(data.unlockedRankColors).toEqualTypeOf(); expect(data.selectedParticlePack).toBeDefined(); expectTypeOf(data.selectedParticlePack).toEqualTypeOf(); expect(data.unlockedParticlePacks).toBeDefined(); - data.unlockedParticlePacks.forEach((unlockedParticlePack) => { - expect(unlockedParticlePack).toBeDefined(); - expectTypeOf(unlockedParticlePack).toEqualTypeOf(); - }); expectTypeOf(data.unlockedParticlePacks).toEqualTypeOf(); expect(data.unlockedClickEffects).toBeDefined(); - data.unlockedClickEffects.forEach((unlockedClickEffect) => { - expect(unlockedClickEffect).toBeDefined(); - expectTypeOf(unlockedClickEffect).toEqualTypeOf(); - }); expectTypeOf(data.unlockedClickEffects).toEqualTypeOf(); }); diff --git a/src/Structures/Player/PlayerGifting.test.ts b/src/Structures/Player/PlayerGifting.test.ts index d1af5a5d3..5660f6ba9 100644 --- a/src/Structures/Player/PlayerGifting.test.ts +++ b/src/Structures/Player/PlayerGifting.test.ts @@ -13,9 +13,6 @@ test('PlayerGifting', () => { expect(data.bundlesGiven).toBeGreaterThanOrEqual(0); expectTypeOf(data.bundlesGiven).toEqualTypeOf(); expect(data.milestones).toBeDefined(); - data.milestones.forEach((milestone) => { - expect(milestone).toBeDefined(); - }); expectTypeOf(data.milestones).toEqualTypeOf(); expect(data.giftsGiven).toBeDefined(); expect(data.giftsGiven).toBeGreaterThanOrEqual(0); @@ -24,8 +21,5 @@ test('PlayerGifting', () => { expect(data.ranksGiven).toBeGreaterThanOrEqual(0); expectTypeOf(data.ranksGiven).toEqualTypeOf(); expect(data.ranksGivenMilestones).toBeDefined(); - data.ranksGivenMilestones.forEach((ranksGivenMilestone) => { - expect(ranksGivenMilestone).toBeDefined(); - }); expectTypeOf(data.ranksGivenMilestones).toEqualTypeOf(); }); diff --git a/src/Structures/Player/PlayerHousing/PlayerHousing.test.ts b/src/Structures/Player/PlayerHousing/PlayerHousing.test.ts index 02c5c8da6..ae300f4c4 100644 --- a/src/Structures/Player/PlayerHousing/PlayerHousing.test.ts +++ b/src/Structures/Player/PlayerHousing/PlayerHousing.test.ts @@ -25,10 +25,5 @@ test('PlayerHousing', () => { expect(data.playerSettings).toBeInstanceOf(PlayerHousingPlayerSettings); expectTypeOf(data.playerSettings).toEqualTypeOf(); expect(data.givenCookies).toBeDefined(); - data.givenCookies.forEach((cookie) => { - expect(cookie).toBeDefined(); - expect(cookie).toBeInstanceOf(PlayerHousingGivenCookies); - expectTypeOf(cookie).toEqualTypeOf(); - }); expectTypeOf(data.givenCookies).toEqualTypeOf(); }); diff --git a/src/Structures/Player/PlayerHousing/PlayerHousingGivenCookies.test.ts b/src/Structures/Player/PlayerHousing/PlayerHousingGivenCookies.test.ts index e6f0834c1..9a22da885 100644 --- a/src/Structures/Player/PlayerHousing/PlayerHousingGivenCookies.test.ts +++ b/src/Structures/Player/PlayerHousing/PlayerHousingGivenCookies.test.ts @@ -2,7 +2,7 @@ import PlayerHousingGivenCookies from './PlayerHousingGivenCookies.js'; import { expect, expectTypeOf, test } from 'vitest'; test('PlayerHousingGivenCookies', () => { - const data = new PlayerHousingGivenCookies('meow', ['meow']); + const data = new PlayerHousingGivenCookies('mrrp', ['meow']); expect(data).toBeDefined(); expect(data).toBeInstanceOf(PlayerHousingGivenCookies); expectTypeOf(data).toEqualTypeOf(); diff --git a/src/Structures/Player/PlayerHousing/PlayerHousingPlayerSettings.test.ts b/src/Structures/Player/PlayerHousing/PlayerHousingPlayerSettings.test.ts index 2bbb74f96..eb882243e 100644 --- a/src/Structures/Player/PlayerHousing/PlayerHousingPlayerSettings.test.ts +++ b/src/Structures/Player/PlayerHousing/PlayerHousingPlayerSettings.test.ts @@ -8,6 +8,7 @@ test('PlayerHousingPlayerSettings', () => { expect(data).toBeInstanceOf(PlayerHousingPlayerSettings); expectTypeOf(data).toEqualTypeOf(); expect(data.playerVisibility).toBeDefined(); + expect(data.playerVisibility).toBeGreaterThanOrEqual(0); expectTypeOf(data.playerVisibility).toEqualTypeOf(); expect(data.showBorder).toBeDefined(); expectTypeOf(data.showBorder).toEqualTypeOf(); diff --git a/src/Structures/Player/PlayerParkour.test.ts b/src/Structures/Player/PlayerParkour.test.ts index 7def3e967..beb7b00be 100644 --- a/src/Structures/Player/PlayerParkour.test.ts +++ b/src/Structures/Player/PlayerParkour.test.ts @@ -2,12 +2,11 @@ import PlayerParkour from './PlayerParkour.js'; import { expect, expectTypeOf, test } from 'vitest'; test('PlayerParkour', () => { - const data = new PlayerParkour({ stats: 'meow' }, { stats: 'meow' }, 'meow'); + const data = new PlayerParkour({ stats: 'meow' }, { stats: 'meow' }, 'mrrp'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(PlayerParkour); expectTypeOf(data).toEqualTypeOf(); expect(data.location).toBeDefined(); - expect(data.location).toBe('meow'); expectTypeOf(data.location).toEqualTypeOf(); expect(data.timeStart).toBeDefined(); expect(data.timeStart).toBeGreaterThanOrEqual(0); @@ -17,8 +16,4 @@ test('PlayerParkour', () => { expectTypeOf(data.timeTook).toEqualTypeOf(); expect(data.checkPoints).toBeDefined(); expectTypeOf(data.checkPoints).toEqualTypeOf(); - data.checkPoints.forEach((checkPoint) => { - expect(checkPoint).toBeDefined(); - expect(checkPoint).toBeGreaterThanOrEqual(0); - }); }); diff --git a/src/Structures/Player/PlayerQuests/PlayerQuest.test.ts b/src/Structures/Player/PlayerQuests/PlayerQuest.test.ts index 14f662418..7911325b0 100644 --- a/src/Structures/Player/PlayerQuests/PlayerQuest.test.ts +++ b/src/Structures/Player/PlayerQuests/PlayerQuest.test.ts @@ -3,12 +3,11 @@ import PlayerQuestCompletions from './PlayerQuestCompletions.js'; import { expect, expectTypeOf, test } from 'vitest'; test('PlayerQuest', () => { - const data = new PlayerQuest({ stats: 'meow' }, 'meow'); + const data = new PlayerQuest({ stats: 'meow' }, 'mrrp'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(PlayerQuest); expectTypeOf(data).toEqualTypeOf(); expect(data.name).toBeDefined(); - expect(data.name).toBe('meow'); expectTypeOf(data.name).toEqualTypeOf(); expect(data.completions).toBeDefined(); expect(data.completions).toBeInstanceOf(PlayerQuestCompletions); diff --git a/src/Structures/Player/PlayerQuests/PlayerQuestCompletion.test.ts b/src/Structures/Player/PlayerQuests/PlayerQuestCompletion.test.ts index 5d3e8672e..c5eb4559c 100644 --- a/src/Structures/Player/PlayerQuests/PlayerQuestCompletion.test.ts +++ b/src/Structures/Player/PlayerQuests/PlayerQuestCompletion.test.ts @@ -7,6 +7,7 @@ test('PlayerQuestCompletion', () => { expect(data).toBeInstanceOf(PlayerQuestCompletion); expectTypeOf(data).toEqualTypeOf(); expect(data.amount).toBeDefined(); + expect(data.amount).toBeGreaterThanOrEqual(0); expectTypeOf(data.amount).toEqualTypeOf(); expect(data.timestamp).toBeDefined(); expectTypeOf(data.timestamp).toEqualTypeOf(); diff --git a/src/Structures/Player/PlayerQuests/PlayerQuestCompletions.test.ts b/src/Structures/Player/PlayerQuests/PlayerQuestCompletions.test.ts index 3293e0546..5ac238d33 100644 --- a/src/Structures/Player/PlayerQuests/PlayerQuestCompletions.test.ts +++ b/src/Structures/Player/PlayerQuests/PlayerQuestCompletions.test.ts @@ -11,10 +11,5 @@ test('PlayerQuestCompletions', () => { expect(data.amount).toBeGreaterThanOrEqual(0); expectTypeOf(data.amount).toEqualTypeOf(); expect(data.completions).toBeDefined(); - data.completions.forEach((completion) => { - expect(completion).toBeDefined(); - expect(completion).toBeInstanceOf(PlayerQuestCompletion); - expectTypeOf(completion).toEqualTypeOf(); - }); expectTypeOf(data.completions).toEqualTypeOf(); }); diff --git a/src/Structures/Player/PlayerQuests/PlayerQuests.test.ts b/src/Structures/Player/PlayerQuests/PlayerQuests.test.ts index f259b9e53..5d0c91293 100644 --- a/src/Structures/Player/PlayerQuests/PlayerQuests.test.ts +++ b/src/Structures/Player/PlayerQuests/PlayerQuests.test.ts @@ -8,11 +8,6 @@ test('PlayerQuests', () => { expect(data).toBeInstanceOf(PlayerQuests); expectTypeOf(data).toEqualTypeOf(); expect(data.quests).toBeDefined(); - data.quests.forEach((quest) => { - expect(quest).toBeDefined(); - expect(quest).toBeInstanceOf(PlayerQuest); - expectTypeOf(quest).toEqualTypeOf(); - }); expectTypeOf(data.quests).toEqualTypeOf(); expect(data.autoActivate).toBeDefined(); expectTypeOf(data.autoActivate).toEqualTypeOf(); diff --git a/src/Structures/Player/PlayerRewards/PlayerRewards.test.ts b/src/Structures/Player/PlayerRewards/PlayerRewards.test.ts index 70856aa09..fe1cc6c9d 100644 --- a/src/Structures/Player/PlayerRewards/PlayerRewards.test.ts +++ b/src/Structures/Player/PlayerRewards/PlayerRewards.test.ts @@ -34,9 +34,5 @@ test('PlayerRewards', () => { expect(data.totalRewards).toBeGreaterThanOrEqual(0); expectTypeOf(data.totalRewards).toEqualTypeOf(); expect(data.monthlyCrates).toBeDefined(); - data.monthlyCrates.forEach((crate) => { - expect(crate).toBeDefined(); - expectTypeOf(crate).toEqualTypeOf(); - }); expectTypeOf(data.monthlyCrates).toEqualTypeOf(); }); diff --git a/src/Structures/Player/PlayerRewards/PlayerRewardsMonthlyCrate.test.ts b/src/Structures/Player/PlayerRewards/PlayerRewardsMonthlyCrate.test.ts index 66e8367e0..e8915c092 100644 --- a/src/Structures/Player/PlayerRewards/PlayerRewardsMonthlyCrate.test.ts +++ b/src/Structures/Player/PlayerRewards/PlayerRewardsMonthlyCrate.test.ts @@ -2,12 +2,11 @@ import PlayerRewardsMonthlyCrate from './PlayerRewardsMonthlyCrate.js'; import { expect, expectTypeOf, test } from 'vitest'; test('PlayerRewardsMonthlyCrate', () => { - const data = new PlayerRewardsMonthlyCrate({ stats: 'meow' }, 'meow'); + const data = new PlayerRewardsMonthlyCrate({ stats: 'meow' }, 'mrrp'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(PlayerRewardsMonthlyCrate); expectTypeOf(data).toEqualTypeOf(); expect(data.date).toBeDefined(); - expect(data.date).toBe('meow'); expectTypeOf(data.date).toEqualTypeOf(); expect(data.REGULAR).toBeDefined(); expectTypeOf(data.REGULAR).toEqualTypeOf(); diff --git a/src/Structures/Player/PlayerScorpiusBribe.test.ts b/src/Structures/Player/PlayerScorpiusBribe.test.ts index 2870af14a..1b41a56d9 100644 --- a/src/Structures/Player/PlayerScorpiusBribe.test.ts +++ b/src/Structures/Player/PlayerScorpiusBribe.test.ts @@ -2,7 +2,7 @@ import PlayerScorpiusBribe from './PlayerScorpiusBribe.js'; import { expect, expectTypeOf, test } from 'vitest'; test('PlayerScorpiusBribe', () => { - const data = new PlayerScorpiusBribe(0, '2000'); + const data = new PlayerScorpiusBribe(0, '100'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(PlayerScorpiusBribe); expectTypeOf(data).toEqualTypeOf(); @@ -13,5 +13,6 @@ test('PlayerScorpiusBribe', () => { expect(data.claimedTimestamp).toBeGreaterThanOrEqual(0); expectTypeOf(data.claimedTimestamp).toEqualTypeOf(); expect(data.claimedAt).toBeDefined(); + expect(data.claimedAt).toBeInstanceOf(Date); expectTypeOf(data.claimedAt).toEqualTypeOf(); }); diff --git a/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYear.test.ts b/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYear.test.ts index b4d9a4855..76d5ebb2c 100644 --- a/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYear.test.ts +++ b/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYear.test.ts @@ -4,12 +4,11 @@ import PlayerSeasonalChristmasYearLeveling from './PlayerSeasonalChristmasYearLe import { expect, expectTypeOf, test } from 'vitest'; test('PlayerSeasonalChristmasYear', () => { - const data = new PlayerSeasonalChristmasYear({ stats: 'meow' }, 2000); + const data = new PlayerSeasonalChristmasYear({ stats: 'meow' }, 100); expect(data).toBeDefined(); expect(data).toBeInstanceOf(PlayerSeasonalChristmasYear); expectTypeOf(data).toEqualTypeOf(); expect(data.year).toBeDefined(); - expect(data.year).toBe(2000); expect(data.year).toBeGreaterThanOrEqual(0); expectTypeOf(data.year).toEqualTypeOf(); expect(data.adventRewards).toBeDefined(); diff --git a/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYearAdventRewards.test.ts b/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYearAdventRewards.test.ts index 2e5629b95..923a1a129 100644 --- a/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYearAdventRewards.test.ts +++ b/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYearAdventRewards.test.ts @@ -7,78 +7,53 @@ test('PlayerSeasonalChristmasYearAdventRewards', () => { expect(data).toBeInstanceOf(PlayerSeasonalChristmasYearAdventRewards); expectTypeOf(data).toEqualTypeOf(); expect(data.day1).toBeDefined(); - expect(data.day1).toBeNull(); expectTypeOf(data.day1).toEqualTypeOf(); expect(data.day2).toBeDefined(); - expect(data.day2).toBeNull(); expectTypeOf(data.day2).toEqualTypeOf(); expect(data.day3).toBeDefined(); - expect(data.day3).toBeNull(); expectTypeOf(data.day3).toEqualTypeOf(); expect(data.day4).toBeDefined(); - expect(data.day4).toBeNull(); expectTypeOf(data.day4).toEqualTypeOf(); expect(data.day5).toBeDefined(); - expect(data.day5).toBeNull(); expectTypeOf(data.day5).toEqualTypeOf(); expect(data.day6).toBeDefined(); - expect(data.day6).toBeNull(); expectTypeOf(data.day6).toEqualTypeOf(); expect(data.day7).toBeDefined(); - expect(data.day7).toBeNull(); expectTypeOf(data.day7).toEqualTypeOf(); expect(data.day8).toBeDefined(); - expect(data.day8).toBeNull(); expectTypeOf(data.day8).toEqualTypeOf(); expect(data.day9).toBeDefined(); - expect(data.day9).toBeNull(); expectTypeOf(data.day9).toEqualTypeOf(); expect(data.day10).toBeDefined(); - expect(data.day10).toBeNull(); expectTypeOf(data.day10).toEqualTypeOf(); expect(data.day11).toBeDefined(); - expect(data.day11).toBeNull(); expectTypeOf(data.day11).toEqualTypeOf(); expect(data.day12).toBeDefined(); - expect(data.day12).toBeNull(); expectTypeOf(data.day12).toEqualTypeOf(); expect(data.day13).toBeDefined(); - expect(data.day13).toBeNull(); expectTypeOf(data.day13).toEqualTypeOf(); expect(data.day14).toBeDefined(); - expect(data.day14).toBeNull(); expectTypeOf(data.day14).toEqualTypeOf(); expect(data.day15).toBeDefined(); - expect(data.day15).toBeNull(); expectTypeOf(data.day15).toEqualTypeOf(); expect(data.day16).toBeDefined(); - expect(data.day16).toBeNull(); expectTypeOf(data.day16).toEqualTypeOf(); expect(data.day17).toBeDefined(); - expect(data.day17).toBeNull(); expectTypeOf(data.day17).toEqualTypeOf(); expect(data.day18).toBeDefined(); - expect(data.day18).toBeNull(); expectTypeOf(data.day18).toEqualTypeOf(); expect(data.day19).toBeDefined(); - expect(data.day19).toBeNull(); expectTypeOf(data.day19).toEqualTypeOf(); expect(data.day20).toBeDefined(); - expect(data.day20).toBeNull(); expectTypeOf(data.day20).toEqualTypeOf(); expect(data.day21).toBeDefined(); - expect(data.day21).toBeNull(); expectTypeOf(data.day21).toEqualTypeOf(); expect(data.day22).toBeDefined(); - expect(data.day22).toBeNull(); expectTypeOf(data.day22).toEqualTypeOf(); expect(data.day23).toBeDefined(); - expect(data.day23).toBeNull(); expectTypeOf(data.day23).toEqualTypeOf(); expect(data.day24).toBeDefined(); - expect(data.day24).toBeNull(); expectTypeOf(data.day24).toEqualTypeOf(); expect(data.day25).toBeDefined(); - expect(data.day25).toBeNull(); expectTypeOf(data.day25).toEqualTypeOf(); }); diff --git a/src/Structures/Player/PlayerTourney/PlayerTourney.test.ts b/src/Structures/Player/PlayerTourney/PlayerTourney.test.ts index 5fbb7e47a..c73da7669 100644 --- a/src/Structures/Player/PlayerTourney/PlayerTourney.test.ts +++ b/src/Structures/Player/PlayerTourney/PlayerTourney.test.ts @@ -9,10 +9,8 @@ test('PlayerTourney', () => { expect(data).toBeInstanceOf(PlayerTourney); expectTypeOf(data).toEqualTypeOf(); expect(data.firstJoinLobbyTimestamp).toBeDefined(); - expect(data.firstJoinLobbyTimestamp).toBeNull(); expectTypeOf(data.firstJoinLobbyTimestamp).toEqualTypeOf(); expect(data.firstJoinLobbyAt).toBeDefined(); - expect(data.firstJoinLobbyAt).toBeNull(); expectTypeOf(data.firstJoinLobbyAt).toEqualTypeOf(); expect(data.totalTributes).toBeDefined(); expect(data.totalTributes).toBeGreaterThanOrEqual(0); @@ -22,10 +20,5 @@ test('PlayerTourney', () => { expect(data.hidePurchased).toBeDefined(); expectTypeOf(data.hidePurchased).toEqualTypeOf(); expect(data.tourneyData).toBeDefined(); - data.tourneyData.forEach((tourney) => { - expect(tourney).toBeDefined(); - expect(tourney).toBeInstanceOf(PlayerTourneyData); - expectTypeOf(tourney).toEqualTypeOf(); - }); expectTypeOf(data.tourneyData).toEqualTypeOf(); }); diff --git a/src/Structures/Player/PlayerTourney/PlayerTourneyData.test.ts b/src/Structures/Player/PlayerTourney/PlayerTourneyData.test.ts index 466a1e856..c02ed218c 100644 --- a/src/Structures/Player/PlayerTourney/PlayerTourneyData.test.ts +++ b/src/Structures/Player/PlayerTourney/PlayerTourneyData.test.ts @@ -2,7 +2,7 @@ import PlayerTourneyData from './PlayerTourneyData.js'; import { expect, expectTypeOf, test } from 'vitest'; test('PlayerTourneyData', () => { - const data = new PlayerTourneyData({ stats: 'meow' }, 'meow'); + const data = new PlayerTourneyData({ stats: 'meow' }, 'mrrp'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(PlayerTourneyData); expectTypeOf(data).toEqualTypeOf(); @@ -15,10 +15,8 @@ test('PlayerTourneyData', () => { expect(data.tributes).toBeGreaterThanOrEqual(0); expectTypeOf(data.tributes).toEqualTypeOf(); expect(data.firstWinTimestamp).toBeDefined(); - expect(data.firstWinTimestamp).toBeNull(); expectTypeOf(data.firstWinTimestamp).toEqualTypeOf(); expect(data.firstWinAt).toBeDefined(); - expect(data.firstWinAt).toBeNull(); expectTypeOf(data.firstWinAt).toEqualTypeOf(); expect(data.claimedReward).toBeDefined(); expect(data.claimedReward).toBeGreaterThanOrEqual(0); diff --git a/src/Structures/RecentGame.test.ts b/src/Structures/RecentGame.test.ts new file mode 100644 index 000000000..8760b0f1e --- /dev/null +++ b/src/Structures/RecentGame.test.ts @@ -0,0 +1,31 @@ +import Game from './Game.js'; +import RecentGame from './RecentGame.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('RecentGame', () => { + const data = new RecentGame({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(RecentGame); + expectTypeOf(data).toEqualTypeOf(); + expect(data.game).toBeDefined(); + expectTypeOf(data.game).toEqualTypeOf(); + expect(data.dateTimestamp).toBeDefined(); + expectTypeOf(data.dateTimestamp).toEqualTypeOf(); + expect(data.dateAt).toBeDefined(); + expectTypeOf(data.dateAt).toEqualTypeOf(); + expect(data.mode).toBeDefined(); + expectTypeOf(data.mode).toEqualTypeOf(); + expect(data.map).toBeDefined(); + expectTypeOf(data.map).toEqualTypeOf(); + expect(data.ongoing).toBeDefined(); + expectTypeOf(data.ongoing).toEqualTypeOf(); + expect(data.endedTimestamp).toBeDefined(); + expectTypeOf(data.endedTimestamp).toEqualTypeOf(); + expect(data.endedAt).toBeDefined(); + expectTypeOf(data.endedAt).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string | null>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.mode); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Auctions/SkyBlockAuction.test.ts b/src/Structures/SkyBlock/Auctions/SkyBlockAuction.test.ts index 6e4284428..204890ea0 100644 --- a/src/Structures/SkyBlock/Auctions/SkyBlockAuction.test.ts +++ b/src/Structures/SkyBlock/Auctions/SkyBlockAuction.test.ts @@ -12,8 +12,10 @@ test('SkyBlockAuction', () => { expect(data.coop).toBeDefined(); expectTypeOf(data.coop).toEqualTypeOf(); expect(data.auctionStartTimestamp).toBeDefined(); + expect(data.auctionStartTimestamp).toBeGreaterThanOrEqual(0); expectTypeOf(data.auctionStartTimestamp).toEqualTypeOf(); expect(data.auctionStartAt).toBeDefined(); + expect(data.auctionStartAt).toBeInstanceOf(Date); expectTypeOf(data.auctionStartAt).toEqualTypeOf(); expect(data.auctionEndTimestamp).toBeDefined(); expectTypeOf(data.auctionEndTimestamp).toEqualTypeOf(); @@ -26,16 +28,13 @@ test('SkyBlockAuction', () => { expect(data.rarity).toBeDefined(); expectTypeOf(data.rarity).toEqualTypeOf(); expect(data.startingBid).toBeDefined(); + expect(data.startingBid).toBeGreaterThanOrEqual(0); expectTypeOf(data.startingBid).toEqualTypeOf(); expect(data.highestBid).toBeDefined(); + expect(data.highestBid).toBeGreaterThanOrEqual(0); expectTypeOf(data.highestBid).toEqualTypeOf(); expect(data.bids).toBeDefined(); expectTypeOf(data.bids).toEqualTypeOf(); - data.bids.forEach((bid: SkyBlockAuctionBid) => { - expect(bid).toBeDefined(); - expect(bid).toBeInstanceOf(SkyBlockAuctionBid); - expectTypeOf(bid).toEqualTypeOf(); - }); expect(data.claimed).toBeDefined(); expectTypeOf(data.claimed).toEqualTypeOf(); expect(data.claimedBidders).toBeDefined(); @@ -43,6 +42,6 @@ test('SkyBlockAuction', () => { expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => string>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.item); + expect(data.toString()).toBe(data.item); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Auctions/SkyBlockAuctionBid.test.ts b/src/Structures/SkyBlock/Auctions/SkyBlockAuctionBid.test.ts index 3fe6ee30d..3f4291dc4 100644 --- a/src/Structures/SkyBlock/Auctions/SkyBlockAuctionBid.test.ts +++ b/src/Structures/SkyBlock/Auctions/SkyBlockAuctionBid.test.ts @@ -12,15 +12,19 @@ test('SkyBlockAuctionBid', () => { expect(data.profileId).toBeDefined(); expectTypeOf(data.profileId).toEqualTypeOf(); expect(data.amount).toBeDefined(); + expect(data.amount).toBeGreaterThanOrEqual(0); expectTypeOf(data.amount).toEqualTypeOf(); expect(data.timestamp).toBeDefined(); + expect(data.timestamp).toBeGreaterThanOrEqual(0); expectTypeOf(data.timestamp).toEqualTypeOf(); expect(data.at).toBeDefined(); + expect(data.at).toBeInstanceOf(Date); expectTypeOf(data.at).toEqualTypeOf(); expect(data.bidder).toBeDefined(); expectTypeOf(data.bidder).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => number>(); expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.amount); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Auctions/SkyBlockAuctionInfo.test.ts b/src/Structures/SkyBlock/Auctions/SkyBlockAuctionInfo.test.ts index a0c5b9dd3..7d011d277 100644 --- a/src/Structures/SkyBlock/Auctions/SkyBlockAuctionInfo.test.ts +++ b/src/Structures/SkyBlock/Auctions/SkyBlockAuctionInfo.test.ts @@ -1,15 +1,18 @@ -import SkyBlockAuctionsInfo from './SkyBlockAuctionInfo.js'; +import SkyBlockAuctionInfo from './SkyBlockAuctionInfo.js'; import { expect, expectTypeOf, test } from 'vitest'; -test('SkyBlockAuctionsInfo', () => { - const data = new SkyBlockAuctionsInfo({ stats: 'meow' }); +test('SkyBlockAuctionInfo', () => { + const data = new SkyBlockAuctionInfo({ stats: 'meow' }); expect(data).toBeDefined(); - expect(data).toBeInstanceOf(SkyBlockAuctionsInfo); - expectTypeOf(data).toEqualTypeOf(); + expect(data).toBeInstanceOf(SkyBlockAuctionInfo); + expectTypeOf(data).toEqualTypeOf(); expect(data.page).toBeDefined(); + expect(data.page).toBeGreaterThanOrEqual(0); expectTypeOf(data.page).toEqualTypeOf(); expect(data.totalPages).toBeDefined(); + expect(data.totalPages).toBeGreaterThanOrEqual(0); expectTypeOf(data.totalPages).toEqualTypeOf(); expect(data.totalAuctions).toBeDefined(); + expect(data.totalAuctions).toBeGreaterThanOrEqual(0); expectTypeOf(data.totalAuctions).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Auctions/SkyBlockBaseAuction.test.ts b/src/Structures/SkyBlock/Auctions/SkyBlockBaseAuction.test.ts index 3a3971fe9..1b5baba4f 100644 --- a/src/Structures/SkyBlock/Auctions/SkyBlockBaseAuction.test.ts +++ b/src/Structures/SkyBlock/Auctions/SkyBlockBaseAuction.test.ts @@ -2,7 +2,7 @@ import ItemBytes from '../../ItemBytes.js'; import SkyBlockBaseAuction from './SkyBlockBaseAuction.js'; import { expect, expectTypeOf, test } from 'vitest'; -test('SkyBlockBaseAuction (ItemBytes False)', () => { +test('SkyBlockBaseAuction', () => { const data = new SkyBlockBaseAuction({ stats: 'meow' }, false); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockBaseAuction); @@ -20,26 +20,6 @@ test('SkyBlockBaseAuction (ItemBytes False)', () => { expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => string>(); expect(data.toString()).toBeDefined(); - expectTypeOf(data.toString()).toEqualTypeOf(); -}); - -test('SkyBlockBaseAuction (ItemBytes True)', () => { - const data = new SkyBlockBaseAuction({ stats: 'meow' }, true); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(SkyBlockBaseAuction); - expectTypeOf(data).toEqualTypeOf(); - expect(data.auctionId).toBeDefined(); - expectTypeOf(data.auctionId).toEqualTypeOf(); - expect(data.auctioneerUuid).toBeDefined(); - expectTypeOf(data.auctioneerUuid).toEqualTypeOf(); - expect(data.auctioneerProfile).toBeDefined(); - expectTypeOf(data.auctioneerProfile).toEqualTypeOf(); - expect(data.bin).toBeDefined(); - expectTypeOf(data.bin).toEqualTypeOf(); - expect(data.itemBytes).toBeDefined(); - expectTypeOf(data.itemBytes).toEqualTypeOf(); - expect(data.toString).toBeDefined(); - expectTypeOf(data.toString).toEqualTypeOf<() => string>(); - expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.auctionId); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.test.ts b/src/Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.test.ts index 304609429..e814611f5 100644 --- a/src/Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.test.ts +++ b/src/Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.test.ts @@ -7,7 +7,9 @@ test('SkyBlockBaseAuctionInfo', () => { expect(data).toBeInstanceOf(SkyBlockBaseAuctionInfo); expectTypeOf(data).toEqualTypeOf(); expect(data.lastUpdatedTimestamp).toBeDefined(); + expect(data.lastUpdatedTimestamp).toBeGreaterThanOrEqual(0); expectTypeOf(data.lastUpdatedTimestamp).toEqualTypeOf(); expect(data.lastUpdatedAt).toBeDefined(); + expect(data.lastUpdatedAt).toBeInstanceOf(Date); expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Bazaar/SkyBlockBazaar.test.ts b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaar.test.ts index ff1d7ef5f..4b5a9fe22 100644 --- a/src/Structures/SkyBlock/Bazaar/SkyBlockBazaar.test.ts +++ b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaar.test.ts @@ -1,7 +1,6 @@ import SkyBlockBazaar from './SkyBlockBazaar.js'; import SkyBlockBazaarProduct from './SkyBlockBazaarProduct.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type { BazaarProduct } from '../../../Types/SkyBlock.js'; test('SkyBlockBazaar', () => { const data = new SkyBlockBazaar({ stats: 'meow' }); @@ -9,18 +8,11 @@ test('SkyBlockBazaar', () => { expect(data).toBeInstanceOf(SkyBlockBazaar); expectTypeOf(data).toEqualTypeOf(); expect(data.lastUpdated).toBeDefined(); + expect(data.lastUpdated).toBeGreaterThanOrEqual(0); expectTypeOf(data.lastUpdated).toEqualTypeOf(); expect(data.lastUpdatedAt).toBeDefined(); + expect(data.lastUpdatedAt).toBeInstanceOf(Date); expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); expect(data.products).toBeDefined(); expectTypeOf(data.products).toEqualTypeOf(); - data.products.forEach((product) => { - expect(product).toBeDefined(); - expect(product).toBeInstanceOf(SkyBlockBazaarProduct); - expectTypeOf(product).toEqualTypeOf(); - expect(product.toString).toBeDefined(); - expectTypeOf(product.toString).toEqualTypeOf<() => BazaarProduct | 'UNKNOWN'>(); - expect(product.toString()).toBeDefined(); - expectTypeOf(product.toString()).toEqualTypeOf(); - }); }); diff --git a/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarProduct.test.ts b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarProduct.test.ts index b143f58bc..faadac7a2 100644 --- a/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarProduct.test.ts +++ b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarProduct.test.ts @@ -16,9 +16,11 @@ test('SkyBlockBazaarProduct', () => { expect(data.buySummary).toBeDefined(); expectTypeOf(data.buySummary).toEqualTypeOf(); expect(data.quickStatus).toBeDefined(); + expect(data.quickStatus).toBeInstanceOf(SkyBlockBazaarQuickStatus); expectTypeOf(data.quickStatus).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => BazaarProduct | 'UNKNOWN'>(); expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.productId); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarProductOrder.test.ts b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarProductOrder.test.ts index 1b40282dd..93443593f 100644 --- a/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarProductOrder.test.ts +++ b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarProductOrder.test.ts @@ -7,13 +7,17 @@ test('SkyBlockBazaarProductOrder', () => { expect(data).toBeInstanceOf(SkyBlockBazaarProductOrder); expectTypeOf(data).toEqualTypeOf(); expect(data.amount).toBeDefined(); + expect(data.amount).toBeGreaterThanOrEqual(0); expectTypeOf(data.amount).toEqualTypeOf(); expect(data.pricePerUnit).toBeDefined(); + expect(data.pricePerUnit).toBeGreaterThanOrEqual(0); expectTypeOf(data.pricePerUnit).toEqualTypeOf(); expect(data.orders).toBeDefined(); + expect(data.orders).toBeGreaterThanOrEqual(0); expectTypeOf(data.orders).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => number>(); expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.amount); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarQuickStatus.test.ts b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarQuickStatus.test.ts index 94751729b..079f42df1 100644 --- a/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarQuickStatus.test.ts +++ b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaarQuickStatus.test.ts @@ -10,23 +10,32 @@ test('SkyBlockBazaarQuickStatus', () => { expect(data.productId).toBeDefined(); expectTypeOf(data.productId).toEqualTypeOf(); expect(data.sellPrice).toBeDefined(); + expect(data.sellPrice).toBeGreaterThanOrEqual(0); expectTypeOf(data.sellPrice).toEqualTypeOf(); expect(data.sellVolume).toBeDefined(); + expect(data.sellVolume).toBeGreaterThanOrEqual(0); expectTypeOf(data.sellVolume).toEqualTypeOf(); expect(data.sellMovingWeek).toBeDefined(); + expect(data.sellMovingWeek).toBeGreaterThanOrEqual(0); expectTypeOf(data.sellMovingWeek).toEqualTypeOf(); expect(data.sellOrders).toBeDefined(); + expect(data.sellOrders).toBeGreaterThanOrEqual(0); expectTypeOf(data.sellOrders).toEqualTypeOf(); expect(data.buyPrice).toBeDefined(); + expect(data.buyPrice).toBeGreaterThanOrEqual(0); expectTypeOf(data.buyPrice).toEqualTypeOf(); expect(data.buyVolume).toBeDefined(); + expect(data.buyVolume).toBeGreaterThanOrEqual(0); expectTypeOf(data.buyVolume).toEqualTypeOf(); expect(data.buyMovingWeek).toBeDefined(); + expect(data.buyMovingWeek).toBeGreaterThanOrEqual(0); expectTypeOf(data.buyMovingWeek).toEqualTypeOf(); expect(data.buyOrders).toBeDefined(); + expect(data.buyOrders).toBeGreaterThanOrEqual(0); expectTypeOf(data.buyOrders).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => BazaarProduct | 'UNKNOWN'>(); expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.productId); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Bingo/SkyBlockBingo.test.ts b/src/Structures/SkyBlock/Bingo/SkyBlockBingo.test.ts index cd272fd0b..aacc52fa5 100644 --- a/src/Structures/SkyBlock/Bingo/SkyBlockBingo.test.ts +++ b/src/Structures/SkyBlock/Bingo/SkyBlockBingo.test.ts @@ -7,28 +7,33 @@ test('SkyBlockBingo', () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockBingo); expectTypeOf(data).toEqualTypeOf(); - expect(data.lastUpdatedTimestamp).toBeDefined(); + expect(data.lastUpdatedTimestamp).toBeGreaterThanOrEqual(0); expectTypeOf(data.lastUpdatedTimestamp).toEqualTypeOf(); expect(data.lastUpdatedAt).toBeDefined(); + expect(data.lastUpdatedAt).toBeInstanceOf(Date); expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); expect(data.id).toBeDefined(); expectTypeOf(data.id).toEqualTypeOf(); expect(data.name).toBeDefined(); expectTypeOf(data.name).toEqualTypeOf(); expect(data.start).toBeDefined(); + expect(data.start).toBeGreaterThanOrEqual(0); expectTypeOf(data.start).toEqualTypeOf(); expect(data.startAt).toBeDefined(); + expect(data.startAt).toBeInstanceOf(Date); expectTypeOf(data.startAt).toEqualTypeOf(); expect(data.end).toBeDefined(); + expect(data.end).toBeGreaterThanOrEqual(0); expectTypeOf(data.end).toEqualTypeOf(); expect(data.endAt).toBeDefined(); + expect(data.endAt).toBeInstanceOf(Date); expectTypeOf(data.endAt).toEqualTypeOf(); expect(data.goals).toBeDefined(); expectTypeOf(data.goals).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => number | null>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.id); + expect(data.toString()).toBe(data.id); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Bingo/SkyBlockBingoGoal.test.ts b/src/Structures/SkyBlock/Bingo/SkyBlockBingoGoal.test.ts index e9662d5db..bb74384ec 100644 --- a/src/Structures/SkyBlock/Bingo/SkyBlockBingoGoal.test.ts +++ b/src/Structures/SkyBlock/Bingo/SkyBlockBingoGoal.test.ts @@ -18,6 +18,7 @@ test('SkyBlockBingoGoal', () => { expect(data.lore).toBeDefined(); expectTypeOf(data.lore).toEqualTypeOf(); expect(data.progress).toBeDefined(); + expect(data.progress).toBeGreaterThanOrEqual(0); expectTypeOf(data.progress).toEqualTypeOf(); expect(data.tiers).toBeDefined(); expectTypeOf(data.tiers).toEqualTypeOf(); @@ -28,6 +29,6 @@ test('SkyBlockBingoGoal', () => { expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => string>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.id); + expect(data.toString()).toBe(data.id); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Collections/SkyBlockCollection.test.ts b/src/Structures/SkyBlock/Collections/SkyBlockCollection.test.ts index 6317b0b66..564e9a321 100644 --- a/src/Structures/SkyBlock/Collections/SkyBlockCollection.test.ts +++ b/src/Structures/SkyBlock/Collections/SkyBlockCollection.test.ts @@ -3,7 +3,7 @@ import SkyBlockCollectionTier from './SkyBlockCollectionTier.js'; import { expect, expectTypeOf, test } from 'vitest'; test('SkyBlockCollection', () => { - const data = new SkyBlockCollection({ stats: 'meow' }, 'a'); + const data = new SkyBlockCollection({ stats: 'meow' }, 'mrrp'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockCollection); expectTypeOf(data).toEqualTypeOf(); @@ -12,12 +12,13 @@ test('SkyBlockCollection', () => { expect(data.name).toBeDefined(); expectTypeOf(data.name).toEqualTypeOf(); expect(data.maxTiers).toBeDefined(); + expect(data.maxTiers).toBeGreaterThanOrEqual(0); expectTypeOf(data.maxTiers).toEqualTypeOf(); expect(data.tiers).toBeDefined(); expectTypeOf(data.tiers).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => string>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.id); + expect(data.toString()).toBe(data.id); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Collections/SkyBlockCollectionTier.test.ts b/src/Structures/SkyBlock/Collections/SkyBlockCollectionTier.test.ts index 4caf0784e..6cd138dd9 100644 --- a/src/Structures/SkyBlock/Collections/SkyBlockCollectionTier.test.ts +++ b/src/Structures/SkyBlock/Collections/SkyBlockCollectionTier.test.ts @@ -6,10 +6,11 @@ test('SkyBlockCollectionTier', () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockCollectionTier); expectTypeOf(data).toEqualTypeOf(); - expect(data.tier).toBeDefined(); + expect(data.tier).toBeGreaterThanOrEqual(0); expectTypeOf(data.tier).toEqualTypeOf(); expect(data.amountRequired).toBeDefined(); + expect(data.amountRequired).toBeGreaterThanOrEqual(0); expectTypeOf(data.amountRequired).toEqualTypeOf(); expect(data.unlocks).toBeDefined(); expectTypeOf(data.unlocks).toEqualTypeOf(); diff --git a/src/Structures/SkyBlock/Collections/SkyBlockCollections.test.ts b/src/Structures/SkyBlock/Collections/SkyBlockCollections.test.ts index f7fefa64d..34b326351 100644 --- a/src/Structures/SkyBlock/Collections/SkyBlockCollections.test.ts +++ b/src/Structures/SkyBlock/Collections/SkyBlockCollections.test.ts @@ -3,15 +3,15 @@ import SkyBlockCollections from './SkyBlockCollections.js'; import { expect, expectTypeOf, test } from 'vitest'; test('SkyBlockCollections', () => { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - const data = new SkyBlockCollections(); + const data = new SkyBlockCollections({ stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockCollections); expectTypeOf(data).toEqualTypeOf(); expect(data.lastUpdated).toBeDefined(); + expect(data.lastUpdated).toBeGreaterThanOrEqual(0); expectTypeOf(data.lastUpdated).toEqualTypeOf(); expect(data.lastUpdatedAt).toBeDefined(); + expect(data.lastUpdatedAt).toBeInstanceOf(Date); expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); expect(data.version).toBeDefined(); expectTypeOf(data.version).toEqualTypeOf(); @@ -30,6 +30,6 @@ test('SkyBlockCollections', () => { expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => string>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.version); + expect(data.toString()).toBe(data.version); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Election/SkyBlockElection.test.ts b/src/Structures/SkyBlock/Election/SkyBlockElection.test.ts index 0443b79a8..9adc2a7ba 100644 --- a/src/Structures/SkyBlock/Election/SkyBlockElection.test.ts +++ b/src/Structures/SkyBlock/Election/SkyBlockElection.test.ts @@ -8,17 +8,13 @@ test('SkyBlockElection', () => { expect(data).toBeInstanceOf(SkyBlockElection); expectTypeOf(data).toEqualTypeOf(); expect(data.year).toBeDefined(); + expect(data.year).toBeGreaterThanOrEqual(0); expectTypeOf(data.year).toEqualTypeOf(); expect(data.candidates).toBeDefined(); expectTypeOf(data.candidates).toEqualTypeOf(); - data.candidates.forEach((candidate) => { - expect(candidate).toBeDefined(); - expect(candidate).toBeInstanceOf(SkyBlockElectionCandidate); - expectTypeOf(candidate).toEqualTypeOf(); - }); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => number>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.year); + expect(data.toString()).toBe(data.year); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Election/SkyBlockElectionCandidate.test.ts b/src/Structures/SkyBlock/Election/SkyBlockElectionCandidate.test.ts index 1b46b4f6b..81679efb9 100644 --- a/src/Structures/SkyBlock/Election/SkyBlockElectionCandidate.test.ts +++ b/src/Structures/SkyBlock/Election/SkyBlockElectionCandidate.test.ts @@ -15,10 +15,11 @@ test('SkyBlockElectionCandidate', () => { expect(data.perks).toBeDefined(); expectTypeOf(data.perks).toEqualTypeOf(); expect(data.votesReceived).toBeDefined(); + expect(data.votesReceived).toBeGreaterThanOrEqual(0); expectTypeOf(data.votesReceived).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => SkyBlockMayor | 'UNKNOWN'>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.name); + expect(data.toString()).toBe(data.name); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Election/SkyBlockElectionCandidate.ts b/src/Structures/SkyBlock/Election/SkyBlockElectionCandidate.ts index d552ebe13..bea876960 100644 --- a/src/Structures/SkyBlock/Election/SkyBlockElectionCandidate.ts +++ b/src/Structures/SkyBlock/Election/SkyBlockElectionCandidate.ts @@ -1,7 +1,7 @@ import SkyBlockElectionCandidatePerk from './SkyBlockElectionCandidatePerk.js'; import type { SkyBlockCandidateKeyBenefit, SkyBlockMayor } from '../../../Types/SkyBlock.js'; -class SkyBlockElectronCandidate { +class SkyBlockElectionCandidate { name: SkyBlockMayor | 'UNKNOWN'; keyBenefit: SkyBlockCandidateKeyBenefit | 'UNKNOWN'; perks: SkyBlockElectionCandidatePerk[]; @@ -18,4 +18,4 @@ class SkyBlockElectronCandidate { } } -export default SkyBlockElectronCandidate; +export default SkyBlockElectionCandidate; diff --git a/src/Structures/SkyBlock/Election/SkyBlockElectionCandidatePerk.test.ts b/src/Structures/SkyBlock/Election/SkyBlockElectionCandidatePerk.test.ts index d5b771111..08b2202d1 100644 --- a/src/Structures/SkyBlock/Election/SkyBlockElectionCandidatePerk.test.ts +++ b/src/Structures/SkyBlock/Election/SkyBlockElectionCandidatePerk.test.ts @@ -15,6 +15,6 @@ test('SkyBlockElectionCandidatePerk', () => { expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => string>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.name); + expect(data.toString()).toBe(data.name); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Election/SkyBlockElectionData.test.ts b/src/Structures/SkyBlock/Election/SkyBlockElectionData.test.ts index d8e7dd77b..127683ad9 100644 --- a/src/Structures/SkyBlock/Election/SkyBlockElectionData.test.ts +++ b/src/Structures/SkyBlock/Election/SkyBlockElectionData.test.ts @@ -8,10 +8,13 @@ test('SkyBlockElectionData', () => { expect(data).toBeInstanceOf(SkyBlockElectionData); expectTypeOf(data).toEqualTypeOf(); expect(data.lastUpdatedTimestamp).toBeDefined(); + expect(data.lastUpdatedTimestamp).toBeGreaterThanOrEqual(0); expectTypeOf(data.lastUpdatedTimestamp).toEqualTypeOf(); expect(data.lastUpdatedAt).toBeDefined(); + expect(data.lastUpdatedAt).toBeInstanceOf(Date); expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); expect(data.lastElectionResults).toBeDefined(); + expect(data.lastElectionResults).toBeInstanceOf(SkyBlockElection); expectTypeOf(data.lastElectionResults).toEqualTypeOf(); expect(data.currentElection).toBeDefined(); expectTypeOf(data.currentElection).toEqualTypeOf(); diff --git a/src/Structures/SkyBlock/FireSale/SkyBlockFireSale.test.ts b/src/Structures/SkyBlock/FireSale/SkyBlockFireSale.test.ts index e18a7078a..1e9fb4ba4 100644 --- a/src/Structures/SkyBlock/FireSale/SkyBlockFireSale.test.ts +++ b/src/Structures/SkyBlock/FireSale/SkyBlockFireSale.test.ts @@ -9,25 +9,26 @@ test('SkyBlockFireSale', () => { expect(data.itemId).toBeDefined(); expectTypeOf(data.itemId).toEqualTypeOf(); expect(data.startTimestamp).toBeDefined(); + expect(data.startTimestamp).toBeGreaterThanOrEqual(0); expectTypeOf(data.startTimestamp).toEqualTypeOf(); expect(data.startAt).toBeDefined(); + expect(data.startAt).toBeInstanceOf(Date); expectTypeOf(data.startAt).toEqualTypeOf(); expect(data.endTimestamp).toBeDefined(); + expect(data.endTimestamp).toBeGreaterThanOrEqual(0); expectTypeOf(data.endTimestamp).toEqualTypeOf(); expect(data.endAt).toBeDefined(); + expect(data.endAt).toBeInstanceOf(Date); expectTypeOf(data.endAt).toEqualTypeOf(); expect(data.amount).toBeDefined(); + expect(data.amount).toBeGreaterThanOrEqual(0); expectTypeOf(data.amount).toEqualTypeOf(); expect(data.price).toBeDefined(); + expect(data.price).toBeGreaterThanOrEqual(0); expectTypeOf(data.price).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => string>(); expect(data.toString()).toBeDefined(); expect(data.toString()).toBe(data.itemId); expectTypeOf(data.toString()).toEqualTypeOf(); - expect(data.toString).toBeDefined(); - expectTypeOf(data.toString).toEqualTypeOf<() => string>(); - expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.itemId); - expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGarden.test.ts b/src/Structures/SkyBlock/Garden/SkyBlockGarden.test.ts index b99a390be..111e0c42e 100644 --- a/src/Structures/SkyBlock/Garden/SkyBlockGarden.test.ts +++ b/src/Structures/SkyBlock/Garden/SkyBlockGarden.test.ts @@ -18,29 +18,25 @@ test('SkyBlockGarden', () => { expectTypeOf(data.barnSkin).toEqualTypeOf(); expect(data.unlockedBarnSkins).toBeDefined(); expectTypeOf(data.unlockedBarnSkins).toEqualTypeOf(); - data.unlockedBarnSkins.forEach((unlockedSkin) => { - expect(unlockedSkin).toBeDefined(); - expectTypeOf(unlockedSkin).toEqualTypeOf(); - }); expect(data.unlockedPlots).toBeDefined(); expectTypeOf(data.unlockedPlots).toEqualTypeOf(); - data.unlockedPlots.forEach((unlockedPlot) => { - expect(unlockedPlot).toBeDefined(); - expectTypeOf(unlockedPlot).toEqualTypeOf(); - }); expect(data.visitors).toBeDefined(); + expect(data.visitors).toBeInstanceOf(SkyBlockGardenVisitors); expectTypeOf(data.visitors).toEqualTypeOf(); expect(data.currentVisitors).toBeDefined(); expectTypeOf(data.currentVisitors).toEqualTypeOf(); expect(data.cropMilestones).toBeDefined(); + expect(data.cropMilestones).toBeInstanceOf(SkyBlockGardenCropMilestones); expectTypeOf(data.cropMilestones).toEqualTypeOf(); expect(data.composter).toBeDefined(); + expect(data.composter).toBeInstanceOf(SkyBlockGardenComposter); expectTypeOf(data.composter).toEqualTypeOf(); expect(data.cropUpgrades).toBeDefined(); + expect(data.cropUpgrades).toBeInstanceOf(SkyBlockGardenCropsUpgrades); expectTypeOf(data.cropUpgrades).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => number>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.level.level); + expect(data.toString()).toBe(data.level.level); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitor.test.ts b/src/Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitor.test.ts index 41c0b1665..94ef01550 100644 --- a/src/Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitor.test.ts +++ b/src/Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitor.test.ts @@ -4,7 +4,7 @@ import { expect, expectTypeOf, test } from 'vitest'; import type { VisitorStatus } from '../../../Types/SkyBlock.js'; test('SkyBlockGardenActiveVisitor', () => { - const data = new SkyBlockGardenActiveVisitor({ stats: 'meow' }, 'meow'); + const data = new SkyBlockGardenActiveVisitor({ stats: 'meow' }, 'mrrp'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockGardenActiveVisitor); expectTypeOf(data).toEqualTypeOf(); @@ -15,10 +15,11 @@ test('SkyBlockGardenActiveVisitor', () => { expect(data.status).toBeDefined(); expectTypeOf(data.status).toEqualTypeOf(); expect(data.position).toBeDefined(); + expect(data.position).toBeGreaterThanOrEqual(0); expectTypeOf(data.position).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => string>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.visitor); + expect(data.toString()).toBe(data.visitor); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitorRequirement.test.ts b/src/Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitorRequirement.test.ts index e01646fa8..152074bb6 100644 --- a/src/Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitorRequirement.test.ts +++ b/src/Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitorRequirement.test.ts @@ -9,14 +9,16 @@ test('SkyBlockGardenActiveVisitorRequirement', () => { expect(data.originalItem).toBeDefined(); expectTypeOf(data.originalItem).toEqualTypeOf(); expect(data.originalAmount).toBeDefined(); + expect(data.originalAmount).toBeGreaterThanOrEqual(0); expectTypeOf(data.originalAmount).toEqualTypeOf(); expect(data.item).toBeDefined(); expectTypeOf(data.item).toEqualTypeOf(); expect(data.amount).toBeDefined(); + expect(data.amount).toBeGreaterThanOrEqual(0); expectTypeOf(data.amount).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => number>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.amount); + expect(data.toString()).toBe(data.amount); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGardenComposter.test.ts b/src/Structures/SkyBlock/Garden/SkyBlockGardenComposter.test.ts index ca2382a29..870872454 100644 --- a/src/Structures/SkyBlock/Garden/SkyBlockGardenComposter.test.ts +++ b/src/Structures/SkyBlock/Garden/SkyBlockGardenComposter.test.ts @@ -8,20 +8,26 @@ test('SkyBlockGardenComposter', () => { expect(data).toBeInstanceOf(SkyBlockGardenComposter); expectTypeOf(data).toEqualTypeOf(); expect(data.organicMatter).toBeDefined(); + expect(data.organicMatter).toBeGreaterThanOrEqual(0); expectTypeOf(data.organicMatter).toEqualTypeOf(); expect(data.fuelUnits).toBeDefined(); + expect(data.fuelUnits).toBeGreaterThanOrEqual(0); expectTypeOf(data.fuelUnits).toEqualTypeOf(); expect(data.compostUnits).toBeDefined(); + expect(data.compostUnits).toBeGreaterThanOrEqual(0); expectTypeOf(data.compostUnits).toEqualTypeOf(); expect(data.compostItems).toBeDefined(); + expect(data.compostItems).toBeGreaterThanOrEqual(0); expectTypeOf(data.compostItems).toEqualTypeOf(); expect(data.conversionTicks).toBeDefined(); + expect(data.conversionTicks).toBeGreaterThanOrEqual(0); expectTypeOf(data.conversionTicks).toEqualTypeOf(); expect(data.upgrades).toBeDefined(); + expect(data.upgrades).toBeInstanceOf(SkyBlockGardenComposterUpgrades); expectTypeOf(data.upgrades).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => number>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.organicMatter); + expect(data.toString()).toBe(data.organicMatter); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGardenComposterUpgrades.test.ts b/src/Structures/SkyBlock/Garden/SkyBlockGardenComposterUpgrades.test.ts index c3b4e8710..b5e72b21e 100644 --- a/src/Structures/SkyBlock/Garden/SkyBlockGardenComposterUpgrades.test.ts +++ b/src/Structures/SkyBlock/Garden/SkyBlockGardenComposterUpgrades.test.ts @@ -7,13 +7,18 @@ test('SkyBlockGardenComposterUpgrades', () => { expect(data).toBeInstanceOf(SkyBlockGardenComposterUpgrades); expectTypeOf(data).toEqualTypeOf(); expect(data.speed).toBeDefined(); + expect(data.speed).toBeGreaterThanOrEqual(0); expectTypeOf(data.speed).toEqualTypeOf(); expect(data.multiDrop).toBeDefined(); + expect(data.multiDrop).toBeGreaterThanOrEqual(0); expectTypeOf(data.multiDrop).toEqualTypeOf(); expect(data.fuelCap).toBeDefined(); + expect(data.fuelCap).toBeGreaterThanOrEqual(0); expectTypeOf(data.fuelCap).toEqualTypeOf(); expect(data.organicMatterCap).toBeDefined(); + expect(data.organicMatterCap).toBeGreaterThanOrEqual(0); expectTypeOf(data.organicMatterCap).toEqualTypeOf(); expect(data.costReduction).toBeDefined(); + expect(data.costReduction).toBeGreaterThanOrEqual(0); expectTypeOf(data.costReduction).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGardenCropMilestones.test.ts b/src/Structures/SkyBlock/Garden/SkyBlockGardenCropMilestones.test.ts index 8af82136e..f314f878d 100644 --- a/src/Structures/SkyBlock/Garden/SkyBlockGardenCropMilestones.test.ts +++ b/src/Structures/SkyBlock/Garden/SkyBlockGardenCropMilestones.test.ts @@ -27,9 +27,12 @@ test('SkyBlockGardenCropMilestones', () => { expectTypeOf(data.mushroom).toEqualTypeOf(); expect(data.netherWart).toBeDefined(); expectTypeOf(data.netherWart).toEqualTypeOf(); + expect(data.average).toBeDefined(); + expect(data.average).toBeGreaterThanOrEqual(0); + expectTypeOf(data.average).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => number>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.average); + expect(data.toString()).toBe(data.average); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGardenCropsUpgrades.test.ts b/src/Structures/SkyBlock/Garden/SkyBlockGardenCropsUpgrades.test.ts index 39b817c1a..f90f62026 100644 --- a/src/Structures/SkyBlock/Garden/SkyBlockGardenCropsUpgrades.test.ts +++ b/src/Structures/SkyBlock/Garden/SkyBlockGardenCropsUpgrades.test.ts @@ -7,28 +7,41 @@ test('SkyBlockGardenCropsUpgrades', () => { expect(data).toBeInstanceOf(SkyBlockGardenCropsUpgrades); expectTypeOf(data).toEqualTypeOf(); expect(data.wheat).toBeDefined(); + expect(data.wheat).toBeGreaterThanOrEqual(0); expectTypeOf(data.wheat).toEqualTypeOf(); expect(data.carrot).toBeDefined(); + expect(data.carrot).toBeGreaterThanOrEqual(0); expectTypeOf(data.carrot).toEqualTypeOf(); expect(data.sugarCane).toBeDefined(); + expect(data.sugarCane).toBeGreaterThanOrEqual(0); expectTypeOf(data.sugarCane).toEqualTypeOf(); expect(data.potato).toBeDefined(); + expect(data.potato).toBeGreaterThanOrEqual(0); expectTypeOf(data.potato).toEqualTypeOf(); expect(data.pumpkin).toBeDefined(); + expect(data.pumpkin).toBeGreaterThanOrEqual(0); expectTypeOf(data.pumpkin).toEqualTypeOf(); expect(data.melon).toBeDefined(); + expect(data.melon).toBeGreaterThanOrEqual(0); expectTypeOf(data.melon).toEqualTypeOf(); expect(data.cactus).toBeDefined(); + expect(data.cactus).toBeGreaterThanOrEqual(0); expectTypeOf(data.cactus).toEqualTypeOf(); expect(data.cocoaBeans).toBeDefined(); + expect(data.cocoaBeans).toBeGreaterThanOrEqual(0); expectTypeOf(data.cocoaBeans).toEqualTypeOf(); expect(data.mushroom).toBeDefined(); + expect(data.mushroom).toBeGreaterThanOrEqual(0); expectTypeOf(data.mushroom).toEqualTypeOf(); expect(data.netherWart).toBeDefined(); + expect(data.netherWart).toBeGreaterThanOrEqual(0); expectTypeOf(data.netherWart).toEqualTypeOf(); + expect(data.average).toBeDefined(); + expect(data.average).toBeGreaterThanOrEqual(0); + expectTypeOf(data.average).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => number>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.average); + expect(data.toString()).toBe(data.average); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGardenVisitors.test.ts b/src/Structures/SkyBlock/Garden/SkyBlockGardenVisitors.test.ts index 9ee897e16..18767ce6e 100644 --- a/src/Structures/SkyBlock/Garden/SkyBlockGardenVisitors.test.ts +++ b/src/Structures/SkyBlock/Garden/SkyBlockGardenVisitors.test.ts @@ -11,7 +11,9 @@ test('SkyBlockGardenVisitors', () => { expect(data.completed).toBeDefined(); expectTypeOf(data.completed).toEqualTypeOf>(); expect(data.totalCompleted).toBeDefined(); + expect(data.totalCompleted).toBeGreaterThanOrEqual(0); expectTypeOf(data.totalCompleted).toEqualTypeOf(); expect(data.uniqueNpcsServed).toBeDefined(); + expect(data.uniqueNpcsServed).toBeGreaterThanOrEqual(0); expectTypeOf(data.uniqueNpcsServed).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.test.ts b/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.test.ts new file mode 100644 index 000000000..73c4578b9 --- /dev/null +++ b/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.test.ts @@ -0,0 +1,163 @@ +import SkyBlockInventoryItem from './SkyBlockInventoryItem.js'; +import SkyBlockInventoryItemAttribute from './SkyBlockInventoryItemAttribute.js'; +import SkyBlockInventoryItemEnchantment from './SkyBlockInventoryItemEnchantment.js'; +import SkyBlockInventoryItemRune from './SkyBlockInventoryItemRune.js'; +import SkyBlockPotionEffect from '../Potion/SkyBlockPotionEffect.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { Rarity } from '../../../Types/SkyBlock.js'; +import type { UUID } from '../../../Types/Global.js'; + +test('SkyBlockInventoryItem', () => { + const data = new SkyBlockInventoryItem({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockInventoryItem); + expectTypeOf(data).toEqualTypeOf(); + expect(data.minecraftItemId).toBeDefined(); + expect(data.minecraftItemId).toBeGreaterThanOrEqual(0); + expectTypeOf(data.minecraftItemId).toEqualTypeOf(); + expect(data.itemCount).toBeDefined(); + expect(data.itemCount).toBeGreaterThanOrEqual(0); + expectTypeOf(data.itemCount).toEqualTypeOf(); + expect(data.itemDamage).toBeDefined(); + expect(data.itemDamage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.itemDamage).toEqualTypeOf(); + expect(data.unbreakable).toBeDefined(); + expectTypeOf(data.unbreakable).toEqualTypeOf(); + expect(data.hideFlags).toBeDefined(); + expectTypeOf(data.hideFlags).toEqualTypeOf(); + expect(data.lore).toBeDefined(); + expectTypeOf(data.lore).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.color).toBeDefined(); + expectTypeOf(data.color).toEqualTypeOf(); + expect(data.recombobulated).toBeDefined(); + expectTypeOf(data.recombobulated).toEqualTypeOf(); + expect(data.statsBook).toBeDefined(); + expectTypeOf(data.statsBook).toEqualTypeOf(); + expect(data.runes).toBeDefined(); + expectTypeOf(data.runes).toEqualTypeOf(); + expect(data.reforge).toBeDefined(); + expectTypeOf(data.reforge).toEqualTypeOf(); + expect(data.hasArtOfWar).toBeDefined(); + expectTypeOf(data.hasArtOfWar).toEqualTypeOf(); + expect(data.starCount).toBeDefined(); + expect(data.starCount).toBeGreaterThanOrEqual(0); + expectTypeOf(data.starCount).toEqualTypeOf(); + expect(data.enchantments).toBeDefined(); + expectTypeOf(data.enchantments).toEqualTypeOf(); + expect(data.uuid).toBeDefined(); + expectTypeOf(data.uuid).toEqualTypeOf(); + expect(data.hotPotatoBookCount).toBeDefined(); + expectTypeOf(data.hotPotatoBookCount).toEqualTypeOf(); + expect(data.championCombatXP).toBeDefined(); + expectTypeOf(data.championCombatXP).toEqualTypeOf(); + expect(data.id).toBeDefined(); + expectTypeOf(data.id).toEqualTypeOf(); + expect(data.hasDonatedItem).toBeDefined(); + expectTypeOf(data.hasDonatedItem).toEqualTypeOf(); + expect(data.transmissionTunerCount).toBeDefined(); + expectTypeOf(data.transmissionTunerCount).toEqualTypeOf(); + expect(data.powerAbilityScroll).toBeDefined(); + expectTypeOf(data.powerAbilityScroll).toEqualTypeOf(); + expect(data.hasEtherwarp).toBeDefined(); + expectTypeOf(data.hasEtherwarp).toEqualTypeOf(); + expect(data.isDungeonItem).toBeDefined(); + expectTypeOf(data.isDungeonItem).toEqualTypeOf(); + expect(data.abilityScrolls).toBeDefined(); + expectTypeOf(data.abilityScrolls).toEqualTypeOf(); + expect(data.dungeonSkillRequirement).toBeDefined(); + expectTypeOf(data.dungeonSkillRequirement).toEqualTypeOf(); + expect(data.baseStatBoostPercentage).toBeDefined(); + expectTypeOf(data.baseStatBoostPercentage).toEqualTypeOf(); + expect(data.itemTier).toBeDefined(); + expectTypeOf(data.itemTier).toEqualTypeOf(); + expect(data.manaDisintergratorCount).toBeDefined(); + expectTypeOf(data.manaDisintergratorCount).toEqualTypeOf(); + expect(data.skin).toBeDefined(); + expectTypeOf(data.skin).toEqualTypeOf(); + expect(data.blazetekkChannel).toBeDefined(); + expectTypeOf(data.blazetekkChannel).toEqualTypeOf(); + expect(data.capturedPlayer).toBeDefined(); + expectTypeOf(data.capturedPlayer).toEqualTypeOf(); + expect(data.cakeOwner).toBeDefined(); + expectTypeOf(data.cakeOwner).toEqualTypeOf(); + expect(data.soulDurability).toBeDefined(); + expectTypeOf(data.soulDurability).toEqualTypeOf(); + expect(data.initiatorPlayer).toBeDefined(); + expectTypeOf(data.initiatorPlayer).toEqualTypeOf(); + expect(data.isShiny).toBeDefined(); + expectTypeOf(data.isShiny).toEqualTypeOf(); + expect(data.attributes).toBeDefined(); + expectTypeOf(data.attributes).toEqualTypeOf(); + expect(data.jalapenoCount).toBeDefined(); + expectTypeOf(data.jalapenoCount).toEqualTypeOf(); + expect(data.hecatombSRuns).toBeDefined(); + expectTypeOf(data.hecatombSRuns).toEqualTypeOf(); + expect(data.dungeonItemLevel).toBeDefined(); + expectTypeOf(data.dungeonItemLevel).toEqualTypeOf(); + expect(data.originTag).toBeDefined(); + expectTypeOf(data.originTag).toEqualTypeOf(); + expect(data.hasArtOfPeace).toBeDefined(); + expectTypeOf(data.hasArtOfPeace).toEqualTypeOf(); + expect(data.secondRandomColor).toBeDefined(); + expectTypeOf(data.secondRandomColor).toEqualTypeOf(); + expect(data.dyeItem).toBeDefined(); + expectTypeOf(data.dyeItem).toEqualTypeOf(); + expect(data.raffleYear).toBeDefined(); + expectTypeOf(data.raffleYear).toEqualTypeOf(); + expect(data.raffleWin).toBeDefined(); + expectTypeOf(data.raffleWin).toEqualTypeOf(); + expect(data.edition).toBeDefined(); + expectTypeOf(data.edition).toEqualTypeOf(); + expect(data.recipientName).toBeDefined(); + expectTypeOf(data.recipientName).toEqualTypeOf(); + expect(data.recipientUUID).toBeDefined(); + expectTypeOf(data.recipientUUID).toEqualTypeOf(); + expect(data.bossTier).toBeDefined(); + expectTypeOf(data.bossTier).toEqualTypeOf(); + expect(data.divanPowerCoating).toBeDefined(); + expectTypeOf(data.divanPowerCoating).toEqualTypeOf(); + expect(data.year).toBeDefined(); + expectTypeOf(data.year).toEqualTypeOf(); + expect(data.bossId).toBeDefined(); + expectTypeOf(data.bossId).toEqualTypeOf(); + expect(data.spawnedFor).toBeDefined(); + expectTypeOf(data.spawnedFor).toEqualTypeOf(); + expect(data.emanKills).toBeDefined(); + expectTypeOf(data.emanKills).toEqualTypeOf(); + expect(data.isRiftTransferable).toBeDefined(); + expectTypeOf(data.isRiftTransferable).toEqualTypeOf(); + expect(data.coinsGained).toBeDefined(); + expectTypeOf(data.coinsGained).toEqualTypeOf(); + expect(data.ranchersSpeed).toBeDefined(); + expectTypeOf(data.ranchersSpeed).toEqualTypeOf(); + expect(data.favoriteSentinalWarden).toBeDefined(); + expectTypeOf(data.favoriteSentinalWarden).toEqualTypeOf(); + expect(data.potionLevel).toBeDefined(); + expectTypeOf(data.potionLevel).toEqualTypeOf(); + expect(data.potion).toBeDefined(); + expectTypeOf(data.potion).toEqualTypeOf(); + expect(data.potionEffects).toBeDefined(); + expectTypeOf(data.potionEffects).toEqualTypeOf(); + expect(data.potionType).toBeDefined(); + expectTypeOf(data.potionType).toEqualTypeOf(); + expect(data.isSplashPotion).toBeDefined(); + expectTypeOf(data.isSplashPotion).toEqualTypeOf(); + expect(data.potionName).toBeDefined(); + expectTypeOf(data.potionName).toEqualTypeOf(); + expect(data.isDungeonPotion).toBeDefined(); + expectTypeOf(data.isDungeonPotion).toEqualTypeOf(); + expect(data.gearScore).toBeDefined(); + expect(data.gearScore).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gearScore).toEqualTypeOf(); + expect(data.rarity).toBeDefined(); + expectTypeOf(data.rarity).toEqualTypeOf(); + expect(data.raw).toBeDefined(); + expectTypeOf(data.raw).toEqualTypeOf>(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.name); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.ts b/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.ts index caa1f63d1..9efd06f1f 100644 --- a/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.ts +++ b/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItem.ts @@ -22,7 +22,7 @@ class SkyBlockInventoryItem { starCount: number; enchantments: SkyBlockInventoryItemEnchantment[] | null; uuid: UUID | null; - hotPotatoBookCount: number; + hotPotatoBookCount: number | null; championCombatXP: number | null; id: string; hasDonatedItem: boolean; diff --git a/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItemAttribute.test.ts b/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItemAttribute.test.ts new file mode 100644 index 000000000..f6a3f07e7 --- /dev/null +++ b/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItemAttribute.test.ts @@ -0,0 +1,19 @@ +import SkyBlockInventoryItemAttribute from './SkyBlockInventoryItemAttribute.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockInventoryItemAttribute', () => { + const data = new SkyBlockInventoryItemAttribute({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockInventoryItemAttribute); + expectTypeOf(data).toEqualTypeOf(); + expect(data.id).toBeDefined(); + expectTypeOf(data.id).toEqualTypeOf(); + expect(data.tier).toBeDefined(); + expect(data.tier).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tier).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string | 'UNKNOWN'>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.id); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItemEnchantment.test.ts b/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItemEnchantment.test.ts new file mode 100644 index 000000000..53fc658b2 --- /dev/null +++ b/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItemEnchantment.test.ts @@ -0,0 +1,19 @@ +import SkyBlockInventoryItemEnchantment from './SkyBlockInventoryItemEnchantment.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockInventoryItemEnchantment', () => { + const data = new SkyBlockInventoryItemEnchantment({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockInventoryItemEnchantment); + expectTypeOf(data).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expect(data.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string | 'UNKNOWN'>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.name); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItemRune.test.ts b/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItemRune.test.ts new file mode 100644 index 000000000..c78226fa3 --- /dev/null +++ b/src/Structures/SkyBlock/Inventory/SkyBlockInventoryItemRune.test.ts @@ -0,0 +1,19 @@ +import SkyBlockInventoryItemRune from './SkyBlockInventoryItemRune.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyBlockInventoryItemRune', () => { + const data = new SkyBlockInventoryItemRune({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockInventoryItemRune); + expectTypeOf(data).toEqualTypeOf(); + expect(data.runeId).toBeDefined(); + expectTypeOf(data.runeId).toEqualTypeOf(); + expect(data.tier).toBeDefined(); + expect(data.tier).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tier).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string | 'UNKNOWN'>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.runeId); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBag.test.ts b/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBag.test.ts index 48d16f8b7..d54e09251 100644 --- a/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBag.test.ts +++ b/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBag.test.ts @@ -13,14 +13,17 @@ test('SkyBlockMemberAccessoryBag', () => { expect(data.unlockedPowers).toBeDefined(); expectTypeOf(data.unlockedPowers).toEqualTypeOf(); expect(data.bagUpgradesPurchased).toBeDefined(); + expect(data.bagUpgradesPurchased).toBeGreaterThanOrEqual(0); expectTypeOf(data.bagUpgradesPurchased).toEqualTypeOf(); expect(data.highestMagicalPower).toBeDefined(); + expect(data.highestMagicalPower).toBeGreaterThanOrEqual(0); expectTypeOf(data.highestMagicalPower).toEqualTypeOf(); expect(data.tuning).toBeDefined(); + expect(data.tuning).toBeInstanceOf(SkyBlockMemberAccessoryBagTuning); expectTypeOf(data.tuning).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => SkyBlockMemberPower | null>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.selectedPower); + expect(data.toString()).toBe(data.selectedPower); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBagTuning.test.ts b/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBagTuning.test.ts index d3b785fe3..3312b25ae 100644 --- a/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBagTuning.test.ts +++ b/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBagTuning.test.ts @@ -8,26 +8,35 @@ test('SkyBlockMemberAccessoryBagTuning', () => { expect(data).toBeInstanceOf(SkyBlockMemberAccessoryBagTuning); expectTypeOf(data).toEqualTypeOf(); expect(data.highestUnlockedSlot).toBeDefined(); + expect(data.highestUnlockedSlot).toBeGreaterThanOrEqual(0); expectTypeOf(data.highestUnlockedSlot).toEqualTypeOf(); expect(data.slot1).toBeDefined(); + expect(data.slot1).toBeInstanceOf(SkyBlockMemberAccessoryBagTuningSlot); expectTypeOf(data.slot1).toEqualTypeOf(); expect(data.slot2).toBeDefined(); + expect(data.slot2).toBeInstanceOf(SkyBlockMemberAccessoryBagTuningSlot); expectTypeOf(data.slot2).toEqualTypeOf(); expect(data.slot3).toBeDefined(); + expect(data.slot3).toBeInstanceOf(SkyBlockMemberAccessoryBagTuningSlot); expectTypeOf(data.slot3).toEqualTypeOf(); expect(data.slot4).toBeDefined(); + expect(data.slot4).toBeInstanceOf(SkyBlockMemberAccessoryBagTuningSlot); expectTypeOf(data.slot4).toEqualTypeOf(); expect(data.slot5).toBeDefined(); + expect(data.slot5).toBeInstanceOf(SkyBlockMemberAccessoryBagTuningSlot); expectTypeOf(data.slot5).toEqualTypeOf(); expect(data.slot6).toBeDefined(); + expect(data.slot6).toBeInstanceOf(SkyBlockMemberAccessoryBagTuningSlot); expectTypeOf(data.slot6).toEqualTypeOf(); expect(data.slot7).toBeDefined(); + expect(data.slot7).toBeInstanceOf(SkyBlockMemberAccessoryBagTuningSlot); expectTypeOf(data.slot7).toEqualTypeOf(); expect(data.slot8).toBeDefined(); + expect(data.slot8).toBeInstanceOf(SkyBlockMemberAccessoryBagTuningSlot); expectTypeOf(data.slot8).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => number>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.highestUnlockedSlot); + expect(data.toString()).toBe(data.highestUnlockedSlot); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBagTuningSlot.test.ts b/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBagTuningSlot.test.ts index 5b3002489..7f74cfa2c 100644 --- a/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBagTuningSlot.test.ts +++ b/src/Structures/SkyBlock/Member/AccessoryBag/SkyBlockMemberAccessoryBagTuningSlot.test.ts @@ -13,24 +13,32 @@ test('SkyBlockMemberAccessoryBagTuningSlot', () => { expect(data.purchasedDate).toBeDefined(); expectTypeOf(data.purchasedDate).toEqualTypeOf(); expect(data.health).toBeDefined(); + expect(data.health).toBeGreaterThanOrEqual(0); expectTypeOf(data.health).toEqualTypeOf(); expect(data.defense).toBeDefined(); + expect(data.defense).toBeGreaterThanOrEqual(0); expectTypeOf(data.defense).toEqualTypeOf(); expect(data.walkSpeed).toBeDefined(); + expect(data.walkSpeed).toBeGreaterThanOrEqual(0); expectTypeOf(data.walkSpeed).toEqualTypeOf(); expect(data.strength).toBeDefined(); + expect(data.strength).toBeGreaterThanOrEqual(0); expectTypeOf(data.strength).toEqualTypeOf(); expect(data.criticalDamage).toBeDefined(); + expect(data.criticalDamage).toBeGreaterThanOrEqual(0); expectTypeOf(data.criticalDamage).toEqualTypeOf(); expect(data.criticalChance).toBeDefined(); + expect(data.criticalChance).toBeGreaterThanOrEqual(0); expectTypeOf(data.criticalChance).toEqualTypeOf(); expect(data.attackSpeed).toBeDefined(); + expect(data.attackSpeed).toBeGreaterThanOrEqual(0); expectTypeOf(data.attackSpeed).toEqualTypeOf(); expect(data.intelligence).toBeDefined(); + expect(data.intelligence).toBeGreaterThanOrEqual(0); expectTypeOf(data.intelligence).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => boolean>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.unlocked); + expect(data.toString()).toBe(data.unlocked); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Bestiary/SkyBlockMemberBestiary.test.ts b/src/Structures/SkyBlock/Member/Bestiary/SkyBlockMemberBestiary.test.ts index 01ff7d4ac..ed34daa20 100644 --- a/src/Structures/SkyBlock/Member/Bestiary/SkyBlockMemberBestiary.test.ts +++ b/src/Structures/SkyBlock/Member/Bestiary/SkyBlockMemberBestiary.test.ts @@ -3,22 +3,7 @@ import { expect, expectTypeOf, test } from 'vitest'; import type { BestiaryCategory } from '../../../../Types/SkyBlock.js'; test('SkyBlockMemberBestiary', () => { - /* eslint-disable camelcase */ - const data = new SkyBlockMemberBestiary({ - kills: { - last_killed_mob: 'pest_cricket_1', - pest_fly_1: 16, - pest_rat_1: 17, - pest_cricket_1: 11, - pest_locust_1: 22, - pest_slug_1: 17, - pest_mite_1: 15, - pest_worm_1: 13, - pest_moth_1: 16, - pest_beetle_1: 11, - pest_mosquito_1: 17 - } - }); + const data = new SkyBlockMemberBestiary({ stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberBestiary); expectTypeOf(data).toEqualTypeOf(); @@ -27,20 +12,28 @@ test('SkyBlockMemberBestiary', () => { expect(data.deaths).toBeDefined(); expectTypeOf(data.deaths).toEqualTypeOf>(); expect(data.lastClaimedMilestone).toBeDefined(); + expect(data.lastClaimedMilestone).toBeGreaterThanOrEqual(0); expectTypeOf(data.lastClaimedMilestone).toEqualTypeOf(); expect(data.level).toBeDefined(); + expect(data.level).toBeGreaterThanOrEqual(0); expectTypeOf(data.level).toEqualTypeOf(); expect(data.maxLevel).toBeDefined(); + expect(data.maxLevel).toBeGreaterThanOrEqual(0); expectTypeOf(data.maxLevel).toEqualTypeOf(); expect(data.familiesUnlocked).toBeDefined(); + expect(data.familiesUnlocked).toBeGreaterThanOrEqual(0); expectTypeOf(data.familiesUnlocked).toEqualTypeOf(); expect(data.familiesCompleted).toBeDefined(); + expect(data.familiesCompleted).toBeGreaterThanOrEqual(0); expectTypeOf(data.familiesCompleted).toEqualTypeOf(); expect(data.totalFamilies).toBeDefined(); + expect(data.totalFamilies).toBeGreaterThanOrEqual(0); expectTypeOf(data.totalFamilies).toEqualTypeOf(); expect(data.familyTiers).toBeDefined(); + expect(data.familyTiers).toBeGreaterThanOrEqual(0); expectTypeOf(data.familyTiers).toEqualTypeOf(); expect(data.maxFamilyTiers).toBeDefined(); + expect(data.maxFamilyTiers).toBeGreaterThanOrEqual(0); expectTypeOf(data.maxFamilyTiers).toEqualTypeOf(); expect(data.categories).toBeDefined(); expectTypeOf(data.categories).toEqualTypeOf>(); diff --git a/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactory.test.ts b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactory.test.ts index 059a99112..c090389ae 100644 --- a/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactory.test.ts +++ b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactory.test.ts @@ -13,30 +13,43 @@ test('SkyBlockMemberChocolateFactory', () => { expect(data).toBeInstanceOf(SkyBlockMemberChocolateFactory); expectTypeOf(data).toEqualTypeOf(); expect(data.employees).toBeDefined(); + expect(data.employees).toBeInstanceOf(SkyBlockMemberChocolateFactoryEmployees); expectTypeOf(data.employees).toEqualTypeOf(); expect(data.timeTower).toBeDefined(); + expect(data.timeTower).toBeInstanceOf(SkyBlockMemberChocolateFactoryTimeTower); expectTypeOf(data.timeTower).toEqualTypeOf(); expect(data.upgrades).toBeDefined(); + expect(data.upgrades).toBeInstanceOf(SkyBlockMemberChocolateFactoryUpgrades); expectTypeOf(data.upgrades).toEqualTypeOf(); expect(data.hitman).toBeDefined(); + expect(data.hitman).toBeInstanceOf(SkyBlockMemberChocolateFactoryHitmen); expectTypeOf(data.hitman).toEqualTypeOf(); expect(data.currentChocolate).toBeDefined(); + expect(data.currentChocolate).toBeGreaterThanOrEqual(0); expectTypeOf(data.currentChocolate).toEqualTypeOf(); expect(data.chocolateSincePrestige).toBeDefined(); + expect(data.chocolateSincePrestige).toBeGreaterThanOrEqual(0); expectTypeOf(data.chocolateSincePrestige).toEqualTypeOf(); expect(data.totalChocolate).toBeDefined(); + expect(data.totalChocolate).toBeGreaterThanOrEqual(0); expectTypeOf(data.totalChocolate).toEqualTypeOf(); expect(data.barnCapacity).toBeDefined(); + expect(data.barnCapacity).toBeGreaterThanOrEqual(0); expectTypeOf(data.barnCapacity).toEqualTypeOf(); expect(data.prestige).toBeDefined(); + expect(data.prestige).toBeGreaterThanOrEqual(0); expectTypeOf(data.prestige).toEqualTypeOf(); expect(data.lastViewedChocolateFactory).toBeDefined(); + expect(data.lastViewedChocolateFactory).toBeGreaterThanOrEqual(0); expectTypeOf(data.lastViewedChocolateFactory).toEqualTypeOf(); expect(data.lastViewedChocolateFactoryDate).toBeDefined(); + expect(data.lastViewedChocolateFactoryDate).toBeInstanceOf(Date); expectTypeOf(data.lastViewedChocolateFactoryDate).toEqualTypeOf(); expect(data.supremeChocolateBars).toBeDefined(); + expect(data.supremeChocolateBars).toBeGreaterThanOrEqual(0); expectTypeOf(data.supremeChocolateBars).toEqualTypeOf(); expect(data.eggs).toBeDefined(); + expect(data.eggs).toBeInstanceOf(SkyBlockMemberChocolateFactoryEggs); expectTypeOf(data.eggs).toEqualTypeOf(); expect(data.foundRabbits).toBeDefined(); expectTypeOf(data.foundRabbits).toEqualTypeOf>(); @@ -45,6 +58,6 @@ test('SkyBlockMemberChocolateFactory', () => { expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => number>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.currentChocolate); + expect(data.toString()).toBe(data.currentChocolate); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryEggs.test.ts b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryEggs.test.ts index 1e4bafed3..bebfe4eed 100644 --- a/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryEggs.test.ts +++ b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryEggs.test.ts @@ -7,15 +7,21 @@ test('SkyBlockMemberChocolateFactoryEggs', () => { expect(data).toBeInstanceOf(SkyBlockMemberChocolateFactoryEggs); expectTypeOf(data).toEqualTypeOf(); expect(data.breakfast).toBeDefined(); + expect(data.breakfast).toBeGreaterThanOrEqual(0); expectTypeOf(data.breakfast).toEqualTypeOf(); expect(data.lunch).toBeDefined(); + expect(data.lunch).toBeGreaterThanOrEqual(0); expectTypeOf(data.lunch).toEqualTypeOf(); expect(data.dinner).toBeDefined(); + expect(data.dinner).toBeGreaterThanOrEqual(0); expectTypeOf(data.dinner).toEqualTypeOf(); expect(data.brunch).toBeDefined(); + expect(data.brunch).toBeGreaterThanOrEqual(0); expectTypeOf(data.brunch).toEqualTypeOf(); expect(data.dejeuner).toBeDefined(); + expect(data.dejeuner).toBeGreaterThanOrEqual(0); expectTypeOf(data.dejeuner).toEqualTypeOf(); expect(data.supper).toBeDefined(); + expect(data.supper).toBeGreaterThanOrEqual(0); expectTypeOf(data.supper).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryEmployees.test.ts b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryEmployees.test.ts index 0968aacef..5ff9ef749 100644 --- a/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryEmployees.test.ts +++ b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryEmployees.test.ts @@ -7,17 +7,24 @@ test('SkyBlockMemberChocolateFactoryEmployees', () => { expect(data).toBeInstanceOf(SkyBlockMemberChocolateFactoryEmployees); expectTypeOf(data).toEqualTypeOf(); expect(data.bro).toBeDefined(); + expect(data.bro).toBeGreaterThanOrEqual(0); expectTypeOf(data.bro).toEqualTypeOf(); expect(data.cousin).toBeDefined(); + expect(data.cousin).toBeGreaterThanOrEqual(0); expectTypeOf(data.cousin).toEqualTypeOf(); expect(data.sis).toBeDefined(); + expect(data.sis).toBeGreaterThanOrEqual(0); expectTypeOf(data.sis).toEqualTypeOf(); expect(data.father).toBeDefined(); + expect(data.father).toBeGreaterThanOrEqual(0); expectTypeOf(data.father).toEqualTypeOf(); expect(data.grandma).toBeDefined(); + expect(data.grandma).toBeGreaterThanOrEqual(0); expectTypeOf(data.grandma).toEqualTypeOf(); expect(data.dog).toBeDefined(); + expect(data.dog).toBeGreaterThanOrEqual(0); expectTypeOf(data.dog).toEqualTypeOf(); expect(data.uncle).toBeDefined(); + expect(data.uncle).toBeGreaterThanOrEqual(0); expectTypeOf(data.uncle).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryHitmen.test.ts b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryHitmen.test.ts index e9857c62e..149a16bda 100644 --- a/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryHitmen.test.ts +++ b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryHitmen.test.ts @@ -7,20 +7,26 @@ test('SkyBlockMemberChocolateFactoryHitmen', () => { expect(data).toBeInstanceOf(SkyBlockMemberChocolateFactoryHitmen); expectTypeOf(data).toEqualTypeOf(); expect(data.rabbitHitmenSlots).toBeDefined(); + expect(data.rabbitHitmenSlots).toBeGreaterThanOrEqual(0); expectTypeOf(data.rabbitHitmenSlots).toEqualTypeOf(); expect(data.missedUncollectedEggs).toBeDefined(); + expect(data.missedUncollectedEggs).toBeGreaterThanOrEqual(0); expectTypeOf(data.missedUncollectedEggs).toEqualTypeOf(); expect(data.eggSlotCooldownMark).toBeDefined(); + expect(data.eggSlotCooldownMark).toBeGreaterThanOrEqual(0); expectTypeOf(data.eggSlotCooldownMark).toEqualTypeOf(); expect(data.eggSlotCooldownMarkDate).toBeDefined(); + expect(data.eggSlotCooldownMarkDate).toBeInstanceOf(Date); expectTypeOf(data.eggSlotCooldownMarkDate).toEqualTypeOf(); expect(data.eggSlotCooldownExpire).toBeDefined(); + expect(data.eggSlotCooldownExpire).toBeGreaterThanOrEqual(0); expectTypeOf(data.eggSlotCooldownExpire).toEqualTypeOf(); expect(data.eggSlotCooldownExpireDate).toBeDefined(); + expect(data.eggSlotCooldownExpireDate).toBeInstanceOf(Date); expectTypeOf(data.eggSlotCooldownExpireDate).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => number>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.rabbitHitmenSlots); + expect(data.toString()).toBe(data.rabbitHitmenSlots); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryTimeTower.test.ts b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryTimeTower.test.ts index 5248369e3..8ed2c51fd 100644 --- a/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryTimeTower.test.ts +++ b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryTimeTower.test.ts @@ -7,20 +7,26 @@ test('SkyBlockMemberChocolateFactoryTimeTower', () => { expect(data).toBeInstanceOf(SkyBlockMemberChocolateFactoryTimeTower); expectTypeOf(data).toEqualTypeOf(); expect(data.charges).toBeDefined(); + expect(data.charges).toBeGreaterThanOrEqual(0); expectTypeOf(data.charges).toEqualTypeOf(); expect(data.level).toBeDefined(); + expect(data.level).toBeGreaterThanOrEqual(0); expectTypeOf(data.level).toEqualTypeOf(); expect(data.activationTime).toBeDefined(); + expect(data.activationTime).toBeGreaterThanOrEqual(0); expectTypeOf(data.activationTime).toEqualTypeOf(); expect(data.activationTimeDate).toBeDefined(); + expect(data.activationTimeDate).toBeInstanceOf(Date); expectTypeOf(data.activationTimeDate).toEqualTypeOf(); expect(data.lastChargeTime).toBeDefined(); + expect(data.lastChargeTime).toBeGreaterThanOrEqual(0); expectTypeOf(data.lastChargeTime).toEqualTypeOf(); expect(data.lastChargeTimeDate).toBeDefined(); + expect(data.lastChargeTimeDate).toBeInstanceOf(Date); expectTypeOf(data.lastChargeTimeDate).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => number>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.level); + expect(data.toString()).toBe(data.level); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryUpgrades.test.ts b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryUpgrades.test.ts index cd06dc9bf..bb17a485a 100644 --- a/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryUpgrades.test.ts +++ b/src/Structures/SkyBlock/Member/ChocolateFactory/SkyBlockMemberChocolateFactoryUpgrades.test.ts @@ -7,9 +7,12 @@ test('SkyBlockMemberChocolateFactoryUpgrades', () => { expect(data).toBeInstanceOf(SkyBlockMemberChocolateFactoryUpgrades); expectTypeOf(data).toEqualTypeOf(); expect(data.click).toBeDefined(); + expect(data.click).toBeGreaterThanOrEqual(0); expectTypeOf(data.click).toEqualTypeOf(); expect(data.chocolateMultiplier).toBeDefined(); + expect(data.chocolateMultiplier).toBeGreaterThanOrEqual(0); expectTypeOf(data.chocolateMultiplier).toEqualTypeOf(); expect(data.rabbitRarity).toBeDefined(); + expect(data.rabbitRarity).toBeGreaterThanOrEqual(0); expectTypeOf(data.rabbitRarity).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsle.test.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsle.test.ts index 287732540..d0507420e 100644 --- a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsle.test.ts +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsle.test.ts @@ -15,26 +15,33 @@ test('SkyBlockMemberCrimsonIsle', () => { expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsle); expectTypeOf(data).toEqualTypeOf(); expect(data.dojo).toBeDefined(); + expect(data.dojo).toBeInstanceOf(SkyBlockMemberCrimsonIsleDojo); expectTypeOf(data.dojo).toEqualTypeOf(); expect(data.kuudra).toBeDefined(); + expect(data.kuudra).toBeInstanceOf(SkyBlockMemberCrimsonIsleKuudra); expectTypeOf(data.kuudra).toEqualTypeOf(); expect(data.matriarch).toBeDefined(); + expect(data.matriarch).toBeInstanceOf(SkyBlockMemberCrimsonIsleMatriarch); expectTypeOf(data.matriarch).toEqualTypeOf(); expect(data.abiphone).toBeDefined(); + expect(data.abiphone).toBeInstanceOf(SkyBlockMemberCrimsonIsleAbiphone); expectTypeOf(data.abiphone).toEqualTypeOf(); expect(data.faction).toBeDefined(); expectTypeOf(data.faction).toEqualTypeOf(); expect(data.magesReputation).toBeDefined(); + expect(data.magesReputation).toBeGreaterThanOrEqual(0); expectTypeOf(data.magesReputation).toEqualTypeOf(); expect(data.barbariansReputation).toBeDefined(); + expect(data.barbariansReputation).toBeGreaterThanOrEqual(0); expectTypeOf(data.barbariansReputation).toEqualTypeOf(); expect(data.lastMiniBossesKilled).toBeDefined(); expectTypeOf(data.lastMiniBossesKilled).toEqualTypeOf(); expect(data.trophyFishing).toBeDefined(); + expect(data.trophyFishing).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFish); expectTypeOf(data.trophyFishing).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => CrimsonIsleFaction | 'UNKNOWN'>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.faction); + expect(data.toString()).toBe(data.faction); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleAbiphone.test.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleAbiphone.test.ts index f7af6dedc..8bff2b33a 100644 --- a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleAbiphone.test.ts +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleAbiphone.test.ts @@ -25,9 +25,11 @@ test('SkyBlockMemberCrimsonIsleAbiphone', () => { expect(data.operatorChip).toBeDefined(); expectTypeOf(data.operatorChip).toEqualTypeOf>(); expect(data.trioContactAddons).toBeDefined(); + expect(data.trioContactAddons).toBeGreaterThanOrEqual(0); expectTypeOf(data.trioContactAddons).toEqualTypeOf(); expect(data.hasUsedSiriusPersonalPhoneNumberItem).toBeDefined(); expectTypeOf(data.hasUsedSiriusPersonalPhoneNumberItem).toEqualTypeOf(); expect(data.lastDyeCalledYear).toBeDefined(); + expect(data.lastDyeCalledYear).toBeGreaterThanOrEqual(0); expectTypeOf(data.lastDyeCalledYear).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojo.test.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojo.test.ts index 2f9733dbf..6176ec8de 100644 --- a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojo.test.ts +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojo.test.ts @@ -4,117 +4,36 @@ import { expect, expectTypeOf, test } from 'vitest'; import type { CrimsonIsleBelt } from '../../../../Types/SkyBlock.js'; test('SkyBlockMemberCrimsonIsleDojo', () => { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - const data = new SkyBlockMemberCrimsonIsleDojo(); + const data = new SkyBlockMemberCrimsonIsleDojo({ stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleDojo); expectTypeOf(data).toEqualTypeOf(); expect(data.force).toBeDefined(); + expect(data.force).toBeInstanceOf(SkyBlockMemberCrimsonIsleDojoMinigame); expectTypeOf(data.force).toEqualTypeOf(); expect(data.stamina).toBeDefined(); + expect(data.stamina).toBeInstanceOf(SkyBlockMemberCrimsonIsleDojoMinigame); expectTypeOf(data.stamina).toEqualTypeOf(); expect(data.mastery).toBeDefined(); + expect(data.mastery).toBeInstanceOf(SkyBlockMemberCrimsonIsleDojoMinigame); expectTypeOf(data.mastery).toEqualTypeOf(); expect(data.discipline).toBeDefined(); + expect(data.discipline).toBeInstanceOf(SkyBlockMemberCrimsonIsleDojoMinigame); expectTypeOf(data.discipline).toEqualTypeOf(); expect(data.swiftness).toBeDefined(); + expect(data.swiftness).toBeInstanceOf(SkyBlockMemberCrimsonIsleDojoMinigame); expectTypeOf(data.swiftness).toEqualTypeOf(); expect(data.tenacity).toBeDefined(); + expect(data.tenacity).toBeInstanceOf(SkyBlockMemberCrimsonIsleDojoMinigame); expectTypeOf(data.tenacity).toEqualTypeOf(); expect(data.control).toBeDefined(); + expect(data.control).toBeInstanceOf(SkyBlockMemberCrimsonIsleDojoMinigame); expectTypeOf(data.control).toEqualTypeOf(); expect(data.belt).toBeDefined(); expectTypeOf(data.belt).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => CrimsonIsleBelt>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.belt); + expect(data.toString()).toBe(data.belt); expectTypeOf(data.toString()).toEqualTypeOf(); }); - -/* eslint-disable camelcase */ -test('SkyBlockMemberCrimsonIsleDojo getBelt (Black)', () => { - const data = new SkyBlockMemberCrimsonIsleDojo({ - dojo_points_mob_kb: 1000, - dojo_points_wall_jump: 1000, - dojo_points_archer: 1000, - dojo_points_sword_swap: 1000, - dojo_points_snake: 1000, - dojo_points_fireball: 1000, - dojo_points_lock_head: 1000 - }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleDojo); - expectTypeOf(data).toEqualTypeOf(); - expect(data.belt).toBeDefined(); - expect(data.belt).toBe('Black'); -}); - -test('SkyBlockMemberCrimsonIsleDojo getBelt (Brown)', () => { - const data = new SkyBlockMemberCrimsonIsleDojo({ - dojo_points_mob_kb: 1000, - dojo_points_wall_jump: 1000, - dojo_points_archer: 1000, - dojo_points_sword_swap: 1000, - dojo_points_snake: 1000, - dojo_points_fireball: 1000, - dojo_points_lock_head: 0 - }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleDojo); - expectTypeOf(data).toEqualTypeOf(); - expect(data.belt).toBeDefined(); - expect(data.belt).toBe('Brown'); -}); - -test('SkyBlockMemberCrimsonIsleDojo getBelt (Blue)', () => { - const data = new SkyBlockMemberCrimsonIsleDojo({ - dojo_points_mob_kb: 1000, - dojo_points_wall_jump: 1000, - dojo_points_archer: 1000, - dojo_points_sword_swap: 1000, - dojo_points_snake: 0, - dojo_points_fireball: 0, - dojo_points_lock_head: 0 - }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleDojo); - expectTypeOf(data).toEqualTypeOf(); - expect(data.belt).toBeDefined(); - expect(data.belt).toBe('Blue'); -}); - -test('SkyBlockMemberCrimsonIsleDojo getBelt (Green)', () => { - const data = new SkyBlockMemberCrimsonIsleDojo({ - dojo_points_mob_kb: 1000, - dojo_points_wall_jump: 1000, - dojo_points_archer: 0, - dojo_points_sword_swap: 0, - dojo_points_snake: 0, - dojo_points_fireball: 0, - dojo_points_lock_head: 0 - }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleDojo); - expectTypeOf(data).toEqualTypeOf(); - expect(data.belt).toBeDefined(); - expect(data.belt).toBe('Green'); -}); - -test('SkyBlockMemberCrimsonIsleDojo getBelt (Yellow)', () => { - const data = new SkyBlockMemberCrimsonIsleDojo({ - dojo_points_mob_kb: 1000, - dojo_points_wall_jump: 0, - dojo_points_archer: 0, - dojo_points_sword_swap: 0, - dojo_points_snake: 0, - dojo_points_fireball: 0, - dojo_points_lock_head: 0 - }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleDojo); - expectTypeOf(data).toEqualTypeOf(); - expect(data.belt).toBeDefined(); - expect(data.belt).toBe('Yellow'); -}); diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojoMinigame.test.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojoMinigame.test.ts index e85e53016..605001dc4 100644 --- a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojoMinigame.test.ts +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleDojoMinigame.test.ts @@ -3,19 +3,21 @@ import { expect, expectTypeOf, test } from 'vitest'; import type { CrimsonIsleDojoRank } from '../../../../Types/SkyBlock.js'; test('SkyBlockMemberCrimsonIsleDojoMinigame', () => { - const data = new SkyBlockMemberCrimsonIsleDojoMinigame({ stats: 'meow' }, 'meow'); + const data = new SkyBlockMemberCrimsonIsleDojoMinigame({ stats: 'meow' }, 'mrrp'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleDojoMinigame); expectTypeOf(data).toEqualTypeOf(); expect(data.points).toBeDefined(); + expect(data.points).toBeGreaterThanOrEqual(0); expectTypeOf(data.points).toEqualTypeOf(); expect(data.time).toBeDefined(); + expect(data.time).toBeGreaterThanOrEqual(0); expectTypeOf(data.time).toEqualTypeOf(); expect(data.rank).toBeDefined(); expectTypeOf(data.rank).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => CrimsonIsleDojoRank>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.rank); + expect(data.toString()).toBe(data.rank); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleKuudra.test.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleKuudra.test.ts index 0c0a2e3de..1d533925f 100644 --- a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleKuudra.test.ts +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleKuudra.test.ts @@ -8,32 +8,44 @@ test('SkyBlockMemberCrimsonIsleKuudra', () => { expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleKuudra); expectTypeOf(data).toEqualTypeOf(); expect(data.basicCompletions).toBeDefined(); + expect(data.basicCompletions).toBeGreaterThanOrEqual(0); expectTypeOf(data.basicCompletions).toEqualTypeOf(); expect(data.highestWaveBasic).toBeDefined(); + expect(data.highestWaveBasic).toBeGreaterThanOrEqual(0); expectTypeOf(data.highestWaveBasic).toEqualTypeOf(); expect(data.hotCompletions).toBeDefined(); + expect(data.hotCompletions).toBeGreaterThanOrEqual(0); expectTypeOf(data.hotCompletions).toEqualTypeOf(); expect(data.highestWaveHot).toBeDefined(); + expect(data.highestWaveHot).toBeGreaterThanOrEqual(0); expectTypeOf(data.highestWaveHot).toEqualTypeOf(); expect(data.burningCompletions).toBeDefined(); + expect(data.burningCompletions).toBeGreaterThanOrEqual(0); expectTypeOf(data.burningCompletions).toEqualTypeOf(); expect(data.highestWaveBurning).toBeDefined(); + expect(data.highestWaveBurning).toBeGreaterThanOrEqual(0); expectTypeOf(data.highestWaveBurning).toEqualTypeOf(); expect(data.fieryCompletions).toBeDefined(); + expect(data.fieryCompletions).toBeGreaterThanOrEqual(0); expectTypeOf(data.fieryCompletions).toEqualTypeOf(); expect(data.highestWaveFiery).toBeDefined(); + expect(data.highestWaveFiery).toBeGreaterThanOrEqual(0); expectTypeOf(data.highestWaveFiery).toEqualTypeOf(); expect(data.infernalCompletions).toBeDefined(); + expect(data.infernalCompletions).toBeGreaterThanOrEqual(0); expectTypeOf(data.infernalCompletions).toEqualTypeOf(); expect(data.highestWaveInfernal).toBeDefined(); + expect(data.highestWaveInfernal).toBeGreaterThanOrEqual(0); expectTypeOf(data.highestWaveInfernal).toEqualTypeOf(); expect(data.partyFinderOptions).toBeDefined(); + expect(data.partyFinderOptions).toBeInstanceOf(SkyBlockMemberCrimsonIsleKuudraPartyFinder); expectTypeOf(data.partyFinderOptions).toEqualTypeOf(); expect(data.totalCompletions).toBeDefined(); + expect(data.totalCompletions).toBeGreaterThanOrEqual(0); expectTypeOf(data.totalCompletions).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => number>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.totalCompletions); + expect(data.toString()).toBe(data.totalCompletions); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleMatriarch.test.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleMatriarch.test.ts index 2fcee3f36..5f544ef28 100644 --- a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleMatriarch.test.ts +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleMatriarch.test.ts @@ -7,14 +7,16 @@ test('SkyBlockMemberCrimsonIsleMatriarch', () => { expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleMatriarch); expectTypeOf(data).toEqualTypeOf(); expect(data.pearlsCollected).toBeDefined(); + expect(data.pearlsCollected).toBeGreaterThanOrEqual(0); expectTypeOf(data.pearlsCollected).toEqualTypeOf(); expect(data.lastAttempt).toBeDefined(); + expect(data.lastAttempt).toBeGreaterThanOrEqual(0); expectTypeOf(data.lastAttempt).toEqualTypeOf(); expect(data.recentRefreshes).toBeDefined(); expectTypeOf(data.recentRefreshes).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => number>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.pearlsCollected); + expect(data.toString()).toBe(data.pearlsCollected); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.test.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.test.ts index cd57a7c93..132138116 100644 --- a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.test.ts +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.test.ts @@ -5,105 +5,72 @@ import { expect, expectTypeOf, test } from 'vitest'; import type { CrimsonIsleTrophyFishRank } from '../../../../../Types/SkyBlock.js'; test('SkyBlockMemberCrimsonIsleTrophyFish', () => { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - const data = new SkyBlockMemberCrimsonIsleTrophyFish(); + const data = new SkyBlockMemberCrimsonIsleTrophyFish({ stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFish); expectTypeOf(data).toEqualTypeOf(); expect(data.rank).toBeDefined(); expectTypeOf(data.rank).toEqualTypeOf(); expect(data.gusher).toBeDefined(); + expect(data.gusher).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFishFish); expectTypeOf(data.gusher).toEqualTypeOf(); expect(data.blobfish).toBeDefined(); + expect(data.blobfish).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFishFish); expectTypeOf(data.blobfish).toEqualTypeOf(); expect(data.lavaHorse).toBeDefined(); + expect(data.lavaHorse).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFishFish); expectTypeOf(data.lavaHorse).toEqualTypeOf(); expect(data.goldenFish).toBeDefined(); + expect(data.goldenFish).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFishFish); expectTypeOf(data.goldenFish).toEqualTypeOf(); expect(data.volcanicStonefish).toBeDefined(); + expect(data.volcanicStonefish).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFishFish); expectTypeOf(data.volcanicStonefish).toEqualTypeOf(); expect(data.slugfish).toBeDefined(); + expect(data.slugfish).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFishFish); expectTypeOf(data.slugfish).toEqualTypeOf(); expect(data.vanille).toBeDefined(); + expect(data.vanille).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFishFish); expectTypeOf(data.vanille).toEqualTypeOf(); expect(data.obfuscatedFish1).toBeDefined(); + expect(data.obfuscatedFish1).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFishFish); expectTypeOf(data.obfuscatedFish1).toEqualTypeOf(); expect(data.obfuscatedFish2).toBeDefined(); + expect(data.obfuscatedFish2).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFishFish); expectTypeOf(data.obfuscatedFish2).toEqualTypeOf(); expect(data.obfuscatedFish3).toBeDefined(); + expect(data.obfuscatedFish3).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFishFish); expectTypeOf(data.obfuscatedFish3).toEqualTypeOf(); expect(data.sulphurSkitter).toBeDefined(); + expect(data.sulphurSkitter).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFishFish); expectTypeOf(data.sulphurSkitter).toEqualTypeOf(); expect(data.skeletonFish).toBeDefined(); + expect(data.skeletonFish).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFishFish); expectTypeOf(data.skeletonFish).toEqualTypeOf(); expect(data.manaRay).toBeDefined(); + expect(data.manaRay).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFishFish); expectTypeOf(data.manaRay).toEqualTypeOf(); expect(data.flyfish).toBeDefined(); + expect(data.flyfish).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFishFish); expectTypeOf(data.flyfish).toEqualTypeOf(); expect(data.steamingHotFlounder).toBeDefined(); + expect(data.steamingHotFlounder).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFishFish); expectTypeOf(data.steamingHotFlounder).toEqualTypeOf(); expect(data.soulFish).toBeDefined(); + expect(data.soulFish).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFishFish); expectTypeOf(data.soulFish).toEqualTypeOf(); expect(data.karateFish).toBeDefined(); + expect(data.karateFish).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFishFish); expectTypeOf(data.karateFish).toEqualTypeOf(); expect(data.moldfin).toBeDefined(); + expect(data.moldfin).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFishFish); expectTypeOf(data.moldfin).toEqualTypeOf(); expect(data.caught).toBeDefined(); + expect(data.caught).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFishCaught); expectTypeOf(data.caught).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => CrimsonIsleTrophyFishRank>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.rank); + expect(data.toString()).toBe(data.rank); expectTypeOf(data.toString()).toEqualTypeOf(); }); - -test('SkyBlockMemberCrimsonIsleTrophyFish getTrophyFishRank (Bronze)', () => { - const data = new SkyBlockMemberCrimsonIsleTrophyFish({ rewards: [1] }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFish); - expectTypeOf(data).toEqualTypeOf(); - expect(data.rank).toBeDefined(); - expectTypeOf(data.rank).toEqualTypeOf(); - expect(data.rank).toBe('Bronze'); -}); - -test('SkyBlockMemberCrimsonIsleTrophyFish getTrophyFishRank (Diamond)', () => { - const data = new SkyBlockMemberCrimsonIsleTrophyFish({ rewards: [1, 2, 3, 4] }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFish); - expectTypeOf(data).toEqualTypeOf(); - expect(data.rank).toBeDefined(); - expectTypeOf(data.rank).toEqualTypeOf(); - expect(data.rank).toBe('Diamond'); -}); - -test('SkyBlockMemberCrimsonIsleTrophyFish getTrophyFishRank (Gold)', () => { - const data = new SkyBlockMemberCrimsonIsleTrophyFish({ rewards: [1, 2, 3] }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFish); - expectTypeOf(data).toEqualTypeOf(); - expect(data.rank).toBeDefined(); - expectTypeOf(data.rank).toEqualTypeOf(); - expect(data.rank).toBe('Gold'); -}); - -test('SkyBlockMemberCrimsonIsleTrophyFish getTrophyFishRank (Silver)', () => { - const data = new SkyBlockMemberCrimsonIsleTrophyFish({ rewards: [1, 2] }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFish); - expectTypeOf(data).toEqualTypeOf(); - expect(data.rank).toBeDefined(); - expectTypeOf(data.rank).toEqualTypeOf(); - expect(data.rank).toBe('Silver'); -}); - -test('SkyBlockMemberCrimsonIsleTrophyFish getTrophyFishRank (Bronze)', () => { - const data = new SkyBlockMemberCrimsonIsleTrophyFish({ rewards: [1] }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFish); - expectTypeOf(data).toEqualTypeOf(); - expect(data.rank).toBeDefined(); - expectTypeOf(data.rank).toEqualTypeOf(); - expect(data.rank).toBe('Bronze'); -}); diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFishCaught.test.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFishCaught.test.ts index e00051740..5e27d56b5 100644 --- a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFishCaught.test.ts +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFishCaught.test.ts @@ -1,10 +1,11 @@ +import SkyBlockMemberCrimsonIsleTrophyFish from './SkyBlockMemberCrimsonIsleTrophyFish.js'; import SkyBlockMemberCrimsonIsleTrophyFishCaught from './SkyBlockMemberCrimsonIsleTrophyFishCaught.js'; import { expect, expectTypeOf, test } from 'vitest'; test('SkyBlockMemberCrimsonIsleTrophyFishCaught', () => { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - const data = new SkyBlockMemberCrimsonIsleTrophyFishCaught({}); + const data = new SkyBlockMemberCrimsonIsleTrophyFishCaught( + new SkyBlockMemberCrimsonIsleTrophyFish({ stats: 'meow' }) + ); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFishCaught); expectTypeOf(data).toEqualTypeOf(); @@ -26,6 +27,6 @@ test('SkyBlockMemberCrimsonIsleTrophyFishCaught', () => { expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => number>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.total); + expect(data.toString()).toBe(data.total); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFishFish.test.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFishFish.test.ts index 859ea9906..2cdcbd262 100644 --- a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFishFish.test.ts +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFishFish.test.ts @@ -2,23 +2,28 @@ import SkyBlockMemberCrimsonIsleTrophyFishFish from './SkyBlockMemberCrimsonIsle import { expect, expectTypeOf, test } from 'vitest'; test('SkyBlockMemberCrimsonIsleTrophyFishFish', () => { - const data = new SkyBlockMemberCrimsonIsleTrophyFishFish({ stats: 'meow' }, 'meow'); + const data = new SkyBlockMemberCrimsonIsleTrophyFishFish({ stats: 'meow' }, 'mrrp'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberCrimsonIsleTrophyFishFish); expectTypeOf(data).toEqualTypeOf(); expect(data.bronze).toBeDefined(); + expect(data.bronze).toBeGreaterThanOrEqual(0); expectTypeOf(data.bronze).toEqualTypeOf(); expect(data.silver).toBeDefined(); + expect(data.silver).toBeGreaterThanOrEqual(0); expectTypeOf(data.silver).toEqualTypeOf(); expect(data.gold).toBeDefined(); + expect(data.gold).toBeGreaterThanOrEqual(0); expectTypeOf(data.gold).toEqualTypeOf(); expect(data.diamond).toBeDefined(); + expect(data.diamond).toBeGreaterThanOrEqual(0); expectTypeOf(data.diamond).toEqualTypeOf(); expect(data.total).toBeDefined(); + expect(data.total).toBeGreaterThanOrEqual(0); expectTypeOf(data.total).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => number>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.total); + expect(data.toString()).toBe(data.total); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeons.test.ts b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeons.test.ts index 750e714d6..bcb1bf735 100644 --- a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeons.test.ts +++ b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeons.test.ts @@ -11,12 +11,15 @@ test('SkyBlockMemberDungeons', () => { expect(data).toBeInstanceOf(SkyBlockMemberDungeons); expectTypeOf(data).toEqualTypeOf(); expect(data.catacombs).toBeDefined(); + expect(data.catacombs).toBeInstanceOf(SkyBlockMemberDungeonsMode); expectTypeOf(data.catacombs).toEqualTypeOf(); expect(data.masterCatacombs).toBeDefined(); + expect(data.masterCatacombs).toBeInstanceOf(SkyBlockMemberDungeonsMode); expectTypeOf(data.masterCatacombs).toEqualTypeOf(); expect(data.level).toBeDefined(); expectTypeOf(data.level).toEqualTypeOf(); expect(data.classes).toBeDefined(); + expect(data.classes).toBeInstanceOf(SkyBlockMemberDungeonsClasses); expectTypeOf(data.classes).toEqualTypeOf(); expect(data.unlockedJournals).toBeDefined(); expectTypeOf(data.unlockedJournals).toEqualTypeOf(); @@ -25,10 +28,11 @@ test('SkyBlockMemberDungeons', () => { expect(data.lastDungeonRun).toBeDefined(); expectTypeOf(data.lastDungeonRun).toEqualTypeOf(); expect(data.secrets).toBeDefined(); + expect(data.secrets).toBeGreaterThanOrEqual(0); expectTypeOf(data.secrets).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => number>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.level.level); + expect(data.toString()).toBe(data.level.level); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsClasses.test.ts b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsClasses.test.ts index 541170ca0..e13375f8d 100644 --- a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsClasses.test.ts +++ b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsClasses.test.ts @@ -20,10 +20,11 @@ test('SkyBlockMemberDungeonsClasses', () => { expect(data.tank).toBeDefined(); expectTypeOf(data.tank).toEqualTypeOf(); expect(data.average).toBeDefined(); + expect(data.average).toBeGreaterThanOrEqual(0); expectTypeOf(data.average).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => DungeonClass | 'UNKNOWN'>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.selected); + expect(data.toString()).toBe(data.selected); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsFloor.test.ts b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsFloor.test.ts index 322325b99..d0f7708bf 100644 --- a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsFloor.test.ts +++ b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsFloor.test.ts @@ -8,36 +8,49 @@ test('SkyBlockMemberDungeonsFloor', () => { expect(data).toBeInstanceOf(SkyBlockMemberDungeonsFloor); expectTypeOf(data).toEqualTypeOf(); expect(data.timesPlayed).toBeDefined(); + expect(data.timesPlayed).toBeGreaterThanOrEqual(0); expectTypeOf(data.timesPlayed).toEqualTypeOf(); expect(data.bestRuns).toBeDefined(); expectTypeOf(data.bestRuns).toEqualTypeOf(); expect(data.bestScore).toBeDefined(); + expect(data.bestScore).toBeGreaterThanOrEqual(0); expectTypeOf(data.bestScore).toEqualTypeOf(); expect(data.mobsKilled).toBeDefined(); + expect(data.mobsKilled).toBeGreaterThanOrEqual(0); expectTypeOf(data.mobsKilled).toEqualTypeOf(); expect(data.mostMobsKilled).toBeDefined(); + expect(data.mostMobsKilled).toBeGreaterThanOrEqual(0); expectTypeOf(data.mostMobsKilled).toEqualTypeOf(); expect(data.mostDamageBerserk).toBeDefined(); + expect(data.mostDamageBerserk).toBeGreaterThanOrEqual(0); expectTypeOf(data.mostDamageBerserk).toEqualTypeOf(); expect(data.mostDamageMage).toBeDefined(); + expect(data.mostDamageMage).toBeGreaterThanOrEqual(0); expectTypeOf(data.mostDamageMage).toEqualTypeOf(); expect(data.mostDamageHealer).toBeDefined(); + expect(data.mostDamageHealer).toBeGreaterThanOrEqual(0); expectTypeOf(data.mostDamageHealer).toEqualTypeOf(); expect(data.mostDamageArcher).toBeDefined(); + expect(data.mostDamageArcher).toBeGreaterThanOrEqual(0); expectTypeOf(data.mostDamageArcher).toEqualTypeOf(); expect(data.mostDamageTank).toBeDefined(); + expect(data.mostDamageTank).toBeGreaterThanOrEqual(0); expectTypeOf(data.mostDamageTank).toEqualTypeOf(); expect(data.mostHealing).toBeDefined(); + expect(data.mostHealing).toBeGreaterThanOrEqual(0); expectTypeOf(data.mostHealing).toEqualTypeOf(); expect(data.watcherKills).toBeDefined(); + expect(data.watcherKills).toBeGreaterThanOrEqual(0); expectTypeOf(data.watcherKills).toEqualTypeOf(); expect(data.fastestTimeS).toBeDefined(); + expect(data.fastestTimeS).toBeGreaterThanOrEqual(0); expectTypeOf(data.fastestTimeS).toEqualTypeOf(); expect(data.fastestTimeSPlus).toBeDefined(); + expect(data.fastestTimeSPlus).toBeGreaterThanOrEqual(0); expectTypeOf(data.fastestTimeSPlus).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => number>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.timesPlayed); + expect(data.toString()).toBe(data.timesPlayed); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsFloorRun.test.ts b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsFloorRun.test.ts index e3510d9a6..f2022c9d9 100644 --- a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsFloorRun.test.ts +++ b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsFloorRun.test.ts @@ -9,38 +9,51 @@ test('SkyBlockMemberDungeonsFloorRun', () => { expect(data).toBeInstanceOf(SkyBlockMemberDungeonsFloorRun); expectTypeOf(data).toEqualTypeOf(); expect(data.timestamp).toBeDefined(); + expect(data.timestamp).toBeGreaterThanOrEqual(0); expectTypeOf(data.timestamp).toEqualTypeOf(); expect(data.explorationScore).toBeDefined(); + expect(data.explorationScore).toBeGreaterThanOrEqual(0); expectTypeOf(data.explorationScore).toEqualTypeOf(); expect(data.speedScore).toBeDefined(); + expect(data.speedScore).toBeGreaterThanOrEqual(0); expectTypeOf(data.speedScore).toEqualTypeOf(); expect(data.skillScore).toBeDefined(); + expect(data.skillScore).toBeGreaterThanOrEqual(0); expectTypeOf(data.skillScore).toEqualTypeOf(); expect(data.bonusScore).toBeDefined(); + expect(data.bonusScore).toBeGreaterThanOrEqual(0); expectTypeOf(data.bonusScore).toEqualTypeOf(); expect(data.score).toBeDefined(); + expect(data.score).toBeGreaterThanOrEqual(0); expectTypeOf(data.score).toEqualTypeOf(); expect(data.selectedClass).toBeDefined(); expectTypeOf(data.selectedClass).toEqualTypeOf(); expect(data.teammates).toBeDefined(); expectTypeOf(data.teammates).toEqualTypeOf(); expect(data.elapsedTime).toBeDefined(); + expect(data.elapsedTime).toBeGreaterThanOrEqual(0); expectTypeOf(data.elapsedTime).toEqualTypeOf(); expect(data.damageDealt).toBeDefined(); + expect(data.damageDealt).toBeGreaterThanOrEqual(0); expectTypeOf(data.damageDealt).toEqualTypeOf(); expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); expectTypeOf(data.deaths).toEqualTypeOf(); expect(data.mobsKilled).toBeDefined(); + expect(data.mobsKilled).toBeGreaterThanOrEqual(0); expectTypeOf(data.mobsKilled).toEqualTypeOf(); expect(data.secretsFound).toBeDefined(); + expect(data.secretsFound).toBeGreaterThanOrEqual(0); expectTypeOf(data.secretsFound).toEqualTypeOf(); expect(data.damageMitigated).toBeDefined(); + expect(data.damageMitigated).toBeGreaterThanOrEqual(0); expectTypeOf(data.damageMitigated).toEqualTypeOf(); expect(data.allyHealing).toBeDefined(); + expect(data.allyHealing).toBeGreaterThanOrEqual(0); expectTypeOf(data.allyHealing).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => number>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.score); + expect(data.toString()).toBe(data.score); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsMode.test.ts b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsMode.test.ts index edb28f2db..7f6f2da59 100644 --- a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsMode.test.ts +++ b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsMode.test.ts @@ -8,26 +8,34 @@ test('SkyBlockMemberDungeonsMode', () => { expect(data).toBeInstanceOf(SkyBlockMemberDungeonsMode); expectTypeOf(data).toEqualTypeOf(); expect(data.highestFloorCompleted).toBeDefined(); + expect(data.highestFloorCompleted).toBeGreaterThanOrEqual(0); expectTypeOf(data.highestFloorCompleted).toEqualTypeOf(); expect(data.floor0).toBeDefined(); expectTypeOf(data.floor0).toEqualTypeOf(); expect(data.floor1).toBeDefined(); + expect(data.floor1).toBeInstanceOf(SkyBlockMemberDungeonsFloor); expectTypeOf(data.floor1).toEqualTypeOf(); expect(data.floor2).toBeDefined(); + expect(data.floor2).toBeInstanceOf(SkyBlockMemberDungeonsFloor); expectTypeOf(data.floor2).toEqualTypeOf(); expect(data.floor3).toBeDefined(); + expect(data.floor3).toBeInstanceOf(SkyBlockMemberDungeonsFloor); expectTypeOf(data.floor3).toEqualTypeOf(); expect(data.floor4).toBeDefined(); + expect(data.floor4).toBeInstanceOf(SkyBlockMemberDungeonsFloor); expectTypeOf(data.floor4).toEqualTypeOf(); expect(data.floor5).toBeDefined(); + expect(data.floor5).toBeInstanceOf(SkyBlockMemberDungeonsFloor); expectTypeOf(data.floor5).toEqualTypeOf(); expect(data.floor6).toBeDefined(); + expect(data.floor6).toBeInstanceOf(SkyBlockMemberDungeonsFloor); expectTypeOf(data.floor6).toEqualTypeOf(); expect(data.floor7).toBeDefined(); + expect(data.floor7).toBeInstanceOf(SkyBlockMemberDungeonsFloor); expectTypeOf(data.floor7).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => number>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.highestFloorCompleted); + expect(data.toString()).toBe(data.highestFloorCompleted); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasureRun.test.ts b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasureRun.test.ts index 74485bb29..a55d1bc2b 100644 --- a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasureRun.test.ts +++ b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasureRun.test.ts @@ -12,12 +12,15 @@ test('SkyBlockMemberDungeonsTreasureRun', () => { expect(data.runId).toBeDefined(); expectTypeOf(data.runId).toEqualTypeOf(); expect(data.completionTimestamp).toBeDefined(); + expect(data.completionTimestamp).toBeGreaterThanOrEqual(0); expectTypeOf(data.completionTimestamp).toEqualTypeOf(); expect(data.completionDate).toBeDefined(); + expect(data.completionDate).toBeInstanceOf(Date); expectTypeOf(data.completionDate).toEqualTypeOf(); expect(data.type).toBeDefined(); expectTypeOf(data.type).toEqualTypeOf(); expect(data.dungeonTier).toBeDefined(); + expect(data.dungeonTier).toBeGreaterThanOrEqual(0); expectTypeOf(data.dungeonTier).toEqualTypeOf(); expect(data.participants).toBeDefined(); expectTypeOf(data.participants).toEqualTypeOf< @@ -28,6 +31,6 @@ test('SkyBlockMemberDungeonsTreasureRun', () => { expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => string>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.runId); + expect(data.toString()).toBe(data.runId); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasuresChest.test.ts b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasuresChest.test.ts index 8432f99c4..4a395327d 100644 --- a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasuresChest.test.ts +++ b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeonsTreasuresChest.test.ts @@ -18,6 +18,7 @@ test('SkyBlockMemberDungeonsTreasuresChest', () => { expect(data.rolledRNGMeter).toBeDefined(); expectTypeOf(data.rolledRNGMeter).toEqualTypeOf(); expect(data.quality).toBeDefined(); + expect(data.quality).toBeGreaterThanOrEqual(0); expectTypeOf(data.quality).toEqualTypeOf(); expect(data.shinyEligible).toBeDefined(); expectTypeOf(data.shinyEligible).toEqualTypeOf(); @@ -25,4 +26,9 @@ test('SkyBlockMemberDungeonsTreasuresChest', () => { expectTypeOf(data.paid).toEqualTypeOf(); expect(data.rerolls).toBeDefined(); expectTypeOf(data.rerolls).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.runId); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmorDecoded.test.ts b/src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmorDecoded.test.ts index dd262a420..24690ead0 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmorDecoded.test.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Armor/SkyBlockMemberInventoriesArmorDecoded.test.ts @@ -1,3 +1,4 @@ +import SkyBlockInventoryItem from '../../../Inventory/SkyBlockInventoryItem.js'; import SkyBlockMemberInventoriesArmorDecoded from './SkyBlockMemberInventoriesArmorDecoded.js'; import { expect, expectTypeOf, test } from 'vitest'; @@ -6,4 +7,12 @@ test('SkyBlockMemberInventoriesArmorDecoded', () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberInventoriesArmorDecoded); expectTypeOf(data).toEqualTypeOf(); + expect(data.helmet).toBeDefined(); + expectTypeOf(data.helmet).toEqualTypeOf(); + expect(data.chestplate).toBeDefined(); + expectTypeOf(data.chestplate).toEqualTypeOf(); + expect(data.leggings).toBeDefined(); + expectTypeOf(data.leggings).toEqualTypeOf(); + expect(data.boots).toBeDefined(); + expectTypeOf(data.boots).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.test.ts b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.test.ts index bdd89f23f..1c246237a 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.test.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.test.ts @@ -2,25 +2,7 @@ import SkyBlockMemberInventoriesBackpack from './SkyBlockMemberInventoriesBackpa import { expect, expectTypeOf, test } from 'vitest'; test('SkyBlockMemberInventoriesBackpack', () => { - /* eslint-disable quote-props */ - /* eslint-disable @stylistic/max-len */ - const data = new SkyBlockMemberInventoriesBackpack( - { - backpackIcons: { - '0': { - data: 'H4sIAAAAAAAA/0VUyW7jRhRsezKJ7UMmyDEnBsglEByLm0QHmAMliuZOkeIi8hI0yZbYFDdxlfQP+Y655Cvmw4LQQYAcHrpRr6q76lJPADyCO/wEALi7B/c4ufvzDnxcV33Z3T2BDx08fgCPEk6QmMNjO7H+fgJPu1Of5+ZYouYB3MsJ+IUiXyG7JOfPBwSpZ5ommedXdIinGxPHNJswTHy4Az+k1xpfUL6t6j6HHUqmH562TVWjpsOofQQPHbp0fYPaf+08gMcdPpbwHbn/S2OlRFAFvx+UkBN28LiGRzV3tXUdO4VLptGgKPNLuNxJZDCa7RtzpsS0ENa8ejh6oi8wHlq6F+nUVoOeYXW+w2PUK7DuF3mWjcN1QWXCjBPRKl2WjXxZnXLmNcD01ZL7iNF5Hs5Y1jkvhYFc2UoPGytN+7XRzQZa7ZStnUsnq18y1Wnb+sFufHth8/GmhN2wvmgUOrQrH2u7ImI5tRqt0Nme3TCytn11thgrEUPIs3ulOlacOw+gLgraZfCkZMOcbPLKp359cb29Xwj7lla6E800TkVJm0LX7TIuDkcNboOFb3XeiMzh1PZIdYIXJdQoOPi+sbHGeN+L2zy67NZZW2nCYeRa3TlEPut4Y0Nu+tzs8esy3q60ULS3fJIfljWEq8vSjG1r1uh4j/LCOAmVEtf18iVNOSzPN5s6oZuySCw2as5zKlDTs7TfGUF2cLhzZaxNq+woMxEZbTfrdLE+q6K2Y6jIgnC3zu0ZOZ728wWkV9VhK5dSsLb29dpL1df9KC2L2murmbo4mqquyBSt1VpOu4IecnkZL1hJTF8OpLqzzoEazqRNzxrHeolX/vCai6aa5QNG4v4i306IvZ5ziubCm8if3bMTUr5n6o0qp44keQuSVQ9BbHMLIWhE/aXHJQPl7ogDFKdwffM0nc5SzT91mikEWjIjfV5Ri5rbGIFajJhbsKu3S6FfDZm51XsWFor1+QF89GDeo7sEXZU59Mk8pu002vPYzDakkR2vuqOPhrOZ61nQyuXqGlFhHb15SriWF/K0D27BaBQ6OZ2kntnYuJ2YIDtdAmdzDQUjNbINZToxLeMRx5IyhEXehi6bRr6LTayYEW2/zxAX+ZDsDTP0yeFfLpWXUSHOk72Su4V3Sfz8GvoWNkv7mvju5MXOkWSTceHd5Kxeyrmh7Vxm2rd40rRyVmEo2fNYqAaN/p+rFWQdFV4WF2KRrNk+3FtD8uYxieRdwx1H6cWUJDNSXXDnpiBm4ZtLGzd5rgv8aPj6GL7ZWei7l+DGU6bvkobDzwMnuAaUO77nNIWYDTOXDByd1W8nSncsSi7J14P1+fPUFU/guwS3dQ6vj+AbrWrQwwR+BL9+/bLkiQgeiRF3KfH1CyS5CSLavOpaYkxxnBIxLIkIgZ8nfNLHKCFwSVyrviF2XdXAIyJ0VPZEV4GfJko7YYiASYI7XJUwJ3CHiva3dwtfv7x+/ZLbvL15AN8YsEDgxwnSUYL7gljB+FRPMzn9tLl0DeS7rsFR36H24b11wSd9I8iu/seKX6vbaR7A99F/mj/iKq8a8J2wEXlXc6bX+35S/EIeuJhkWPRMLiPymYFk8hwhlDwz7AIuuYSM0TyZOrTDBWo7WNTgE/fCvlAUQVK/MyTB6wDcg28FWEwhwQcA/gHPGZa2CwYAAA==' - } - }, - backpackContents: { - '0': { - data: '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' - } - } - }, - '0' - ); - /* eslint-enable quote-props */ - /* eslint-enable @stylistic/max-len */ + const data = new SkyBlockMemberInventoriesBackpack({ stats: 'meow' }, '0'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberInventoriesBackpack); expectTypeOf(data).toEqualTypeOf(); diff --git a/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.ts b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.ts index 9736eb503..b688513cc 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpack.ts @@ -5,8 +5,8 @@ class SkyBlockMemberInventoriesBackpack { backpackItemBase64: string; backpackContentsBase64: string; constructor(data: Record, slot: string) { - this.backpackItemBase64 = data?.backpackIcons?.[slot]?.data; - this.backpackContentsBase64 = data?.backpackContents?.[slot]?.data; + this.backpackItemBase64 = data?.backpackIcons?.[slot]?.data || 'UNKNOWN'; + this.backpackContentsBase64 = data?.backpackContents?.[slot]?.data || 'UNKNOWN'; } async decodeData(): Promise { diff --git a/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpackDecoded.test.ts b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpackDecoded.test.ts index 1631dfa5b..9252e3028 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpackDecoded.test.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpackDecoded.test.ts @@ -1,53 +1,15 @@ +import SkyBlockInventoryItem from '../../../Inventory/SkyBlockInventoryItem.js'; import SkyBlockMemberInventoriesBackpackDecoded from './SkyBlockMemberInventoriesBackpackDecoded.js'; import { expect, expectTypeOf, test } from 'vitest'; test('SkyBlockMemberInventoriesBackpackDecoded', () => { - /* eslint-disable camelcase */ - const data = new SkyBlockMemberInventoriesBackpackDecoded({ - backpackIconDecoded: [ - { - id: 397, - Count: 1, - tag: { - HideFlags: 254, - display: { - Lore: [ - '§7A bag with §a18§7 slots which can be', - '§7placed in your Storage Menu to', - '§7store additional items.', - '', - '§9§lRARE' - ], - Name: '§9Medium Backpack' - }, - ExtraAttributes: { - id: 'MEDIUM_BACKPACK', - backpack_color: 'DEFAULT', - uuid: '1f8c145e-17b1-4a1d-beed-456a78d1ce0d', - timestamp: '8/5/22 12:41 AM' - } - }, - Damage: 3 - } - ], - backpackItemsDecoded: [ - { - id: 397, - Count: 3, - tag: { - HideFlags: 254, - display: { - Lore: ['§7§7A perfect side.', '', '§8§l* §8Co-op Soulbound §8§l*', '§f§lCOMMON'], - Name: '§fFrench Fries' - }, - ExtraAttributes: { id: 'FRENCH_FRIES' } - }, - Damage: 3 - } - ] - }); - /* eslint-enable camelcase */ + const data = new SkyBlockMemberInventoriesBackpackDecoded({ stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberInventoriesBackpackDecoded); expectTypeOf(data).toEqualTypeOf(); + expect(data.icon).toBeDefined(); + expect(data.icon).toBeInstanceOf(SkyBlockInventoryItem); + expectTypeOf(data.icon).toEqualTypeOf(); + expect(data.items).toBeDefined(); + expectTypeOf(data.items).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpackDecoded.ts b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpackDecoded.ts index 3a2439577..6ee13f990 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpackDecoded.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Backpacks/SkyBlockMemberInventoriesBackpackDecoded.ts @@ -4,11 +4,12 @@ class SkyBlockMemberInventoriesBackpackDecoded { icon: SkyBlockInventoryItem; items: SkyBlockInventoryItem[]; constructor(data: Record) { - this.icon = new SkyBlockInventoryItem(data?.backpackIconDecoded[0]); + const decoded = data?.backpackItemsDecoded || []; + this.icon = new SkyBlockInventoryItem(decoded?.[0] || {}); this.items = []; - for (let i = 0; i < data?.backpackItemsDecoded.length; i++) { - if (!data?.backpackItemsDecoded[i]?.id) continue; - this.items.push(new SkyBlockInventoryItem(data?.backpackItemsDecoded[i])); + for (let i = 0; i < decoded.length; i++) { + if (!decoded?.[i]?.id) continue; + this.items.push(new SkyBlockInventoryItem(decoded[i])); } } } diff --git a/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBags.test.ts b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBags.test.ts index f476fb8e9..d26412afd 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBags.test.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBags.test.ts @@ -4,38 +4,23 @@ import SkyBlockMemberInventoriesInventory from '../Inventory/SkyBlockMemberInven import { expect, expectTypeOf, test } from 'vitest'; test('SkyBlockMemberInventoriesBags', () => { - /* eslint-disable @stylistic/max-len */ - /* eslint-disable camelcase */ - const data = new SkyBlockMemberInventoriesBags({ - potion_bag: { - data: 'H4sIAAAAAAAA/+3aW28bRRQH8Fk7vjZtRaEVRUKaQkOpQpEb56Lw1OAkjSVyURJS3qyxd2yvsHet3XEub1DxwAMfIEhEqlQJ940PwAvyR/EHQZy9OF5fYtklCIH+Uq2kuzNnd+ac/Wk8mzRjKaYZacbYkwiLGLrW1FgsZzVNpaVZVIlKir2bazrKqu9ZyrDMjXJZlpTjdtA0llirFw1pKhZlyfWmLdwWdOY9jUXyelJjqbV6o2aUDWkzapLaMnS5WRMVh9r8mWYJ3XAaNXGWYjNfWbZM0tEYfR62WwvbTacqdf68Zp2c8UPLNEo8z9ut8qdPv8hk6N9jNtdurTy3hakcOl6cz2Y65y/5puFUDbPCDxpS6tTgcwo3S93arVpud3t7dyfJZnZEXbq9yyOvcUA35FS5P1iWZrc3TpUt1pSyjWJTSSfKZhveuUJNHsuaOw1JFvcPsTt1L2Sh4oYsKDdkiiVkaMqiLBbu558a1S/KbunBhBaUUfrWYdr9Z2mWqlu6N580hUl2I7gVddaQLL63e5h3R0hZ7P5HY3HHG5DWa2y6478zPHjGIiy+LuqiIp/dYNddDPfCxRCZvBgetFsiZ9WLQvFv9viXluUons/7tZBdHq6E7PwCVcJvPOjzwnB0qx5Uwi2KRZXw9U5/LXx4xSWmqIForwZul7xQhdNGoeiGuroAor0CGOw0nH325o9JEh5KImNIIpI4nEQtnMTo5En8iJjNWTWd70vHcJQwS5Lnj0agLAzTI/lppnPxAx/oMj6LH3tZHLrG9CjPaCwpzaobQNf68lrTC/Zl8KvzOtOX175O102ze6unSpo63WoY4QhSj9RfV+pnw6mfmYru5S1hH0vylH4WaXUlbe7nfmHJy/yjMN3L80tE9znfFHbdXYltWrZqmt3cp9utVcr9/tr+Rgju1VEXmCLjsV6W36n6oQrVbqir8xzr5Xm42wi8m5mpksvCjEeRUCQUCUVCkdD/bkJvvsWGRpw+j2lJRN9hGo8cni/JJ9ThmM7q/IVQNO/B1yB/FZXpraIW3VXUz2/4kaFEzVBndGhFmLrben5hqXPxkh/aTekup8rrsixNR47b8PiMDo67h7+175E8ocgFY9yiKrTbcdl6RMJ/evUPrKZuohJQCagEVAIqAZWASkAloBJQCagEVMK/UgnpcCXEJ6uEu/Shb+2L+7IiTekH7O7AL/rZfxjeEii5L9AuXvMtKWqqyr1uQYbfpzAHypZmhU70RaA0r+TNki2FI70gnYvv+WVTOll060gsZoJIH1CknG3Q7Iva5eu8IFZ2INZq5/w1dxvznLcz3wu3kJkLqpN9Qj+9pq/8pn4Kek2zmbng0veomfeOf2ASHoQnQdAkuCc7v/za9wcBdN8i9JJh7ByIzsWPPHhEejcyn+3OwX16PNfsUlXaZ4NTMNcXqmidcN0fjx9j6XIw6XZriZ65jb18rvvE3aVD602zIinNR9O9xUz0Hq1ZO1Qu/Y9XfPT7jr4eIx6x37/rf8RGb+0knaBoposQepWaLAV1NV2E0Ehijpvxtx5Cetw7nwkHkRB+YUwQYKpNroE/5UgEhaK5l/F+K/inw44xDY7BMTgGx+AYHINjcAyOwTE4BsfgGByDY3AMjsExOAbH4Bgcg2NwDI7BMTgGx+AYHINjcAyOwTE4BsfgGByDY3AMjsExOAbH4Bgcg2NwDI7BMTgGx+AYHINjcAyOwTE4BsfgGByDY3AMjsExOAbH4Bgcg2NwDI7BMTgGx+AYHINjcAyOwTE4BsfgGByDY3AMjsExOAbH4Bgcg2NwDI7BMTgGx+AYHINjcAyOwTE4BsfgGByDY3AMjsExOAbH4Bgcg2NwDI7BMTgGx+AYHINjcAyOwTE4Bsf+t46xvwDf3AnXzKkAAA==' - }, - talisman_bag: { - data: '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vFA79vF3eOXd7nCvMz7c/9pNXvZV88It+oAbv+nzwieP6V8oXxzv6kfO/ylfvvr/PNs69lbCV+znlO+722uPOfFOl57xjv845dze9L5f+ead37d7jRzwxdsfeZvb3fxWH3/25NmvOPttzLMf0fv7/3zck11n/fr7fflhD6ZffNxZnzj9rs9/7AtPvselFz559sW7fP217z3/34F7A7pL3DHab7/zgcc/vfsg+nsf/P7bP/K8t/AfVR//He3hxf1333v328i7n3vs2TT9mdkH3De+99Wf/GTrgv/nvlZ4nvPl+576xTt8/34H/vmfk+743iy5aSd7l/X8NX3B/c/76Ln4Pe/69XdqZ39o9O7PdD/7f95xs2O+fcsXffN1Xznrbv/8pQuX5fLh+8/2MODmT7yp+JLTn3jHX5zcVl7ykfcnj/rSU4/+WvXv/3T6aeXtXhT/4LsfuO+X73yLBfGun9yp+5nR295wpEdo7/3IO888e3Xry977pi8b73zBr8LsJhd+TDnxi9oTPpJd+pUffvXj37/s9rtLxwfeUT9fft6747+dBt37vNn63g/89kPPuWyU/s2569dd9Or7nPuUt57+iVs/mAmfr775qDF62VeC251zv79fvOBNl976G2++xV3+4TYX/u38+Udu9otXv/3M47908XePvc3d7kJ+5MKzzrz5p5+Qqy+92z0mH72rc9pLiqM+rTMX3ad1ofKZi395yX2Lxdse/Q8f/vYZ0Sse+k+nv+Rljz7pgqMD+94XfvBRX7jZO5949PPvddGrn3PuP1462v/gf/6V++lDnvz3z/she4enPOmtNyZefvLH/xp7A/2ht91i/9BzX/og/PnHX/Tqz0b/eOn90h88zjrj++373+OZZ77kdfZxX85ufus7zx7c+dpDV/e/s3pp9a0vB8C5xxylfObrv7zkpJ+ch3/xacCL4hNudhTz2L/qcRe7z27f7QQdkL55yjnfPun88/3Hv3z13JNPPPeS03/6qe9/KDhO+rbyPcl7xukh9OHhsa95xT/qwvPab/3O8PN/8/qfnQt+PH/wh8bCTZ/2nNP/5dY/Qk869cRXiZfc89wnHcU/68a7+4rAR8659H2/Qi/913uf+tyvnPvCVz3j6L9tH3fk+AdecNFD7oZM7vvg1x5tq0/+1CVfX7+ePO19/1Uc9ZMvXPTuR1uPf8zdlbfc+htnf+Gi8+7/vtP+5vzTPnn7HwvDG99rffP7vbJ/QvaWN+6//912stbPgb/41h9pLzj6b9/1xJ9+4/t/85Ff3fIl//cxNxYefPapx9+xPx/f7Ll/9df3f/BPfvr41970RS+m73LK8MYfOeMDP7zs4/llJ9319Kf3bom9lDDXJ7//VO0tt15/+mPvP/odxexfphF8zNEvv5d4annB7Jx49uib/d1ffys777+/cGr7dh899Snivc879V2feNZ3vnxP601PP/X5zs2Ur4c/fNnZp73n/u8UX3vv6GX/KP3bux9wxyeJ6P987qinnPerh7WsL9/kERffFnkP+flLnmie+c7wPhe93BLehDrtZxz70id1//W4c+TBx8C7Bo/5wB2iO3//Ld1LfnbZCU/W3q/d9QE//z8fP/bGb+h9/tnPedZtPptmLPPYk5/V/vZzU/j+Z5z+41tP3nFCcukvj36f9tBjuYLEe3d57VvZDRXdxxSJB9/zH15/73+XH/6v0IeXX7pH8t8nPc566mPv9UOkvp5zz18891n3+Owx1CvPecN7Hvexk9/85Mv+89xTT+Uec9Nf4Pcp3/qqF938Vf+1Jt7+iXfd/51vuM9t736/yf0uqJ71o5MfxTzu40995l3e+Ln019991r+ZR//6afd4ivKeX93qGPsNv2w9sJlVOBw0ltnpEYOlRke6VJ89QlNXZncRHAFsrCb5KIg4bcTxwJruN+pCFokibs34Me+qE2aP+t73kOuts8UGQM8hELuNA412netjbdIiwTZEEAgMIygAkeB1pPvKGNpHcSrj4+0syfOePpFNOMW9rSIqfjFlclgPsnJfBl1QsCp/EPOs486kPqL2RHGw2YQZwfI5ApFTEvFJZyBHLRiyWJenMFebyPMUUuNBuchHejDTscVwPRuybOlw3Va0R1QlhITZ3Fy0JEcbJhJelaY46fe7uLRAkG0r1qZOwTPTTmsM26xaCpNiP3NmlamPpnThrvWZXHYHQG5SzLaDorNsaHVEvVx0as6+nAQQjkakDgtEUm5aICiXEt2RWzk+gYhkWPPJJUnsKBLUfGA+7Wk9VV/2l7ELFOtVHu9qDqVb/rAsZwMVrDoZse2J9LAf98Kk67FCn9p61JICoGyn9CwwY6HxHNVDrwubO22fdBaCElZ7WV+kcIgsyc5gKncQPx6h0Hopaji/ghMSBmEH1yxQ20rIEDbHKMx1fYBT8o2drUTU6sZC3yoIek+n1ki3equQR8fGYCzykgnLCrbmNL7V0kGNWnOd5boyKWC1XJjTud3Xu/5SmMg5C2zIGaE6XWVIuya1ctetxMTUcLUcr1FhzeF7ONdCQ0CcVTLj5xNMkydJv0sOLbyoFKwM0x2poHO3l8YtpJ9nnaWzyZaV1Hfz+mPrDAdVwKRpxGZgLlYUORK2w8EYX6s5nfurMksYkqdVN6vGm369hhvMHY/H6HDUBTcgvGSAYYJNeJZVlb1t7DE9UwC+tenpTtkPiQXiJlG5SKbZhDP3g97wz9NJhaS4ke4JkJq2QlejkzqvaW9hVGxlahJiTIVDXVRFM0CFl0CTGYL/X3nv8vu61qYJ7VKjporqoqq+quKrphq0JbpUFPmi+H6RkMCOL3F8i++xhXTka3x3bCd24llBq9Vi0EJCSAxAYoDUI8SIERNUE0YwQUioRy2QuPwXLGfv853z7b3PdR+6juijk71/P29n2VlJ3mc9633f51HLoFrtEL6jw4yLm/oWH2rV97Ra55zVDvVnXWgJKHntI85TF4Nca14i2y8jPG2pHsGqG7sI4Big+56WB9wF9T3joa9Nx41QrlZNYI7QoKwQFRxXS/Wpc3njP79/oeXvfNQhhoCjf/ZiyCTztnmOt1XfdA7Ht2NXT2nyvnzyA2nV9t5E6bDm9P76n+DvrPCg104y2UW3sGhfPntp+zYHIfedhmrRhPVqbbc+4WVm9N3lMj+Omf/hKq4HOPVfjG9P9X3Mix9a4/93jisSnRTHOkhfK+sPoQTDInwLkSi9xdKE3FI4Hm0JhIohCEexMP5Q9uIf/o//7j/+yTafkYQk0hALtyQaplsUI7PV4C7bUgidRShNUBGKfi4aoVNllzZ5kzP3+jTmC9mTDXSS+iqr4fsUGl16UDX6Ol/1VA3o6njA8GHApqNLpBHVl16nX/0agq/UXTk8PXRjW8LpvufY0bBkqWfu5CYnlGvQookoZZO1IaumJqtUMjcKejwV6rLpbRzhEdZbzAtJqZwUQfpJwEeG3aHn6VrIPWZLRv4cZqhBu6nYkJyAydWGk5GbndWX66hGKF4V5ibvn1JPkROvTVSh0UbLU4UEP1QDHYvhyrH5skluperKQSXSR7SWi4LBFGe8XvNCpRREGyoBGu60x9s0216ujswMDbvUSabO0I2yzpxzqor9AbmiJqlUEhy5fChs9vPOc2vLVR/HgR3ppDKrhIuuKqeZVcFXQpagtHbah3KBt96Sh0pzsDuslRa/DUiCx5Rr6BtZvQ+SA8Xv0zlqnN0inB03vm4KX6+yCyMxQk9DsGzsFijkxv0GpuBc3WdzE56eCzZ4ZyLN+jS4pEg/05FLWfpCRl0DlQsiM93egR/PAsR+mkH0833nO/h1cp26ZyX8+rxunjt+PqRHtGjMJWEOG+dgPpIIa22uhm4PQbKKYM+Iu3kSvV1cjEkWCi16iuomErybbGu0NjTqTt23ETzjeSuf8kkTghsc59S5gM/XEF8uuVU8SdtGLoxWV/l0LX0wzY2azXFAwmMGX1TUai/+gZAAru1T0dM2PKRtrO6pTkVPy2n8vTef+Xmtn9RKddG+WVyvUD31qXmrsd1qsL2ab6/qQRWqrabiNvgiig7sL2ypfrvsxbSK60UgqsfFz7nkhcL90sf09XV6zgKQttZE/xE0xsNfjFmzL+iqmeovbrEajQevfmcDzOUF0wHKqghALZuf/dKsdPD8gEsKTTSLv4mSl3/5zS8BkggFiPIAZH5DQuNPv/YPHvicds1XDdF/Af5NKQDStb96W6zVMlk3vAXoVr+N83vzMm9Vu+j5qzd/ewW06t/7rF3iPRjypf73I10k/nB/cFR1Ve372EocQ5IwRuhtSoXwFkNpdBsCbrJNaBwnMTyL4+xDJ4n/6Pzf/Ac/Wf1LhhIhFVP0NqZTfIvGqwVsEq7tZwiSJGQGgzX2Z2KSwYxU2lFMAAleQZhVrszl3lBT3tIHqruGO9vEd37vdJ2Zbxwhu+aad/Xb097KSQvtPNxHUugY73wTgW5iiPH5fG/L0312h3AxkZ52HsFccn5Aj4fa88SRnMPHVb6EO/dytCLHsHclxLqFDLm4rPZD4EHNRnHN88k38fpCKEuSaC0e3tm6KFyf3dCSuJoYlDfk7F5gOWSshkKQB1+TrckZ4+g+M25j7k82TY2JA9YN19bD6Sy4Dz4H54Ewn7qY0TGf6GRJ1Nx+GrFuilyFchc71DyJvmL9hRAVbsew3jBfHF1QEdXH6klUQKB7QHPsZqwGkQT6IH1JGJeuPexlWxTgWCcv+CM/901h9qPks0/vqJ7NmHdRIjdH3qidIjZNds+mhPxwhRN5oOdbdrPcGV46LET5zV1FT4379A5Umgtyb1Zle+oce8Ol5BLCyGMm5GN2gw84n5AzJaNP6vwUaNaxfYYO7azgdVWHHqrT8/pZptuLe3yO80my3ZFnlSeIPd1B4JxKg9UDqxpme41q9V7unb35zHOrp/WhvB2s4lbD2UZQ8E3zbHq4oA7NIIX37lmNlCGopatNUZpOMVYcr/U+SRi/HoSC4XgMdxiOOpLD9TDRk7WLUedQeHnBDvBJtsYTrV20tu310K253TwKo42wpH1wCPtEaUQjnQWrim5P2r7EUtpUmB55oyvc2BhKVOZ7STE5uGavdewXWF3i5VuU+4q19HKVYPIXBtFEFdJsdpU7RDTbwQBDeuie2wCMWtRvb2rm1p8j8XFdE4vg5+XnnRhda18AJiFCoZZr0jioAaNDAQ7VGscDJhS8bIn8Zq0jYnN1McGqkS210n/6y7EEWFStz9G4CsyZg6kN/9Ds6geo+L0z6/5K5DXbIPhv2OC9c73rVlPWaFWpaC9rqUv0zjT1Szc7+OUM8TW0WH9ztL2uqrr2G4gR/vVH4hchGDb9fEc7ABn8x5CB4ASJgai9pUIC3WIUiW1pFNAIhIIinIypJEL+P3W0CwFgxGECbXEiXksmo2gbQXS4RcksiyGUSLKM+lzZJrzz3O6a3DVpPOOxfdRIOTouDOPR6axKj2KKpaMfE8qjiXb2BmG4Acv7i4ZcsrGu5nGkLzULkRR5ewRQz4a3IceQLrmrtHYwvX5ULLgekI1DxCewRkFMs2DJqKePUIIq9q3k9rbm2HsG2pglnN85BA7PMc6oKAnoQnVy+GV3XJTrQZCFM/x8PMPcM5n4BHVRNIKRJAxxHrJnh64H+XVTQbdSRtJoFzPhozkyNnJ6ShPy2Gv+4WrzzkUuBv8cDLsOx8UmtOPuRkcLYkHJRYHQBKLVI4ejkl1xA5pgGVvUx/YKCY1dmwdls1uSx12O70QqUuzc7tvBuRx0Dd7YfnWN6Gae9l2CuGftfrGud8xXvClVZjjsg9rrynHcaLklu3pUNimFEf5oXTdCnAFWhIxamj4LHn+iSz/Baevp3GJG3mDYD+jMC6rm+PYYuExlXs8aXAG4gi/eviHJZFhEG9r04iaSMdTbXRRcvl/KTsf0m3Pf78IEZ8YL7jwKHKYNi2iYS8TfihtqavMetns+KGvl2JW5KfSTWat6mmt1YRKurYuEzjRNI2pc3T6zpSxuyezykhtTnE0VzmOHUbOFhmQlZmZvZG1GiMm1JYwiVJ8XWDkHJ9hQWVSAtLPcW6Qh0F169r3QbXqNRx2UICxruRKyrUSQsQluRmKwhzsr9baCSMnpfLSM0cdOjxE5txJ9Bvf6vXQw3ncsl9VTtaWH/s01NEjAmY3OxbPO5QVY4gPIYDAQMsFS2180ZNWGqFC18ZHvEHtFQ1GAwrMGhWL984aLVdHQXu0dYnjtVtDFtU5IXTUwAF0RioA7Vtra1YwACgPonG7H4G8H121AZUQHCRoh18RjqTU+WCeajWozD42TfgBc/FDf1H/rm3xT3aIGYTP9bPz4e+DQ+7E+G0L+wJUUhRE/gSIJlUBUiiVbCkbJLRam5DaEaWybxmiWJCDQ0PSHxOMnRZEsRqCQRNEtjq2bYRkEb9cC0C2UQqvyRRJRyOc2HY+k3hKper9t9vPtKfh3/JlYxlFgNSs80Qfa8DrLKgRVP9VZtzNTWsV1MwjbfneS0NI/UvcLVCJ3GXL0gu73bTTh9+smxSU48uTbXhkfTuKXJ0UernAn7ESONaT+tJfwyvPvDHm37rlt5jrJagq2gY3nAUMuGERxw97owQoeO17i9Dp4/eYJFkN1YSdjeuSeIbv4cfFgw+DMqojladltYWYyoijToO/TJb3t1Em4cQWalh51yViKlgBbD5KmPR450glhr6Qnv7ZJdNfs4YMZXbrDcwDkybzdoOeBy20DUfW8TevnMHReCtE1iO7Koz/fyKgpML0fcgg6jpb2PKpH8L988zBx/7y7GBvdc/NqIDg37WqroojrtYohzWj7hw0jRHWHhWS3kZjNnpXOSB4BlrFU0z6Umd0yaYOWKmJAhD3PuOTZkJ5h2iwTenzubG58zMcq5rGOKaf6tmHrwMjsgLkVMFPdhNGyQkS6Ippxoo/8UTLtRAhbWFc9FxWYZzb056Iuyd21Rpf6MbJGQnjofBibCQWB3R2MIpIYY8lFWSjIY+vbi33rIJ/JS0FiO0srJKKMn9fqTvVp40bTYeLw8c4r/eUO5QLPFkFli/2ywQWZPdUb+1FIEbRX3PMeI87pldIOtgaV/oU0WQ/JxyxISIza0EmV8l0ppLvyat1HEDL3Dp8WZeEWU6qdH+CWbsyeddMz9hWK/LNvQRFM5aTn2selc/zzm1HkWKj26iBtruZCD11cXblfdm0ViLIgCru536hPzTZg9dsrMZ30zAK6jP2s0zGBt2pXONDqmg3Q8d3mn20smmgga8pF9/inKkoPdXWS4NYGBbcGaDIHzSqSCOajlBbdTgq/EeqA83Ft9Uv9cl7eV1oGZzMPAKIC1P3g3l8bZVMgul8i4BKJ9e1LJaYvEej7OXh/237XZ7cA/Hg8+jNwSLivIfXtPqy7YW00+5Fw9PuCYzsm/8WeUXRT4q1foxGepnCW4ck2QzJoi2EvAwmK3mbEKhUeYzj8kaHqf/w//b3/6ieToo3IJIZhBNqmaEICJoPEWzqOoy0VIyQRQ1lGxJ9bKCBM7EjZxpWvlINHFLWKTosqP2TjMMoifbgvaexRu/upukoappWbbC8ieRLbE21wi2wk++EWjGOP7nPStaG9igfUgVUm0Ypoqrhd7yJMu4tsuoGVEapfM9pIP6CGaeZbUs4DbHDzs/KSwC4u02DfjDlWi343INltPHi+nbKPB3VNb7MaJg8MPslFKIztmI+zDEctZN0nOOYPNJaowoXN84sLos9p4g/k/Xak0h0atk+wDpwwd/C0PYjpxRWJbWf1yyAeXFJPzKNi1WwnA7DCapO/5YGy+G555/ga2eWp4HjLJGaq5EDtwByQ5353ggj50Nga+4ibgDpGDZlG2EhCHcpNBdJJ6MNNDCXv4F1+cIg55fyeCu9BkB/Q1rkkm9NCAQTDLYkc4fOe7KUxuO1rXrpwJsM1ma9YkQl7t3HntONdPfozALlr2nPnDrllVUW0chgFm0Pe7m6JbA+JFd8Xv9oLQe9xHNae6sC8jMdCOda2U/iKax4bZlC44M4/kGnOGV52CY7hLcgL2cxJHPmKdjfrtNzTq5Q9Z0QXRVzY73txOC5eaSJyeGSFp1zXu+AkboQQgMae6NRLcmwee+Rc4+Bz49SXMx5a9/RZzfrhgELuXWYJ0tyICd1MjZVR/FFhfB+9kwmLOtNIPIRjyQ8UwjeP/pZlh/KYz2hQmBiDXaLHESt38G7RiGGTOpTvWI8gbR/+d7WB2fGiLuraF/AAEfX/v21gjYqrC7uaoD7XRH5QHqtANAtt7Rq21RnwMFyzq4fOAU5mX6CglHDAc8oVTdbkP3gA3qY+fMRAAF8BKOPgYE31rW1gf+vVAayulfcrF1kVkoqxWKP4rXvLgXXDWzEPx9v4eRTj3wSHtBTwlmEI42qrdF31yr7cwTceROwfGNX/TOPtA2+azF7+QtF1eU10WI5mHRjuq+Q7hiMYSsXEFgXr/i1G4SC4Qgj6EruDQxjJKPjDCP8Pjv+b/ElDU/87I/wnE00rc/ugg+C6im2AH+ZwSF5lEa9s1Gowu6oNAlJnpuBUcGitofi76/PX38e3wgq/KzpHCLVDqO8E6B//Vv3r4BAzxHmYdnV3KcY117Xvmms4/lCNkD9hzP2B4XUFrAgt+wtw7RNjfQXBCESSKJElWzTMsi3gKasJICCEIQGHaRhmeBZ+uK34D8Z/9O+//fob9OazPKRSAl4zUTANg08JufqRZFi8hTOKpiKSRFKK+EwIVpwATVN9mnu4Em8Nbp49s6Ts/sgpYEHLa7h1nceDBZt8YQdaITikoSDKjbOFC6LFy928H4e4vGJXHknSjps2IZ15KU2axKhotyds0ZVgDFZBemVH60Ez0Lp7iM7wNVncw3XfHI44W8BGsuliisHQJZIfzrW7hvZ5QV2kYpI77MwefLq1U8Lhfb7fN9Y+UWamIcjD/dYxPrlL2w00T8w5W2j34rrn4nZDu0GgHHpp7cq8Oli/d6hjnOGy4Cf3wmI1twwhCGfAwJJ1yK2yIizrRvFcQtDJHvKvk3rhAC24qFclY0/N3m4pa2m7QMnwjdhq6clqxFLbO9z+uexM7MkniACgsI6YWDrPg/loHpszgNoLkpOpWaQX293Bscyj3J0zAmcIg3wQEf+mbeRGa8+WY7oHXe4B8Id4jkZrnSM1koS3iRUYb4KM2XM1ItB3sU1k2um5i6TOO+E8iN3ED7vHcXFcOcOU640TLgoTwVY4Vj41ZrnDuZrVjnsmyEbJl3e2rUiQwzNaTVEBDD6i0aEnHmcEJo7M3dXN3R18/ggrDqzdbSckUoycdo3XD9JG4RVlZHzRKPJ0oisTpptuFmwcnooogQDnu9wRtK+YoJyjxStQFsd2YYcXZDWZeAKIaqtYYBnUsOleSbzzk3JCvmqlAs6k02zyfu+KmgAj0wPzdFyXeE6Lwqq67DUWfIA81ea/pynImiXR7QoHhBD/FjX4x6porq42g6LbBIAQqqVbAthaVM8HMMZj6ziBzT++y3E2OB+v/qoI3whFJP7M/cwXtvZtN9e4oFS5CtOatWVPxdalh24LuYpIqF/GYG7Y0rfXzu0L5i/M4iM8FKwQXrqF2oAHYkCrQYjqOcsPcZ5919H9dcWpnwWd+xNwiC0ub9khLNofS+R+wUriF6zJSNrHO4thTGIYQBLAoFJqi9EQvqUhwOogGoMQLAaR/adTz8UQAoNwMHi81pajFIxvQxqit2FKUzCBZasV4meChvPMd2y+SyLfn/XbrkivNy+jGwcTODE7Pjdg9Vzs4Ewsx9y5BOTiitjxOuzSbLOIY9U7hg/HJI9wFDek4u5W7UgmWwwu0ZXbrXeGls6z4Zj6MB42XP9EMf92QEfI2D9h4YogmWrKRT2FjjRI+HGJ4HZvUCVOxhWr7CBN2T1vXpkeH5fuIF6MU1utEouMHppn506QyBIxth4kaqYZGCnszzTArgoKZt+ARYJEH3b0aDcq0htLf1p0SjEJ2e2rW33tfG7QWnsJ98sUmb3R0ufpfNm1BivbgrgMgajZRJzjoycbM+R37jmQRzQOceI5XLXwMGmmII6tYyi+6nA7+mrs0Zqz6fl+3R34h1axgeCWWpIXOBdLiSCgR8MiTWjvMPs8nJVLvKc2Mj/5eElB4n5SYgDYpKeiT/h6QdKmu3OIoh5tQyAUosVgeC+fSmZ2240DVugJP1j1c8zlex8aF6xAKaFz3PLwePbEopTMlSIKsx6GQ9416GTE2dnJFEfvw9hmLpbfq2K8RFfqKuUWoqojjhGRm0dRRV8wuw5JzYv9sJhtR5xIfjBHfRBxNyiX8RiInUmEMZ5unM3xzFr8zNZqgd591pJlXdrQWCAcrnNqLc7RLKTQHzaPDUrQ7aBM/nTyLDmf6vI2TKFNE8ipnoqDJJpctuGwHCviYwjHNKoh8Nm0o9PuKMkKeodnF8nkx05Xf4h6LneZX+q33wwaIEiylcqpgKmu0nw8BP4GQAOC6cLPGgICYmOW627ZdzhJ4WkTPM/Lz7uoW0PUlxHjy0mq4eE11xSI6lP3zAqAwsNvhNwva8BbVWgFTo3Ly1VFV/f8x1p2GIj+Oj9LwAGux71K8VDtB4DFv/TmL7+qWdBWkvLWBcSva9++yzW92qpfdoTF+JJnB7H7lav6tYTu5zHCFRV+47LgWzg0PxQVNEk82F+4kiXp2heAbJjqr1EhImAMpmloC0chusVwItmGMIxskRSBYhyBMxImP8o3/fIf/WTF1wQZUiRJ4YBPIMgWXZNedJRiWwiGYyhFcZKIPldnHZD2nuVAwJNxTzw9sH3S7h4cBSXKleGUpN6UmnlgISQORpdpaMtegpN8enh4hcuUYttFy8XCSLsYRBPnfUsfKyc60QFLGc9pUqTjrZ52J4ng2A3knttYM3EvcQ9OEZBw2dKea3QqIV2udBYdT3hziRbaoBbzOGNohM1nma/BSkRDZ/7GVMcN1rB0LqbPS83kOkxh2HnPHpJ8RK3mAMIiKbHy2WE6bs+xjp+chIXaU33jnev9VXs27uRSpLOXWkx4uEqPT6QazeMVm8mn1/hxYihyI2GzUa+xl6umiNg1/EmwstOAFPR5Q3YhZ85jXIskZJ9wlo4qA6YEuhCoZkgE2tFI/xg5HsaruwAdLUS2QoM4NVy4d8fhHCHZjm8SyUZTtx8bhCAuPj8NguQnrLibTEMe7w+U3O2dy+iRDmKTYM1qWbR7yk7F7oxrJ37jJm3d7RqJdvZIJ40XnBq4eDg2qaNkVwaF8xnvFEetJ7GiqZ18RIyNlWo6WMJHnKbZtj+R3TFNDQu8O1zYeSf6Il1D2mT3Cb9k16vL3FF67s2mm3a4ix/B6vOgw5Ht0n15m2nfZGCHY0UjEEx9lsruPvYlYXkHs70Ggr5XdNIlYC246AuGo4SfeshiSi1axGyk9/bmNFwu8o6M49049URMG2f95lxgzIbnGnwBmcuI2IE5kbYT7w53l3US0mvxfOSPPHbpvi+9WBxctRkMRPxvq1rAVxqhiUENEOOloweW1rAu+k9VdBZ1ieGgvCABp+Lf4d5hJyL9jFwNitDjLf1ZO3jQhW9rzYoGmsgjvs08NURCfEAeAu4Cr4VugHZUAGUfq8Y6wAWAHtUjsFfHc7MKyrVoOwaIwc8BF4PnrO7n/PLDPAdXU6h91zTFuEbs8Z3ixrvmHOjtQbfVt/zj+r3adH48bvwBOCR/Rmn078mfLItOQziJKJTYkiFObzECJ7YUkaFbNKMoOokwCoGRD9HizZ9L/+zHocUnZ/fta7cvucfv+6WS16hvbyDKty9V+3VO10JDq0rr9La+Ae/qRPA//+wSkD8Gh74c9kcXnVsyr/C2/gmGBoVwmBCAK0UQDrAYS8h3W21JhkdwDNMhgXyowvVR7cfnbPWhcRphCAlt0xAiAGtLwbubxdkWSRCcRBCIij7b88ThS/+QnTe+c6gu4xxvgjmDMFJj9M1EHOyH+LgRF1T3BXJg573cEJzLz1S2XIXkEW+qZIcDfEPvSixUunN+3lB/PlrkhvNOt4zw8UeoLvce0PK+7Y4VKVuQdyeerXqd7soN7YITwRn4nQbx1A36QZHbsKEnO+TO1/MSGpDWVOHd1257CwB6aaBlrWDCc2EwDbAf9chvCDWt4VrFSTabNqrg5IfUdNtMTKpKfxbJEYM33VWs1HuRP8rjud2IHABzmCxhk5rEJhgTk3ANG5PmTeFe6wo58m1N43VcIf1+gedqZ4rH2DtMbmzdspaisaNU74hBKBOZHLqYhfigshLkjnQ8ndEpfo/pgSVHWOOl7NbHkHn18WEizjsHu2FxZ+7D9Aa3AGp5qbuwA8byvsrL7f1813E1elYbMWOzMWTacM7Ntjhe5Dt+wDZyWzcWoEamm11M6/YISIRXGGVkBTFVkEsY2AXDE7MrBgqto0ZyV6axlPcNy7S7Po/nPu5OESvEWH3pu/PIk5WVG8bFdx2O5KJQH4hzK8R+QHlV44ZX5yhTyZj5J+Zs8sfzIUihPZnYfekqNRFRTWNOBlnc6AclXLHpSR4u9InaeHSX2IjQnQyfKtmMEUcTM3ryaE2eQ1W8AEjoLMopLELtjp3VC3Gqi3t3Ma6d+NxXrH7fu5o9LDdnikr9vFn6/VF1ZHG3uTSHa/d9az+0pQLMzXnqnAR/c9E5wCDAZDRPK4K1eWdZMUZ9+GWMrQxF5QzYXwCz8aTHd2gAX+2DO0Ue9bNmbT7i42pZYWrjP14ZuVJ9qNy6/lhrPrQasFZELbVm3R7VV2ct2wDMLp4Bs0MAHi+BZyB+YyCqB5gst4r1f03r+J9j7cdvv7J+epYVcRHWb5s0AX9eh25akfVF89JbOrRh/aJ+4/167Ybbq+WJA5CfrmCzDrAP27dR+nbMu7lds1uXbkUlwBTB5eJ07YkKX8LBh/B6fb5Vw7F6jQH44/AEp62KWu9vYXVEIaN7USfgDj4z2fiH4NDrNn8Mkn2bwcrvWQf99MXJWdNaFv8O9f5VjgFv+seQF1FZSmJ0sqUQAtliMR1uozhLX4WPGZKiMJ3GH0De47/8y/yT6ccfVe5IwSkKcG+L02AtgxIoDuhnEm0hNArpFE0BKQ4/E/LirGjZ43K6n91bOvFXOdrkcA2fhwxxzbYLw9l+thXZdnvcty8UdKTyjDuf3bo952e39Di/hJMDoIbHQhegZyMoTpU9oH4QGHdiUYoKoIONeIRrDcJ4xVMGYlG+3bm5oJjP8bk/Gw+tjrKY45JOrGBjtq3erabi5Nxct+uLEZ+oJybWZw8iW/wRT20gs3yNWBkzurOKGnEcWuTp0GIPEenpJDBHjOKEYjqX1M2uTZ4NorYmxzFl7HvNFPl+f8zD1pSvTWngg+RAF/6MDFJXqCXKDG2qFuRIbGw1cpNN/xjPjbeDmw0qNRv+INF7auChE8xDisAbFMTrG9uR7x5REk0w5ZZy1STslNJBz455LsZlF04xwQqGRQUVwof7jRCMByQ6TftUJzfTglTtzkrjDjVkAqMCpD2bYi3dByNvOZ2sKUeRyRNmiCemaE986kGCWh0Rwi5PjlPe9JgXHuOGUZdTPS74PKiHuucE22S5YkMrAVfJj36we5Q7Ftci4mR4oeWMzilY9Ttr9GOZzPzM6U5Br9E29gjnE3xTkTI6y0RrYmiQVHn/ZC4oczW1UcfEnSRTl85hpMBUlaowzBO+tPYu4KOKvYgUG+86DxldX22J20m8t3e7y6OLjC1IbN2rRStPFZ/JEXMIiq5uVNybQrmJspmg3eBZSvMTHWo2xvehFGDQk6QfF+l+nc8P3XiM8fcqmgfUc/FX0clZs2PsW3p/K61caaeBrjRLtSVIA+EfhHtslX/XlrUHi5k1Lq++I7u1t2qa9z38uva1/pxh79UAsCQ5gLyHZjuAfgK44y7zC/obB3tlswAFVRfpqXpuHZR5oy0qWAIAurqs/WcS7q/ZreWV9Xrq9uXxQzJb70opTis+gUD9tmia+6tIPbyERTve3lOlN38ETnrZf61OXsXwZWU8+pK4Xzc1f107H++HohkB15HGej3tV+/VI9+GL2sW6M9XbzGAK+R7EjasvOy2blOu10vD5PMQaiWx6w3+aBIrSOanMIdGI5IOkS1BrlYrKZyuUg/pNkrTGIeREKLQD7c8/+r/+Z//r5+stzeEYiKJiGTNi4E/IowEhA9DtxRJESSBRTSefG5RY3I77C0p8qanHiVL+qTx6DDVPD71yOw1mn3aNYkYyMEGjZ2ZkcVzJWfQtS93zwgqH3OwHCgQG7Hh/lCR6HAou72jkWyrXcnWEXePAddViW/jIBemQb/kJ/EoEoOkt7ZxyBQbwk54kUaduusUqzG1zYVMark81AKGePhhj0knCcmQ7FTfvAmZ60fDxbPX7xL9dqfP6HwTzZQQ8OSimdpy3FFw2cH43nOUWIbQ5oDQONvK+3u3bBBs55tVmbNR3HgsuTwXopQZ+8wT94l3JegZ1LZXl/11JJoMZi2YkK1sTs8t6vA7K/cD3SprejgPHnzI5cPMQNTzkM27xUoSyTr7pHpa9IxMJbtcDhGxIeynt4g+XLWbYSzwJqFvo2zENxZvURx58Cen5zmTvldkP/K06Ypg5YlfMT5pbnQtUXHlZ+Ijy2rqzD6xBzYGnYyo/cRd0AJuq3lf7nIMROxmuj2ydNPmURC34ua2qZtYyRxTpbqHRmXIUb7g+zI+TWCFiC0al1DE0evasCweB6yi2PO9PXg1WqY5OlBo5rSljrVc6rtHpAtPd38grB0CO6ceOhzgsqCy/b6+GdTxvMS+MffXK+1rsAC+dSlAfMCHdGZDdt0uH3IW98arvNiidtYPyDAh0imkz7Zi8BAeAOjztL1LDvZ8zvddiBLUoJAZyzBnWlPiW99s5vns3QY7J7jAmBLIFZ3vZ1gM4inzVF9Uy3h+m/qRvzCAejCYaqvrlh+0UhF9tSBZhEYVJXiNt7qdNNq3b3kqplM7lkCB5zHPn3ejlrF6l+EaBzDmVdQZ1JpnFtqqhrRSKdEH9wheu71qSkhzYDMLwCUE4G4ReM6qeDQDbEZ87wjoGKBsiPoIOP97N2r9pkhxug+HtpgAS1pZzMcixf/Oq4gS8JtvFCZea/c28P/+X/zjFaair1dpfCVP/BefkieONsRHTmLfQ6P48zYDf+Pl/iCd4i8VKBhTk1xG+UJlLPk3NPpCLM0yFErWdmJqixFUtAWYlW2hGEczNKRpNMU/QKn/5H/97/7T//onU0VCMIqOsbVcBAHMCCLQbUSk6TZOQihJV8EkKP5MlKoPvOugxu1hJdbt5Pk384lclWO0maSEB9z/uRFDTcRcZHe0IN+/7vnTHGYFF9n16Di+hKT6sVKqEoc5GXKkMOUoNQw75/4YWfH8NBV6jwvuhjoit/x+Kq2aiNR5x8VxuVPjOyw9l8BvLnBc82fpbHQYlxtHwfT2RsgcwnS34wmskncxIekeJi/MwCrTpcQEbiw2LGLjvS4lsuKQOwTtuXiRFahH3Tmz+51eb4QEW5TJrHkiuzQW7smhdw8ZWJPBSjxzH5vKqgZuObv8TMSLTi3sidUdUTbacTyRG2sqyHQKSmp6TkujnGM1OphgnPhgBRxbOEeMOcsV/7DcE0tqBVK2gkJIqsw22L1Pyrrt6UVQ5rNRzgoeGpjqQFVzivMQh5OMXaTqNPb7iEyg7KikaN+YMRrt7t2BZbQIRU+WONFY6CgcdEZAmB8Z+MkIuwkpTIo87zcuUnfIseAx5Fbu7s+Qi8kOSnWXHZqkMjLI0ZniAfNSjGPe0p/kJmwqVfIMcpNE4ukZU32ed4fwWDctceUHCTPoa+9OqKfSJ2NhH+olhvFDlQwYTEKHiQra3rPp/JwwNHkXzq2C7eh4RzK7eYEi38ylvhiUx30XXi/LLDyfZ2T0muyEE6F0P8+IseGaE3bNefCZLUVHdiICFoZiqvf0gzmS7XAYpREhKLSz/PJ8LIRJvYt0mi18p2pjTtXtRv1+m4HzWo6hrv0VtgHp38KMdM6HtbIutOUCr2pBuuigun2s/eZYgkiOqOLLvWTWvr2E47Q6T/oe9LNmRb5noOsmoL9cnoF4zHXPh307AegTVFojFP7Cr6odeADYj/qyKnCeAKWQoATncm4DEB9RvdWdMslX2f5V1+/Xbdb/XBvBfmhLMvRNLclCODQvOgV+tvNV4H5o199fPpkAq9T7mA8dYGhcOoJA+jo1fOUFIzEckrT97EzWH63UCtzFZ6QI/0BgzE+LJxFRAtEwmmyzEIa2GITQ2yiKqW0W02RKogC8PhJP+qt/+r/89U+2qUdDq2QfjQOCtZqHUUiyjVAEsLwMiugUJVIa+dzqw9Niosy5e2zmk6PG4u3mLlZP39OOLYf9wT8DNLC0Ga3hPILFyuncI9yy0j6tGGG+JPvocaTzpb5QqdJWI58ZgPl5ln6QIWpICXwvjR53GQ7yuahEZdoPR7bHThdzmZIKB6uC2+lqPe1JH5W0oCzTjm7js3ISsd952lUO8fnCD9RinVTpkt8P13yPPuGTh8AYvBO5mGuu1UVRph06Rr1McPUInS7F7QRWTACX2JBIE/RwJFPW3LCHW3pK7hS1mGOjpBzXEf6yUfLpSRQpJk+ng4vQcmegppb42jM87m7RsNElgNkPNH00F1aqL9VmA3DJpI6l+dg0V+aAtUjCtgCWpKf2sMRSS7LKxG1+HMylADHMouPOrMv0OQ3nWiM4n3btopJU8WIcL6oXEk+BKyFFuCViG4RP+uzWkqKiEW0hWQYltOfslpOvkBPSw7zKCkIaKGcPkgLq7Mt+MRwEgI9GsydhW/TvKJrZ99MuHu/lrs3cvAv6zYaEy2R2yr2hw/BM3HjzaqKXXYwI4ck+YDojO6mT3eLDTk3LMxO3AnkdmaMVH68qcgtUhIV3yHm/i4Ryd9iRqU7tmEBTBx2DN9KMYL3Y4timWFCzes5NVJTD8VHjRtmUpXy/n09obFyRS1hfd0Kqs5v90419fGRGrkoecCNNTzQ77LhHYT6OZA4m33YMnTmOp957ZkayiaIRafb7noSgaPx+gn7v8liL81Dt6vEt4kn/ghknr0J9Eqx6bg7gql7rZl4CfQDSglUAqZRQnWMAYTqWAYB81T4WmuhA6iIhANZxlfMfANYBsVrlZFUUwBwgserfiJvM31l9lUnrBljT5Z1AbbwhwfEVtey13Wzd1YvXSJsO79JPK29ruuiV26qKun4pz65oNndDu8LPilbiWq3+3kjmr95+Ofw66K/HSAoQXV5X794h4PurrEP86atW5vXr65bQX+E0+SsYIl/CuV/zniG/PvxnQd8v1kL7uuuStyJ47NeOsu+NfOBotD71iwt4rHMyviH+D/R9EzWr6Dr3hQgee5O37K+YHImEGIFGW5ICdA5LU2xL03i2RdNVJArGySQKP4RDoz78yKKZj+EwxWIIypK1uy+Dt2iU0Fs6IqBtmhBIQgAmmVHZ51o7Tz5rENdshA9dCqcBWGmyIaXg/nXCZ6efTbs6YlNvTHTE82jMZZ3fUV0OnZ0gmYvLqfTuu+xQ2+KI7Dbj0by2GNw9eM8meqx0dlVS98jjQShIg19qrZ5RlpLZ4Hy9XcVAUYQaTKeckt211haFVmOAdDcGKyvXHtkIXcReAk9eqsPRs3a4I1+YPnRvyn7TN4r1uM2SwZYlpk20iA9deijcvZGmbId7KT4+7kXYyMM94DQUJ+gjVeE+AkKGl/VXJXtigcmSUwQdSFvDA2SvlIEJe2xTOj1e6XU6b7zbvT75SfK0443DT0s2hP1p4RxhOmkodnnyGa0rTQWxcSMuXkbkJcRWUDTkiD9RT+lpbFy0y/bSefO8+iKpNSUL60KtB7to2pi+QfrCHZXa5l4n461GyqtiYiF59UoSuUmLWT/ud3mMCteUIamkCc+RB+QM7a4FZYt3voSuyXNH9Bfewe9K0S645HocMbOXY48eupFIFpOqiP14Ps7FvWwxB3bswlXdtGcfz2axladjtReaKxT8WIYdT52OcgE9NgkmNXpTCDhx14Tr7GpW7/TeHZ2QZnYcrkIHvL5hakDgp5wZoZzcTDd2dvQMWWaEOF0S2VNEt+Vm/3qA9ucFb3fL5TCcjiHmbbyMTw3ZHqFIPiisUnTGsTVPAGcF86HQguAUQX/dePHRpfsaP50QLCyswt7pRF79kGL88rJonI+pz29mcqoorYrsMIDA1TxsNWQDjI5ttEYrArsG8OE8/MZBv0PSo/cb4ZkcavznDYfqQ+cA/DcABpGXOVrjL3nulzz60gMu3XJtJleXVb7jZeMMBav277I2YjuIury62QCDuyC6ty4d+EXnvr+G4O+8+f0Vwr6uRfsOhPyVil27W3jr3gJK86q6zAC7eVf29wKjcFVff/OVzOCcgui+eid/Wa//UhlcIenPXxyMErrhAhAPELoVsk7vBn+VVIbZ+6GouWhXmcLXGSKghbcvz/PC4fP42QpS78f6iaszfvek24ytfyG/7J5fwPX+yMfVnhGEIREKb8kMibYYkoZbKozILYSkJI7jaExC2AfANfzT/+GLnyxRhkAIDqEotI3wKN6idAx4ZIyjWwTBYBhgWUZGn6tFxREcrVFox0CaYW0YhZL7g8QfFTgT9s4mhtc2rYIGU1sjGMdYnXmaZPQ8wmx/zTjxMDfnDl7gWLvCxX4fA2g4lInZQzh8cSwBtireW+xAnIqCMgaqmW7k7TpkRwmFx+aoGKlTigEIPVOMQixhkt5iRZMEEyfDk5qDej6I6SmoJmz/mC2ujKwA2c34c1d3C1tAGpvqEJ8hajvj0Wl8RD1uYjFd0AQylSW1o+vWDcfZSocNEiy4aqaaMwnmzmP1AdH5c0fX3Nzc+D26ewC+QUfuPgkFszszcN6xdEre9HbJ4MItmf5wdh1sP9AwfUs22PnMeEc+0FnxwNxKaJ4TGDoUG+fQ9uoxumTXpr8gXI1yrsHum6d/acl60DoEa3R9F5gtQQyGhJenLLnfqLY8wUFQICeuivxTrd81q/LOO7By8PoOGvfxjdxw7eFAz5unORv3qDVhi6aLzY7S1U3rDUfdb4M8h9j+ftiEGOMZFicNtDnSiABlVzQbFgv19zD/9KL+fkoCG1ZdSQyxvoGz3ZN59pOdbww8ncudWW7Gw9CQUkLSBA7+3B3zu1E/zc0C+Ue03lNGwo8oMTwDFcLPYnxX1CmZO0PVWdY5IBC8w7pRJvS8nYozBziDnddD7RJKSJkRp58vxNHmBDlCcyVr6WfF0QcakZzJp8mG9VrIhDaVYxyMDof2ES/urBFHDv3+KFy+pv7xf39Louz5UvLgDBB8v7U3ANVFwNdss9Q9YwkAZ/FXYfKVxy1a7i9BrYs85i/G8zuAi42apI5EwQAPPEa7n/dWZMnAq+qH9irACHLfXs2ghQYAPbQWpGjL2kkXYxriP9biFHXxYb/hAZiZuYbwiNq4+VrkAfgd4HLGrNoGpv8NbEX+/pt/Y62Cv7dpPAA0+lCYCn2PYt9M6/76n+Dg2UW89iqs1iKA5r39DYr3ZRtbGMfpOHbDc013kWuarvugt+3vf21T9O07NHrtVV7eEUMUEMP//L9dr4N+4n4/wRP//sc8cYXaf1sNH2+xd+eMfwmu+4sPmCNMka9iy19zRnSDgiu//cRVv7Pv4o9fs1LzJ2n/FUp/Cc2/+27y0qjrqk9g8m+9+Z3xywEBX/y9S5HdVg/SuA6LZk3SvQPd3zYdjWd1Xf7KgztJUhhOE0AOQ2SLQS8lFirbQliI4lgYYikN/603vzus79t77vnmzX//Cax988sPsBZ8ctI2XlnzKmTzPbos/var65G537omvBVxWNfPt8na9pC+Ha9pDJYW8avpcQTLpzf/Cjj1WsTV/fq+oeXDVGvctVlxAXD7XqyFAFOr8CKvcQxY+3w0v38Kzjilw9i1Yf2WezVbDG9JCII+Mdm//eYX1/enfpG8O/UL6M2/9usWC5WxbN784sArKv8VIY9CFIZjDN+m8bs+i3gbxgm6hSkoRuGYphAarCt+eeJNS9cY5QvuNZr5BbO3JZf/rU9dFHvzdwNdZSX+C0tXOAlcc3/gLfukMDb/22/+6KPzYfjNH72/y9889eOh0Td/8sHQX76cTwwLvflDyzm9zmFc/wvwAbOtTw2KvPnTDycJvCUiWBN+8nT4zZ98ePo3Dk2B+f/aLXz7iyPf/OLrJ3/5yj4+kXjzxx/MwjfeAP7mlx+c+tVLewnufPTGrp+uT41Ev/njr9/dl8N8sOb9z/7P3zr/h5/owfkX6nv4wyYWevP7v/70f/DlRNIoQcmY2sIkjW8x8MXcRnCWguX/mpjAASGhqG/5cn783lz+4W++Nz+3//5fPTwo9bo4AwA=' - }, - fishing_bag: { - data: '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' - }, - sacks_bag: { - data: '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' - }, - quiver: { - data: 'H4sIAAAAAAAA/+3WzW7TQBAH8EmatomFaEVPSIC2El8SULUSafm44CapciAJcoUQJ7S1J7Ylx668m5a+AS/B2e/hR+FBEGMHBBUVhV64/H2I4t2d8f5/p3GIOtSIHSJ60qRmHDRWGrTcy+apvePQktVhh1qc+hFVzxJ1hnHAB4kOjbx+dWg1iM1xos/k1Oss57asrtJ6Wez19UyH/EKVhf+oK6u3y2L3jTYmPpHFPk85Naw8Dua+jbOUdqVkGFuj4jCVPlKmu/fkdy+bKqvzkO0DUy1++fzpR7Vsbknjm2Xx7NBqKdVBwIE6jThVJsrsZnWP52WReK43UK7nTd61qTXWM6YN2XDzWZabKJcSN8+zU3JobfDR5tq1No+P5pZNuwKhddcbTbzDoTfof6i7EDVpZZGPqv/n1F5BDWpQgxrUoAY1qEENalCDGtSgBjWoQQ1qUIMa1KAGNahBDWpQgxrUoAY1qEENalCDGtSg9v/U/kqq9ZvUzp8D3SiLqQTqTUajyfh8pOuydZDEqb0kzTIiIAIiIAIiIMK/RXh5xYHAuXAg2Ph1INiX/v7ZJt2Vg/U9jYr0CSstx7m7XU8CfqRTn5XN6Ja8HVUV1ZvSaWYjzr+PCVt0X3brfmzU/Lg6IZ98WnVYnDCPFWu5/8OfXQLWQhRWB3cWY0fCxqigvvJVh4w12VjkuoT+2v7k7bj3/qLhQp5v1qQw2WIwAAA=' - } - }); - /* eslint-enable @stylistic/max-len */ - /* eslint-enable camelcase */ + const data = new SkyBlockMemberInventoriesBags({ stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberInventoriesBags); expectTypeOf(data).toEqualTypeOf(); expect(data.potion).toBeDefined(); + expect(data.potion).toBeInstanceOf(SkyBlockMemberInventoriesInventory); expectTypeOf(data.potion).toEqualTypeOf(); expect(data.talisman).toBeDefined(); + expect(data.talisman).toBeInstanceOf(SkyBlockMemberInventoriesBagsTalisman); expectTypeOf(data.talisman).toEqualTypeOf(); expect(data.fishing).toBeDefined(); + expect(data.fishing).toBeInstanceOf(SkyBlockMemberInventoriesInventory); expectTypeOf(data.fishing).toEqualTypeOf(); expect(data.sacks).toBeDefined(); + expect(data.sacks).toBeInstanceOf(SkyBlockMemberInventoriesInventory); expectTypeOf(data.sacks).toEqualTypeOf(); expect(data.quiver).toBeDefined(); + expect(data.quiver).toBeInstanceOf(SkyBlockMemberInventoriesInventory); expectTypeOf(data.quiver).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalisman.test.ts b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalisman.test.ts index 2478ffb82..0430fed24 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalisman.test.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalisman.test.ts @@ -1,19 +1,9 @@ import SkyBlockMemberInventoriesBagsTalisman from './SkyBlockMemberInventoriesBagsTalisman.js'; -import SkyBlockMemberInventoriesBagsTalismanDecoded from './SkyBlockMemberInventoriesBagsTalismanDecoded.js'; import { expect, expectTypeOf, test } from 'vitest'; test('SkyBlockMemberInventoriesBagsTalisman', () => { - const data = new SkyBlockMemberInventoriesBagsTalisman({ - // eslint-disable-next-line @stylistic/max-len - data: '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vFA79vF3eOXd7nCvMz7c/9pNXvZV88It+oAbv+nzwieP6V8oXxzv6kfO/ylfvvr/PNs69lbCV+znlO+722uPOfFOl57xjv845dze9L5f+ead37d7jRzwxdsfeZvb3fxWH3/25NmvOPttzLMf0fv7/3zck11n/fr7fflhD6ZffNxZnzj9rs9/7AtPvselFz559sW7fP217z3/34F7A7pL3DHab7/zgcc/vfsg+nsf/P7bP/K8t/AfVR//He3hxf1333v328i7n3vs2TT9mdkH3De+99Wf/GTrgv/nvlZ4nvPl+576xTt8/34H/vmfk+743iy5aSd7l/X8NX3B/c/76Ln4Pe/69XdqZ39o9O7PdD/7f95xs2O+fcsXffN1Xznrbv/8pQuX5fLh+8/2MODmT7yp+JLTn3jHX5zcVl7ykfcnj/rSU4/+WvXv/3T6aeXtXhT/4LsfuO+X73yLBfGun9yp+5nR295wpEdo7/3IO888e3Xry977pi8b73zBr8LsJhd+TDnxi9oTPpJd+pUffvXj37/s9rtLxwfeUT9fft6747+dBt37vNn63g/89kPPuWyU/s2569dd9Or7nPuUt57+iVs/mAmfr775qDF62VeC251zv79fvOBNl976G2++xV3+4TYX/u38+Udu9otXv/3M47908XePvc3d7kJ+5MKzzrz5p5+Qqy+92z0mH72rc9pLiqM+rTMX3ad1ofKZi395yX2Lxdse/Q8f/vYZ0Sse+k+nv+Rljz7pgqMD+94XfvBRX7jZO5949PPvddGrn3PuP1462v/gf/6V++lDnvz3z/she4enPOmtNyZefvLH/xp7A/2ht91i/9BzX/og/PnHX/Tqz0b/eOn90h88zjrj++373+OZZ77kdfZxX85ufus7zx7c+dpDV/e/s3pp9a0vB8C5xxylfObrv7zkpJ+ch3/xacCL4hNudhTz2L/qcRe7z27f7QQdkL55yjnfPun88/3Hv3z13JNPPPeS03/6qe9/KDhO+rbyPcl7xukh9OHhsa95xT/qwvPab/3O8PN/8/qfnQt+PH/wh8bCTZ/2nNP/5dY/Qk869cRXiZfc89wnHcU/68a7+4rAR8659H2/Qi/913uf+tyvnPvCVz3j6L9tH3fk+AdecNFD7oZM7vvg1x5tq0/+1CVfX7+ePO19/1Uc9ZMvXPTuR1uPf8zdlbfc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' - }); + const data = new SkyBlockMemberInventoriesBagsTalisman({ stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberInventoriesBagsTalisman); expectTypeOf(data).toEqualTypeOf(); - expect(data.base64).toBeDefined(); - expectTypeOf(data.base64).toEqualTypeOf(); - expect(data.decodeData).toBeDefined(); - expectTypeOf(data.decodeData).toEqualTypeOf<() => Promise>(); - expect(data.decodeData()).toBeDefined(); - expectTypeOf(data.decodeData()).toEqualTypeOf>(); }); diff --git a/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalismanDecoded.test.ts b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalismanDecoded.test.ts index d6fb3ee32..7a7d50b8c 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalismanDecoded.test.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Bags/SkyBlockMemberInventoriesBagsTalismanDecoded.test.ts @@ -2,39 +2,11 @@ import SkyBlockMemberInventoriesBagsTalismanDecoded from './SkyBlockMemberInvent import { expect, expectTypeOf, test } from 'vitest'; test('SkyBlockMemberInventoriesBagsTalismanDecoded', () => { - /* eslint-disable camelcase */ - const data = new SkyBlockMemberInventoriesBagsTalismanDecoded([ - { - id: 397, - Count: 1, - tag: { - HideFlags: 254, - display: { - Lore: [ - '§7Costs §31⸎ Soulflow §7per 5s in combat:', - '§3⁍ §7Gain §c+20⫽ Ferocity', - '', - '§7Enabled: §cOff', - '§eRight-click to toggle!', - '', - '§a§l§ka§r §a§lUNCOMMON ACCESSORY §a§l§ka' - ], - Name: '§aHandy Blood Chalice' - }, - ExtraAttributes: { - rarity_upgrades: 1, - id: 'HANDY_BLOOD_CHALICE', - uuid: 'dbb97f4b-9dd8-45fc-aca5-ff87d4ce3b2f', - timestamp: [386, -1213683552] - } - }, - Damage: 3 - } - ]); - /* eslint-enable camelcase */ + const data = new SkyBlockMemberInventoriesBagsTalismanDecoded([]); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberInventoriesBagsTalismanDecoded); expectTypeOf(data).toEqualTypeOf(); expect(data.magicalPower).toBeDefined(); + expect(data.magicalPower).toBeGreaterThanOrEqual(0); expectTypeOf(data.magicalPower).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipment.test.ts b/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipment.test.ts index 03e119ff1..aa88443a2 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipment.test.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipment.test.ts @@ -1,19 +1,9 @@ import SkyBlockMemberInventoriesEquipment from './SkyBlockMemberInventoriesEquipment.js'; -import SkyBlockMemberInventoriesEquipmentDecoded from './SkyBlockMemberInventoriesEquipmentDecoded.js'; import { expect, expectTypeOf, test } from 'vitest'; test('SkyBlockMemberInventoriesEquipment', () => { - const data = new SkyBlockMemberInventoriesEquipment({ - // eslint-disable-next-line @stylistic/max-len - data: 'H4sIAAAAAAAA/82ZWa/b2nXHdYc0tpH0Jm2CoBOqpgmaVJXFUaQCtADFmRIHUZQo8sXgPIiTRFIU+d6XAA3QtzRIiz60cFAU6DcoCn+N9snoh+hT0a1zjq+HO+ACN0ljHFvci4trr7XFs3//tf1kNHo8ei95MhqNPnx/9H7iv/c3742+Qpdt0bz3ZPRB40SPRx8GhRePbn8+GD0WEj/gMieqwfB/n4yebI9tlqldEZwfjd4X/dH3At+DSch3pqGLolM09KHpwofwKY54AQmRBIZC2Hujb8R9lVyDTCurNnOawAezPdHOZRWcmySoH48eNcG1ac9BfUvtvUejx9skKpyb5f1/pfHTiaRRp+eLvWbbh3qxa1Gu8i9RcCnDNZOn7QTfrIN0f/AO5WzRc5d8X240zDyFJjZPvIi+SDoeN+zlwlBMcLoq670smGTG6dtozgnL82Sxh4dYUdzM5i5nWFjjO9YV4K0lUITY5XZrTUy8ttMzXRTlYhI1u/SkXWRvFXooK1lljl0689Rawu6osxWKz6H0aAknPUKJa2gctsg1dihJFHyN1GXLIhpOiqomV1yOa+UVQngpdWLwNYGuGI7XzqpwgXqdmhEKaZXb1NJPurfcr50l02WiLedoahzUZW+J1ZYRt9GqVJVDmhHubkLuNHInT86mpl3qXHePoowPwSqlC5d3jQDxYY4+5IXQRchRi3RBlndZdpq1Ej+5rCE4Y1DrIJc6HlYnJC7pnJvjeDkTzBNRBs7pbNe0tdL3UCRGnLa/+LCmhWxqlgKLmQvFEic26WyNKuOkIRf9K7VYL/tNslbWh0peHkk3cdvrSmyqJI3bAnOyao9rcSixtUQm2kbWPD2ZSTNkRbiuEa/D+CyxMdEP6F5CNGHBWplv+OgitwwsmS27eYw068VwtVtphhrX5IKG8GQpCUJPB8XxagpmANXrc1AkSpANSA8p8PwYboQmiMx1d8BEeRK6lTWc5hWjLBR9Is0hlmIvm/MmxbeXM2m7qY17S3GyFJF9dSwYd8HEB9pv2kDlbKHKcf9iupB93ftFb1fM7i8fjb6yd7I2eO/nQVdGIi1BjglnHqrH7oFKRKaMZMOClIG6KunmqjIUJifdSqSpxBOki51ntb3LjmJCzUVaRJRchGxGz2SDy5Schaw0Ti2DOyrIBreGLLGNZQzi4OpWrOmEisRi2buIXbn8XrXAvPdxpKWXc4PPLy7mAUR8NR+SFW7OQf5Bynb5/uqbWW+bm7scfUGC7e29n8/vMV/Y9/ZBvrt3XxeYK1PW2x32tu3mf5Dqh3lLX9A7NSEvb8RoXTNrbVPpLdOG1jme+fQCsg/xXR7rwU6sYQlq3EDWYKEqL0P2bQ1MKVMGJZcNEZUNP1d5LlFyPZcREbZMEVPS+CinLGobFmYNMmKZXG4bUmwzUWcbm+Rubejl4vYZbqoF2GOejL7qJ3WVOT3Y8dblOXgEjN8Z/e6L58S2Aa9M1MQ/Gr947k0QaPTHwEifk2ZMx07hBQ/274OPxQ/A5w9fOzBO7kQPDtiDAwYcvgkchMDJ7oM6ExQa/Q4wMUEYFHVwb0PubfukcbKk6e+NGMjqayDMpnWKps3H+9FT4MOfwagGDtgEe/l3vxi/egZYiLIYd0Fw9J2+HjuFP5oB24vn6AR5+dN/u7sfjp0xeN4vczBEzaS+vyLqxmnGZXGbjrhFCAq/fgqm/+jFc5cp86S41T4WD6Mf3DJwkuKuShh9it8KJfy70sddHBRjECgEnBg9Afb4ruyntyVwZadwxlpZZuO9KIqj779ZijuB59DLn/9kLBZNkGVJBDAUAIdbCt998Zw0kuAc+ONlWbT1j8ZymTVgIhp8ceMfwDPsh29m5byVEYBKAmq7Jd/FSRaMfg/cC5MobpIiAn7zVdv6Z+dhKhgYXjzPXjw/Ast5fD9aszyrMJRujRWWXq0pmh2/dns0+lBx8mD0B8AkB4Xj3cI+5KcE3jFzvAC8bh+x1+bsUE1zBptgE9QfjD46O+Cd6Z+1VXR2/KC+J9+jvPSTEBQLrh6iAVY6bzz32H/1bYAnHoNxDpb1WQWWFYxBgBvXRx/J6tpglWevEgZublnXz5pb5NHo/Sejr904DxYfzNKAqF893b9i4OZXQIwP2xZE+Z4HEyHkoPAUgQN/ijmoN13gEDwlFkjoIP6cwDH0w9HjJskDsMZ5BUr4a+jf/+cfwQyj37r/bQAy4pcjNSA/JNyFH0zdgPSmKInOpwsPKI9FMPccHJv7Tkh+SanBIhMEvnCT3BW7YejMYkP4pELMtmfcS+rIyExcoSXeguO0Ws46NVNxr+5Wu8HwA1MjbNJGYSNne62GopBe0GmAeRMHOVR7o64la9hmhyuxImG40BZoH0n82lgNs8ly1hzwGhVTwlufUVHplv7C2XJaKA0JLtWD3ZfVvGsPjNNiebKETIbiEMqE18VE43aVmZ/1WbyILtZpc01np5Xe97ZCRlao6z4TbFJ1ZrBtKgpOoci0x5jwpsLjhXDcGgfvRGwvB1OJocWJzJmWr5ZYo0YYzPAKM6GDDb05z2UqFTtrvaHJVSAeu6WHehBPiQO1a2jzbEGxctFzH2Y1z9+cXHZ+KnBIKSW2WsrC6hBjek6viSFmghUc8ydU8YSDHxZzVm3a+YTTAijZSqhjI5tTO/RnAmF25qpxVxUWVDVh7fhWtSdHW9EhX1lWc2KVLAa6WIgKiYV1xBnajDGQC5dckdTfn+LsAFOOn2t7O7SXiTCn7ckS9s8bWXCEcoCPJ225VuitIlXBMjkmvIfN1nSRHpxeqbuTqwurGpovtWVGu8q8g/ten7mWf6qKRYY2SEnMjvp2f5B1DZ7H/Qqzi2FJGVEEVbg/NHhfIZ424ejFTkx8h0m9+TFjSpQXfHdH06QoYeh8syT6i0pC211bOT3XeKyIHWeNJJA1qmq4HlyLuYQ3SsYqVsZlB/Rc8ifG3BlU08OH4nJEPPK11Pjp50gNXE5FXGXEDkgOWO4/U2oMtrm7WiaQGkOW2gxAbsodVdPqVCZLrJRCbOM4KCCe9flSY+sfwLsAwdvfaJmB2LGcbgbZYCGV2aFybmc24wPpwWWWCWQGv+nlNDvavNgDH9hmuFjOlVg2oqvNyL2MbAYbjBVD7JV8B8sGiGd+cZnx9dG3PiEz4Dl2w9wndQb6dP6m1Pjup0kNFHlKPvjgwOfb76gNGMGegvA3dbGtgsB/0CDgoTsWGuc2GL8lRW5zgjxvEWmnD4oiGO/B9V/cDGArrcFeelMbe+DzpyCAWowBsoOqPDc/Gltlex4XYIsd58AWjOOkudMgXdLED3Su7+gMErxdeDB0R+v8hvJ7ZN84jL547r/F4dtItgxBpMfMTuFZVRnTa5VajV87viLxXwHTy5/9bPwxjbex45fdmKprp65BEnRWOscbwl/+/F/e/AHZvPyHn3w5WH8w+vqDz7MsuAQ3Jj+5R/IfbQ1K11nm2VagGNV8Rm234EdUnt3V8QkgP6k+XukbkwGhvfvv4m1CQ/AixDEsnPq4500x3PMBEAGhHRQiMB91Q8In3iH0j398+OcvROgvQmXPWcBzkginoUdAUxRZYFMXdQCVSdh1ESeAUcz/klSOa0ckz2etjIqoq1O1ZrZpJV4MblKv0lmCh5rX7nxbFhnB3x6qpejvHIwVu5gpIg2HkPQMzeUsVNrVgCuxuM1bD2NXxjLXm3UR42AP5Kn+cnZC2S2Srugc78rsasQ6YXofw/kVWu2U4djn7IqfnJYum2qLnhaWBtyTLS+g8EGzbVo5ZE3DcNJRquhoQE5URLhWpsSAaxxs21yds6FM9NGy27KbyeXKo4ns0cGSK3a83wXpwVxTLU7KqzmUIll5lXluxnLaATpxnQ/voUmYRZKB6oOin1yJY3p+J1mOV2wakdIUXDmdhcHQqnLhxxhoscOI4LWip8kZHKWsJ7By4Om91R16N5bmeLXNFhroLDFodTSWhmZft5vQW8uMTlVcwU4ygbQhmd0VPe6ZQrxvV0chPw+0ZpyI5ow6DL7ZViUQDXVwjPedRW0tu7+Q291A0BV15qmBvUZqWE+cqqLn8CWsAVap6GpBS9dOOjWPzbZJTbkqlDnNkLqGzEhYF5ezwM7bvJKp/Ymrsb27bbzVUGULpQxSc4DcnJ4hs8UJNtcQusstGIFwyUE8Fj3oHl8v+5ii8YKwhUAysERP2stRhmGc13fM3mLyNbycXCfH64LI1tDsiITUedipJwoynE49k8HkKmb8Jgs3ycxHuADHlug6hteIWjZu3x5K9QSkV0wbjbEMoDqGIenghb5KCQwOB+5hvj++pvJ/f94BgDxY3R2ZDQqRt59JZcg25M5Od6CJBXQydxBobQdAtKOcs6jC7HoL2Se2IeJW/7lUDkHz31gHHWxHZLKm7vIaHNNvgQ328v3WPnCwA8ho02KkAoHpFfvswe9janr93T3innJUsoMayUjest38Qbzurk4xB88J1HzdL96IgTeOiWcWCprzYtO6+R5ao3oWCLc8dpeb6pBzsZMH+2gzFqLwUqIay1Q1N5DCKKlsHHGVtxNAXkQejhho/iGb14+2KaLq7SCAoa5WyiJWmsUKvwG/RFIsv1qb+/wa+6DHNs9BQMm8kzv4m8MXm9+/UhaDy2eNGL1SHfdk/2KE//JnBp84ICAgEPmbb3Xjd23007f6ceSzuvHxq078G+924p9oxLHPasSBXJhTbnJ/PkGXRV1mQOSC7Xw8Iu/OGQix8M6BUwf12AFTBtcqK+ukLB7IPr5Rvxm7t5MKB8G//xB2+vlN95JdG5/ScP/+mw23mL+aaRlkza+u3370Tr/91Yd++7dFWVurW1FVnt3S/RjPPkbi8wUZTBchhk4xGCOmN8MUQhzcI2EP9/3Fu3j+2/+kxr8sPLsY7BJu4E0dfB5OUdwLp44L41McRXEIx+eICwVfEs8mLmSZq28wDh3UMzwIa1K7egciRaG29Y6ryvZLuBMyjkmWE7zDdTIb2FW1PSp6Wacls420vGvrhgyu4VlitppyPQZbA56fFvOrD+tBSdIkutxfbLTN/M0R5c7c4uB47L7a7FfNxJDoaIZzfBDm7oYLu5TetpfSkRG5wHSdTtKVnZIbclLv4zPjdLIe52ptreui0Rxfu9K6CjuGmuxN/To5XTPM4cykjGotgS4B30w2lRv0hg8VV2uRMVpo4mbZ2mpUHi+cOmfPR0IXTzqTFuAbhFy557yqd3bDCY88EcpzmdlNDojNiqt8JkqTzZrbGoaF0raVJBMF9rbBbmKmLE2vBVqTtof1IlwtxFAroWQOn+VlUePmLj7I2QJlpUkNI7BixMSlJ2ANl/ha4cVqdl2ipyA7hbTW0kvB0isoLH2+xzcCt1QSlT2kdI9fhnyI97vtxXFXFEEa51rwIlVMCng2lwo913i8sylXJ01j17oJuaAXR00jdo6YIE2mmc1AxNdLOezYxjyeij1azc9kqbiK1U+sHmktM9qfNHOfN+EWi7hFfBDOp95A4G21R31y685PModPKhYoo5S1T0oopRds8BOS7GdSSkGm4CYinqcJ5qAne/AgeJBB0z5jTlesjOFSsPxEDIOqC+16aXXQpQvbwo2Xqc71ZWkQzm7CU3soUaUTMekW66Tit/TQGxc3dDmJXvWb7gviGaC1k5kNaOxESKY/C89SKjNKZhu7q5KCBtrYAVzHscp4sMLLsJLvYzuXQDNNYfbnN821BbSjZeKwbXa/0XiWB/+oDPtE5ZVcGSxYQcQONMmoNcS5bEipysuoPESDgnCxZQD8MhsMyBMgXwDQ802nGFIGGm4Y3EOtXO5Uw0OV5NeP5299yjk/jP8KzvmRTznnh///Mf6ddzAOwAMyaYLRnwGHVQK8AVGdYhwUQd6PPae943nxGue3Y/K7Dv7+CN156OHLcNzEQXIeN2XjZLdCXv79P43vF2T052AIfJz6lRZoynuNACYBjBm/PiBARj8E/7pZ6R3rW8Zj9sEF3Abxx27m1M0YMDxp61tYogMpg1h1OXaDm1DwXpfk3/K6VQAyHf0huAYB8tvUd7X4wfimTQLntqCj2znF5+kQfq3u2e2nKJE/eVOJ8A4gdBY0Y7Aad2sb3Rbs1y5Ivs1TO8VYs8YzlXtGq4pB8UCcvNYlOEmiEOZP3dt/3mOhS05dFyKALiExF4WQADTu7+qS/3r6i/94W5eM/g//d+/OUSAAAA==' - }); + const data = new SkyBlockMemberInventoriesEquipment({ stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberInventoriesEquipment); expectTypeOf(data).toEqualTypeOf(); - expect(data.base64).toBeDefined(); - expectTypeOf(data.base64).toEqualTypeOf(); - expect(data.decodeData).toBeDefined(); - expectTypeOf(data.decodeData).toEqualTypeOf<() => Promise>(); - expect(data.decodeData()).toBeDefined(); - expectTypeOf(data.decodeData()).toEqualTypeOf>(); }); diff --git a/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipmentDecoded.test.ts b/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipmentDecoded.test.ts index 6c0644d06..f8b6927aa 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipmentDecoded.test.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Equipment/SkyBlockMemberInventoriesEquipmentDecoded.test.ts @@ -3,168 +3,7 @@ import SkyBlockMemberInventoriesEquipmentDecoded from './SkyBlockMemberInventori import { expect, expectTypeOf, test } from 'vitest'; test('SkyBlockMemberInventoriesEquipmentDecoded', () => { - /* eslint-disable camelcase */ - const data = new SkyBlockMemberInventoriesEquipmentDecoded([ - { - id: 397, - Count: 1, - tag: { - ench: [], - HideFlags: 254, - display: { - Lore: [ - '§7Strength: §c+20', - '§7Crit Chance: §c+2% §9(+2%)', - '§7Crit Damage: §c+4% §9(+4%)', - '§7Health: §a+30', - '§7Defense: §a+20', - '§7Vitality: §a+4', - '', - '§9Quantum V', - '§7Grants §4+4♨ Vitality §7on weekdays and', - '§7§3+2☯ §7of a random §3Wisdom §7stat on', - '§7weekends.', - '', - '§bDominance IX', - '§7Gain §c+13.5% §7damage when at full', - '§7health.', - '§bMana Pool VIII', - '§7Grants §b+160✎ Intelligence§7.', - '', - '§8Tiered Bonus: Molten Core (1/4)', - '§7Gain §a5% §7damage resistance while', - '§7fighting §6Kuudra§7.', - '', - '§6§l§ka§r §6§lLEGENDARY NECKLACE §6§l§ka' - ], - Name: '§6Menacing Molten Necklace' - }, - ExtraAttributes: { - rarity_upgrades: 1, - modifier: 'menacing', - attributes: { dominance: 9, mana_pool: 8 }, - id: 'MOLTEN_NECKLACE', - boss_tier: 2, - enchantments: { quantum: 5 }, - uuid: 'c17f0a31-21ed-4a3c-9501-792fa2d67543', - timestamp: [389, 817821856] - } - }, - Damage: 3 - }, - { - id: 397, - Count: 1, - tag: { - ench: [], - HideFlags: 254, - display: { - Lore: [ - '§7Strength: §c+164', - '§7Crit Chance: §c+3.62% §9(+2%)', - '§7Crit Damage: §c+32.8% §9(+5%)', - '§7Health: §a+124.64', - '§7Speed: §a+32.8', - '§7True Defense: §a+3.62', - '', - '§9Cayenne V§9, §9Prosperity V', - '', - '§7On teleport: Your next melee hit', - '§7within §a5s §7deals §c10% §7more damage.', - '', - '§d§l§ka§r §d§lMYTHIC DUNGEON CLOAK §d§l§ka' - ], - Name: '§d⚚ Menacing Shadow Assassin Cloak §6✪✪✪✪✪§c➎' - }, - ExtraAttributes: { - rarity_upgrades: 1, - modifier: 'menacing', - upgrade_level: 10, - id: 'STARRED_SHADOW_ASSASSIN_CLOAK', - enchantments: { prosperity: 5, cayenne: 5 }, - uuid: '019f544f-d5cc-45cd-9e01-a3074d3bf7d7', - timestamp: [394, -1973901920] - } - }, - Damage: 3 - }, - { - id: 397, - Count: 1, - tag: { - HideFlags: 254, - display: { - Lore: [ - '§7Crit Chance: §c+2% §9(+2%)', - '§7Crit Damage: §c+4% §9(+4%)', - '§7Defense: §a+70', - '', - '§bDominance VIII', - '§7Gain §c+12% §7damage when at full health.', - '§bMana Pool VII', - '§7Grants §b+140✎ Intelligence§7.', - '', - '§6Ability: Consolidated ', - '§7§7Increases all explosion damage dealt by §a25%§7.', - '', - '§6§l§ka§r §6§lLEGENDARY BELT §6§l§ka' - ], - Name: '§6Menacing Implosion Belt' - }, - ExtraAttributes: { - rarity_upgrades: 1, - modifier: 'menacing', - attributes: { dominance: 8, mana_pool: 7 }, - id: 'IMPLOSION_BELT', - uuid: 'd485698e-9f43-4147-8569-02a5c81c5dd9', - timestamp: [394, -1847901920] - } - }, - Damage: 3 - }, - { - id: 397, - Count: 1, - tag: { - HideFlags: 254, - display: { - Lore: [ - '§7Strength: §c+15', - '§7Crit Chance: §c+2% §9(+2%)', - '§7Crit Damage: §c+4% §9(+4%)', - '§7Health: §a+20', - '§7Defense: §a+10', - '', - '§bDominance VIII', - '§7Gain §c+12% §7damage when at full health.', - '§bMana Pool VII', - '§7Grants §b+140✎ Intelligence§7.', - '', - '§6Ability: Contaminate', - '§7Killing an enemy causes an explosion', - '§7dealing §a10% §7of their total §c❤ Health', - '§c§7as damage to all enemies within §a2', - '§ablocks§7. Enemies in the blast radius', - '§7will also be §6contaminated §7causing', - '§7them to explode on death.', - '', - '§6§l§ka§r §6§lLEGENDARY GLOVES §6§l§ka' - ], - Name: '§6Menacing Gauntlet of Contagion' - }, - ExtraAttributes: { - rarity_upgrades: 1, - modifier: 'menacing', - attributes: { dominance: 8, mana_pool: 7 }, - id: 'GAUNTLET_OF_CONTAGION', - uuid: 'd588304d-b0da-4fb8-bb07-0284b302ee13', - timestamp: [394, -600921920] - } - }, - Damage: 3 - } - ]); - /* eslint-enable camelcase */ + const data = new SkyBlockMemberInventoriesEquipmentDecoded([]); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberInventoriesEquipmentDecoded); expectTypeOf(data).toEqualTypeOf(); diff --git a/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventory.test.ts b/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventory.test.ts index 611805425..5866023b4 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventory.test.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventory.test.ts @@ -1,19 +1,9 @@ import SkyBlockMemberInventoriesInventory from './SkyBlockMemberInventoriesInventory.js'; -import SkyBlockMemberInventoriesInventoryDecoded from './SkyBlockMemberInventoriesInventoryDecoded.js'; import { expect, expectTypeOf, test } from 'vitest'; test('SkyBlockMemberInventoriesInventory', () => { - const data = new SkyBlockMemberInventoriesInventory({ - // eslint-disable-next-line @stylistic/max-len - data: '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' - }); + const data = new SkyBlockMemberInventoriesInventory({ stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberInventoriesInventory); expectTypeOf(data).toEqualTypeOf(); - expect(data.base64).toBeDefined(); - expectTypeOf(data.base64).toEqualTypeOf(); - expect(data.decodeData).toBeDefined(); - expectTypeOf(data.decodeData).toEqualTypeOf<() => Promise>(); - expect(data.decodeData()).toBeDefined(); - expectTypeOf(data.decodeData()).toEqualTypeOf>(); }); diff --git a/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventoryDecoded.test.ts b/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventoryDecoded.test.ts index baf919d94..7ddccd1df 100644 --- a/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventoryDecoded.test.ts +++ b/src/Structures/SkyBlock/Member/Inventories/Inventory/SkyBlockMemberInventoriesInventoryDecoded.test.ts @@ -3,79 +3,7 @@ import SkyBlockMemberInventoriesInventoryDecoded from './SkyBlockMemberInventori import { expect, expectTypeOf, test } from 'vitest'; test('SkyBlockMemberInventoriesInventoryDecoded', () => { - /* eslint-disable camelcase */ - const data = new SkyBlockMemberInventoriesInventoryDecoded([ - { - id: 272, - Count: 1, - tag: { - ench: [], - Unbreakable: 1, - HideFlags: 254, - display: { - Lore: [ - '§7Gear Score: §d5000', - '§7Damage: §c+3,496.48 §e(+30)', - '§7Strength: §c+2,328.8 §e(+30) §6[+5] §9(+220)', - '§7Crit Damage: §c+1,010.24% §d(+24%)', - '§7Magic Find: §a+10.86', - '§7Swing Range: §a+2.12', - ' §6[§8⚔§6] §6[§8⚔§6]', - '', - '§d§l§d§lChimera V§9, §9Champion X§9, §9Cleave VI', - '§9Critical VII§9, §9Cubism V§9, §9Divine Gift III', - '§9Dragon Hunter V§9, §9Ender Slayer VII§9, §9Execute VI', - '§9Experience IV§9, §9Fire Aspect III§9, §9Giant Killer VII', - '§9Impaling III§9, §9Lethality VI§9, §9Looting IV', - '§9Luck VII§9, §9Scavenger V§9, §9Sharpness VII', - '§9Smoldering III§9, §9Syphon V§9, §9Tabasco III', - '§9Thunderlord VII§9, §9Triple-Strike V§9, §9Vampirism VI', - '§9Venomous VI', - '', - '§c◆ Blood Rune III', - '', - '§7§7§oThat thing was too big to be called a', - '§7§osword, it was more like a large hunk', - '§7§oof stone.', - '', - '§fKills: §6403,954', - '', - '§9Withered Bonus', - '§7Grants §a+1 §c❁ Strength §7per', - '§7§cCatacombs §7level.', - '', - '§8§l* §8Co-op Soulbound §8§l*', - '§d§l§ka§r §d§lMYTHIC DUNGEON LONGSWORD §d§l§ka' - ], - Name: '§dWithered Dark Claymore §6✪✪✪✪✪§c➎' - }, - ExtraAttributes: { - rarity_upgrades: 1, - stats_book: 403954, - runes: { BLOOD_2: 3 }, - modifier: 'withered', - art_of_war_count: 1, - upgrade_level: 10, - enchantments: { impaling: 3, champion: 10 }, - uuid: '89dd6816-0a32-4dcf-808b-ba558c793c91', - hot_potato_count: 15, - gems: { - COMBAT_0: 'PERFECT', - unlocked_slots: ['COMBAT_0', 'COMBAT_1'], - COMBAT_1_gem: 'ONYX', - COMBAT_0_gem: 'ONYX', - COMBAT_1: 'PERFECT' - }, - champion_combat_xp: 263299217.60781735, - id: 'DARK_CLAYMORE', - donated_museum: 1, - timestamp: [389, -126385440] - } - }, - Damage: 0 - } - ]); - /* eslint-enable camelcase */ + const data = new SkyBlockMemberInventoriesInventoryDecoded([]); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberInventoriesInventoryDecoded); expectTypeOf(data).toEqualTypeOf(); diff --git a/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.test.ts b/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.test.ts index cc990293b..ac7bc9418 100644 --- a/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.test.ts +++ b/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventories.test.ts @@ -12,30 +12,35 @@ test('SkyBlockMemberInventories', () => { expect(data).toBeInstanceOf(SkyBlockMemberInventories); expectTypeOf(data).toEqualTypeOf(); expect(data.inventory).toBeDefined(); + expect(data.inventory).toBeInstanceOf(SkyBlockMemberInventoriesInventory); expectTypeOf(data.inventory).toEqualTypeOf(); expect(data.armor).toBeDefined(); + expect(data.armor).toBeInstanceOf(SkyBlockMemberInventoriesArmor); expectTypeOf(data.armor).toEqualTypeOf(); expect(data.equipment).toBeDefined(); + expect(data.equipment).toBeInstanceOf(SkyBlockMemberInventoriesEquipment); expectTypeOf(data.equipment).toEqualTypeOf(); expect(data.backpacks).toBeDefined(); + expect(data.backpacks).toBeInstanceOf(SkyBlockMemberInventoriesBackpacks); expectTypeOf(data.backpacks).toEqualTypeOf(); expect(data.enderChest).toBeDefined(); + expect(data.enderChest).toBeInstanceOf(SkyBlockMemberInventoriesInventory); expectTypeOf(data.enderChest).toEqualTypeOf(); expect(data.bags).toBeDefined(); + expect(data.bags).toBeInstanceOf(SkyBlockMemberInventoriesBags); expectTypeOf(data.bags).toEqualTypeOf(); expect(data.personalVault).toBeDefined(); + expect(data.personalVault).toBeInstanceOf(SkyBlockMemberInventoriesInventory); expectTypeOf(data.personalVault).toEqualTypeOf(); expect(data.wardrobe).toBeDefined(); + expect(data.wardrobe).toBeInstanceOf(SkyBlockMemberInventoriesInventory); expectTypeOf(data.wardrobe).toEqualTypeOf(); expect(data.sacksCounts).toBeDefined(); expectTypeOf(data.sacksCounts).toEqualTypeOf>(); - Object.keys(data.sacksCounts).forEach((item) => { - expect(data.sacksCounts[item]).toBeDefined(); - expect(data.sacksCounts[item]).toBeGreaterThanOrEqual(0); - expectTypeOf(data.sacksCounts[item]).toEqualTypeOf(); - }); expect(data.candy).toBeDefined(); + expect(data.candy).toBeInstanceOf(SkyBlockMemberInventoriesInventory); expectTypeOf(data.candy).toEqualTypeOf(); expect(data.carnivalMask).toBeDefined(); + expect(data.carnivalMask).toBeInstanceOf(SkyBlockMemberInventoriesInventory); expectTypeOf(data.carnivalMask).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventoriesBaseInventory.test.ts b/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventoriesBaseInventory.test.ts index 4a823b6ec..f7763e9c9 100644 --- a/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventoriesBaseInventory.test.ts +++ b/src/Structures/SkyBlock/Member/Inventories/SkyBlockMemberInventoriesBaseInventory.test.ts @@ -8,6 +8,4 @@ test('SkyBlockMemberInventoriesBaseInventory', () => { expectTypeOf(data).toEqualTypeOf(); expect(data.base64).toBeDefined(); expectTypeOf(data.base64).toEqualTypeOf(); - expect(data.decodeData).toBeDefined(); - expectTypeOf(data.decodeData).toEqualTypeOf<() => Promise | any>(); }); diff --git a/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContests.test.ts b/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContests.test.ts index efbb58c39..f96203abc 100644 --- a/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContests.test.ts +++ b/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContests.test.ts @@ -12,10 +12,13 @@ test('SkyBlockMemberJacobContests', () => { expect(data).toBeInstanceOf(SkyBlockMemberJacobContests); expectTypeOf(data).toEqualTypeOf(); expect(data.perks).toBeDefined(); + expect(data.perks).toBeInstanceOf(SkyBlockMemberJacobContestsPerks); expectTypeOf(data.perks).toEqualTypeOf(); expect(data.medals).toBeDefined(); + expect(data.medals).toBeInstanceOf(SkyBlockMemberJacobContestsMedals); expectTypeOf(data.medals).toEqualTypeOf(); expect(data.uniqueBrackets).toBeDefined(); + expect(data.uniqueBrackets).toBeInstanceOf(SkyBlockMemberJacobContestsUniqueBrackets); expectTypeOf(data.uniqueBrackets).toEqualTypeOf(); expect(data.personalBests).toBeDefined(); expectTypeOf(data.personalBests).toEqualTypeOf>(); diff --git a/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsMedals.test.ts b/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsMedals.test.ts index ee10c0ff0..5022dca26 100644 --- a/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsMedals.test.ts +++ b/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsMedals.test.ts @@ -7,9 +7,12 @@ test('SkyBlockMemberJacobContestsMedals', () => { expect(data).toBeInstanceOf(SkyBlockMemberJacobContestsMedals); expectTypeOf(data).toEqualTypeOf(); expect(data.bronze).toBeDefined(); + expect(data.bronze).toBeGreaterThanOrEqual(0); expectTypeOf(data.bronze).toEqualTypeOf(); expect(data.silver).toBeDefined(); + expect(data.silver).toBeGreaterThanOrEqual(0); expectTypeOf(data.silver).toEqualTypeOf(); expect(data.gold).toBeDefined(); + expect(data.gold).toBeGreaterThanOrEqual(0); expectTypeOf(data.gold).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsPerks.test.ts b/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsPerks.test.ts index 2e3ae0363..dd9872497 100644 --- a/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsPerks.test.ts +++ b/src/Structures/SkyBlock/Member/JacobContests/SkyBlockMemberJacobContestsPerks.test.ts @@ -7,8 +7,10 @@ test('SkyBlockMemberJacobContestsPerks', () => { expect(data).toBeInstanceOf(SkyBlockMemberJacobContestsPerks); expectTypeOf(data).toEqualTypeOf(); expect(data.doubleDrops).toBeDefined(); + expect(data.doubleDrops).toBeGreaterThanOrEqual(0); expectTypeOf(data.doubleDrops).toEqualTypeOf(); expect(data.farmingLevelCap).toBeDefined(); + expect(data.farmingLevelCap).toBeGreaterThanOrEqual(0); expectTypeOf(data.farmingLevelCap).toEqualTypeOf(); expect(data.personalBests).toBeDefined(); expectTypeOf(data.personalBests).toEqualTypeOf(); diff --git a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMining.test.ts b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMining.test.ts index c4a029f25..2baa4ac93 100644 --- a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMining.test.ts +++ b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMining.test.ts @@ -1,22 +1,22 @@ import SkyBlockMemberMining from './SkyBlockMemberMining.js'; +import SkyBlockMemberMiningCrystal from './SkyBlockMemberMiningCrystal.js'; +import SkyBlockMemberMiningHotm from './SkyBlockMemberMiningHotm.js'; +import SkyBlockMemberMiningPowders from './SkyBlockMemberMiningPowders.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockMemberMiningCrystal from './SkyBlockMemberMiningCrystal.js'; -import type SkyBlockMemberMiningHotm from './SkyBlockMemberMiningHotm.js'; -import type SkyBlockMemberMiningPowders from './SkyBlockMemberMiningPowders.js'; import type { MiningCrystal, MiningPickaxeAbility, MiningSkyMallEffect } from '../../../../Types/SkyBlock.js'; test('SkyBlockMemberMining', () => { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - const data = new SkyBlockMemberMining(); + const data = new SkyBlockMemberMining({ stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberMining); expectTypeOf(data).toEqualTypeOf(); expect(data.powder).toBeDefined(); + expect(data.powder).toBeInstanceOf(SkyBlockMemberMiningPowders); expectTypeOf(data.powder).toEqualTypeOf(); expect(data.crystals).toBeDefined(); expectTypeOf(data.crystals).toEqualTypeOf>(); expect(data.hotm).toBeDefined(); + expect(data.hotm).toBeInstanceOf(SkyBlockMemberMiningHotm); expectTypeOf(data.hotm).toEqualTypeOf(); expect(data.pickaxeAbility).toBeDefined(); expectTypeOf(data.pickaxeAbility).toEqualTypeOf(); diff --git a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningCrystal.test.ts b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningCrystal.test.ts index 4338c5090..892f93338 100644 --- a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningCrystal.test.ts +++ b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningCrystal.test.ts @@ -9,12 +9,14 @@ test('SkyBlockMemberMiningCrystal', () => { expect(data.found).toBeDefined(); expectTypeOf(data.found).toEqualTypeOf(); expect(data.totalFound).toBeDefined(); + expect(data.totalFound).toBeGreaterThanOrEqual(0); expectTypeOf(data.totalFound).toEqualTypeOf(); expect(data.totalPlaced).toBeDefined(); + expect(data.totalPlaced).toBeGreaterThanOrEqual(0); expectTypeOf(data.totalPlaced).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => boolean>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.found); + expect(data.toString()).toBe(data.found); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotm.test.ts b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotm.test.ts index 5a82591d3..5d0fadc8c 100644 --- a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotm.test.ts +++ b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotm.test.ts @@ -1,6 +1,6 @@ import SkyBlockMemberMiningHotm from './SkyBlockMemberMiningHotm.js'; +import SkyBlockMemberMiningHotmForge from './SkyBlockMemberMiningHotmForge.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockMemberMiningHotmForge from './SkyBlockMemberMiningHotmForge.js'; import type { SkillLevelData } from '../../../../Types/SkyBlock.js'; test('SkyBlockMemberMiningHotm', () => { @@ -13,12 +13,14 @@ test('SkyBlockMemberMiningHotm', () => { expect(data.nodes).toBeDefined(); expectTypeOf(data.nodes).toEqualTypeOf>(); expect(data.tokensSpent).toBeDefined(); + expect(data.tokensSpent).toBeGreaterThanOrEqual(0); expectTypeOf(data.tokensSpent).toEqualTypeOf(); expect(data.forge).toBeDefined(); + expect(data.forge).toBeInstanceOf(SkyBlockMemberMiningHotmForge); expectTypeOf(data.forge).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => number>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.level.level); + expect(data.toString()).toBe(data.level.level); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForge.test.ts b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForge.test.ts index 5778a9db8..ed9b5ab0c 100644 --- a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForge.test.ts +++ b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForge.test.ts @@ -1,11 +1,9 @@ import SkyBlockMemberMiningHotmForge from './SkyBlockMemberMiningHotmForge.js'; +import SkyBlockMemberMiningHotmForgeItem from './SkyBlockMemberMiningHotmForgeItem.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockMemberMiningHotmForgeItem from './SkyBlockMemberMiningHotmForgeItem.js'; test('SkyBlockMemberMiningHotmForge', () => { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - const data = new SkyBlockMemberMiningHotmForge(); + const data = new SkyBlockMemberMiningHotmForge({ stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberMiningHotmForge); expectTypeOf(data).toEqualTypeOf(); diff --git a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForgeItem.test.ts b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForgeItem.test.ts index c390c4ca6..b639a10c6 100644 --- a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForgeItem.test.ts +++ b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningHotmForgeItem.test.ts @@ -14,14 +14,19 @@ test('SkyBlockMemberMiningHotmForgeItem', () => { expect(data.name).toBeDefined(); expectTypeOf(data.name).toEqualTypeOf(); expect(data.startTime).toBeDefined(); + expect(data.startTime).toBeGreaterThanOrEqual(0); expectTypeOf(data.startTime).toEqualTypeOf(); expect(data.startTimeAt).toBeDefined(); + expect(data.startTimeAt).toBeInstanceOf(Date); expectTypeOf(data.startTimeAt).toEqualTypeOf(); expect(data.endTime).toBeDefined(); + expect(data.endTime).toBeGreaterThanOrEqual(0); expectTypeOf(data.endTime).toEqualTypeOf(); expect(data.endTimeAt).toBeDefined(); + expect(data.endTimeAt).toBeInstanceOf(Date); expectTypeOf(data.endTimeAt).toEqualTypeOf(); expect(data.slot).toBeDefined(); + expect(data.slot).toBeGreaterThanOrEqual(0); expectTypeOf(data.slot).toEqualTypeOf(); expect(data.notified).toBeDefined(); expectTypeOf(data.notified).toEqualTypeOf(); @@ -30,6 +35,6 @@ test('SkyBlockMemberMiningHotmForgeItem', () => { expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => MiningForgeItemName | 'UNKNOWN'>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.name); + expect(data.toString()).toBe(data.name); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningPowder.test.ts b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningPowder.test.ts index 1a433085f..268fa81a5 100644 --- a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningPowder.test.ts +++ b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningPowder.test.ts @@ -2,19 +2,22 @@ import SkyBlockMemberMiningPowder from './SkyBlockMemberMiningPowder.js'; import { expect, expectTypeOf, test } from 'vitest'; test('SkyBlockMemberMiningPowder', () => { - const data = new SkyBlockMemberMiningPowder({ stats: 'meow' }, 'mithril'); + const data = new SkyBlockMemberMiningPowder({ stats: 'meow' }, 'gemstone'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberMiningPowder); expectTypeOf(data).toEqualTypeOf(); expect(data.spent).toBeDefined(); + expect(data.spent).toBeGreaterThanOrEqual(0); expectTypeOf(data.spent).toEqualTypeOf(); expect(data.powder).toBeDefined(); + expect(data.powder).toBeGreaterThanOrEqual(0); expectTypeOf(data.powder).toEqualTypeOf(); expect(data.total).toBeDefined(); + expect(data.total).toBeGreaterThanOrEqual(0); expectTypeOf(data.total).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => number>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.total); + expect(data.toString()).toBe(data.total); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningPowders.test.ts b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningPowders.test.ts index e693ff85e..68b3ef6fd 100644 --- a/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningPowders.test.ts +++ b/src/Structures/SkyBlock/Member/Mining/SkyBlockMemberMiningPowders.test.ts @@ -1,18 +1,19 @@ +import SkyBlockMemberMiningPowder from './SkyBlockMemberMiningPowder.js'; import SkyBlockMemberMiningPowders from './SkyBlockMemberMiningPowders.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockMemberMiningPowder from './SkyBlockMemberMiningPowder.js'; test('SkyBlockMemberMiningPowders', () => { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - const data = new SkyBlockMemberMiningPowders(); + const data = new SkyBlockMemberMiningPowders({ stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberMiningPowders); expectTypeOf(data).toEqualTypeOf(); expect(data.mithril).toBeDefined(); + expect(data.mithril).toBeInstanceOf(SkyBlockMemberMiningPowder); expectTypeOf(data.mithril).toEqualTypeOf(); expect(data.gemstone).toBeDefined(); + expect(data.gemstone).toBeInstanceOf(SkyBlockMemberMiningPowder); expectTypeOf(data.gemstone).toEqualTypeOf(); expect(data.glacite).toBeDefined(); + expect(data.glacite).toBeInstanceOf(SkyBlockMemberMiningPowder); expectTypeOf(data.glacite).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPet.test.ts b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPet.test.ts index cf4eb7c3a..c7340fa2b 100644 --- a/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPet.test.ts +++ b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPet.test.ts @@ -21,6 +21,7 @@ test('SkyBlockMemberPet', () => { expect(data.heldItem).toBeDefined(); expectTypeOf(data.heldItem).toEqualTypeOf(); expect(data.candyUsed).toBeDefined(); + expect(data.candyUsed).toBeGreaterThanOrEqual(0); expectTypeOf(data.candyUsed).toEqualTypeOf(); expect(data.skin).toBeDefined(); expectTypeOf(data.skin).toEqualTypeOf(); @@ -29,6 +30,6 @@ test('SkyBlockMemberPet', () => { expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => SkyBlockPetId | 'UNKNOWN'>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.type); + expect(data.toString()).toBe(data.type); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPets.test.ts b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPets.test.ts index 2be296126..9a60f2365 100644 --- a/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPets.test.ts +++ b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPets.test.ts @@ -1,8 +1,8 @@ +import SkyBlockMemberPet from './SkyBlockMemberPet.js'; import SkyBlockMemberPets from './SkyBlockMemberPets.js'; +import SkyBlockMemberPetsAutoPets from './SkyBlockMemberPetsAutoPets.js'; +import SkyBlockMemberPetsCare from './SkyBlockMemberPetsCare.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockMemberPet from './SkyBlockMemberPet.js'; -import type SkyBlockMemberPetsAutoPets from './SkyBlockMemberPetsAutoPets.js'; -import type SkyBlockMemberPetsCare from './SkyBlockMemberPetsCare.js'; test('SkyBlockMemberPets', () => { const data = new SkyBlockMemberPets({ stats: 'meow' }); @@ -10,15 +10,20 @@ test('SkyBlockMemberPets', () => { expect(data).toBeInstanceOf(SkyBlockMemberPets); expectTypeOf(data).toEqualTypeOf(); expect(data.petCare).toBeDefined(); + expect(data.petCare).toBeInstanceOf(SkyBlockMemberPetsCare); expectTypeOf(data.petCare).toEqualTypeOf(); expect(data.autoPetRules).toBeDefined(); + expect(data.autoPetRules).toBeInstanceOf(SkyBlockMemberPetsAutoPets); expectTypeOf(data.autoPetRules).toEqualTypeOf(); expect(data.pets).toBeDefined(); expectTypeOf(data.pets).toEqualTypeOf(); expect(data.oresMined).toBeDefined(); + expect(data.oresMined).toBeGreaterThanOrEqual(0); expectTypeOf(data.oresMined).toEqualTypeOf(); expect(data.seaCreaturesKilled).toBeDefined(); + expect(data.seaCreaturesKilled).toBeGreaterThanOrEqual(0); expectTypeOf(data.seaCreaturesKilled).toEqualTypeOf(); expect(data.totalExpGained).toBeDefined(); + expect(data.totalExpGained).toBeGreaterThanOrEqual(0); expectTypeOf(data.totalExpGained).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsAutoPetRule.test.ts b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsAutoPetRule.test.ts index 8e4fdd2d3..cb05dd77c 100644 --- a/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsAutoPetRule.test.ts +++ b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsAutoPetRule.test.ts @@ -24,6 +24,6 @@ test('SkyBlockMemberPetsAutoPetRule', () => { expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => string>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.id); + expect(data.toString()).toBe(data.name); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsAutoPets.test.ts b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsAutoPets.test.ts index 889e7c1cb..5cd1e9f2c 100644 --- a/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsAutoPets.test.ts +++ b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsAutoPets.test.ts @@ -1,6 +1,6 @@ +import SkyBlockMemberPetsAutoPetRule from './SkyBlockMemberPetsAutoPetRule.js'; import SkyBlockMemberPetsAutoPets from './SkyBlockMemberPetsAutoPets.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockMemberPetsAutoPetRule from './SkyBlockMemberPetsAutoPetRule.js'; test('SkyBlockMemberPetsAutoPets', () => { const data = new SkyBlockMemberPetsAutoPets({ stats: 'meow' }); @@ -8,6 +8,7 @@ test('SkyBlockMemberPetsAutoPets', () => { expect(data).toBeInstanceOf(SkyBlockMemberPetsAutoPets); expectTypeOf(data).toEqualTypeOf(); expect(data.rulesLimit).toBeDefined(); + expect(data.rulesLimit).toBeGreaterThanOrEqual(0); expectTypeOf(data.rulesLimit).toEqualTypeOf(); expect(data.rules).toBeDefined(); expectTypeOf(data.rules).toEqualTypeOf(); diff --git a/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsCare.test.ts b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsCare.test.ts index 6c14ea7ad..8b629b89a 100644 --- a/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsCare.test.ts +++ b/src/Structures/SkyBlock/Member/Pets/SkyBlockMemberPetsCare.test.ts @@ -8,12 +8,13 @@ test('SkyBlockMemberPetsCare', () => { expect(data).toBeInstanceOf(SkyBlockMemberPetsCare); expectTypeOf(data).toEqualTypeOf(); expect(data.coinsSpent).toBeDefined(); + expect(data.coinsSpent).toBeGreaterThanOrEqual(0); expectTypeOf(data.coinsSpent).toEqualTypeOf(); expect(data.petsSacrificed).toBeDefined(); expectTypeOf(data.petsSacrificed).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => number>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.coinsSpent); + expect(data.toString()).toBe(data.coinsSpent); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerData.test.ts b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerData.test.ts index 85ac999aa..eeae701f0 100644 --- a/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerData.test.ts +++ b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerData.test.ts @@ -1,8 +1,8 @@ import SkyBlockMemberPlayerData from './SkyBlockMemberPlayerData.js'; +import SkyBlockMemberPlayerDataActiveEffect from './SkyBlockMemberPlayerDataActiveEffect.js'; +import SkyBlockMemberPlayerDataMinions from './SkyBlockMemberPlayerDataMinions.js'; +import SkyBlockMemberPlayerDataSkills from './SkyBlockMemberPlayerDataSkills.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockMemberPlayerDataActiveEffect from './SkyBlockMemberPlayerDataActiveEffect.js'; -import type SkyBlockMemberPlayerDataMinions from './SkyBlockMemberPlayerDataMinions.js'; -import type SkyBlockMemberPlayerDataSkills from './SkyBlockMemberPlayerDataSkills.js'; import type { SkyBlockArea, SkyBlockPotionEffectName } from '../../../../Types/SkyBlock.js'; test('SkyBlockMemberPlayerData', () => { @@ -17,10 +17,13 @@ test('SkyBlockMemberPlayerData', () => { expect(data.disabledPotionEffects).toBeDefined(); expectTypeOf(data.disabledPotionEffects).toEqualTypeOf(); expect(data.reaperPeppersEaten).toBeDefined(); + expect(data.reaperPeppersEaten).toBeGreaterThanOrEqual(0); expectTypeOf(data.reaperPeppersEaten).toEqualTypeOf(); expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); expectTypeOf(data.deaths).toEqualTypeOf(); expect(data.lastDeath).toBeDefined(); + expect(data.lastDeath).toBeGreaterThanOrEqual(0); expectTypeOf(data.lastDeath).toEqualTypeOf(); expect(data.visitedZones).toBeDefined(); expectTypeOf(data.visitedZones).toEqualTypeOf(); @@ -33,11 +36,15 @@ test('SkyBlockMemberPlayerData', () => { expect(data.perks).toBeDefined(); expectTypeOf(data.perks).toEqualTypeOf>(); expect(data.minions).toBeDefined(); + expect(data.minions).toBeInstanceOf(SkyBlockMemberPlayerDataMinions); expectTypeOf(data.minions).toEqualTypeOf(); expect(data.fastestTargetPractice).toBeDefined(); + expect(data.fastestTargetPractice).toBeGreaterThanOrEqual(0); expectTypeOf(data.fastestTargetPractice).toEqualTypeOf(); expect(data.fishingTreasureCaught).toBeDefined(); + expect(data.fishingTreasureCaught).toBeGreaterThanOrEqual(0); expectTypeOf(data.fishingTreasureCaught).toEqualTypeOf(); expect(data.skills).toBeDefined(); + expect(data.skills).toBeInstanceOf(SkyBlockMemberPlayerDataSkills); expectTypeOf(data.skills).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataActiveEffect.test.ts b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataActiveEffect.test.ts index 1a48c7a64..5d82f3a0f 100644 --- a/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataActiveEffect.test.ts +++ b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataActiveEffect.test.ts @@ -7,7 +7,9 @@ test('SkyBlockMemberPlayerDataActiveEffect', () => { expect(data).toBeInstanceOf(SkyBlockMemberPlayerDataActiveEffect); expectTypeOf(data).toEqualTypeOf(); expect(data.expireAt).toBeDefined(); + expect(data.expireAt).toBeInstanceOf(Date); expectTypeOf(data.expireAt).toEqualTypeOf(); expect(data.expireTimestamp).toBeDefined(); + expect(data.expireTimestamp).toBeGreaterThanOrEqual(0); expectTypeOf(data.expireTimestamp).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataMinions.test.ts b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataMinions.test.ts index 675d1c4e3..5b0904034 100644 --- a/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataMinions.test.ts +++ b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataMinions.test.ts @@ -1,11 +1,187 @@ +import SkyBlockMemberPlayerDataMinion from './SkyBlockMemberPlayerDataMinion.js'; import SkyBlockMemberPlayerDataMinions from './SkyBlockMemberPlayerDataMinions.js'; import { expect, expectTypeOf, test } from 'vitest'; test('SkyBlockMemberPlayerDataMinions', () => { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - const data = new SkyBlockMemberPlayerDataMinions(); + const data = new SkyBlockMemberPlayerDataMinions([]); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberPlayerDataMinions); expectTypeOf(data).toEqualTypeOf(); + expect(data.acacia).toBeDefined(); + expect(data.acacia).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.acacia).toEqualTypeOf(); + expect(data.birch).toBeDefined(); + expect(data.birch).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.birch).toEqualTypeOf(); + expect(data.blaze).toBeDefined(); + expect(data.blaze).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.blaze).toEqualTypeOf(); + expect(data.cactus).toBeDefined(); + expect(data.cactus).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.cactus).toEqualTypeOf(); + expect(data.carrot).toBeDefined(); + expect(data.carrot).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.carrot).toEqualTypeOf(); + expect(data.cavespider).toBeDefined(); + expect(data.cavespider).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.cavespider).toEqualTypeOf(); + expect(data.chicken).toBeDefined(); + expect(data.chicken).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.chicken).toEqualTypeOf(); + expect(data.clay).toBeDefined(); + expect(data.clay).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.clay).toEqualTypeOf(); + expect(data.coal).toBeDefined(); + expect(data.coal).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.coal).toEqualTypeOf(); + expect(data.cobblestone).toBeDefined(); + expect(data.cobblestone).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.cobblestone).toEqualTypeOf(); + expect(data.cocoa).toBeDefined(); + expect(data.cocoa).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.cocoa).toEqualTypeOf(); + expect(data.cow).toBeDefined(); + expect(data.cow).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.cow).toEqualTypeOf(); + expect(data.creeper).toBeDefined(); + expect(data.creeper).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.creeper).toEqualTypeOf(); + expect(data.darkOak).toBeDefined(); + expect(data.darkOak).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.darkOak).toEqualTypeOf(); + expect(data.diamond).toBeDefined(); + expect(data.diamond).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.diamond).toEqualTypeOf(); + expect(data.emerald).toBeDefined(); + expect(data.emerald).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.emerald).toEqualTypeOf(); + expect(data.enderman).toBeDefined(); + expect(data.enderman).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.enderman).toEqualTypeOf(); + expect(data.enderStone).toBeDefined(); + expect(data.enderStone).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.enderStone).toEqualTypeOf(); + expect(data.fishing).toBeDefined(); + expect(data.fishing).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.fishing).toEqualTypeOf(); + expect(data.flower).toBeDefined(); + expect(data.flower).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.flower).toEqualTypeOf(); + expect(data.ghast).toBeDefined(); + expect(data.ghast).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.ghast).toEqualTypeOf(); + expect(data.glowstone).toBeDefined(); + expect(data.glowstone).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.glowstone).toEqualTypeOf(); + expect(data.gold).toBeDefined(); + expect(data.gold).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.gold).toEqualTypeOf(); + expect(data.gravel).toBeDefined(); + expect(data.gravel).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.gravel).toEqualTypeOf(); + expect(data.hardStone).toBeDefined(); + expect(data.hardStone).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.hardStone).toEqualTypeOf(); + expect(data.ice).toBeDefined(); + expect(data.ice).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.ice).toEqualTypeOf(); + expect(data.inferno).toBeDefined(); + expect(data.inferno).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.inferno).toEqualTypeOf(); + expect(data.iron).toBeDefined(); + expect(data.iron).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.iron).toEqualTypeOf(); + expect(data.jungle).toBeDefined(); + expect(data.jungle).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.jungle).toEqualTypeOf(); + expect(data.lapis).toBeDefined(); + expect(data.lapis).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.lapis).toEqualTypeOf(); + expect(data.magmaCube).toBeDefined(); + expect(data.magmaCube).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.magmaCube).toEqualTypeOf(); + expect(data.melon).toBeDefined(); + expect(data.melon).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.melon).toEqualTypeOf(); + expect(data.mithril).toBeDefined(); + expect(data.mithril).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.mithril).toEqualTypeOf(); + expect(data.mushroom).toBeDefined(); + expect(data.mushroom).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.mushroom).toEqualTypeOf(); + expect(data.mycelium).toBeDefined(); + expect(data.mycelium).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.mycelium).toEqualTypeOf(); + expect(data.netherWart).toBeDefined(); + expect(data.netherWart).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.netherWart).toEqualTypeOf(); + expect(data.oak).toBeDefined(); + expect(data.oak).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.oak).toEqualTypeOf(); + expect(data.obsidian).toBeDefined(); + expect(data.obsidian).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.obsidian).toEqualTypeOf(); + expect(data.pig).toBeDefined(); + expect(data.pig).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.pig).toEqualTypeOf(); + expect(data.potato).toBeDefined(); + expect(data.potato).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.potato).toEqualTypeOf(); + expect(data.pumpkin).toBeDefined(); + expect(data.pumpkin).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.pumpkin).toEqualTypeOf(); + expect(data.quartz).toBeDefined(); + expect(data.quartz).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.quartz).toEqualTypeOf(); + expect(data.rabbit).toBeDefined(); + expect(data.rabbit).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.rabbit).toEqualTypeOf(); + expect(data.redstone).toBeDefined(); + expect(data.redstone).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.redstone).toEqualTypeOf(); + expect(data.redSand).toBeDefined(); + expect(data.redSand).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.redSand).toEqualTypeOf(); + expect(data.revenant).toBeDefined(); + expect(data.revenant).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.revenant).toEqualTypeOf(); + expect(data.sand).toBeDefined(); + expect(data.sand).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.sand).toEqualTypeOf(); + expect(data.sheep).toBeDefined(); + expect(data.sheep).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.sheep).toEqualTypeOf(); + expect(data.skeleton).toBeDefined(); + expect(data.skeleton).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.skeleton).toEqualTypeOf(); + expect(data.slime).toBeDefined(); + expect(data.slime).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.slime).toEqualTypeOf(); + expect(data.snow).toBeDefined(); + expect(data.snow).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.snow).toEqualTypeOf(); + expect(data.spider).toBeDefined(); + expect(data.spider).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.spider).toEqualTypeOf(); + expect(data.spruce).toBeDefined(); + expect(data.spruce).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.spruce).toEqualTypeOf(); + expect(data.sugarCane).toBeDefined(); + expect(data.sugarCane).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.sugarCane).toEqualTypeOf(); + expect(data.tarantula).toBeDefined(); + expect(data.tarantula).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.tarantula).toEqualTypeOf(); + expect(data.vampire).toBeDefined(); + expect(data.vampire).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.vampire).toEqualTypeOf(); + expect(data.voidling).toBeDefined(); + expect(data.voidling).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.voidling).toEqualTypeOf(); + expect(data.wheat).toBeDefined(); + expect(data.wheat).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.wheat).toEqualTypeOf(); + expect(data.zombie).toBeDefined(); + expect(data.zombie).toBeInstanceOf(SkyBlockMemberPlayerDataMinion); + expectTypeOf(data.zombie).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataSkills.test.ts b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataSkills.test.ts index 29560ce1f..f4dd574d5 100644 --- a/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataSkills.test.ts +++ b/src/Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerDataSkills.test.ts @@ -29,4 +29,15 @@ test('SkyBlockMemberPlayerDataSkills', () => { expectTypeOf(data.carpentry).toEqualTypeOf(); expect(data.combat).toBeDefined(); expectTypeOf(data.combat).toEqualTypeOf(); + expect(data.average).toBeDefined(); + expect(data.average).toBeGreaterThanOrEqual(0); + expectTypeOf(data.average).toEqualTypeOf(); + expect(data.nonCosmeticAverage).toBeDefined(); + expect(data.nonCosmeticAverage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.nonCosmeticAverage).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.average); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStats.test.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStats.test.ts index 024543d76..6281c8106 100644 --- a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStats.test.ts +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStats.test.ts @@ -1,12 +1,12 @@ import SkyBlockMemberPlayerStats from './SkyBlockMemberPlayerStats.js'; +import SkyBlockMemberPlayerStatsAuctions from './SkyBlockMemberPlayerStatsAuctions.js'; +import SkyBlockMemberPlayerStatsCandy from './SkyBlockMemberPlayerStatsCandy.js'; +import SkyBlockMemberPlayerStatsEndIsland from './SkyBlockMemberPlayerStatsEndIsland.js'; +import SkyBlockMemberPlayerStatsFishing from './SkyBlockMemberPlayerStatsFishing.js'; +import SkyBlockMemberPlayerStatsGifts from './SkyBlockMemberPlayerStatsGifts.js'; +import SkyBlockMemberPlayerStatsMythos from './SkyBlockMemberPlayerStatsMythos.js'; +import SkyBlockMemberPlayerStatsWinter from './SkyBlockMemberPlayerStatsWinter.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockMemberPlayerStatsAuctions from './SkyBlockMemberPlayerStatsAuctions.js'; -import type SkyBlockMemberPlayerStatsCandy from './SkyBlockMemberPlayerStatsCandy.js'; -import type SkyBlockMemberPlayerStatsEndIsland from './SkyBlockMemberPlayerStatsEndIsland.js'; -import type SkyBlockMemberPlayerStatsFishing from './SkyBlockMemberPlayerStatsFishing.js'; -import type SkyBlockMemberPlayerStatsGifts from './SkyBlockMemberPlayerStatsGifts.js'; -import type SkyBlockMemberPlayerStatsMythos from './SkyBlockMemberPlayerStatsMythos.js'; -import type SkyBlockMemberPlayerStatsWinter from './SkyBlockMemberPlayerStatsWinter.js'; test('SkyBlockMemberPlayerStats', () => { const data = new SkyBlockMemberPlayerStats({ stats: 'meow' }); @@ -14,28 +14,38 @@ test('SkyBlockMemberPlayerStats', () => { expect(data).toBeInstanceOf(SkyBlockMemberPlayerStats); expectTypeOf(data).toEqualTypeOf(); expect(data.fishing).toBeDefined(); + expect(data.fishing).toBeInstanceOf(SkyBlockMemberPlayerStatsFishing); expectTypeOf(data.fishing).toEqualTypeOf(); expect(data.glowingMushroomsBroken).toBeDefined(); + expect(data.glowingMushroomsBroken).toBeGreaterThanOrEqual(0); expectTypeOf(data.glowingMushroomsBroken).toEqualTypeOf(); expect(data.highestDamage).toBeDefined(); + expect(data.highestDamage).toBeGreaterThanOrEqual(0); expectTypeOf(data.highestDamage).toEqualTypeOf(); expect(data.highestCriticalDamage).toBeDefined(); + expect(data.highestCriticalDamage).toBeGreaterThanOrEqual(0); expectTypeOf(data.highestCriticalDamage).toEqualTypeOf(); expect(data.kills).toBeDefined(); expectTypeOf(data.kills).toEqualTypeOf>(); expect(data.deaths).toBeDefined(); expectTypeOf(data.deaths).toEqualTypeOf>(); expect(data.auctions).toBeDefined(); + expect(data.auctions).toBeInstanceOf(SkyBlockMemberPlayerStatsAuctions); expectTypeOf(data.auctions).toEqualTypeOf(); expect(data.candy).toBeDefined(); + expect(data.candy).toBeInstanceOf(SkyBlockMemberPlayerStatsCandy); expectTypeOf(data.candy).toEqualTypeOf(); expect(data.gifts).toBeDefined(); + expect(data.gifts).toBeInstanceOf(SkyBlockMemberPlayerStatsGifts); expectTypeOf(data.gifts).toEqualTypeOf(); expect(data.mythos).toBeDefined(); + expect(data.mythos).toBeInstanceOf(SkyBlockMemberPlayerStatsMythos); expectTypeOf(data.mythos).toEqualTypeOf(); expect(data.winter).toBeDefined(); + expect(data.winter).toBeInstanceOf(SkyBlockMemberPlayerStatsWinter); expectTypeOf(data.winter).toEqualTypeOf(); expect(data.endIsland).toBeDefined(); + expect(data.endIsland).toBeInstanceOf(SkyBlockMemberPlayerStatsEndIsland); expectTypeOf(data.endIsland).toEqualTypeOf(); expect(data.races).toBeDefined(); expectTypeOf(data.races).toEqualTypeOf>>(); diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsAuctions.test.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsAuctions.test.ts index 805119925..f14468d99 100644 --- a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsAuctions.test.ts +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsAuctions.test.ts @@ -1,6 +1,6 @@ import SkyBlockMemberPlayerStatsAuctions from './SkyBlockMemberPlayerStatsAuctions.js'; +import SkyBlockMemberPlayerStatsAuctionsStats from './SkyBlockMemberPlayerStatsAuctionsStats.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockMemberPlayerStatsAuctionsStats from './SkyBlockMemberPlayerStatsAuctionsStats.js'; test('SkyBlockMemberPlayerStatsAuctions', () => { const data = new SkyBlockMemberPlayerStatsAuctions({ stats: 'meow' }); @@ -8,25 +8,36 @@ test('SkyBlockMemberPlayerStatsAuctions', () => { expect(data).toBeInstanceOf(SkyBlockMemberPlayerStatsAuctions); expectTypeOf(data).toEqualTypeOf(); expect(data.bids).toBeDefined(); + expect(data.bids).toBeGreaterThanOrEqual(0); expectTypeOf(data.bids).toEqualTypeOf(); expect(data.highestBid).toBeDefined(); + expect(data.highestBid).toBeGreaterThanOrEqual(0); expectTypeOf(data.highestBid).toEqualTypeOf(); expect(data.won).toBeDefined(); + expect(data.won).toBeGreaterThanOrEqual(0); expectTypeOf(data.won).toEqualTypeOf(); expect(data.goldSpent).toBeDefined(); + expect(data.goldSpent).toBeGreaterThanOrEqual(0); expectTypeOf(data.goldSpent).toEqualTypeOf(); expect(data.created).toBeDefined(); + expect(data.created).toBeGreaterThanOrEqual(0); expectTypeOf(data.created).toEqualTypeOf(); expect(data.fees).toBeDefined(); + expect(data.fees).toBeGreaterThanOrEqual(0); expectTypeOf(data.fees).toEqualTypeOf(); expect(data.completed).toBeDefined(); + expect(data.completed).toBeGreaterThanOrEqual(0); expectTypeOf(data.completed).toEqualTypeOf(); expect(data.goldEarned).toBeDefined(); + expect(data.goldEarned).toBeGreaterThanOrEqual(0); expectTypeOf(data.goldEarned).toEqualTypeOf(); expect(data.noBids).toBeDefined(); + expect(data.noBids).toBeGreaterThanOrEqual(0); expectTypeOf(data.noBids).toEqualTypeOf(); expect(data.auctionsSold).toBeDefined(); + expect(data.auctionsSold).toBeInstanceOf(SkyBlockMemberPlayerStatsAuctionsStats); expectTypeOf(data.auctionsSold).toEqualTypeOf(); expect(data.auctionsBought).toBeDefined(); + expect(data.auctionsBought).toBeInstanceOf(SkyBlockMemberPlayerStatsAuctionsStats); expectTypeOf(data.auctionsBought).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsAuctionsStats.test.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsAuctionsStats.test.ts index ccdf52bcc..6db507a57 100644 --- a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsAuctionsStats.test.ts +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsAuctionsStats.test.ts @@ -7,19 +7,32 @@ test('SkyBlockMemberPlayerStatsAuctionsStats', () => { expect(data).toBeInstanceOf(SkyBlockMemberPlayerStatsAuctionsStats); expectTypeOf(data).toEqualTypeOf(); expect(data.common).toBeDefined(); + expect(data.common).toBeGreaterThanOrEqual(0); expectTypeOf(data.common).toEqualTypeOf(); expect(data.uncommon).toBeDefined(); + expect(data.uncommon).toBeGreaterThanOrEqual(0); expectTypeOf(data.uncommon).toEqualTypeOf(); expect(data.rare).toBeDefined(); + expect(data.rare).toBeGreaterThanOrEqual(0); expectTypeOf(data.rare).toEqualTypeOf(); expect(data.epic).toBeDefined(); + expect(data.epic).toBeGreaterThanOrEqual(0); expectTypeOf(data.epic).toEqualTypeOf(); expect(data.legendary).toBeDefined(); + expect(data.legendary).toBeGreaterThanOrEqual(0); expectTypeOf(data.legendary).toEqualTypeOf(); expect(data.special).toBeDefined(); + expect(data.special).toBeGreaterThanOrEqual(0); expectTypeOf(data.special).toEqualTypeOf(); expect(data.mythic).toBeDefined(); + expect(data.mythic).toBeGreaterThanOrEqual(0); expectTypeOf(data.mythic).toEqualTypeOf(); expect(data.total).toBeDefined(); + expect(data.total).toBeGreaterThanOrEqual(0); expectTypeOf(data.total).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.total); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsCandy.test.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsCandy.test.ts index 6cc015514..1ecbc598b 100644 --- a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsCandy.test.ts +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsCandy.test.ts @@ -1,6 +1,6 @@ import SkyBlockMemberPlayerStatsCandy from './SkyBlockMemberPlayerStatsCandy.js'; +import SkyBlockMemberPlayerStatsSpookyFestival from './SkyBlockMemberPlayerStatsSpookyFestival.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockMemberPlayerStatsSpookyFestival from './SkyBlockMemberPlayerStatsSpookyFestival.js'; test('SkyBlockMemberPlayerStatsCandy', () => { const data = new SkyBlockMemberPlayerStatsCandy({ stats: 'meow' }); @@ -8,13 +8,21 @@ test('SkyBlockMemberPlayerStatsCandy', () => { expect(data).toBeInstanceOf(SkyBlockMemberPlayerStatsCandy); expectTypeOf(data).toEqualTypeOf(); expect(data.green).toBeDefined(); + expect(data.green).toBeGreaterThanOrEqual(0); expectTypeOf(data.green).toEqualTypeOf(); expect(data.purple).toBeDefined(); + expect(data.purple).toBeGreaterThanOrEqual(0); expectTypeOf(data.purple).toEqualTypeOf(); expect(data.total).toBeDefined(); + expect(data.total).toBeGreaterThanOrEqual(0); expectTypeOf(data.total).toEqualTypeOf(); expect(data.batsSpawned).toBeDefined(); expectTypeOf(data.batsSpawned).toEqualTypeOf>(); expect(data.festivals).toBeDefined(); expectTypeOf(data.festivals).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.total); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIsland.test.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIsland.test.ts index 43916eeda..3952ca0ed 100644 --- a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIsland.test.ts +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIsland.test.ts @@ -1,6 +1,6 @@ import SkyBlockMemberPlayerStatsEndIsland from './SkyBlockMemberPlayerStatsEndIsland.js'; +import SkyBlockMemberPlayerStatsEndIslandDragonFight from './SkyBlockMemberPlayerStatsEndIslandDragonFight.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockMemberPlayerStatsEndIslandDragonFight from './SkyBlockMemberPlayerStatsEndIslandDragonFight.js'; test('SkyBlockMemberPlayerStatsEndIsland', () => { const data = new SkyBlockMemberPlayerStatsEndIsland({ stats: 'meow' }); @@ -8,9 +8,12 @@ test('SkyBlockMemberPlayerStatsEndIsland', () => { expect(data).toBeInstanceOf(SkyBlockMemberPlayerStatsEndIsland); expectTypeOf(data).toEqualTypeOf(); expect(data.dragonFight).toBeDefined(); + expect(data.dragonFight).toBeInstanceOf(SkyBlockMemberPlayerStatsEndIslandDragonFight); expectTypeOf(data.dragonFight).toEqualTypeOf(); expect(data.summoningEyesCollected).toBeDefined(); + expect(data.summoningEyesCollected).toBeGreaterThanOrEqual(0); expectTypeOf(data.summoningEyesCollected).toEqualTypeOf(); expect(data.specialZealotLootCollected).toBeDefined(); + expect(data.specialZealotLootCollected).toBeGreaterThanOrEqual(0); expectTypeOf(data.specialZealotLootCollected).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFight.test.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFight.test.ts index c217b48df..958bd476d 100644 --- a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFight.test.ts +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFight.test.ts @@ -1,4 +1,6 @@ +/* eslint-disable @stylistic/max-len */ import SkyBlockMemberPlayerStatsEndIslandDragonFight from './SkyBlockMemberPlayerStatsEndIslandDragonFight.js'; +import SkyBlockMemberPlayerStatsEndIslandDragonFightDragon from './SkyBlockMemberPlayerStatsEndIslandDragonFightDragon.js'; import { expect, expectTypeOf, test } from 'vitest'; test('SkyBlockMemberPlayerStatsEndIslandDragonFight', () => { @@ -6,4 +8,28 @@ test('SkyBlockMemberPlayerStatsEndIslandDragonFight', () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberPlayerStatsEndIslandDragonFight); expectTypeOf(data).toEqualTypeOf(); + expect(data.enderCrystalsDestroyed).toBeDefined(); + expect(data.enderCrystalsDestroyed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.enderCrystalsDestroyed).toEqualTypeOf(); + expect(data.protector).toBeDefined(); + expect(data.protector).toBeInstanceOf(SkyBlockMemberPlayerStatsEndIslandDragonFightDragon); + expectTypeOf(data.protector).toEqualTypeOf(); + expect(data.old).toBeDefined(); + expect(data.old).toBeInstanceOf(SkyBlockMemberPlayerStatsEndIslandDragonFightDragon); + expectTypeOf(data.old).toEqualTypeOf(); + expect(data.unstable).toBeDefined(); + expect(data.unstable).toBeInstanceOf(SkyBlockMemberPlayerStatsEndIslandDragonFightDragon); + expectTypeOf(data.unstable).toEqualTypeOf(); + expect(data.young).toBeDefined(); + expect(data.young).toBeInstanceOf(SkyBlockMemberPlayerStatsEndIslandDragonFightDragon); + expectTypeOf(data.young).toEqualTypeOf(); + expect(data.strong).toBeDefined(); + expect(data.strong).toBeInstanceOf(SkyBlockMemberPlayerStatsEndIslandDragonFightDragon); + expectTypeOf(data.strong).toEqualTypeOf(); + expect(data.wise).toBeDefined(); + expect(data.wise).toBeInstanceOf(SkyBlockMemberPlayerStatsEndIslandDragonFightDragon); + expectTypeOf(data.wise).toEqualTypeOf(); + expect(data.superior).toBeDefined(); + expect(data.superior).toBeInstanceOf(SkyBlockMemberPlayerStatsEndIslandDragonFightDragon); + expectTypeOf(data.superior).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFightDragon.test.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFightDragon.test.ts index f11bc622f..6d97bdae9 100644 --- a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFightDragon.test.ts +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsEndIslandDragonFightDragon.test.ts @@ -1,20 +1,30 @@ -// eslint-disable-next-line @stylistic/max-len +/* eslint-disable @stylistic/max-len */ import SkyBlockMemberPlayerStatsEndIslandDragonFightDragon from './SkyBlockMemberPlayerStatsEndIslandDragonFightDragon.js'; import { expect, expectTypeOf, test } from 'vitest'; test('SkyBlockMemberPlayerStatsEndIslandDragonFightDragon', () => { - const data = new SkyBlockMemberPlayerStatsEndIslandDragonFightDragon({ stats: 'meow' }, 'protector'); + const data = new SkyBlockMemberPlayerStatsEndIslandDragonFightDragon({ stats: 'meow' }, 'old'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberPlayerStatsEndIslandDragonFightDragon); expectTypeOf(data).toEqualTypeOf(); expect(data.mostDamage).toBeDefined(); + expect(data.mostDamage).toBeGreaterThanOrEqual(0); expectTypeOf(data.mostDamage).toEqualTypeOf(); expect(data.highestRank).toBeDefined(); + expect(data.highestRank).toBeGreaterThanOrEqual(0); expectTypeOf(data.highestRank).toEqualTypeOf(); expect(data.fastestKill).toBeDefined(); + expect(data.fastestKill).toBeGreaterThanOrEqual(0); expectTypeOf(data.fastestKill).toEqualTypeOf(); expect(data.amountSummoned).toBeDefined(); + expect(data.amountSummoned).toBeGreaterThanOrEqual(0); expectTypeOf(data.amountSummoned).toEqualTypeOf(); expect(data.summoningEyesContributed).toBeDefined(); + expect(data.summoningEyesContributed).toBeGreaterThanOrEqual(0); expectTypeOf(data.summoningEyesContributed).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.amountSummoned); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsFishing.test.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsFishing.test.ts index 06cfae7d6..4df347269 100644 --- a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsFishing.test.ts +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsFishing.test.ts @@ -7,15 +7,26 @@ test('SkyBlockMemberPlayerStatsFishing', () => { expect(data).toBeInstanceOf(SkyBlockMemberPlayerStatsFishing); expectTypeOf(data).toEqualTypeOf(); expect(data.seaCreaturesKills).toBeDefined(); + expect(data.seaCreaturesKills).toBeGreaterThanOrEqual(0); expectTypeOf(data.seaCreaturesKills).toEqualTypeOf(); expect(data.normal).toBeDefined(); + expect(data.normal).toBeGreaterThanOrEqual(0); expectTypeOf(data.normal).toEqualTypeOf(); expect(data.treasure).toBeDefined(); + expect(data.treasure).toBeGreaterThanOrEqual(0); expectTypeOf(data.treasure).toEqualTypeOf(); expect(data.largeTreasure).toBeDefined(); + expect(data.largeTreasure).toBeGreaterThanOrEqual(0); expectTypeOf(data.largeTreasure).toEqualTypeOf(); expect(data.trophyFish).toBeDefined(); + expect(data.trophyFish).toBeGreaterThanOrEqual(0); expectTypeOf(data.trophyFish).toEqualTypeOf(); expect(data.total).toBeDefined(); + expect(data.total).toBeGreaterThanOrEqual(0); expectTypeOf(data.total).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.total); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsGifts.test.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsGifts.test.ts index 38f9d2f55..f3cdeb597 100644 --- a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsGifts.test.ts +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsGifts.test.ts @@ -7,7 +7,17 @@ test('SkyBlockMemberPlayerStatsGifts', () => { expect(data).toBeInstanceOf(SkyBlockMemberPlayerStatsGifts); expectTypeOf(data).toEqualTypeOf(); expect(data.received).toBeDefined(); + expect(data.received).toBeGreaterThanOrEqual(0); expectTypeOf(data.received).toEqualTypeOf(); expect(data.given).toBeDefined(); + expect(data.given).toBeGreaterThanOrEqual(0); expectTypeOf(data.given).toEqualTypeOf(); + expect(data.total).toBeDefined(); + expect(data.total).toBeGreaterThanOrEqual(0); + expectTypeOf(data.total).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.total); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsMythos.test.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsMythos.test.ts index accc60a1d..b70380e5a 100644 --- a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsMythos.test.ts +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsMythos.test.ts @@ -7,13 +7,23 @@ test('SkyBlockMemberPlayerStatsMythos', () => { expect(data).toBeInstanceOf(SkyBlockMemberPlayerStatsMythos); expectTypeOf(data).toEqualTypeOf(); expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.kills).toEqualTypeOf(); expect(data.burrowsDugNext).toBeDefined(); + expect(data.burrowsDugNext).toBeGreaterThanOrEqual(0); expectTypeOf(data.burrowsDugNext).toEqualTypeOf(); expect(data.burrowsDugCombat).toBeDefined(); + expect(data.burrowsDugCombat).toBeGreaterThanOrEqual(0); expectTypeOf(data.burrowsDugCombat).toEqualTypeOf(); expect(data.burrowsDugTreasure).toBeDefined(); + expect(data.burrowsDugTreasure).toBeGreaterThanOrEqual(0); expectTypeOf(data.burrowsDugTreasure).toEqualTypeOf(); expect(data.burrowsChainsComplete).toBeDefined(); + expect(data.burrowsChainsComplete).toBeGreaterThanOrEqual(0); expectTypeOf(data.burrowsChainsComplete).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.kills); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsSpookyFestival.test.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsSpookyFestival.test.ts index 7defad936..336710fd1 100644 --- a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsSpookyFestival.test.ts +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsSpookyFestival.test.ts @@ -2,16 +2,25 @@ import SkyBlockMemberPlayerStatsSpookyFestival from './SkyBlockMemberPlayerStats import { expect, expectTypeOf, test } from 'vitest'; test('SkyBlockMemberPlayerStatsSpookyFestival', () => { - const data = new SkyBlockMemberPlayerStatsSpookyFestival({ stats: 'meow' }, 1); + const data = new SkyBlockMemberPlayerStatsSpookyFestival({ stats: 'meow' }, 100); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberPlayerStatsSpookyFestival); expectTypeOf(data).toEqualTypeOf(); expect(data.year).toBeDefined(); + expect(data.year).toBeGreaterThanOrEqual(0); expectTypeOf(data.year).toEqualTypeOf(); expect(data.green).toBeDefined(); + expect(data.green).toBeGreaterThanOrEqual(0); expectTypeOf(data.green).toEqualTypeOf(); expect(data.purple).toBeDefined(); + expect(data.purple).toBeGreaterThanOrEqual(0); expectTypeOf(data.purple).toEqualTypeOf(); expect(data.total).toBeDefined(); + expect(data.total).toBeGreaterThanOrEqual(0); expectTypeOf(data.total).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.total); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsWinter.test.ts b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsWinter.test.ts index c39193532..35da5e943 100644 --- a/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsWinter.test.ts +++ b/src/Structures/SkyBlock/Member/PlayerStats/SkyBlockMemberPlayerStatsWinter.test.ts @@ -7,11 +7,15 @@ test('SkyBlockMemberPlayerStatsWinter', () => { expect(data).toBeInstanceOf(SkyBlockMemberPlayerStatsWinter); expectTypeOf(data).toEqualTypeOf(); expect(data.mostSnowballsHit).toBeDefined(); + expect(data.mostSnowballsHit).toBeGreaterThanOrEqual(0); expectTypeOf(data.mostSnowballsHit).toEqualTypeOf(); expect(data.mostDamageDealt).toBeDefined(); + expect(data.mostDamageDealt).toBeGreaterThanOrEqual(0); expectTypeOf(data.mostDamageDealt).toEqualTypeOf(); expect(data.mostMagmaDamageDealt).toBeDefined(); + expect(data.mostMagmaDamageDealt).toBeGreaterThanOrEqual(0); expectTypeOf(data.mostMagmaDamageDealt).toEqualTypeOf(); expect(data.mostCannonballsHit).toBeDefined(); + expect(data.mostCannonballsHit).toBeGreaterThanOrEqual(0); expectTypeOf(data.mostCannonballsHit).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuests.test.ts b/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuests.test.ts index 2e77e1343..fe0dd6155 100644 --- a/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuests.test.ts +++ b/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuests.test.ts @@ -1,7 +1,7 @@ import SkyBlockMemberQuests from './SkyBlockMemberQuests.js'; +import SkyBlockMemberQuestsHarp from './SkyBlockMemberQuestsHarp.js'; +import SkyBlockMemberQuestsTrapper from './SkyBlockMemberQuestsTrapper.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockMemberQuestsHarp from './SkyBlockMemberQuestsHarp.js'; -import type SkyBlockMemberQuestsTrapper from './SkyBlockMemberQuestsTrapper.js'; test('SkyBlockMemberQuests', () => { const data = new SkyBlockMemberQuests({ stats: 'meow' }); @@ -9,7 +9,9 @@ test('SkyBlockMemberQuests', () => { expect(data).toBeInstanceOf(SkyBlockMemberQuests); expectTypeOf(data).toEqualTypeOf(); expect(data.harp).toBeDefined(); + expect(data.harp).toBeInstanceOf(SkyBlockMemberQuestsHarp); expectTypeOf(data.harp).toEqualTypeOf(); expect(data.trapper).toBeDefined(); + expect(data.trapper).toBeInstanceOf(SkyBlockMemberQuestsTrapper); expectTypeOf(data.trapper).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsHarp.test.ts b/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsHarp.test.ts index c8fc5acd3..00cb99b3e 100644 --- a/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsHarp.test.ts +++ b/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsHarp.test.ts @@ -1,47 +1,65 @@ import SkyBlockMemberQuestsHarp from './SkyBlockMemberQuestsHarp.js'; +import SkyBlockMemberQuestsHarpSong from './SkyBlockMemberQuestsHarpSong.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockMemberQuestsHarpSong from './SkyBlockMemberQuestsHarpSong.js'; import type { HarpSong } from '../../../../Types/SkyBlock.js'; test('SkyBlockMemberQuestsHarp', () => { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - const data = new SkyBlockMemberQuestsHarp(); + const data = new SkyBlockMemberQuestsHarp({ stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberQuestsHarp); expectTypeOf(data).toEqualTypeOf(); expect(data.selectedSong).toBeDefined(); expectTypeOf(data.selectedSong).toEqualTypeOf(); expect(data.selectedSongTimestamp).toBeDefined(); + expect(data.selectedSongTimestamp).toBeGreaterThanOrEqual(0); expectTypeOf(data.selectedSongTimestamp).toEqualTypeOf(); expect(data.selectedSongDate).toBeDefined(); + expect(data.selectedSongDate).toBeInstanceOf(Date); expectTypeOf(data.selectedSongDate).toEqualTypeOf(); expect(data.claimedTalisman).toBeDefined(); expectTypeOf(data.claimedTalisman).toEqualTypeOf(); expect(data.hymnJoy).toBeDefined(); + expect(data.hymnJoy).toBeInstanceOf(SkyBlockMemberQuestsHarpSong); expectTypeOf(data.hymnJoy).toEqualTypeOf(); expect(data.frereJacques).toBeDefined(); + expect(data.frereJacques).toBeInstanceOf(SkyBlockMemberQuestsHarpSong); expectTypeOf(data.frereJacques).toEqualTypeOf(); expect(data.amazingGrace).toBeDefined(); + expect(data.amazingGrace).toBeInstanceOf(SkyBlockMemberQuestsHarpSong); expectTypeOf(data.amazingGrace).toEqualTypeOf(); expect(data.brahms).toBeDefined(); + expect(data.brahms).toBeInstanceOf(SkyBlockMemberQuestsHarpSong); expectTypeOf(data.brahms).toEqualTypeOf(); expect(data.happyBirthday).toBeDefined(); + expect(data.happyBirthday).toBeInstanceOf(SkyBlockMemberQuestsHarpSong); expectTypeOf(data.happyBirthday).toEqualTypeOf(); expect(data.greensleeves).toBeDefined(); + expect(data.greensleeves).toBeInstanceOf(SkyBlockMemberQuestsHarpSong); expectTypeOf(data.greensleeves).toEqualTypeOf(); expect(data.jeopardy).toBeDefined(); + expect(data.jeopardy).toBeInstanceOf(SkyBlockMemberQuestsHarpSong); expectTypeOf(data.jeopardy).toEqualTypeOf(); expect(data.minuet).toBeDefined(); + expect(data.minuet).toBeInstanceOf(SkyBlockMemberQuestsHarpSong); expectTypeOf(data.minuet).toEqualTypeOf(); expect(data.joyWorld).toBeDefined(); + expect(data.joyWorld).toBeInstanceOf(SkyBlockMemberQuestsHarpSong); expectTypeOf(data.joyWorld).toEqualTypeOf(); expect(data.pureImagination).toBeDefined(); + expect(data.pureImagination).toBeInstanceOf(SkyBlockMemberQuestsHarpSong); expectTypeOf(data.pureImagination).toEqualTypeOf(); expect(data.vieEnRose).toBeDefined(); + expect(data.vieEnRose).toBeInstanceOf(SkyBlockMemberQuestsHarpSong); expectTypeOf(data.vieEnRose).toEqualTypeOf(); expect(data.fireAndFlames).toBeDefined(); + expect(data.fireAndFlames).toBeInstanceOf(SkyBlockMemberQuestsHarpSong); expectTypeOf(data.fireAndFlames).toEqualTypeOf(); expect(data.pachelbel).toBeDefined(); + expect(data.pachelbel).toBeInstanceOf(SkyBlockMemberQuestsHarpSong); expectTypeOf(data.pachelbel).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => HarpSong | 'UNKNOWN'>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.selectedSong); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsHarpSong.test.ts b/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsHarpSong.test.ts index 4a23f32bf..f705c1193 100644 --- a/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsHarpSong.test.ts +++ b/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsHarpSong.test.ts @@ -3,16 +3,24 @@ import { expect, expectTypeOf, test } from 'vitest'; import type { HarpSong } from '../../../../Types/SkyBlock.js'; test('SkyBlockMemberQuestsHarpSong', () => { - const data = new SkyBlockMemberQuestsHarpSong({ stats: 'meow' }, 'hymn_joy'); + const data = new SkyBlockMemberQuestsHarpSong({ stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberQuestsHarpSong); expectTypeOf(data).toEqualTypeOf(); expect(data.song).toBeDefined(); expectTypeOf(data.song).toEqualTypeOf(); expect(data.completions).toBeDefined(); + expect(data.completions).toBeGreaterThanOrEqual(0); expectTypeOf(data.completions).toEqualTypeOf(); expect(data.bestCompletions).toBeDefined(); + expect(data.bestCompletions).toBeGreaterThanOrEqual(0); expectTypeOf(data.bestCompletions).toEqualTypeOf(); expect(data.perfectCompletions).toBeDefined(); + expect(data.perfectCompletions).toBeGreaterThanOrEqual(0); expectTypeOf(data.perfectCompletions).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => HarpSong | 'UNKNOWN'>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.song); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsTrapper.test.ts b/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsTrapper.test.ts index 816814bf6..b0aa40612 100644 --- a/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsTrapper.test.ts +++ b/src/Structures/SkyBlock/Member/Quests/SkyBlockMemberQuestsTrapper.test.ts @@ -7,9 +7,17 @@ test('SkyBlockMemberQuestsTrapper', () => { expect(data).toBeInstanceOf(SkyBlockMemberQuestsTrapper); expectTypeOf(data).toEqualTypeOf(); expect(data.peltCount).toBeDefined(); + expect(data.peltCount).toBeGreaterThanOrEqual(0); expectTypeOf(data.peltCount).toEqualTypeOf(); expect(data.lastCompletedTimestamp).toBeDefined(); + expect(data.lastCompletedTimestamp).toBeGreaterThanOrEqual(0); expectTypeOf(data.lastCompletedTimestamp).toEqualTypeOf(); expect(data.lastCompletedAt).toBeDefined(); + expect(data.lastCompletedAt).toBeInstanceOf(Date); expectTypeOf(data.lastCompletedAt).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.peltCount); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRift.test.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRift.test.ts index b63e4ad8e..34012683b 100644 --- a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRift.test.ts +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRift.test.ts @@ -1,17 +1,17 @@ import SkyBlockMemberRift from './SkyBlockMemberRift.js'; +import SkyBlockMemberRiftAccess from './SkyBlockMemberRiftAccess.js'; +import SkyBlockMemberRiftBlackLagoon from './SkyBlockMemberRiftBlackLagoon.js'; +import SkyBlockMemberRiftCastle from './SkyBlockMemberRiftCastle.js'; +import SkyBlockMemberRiftDeadCats from './SkyBlockMemberRiftDeadCats.js'; +import SkyBlockMemberRiftDreamFarm from './SkyBlockMemberRiftDreamFarm.js'; +import SkyBlockMemberRiftEnigma from './SkyBlockMemberRiftEnigma.js'; +import SkyBlockMemberRiftGallery from './SkyBlockMemberRiftGallery.js'; +import SkyBlockMemberRiftInventory from './SkyBlockMemberRiftInventory.js'; +import SkyBlockMemberRiftVillagePlaza from './VillagePlaza/SkyBlockMemberRiftVillagePlaza.js'; +import SkyBlockMemberRiftWestVillage from './WestVillage/SkyBlockMemberRiftWestVillage.js'; +import SkyBlockMemberRiftWitherCage from './SkyBlockMemberRiftWitherCage.js'; +import SkyBlockMemberRiftWizardTower from './SkyBlockMemberRiftWizardTower.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockMemberRiftAccess from './SkyBlockMemberRiftAccess.js'; -import type SkyBlockMemberRiftBlackLagoon from './SkyBlockMemberRiftBlackLagoon.js'; -import type SkyBlockMemberRiftCastle from './SkyBlockMemberRiftCastle.js'; -import type SkyBlockMemberRiftDeadCats from './SkyBlockMemberRiftDeadCats.js'; -import type SkyBlockMemberRiftDreamFarm from './SkyBlockMemberRiftDreamFarm.js'; -import type SkyBlockMemberRiftEnigma from './SkyBlockMemberRiftEnigma.js'; -import type SkyBlockMemberRiftGallery from './SkyBlockMemberRiftGallery.js'; -import type SkyBlockMemberRiftInventory from './SkyBlockMemberRiftInventory.js'; -import type SkyBlockMemberRiftVillagePlaza from './VillagePlaza/SkyBlockMemberRiftVillagePlaza.js'; -import type SkyBlockMemberRiftWestVillage from './WestVillage/SkyBlockMemberRiftWestVillage.js'; -import type SkyBlockMemberRiftWitherCage from './SkyBlockMemberRiftWitherCage.js'; -import type SkyBlockMemberRiftWizardTower from './SkyBlockMemberRiftWizardTower.js'; test('SkyBlockMemberRift', () => { const data = new SkyBlockMemberRift({ stats: 'meow' }); @@ -19,29 +19,41 @@ test('SkyBlockMemberRift', () => { expect(data).toBeInstanceOf(SkyBlockMemberRift); expectTypeOf(data).toEqualTypeOf(); expect(data.villagePlaza).toBeDefined(); + expect(data.villagePlaza).toBeInstanceOf(SkyBlockMemberRiftVillagePlaza); expectTypeOf(data.villagePlaza).toEqualTypeOf(); expect(data.witherCage).toBeDefined(); + expect(data.witherCage).toBeInstanceOf(SkyBlockMemberRiftWitherCage); expectTypeOf(data.witherCage).toEqualTypeOf(); expect(data.blackLagoon).toBeDefined(); + expect(data.blackLagoon).toBeInstanceOf(SkyBlockMemberRiftBlackLagoon); expectTypeOf(data.blackLagoon).toEqualTypeOf(); expect(data.deadCats).toBeDefined(); + expect(data.deadCats).toBeInstanceOf(SkyBlockMemberRiftDeadCats); expectTypeOf(data.deadCats).toEqualTypeOf(); expect(data.wizardTower).toBeDefined(); + expect(data.wizardTower).toBeInstanceOf(SkyBlockMemberRiftWizardTower); expectTypeOf(data.wizardTower).toEqualTypeOf(); expect(data.enigma).toBeDefined(); + expect(data.enigma).toBeInstanceOf(SkyBlockMemberRiftEnigma); expectTypeOf(data.enigma).toEqualTypeOf(); expect(data.gallery).toBeDefined(); + expect(data.gallery).toBeInstanceOf(SkyBlockMemberRiftGallery); expectTypeOf(data.gallery).toEqualTypeOf(); expect(data.lifetimePurchasedBoundaries).toBeDefined(); expectTypeOf(data.lifetimePurchasedBoundaries).toEqualTypeOf(); expect(data.westVillage).toBeDefined(); + expect(data.westVillage).toBeInstanceOf(SkyBlockMemberRiftWestVillage); expectTypeOf(data.westVillage).toEqualTypeOf(); expect(data.castle).toBeDefined(); + expect(data.castle).toBeInstanceOf(SkyBlockMemberRiftCastle); expectTypeOf(data.castle).toEqualTypeOf(); expect(data.access).toBeDefined(); + expect(data.access).toBeInstanceOf(SkyBlockMemberRiftAccess); expectTypeOf(data.access).toEqualTypeOf(); expect(data.dreamFarm).toBeDefined(); + expect(data.dreamFarm).toBeInstanceOf(SkyBlockMemberRiftDreamFarm); expectTypeOf(data.dreamFarm).toEqualTypeOf(); expect(data.inventory).toBeDefined(); + expect(data.inventory).toBeInstanceOf(SkyBlockMemberRiftInventory); expectTypeOf(data.inventory).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftAccess.test.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftAccess.test.ts index 25b75ea50..d0a1ab02a 100644 --- a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftAccess.test.ts +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftAccess.test.ts @@ -7,13 +7,17 @@ test('SkyBlockMemberRiftAccess', () => { expect(data).toBeInstanceOf(SkyBlockMemberRiftAccess); expectTypeOf(data).toEqualTypeOf(); expect(data.lastFree).toBeDefined(); + expect(data.lastFree).toBeGreaterThanOrEqual(0); expectTypeOf(data.lastFree).toEqualTypeOf(); expect(data.lastFreeAt).toBeDefined(); + expect(data.lastFreeAt).toBeInstanceOf(Date); expectTypeOf(data.lastFreeAt).toEqualTypeOf(); expect(data.consumedPrism).toBeDefined(); expectTypeOf(data.consumedPrism).toEqualTypeOf(); expect(data.chargeTrackTimestamp).toBeDefined(); + expect(data.chargeTrackTimestamp).toBeGreaterThanOrEqual(0); expectTypeOf(data.chargeTrackTimestamp).toEqualTypeOf(); expect(data.chargeTrackTimestampAt).toBeDefined(); + expect(data.chargeTrackTimestampAt).toBeInstanceOf(Date); expectTypeOf(data.chargeTrackTimestampAt).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftBlackLagoon.test.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftBlackLagoon.test.ts index d6d4e4ff1..8b56ab21f 100644 --- a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftBlackLagoon.test.ts +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftBlackLagoon.test.ts @@ -13,5 +13,6 @@ test('SkyBlockMemberRiftBlackLagoon', () => { expect(data.deliveredSciencePaper).toBeDefined(); expectTypeOf(data.deliveredSciencePaper).toEqualTypeOf(); expect(data.completedStep).toBeDefined(); + expect(data.completedStep).toBeGreaterThanOrEqual(0); expectTypeOf(data.completedStep).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftCastle.test.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftCastle.test.ts index 688952c7a..0ad9f76fa 100644 --- a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftCastle.test.ts +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftCastle.test.ts @@ -9,7 +9,9 @@ test('SkyBlockMemberRiftCastle', () => { expect(data.unlockedPathwaySkip).toBeDefined(); expectTypeOf(data.unlockedPathwaySkip).toEqualTypeOf(); expect(data.fairyStep).toBeDefined(); + expect(data.fairyStep).toBeGreaterThanOrEqual(0); expectTypeOf(data.fairyStep).toEqualTypeOf(); expect(data.grubberStacks).toBeDefined(); + expect(data.grubberStacks).toBeGreaterThanOrEqual(0); expectTypeOf(data.grubberStacks).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftDeadCats.test.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftDeadCats.test.ts index cf9db0850..e7253dec3 100644 --- a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftDeadCats.test.ts +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftDeadCats.test.ts @@ -1,6 +1,6 @@ +import SkyBlockMemberPet from '../Pets/SkyBlockMemberPet.js'; import SkyBlockMemberRiftDeadCats from './SkyBlockMemberRiftDeadCats.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockMemberPet from '../Pets/SkyBlockMemberPet.js'; test('SkyBlockMemberRiftDeadCats', () => { const data = new SkyBlockMemberRiftDeadCats({ stats: 'meow' }); @@ -16,5 +16,6 @@ test('SkyBlockMemberRiftDeadCats', () => { expect(data.unlockedPet).toBeDefined(); expectTypeOf(data.unlockedPet).toEqualTypeOf(); expect(data.montezuma).toBeDefined(); + expect(data.montezuma).toBeInstanceOf(SkyBlockMemberPet); expectTypeOf(data.montezuma).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftDreamFarm.test.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftDreamFarm.test.ts index 14d2a7582..3b997bbfe 100644 --- a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftDreamFarm.test.ts +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftDreamFarm.test.ts @@ -7,6 +7,7 @@ test('SkyBlockMemberRiftDreamFarm', () => { expect(data).toBeInstanceOf(SkyBlockMemberRiftDreamFarm); expectTypeOf(data).toEqualTypeOf(); expect(data.shaniaStage).toBeDefined(); + expect(data.shaniaStage).toBeGreaterThanOrEqual(0); expectTypeOf(data.shaniaStage).toEqualTypeOf(); expect(data.caducousFeederUses).toBeDefined(); expectTypeOf(data.caducousFeederUses).toEqualTypeOf(); diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftEnigma.test.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftEnigma.test.ts index 7130107fb..94940e725 100644 --- a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftEnigma.test.ts +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftEnigma.test.ts @@ -11,5 +11,6 @@ test('SkyBlockMemberRiftEnigma', () => { expect(data.foundSouls).toBeDefined(); expectTypeOf(data.foundSouls).toEqualTypeOf(); expect(data.claimedBonusIndex).toBeDefined(); + expect(data.claimedBonusIndex).toBeGreaterThanOrEqual(0); expectTypeOf(data.claimedBonusIndex).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftGallery.test.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftGallery.test.ts index 5a702354b..8be761eab 100644 --- a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftGallery.test.ts +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftGallery.test.ts @@ -1,6 +1,6 @@ import SkyBlockMemberRiftGallery from './SkyBlockMemberRiftGallery.js'; +import SkyBlockMemberRiftGallerySecuredTrophy from './SkyBlockMemberRiftGallerySecuredTrophy.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockMemberRiftGallerySecuredTrophy from './SkyBlockMemberRiftGallerySecuredTrophy.js'; import type { RiftGalleryTrophy } from '../../../../Types/SkyBlock.js'; test('SkyBlockMemberRiftGallery', () => { @@ -9,6 +9,7 @@ test('SkyBlockMemberRiftGallery', () => { expect(data).toBeInstanceOf(SkyBlockMemberRiftGallery); expectTypeOf(data).toEqualTypeOf(); expect(data.eliseStep).toBeDefined(); + expect(data.eliseStep).toBeGreaterThanOrEqual(0); expectTypeOf(data.eliseStep).toEqualTypeOf(); expect(data.securedTrophies).toBeDefined(); expectTypeOf(data.securedTrophies).toEqualTypeOf(); diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftGallerySecuredTrophy.test.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftGallerySecuredTrophy.test.ts index db5bb240b..ae2243a84 100644 --- a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftGallerySecuredTrophy.test.ts +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftGallerySecuredTrophy.test.ts @@ -10,9 +10,12 @@ test('SkyBlockMemberRiftGallerySecuredTrophy', () => { expect(data.type).toBeDefined(); expectTypeOf(data.type).toEqualTypeOf(); expect(data.timestamp).toBeDefined(); + expect(data.timestamp).toBeGreaterThanOrEqual(0); expectTypeOf(data.timestamp).toEqualTypeOf(); expect(data.timestampAt).toBeDefined(); + expect(data.timestampAt).toBeInstanceOf(Date); expectTypeOf(data.timestampAt).toEqualTypeOf(); expect(data.visits).toBeDefined(); + expect(data.visits).toBeGreaterThanOrEqual(0); expectTypeOf(data.visits).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftInventory.test.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftInventory.test.ts index 7ad12d520..76944960c 100644 --- a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftInventory.test.ts +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftInventory.test.ts @@ -12,11 +12,15 @@ test('SkyBlockMemberRiftInventory', () => { expect(data.enderChestPageIcons).toBeDefined(); expectTypeOf(data.enderChestPageIcons).toEqualTypeOf<[]>(); expect(data.inventory).toBeDefined(); + expect(data.inventory).toBeInstanceOf(SkyBlockMemberInventoriesInventory); expectTypeOf(data.inventory).toEqualTypeOf(); expect(data.armor).toBeDefined(); + expect(data.armor).toBeInstanceOf(SkyBlockMemberInventoriesArmor); expectTypeOf(data.armor).toEqualTypeOf(); expect(data.equipment).toBeDefined(); + expect(data.equipment).toBeInstanceOf(SkyBlockMemberInventoriesEquipment); expectTypeOf(data.equipment).toEqualTypeOf(); expect(data.enderChest).toBeDefined(); + expect(data.enderChest).toBeInstanceOf(SkyBlockMemberInventoriesInventory); expectTypeOf(data.enderChest).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWizardTower.test.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWizardTower.test.ts index a6b34050f..558208042 100644 --- a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWizardTower.test.ts +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWizardTower.test.ts @@ -6,4 +6,10 @@ test('SkyBlockMemberRiftWizardTower', () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberRiftWizardTower); expectTypeOf(data).toEqualTypeOf(); + expect(data.wizardQuestStep).toBeDefined(); + expect(data.wizardQuestStep).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wizardQuestStep).toEqualTypeOf(); + expect(data.crumbsLaidOut).toBeDefined(); + expect(data.crumbsLaidOut).toBeGreaterThanOrEqual(0); + expectTypeOf(data.crumbsLaidOut).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWyldWoods.test.ts b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWyldWoods.test.ts index de18ee09d..aad1b28c9 100644 --- a/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWyldWoods.test.ts +++ b/src/Structures/SkyBlock/Member/Rift/SkyBlockMemberRiftWyldWoods.test.ts @@ -17,5 +17,6 @@ test('SkyBlockMemberRiftWyldWoods', () => { expect(data.siriusClaimedDoubloon).toBeDefined(); expectTypeOf(data.siriusClaimedDoubloon).toEqualTypeOf(); expect(data.bughunterStep).toBeDefined(); + expect(data.bughunterStep).toBeGreaterThanOrEqual(0); expectTypeOf(data.bughunterStep).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlaza.test.ts b/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlaza.test.ts index 9c3ac74be..5e29dc6c6 100644 --- a/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlaza.test.ts +++ b/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlaza.test.ts @@ -1,8 +1,8 @@ import SkyBlockMemberRiftVillagePlaza from './SkyBlockMemberRiftVillagePlaza.js'; +import SkyBlockMemberRiftVillagePlazaBarry from './SkyBlockMemberRiftVillagePlazaBarry.js'; +import SkyBlockMemberRiftVillagePlazaCowboy from './SkyBlockMemberRiftVillagePlazaCowboy.js'; +import SkyBlockMemberRiftVillagePlazaMurder from './SkyBlockMemberRiftVillagePlazaMurder.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockMemberRiftVillagePlazaBarry from './SkyBlockMemberRiftVillagePlazaBarry.js'; -import type SkyBlockMemberRiftVillagePlazaCowboy from './SkyBlockMemberRiftVillagePlazaCowboy.js'; -import type SkyBlockMemberRiftVillagePlazaMurder from './SkyBlockMemberRiftVillagePlazaMurder.js'; test('SkyBlockMemberRiftVillagePlaza', () => { const data = new SkyBlockMemberRiftVillagePlaza({ stats: 'meow' }); @@ -10,10 +10,13 @@ test('SkyBlockMemberRiftVillagePlaza', () => { expect(data).toBeInstanceOf(SkyBlockMemberRiftVillagePlaza); expectTypeOf(data).toEqualTypeOf(); expect(data.murder).toBeDefined(); + expect(data.murder).toBeInstanceOf(SkyBlockMemberRiftVillagePlazaMurder); expectTypeOf(data.murder).toEqualTypeOf(); expect(data.barry).toBeDefined(); + expect(data.barry).toBeInstanceOf(SkyBlockMemberRiftVillagePlazaBarry); expectTypeOf(data.barry).toEqualTypeOf(); expect(data.cowboy).toBeDefined(); + expect(data.cowboy).toBeInstanceOf(SkyBlockMemberRiftVillagePlazaCowboy); expectTypeOf(data.cowboy).toEqualTypeOf(); expect(data.barterBank).toBeDefined(); expectTypeOf(data.barterBank).toEqualTypeOf>(); diff --git a/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaCowboy.test.ts b/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaCowboy.test.ts index 917c10680..f8679e75f 100644 --- a/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaCowboy.test.ts +++ b/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaCowboy.test.ts @@ -8,8 +8,10 @@ test('SkyBlockMemberRiftVillagePlazaCowboy', () => { expect(data).toBeInstanceOf(SkyBlockMemberRiftVillagePlazaCowboy); expectTypeOf(data).toEqualTypeOf(); expect(data.stage).toBeDefined(); + expect(data.stage).toBeGreaterThanOrEqual(0); expectTypeOf(data.stage).toEqualTypeOf(); expect(data.hayEaten).toBeDefined(); + expect(data.hayEaten).toBeGreaterThanOrEqual(0); expectTypeOf(data.hayEaten).toEqualTypeOf(); expect(data.rabbitName).toBeDefined(); expectTypeOf(data.rabbitName).toEqualTypeOf(); diff --git a/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaMurder.test.ts b/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaMurder.test.ts index 6e723ae14..b86c20922 100644 --- a/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaMurder.test.ts +++ b/src/Structures/SkyBlock/Member/Rift/VillagePlaza/SkyBlockMemberRiftVillagePlazaMurder.test.ts @@ -7,11 +7,14 @@ test('SkyBlockMemberRiftVillagePlazaMurder', () => { expect(data).toBeInstanceOf(SkyBlockMemberRiftVillagePlazaMurder); expectTypeOf(data).toEqualTypeOf(); expect(data.stepIndex).toBeDefined(); + expect(data.stepIndex).toBeGreaterThanOrEqual(0); expectTypeOf(data.stepIndex).toEqualTypeOf(); expect(data.roomClues).toBeDefined(); expectTypeOf(data.roomClues).toEqualTypeOf(); expect(data.stepIndexPt2).toBeDefined(); + expect(data.stepIndexPt2).toBeGreaterThanOrEqual(0); expectTypeOf(data.stepIndexPt2).toEqualTypeOf(); expect(data.stepIndexPt3).toBeDefined(); + expect(data.stepIndexPt3).toBeGreaterThanOrEqual(0); expectTypeOf(data.stepIndexPt3).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillage.test.ts b/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillage.test.ts index 2b41e19a9..f4529a7fb 100644 --- a/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillage.test.ts +++ b/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillage.test.ts @@ -1,9 +1,9 @@ import SkyBlockMemberRiftWestVillage from './SkyBlockMemberRiftWestVillage.js'; +import SkyBlockMemberRiftWestVillageCrazyKloon from './SkyBlockMemberRiftWestVillageCrazyKloon.js'; +import SkyBlockMemberRiftWestVillageGlyphs from './SkyBlockMemberRiftWestVillageGlyphs.js'; +import SkyBlockMemberRiftWestVillageKatHouse from './SkyBlockMemberRiftWestVillageKatHouse.js'; +import SkyBlockMemberRiftWestVillageMirrorverse from './SkyBlockMemberRiftWestVillageMirrorverse.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockMemberRiftWestVillageCrazyKloon from './SkyBlockMemberRiftWestVillageCrazyKloon.js'; -import type SkyBlockMemberRiftWestVillageGlyphs from './SkyBlockMemberRiftWestVillageGlyphs.js'; -import type SkyBlockMemberRiftWestVillageKatHouse from './SkyBlockMemberRiftWestVillageKatHouse.js'; -import type SkyBlockMemberRiftWestVillageMirrorverse from './SkyBlockMemberRiftWestVillageMirrorverse.js'; test('SkyBlockMemberRiftWestVillage', () => { const data = new SkyBlockMemberRiftWestVillage({ stats: 'meow' }); @@ -11,11 +11,15 @@ test('SkyBlockMemberRiftWestVillage', () => { expect(data).toBeInstanceOf(SkyBlockMemberRiftWestVillage); expectTypeOf(data).toEqualTypeOf(); expect(data.crazyKloon).toBeDefined(); + expect(data.crazyKloon).toBeInstanceOf(SkyBlockMemberRiftWestVillageCrazyKloon); expectTypeOf(data.crazyKloon).toEqualTypeOf(); expect(data.mirrorverse).toBeDefined(); + expect(data.mirrorverse).toBeInstanceOf(SkyBlockMemberRiftWestVillageMirrorverse); expectTypeOf(data.mirrorverse).toEqualTypeOf(); expect(data.katHouse).toBeDefined(); + expect(data.katHouse).toBeInstanceOf(SkyBlockMemberRiftWestVillageKatHouse); expectTypeOf(data.katHouse).toEqualTypeOf(); expect(data.glyphs).toBeDefined(); + expect(data.glyphs).toBeInstanceOf(SkyBlockMemberRiftWestVillageGlyphs); expectTypeOf(data.glyphs).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageGlyphs.test.ts b/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageGlyphs.test.ts index 00a2981e1..eb1f65f68 100644 --- a/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageGlyphs.test.ts +++ b/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageGlyphs.test.ts @@ -13,6 +13,7 @@ test('SkyBlockMemberRiftWestVillageGlyphs', () => { expect(data.currentGlyphCompleted).toBeDefined(); expectTypeOf(data.currentGlyphCompleted).toEqualTypeOf(); expect(data.currentGlyph).toBeDefined(); + expect(data.currentGlyph).toBeGreaterThanOrEqual(0); expectTypeOf(data.currentGlyph).toEqualTypeOf(); expect(data.completed).toBeDefined(); expectTypeOf(data.completed).toEqualTypeOf(); diff --git a/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageKatHouse.test.ts b/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageKatHouse.test.ts index 79b3e012f..0be255015 100644 --- a/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageKatHouse.test.ts +++ b/src/Structures/SkyBlock/Member/Rift/WestVillage/SkyBlockMemberRiftWestVillageKatHouse.test.ts @@ -7,9 +7,12 @@ test('SkyBlockMemberRiftWestVillageKatHouse', () => { expect(data).toBeInstanceOf(SkyBlockMemberRiftWestVillageKatHouse); expectTypeOf(data).toEqualTypeOf(); expect(data.binCollectedSilverfish).toBeDefined(); + expect(data.binCollectedSilverfish).toBeGreaterThanOrEqual(0); expectTypeOf(data.binCollectedSilverfish).toEqualTypeOf(); expect(data.binCollectedSpider).toBeDefined(); + expect(data.binCollectedSpider).toBeGreaterThanOrEqual(0); expectTypeOf(data.binCollectedSpider).toEqualTypeOf(); expect(data.binCollectedMosquito).toBeDefined(); + expect(data.binCollectedMosquito).toBeGreaterThanOrEqual(0); expectTypeOf(data.binCollectedMosquito).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/SkyBlockMember.test.ts b/src/Structures/SkyBlock/Member/SkyBlockMember.test.ts index 23a5010ee..34f621bf7 100644 --- a/src/Structures/SkyBlock/Member/SkyBlockMember.test.ts +++ b/src/Structures/SkyBlock/Member/SkyBlockMember.test.ts @@ -1,78 +1,101 @@ import SkyBlockMember from './SkyBlockMember.js'; +import SkyBlockMemberAccessoryBag from './AccessoryBag/SkyBlockMemberAccessoryBag.js'; +import SkyBlockMemberBestiary from './Bestiary/SkyBlockMemberBestiary.js'; +import SkyBlockMemberChocolateFactory from './ChocolateFactory/SkyBlockMemberChocolateFactory.js'; +import SkyBlockMemberCrimsonIsle from './CrimsonIsle/SkyBlockMemberCrimsonIsle.js'; +import SkyBlockMemberCurrencies from './SkyBlockMemberCurrencies.js'; +import SkyBlockMemberDungeons from './Dungeons/SkyBlockMemberDungeons.js'; +import SkyBlockMemberFairySouls from './SkyBlockMemberFairySouls.js'; +import SkyBlockMemberInventories from './Inventories/SkyBlockMemberInventories.js'; +import SkyBlockMemberJacobContests from './JacobContests/SkyBlockMemberJacobContests.js'; +import SkyBlockMemberLeveling from './SkyBlockMemberLeveling.js'; +import SkyBlockMemberMining from './Mining/SkyBlockMemberMining.js'; +import SkyBlockMemberObjectives from './SkyBlockMemberObjectives.js'; +import SkyBlockMemberPets from './Pets/SkyBlockMemberPets.js'; +import SkyBlockMemberPlayerData from './PlayerData/SkyBlockMemberPlayerData.js'; +import SkyBlockMemberPlayerStats from './PlayerStats/SkyBlockMemberPlayerStats.js'; +import SkyBlockMemberProfile from './SkyBlockMemberProfile.js'; +import SkyBlockMemberQuests from './Quests/SkyBlockMemberQuests.js'; +import SkyBlockMemberRift from './Rift/SkyBlockMemberRift.js'; +import SkyBlockMemberSlayers from './Slayers/SkyBlockMemberSlayers.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockMemberAccessoryBag from './AccessoryBag/SkyBlockMemberAccessoryBag.js'; -import type SkyBlockMemberBestiary from './Bestiary/SkyBlockMemberBestiary.js'; -import type SkyBlockMemberChocolateFactory from './ChocolateFactory/SkyBlockMemberChocolateFactory.js'; -import type SkyBlockMemberCrimsonIsle from './CrimsonIsle/SkyBlockMemberCrimsonIsle.js'; -import type SkyBlockMemberCurrencies from './SkyBlockMemberCurrencies.js'; -import type SkyBlockMemberDungeons from './Dungeons/SkyBlockMemberDungeons.js'; -import type SkyBlockMemberFairySouls from './SkyBlockMemberFairySouls.js'; -import type SkyBlockMemberJacobContests from './JacobContests/SkyBlockMemberJacobContests.js'; -import type SkyBlockMemberLeveling from './SkyBlockMemberLeveling.js'; -import type SkyBlockMemberMining from './Mining/SkyBlockMemberMining.js'; -import type SkyBlockMemberObjectives from './SkyBlockMemberObjectives.js'; -import type SkyBlockMemberPets from './Pets/SkyBlockMemberPets.js'; -import type SkyBlockMemberPlayerData from './PlayerData/SkyBlockMemberPlayerData.js'; -import type SkyBlockMemberPlayerStats from './PlayerStats/SkyBlockMemberPlayerStats.js'; -import type SkyBlockMemberProfile from './SkyBlockMemberProfile.js'; -import type SkyBlockMemberQuests from './Quests/SkyBlockMemberQuests.js'; -import type SkyBlockMemberRift from './Rift/SkyBlockMemberRift.js'; -import type SkyBlockMemberSlayers from './Slayers/SkyBlockMemberSlayers.js'; import type { SkyBlockArrow } from '../../../Types/SkyBlock.js'; import type { UUID } from '../../../Types/Global.js'; test('SkyBlockMember', () => { - const data = new SkyBlockMember('meow', { stats: 'meow' }); + const data = new SkyBlockMember('mrrp', { stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMember); expectTypeOf(data).toEqualTypeOf(); expect(data.uuid).toBeDefined(); expectTypeOf(data.uuid).toEqualTypeOf(); expect(data.accessoryBag).toBeDefined(); + expect(data.accessoryBag).toBeInstanceOf(SkyBlockMemberAccessoryBag); expectTypeOf(data.accessoryBag).toEqualTypeOf(); expect(data.bestiary).toBeDefined(); + expect(data.bestiary).toBeInstanceOf(SkyBlockMemberBestiary); expectTypeOf(data.bestiary).toEqualTypeOf(); expect(data.collections).toBeDefined(); expectTypeOf(data.collections).toEqualTypeOf>(); expect(data.currencies).toBeDefined(); + expect(data.currencies).toBeInstanceOf(SkyBlockMemberCurrencies); expectTypeOf(data.currencies).toEqualTypeOf(); expect(data.dungeons).toBeDefined(); + expect(data.dungeons).toBeInstanceOf(SkyBlockMemberDungeons); expectTypeOf(data.dungeons).toEqualTypeOf(); expect(data.chocolateFactory).toBeDefined(); + expect(data.chocolateFactory).toBeInstanceOf(SkyBlockMemberChocolateFactory); expectTypeOf(data.chocolateFactory).toEqualTypeOf(); expect(data.fairySouls).toBeDefined(); + expect(data.fairySouls).toBeInstanceOf(SkyBlockMemberFairySouls); expectTypeOf(data.fairySouls).toEqualTypeOf(); expect(data.soulflow).toBeDefined(); + expect(data.soulflow).toBeGreaterThanOrEqual(0); expectTypeOf(data.soulflow).toEqualTypeOf(); expect(data.favoriteArrow).toBeDefined(); expectTypeOf(data.favoriteArrow).toEqualTypeOf(); expect(data.jacobContests).toBeDefined(); + expect(data.jacobContests).toBeInstanceOf(SkyBlockMemberJacobContests); expectTypeOf(data.jacobContests).toEqualTypeOf(); expect(data.leveling).toBeDefined(); + expect(data.leveling).toBeInstanceOf(SkyBlockMemberLeveling); expectTypeOf(data.leveling).toEqualTypeOf(); expect(data.mining).toBeDefined(); + expect(data.mining).toBeInstanceOf(SkyBlockMemberMining); expectTypeOf(data.mining).toEqualTypeOf(); expect(data.crimsonIsle).toBeDefined(); + expect(data.crimsonIsle).toBeInstanceOf(SkyBlockMemberCrimsonIsle); expectTypeOf(data.crimsonIsle).toEqualTypeOf(); expect(data.objectives).toBeDefined(); + expect(data.objectives).toBeInstanceOf(SkyBlockMemberObjectives); expectTypeOf(data.objectives).toEqualTypeOf(); expect(data.pets).toBeDefined(); + expect(data.pets).toBeInstanceOf(SkyBlockMemberPets); expectTypeOf(data.pets).toEqualTypeOf(); expect(data.playerData).toBeDefined(); + expect(data.playerData).toBeInstanceOf(SkyBlockMemberPlayerData); expectTypeOf(data.playerData).toEqualTypeOf(); expect(data.playerStats).toBeDefined(); + expect(data.playerStats).toBeInstanceOf(SkyBlockMemberPlayerStats); expectTypeOf(data.playerStats).toEqualTypeOf(); expect(data.profileStats).toBeDefined(); + expect(data.profileStats).toBeInstanceOf(SkyBlockMemberProfile); expectTypeOf(data.profileStats).toEqualTypeOf(); expect(data.quests).toBeDefined(); + expect(data.quests).toBeInstanceOf(SkyBlockMemberQuests); expectTypeOf(data.quests).toEqualTypeOf(); expect(data.slayers).toBeDefined(); + expect(data.slayers).toBeInstanceOf(SkyBlockMemberSlayers); expectTypeOf(data.slayers).toEqualTypeOf(); expect(data.rift).toBeDefined(); + expect(data.rift).toBeInstanceOf(SkyBlockMemberRift); expectTypeOf(data.rift).toEqualTypeOf(); + expect(data.inventory).toBeDefined(); + expect(data.inventory).toBeInstanceOf(SkyBlockMemberInventories); + expectTypeOf(data.inventory).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => UUID>(); expect(data.toString()).toBeDefined(); - expect(data.toString()).toEqual(data.uuid); + expect(data.toString()).toBe(data.uuid); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/SkyBlockMemberCurrencies.test.ts b/src/Structures/SkyBlock/Member/SkyBlockMemberCurrencies.test.ts index 926cd83f9..fadff8e82 100644 --- a/src/Structures/SkyBlock/Member/SkyBlockMemberCurrencies.test.ts +++ b/src/Structures/SkyBlock/Member/SkyBlockMemberCurrencies.test.ts @@ -7,23 +7,33 @@ test('SkyBlockMemberCurrencies', () => { expect(data).toBeInstanceOf(SkyBlockMemberCurrencies); expectTypeOf(data).toEqualTypeOf(); expect(data.purse).toBeDefined(); + expect(data.purse).toBeGreaterThanOrEqual(0); expectTypeOf(data.purse).toEqualTypeOf(); expect(data.motesPurse).toBeDefined(); + expect(data.motesPurse).toBeGreaterThanOrEqual(0); expectTypeOf(data.motesPurse).toEqualTypeOf(); expect(data.witherEssence).toBeDefined(); + expect(data.witherEssence).toBeGreaterThanOrEqual(0); expectTypeOf(data.witherEssence).toEqualTypeOf(); expect(data.dragonEssence).toBeDefined(); + expect(data.dragonEssence).toBeGreaterThanOrEqual(0); expectTypeOf(data.dragonEssence).toEqualTypeOf(); expect(data.spiderEssence).toBeDefined(); + expect(data.spiderEssence).toBeGreaterThanOrEqual(0); expectTypeOf(data.spiderEssence).toEqualTypeOf(); expect(data.undeadEssence).toBeDefined(); + expect(data.undeadEssence).toBeGreaterThanOrEqual(0); expectTypeOf(data.undeadEssence).toEqualTypeOf(); expect(data.diamondEssence).toBeDefined(); + expect(data.diamondEssence).toBeGreaterThanOrEqual(0); expectTypeOf(data.diamondEssence).toEqualTypeOf(); expect(data.goldEssence).toBeDefined(); + expect(data.goldEssence).toBeGreaterThanOrEqual(0); expectTypeOf(data.goldEssence).toEqualTypeOf(); expect(data.iceEssence).toBeDefined(); + expect(data.iceEssence).toBeGreaterThanOrEqual(0); expectTypeOf(data.iceEssence).toEqualTypeOf(); expect(data.crimsonEssence).toBeDefined(); + expect(data.crimsonEssence).toBeGreaterThanOrEqual(0); expectTypeOf(data.crimsonEssence).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/SkyBlockMemberFairySouls.test.ts b/src/Structures/SkyBlock/Member/SkyBlockMemberFairySouls.test.ts index fbd366a88..6122e7098 100644 --- a/src/Structures/SkyBlock/Member/SkyBlockMemberFairySouls.test.ts +++ b/src/Structures/SkyBlock/Member/SkyBlockMemberFairySouls.test.ts @@ -7,9 +7,17 @@ test('SkyBlockMemberFairySouls', () => { expect(data).toBeInstanceOf(SkyBlockMemberFairySouls); expectTypeOf(data).toEqualTypeOf(); expect(data.exchanges).toBeDefined(); + expect(data.exchanges).toBeGreaterThanOrEqual(0); expectTypeOf(data.exchanges).toEqualTypeOf(); expect(data.collected).toBeDefined(); + expect(data.collected).toBeGreaterThanOrEqual(0); expectTypeOf(data.collected).toEqualTypeOf(); expect(data.unspent).toBeDefined(); + expect(data.unspent).toBeGreaterThanOrEqual(0); expectTypeOf(data.unspent).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.collected); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/SkyBlockMemberLeveling.test.ts b/src/Structures/SkyBlock/Member/SkyBlockMemberLeveling.test.ts index 649466342..cf62ccf0e 100644 --- a/src/Structures/SkyBlock/Member/SkyBlockMemberLeveling.test.ts +++ b/src/Structures/SkyBlock/Member/SkyBlockMemberLeveling.test.ts @@ -8,8 +8,10 @@ test('SkyBlockMemberLeveling', () => { expect(data).toBeInstanceOf(SkyBlockMemberLeveling); expectTypeOf(data).toEqualTypeOf(); expect(data.experience).toBeDefined(); + expect(data.experience).toBeGreaterThanOrEqual(0); expectTypeOf(data.experience).toEqualTypeOf(); expect(data.level).toBeDefined(); + expect(data.level).toBeGreaterThanOrEqual(0); expectTypeOf(data.level).toEqualTypeOf(); expect(data.completions).toBeDefined(); expectTypeOf(data.completions).toEqualTypeOf>(); @@ -20,10 +22,13 @@ test('SkyBlockMemberLeveling', () => { expect(data.lastViewedTasks).toBeDefined(); expectTypeOf(data.lastViewedTasks).toEqualTypeOf(); expect(data.highestPetScore).toBeDefined(); + expect(data.highestPetScore).toBeGreaterThanOrEqual(0); expectTypeOf(data.highestPetScore).toEqualTypeOf(); expect(data.miningFiestaOresMined).toBeDefined(); + expect(data.miningFiestaOresMined).toBeGreaterThanOrEqual(0); expectTypeOf(data.miningFiestaOresMined).toEqualTypeOf(); expect(data.fishingFestivalSharksKilled).toBeDefined(); + expect(data.fishingFestivalSharksKilled).toBeGreaterThanOrEqual(0); expectTypeOf(data.fishingFestivalSharksKilled).toEqualTypeOf(); expect(data.taskSort).toBeDefined(); expectTypeOf(data.taskSort).toEqualTypeOf(); @@ -31,4 +36,9 @@ test('SkyBlockMemberLeveling', () => { expectTypeOf(data.claimedTalisman).toEqualTypeOf(); expect(data.emblemUnlocks).toBeDefined(); expectTypeOf(data.emblemUnlocks).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.level); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/SkyBlockMemberProfile.test.ts b/src/Structures/SkyBlock/Member/SkyBlockMemberProfile.test.ts index 521ac35f1..3bdef9e50 100644 --- a/src/Structures/SkyBlock/Member/SkyBlockMemberProfile.test.ts +++ b/src/Structures/SkyBlock/Member/SkyBlockMemberProfile.test.ts @@ -7,12 +7,16 @@ test('SkyBlockMemberProfile', () => { expect(data).toBeInstanceOf(SkyBlockMemberProfile); expectTypeOf(data).toEqualTypeOf(); expect(data.firstJoin).toBeDefined(); + expect(data.firstJoin).toBeGreaterThanOrEqual(0); expectTypeOf(data.firstJoin).toEqualTypeOf(); expect(data.firstJoinDate).toBeDefined(); + expect(data.firstJoinDate).toBeInstanceOf(Date); expectTypeOf(data.firstJoinDate).toEqualTypeOf(); expect(data.personalBankUpgrade).toBeDefined(); + expect(data.personalBankUpgrade).toBeGreaterThanOrEqual(0); expectTypeOf(data.personalBankUpgrade).toEqualTypeOf(); expect(data.bankAccount).toBeDefined(); + expect(data.bankAccount).toBeGreaterThanOrEqual(0); expectTypeOf(data.bankAccount).toEqualTypeOf(); expect(data.hasCookie).toBeDefined(); expectTypeOf(data.hasCookie).toEqualTypeOf(); diff --git a/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayer.test.ts b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayer.test.ts index 286b04fdb..0878b601c 100644 --- a/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayer.test.ts +++ b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayer.test.ts @@ -1,25 +1,36 @@ import SkyBlockMemberSlayer from './SkyBlockMemberSlayer.js'; +import SkyBlockMemberSlayerClaimedLevels from './SkyBlockMemberSlayerClaimedLevels.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockMemberSlayerClaimedLevels from './SkyBlockMemberSlayerClaimedLevels.js'; import type { LevelData } from '../../../../Types/SkyBlock.js'; test('SkyBlockMemberSlayer', () => { - const data = new SkyBlockMemberSlayer({ stats: 'meow' }, 'zombie'); + const data = new SkyBlockMemberSlayer({ stats: 'meow' }, 'blaze'); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberSlayer); expectTypeOf(data).toEqualTypeOf(); expect(data.claimedLevels).toBeDefined(); + expect(data.claimedLevels).toBeInstanceOf(SkyBlockMemberSlayerClaimedLevels); expectTypeOf(data.claimedLevels).toEqualTypeOf(); expect(data.tier1Kills).toBeDefined(); + expect(data.tier1Kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.tier1Kills).toEqualTypeOf(); expect(data.tier2Kills).toBeDefined(); + expect(data.tier2Kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.tier2Kills).toEqualTypeOf(); expect(data.tier3Kills).toBeDefined(); + expect(data.tier3Kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.tier3Kills).toEqualTypeOf(); expect(data.tier4Kills).toBeDefined(); + expect(data.tier4Kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.tier4Kills).toEqualTypeOf(); expect(data.tier5Kills).toBeDefined(); + expect(data.tier5Kills).toBeGreaterThanOrEqual(0); expectTypeOf(data.tier5Kills).toEqualTypeOf(); expect(data.level).toBeDefined(); expectTypeOf(data.level).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.level.level); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayers.test.ts b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayers.test.ts index 16e5a4f76..336825f55 100644 --- a/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayers.test.ts +++ b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayers.test.ts @@ -1,7 +1,7 @@ +import SkyBlockMemberSlayer from './SkyBlockMemberSlayer.js'; import SkyBlockMemberSlayers from './SkyBlockMemberSlayers.js'; import SkyBlockMemberSlayersQuest from './SkyBlockMemberSlayersQuest.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockMemberSlayer from './SkyBlockMemberSlayer.js'; test('SkyBlockMemberSlayers', () => { const data = new SkyBlockMemberSlayers({ stats: 'meow' }); @@ -11,15 +11,21 @@ test('SkyBlockMemberSlayers', () => { expect(data.activeSlayer).toBeDefined(); expectTypeOf(data.activeSlayer).toEqualTypeOf(); expect(data.zombie).toBeDefined(); + expect(data.zombie).toBeInstanceOf(SkyBlockMemberSlayer); expectTypeOf(data.zombie).toEqualTypeOf(); expect(data.spider).toBeDefined(); + expect(data.spider).toBeInstanceOf(SkyBlockMemberSlayer); expectTypeOf(data.spider).toEqualTypeOf(); expect(data.wolf).toBeDefined(); + expect(data.wolf).toBeInstanceOf(SkyBlockMemberSlayer); expectTypeOf(data.wolf).toEqualTypeOf(); expect(data.enderman).toBeDefined(); + expect(data.enderman).toBeInstanceOf(SkyBlockMemberSlayer); expectTypeOf(data.enderman).toEqualTypeOf(); expect(data.blaze).toBeDefined(); + expect(data.blaze).toBeInstanceOf(SkyBlockMemberSlayer); expectTypeOf(data.blaze).toEqualTypeOf(); expect(data.vampire).toBeDefined(); + expect(data.vampire).toBeInstanceOf(SkyBlockMemberSlayer); expectTypeOf(data.vampire).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayersQuest.test.ts b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayersQuest.test.ts index 483e95395..ee5c6caf2 100644 --- a/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayersQuest.test.ts +++ b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayersQuest.test.ts @@ -2,7 +2,7 @@ import SkyBlockMemberSlayersQuest from './SkyBlockMemberSlayersQuest.js'; import { expect, expectTypeOf, test } from 'vitest'; import type { SkyBlockArea, SkyBlockSlayer } from '../../../../Types/SkyBlock.js'; -test('SkyBlockMemberSlayersQuest', () => { +test('SkyBlockMemberSlayerQuest', () => { const data = new SkyBlockMemberSlayersQuest({ stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMemberSlayersQuest); @@ -10,27 +10,35 @@ test('SkyBlockMemberSlayersQuest', () => { expect(data.type).toBeDefined(); expectTypeOf(data.type).toEqualTypeOf(); expect(data.tier).toBeDefined(); + expect(data.tier).toBeGreaterThanOrEqual(0); expectTypeOf(data.tier).toEqualTypeOf(); expect(data.startTimestamp).toBeDefined(); + expect(data.startTimestamp).toBeGreaterThanOrEqual(0); expectTypeOf(data.startTimestamp).toEqualTypeOf(); expect(data.startAt).toBeDefined(); + expect(data.startAt).toBeInstanceOf(Date); expectTypeOf(data.startAt).toEqualTypeOf(); expect(data.completionState).toBeDefined(); + expect(data.completionState).toBeGreaterThanOrEqual(0); expectTypeOf(data.completionState).toEqualTypeOf(); expect(data.usedArmor).toBeDefined(); expectTypeOf(data.usedArmor).toEqualTypeOf(); expect(data.solo).toBeDefined(); expectTypeOf(data.solo).toEqualTypeOf(); expect(data.combatXp).toBeDefined(); + expect(data.combatXp).toBeGreaterThanOrEqual(0); expectTypeOf(data.combatXp).toEqualTypeOf(); expect(data.recentMobKills).toBeDefined(); expectTypeOf(data.recentMobKills).toEqualTypeOf<{ xp: number; timestamp: number; timestampAt: Date }[]>(); expect(data.lastKilledMobIsland).toBeDefined(); expectTypeOf(data.lastKilledMobIsland).toEqualTypeOf(); expect(data.xpOnLastFollowerSpawn).toBeDefined(); + expect(data.xpOnLastFollowerSpawn).toBeGreaterThanOrEqual(0); expectTypeOf(data.xpOnLastFollowerSpawn).toEqualTypeOf(); expect(data.spawnTimestamp).toBeDefined(); + expect(data.spawnTimestamp).toBeGreaterThanOrEqual(0); expectTypeOf(data.spawnTimestamp).toEqualTypeOf(); expect(data.spawnAt).toBeDefined(); + expect(data.spawnAt).toBeInstanceOf(Date); expectTypeOf(data.spawnAt).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayersQuest.ts b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayersQuest.ts index 9d81be001..77a90bc5b 100644 --- a/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayersQuest.ts +++ b/src/Structures/SkyBlock/Member/Slayers/SkyBlockMemberSlayersQuest.ts @@ -1,6 +1,6 @@ import type { SkyBlockArea, SkyBlockSlayer } from '../../../../Types/SkyBlock.js'; -class SkyBlockMemberSlayerQuest { +class SkyBlockMemberSlayersQuest { type: SkyBlockSlayer | 'UNKNOWN'; tier: number; startTimestamp: number; @@ -33,4 +33,4 @@ class SkyBlockMemberSlayerQuest { } } -export default SkyBlockMemberSlayerQuest; +export default SkyBlockMemberSlayersQuest; diff --git a/src/Structures/SkyBlock/Museum/SkyBlockMuseum.test.ts b/src/Structures/SkyBlock/Museum/SkyBlockMuseum.test.ts index dc3696efe..3c7c852c5 100644 --- a/src/Structures/SkyBlock/Museum/SkyBlockMuseum.test.ts +++ b/src/Structures/SkyBlock/Museum/SkyBlockMuseum.test.ts @@ -1,6 +1,6 @@ import SkyBlockMuseum from './SkyBlockMuseum.js'; +import SkyBlockMuseumMember from './SkyBlockMuseumMember.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockMuseumMember from './SkyBlockMuseumMember.js'; import type { UUID } from '../../../Types/Global.js'; test('SkyBlockMuseum', () => { diff --git a/src/Structures/SkyBlock/Museum/SkyBlockMuseumItem.test.ts b/src/Structures/SkyBlock/Museum/SkyBlockMuseumItem.test.ts index e44f62557..c1bc9fe45 100644 --- a/src/Structures/SkyBlock/Museum/SkyBlockMuseumItem.test.ts +++ b/src/Structures/SkyBlock/Museum/SkyBlockMuseumItem.test.ts @@ -1,17 +1,19 @@ +import SkyBlockInventoryItem from '../Inventory/SkyBlockInventoryItem.js'; import SkyBlockMuseumItem from './SkyBlockMuseumItem.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockInventoryItem from '../Inventory/SkyBlockInventoryItem.js'; test('SkyBlockMuseumItem', () => { - const data = new SkyBlockMuseumItem('meow', { stats: 'meow' }, []); + const data = new SkyBlockMuseumItem('mrrp', { stats: 'meow' }, []); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockMuseumItem); expectTypeOf(data).toEqualTypeOf(); expect(data.name).toBeDefined(); expectTypeOf(data.name).toEqualTypeOf(); expect(data.donated).toBeDefined(); + expect(data.donated).toBeGreaterThanOrEqual(0); expectTypeOf(data.donated).toEqualTypeOf(); expect(data.donatedAt).toBeDefined(); + expect(data.donatedAt).toBeInstanceOf(Date); expectTypeOf(data.donatedAt).toEqualTypeOf(); expect(data.featuredSlot).toBeDefined(); expectTypeOf(data.featuredSlot).toEqualTypeOf(); @@ -19,4 +21,9 @@ test('SkyBlockMuseumItem', () => { expectTypeOf(data.borrowing).toEqualTypeOf(); expect(data.items).toBeDefined(); expectTypeOf(data.items).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.name); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Museum/SkyBlockMuseumMember.test.ts b/src/Structures/SkyBlock/Museum/SkyBlockMuseumMember.test.ts index 1999119eb..dd576dc61 100644 --- a/src/Structures/SkyBlock/Museum/SkyBlockMuseumMember.test.ts +++ b/src/Structures/SkyBlock/Museum/SkyBlockMuseumMember.test.ts @@ -1,6 +1,6 @@ +import SkyBlockMuseumItem from './SkyBlockMuseumItem.js'; import SkyBlockMuseumMember from './SkyBlockMuseumMember.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockMuseumItem from './SkyBlockMuseumItem.js'; test('SkyBlockMuseumMember', () => { const data = new SkyBlockMuseumMember({ stats: 'meow' }); @@ -8,6 +8,7 @@ test('SkyBlockMuseumMember', () => { expect(data).toBeInstanceOf(SkyBlockMuseumMember); expectTypeOf(data).toEqualTypeOf(); expect(data.value).toBeDefined(); + expect(data.value).toBeGreaterThanOrEqual(0); expectTypeOf(data.value).toEqualTypeOf(); expect(data.appraisal).toBeDefined(); expectTypeOf(data.appraisal).toEqualTypeOf(); diff --git a/src/Structures/SkyBlock/News/SkyBlockNews.test.ts b/src/Structures/SkyBlock/News/SkyBlockNews.test.ts index a046c120c..79e99273c 100644 --- a/src/Structures/SkyBlock/News/SkyBlockNews.test.ts +++ b/src/Structures/SkyBlock/News/SkyBlockNews.test.ts @@ -14,4 +14,9 @@ test('SkyBlockNews', () => { expectTypeOf(data.date).toEqualTypeOf(); expect(data.version).toBeDefined(); expectTypeOf(data.version).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.title); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Potion/SkyBlockPotionEffect.test.ts b/src/Structures/SkyBlock/Potion/SkyBlockPotionEffect.test.ts new file mode 100644 index 000000000..d978de0a3 --- /dev/null +++ b/src/Structures/SkyBlock/Potion/SkyBlockPotionEffect.test.ts @@ -0,0 +1,30 @@ +import SkyBlockPotionEffect from './SkyBlockPotionEffect.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { SkyBlockPotionEffectName } from '../../../Types/SkyBlock.js'; + +test('SkyBlockPotionEffect', () => { + const data = new SkyBlockPotionEffect({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyBlockPotionEffect); + expectTypeOf(data).toEqualTypeOf(); + expect(data.effect).toBeDefined(); + expectTypeOf(data.effect).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expect(data.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.modifiers).toBeDefined(); + expectTypeOf(data.modifiers).toEqualTypeOf<{ key: string; amp: number }[]>(); + expect(data.durationTicks).toBeDefined(); + expect(data.durationTicks).toBeGreaterThanOrEqual(0); + expectTypeOf(data.durationTicks).toEqualTypeOf(); + expect(data.duration).toBeDefined(); + expect(data.duration).toBeGreaterThanOrEqual(0); + expectTypeOf(data.duration).toEqualTypeOf(); + expect(data.infinite).toBeDefined(); + expectTypeOf(data.infinite).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => SkyBlockPotionEffectName | 'UNKNOWN'>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.effect); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/SkyBlock/Potion/SkyBlockPotionEffect.ts b/src/Structures/SkyBlock/Potion/SkyBlockPotionEffect.ts index 8d4b97620..7c56a653c 100644 --- a/src/Structures/SkyBlock/Potion/SkyBlockPotionEffect.ts +++ b/src/Structures/SkyBlock/Potion/SkyBlockPotionEffect.ts @@ -12,7 +12,7 @@ class SkyBlockPotionEffect { this.effect = data?.effect || 'UNKNOWN'; this.level = data?.level || 0; this.modifiers = data?.modifiers || []; - this.durationTicks = data?.duration_ticks; + this.durationTicks = data?.duration_ticks || 0; this.duration = TicksToMilliseconds(this.durationTicks); this.infinite = data?.infinite || false; } diff --git a/src/Structures/SkyBlock/Profile/Banking/SkyBlockProfileBanking.test.ts b/src/Structures/SkyBlock/Profile/Banking/SkyBlockProfileBanking.test.ts index bc5e62e06..634284cea 100644 --- a/src/Structures/SkyBlock/Profile/Banking/SkyBlockProfileBanking.test.ts +++ b/src/Structures/SkyBlock/Profile/Banking/SkyBlockProfileBanking.test.ts @@ -1,6 +1,6 @@ import SkyBlockProfileBanking from './SkyBlockProfileBanking.js'; +import SkyBlockProfilesBankingTransaction from './SkyBlockProfilesBankingTransaction.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockProfilesBankingTransaction from './SkyBlockProfilesBankingTransaction.js'; test('SkyBlockProfileBanking', () => { const data = new SkyBlockProfileBanking({ stats: 'meow' }); @@ -8,7 +8,13 @@ test('SkyBlockProfileBanking', () => { expect(data).toBeInstanceOf(SkyBlockProfileBanking); expectTypeOf(data).toEqualTypeOf(); expect(data.balance).toBeDefined(); + expect(data.balance).toBeGreaterThanOrEqual(0); expectTypeOf(data.balance).toEqualTypeOf(); expect(data.transactions).toBeDefined(); expectTypeOf(data.transactions).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.balance); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Profile/Banking/SkyBlockProfilesBankingTransaction.test.ts b/src/Structures/SkyBlock/Profile/Banking/SkyBlockProfilesBankingTransaction.test.ts index d9e0237a7..3bdaf08e1 100644 --- a/src/Structures/SkyBlock/Profile/Banking/SkyBlockProfilesBankingTransaction.test.ts +++ b/src/Structures/SkyBlock/Profile/Banking/SkyBlockProfilesBankingTransaction.test.ts @@ -8,11 +8,18 @@ test('SkyBlockProfilesBankingTransaction', () => { expect(data).toBeInstanceOf(SkyBlockProfilesBankingTransaction); expectTypeOf(data).toEqualTypeOf(); expect(data.amount).toBeDefined(); + expect(data.amount).toBeGreaterThanOrEqual(0); expectTypeOf(data.amount).toEqualTypeOf(); expect(data.timestamp).toBeDefined(); + expect(data.timestamp).toBeGreaterThanOrEqual(0); expectTypeOf(data.timestamp).toEqualTypeOf(); expect(data.action).toBeDefined(); expectTypeOf(data.action).toEqualTypeOf(); expect(data.user).toBeDefined(); expectTypeOf(data.user).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.amount); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgrades.test.ts b/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgrades.test.ts index bd3fc6f7c..d6e8d7516 100644 --- a/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgrades.test.ts +++ b/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgrades.test.ts @@ -1,7 +1,7 @@ import SkyBlockProfileCommunityUpgrades from './SkyBlockProfileCommunityUpgrades.js'; +import SkyBlockProfileCommunityUpgradesUpgraded from './SkyBlockProfileCommunityUpgradesUpgraded.js'; +import SkyBlockProfileCommunityUpgradesUpgrading from './SkyBlockProfileCommunityUpgradesUpgrading.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockProfileCommunityUpgradesUpgraded from './SkyBlockProfileCommunityUpgradesUpgraded.js'; -import type SkyBlockProfileCommunityUpgradesUpgrading from './SkyBlockProfileCommunityUpgradesUpgrading.js'; test('SkyBlockProfileCommunityUpgrades', () => { const data = new SkyBlockProfileCommunityUpgrades({ stats: 'meow' }); @@ -12,4 +12,9 @@ test('SkyBlockProfileCommunityUpgrades', () => { expectTypeOf(data.currentlyUpgrading).toEqualTypeOf(); expect(data.upgrades).toBeDefined(); expectTypeOf(data.upgrades).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => SkyBlockProfileCommunityUpgradesUpgrading | null>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.currentlyUpgrading); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgrade.test.ts b/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgrade.test.ts index e2f4f6acd..d42542f25 100644 --- a/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgrade.test.ts +++ b/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgrade.test.ts @@ -10,7 +10,14 @@ test('SkyBlockProfileCommunityUpgradesUpgrade', () => { expect(data.upgrade).toBeDefined(); expectTypeOf(data.upgrade).toEqualTypeOf(); expect(data.startedTimestamp).toBeDefined(); + expect(data.startedTimestamp).toBeGreaterThanOrEqual(0); expectTypeOf(data.startedTimestamp).toEqualTypeOf(); expect(data.startedAt).toBeDefined(); + expect(data.startedAt).toBeInstanceOf(Date); expectTypeOf(data.startedAt).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => CommunityUpgradesUpgrades | 'UNKNOWN'>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.upgrade); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgraded.test.ts b/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgraded.test.ts index 9bd75e450..d615a4092 100644 --- a/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgraded.test.ts +++ b/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgraded.test.ts @@ -7,14 +7,19 @@ test('SkyBlockProfileCommunityUpgradesUpgraded', () => { expect(data).toBeInstanceOf(SkyBlockProfileCommunityUpgradesUpgraded); expectTypeOf(data).toEqualTypeOf(); expect(data.tier).toBeDefined(); + expect(data.tier).toBeGreaterThanOrEqual(0); expectTypeOf(data.tier).toEqualTypeOf(); expect(data.startedBy).toBeDefined(); + expect(data.startedBy).toBeGreaterThanOrEqual(0); expectTypeOf(data.startedBy).toEqualTypeOf(); expect(data.claimedTimestamp).toBeDefined(); + expect(data.claimedTimestamp).toBeGreaterThanOrEqual(0); expectTypeOf(data.claimedTimestamp).toEqualTypeOf(); expect(data.claimedAt).toBeDefined(); + expect(data.claimedAt).toBeInstanceOf(Date); expectTypeOf(data.claimedAt).toEqualTypeOf(); expect(data.claimedBy).toBeDefined(); + expect(data.claimedBy).toBeGreaterThanOrEqual(0); expectTypeOf(data.claimedBy).toEqualTypeOf(); expect(data.fasttracked).toBeDefined(); expectTypeOf(data.fasttracked).toEqualTypeOf(); diff --git a/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgraded.ts b/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgraded.ts index 2f4ecb51a..bf2cbb09a 100644 --- a/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgraded.ts +++ b/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgraded.ts @@ -9,7 +9,7 @@ class SkyBlockProfileCommunityUpgradesUpgraded extends SkyBlockProfileCommunityU fasttracked: boolean; constructor(data: Record) { super(data); - this.tier = data.tier || 'UNKNOWN'; + this.tier = data.tier || 0; this.startedBy = data.started_by || 0; this.claimedTimestamp = data.claimed_ms || 0; this.claimedAt = new Date(this.claimedTimestamp); diff --git a/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgrading.test.ts b/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgrading.test.ts index 0b9599da2..4724f2ba1 100644 --- a/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgrading.test.ts +++ b/src/Structures/SkyBlock/Profile/CommunityUpgrades/SkyBlockProfileCommunityUpgradesUpgrading.test.ts @@ -7,7 +7,9 @@ test('SkyBlockProfileCommunityUpgradesUpgrading', () => { expect(data).toBeInstanceOf(SkyBlockProfileCommunityUpgradesUpgrading); expectTypeOf(data).toEqualTypeOf(); expect(data.tier).toBeDefined(); + expect(data.tier).toBeGreaterThanOrEqual(0); expectTypeOf(data.tier).toEqualTypeOf(); expect(data.startedBy).toBeDefined(); + expect(data.startedBy).toBeGreaterThanOrEqual(0); expectTypeOf(data.startedBy).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Profile/SkyBlockProfile.test.ts b/src/Structures/SkyBlock/Profile/SkyBlockProfile.test.ts index 64c124407..87338d0de 100644 --- a/src/Structures/SkyBlock/Profile/SkyBlockProfile.test.ts +++ b/src/Structures/SkyBlock/Profile/SkyBlockProfile.test.ts @@ -1,19 +1,21 @@ +import SkyBlockGarden from '../Garden/SkyBlockGarden.js'; +import SkyBlockMember from '../Member/SkyBlockMember.js'; +import SkyBlockMuseum from '../Museum/SkyBlockMuseum.js'; import SkyBlockProfile from './SkyBlockProfile.js'; +import SkyBlockProfileBanking from './Banking/SkyBlockProfileBanking.js'; +import SkyBlockProfileCommunityUpgrades from './CommunityUpgrades/SkyBlockProfileCommunityUpgrades.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockGarden from '../Garden/SkyBlockGarden.js'; -import type SkyBlockMember from '../Member/SkyBlockMember.js'; -import type SkyBlockProfileBanking from './Banking/SkyBlockProfileBanking.js'; -import type SkyBlockProfileCommunityUpgrades from './CommunityUpgrades/SkyBlockProfileCommunityUpgrades.js'; import type { SkyBlockProfileName, SkyBlockProfileType } from '../../../Types/SkyBlock.js'; test('SkyBlockProfile', () => { - const data = new SkyBlockProfile({ stats: 'meow' }, { uuid: 'meow', garden: null, museum: null }); + const data = new SkyBlockProfile({ stats: 'meow' }, { uuid: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyBlockProfile); expectTypeOf(data).toEqualTypeOf(); expect(data.profileId).toBeDefined(); expectTypeOf(data.profileId).toEqualTypeOf(); expect(data.communityUpgrades).toBeDefined(); + expect(data.communityUpgrades).toBeInstanceOf(SkyBlockProfileCommunityUpgrades); expectTypeOf(data.communityUpgrades).toEqualTypeOf(); expect(data.createdTimestamp).toBeDefined(); expectTypeOf(data.createdTimestamp).toEqualTypeOf(); @@ -26,6 +28,7 @@ test('SkyBlockProfile', () => { expect(data.gameMode).toBeDefined(); expectTypeOf(data.gameMode).toEqualTypeOf(); expect(data.banking).toBeDefined(); + expect(data.banking).toBeInstanceOf(SkyBlockProfileBanking); expectTypeOf(data.banking).toEqualTypeOf(); expect(data.profileName).toBeDefined(); expectTypeOf(data.profileName).toEqualTypeOf(); @@ -33,4 +36,11 @@ test('SkyBlockProfile', () => { expectTypeOf(data.selected).toEqualTypeOf(); expect(data.garden).toBeDefined(); expectTypeOf(data.garden).toEqualTypeOf(); + expect(data.museum).toBeDefined(); + expectTypeOf(data.museum).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => SkyBlockProfileName | 'UNKNOWN'>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.profileName); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Profile/SkyBlockProfile.ts b/src/Structures/SkyBlock/Profile/SkyBlockProfile.ts index 0c984786b..f2a91e7c0 100644 --- a/src/Structures/SkyBlock/Profile/SkyBlockProfile.ts +++ b/src/Structures/SkyBlock/Profile/SkyBlockProfile.ts @@ -22,7 +22,7 @@ class SkyBlockProfile { museum: SkyBlockMuseum | null; constructor( data: Record, - extra: { uuid: UUID | null; garden: SkyBlockGarden | null; museum: SkyBlockMuseum | null } + extra: { uuid: UUID | null; garden?: SkyBlockGarden; museum?: SkyBlockMuseum } ) { this.profileId = data?.profile_id || 'UNKNOWN'; this.communityUpgrades = new SkyBlockProfileCommunityUpgrades(data.communityUpgrades || {}); @@ -35,8 +35,8 @@ class SkyBlockProfile { this.banking = new SkyBlockProfileBanking(data?.banking || {}); this.profileName = data?.cute_name || 'UNKNOWN'; this.selected = data?.selected || false; - this.garden = extra.garden; - this.museum = extra.museum; + this.garden = extra.garden || null; + this.museum = extra.museum || null; } toString(): SkyBlockProfileName | 'UNKNOWN' { diff --git a/src/Structures/SkyBlock/Skills/SkyBlockSkill.test.ts b/src/Structures/SkyBlock/Skills/SkyBlockSkill.test.ts index 82ae0db81..a90f4ee9e 100644 --- a/src/Structures/SkyBlock/Skills/SkyBlockSkill.test.ts +++ b/src/Structures/SkyBlock/Skills/SkyBlockSkill.test.ts @@ -1,6 +1,6 @@ import SkyBlockSkill from './SkyBlockSkill.js'; +import SkyBlockSkillLevel from './SkyBlockSkillLevel.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockSkillLevel from './SkyBlockSkillLevel.js'; test('SkyBlockSkill', () => { const data = new SkyBlockSkill({ stats: 'meow' }); @@ -12,7 +12,13 @@ test('SkyBlockSkill', () => { expect(data.description).toBeDefined(); expectTypeOf(data.description).toEqualTypeOf(); expect(data.maxLevel).toBeDefined(); + expect(data.maxLevel).toBeGreaterThanOrEqual(0); expectTypeOf(data.maxLevel).toEqualTypeOf(); expect(data.levels).toBeDefined(); expectTypeOf(data.levels).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.name); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Skills/SkyBlockSkillLevel.test.ts b/src/Structures/SkyBlock/Skills/SkyBlockSkillLevel.test.ts index 1781eae7a..fbcad663e 100644 --- a/src/Structures/SkyBlock/Skills/SkyBlockSkillLevel.test.ts +++ b/src/Structures/SkyBlock/Skills/SkyBlockSkillLevel.test.ts @@ -7,9 +7,16 @@ test('SkyBlockSkillLevel', () => { expect(data).toBeInstanceOf(SkyBlockSkillLevel); expectTypeOf(data).toEqualTypeOf(); expect(data.level).toBeDefined(); + expect(data.level).toBeGreaterThanOrEqual(0); expectTypeOf(data.level).toEqualTypeOf(); expect(data.totalExpRequired).toBeDefined(); + expect(data.totalExpRequired).toBeGreaterThanOrEqual(0); expectTypeOf(data.totalExpRequired).toEqualTypeOf(); expect(data.unlocks).toBeDefined(); expectTypeOf(data.unlocks).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => number>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.level); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/Skills/SkyBlockSkills.test.ts b/src/Structures/SkyBlock/Skills/SkyBlockSkills.test.ts index 220235738..06a442349 100644 --- a/src/Structures/SkyBlock/Skills/SkyBlockSkills.test.ts +++ b/src/Structures/SkyBlock/Skills/SkyBlockSkills.test.ts @@ -1,6 +1,6 @@ +import SkyBlockSkill from './SkyBlockSkill.js'; import SkyBlockSkills from './SkyBlockSkills.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type SkyBlockSkill from './SkyBlockSkill.js'; test('SkyBlockSkills', () => { const data = new SkyBlockSkills({ stats: 'meow' }); @@ -8,31 +8,44 @@ test('SkyBlockSkills', () => { expect(data).toBeInstanceOf(SkyBlockSkills); expectTypeOf(data).toEqualTypeOf(); expect(data.lastUpdated).toBeDefined(); + expect(data.lastUpdated).toBeGreaterThanOrEqual(0); expectTypeOf(data.lastUpdated).toEqualTypeOf(); expect(data.lastUpdatedAt).toBeDefined(); + expect(data.lastUpdatedAt).toBeInstanceOf(Date); expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); expect(data.version).toBeDefined(); expectTypeOf(data.version).toEqualTypeOf(); expect(data.farming).toBeDefined(); + expect(data.farming).toBeInstanceOf(SkyBlockSkill); expectTypeOf(data.farming).toEqualTypeOf(); expect(data.mining).toBeDefined(); + expect(data.mining).toBeInstanceOf(SkyBlockSkill); expectTypeOf(data.mining).toEqualTypeOf(); expect(data.combat).toBeDefined(); + expect(data.combat).toBeInstanceOf(SkyBlockSkill); expectTypeOf(data.combat).toEqualTypeOf(); expect(data.foraging).toBeDefined(); + expect(data.foraging).toBeInstanceOf(SkyBlockSkill); expectTypeOf(data.foraging).toEqualTypeOf(); expect(data.fishing).toBeDefined(); + expect(data.fishing).toBeInstanceOf(SkyBlockSkill); expectTypeOf(data.fishing).toEqualTypeOf(); expect(data.enchanting).toBeDefined(); + expect(data.enchanting).toBeInstanceOf(SkyBlockSkill); expectTypeOf(data.enchanting).toEqualTypeOf(); expect(data.alchemy).toBeDefined(); + expect(data.alchemy).toBeInstanceOf(SkyBlockSkill); expectTypeOf(data.alchemy).toEqualTypeOf(); expect(data.carpentry).toBeDefined(); + expect(data.carpentry).toBeInstanceOf(SkyBlockSkill); expectTypeOf(data.carpentry).toEqualTypeOf(); expect(data.runecrafting).toBeDefined(); + expect(data.runecrafting).toBeInstanceOf(SkyBlockSkill); expectTypeOf(data.runecrafting).toEqualTypeOf(); expect(data.social).toBeDefined(); + expect(data.social).toBeInstanceOf(SkyBlockSkill); expectTypeOf(data.social).toEqualTypeOf(); expect(data.taming).toBeDefined(); + expect(data.taming).toBeInstanceOf(SkyBlockSkill); expectTypeOf(data.taming).toEqualTypeOf(); }); diff --git a/src/Structures/SkyBlock/SkyBlockItem.test.ts b/src/Structures/SkyBlock/SkyBlockItem.test.ts index d8a661de7..2a6d4c7da 100644 --- a/src/Structures/SkyBlock/SkyBlockItem.test.ts +++ b/src/Structures/SkyBlock/SkyBlockItem.test.ts @@ -13,6 +13,7 @@ test('SkyBlockItem', () => { expect(data.id).toBeDefined(); expectTypeOf(data.id).toEqualTypeOf(); expect(data.durability).toBeDefined(); + expect(data.durability).toBeGreaterThanOrEqual(0); expectTypeOf(data.durability).toEqualTypeOf(); expect(data.skin).toBeDefined(); expectTypeOf(data.skin).toEqualTypeOf>(); @@ -21,6 +22,7 @@ test('SkyBlockItem', () => { expect(data.tier).toBeDefined(); expectTypeOf(data.tier).toEqualTypeOf(); expect(data.npcSellPrice).toBeDefined(); + expect(data.npcSellPrice).toBeGreaterThanOrEqual(0); expectTypeOf(data.npcSellPrice).toEqualTypeOf(); expect(data.salvages).toBeDefined(); expectTypeOf(data.salvages).toEqualTypeOf[]>(); @@ -55,6 +57,7 @@ test('SkyBlockItem', () => { expect(data.generator).toBeDefined(); expectTypeOf(data.generator).toEqualTypeOf(); expect(data.generatorTier).toBeDefined(); + expect(data.generatorTier).toBeGreaterThanOrEqual(0); expectTypeOf(data.generatorTier).toEqualTypeOf(); expect(data.furniture).toBeDefined(); expectTypeOf(data.furniture).toEqualTypeOf(); @@ -65,6 +68,7 @@ test('SkyBlockItem', () => { expect(data.upgradeCosts).toBeDefined(); expectTypeOf(data.upgradeCosts).toEqualTypeOf>>>(); expect(data.gearScore).toBeDefined(); + expect(data.gearScore).toBeGreaterThanOrEqual(0); expectTypeOf(data.gearScore).toEqualTypeOf(); expect(data.dungeonItem).toBeDefined(); expectTypeOf(data.dungeonItem).toEqualTypeOf(); @@ -91,10 +95,12 @@ test('SkyBlockItem', () => { expect(data.swordType).toBeDefined(); expectTypeOf(data.swordType).toEqualTypeOf(); expect(data.abilityDamageScaling).toBeDefined(); + expect(data.abilityDamageScaling).toBeGreaterThanOrEqual(0); expectTypeOf(data.abilityDamageScaling).toEqualTypeOf(); expect(data.tieredStats).toBeDefined(); expectTypeOf(data.tieredStats).toEqualTypeOf>(); expect(data.motesSellPrice).toBeDefined(); + expect(data.motesSellPrice).toBeGreaterThanOrEqual(0); expectTypeOf(data.motesSellPrice).toEqualTypeOf(); expect(data.crystal).toBeDefined(); expectTypeOf(data.crystal).toEqualTypeOf(); @@ -115,6 +121,7 @@ test('SkyBlockItem', () => { expect(data.canInteractEntity).toBeDefined(); expectTypeOf(data.canInteractEntity).toEqualTypeOf(); expect(data.miningFortune).toBeDefined(); + expect(data.miningFortune).toBeGreaterThanOrEqual(0); expectTypeOf(data.miningFortune).toEqualTypeOf(); expect(data.recipes).toBeDefined(); expectTypeOf(data.recipes).toEqualTypeOf[]>(); @@ -124,4 +131,9 @@ test('SkyBlockItem', () => { expectTypeOf(data.loseMotesValueOnTransfer).toEqualTypeOf(); expect(data.prestige).toBeDefined(); expectTypeOf(data.prestige).toEqualTypeOf>(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.name); + expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/Static/Achievements/Achievements.test.ts b/src/Structures/Static/Achievements/Achievements.test.ts new file mode 100644 index 000000000..996ddd285 --- /dev/null +++ b/src/Structures/Static/Achievements/Achievements.test.ts @@ -0,0 +1,18 @@ +import Achievements from './Achievements.js'; +import GameAchievements from './GameAchievements.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Achievements', () => { + const data = new Achievements({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Achievements); + expectTypeOf(data).toEqualTypeOf(); + expect(data.lastUpdatedTimestamp).toBeDefined(); + expect(data.lastUpdatedTimestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.lastUpdatedTimestamp).toEqualTypeOf(); + expect(data.lastUpdatedAt).toBeDefined(); + expect(data.lastUpdatedAt).toBeInstanceOf(Date); + expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); + expect(data.achievementsPerGame).toBeDefined(); + expectTypeOf(data.achievementsPerGame).toEqualTypeOf>(); +}); diff --git a/src/Structures/Static/Achievements/Achievements.ts b/src/Structures/Static/Achievements/Achievements.ts index bdb72de3b..89e869351 100644 --- a/src/Structures/Static/Achievements/Achievements.ts +++ b/src/Structures/Static/Achievements/Achievements.ts @@ -6,10 +6,10 @@ class Achievements { lastUpdatedAt: Date; achievementsPerGame: Record; constructor(data: Record) { - this.lastUpdatedTimestamp = data.lastUpdated; + this.lastUpdatedTimestamp = data.lastUpdated || 0; this.lastUpdatedAt = new Date(this.lastUpdatedTimestamp); this.achievementsPerGame = {}; - Object.keys(data.achievements).forEach((game) => { + Object.keys(data.achievements || {}).forEach((game) => { this.achievementsPerGame.game = new GameAchievements(game, data.achievements[game]); }); } diff --git a/src/Structures/Static/Achievements/BaseAchievement.test.ts b/src/Structures/Static/Achievements/BaseAchievement.test.ts new file mode 100644 index 000000000..944d5d424 --- /dev/null +++ b/src/Structures/Static/Achievements/BaseAchievement.test.ts @@ -0,0 +1,24 @@ +import BaseAchievement from './BaseAchievement.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BaseAchievement', () => { + const data = new BaseAchievement('mrrp', { stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BaseAchievement); + expectTypeOf(data).toEqualTypeOf(); + expect(data.codeName).toBeDefined(); + expectTypeOf(data.codeName).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.description).toBeDefined(); + expectTypeOf(data.description).toEqualTypeOf(); + expect(data.secret).toBeDefined(); + expectTypeOf(data.secret).toEqualTypeOf(); + expect(data.legacy).toBeDefined(); + expectTypeOf(data.legacy).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string>(); + expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.codeName); + expectTypeOf(data.toString()).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/Achievements/BaseAchievement.ts b/src/Structures/Static/Achievements/BaseAchievement.ts index 93a329844..8a7dd24fa 100644 --- a/src/Structures/Static/Achievements/BaseAchievement.ts +++ b/src/Structures/Static/Achievements/BaseAchievement.ts @@ -6,8 +6,8 @@ class BaseAchievement { legacy: boolean; constructor(achievementName: string, data: Record) { this.codeName = achievementName; - this.name = data.name; - this.description = data.description; + this.name = data.name || 'UNKNOWN'; + this.description = data.description || 'UNKNOWN'; this.secret = data.secret || false; this.legacy = data.legacy || false; } diff --git a/src/Structures/Static/Achievements/GameAchievements.test.ts b/src/Structures/Static/Achievements/GameAchievements.test.ts new file mode 100644 index 000000000..dedbd9f0e --- /dev/null +++ b/src/Structures/Static/Achievements/GameAchievements.test.ts @@ -0,0 +1,23 @@ +import GameAchievements from './GameAchievements.js'; +import OneTimeAchievement from './OneTimeAchievement.js'; +import TieredAchievement from './TieredAchievement.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameAchievements', () => { + const data = new GameAchievements('mrrp', { stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameAchievements); + expectTypeOf(data).toEqualTypeOf(); + expect(data.game).toBeDefined(); + expectTypeOf(data.game).toEqualTypeOf(); + expect(data.points).toBeDefined(); + expect(data.points).toBeGreaterThanOrEqual(0); + expectTypeOf(data.points).toEqualTypeOf(); + expect(data.legacyPoints).toBeDefined(); + expect(data.legacyPoints).toBeGreaterThanOrEqual(0); + expectTypeOf(data.legacyPoints).toEqualTypeOf(); + expect(data.oneTimeAchievements).toBeDefined(); + expectTypeOf(data.oneTimeAchievements).toEqualTypeOf(); + expect(data.tieredAchievements).toBeDefined(); + expectTypeOf(data.tieredAchievements).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/Achievements/GameAchievements.ts b/src/Structures/Static/Achievements/GameAchievements.ts index f0279373e..a3e225a83 100644 --- a/src/Structures/Static/Achievements/GameAchievements.ts +++ b/src/Structures/Static/Achievements/GameAchievements.ts @@ -11,10 +11,10 @@ class GameAchievements { this.game = game; this.points = data.total_points || 0; this.legacyPoints = data.total_legacy_points || 0; - this.oneTimeAchievements = Object.keys(data.one_time).map( + this.oneTimeAchievements = Object.keys(data.one_time || {}).map( (achievementKey) => new OneTimeAchievement(achievementKey, data.one_time[achievementKey]) ); - this.tieredAchievements = Object.keys(data.tiered).map( + this.tieredAchievements = Object.keys(data.tiered || {}).map( (achievementKey) => new TieredAchievement(achievementKey, data.tiered[achievementKey]) ); } diff --git a/src/Structures/Static/Achievements/GuildAchievements.test.ts b/src/Structures/Static/Achievements/GuildAchievements.test.ts new file mode 100644 index 000000000..f07d76ee3 --- /dev/null +++ b/src/Structures/Static/Achievements/GuildAchievements.test.ts @@ -0,0 +1,21 @@ +import GuildAchievements from './GuildAchievements.js'; +import OneTimeAchievement from './OneTimeAchievement.js'; +import TieredAchievement from './TieredAchievement.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GuildAchievements', () => { + const data = new GuildAchievements({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GuildAchievements); + expectTypeOf(data).toEqualTypeOf(); + expect(data.lastUpdatedTimestamp).toBeDefined(); + expect(data.lastUpdatedTimestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.lastUpdatedTimestamp).toEqualTypeOf(); + expect(data.lastUpdatedAt).toBeDefined(); + expect(data.lastUpdatedAt).toBeInstanceOf(Date); + expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); + expect(data.oneTimeAchievements).toBeDefined(); + expectTypeOf(data.oneTimeAchievements).toEqualTypeOf(); + expect(data.tieredAchievements).toBeDefined(); + expectTypeOf(data.tieredAchievements).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/Achievements/GuildAchievements.ts b/src/Structures/Static/Achievements/GuildAchievements.ts index a93d11641..4c55fa30c 100644 --- a/src/Structures/Static/Achievements/GuildAchievements.ts +++ b/src/Structures/Static/Achievements/GuildAchievements.ts @@ -8,12 +8,12 @@ class GuildAchievements { oneTimeAchievements: OneTimeAchievement[]; tieredAchievements: TieredAchievement[]; constructor(data: Record) { - this.lastUpdatedTimestamp = data.lastUpdated; + this.lastUpdatedTimestamp = data.lastUpdated || 0; this.lastUpdatedAt = new Date(this.lastUpdatedTimestamp); - this.oneTimeAchievements = Object.keys(data.one_time).map( + this.oneTimeAchievements = Object.keys(data.one_time || {}).map( (achievementKey) => new OneTimeAchievement(achievementKey, data.one_time[achievementKey]) ); - this.tieredAchievements = Object.keys(data.tiered).map( + this.tieredAchievements = Object.keys(data.tiered || {}).map( (achievementKey) => new TieredAchievement(achievementKey, data.tiered[achievementKey]) ); } diff --git a/src/Structures/Static/Achievements/OneTimeAchievement.test.ts b/src/Structures/Static/Achievements/OneTimeAchievement.test.ts new file mode 100644 index 000000000..18c73d473 --- /dev/null +++ b/src/Structures/Static/Achievements/OneTimeAchievement.test.ts @@ -0,0 +1,18 @@ +import OneTimeAchievement from './OneTimeAchievement.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('OneTimeAchievement', () => { + const data = new OneTimeAchievement('mrrp', { stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(OneTimeAchievement); + expectTypeOf(data).toEqualTypeOf(); + expect(data.points).toBeDefined(); + expect(data.points).toBeGreaterThanOrEqual(0); + expectTypeOf(data.points).toEqualTypeOf(); + expect(data.gamePercentUnlocked).toBeDefined(); + expect(data.gamePercentUnlocked).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gamePercentUnlocked).toEqualTypeOf(); + expect(data.globalPercentUnlocked).toBeDefined(); + expect(data.globalPercentUnlocked).toBeGreaterThanOrEqual(0); + expectTypeOf(data.globalPercentUnlocked).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/Achievements/OneTimeAchievement.ts b/src/Structures/Static/Achievements/OneTimeAchievement.ts index 11ed7c1b8..044c7a3f8 100644 --- a/src/Structures/Static/Achievements/OneTimeAchievement.ts +++ b/src/Structures/Static/Achievements/OneTimeAchievement.ts @@ -6,7 +6,7 @@ class OneTimeAchievement extends BaseAchievement { globalPercentUnlocked: number; constructor(achievementName: string, data: Record) { super(achievementName, data); - this.points = data.points; + this.points = data.points || 0; this.gamePercentUnlocked = data.gamePercentUnlocked || 0; this.globalPercentUnlocked = data.globalPercentUnlocked || 0; } diff --git a/src/Structures/Static/Achievements/TieredAchievement.test.ts b/src/Structures/Static/Achievements/TieredAchievement.test.ts new file mode 100644 index 000000000..f68b7e31b --- /dev/null +++ b/src/Structures/Static/Achievements/TieredAchievement.test.ts @@ -0,0 +1,12 @@ +import TieredAchievement from './TieredAchievement.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { AchievementTier } from '../../../Types/Static.js'; + +test('TieredAchievement', () => { + const data = new TieredAchievement('mrrp', { stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(TieredAchievement); + expectTypeOf(data).toEqualTypeOf(); + expect(data.tiers).toBeDefined(); + expectTypeOf(data.tiers).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/Achievements/TieredAchievement.ts b/src/Structures/Static/Achievements/TieredAchievement.ts index 23a2c1b9f..ea999e413 100644 --- a/src/Structures/Static/Achievements/TieredAchievement.ts +++ b/src/Structures/Static/Achievements/TieredAchievement.ts @@ -5,7 +5,7 @@ class TieredAchievement extends BaseAchievement { tiers: AchievementTier[]; constructor(achievementName: string, data: Record) { super(achievementName, data); - this.tiers = data.tiers; + this.tiers = data.tiers || []; } } diff --git a/src/Structures/Static/Challenge.test.ts b/src/Structures/Static/Challenge.test.ts new file mode 100644 index 000000000..2936a6c37 --- /dev/null +++ b/src/Structures/Static/Challenge.test.ts @@ -0,0 +1,16 @@ +import Challenge from './Challenge.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { ChallengeReward } from '../../Types/Static.js'; + +test('Challenge', () => { + const data = new Challenge({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Challenge); + expectTypeOf(data).toEqualTypeOf(); + expect(data.id).toBeDefined(); + expectTypeOf(data.id).toEqualTypeOf(); + expect(data.name).toBeDefined(); + expectTypeOf(data.name).toEqualTypeOf(); + expect(data.rewards).toBeDefined(); + expectTypeOf(data.rewards).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/Challenge.ts b/src/Structures/Static/Challenge.ts index a246ffc24..7c90a8bd7 100644 --- a/src/Structures/Static/Challenge.ts +++ b/src/Structures/Static/Challenge.ts @@ -5,9 +5,9 @@ class Challenge { name: string; rewards: ChallengeReward[]; constructor(data: Record) { - this.id = data.id; - this.name = data.name; - this.rewards = data.rewards; + this.id = data.id || 'UNKNOWN'; + this.name = data.name || 'UNKNOWN'; + this.rewards = data.rewards || []; } } diff --git a/src/Structures/Static/Challenges.test.ts b/src/Structures/Static/Challenges.test.ts new file mode 100644 index 000000000..19c74a8b1 --- /dev/null +++ b/src/Structures/Static/Challenges.test.ts @@ -0,0 +1,18 @@ +import Challenges from './Challenges.js'; +import GameChallenges from './GameChallenges.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Challenges', () => { + const data = new Challenges({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Challenges); + expectTypeOf(data).toEqualTypeOf(); + expect(data.lastUpdatedTimestamp).toBeDefined(); + expect(data.lastUpdatedTimestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.lastUpdatedTimestamp).toEqualTypeOf(); + expect(data.lastUpdatedAt).toBeDefined(); + expect(data.lastUpdatedAt).toBeInstanceOf(Date); + expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); + expect(data.challengesPerGame).toBeDefined(); + expectTypeOf(data.challengesPerGame).toEqualTypeOf>(); +}); diff --git a/src/Structures/Static/Challenges.ts b/src/Structures/Static/Challenges.ts index f438890f4..e9b46e69a 100644 --- a/src/Structures/Static/Challenges.ts +++ b/src/Structures/Static/Challenges.ts @@ -6,10 +6,10 @@ class Challenges { lastUpdatedAt: Date; challengesPerGame: Record; constructor(data: Record) { - this.lastUpdatedTimestamp = data.lastUpdated; + this.lastUpdatedTimestamp = data.lastUpdated || 0; this.lastUpdatedAt = new Date(this.lastUpdatedTimestamp); this.challengesPerGame = {}; - Object.keys(data.challenges).forEach((game) => { + Object.keys(data?.challenges || {}).forEach((game) => { this.challengesPerGame[game] = new GameChallenges(game, data.challenges[game]); }); } diff --git a/src/Structures/Static/GameChallenges.test.ts b/src/Structures/Static/GameChallenges.test.ts new file mode 100644 index 000000000..784d219c0 --- /dev/null +++ b/src/Structures/Static/GameChallenges.test.ts @@ -0,0 +1,14 @@ +import Challenge from './Challenge.js'; +import GameChallenges from './GameChallenges.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameChallenges', () => { + const data = new GameChallenges('mrrp', [{ stats: 'meow' }]); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameChallenges); + expectTypeOf(data).toEqualTypeOf(); + expect(data.category).toBeDefined(); + expectTypeOf(data.category).toEqualTypeOf(); + expect(data.challenges).toBeDefined(); + expectTypeOf(data.challenges).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameChallenges.ts b/src/Structures/Static/GameChallenges.ts index 41f0114a4..f6dda8274 100644 --- a/src/Structures/Static/GameChallenges.ts +++ b/src/Structures/Static/GameChallenges.ts @@ -3,7 +3,7 @@ import Challenge from './Challenge.js'; class GameChallenges { category: string; challenges: Challenge[]; - constructor(name: string, data: { id: string; name: string; rewards: { type: string; amount: number }[] }[]) { + constructor(name: string, data: Record[]) { this.category = name; this.challenges = data.map((challenge) => new Challenge(challenge)); } diff --git a/src/Structures/Static/GameQuests.test.ts b/src/Structures/Static/GameQuests.test.ts new file mode 100644 index 000000000..c4bf76615 --- /dev/null +++ b/src/Structures/Static/GameQuests.test.ts @@ -0,0 +1,14 @@ +import GameQuests from './GameQuests.js'; +import Quest from './Quest.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameQuests', () => { + const data = new GameQuests('', [{ stats: 'meow' }]); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameQuests); + expectTypeOf(data).toEqualTypeOf(); + expect(data.game).toBeDefined(); + expectTypeOf(data.game).toEqualTypeOf(); + expect(data.quests).toBeDefined(); + expectTypeOf(data.quests).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameQuests.ts b/src/Structures/Static/GameQuests.ts index a2b28b74c..9789f0b65 100644 --- a/src/Structures/Static/GameQuests.ts +++ b/src/Structures/Static/GameQuests.ts @@ -3,9 +3,9 @@ import Quest from './Quest.js'; class GameQuests { game: string; quests: Quest[]; - constructor(name: string, data: Record) { + constructor(name: string, data: Record[]) { this.game = name; - this.quests = data.map((x: any) => new Quest(x)); + this.quests = data.map((quest: Record) => new Quest(quest)); } } diff --git a/src/Structures/Static/Quest.test.ts b/src/Structures/Static/Quest.test.ts index 9a284beff..541552f13 100644 --- a/src/Structures/Static/Quest.test.ts +++ b/src/Structures/Static/Quest.test.ts @@ -4,7 +4,7 @@ import { expect, expectTypeOf, test } from 'vitest'; import type { QuestReward, QuestType } from '../../Types/Static.js'; test('Quest', () => { - const data = new Quest({ status: 'meow' }); + const data = new Quest({ stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(Quest); expectTypeOf(data).toEqualTypeOf(); @@ -20,6 +20,9 @@ test('Quest', () => { expectTypeOf(data.type).toEqualTypeOf(); expect(data.objectives).toBeDefined(); expectTypeOf(data.objectives).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => string>(); expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.name); expectTypeOf(data.toString()).toEqualTypeOf(); }); diff --git a/src/Structures/Static/QuestObjective.test.ts b/src/Structures/Static/QuestObjective.test.ts new file mode 100644 index 000000000..973e640bc --- /dev/null +++ b/src/Structures/Static/QuestObjective.test.ts @@ -0,0 +1,17 @@ +import QuestObjective from './QuestObjective.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { QuestObjectiveType } from '../../Types/Static.js'; + +test('QuestObjective', () => { + const data = new QuestObjective({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(QuestObjective); + expectTypeOf(data).toEqualTypeOf(); + expect(data.id).toBeDefined(); + expectTypeOf(data.id).toEqualTypeOf(); + expect(data.type).toBeDefined(); + expectTypeOf(data.type).toEqualTypeOf(); + expect(data.amountNeeded).toBeDefined(); + expect(data.amountNeeded).toBeGreaterThanOrEqual(0); + expectTypeOf(data.amountNeeded).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/QuestObjective.ts b/src/Structures/Static/QuestObjective.ts index a10a6230b..a142ce891 100644 --- a/src/Structures/Static/QuestObjective.ts +++ b/src/Structures/Static/QuestObjective.ts @@ -5,7 +5,7 @@ class QuestObjective { type: QuestObjectiveType; amountNeeded: number; constructor(objective: Record) { - this.id = objective.id; + this.id = objective.id || 'UNKNOWN'; this.type = objective.type === 'IntegerObjective' ? 'Integer' : 'Boolean'; this.amountNeeded = parseInt(objective.integer || '1', 10); } diff --git a/src/Structures/Static/Quests.test.ts b/src/Structures/Static/Quests.test.ts new file mode 100644 index 000000000..35c7cf09d --- /dev/null +++ b/src/Structures/Static/Quests.test.ts @@ -0,0 +1,18 @@ +import GameQuests from './GameQuests.js'; +import Quests from './Quests.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('Quests', () => { + const data = new Quests({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(Quests); + expectTypeOf(data).toEqualTypeOf(); + expect(data.lastUpdatedTimestamp).toBeDefined(); + expect(data.lastUpdatedTimestamp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.lastUpdatedTimestamp).toEqualTypeOf(); + expect(data.lastUpdatedAt).toBeDefined(); + expect(data.lastUpdatedAt).toBeInstanceOf(Date); + expectTypeOf(data.lastUpdatedAt).toEqualTypeOf(); + expect(data.questsPerGame).toBeDefined(); + expectTypeOf(data.questsPerGame).toEqualTypeOf>(); +}); diff --git a/src/Structures/Static/Quests.ts b/src/Structures/Static/Quests.ts index 279d91346..fd6647c21 100644 --- a/src/Structures/Static/Quests.ts +++ b/src/Structures/Static/Quests.ts @@ -6,10 +6,10 @@ class Quests { lastUpdatedAt: Date; questsPerGame: Record; constructor(data: Record) { - this.lastUpdatedTimestamp = data.lastUpdated; + this.lastUpdatedTimestamp = data.lastUpdated || 0; this.lastUpdatedAt = new Date(this.lastUpdatedTimestamp); this.questsPerGame = {}; - Object.keys(data.quests).forEach((game) => { + Object.keys(data.quests || {}).forEach((game) => { this.questsPerGame[game] = new GameQuests(game, data.quests[game]); }); } diff --git a/src/Structures/Status.test.ts b/src/Structures/Status.test.ts index c52ae38ee..fa5d5c235 100644 --- a/src/Structures/Status.test.ts +++ b/src/Structures/Status.test.ts @@ -15,6 +15,9 @@ test('Status', () => { expectTypeOf(data.mode).toEqualTypeOf(); expect(data.map).toBeDefined(); expectTypeOf(data.map).toEqualTypeOf(); + expect(data.toString).toBeDefined(); + expectTypeOf(data.toString).toEqualTypeOf<() => 'Online' | 'Offline'>(); expect(data.toString()).toBeDefined(); + expect(data.toString()).toBe(data.online ? 'Online' : 'Offline'); expectTypeOf(data.toString()).toEqualTypeOf<'Online' | 'Offline'>(); }); diff --git a/src/Types/API.ts b/src/Types/API.ts index b0733a478..c5d269f31 100644 --- a/src/Types/API.ts +++ b/src/Types/API.ts @@ -1,5 +1,3 @@ -/* v8 ignore next 10000 */ - import type RequestData from '../Private/RequestData.ts'; import type SkyBlockAuction from '../Structures/SkyBlock/Auctions/SkyBlockAuction.js'; import type SkyBlockAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockAuctionInfo.js'; diff --git a/src/Types/Booster.ts b/src/Types/Booster.ts index 3c17dc348..dbcd95e22 100644 --- a/src/Types/Booster.ts +++ b/src/Types/Booster.ts @@ -1,3 +1 @@ -/* v8 ignore next 10000 */ - export type BoosterType = 'STACKED' | 'QUEUED' | 'ACTIVE'; diff --git a/src/Types/Client.ts b/src/Types/Client.ts index f22546f04..877fabc7d 100644 --- a/src/Types/Client.ts +++ b/src/Types/Client.ts @@ -1,5 +1,3 @@ -/* v8 ignore next 10000 */ - export interface ClientOptions { cache?: boolean; cacheTime?: number; diff --git a/src/Types/Color.ts b/src/Types/Color.ts index 84d2c9754..cf49dd30f 100644 --- a/src/Types/Color.ts +++ b/src/Types/Color.ts @@ -1,5 +1,3 @@ -/* v8 ignore next 10000 */ - export type ColorCode = | 'BLACK' | 'DARK_BLUE' diff --git a/src/Types/Game.ts b/src/Types/Game.ts index 81cce4e75..e5665402c 100644 --- a/src/Types/Game.ts +++ b/src/Types/Game.ts @@ -1,5 +1,3 @@ -/* v8 ignore next 10000 */ - export type GameID = | 2 | 3 diff --git a/src/Types/Global.ts b/src/Types/Global.ts index c4b2f0f7e..5df8973f0 100644 --- a/src/Types/Global.ts +++ b/src/Types/Global.ts @@ -1,5 +1,3 @@ -/* v8 ignore next 10000 */ - export type UUID = string; export type UserInput = string; export type SortName = 'a_to_z' | 'z_to_a'; diff --git a/src/Types/Guild.ts b/src/Types/Guild.ts index 6c4625161..3fa114ab5 100644 --- a/src/Types/Guild.ts +++ b/src/Types/Guild.ts @@ -1,5 +1,3 @@ -/* v8 ignore next 10000 */ - export interface ExpHistory { day: string; date: Date | undefined; diff --git a/src/Types/Player.ts b/src/Types/Player.ts index 2f65a359c..ae4f12322 100644 --- a/src/Types/Player.ts +++ b/src/Types/Player.ts @@ -1,4 +1,3 @@ -/* v8 ignore next 10000 */ // Credits: Pixelic: https://github.com/pixelicc - Most types in player import PitInventoryItem from '../Structures/MiniGames/Pit/PitInventoryItem.js'; diff --git a/src/Types/Requests.ts b/src/Types/Requests.ts index 0ba337f3b..3f9335a57 100644 --- a/src/Types/Requests.ts +++ b/src/Types/Requests.ts @@ -1,5 +1,3 @@ -/* v8 ignore next 10000 */ - export interface RequestOptions { raw?: boolean; noCache?: boolean; diff --git a/src/Types/SkyBlock.ts b/src/Types/SkyBlock.ts index 007c789d2..7fe5e1b2a 100644 --- a/src/Types/SkyBlock.ts +++ b/src/Types/SkyBlock.ts @@ -1,5 +1,3 @@ -/* v8 ignore next 10000 */ - import type SkyBlockMemberLeveling from '../Structures/SkyBlock/Member/SkyBlockMemberLeveling.ts'; import type SkyBlockMemberPlayerData from '../Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerData.ts'; import type SkyBlockProfile from '../Structures/SkyBlock/Profile/SkyBlockProfile.ts'; diff --git a/src/Types/Static.ts b/src/Types/Static.ts index 5748a76c6..3a7720677 100644 --- a/src/Types/Static.ts +++ b/src/Types/Static.ts @@ -1,5 +1,3 @@ -/* v8 ignore next 10000 */ - export type QuestObjectiveType = 'Integer' | 'Boolean'; export type QuestType = 'Daily' | 'Weekly'; diff --git a/src/Utils/ParseBoosterType.ts b/src/Utils/ParseBoosterType.ts new file mode 100644 index 000000000..8c6254eb5 --- /dev/null +++ b/src/Utils/ParseBoosterType.ts @@ -0,0 +1,7 @@ +import type { BoosterType } from '../Types/Booster.ts'; + +export default function ParseBoosterType(data: Record): BoosterType { + if (data.stacked === true) return 'STACKED'; + if (!data.stacked) return 'QUEUED'; + return 'ACTIVE'; +} diff --git a/src/index.ts b/src/index.ts index 631c243e6..78e35247e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ -/* v8 ignore next 1000 */ +/* v8 ignore next 10000 */ /* eslint-disable @stylistic/max-len */ import Client from './Client.js'; @@ -20,6 +20,7 @@ export * from './Utils/Constants.js'; export * from './Utils/Divide.js'; export * from './Utils/Guild.js'; export * from './Utils/Oscillation.js'; +export * from './Utils/ParseBoosterType.js'; export * from './Utils/RemoveSnakeCase.js'; export * from './Utils/Romanize.js'; export * from './Utils/SkyBlockUtils.js'; diff --git a/vitest.config.ts b/vitest.config.ts index caee54edf..8b2f7cd0a 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -2,8 +2,18 @@ import { configDefaults, defineConfig } from 'vitest/config'; export default defineConfig({ test: { - exclude: [...configDefaults.exclude, 'dist/*', 'coverage/*'], + exclude: [...configDefaults.exclude, 'dist/**', 'coverage/**', 'docs/**', '.github/**'], setupFiles: ['./vitest.setup.ts'], - testTimeout: 30000 + testTimeout: 30000, + coverage: { + exclude: [ + ...(configDefaults.coverage.exclude || []), + 'dist/**', + 'coverage/**', + 'docs/**', + 'src/Types/**', + '.github/**' + ] + } } }); From 5c93ca0425eaabc922fbd3686208753efc2ffe14 Mon Sep 17 00:00:00 2001 From: Saad Nadeem <88615188+BridgeSenseDev@users.noreply.github.com> Date: Wed, 19 Nov 2025 23:53:21 -0500 Subject: [PATCH 085/124] fix(getSkyBlockProfiles): fetching garden & museum while either are disabled (#684) * fix: museum and garden options * pnpm lint * only fetch when options explicitly set to true Co-authored-by: Jacob * simplify ternary * also respect options in fetchSkyblockProfile * fix(getSkyBlockProfile/s): garden & museum types --------- Co-authored-by: Jacob --- src/API/getSkyBlockProfile.ts | 4 ++-- src/API/getSkyBlockProfiles.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/API/getSkyBlockProfile.ts b/src/API/getSkyBlockProfile.ts index 1a865eb6a..cc3bb4c0e 100644 --- a/src/API/getSkyBlockProfile.ts +++ b/src/API/getSkyBlockProfile.ts @@ -12,8 +12,8 @@ class getSkyBlockProfile extends Endpoint { const res = await this.client.requestHandler.request(`/skyblock/profile?profile=${profileId}`, options); if (res.options.raw) return res; if (!res.data.profile) throw new Error(Errors.NO_SKYBLOCK_PROFILES); - const garden = await this.handleGettingSkyBlockGarden(res.data.profile.profile_id); - const museum = await this.handleGettingSkyBlockMuseum(res.data.profile.profile_id); + const garden = options?.museum ? await this.handleGettingSkyBlockGarden(res.data.profile.profile_id) : undefined; + const museum = options?.museum ? await this.handleGettingSkyBlockMuseum(res.data.profile.profile_id) : undefined; const parsedProfile = new SkyBlockProfile(res.data.profile, { uuid: null, garden, museum }); return parsedProfile; } diff --git a/src/API/getSkyBlockProfiles.ts b/src/API/getSkyBlockProfiles.ts index c73dc9f58..72f228b60 100644 --- a/src/API/getSkyBlockProfiles.ts +++ b/src/API/getSkyBlockProfiles.ts @@ -19,8 +19,8 @@ class getSkyBlockProfiles extends Endpoint { if (!res.data.profiles || !res.data.profiles.length) throw new Error(Errors.NO_SKYBLOCK_PROFILES); const profiles: Map = new Map(); for (const profile of res.data.profiles) { - const garden = await this.handleGettingSkyBlockGarden(profile.profile_id); - const museum = await this.handleGettingSkyBlockMuseum(profile.profile_id); + const garden = options?.garden ? await this.handleGettingSkyBlockGarden(profile.profile_id) : undefined; + const museum = options?.museum ? await this.handleGettingSkyBlockMuseum(profile.profile_id) : undefined; const parsedProfile = new SkyBlockProfile(profile, { uuid: query, garden, museum }); profiles.set(parsedProfile.profileName, parsedProfile); } From a864cd5aade5122899ce2a6a379eee2b6f65d577 Mon Sep 17 00:00:00 2001 From: Saad Nadeem <88615188+BridgeSenseDev@users.noreply.github.com> Date: Thu, 20 Nov 2025 01:11:58 -0500 Subject: [PATCH 086/124] fix(RequestHandler): cache by default (#686) * fix(RequestHandler): cache by default * fix(RequestHandler): cache raw requests --- src/Private/RequestHandler.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Private/RequestHandler.ts b/src/Private/RequestHandler.ts index 70ac9fbbe..76bb2b09c 100644 --- a/src/Private/RequestHandler.ts +++ b/src/Private/RequestHandler.ts @@ -24,7 +24,7 @@ class RequestHandler { noCache: options?.noCache ?? false, noCacheCheck: options?.noCacheCheck ?? false }; - if (options.noCacheCheck && this.client.cacheHandler.has(endpoint)) { + if (!options.noCacheCheck && this.client.cacheHandler.has(endpoint)) { const data = this.client.cacheHandler.get(endpoint); return new RequestData(data.data, data.headers, { status: 200, @@ -71,7 +71,7 @@ class RequestHandler { cached: false }); if (options.noCache) return requestData; - if (this.client.options.cache && !options.raw) { + if (this.client.options.cache) { this.client.cacheHandler.set(endpoint, requestData); } return requestData; From 516f89ac5c764edabd74f38538d7fe8373b5eed3 Mon Sep 17 00:00:00 2001 From: Jacob Date: Thu, 20 Nov 2025 14:14:31 +0800 Subject: [PATCH 087/124] fix(checkCoverage) --- .github/scripts/checkCoverage.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/scripts/checkCoverage.ts b/.github/scripts/checkCoverage.ts index ba87b3f3a..66990138e 100644 --- a/.github/scripts/checkCoverage.ts +++ b/.github/scripts/checkCoverage.ts @@ -18,24 +18,24 @@ const baseline = 95; const statementsCoverage = (info.coveredStatements / info.statements) * 100; if (statementsCoverage <= baseline) { - console.log(`Statements is required to be ${baseline}% or higher. Currently ${statementsCoverage.toFixed(2)}`); - process.exit(); + throw new Error(`Statements is required to be ${baseline}% or higher. Currently ${statementsCoverage.toFixed(2)}`); } const conditionalsCoverage = (info.coveredConditionals / info.conditionals) * 100; if (conditionalsCoverage <= baseline) { - console.log(`Conditionals is required to be ${baseline}% or higher. Currently ${conditionalsCoverage.toFixed(2)}`); - process.exit(); + throw new Error( + `Conditionals is required to be ${baseline}% or higher. Currently ${conditionalsCoverage.toFixed(2)}` + ); } const methodsCoverage = (info.coveredMethods / info.methods) * 100; if (methodsCoverage <= baseline) { - console.log(`Methods is required to be ${baseline}% or higher. Currently ${methodsCoverage.toFixed(2)}`); - process.exit(); + throw new Error(`Methods is required to be ${baseline}% or higher. Currently ${methodsCoverage.toFixed(2)}`); } const combinedCoverage = statementsCoverage + conditionalsCoverage + methodsCoverage; if (combinedCoverage <= baseline) { - console.log(`Everything Combined is required to be ${baseline}% or higher. Currently ${combinedCoverage.toFixed(2)}`); - process.exit(); + throw new Error( + `Everything Combined is required to be ${baseline}% or higher. Currently ${combinedCoverage.toFixed(2)}` + ); } From 89b64339ace36002c4f3f3c7acecfef038ed5109 Mon Sep 17 00:00:00 2001 From: Jacob Date: Sun, 23 Nov 2025 15:47:38 +0800 Subject: [PATCH 088/124] refactor(BedWars) Signed-off-by: Jacob --- .github/scripts/generateIndexFile.ts | 4 +- package.json | 1 + src/API/index.ts | 2 +- .../MiniGames/Arcade/Arcade.test.ts | 11 +- src/Structures/MiniGames/Arcade/Arcade.ts | 7 +- .../MiniGames/BedWars/BedWars.test.ts | 190 +-- src/Structures/MiniGames/BedWars/BedWars.ts | 254 ++-- .../MiniGames/BedWars/BedWarsBeds.test.ts | 6 +- .../MiniGames/BedWars/BedWarsBeds.ts | 11 +- .../MiniGames/BedWars/BedWarsBoxes.test.ts | 57 + .../MiniGames/BedWars/BedWarsBoxes.ts | 38 + .../BedWarsChallenge.test.ts | 15 + .../BedWarsChallenges/BedWarsChallenge.ts | 12 + .../BedWarsChallenges.test.ts | 109 ++ .../BedWarsChallenges/BedWarsChallenges.ts | 75 + .../BedWars/BedWarsCollectedItems.test.ts | 21 - .../BedWars/BedWarsCollectedItems.ts | 14 - .../BedWars/BedWarsDreamMode.test.ts | 16 - .../MiniGames/BedWars/BedWarsDreamMode.ts | 13 - .../BedWars/BedWarsDreamStats.test.ts | 25 - .../MiniGames/BedWars/BedWarsDreamStats.ts | 18 - .../MiniGames/BedWars/BedWarsEightOne.test.ts | 19 + .../MiniGames/BedWars/BedWarsEightOne.ts | 15 + .../MiniGames/BedWars/BedWarsEightTwo.test.ts | 40 + .../MiniGames/BedWars/BedWarsEightTwo.ts | 29 + .../BedWars/BedWarsFavorites.test.ts | 43 + .../MiniGames/BedWars/BedWarsFavorites.ts | 40 + .../BedWars/BedWarsFigurines.test.ts | 17 + .../MiniGames/BedWars/BedWarsFigurines.ts | 14 + .../MiniGames/BedWars/BedWarsFourFour.test.ts | 40 + .../MiniGames/BedWars/BedWarsFourFour.ts | 29 + .../BedWars/BedWarsFourThree.test.ts | 9 + .../MiniGames/BedWars/BedWarsFourThree.ts | 9 + .../BedWars/BedWarsItemsPurchased.test.ts | 15 + .../BedWars/BedWarsItemsPurchased.ts | 13 + .../BedWarsKillsDeaths.test.ts | 64 + .../BedWarsKillsDeaths/BedWarsKillsDeaths.ts | 45 + .../BedWarsKillsDeathsType.test.ts | 18 + .../BedWarsKillsDeathsType.ts | 18 + .../MiniGames/BedWars/BedWarsMode.test.ts | 56 +- .../MiniGames/BedWars/BedWarsMode.ts | 46 +- .../BedWarsPractice/BedWarsPractice.test.ts | 26 + .../BedWarsPractice/BedWarsPractice.ts | 20 + .../BedWarsPracticeBridging.test.ts | 4 +- .../BedWarsPracticeBridging.ts | 6 +- .../BedWarsPracticeBridgingRecords.test.ts | 19 + .../BedWarsPracticeBridgingRecords.ts | 14 + ...arsPracticeBridgingRecordsDistance.test.ts | 19 + .../BedWarsPracticeBridgingRecordsDistance.ts | 15 + ...arsPracticeBridgingRecordsEevation.test.ts | 15 + .../BedWarsPracticeBridgingRecordsEevation.ts | 19 + .../BedWarsPracticeMode.test.ts | 24 + .../BedWarsPractice/BedWarsPracticeMode.ts | 18 + .../BedWarsPrivateGameSettings.test.ts | 37 + .../BedWars/BedWarsPrivateGameSettings.ts | 35 + .../BedWars/BedWarsResourcesCollected.test.ts | 34 + .../BedWars/BedWarsResourcesCollected.ts | 27 + .../MiniGames/BedWars/BedWarsSettings.test.ts | 18 + .../MiniGames/BedWars/BedWarsSettings.ts | 16 + .../BedWarsSlumber/BedWarsSlumber.test.ts | 57 + .../BedWars/BedWarsSlumber/BedWarsSlumber.ts | 44 + .../BedWarsSlumberMinion.test.ts | 24 + .../BedWarsSlumber/BedWarsSlumberMinion.ts | 16 + .../BedWarsSlumberPhase.test.ts | 12 + .../BedWarsSlumber/BedWarsSlumberPhase.ts | 8 + .../BedWarsSlumberPhaseThree.test.ts | 12 + .../BedWarsSlumberPhaseThree.ts | 8 + .../BedWarsSlumberQuest.test.ts | 39 + .../BedWarsSlumberQuest.ts | 29 + .../BedWarsSlumberQuestGamblerGeorge.test.ts | 24 + .../BedWarsSlumberQuestGamblerGeorge.ts | 18 + .../BedWarsSlumberQuestItem.test.ts | 135 ++ .../BedWarsSlumberQuestItem.ts | 90 ++ .../BedWarsSlumberQuestNPC.test.ts | 25 + .../BedWarsSlumberQuestNPC.ts | 22 + .../BedWarsSlumberQuestNPCSBoolean.test.ts | 99 ++ .../BedWarsSlumberQuestNPCSBoolean.ts | 96 ++ .../BedWarsSlumberQuestNPCSNumber.test.ts | 144 ++ .../BedWarsSlumberQuestNPCSNumber.ts | 96 ++ .../BedWarsSlumberQuestObjective.test.ts | 167 +++ .../BedWarsSlumberQuestObjective.ts | 164 ++ .../BedWarsSlumber/BedWarsSlumberRoom.test.ts | 35 + .../BedWarsSlumber/BedWarsSlumberRoom.ts | 32 + .../BedWarsSlumberSandman.test.ts | 15 + .../BedWarsSlumber/BedWarsSlumberSandman.ts | 10 + .../MiniGames/BedWars/BedWarsTwoFour.test.ts | 13 + .../MiniGames/BedWars/BedWarsTwoFour.ts | 11 + .../Practice/BedWarsPracticeBase.test.ts | 13 - .../BedWars/Practice/BedWarsPracticeBase.ts | 10 - .../BedWarsPracticeBaseBlocksPlaced.test.ts | 12 - .../BedWarsPracticeBaseBlocksPlaced.ts | 11 - .../BedWarsPracticeBridgingRecords.test.ts | 19 - .../BedWarsPracticeBridgingRecords.ts | 14 - .../BedWarsPracticeModeAttempts.test.ts | 18 - .../Practice/BedWarsPracticeModeAttempts.ts | 12 - .../Practice/BedWarsPracticeRecord.test.ts | 19 - .../BedWars/Practice/BedWarsPracticeRecord.ts | 14 - .../BedWarsPracticeRecordElevation.test.ts | 15 - .../BedWarsPracticeRecordElevation.ts | 16 - .../Practice/BedWarsPracticeStats.test.ts | 27 - .../BedWars/Practice/BedWarsPracticeStats.ts | 21 - src/Types/Player.ts | 1317 ++++++++++++++++- src/Utils/Constants.ts | 56 +- src/Utils/ParseBedWarsMode.ts | 3 + src/index.ts | 130 +- 105 files changed, 4336 insertions(+), 680 deletions(-) create mode 100644 src/Structures/MiniGames/BedWars/BedWarsBoxes.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsBoxes.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsChallenges/BedWarsChallenge.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsChallenges/BedWarsChallenge.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsChallenges/BedWarsChallenges.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsChallenges/BedWarsChallenges.ts delete mode 100644 src/Structures/MiniGames/BedWars/BedWarsCollectedItems.test.ts delete mode 100644 src/Structures/MiniGames/BedWars/BedWarsCollectedItems.ts delete mode 100644 src/Structures/MiniGames/BedWars/BedWarsDreamMode.test.ts delete mode 100644 src/Structures/MiniGames/BedWars/BedWarsDreamMode.ts delete mode 100644 src/Structures/MiniGames/BedWars/BedWarsDreamStats.test.ts delete mode 100644 src/Structures/MiniGames/BedWars/BedWarsDreamStats.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsEightOne.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsEightOne.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsEightTwo.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsEightTwo.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsFavorites.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsFavorites.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsFigurines.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsFigurines.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsFourFour.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsFourFour.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsFourThree.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsFourThree.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsItemsPurchased.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsItemsPurchased.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeaths.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeaths.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeathsType.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeathsType.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPractice.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPractice.ts rename src/Structures/MiniGames/BedWars/{Practice => BedWarsPractice}/BedWarsPracticeBridging.test.ts (81%) rename src/Structures/MiniGames/BedWars/{Practice => BedWarsPractice}/BedWarsPracticeBridging.ts (63%) create mode 100644 src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecords.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecords.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecordsDistance.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecordsDistance.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecordsEevation.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecordsEevation.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeMode.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeMode.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsPrivateGameSettings.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsPrivateGameSettings.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsResourcesCollected.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsResourcesCollected.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSettings.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSettings.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumber.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumber.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberMinion.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberMinion.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberPhase.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberPhase.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberPhaseThree.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberPhaseThree.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuest.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuest.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestGamblerGeorge.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestGamblerGeorge.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestItem.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestItem.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPC.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPC.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPCSBoolean.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPCSBoolean.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPCSNumber.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPCSNumber.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestObjective.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestObjective.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberRoom.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberRoom.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberSandman.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberSandman.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsTwoFour.test.ts create mode 100644 src/Structures/MiniGames/BedWars/BedWarsTwoFour.ts delete mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBase.test.ts delete mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBase.ts delete mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBaseBlocksPlaced.test.ts delete mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBaseBlocksPlaced.ts delete mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridgingRecords.test.ts delete mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridgingRecords.ts delete mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeModeAttempts.test.ts delete mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeModeAttempts.ts delete mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecord.test.ts delete mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecord.ts delete mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecordElevation.test.ts delete mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecordElevation.ts delete mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeStats.test.ts delete mode 100644 src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeStats.ts create mode 100644 src/Utils/ParseBedWarsMode.ts diff --git a/.github/scripts/generateIndexFile.ts b/.github/scripts/generateIndexFile.ts index f4e105fcf..fbb3acba7 100644 --- a/.github/scripts/generateIndexFile.ts +++ b/.github/scripts/generateIndexFile.ts @@ -6,7 +6,7 @@ const prettierConfig = JSON.parse(readFileSync('.prettierrc').toString('utf-8')) async function generateBaseIndex() { const lines: string[] = [ - '', + '/* v8 ignore next 10000 */', '/* eslint-disable @stylistic/max-len */', '', '', @@ -64,7 +64,7 @@ async function generateBaseIndex() { } async function generateAPIIndex() { - const lines: string[] = ['/* v8 ignore next 400 */', '']; + const lines: string[] = ['/* v8 ignore next 10000 */', '']; const importNames: string[] = []; diff --git a/package.json b/package.json index 3822b5875..bac6715d6 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "test:coverage": "pnpm exec vitest run --coverage", "test:coverage:check": "pnpm exec tsx .github/scripts/checkCoverage.ts", "test:ui": "pnpm exec vitest --ui --coverage", + "scripts:generate:index": "pnpm exec tsx .github/scripts/generateIndexFile.ts", "docgen": "pnpm exec typedoc" }, "engines": { diff --git a/src/API/index.ts b/src/API/index.ts index efe40941f..302f8267f 100644 --- a/src/API/index.ts +++ b/src/API/index.ts @@ -1,4 +1,4 @@ -/* v8 ignore next 400 */ +/* v8 ignore next 10000 */ import getAchievements from './getAchievements.js'; import getActiveHouses from './getActiveHouses.js'; diff --git a/src/Structures/MiniGames/Arcade/Arcade.test.ts b/src/Structures/MiniGames/Arcade/Arcade.test.ts index 07e1eb1ff..22557f441 100644 --- a/src/Structures/MiniGames/Arcade/Arcade.test.ts +++ b/src/Structures/MiniGames/Arcade/Arcade.test.ts @@ -35,6 +35,7 @@ import type { ArcadeProjectileTrail, ArcadeVictoryDance, Language, + PlayerGeneralSelectedCosmetic, ShopSort } from '../../../Types/Player.js'; @@ -44,11 +45,15 @@ test('Arcade', () => { expect(data).toBeInstanceOf(Arcade); expectTypeOf(data).toEqualTypeOf(); expect(data.activeMovementTrail).toBeDefined(); - expectTypeOf(data.activeMovementTrail).toEqualTypeOf(); + expectTypeOf(data.activeMovementTrail).toEqualTypeOf< + ArcadeMovementTrail | PlayerGeneralSelectedCosmetic | 'UNKNOWN' + >(); expect(data.activeProjectileTrail).toBeDefined(); - expectTypeOf(data.activeProjectileTrail).toEqualTypeOf(); + expectTypeOf(data.activeProjectileTrail).toEqualTypeOf< + ArcadeProjectileTrail | PlayerGeneralSelectedCosmetic | 'UNKNOWN' + >(); expect(data.activeVictoryDance).toBeDefined(); - expectTypeOf(data.activeVictoryDance).toEqualTypeOf(); + expectTypeOf(data.activeVictoryDance).toEqualTypeOf(); expect(data.blood).toBeDefined(); expectTypeOf(data.blood).toEqualTypeOf(); expect(data.bountyHead).toBeDefined(); diff --git a/src/Structures/MiniGames/Arcade/Arcade.ts b/src/Structures/MiniGames/Arcade/Arcade.ts index 81514c1fe..3ec26790d 100644 --- a/src/Structures/MiniGames/Arcade/Arcade.ts +++ b/src/Structures/MiniGames/Arcade/Arcade.ts @@ -34,13 +34,14 @@ import type { ArcadeProjectileTrail, ArcadeVictoryDance, Language, + PlayerGeneralSelectedCosmetic, ShopSort } from '../../../Types/Player.ts'; class Arcade { - activeMovementTrail: ArcadeMovementTrail | 'UNKNOWN'; - activeProjectileTrail: ArcadeProjectileTrail | 'UNKNOWN'; - activeVictoryDance: ArcadeVictoryDance | 'UNKNOWN'; + activeMovementTrail: ArcadeMovementTrail | PlayerGeneralSelectedCosmetic | 'UNKNOWN'; + activeProjectileTrail: ArcadeProjectileTrail | PlayerGeneralSelectedCosmetic | 'UNKNOWN'; + activeVictoryDance: ArcadeVictoryDance | PlayerGeneralSelectedCosmetic | 'UNKNOWN'; blood: boolean; bountyHead: ArcadeBountyHead; tokens: number; diff --git a/src/Structures/MiniGames/BedWars/BedWars.test.ts b/src/Structures/MiniGames/BedWars/BedWars.test.ts index ee969a01d..b5063be3f 100644 --- a/src/Structures/MiniGames/BedWars/BedWars.test.ts +++ b/src/Structures/MiniGames/BedWars/BedWars.test.ts @@ -1,98 +1,120 @@ import BedWars from './BedWars.js'; -import BedWarsBeds from './BedWarsBeds.js'; -import BedWarsCollectedItems from './BedWarsCollectedItems.js'; -import BedWarsDreamStats from './BedWarsDreamStats.js'; -import BedWarsMode from './BedWarsMode.js'; -import BedWarsPracticeStats from './Practice/BedWarsPracticeStats.js'; +import BedWarsBoxes from './BedWarsBoxes.js'; +import BedWarsFavorites from './BedWarsFavorites.js'; +import BedWarsFigurines from './BedWarsFigurines.js'; +import BedWarsPrivateGameSettings from './BedWarsPrivateGameSettings.js'; +import BedWarsSettings from './BedWarsSettings.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type { BedWarsPrestige } from '../../../Types/Player.js'; +import type { + BedWarsBedDestroy, + BedWarsDeathCry, + BedWarsGlyph, + BedWarsIslandTopper, + BedWarsKillEffect, + BedWarsKillMessage, + BedWarsNPCSkin, + BedWarsPrestige, + BedWarsProjectileTrail, + BedWarsQuickbuyPrivacy, + BedWarsSpray, + BedWarsStartingWeapon, + BedWarsUltimate, + BedWarsVictoryDance, + BedWarsWoodSkin, + PlayerGeneralSelectedCosmetic, + ShopSort +} from '../../../Types/Player.js'; test('BedWars', () => { const data = new BedWars({ stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(BedWars); expectTypeOf(data).toEqualTypeOf(); - expect(data.tokens).toBeDefined(); - expect(data.tokens).toBeGreaterThanOrEqual(0); - expectTypeOf(data.tokens).toEqualTypeOf(); - expect(data.level).toBeDefined(); - expect(data.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.level).toEqualTypeOf(); expect(data.experience).toBeDefined(); expect(data.experience).toBeGreaterThanOrEqual(0); expectTypeOf(data.experience).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expect(data.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.level).toEqualTypeOf(); expect(data.prestige).toBeDefined(); expectTypeOf(data.prestige).toEqualTypeOf(); - expect(data.playedGames).toBeDefined(); - expect(data.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.playedGames).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.winStreak).toBeDefined(); - expect(data.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winStreak).toEqualTypeOf(); - expect(data.kills).toBeDefined(); - expect(data.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.kills).toEqualTypeOf(); - expect(data.finalKills).toBeDefined(); - expect(data.finalKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.finalKills).toEqualTypeOf(); - expect(data.losses).toBeDefined(); - expect(data.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.losses).toEqualTypeOf(); - expect(data.deaths).toBeDefined(); - expect(data.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.deaths).toEqualTypeOf(); - expect(data.finalDeaths).toBeDefined(); - expect(data.finalDeaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.finalDeaths).toEqualTypeOf(); - expect(data.collectedItemsTotal).toBeDefined(); - expect(data.collectedItemsTotal).toBeInstanceOf(BedWarsCollectedItems); - expectTypeOf(data.collectedItemsTotal).toEqualTypeOf(); - expect(data.beds).toBeDefined(); - expect(data.beds).toBeInstanceOf(BedWarsBeds); - expectTypeOf(data.beds).toEqualTypeOf(); - expect(data.KDR).toBeDefined(); - expect(data.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.KDR).toEqualTypeOf(); - expect(data.FKDR).toBeDefined(); - expect(data.FKDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.FKDR).toEqualTypeOf(); - expect(data.WLR).toBeDefined(); - expect(data.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.WLR).toEqualTypeOf(); - expect(data.solo).toBeDefined(); - expect(data.solo).toBeInstanceOf(BedWarsMode); - expectTypeOf(data.solo).toEqualTypeOf(); - expect(data.doubles).toBeDefined(); - expect(data.doubles).toBeInstanceOf(BedWarsMode); - expectTypeOf(data.doubles).toEqualTypeOf(); - expect(data.threes).toBeDefined(); - expect(data.threes).toBeInstanceOf(BedWarsMode); - expectTypeOf(data.threes).toEqualTypeOf(); - expect(data.fours).toBeDefined(); - expect(data.fours).toBeInstanceOf(BedWarsMode); - expectTypeOf(data.fours).toEqualTypeOf(); - expect(data['4v4']).toBeDefined(); - expect(data['4v4']).toBeInstanceOf(BedWarsMode); - expectTypeOf(data['4v4']).toEqualTypeOf(); - expect(data.dream).toBeDefined(); - expect(data.dream).toBeInstanceOf(BedWarsDreamStats); - expectTypeOf(data.dream).toEqualTypeOf(); - expect(data.castle).toBeDefined(); - expect(data.castle).toBeInstanceOf(BedWarsMode); - expectTypeOf(data.castle).toEqualTypeOf(); - expect(data.oneBlock).toBeDefined(); - expect(data.oneBlock).toBeInstanceOf(BedWarsMode); - expectTypeOf(data.oneBlock).toEqualTypeOf(); - expect(data.practice).toBeDefined(); - expect(data.practice).toBeInstanceOf(BedWarsPracticeStats); - expectTypeOf(data.practice).toEqualTypeOf(); - expect(data.slumberTickets).toBeDefined(); - expect(data.slumberTickets).toBeGreaterThanOrEqual(0); - expectTypeOf(data.slumberTickets).toEqualTypeOf(); - expect(data.totalSlumberTicket).toBeDefined(); - expect(data.totalSlumberTicket).toBeGreaterThanOrEqual(0); - expectTypeOf(data.totalSlumberTicket).toEqualTypeOf(); + expect(data.activeBedDestroy).toBeDefined(); + expectTypeOf(data.activeBedDestroy).toEqualTypeOf(); + expect(data.activeDeathCry).toBeDefined(); + expectTypeOf(data.activeDeathCry).toEqualTypeOf(); + expect(data.activeGlyph).toBeDefined(); + expectTypeOf(data.activeGlyph).toEqualTypeOf(); + expect(data.activeIslandTopper).toBeDefined(); + expectTypeOf(data.activeIslandTopper).toEqualTypeOf< + BedWarsIslandTopper | PlayerGeneralSelectedCosmetic | 'UNKNOWN' + >(); + expect(data.activeKillEffect).toBeDefined(); + expectTypeOf(data.activeKillEffect).toEqualTypeOf(); + expect(data.activeKillMessages).toBeDefined(); + expectTypeOf(data.activeKillMessages).toEqualTypeOf(); + expect(data.activeNPCSkin).toBeDefined(); + expectTypeOf(data.activeNPCSkin).toEqualTypeOf(); + expect(data.activeProjectileTrail).toBeDefined(); + expectTypeOf(data.activeProjectileTrail).toEqualTypeOf< + BedWarsProjectileTrail | PlayerGeneralSelectedCosmetic | 'UNKNOWN' + >(); + expect(data.activeSprays).toBeDefined(); + expectTypeOf(data.activeSprays).toEqualTypeOf(); + expect(data.activeVictoryDance).toBeDefined(); + expectTypeOf(data.activeVictoryDance).toEqualTypeOf< + BedWarsVictoryDance | PlayerGeneralSelectedCosmetic | 'UNKNOWN' + >(); + expect(data.activeWoodType).toBeDefined(); + expectTypeOf(data.activeWoodType).toEqualTypeOf(); + expect(data.activeStartingWeapon).toBeDefined(); + expectTypeOf(data.activeStartingWeapon).toEqualTypeOf< + BedWarsStartingWeapon | PlayerGeneralSelectedCosmetic | 'UNKNOWN' + >(); + expect(data.tokens).toBeDefined(); + expect(data.tokens).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tokens).toEqualTypeOf(); + expect(data.firstJoin7).toBeDefined(); + expectTypeOf(data.firstJoin7).toEqualTypeOf(); + expect(data.glyphStorage).toBeDefined(); + expectTypeOf(data.glyphStorage).toEqualTypeOf(); + expect(data.packages).toBeDefined(); + expectTypeOf(data.packages).toEqualTypeOf(); + expect(data.quickbuyPrivacy).toBeDefined(); + expectTypeOf(data.quickbuyPrivacy).toEqualTypeOf(); + expect(data.seenBetaMenu).toBeDefined(); + expectTypeOf(data.seenBetaMenu).toEqualTypeOf(); + expect(data.selectedUltimate).toBeDefined(); + expectTypeOf(data.selectedUltimate).toEqualTypeOf(); + expect(data.shopSort).toBeDefined(); + expectTypeOf(data.shopSort).toEqualTypeOf(); + expect(data.shopSortEnableOwnedFirst).toBeDefined(); + expectTypeOf(data.shopSortEnableOwnedFirst).toEqualTypeOf(); + expect(data.spookyOpenAch).toBeDefined(); + expect(data.spookyOpenAch).toBeGreaterThanOrEqual(0); + expectTypeOf(data.spookyOpenAch).toEqualTypeOf(); + expect(data.sprayGlyphField).toBeDefined(); + expectTypeOf(data.sprayGlyphField).toEqualTypeOf(); + expect(data.sprayStorage).toBeDefined(); + expectTypeOf(data.sprayStorage).toEqualTypeOf(); + expect(data.understandsResourceBank).toBeDefined(); + expectTypeOf(data.understandsResourceBank).toEqualTypeOf(); + expect(data.understandsStreaks).toBeDefined(); + expectTypeOf(data.understandsStreaks).toEqualTypeOf(); + expect(data.updateBook).toBeDefined(); + expectTypeOf(data.updateBook).toEqualTypeOf(); + expect(data.boxes).toBeDefined(); + expect(data.boxes).toBeInstanceOf(BedWarsBoxes); + expectTypeOf(data.boxes).toEqualTypeOf(); + expect(data.favorites).toBeDefined(); + expect(data.favorites).toBeInstanceOf(BedWarsFavorites); + expectTypeOf(data.favorites).toEqualTypeOf(); + expect(data.figurines).toBeDefined(); + expect(data.figurines).toBeInstanceOf(BedWarsFigurines); + expectTypeOf(data.figurines).toEqualTypeOf(); + expect(data.privateGameSettings).toBeDefined(); + expect(data.privateGameSettings).toBeInstanceOf(BedWarsPrivateGameSettings); + expectTypeOf(data.privateGameSettings).toEqualTypeOf(); + expect(data.settings).toBeDefined(); + expect(data.settings).toBeInstanceOf(BedWarsSettings); + expectTypeOf(data.settings).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/BedWars/BedWars.ts b/src/Structures/MiniGames/BedWars/BedWars.ts index 1d3a1b857..7a7c66867 100644 --- a/src/Structures/MiniGames/BedWars/BedWars.ts +++ b/src/Structures/MiniGames/BedWars/BedWars.ts @@ -1,144 +1,128 @@ -import BedWarsBeds from './BedWarsBeds.js'; -import BedWarsCollectedItems from './BedWarsCollectedItems.js'; -import BedWarsDreamStats from './BedWarsDreamStats.js'; +import BedWarsBoxes from './BedWarsBoxes.js'; +import BedWarsFavorites from './BedWarsFavorites.js'; +import BedWarsFigurines from './BedWarsFigurines.js'; import BedWarsMode from './BedWarsMode.js'; -import BedWarsPracticeStats from './Practice/BedWarsPracticeStats.js'; -import Divide from '../../../Utils/Divide.js'; -import type { BedWarsPrestige } from '../../../Types/Player.js'; +import BedWarsPrivateGameSettings from './BedWarsPrivateGameSettings.js'; +import BedWarsSettings from './BedWarsSettings.js'; +import { BedWarsPrestiges } from '../../../Utils/Constants.js'; +import type { + BedWarsBedDestroy, + BedWarsDeathCry, + BedWarsGlyph, + BedWarsIslandTopper, + BedWarsKillEffect, + BedWarsKillMessage, + BedWarsNPCSkin, + BedWarsPrestige, + BedWarsProjectileTrail, + BedWarsQuickbuyPrivacy, + BedWarsSpray, + BedWarsStartingWeapon, + BedWarsUltimate, + BedWarsVictoryDance, + BedWarsWoodSkin, + PlayerGeneralSelectedCosmetic, + ShopSort +} from '../../../Types/Player.js'; -function getBedWarsLevel(xp: number): number { - let level = Math.floor(xp / 487000) * 100; - xp = xp % 487000; - if (xp < 500) return level + xp / 500; - level++; - if (xp < 1500) return level + (xp - 500) / 1000; - level++; - if (xp < 3500) return level + (xp - 1500) / 2000; - level++; - if (xp < 7000) return level + (xp - 3500) / 3500; - level++; - xp -= 7000; - return level + xp / 5000; -} - -const prestiges: BedWarsPrestige[] = [ - 'Stone', - 'Iron', - 'Gold', - 'Diamond', - 'Emerald', - 'Sapphire', - 'Ruby', - 'Crystal', - 'Opal', - 'Amethyst', - 'Rainbow', - 'Iron Prime', - 'Gold Prime', - 'Diamond Prime', - 'Emerald Prime', - 'Sapphire Prime', - 'Ruby Prime', - 'Crystal Prime', - 'Opal Prime', - 'Amethyst Prime', - 'Mirror', - 'Light', - 'Dawn', - 'Dusk', - 'Air', - 'Wind', - 'Nebula', - 'Thunder', - 'Earth', - 'Water', - 'Fire', - 'Sunrise', - 'Eclipse', - 'Gamma', - 'Majestic', - 'Andesine', - 'Marine', - 'Element', - 'Galaxy', - 'Atomic', - 'Sunset', - 'Time', - 'Winter', - 'Obsidian', - 'Spring', - 'Ice', - 'Summer', - 'Spinel', - 'Autumn', - 'Mystic', - 'Eternal' -]; - -function getPrestige(level: number): BedWarsPrestige { - const index = Math.floor(level / 100); - if (index > prestiges.length - 1) return prestiges[prestiges.length - 1] || 'Eternal'; - return prestiges[index] || 'Stone'; -} - -class BedWars { - tokens: number; - level: number; +class BedWars extends BedWarsMode { experience: number; + level: number; prestige: BedWarsPrestige; - playedGames: number; - wins: number; - winStreak: number; - kills: number; - finalKills: number; - losses: number; - deaths: number; - finalDeaths: number; - collectedItemsTotal: BedWarsCollectedItems; - beds: BedWarsBeds; - KDR: number; - FKDR: number; - WLR: number; - solo: BedWarsMode; - doubles: BedWarsMode; - threes: BedWarsMode; - fours: BedWarsMode; - '4v4': BedWarsMode; - dream: BedWarsDreamStats; - castle: BedWarsMode; - oneBlock: BedWarsMode; - practice: BedWarsPracticeStats; - slumberTickets: number; - totalSlumberTicket: number; + activeBedDestroy: BedWarsBedDestroy | PlayerGeneralSelectedCosmetic | 'UNKNOWN'; + activeDeathCry: BedWarsDeathCry | PlayerGeneralSelectedCosmetic | 'UNKNOWN'; + activeGlyph: BedWarsGlyph | PlayerGeneralSelectedCosmetic | 'UNKNOWN'; + activeIslandTopper: BedWarsIslandTopper | PlayerGeneralSelectedCosmetic | 'UNKNOWN'; + activeKillEffect: BedWarsKillEffect | PlayerGeneralSelectedCosmetic | 'UNKNOWN'; + activeKillMessages: BedWarsKillMessage | PlayerGeneralSelectedCosmetic | 'UNKNOWN'; + activeNPCSkin: BedWarsNPCSkin | PlayerGeneralSelectedCosmetic | 'UNKNOWN'; + activeProjectileTrail: BedWarsProjectileTrail | PlayerGeneralSelectedCosmetic | 'UNKNOWN'; + activeSprays: BedWarsSpray | PlayerGeneralSelectedCosmetic | 'UNKNOWN'; + activeVictoryDance: BedWarsVictoryDance | PlayerGeneralSelectedCosmetic | 'UNKNOWN'; + activeWoodType: BedWarsWoodSkin | PlayerGeneralSelectedCosmetic | 'UNKNOWN'; + activeStartingWeapon: BedWarsStartingWeapon | PlayerGeneralSelectedCosmetic | 'UNKNOWN'; + tokens: number; + firstJoin7: boolean; + glyphStorage: string[]; + packages: string[]; + quickbuyPrivacy: BedWarsQuickbuyPrivacy; + seenBetaMenu: boolean; + selectedUltimate: BedWarsUltimate | 'UNKNOWN'; + shopSort: ShopSort | 'UNKNOWN'; + shopSortEnableOwnedFirst: boolean; + spookyOpenAch: number; + sprayGlyphField: string[]; + sprayStorage: string[]; + understandsResourceBank: boolean; + understandsStreaks: boolean; + updateBook: string | 'UNKNOWN'; + boxes: BedWarsBoxes; + favorites: BedWarsFavorites; + figurines: BedWarsFigurines; + privateGameSettings: BedWarsPrivateGameSettings; + settings: BedWarsSettings; constructor(data: Record) { - this.tokens = data?.coins || data?.tokens || 0; - this.level = data?.Experience ? getBedWarsLevel(data?.Experience) : 0; + super(data); this.experience = data?.Experience || 0; - this.prestige = getPrestige(this.level); - this.playedGames = data?.games_played_bedwars || 0; - this.wins = data?.wins_bedwars || 0; - this.winStreak = data?.winstreak || 0; - this.kills = data?.kills_bedwars || 0; - this.finalKills = data?.final_kills_bedwars || 0; - this.losses = data?.losses_bedwars || 0; - this.deaths = data?.deaths_bedwars || 0; - this.finalDeaths = data?.final_deaths_bedwars || 0; - this.collectedItemsTotal = new BedWarsCollectedItems(data); - this.beds = new BedWarsBeds(data); - this.KDR = Divide(this.kills, this.deaths); - this.FKDR = Divide(this.finalKills, this.finalDeaths); - this.WLR = Divide(this.wins, this.losses); - this.solo = new BedWarsMode(data, 'eight_one'); - this.doubles = new BedWarsMode(data, 'eight_two'); - this.threes = new BedWarsMode(data, 'four_three'); - this.fours = new BedWarsMode(data, 'four_four'); - this['4v4'] = new BedWarsMode(data, 'two_four'); - this.dream = new BedWarsDreamStats(data); - this.castle = new BedWarsMode(data, 'castle'); - this.oneBlock = new BedWarsMode(data, 'eight_one_oneblock'); - this.practice = new BedWarsPracticeStats(data); - this.slumberTickets = data?.slumber?.tickets || 0; - this.totalSlumberTicket = data?.slumber?.total_tickets || 0; + this.level = BedWars.getLevel(this.experience); + this.prestige = BedWars.getPrestige(this.level); + this.activeBedDestroy = data?.activeBedDestroy || 'UNKNOWN'; + this.activeDeathCry = data?.activeDeathCry || 'UNKNOWN'; + this.activeGlyph = data?.activeGlyph || 'UNKNOWN'; + this.activeIslandTopper = data?.activeIslandTopper || 'UNKNOWN'; + this.activeKillEffect = data?.activeKillEffect || 'UNKNOWN'; + this.activeKillMessages = data?.activeKillMessages || 'UNKNOWN'; + this.activeNPCSkin = data?.activeNPCSkin || 'UNKNOWN'; + this.activeProjectileTrail = data?.activeProjectileTrail || 'UNKNOWN'; + this.activeSprays = data?.activeSprays || 'UNKNOWN'; + this.activeVictoryDance = data?.activeVictoryDance || 'UNKNOWN'; + this.activeWoodType = data?.activeWoodType || 'UNKNOWN'; + this.activeStartingWeapon = data?.active_starting_weapon || 'UNKNOWN'; + this.tokens = data?.tokens || data?.coins || 0; + this.firstJoin7 = data?.first_join_7 || false; + this.glyphStorage = (data?.glyph_storage_new || '').split(','); + this.packages = data?.packages || []; + this.quickbuyPrivacy = data?.quickbuy_privacy || 'NONE'; + this.seenBetaMenu = data?.seen_beta_menu || false; + this.selectedUltimate = data?.selected_ultimate || 'UNKNOWN'; + this.shopSort = data?.shop_sort || 'UNKNOWN'; + this.shopSortEnableOwnedFirst = data?.shop_sort_enable_owned_first || false; + this.spookyOpenAch = data?.spooky_open_ach || 0; + this.sprayGlyphField = (data?.spray_glyph_field || '').split(','); + this.sprayStorage = (data?.spray_storage_new || '').split(','); + this.understandsResourceBank = data?.understands_resource_bank || false; + this.understandsStreaks = data?.understands_streaks || false; + this.updateBook = data?.updatebook_bedwars || 'UNKNOWN'; + this.boxes = new BedWarsBoxes(data); + this.favorites = new BedWarsFavorites(data); + this.figurines = new BedWarsFigurines(data?.figurines || {}); + this.privateGameSettings = new BedWarsPrivateGameSettings(data?.privategames || {}); + this.settings = new BedWarsSettings(data?.settings || {}); + } + + static getPrestige(level: number): BedWarsPrestige { + return ( + ( + BedWarsPrestiges.slice() + .reverse() + .find((t) => level >= t.requirement) || BedWarsPrestiges[0] + )?.prestige || 'Stone' + ); + } + + static getLevel(xp: number): number { + let level = Math.floor(xp / 487000) * 100; + xp = xp % 487000; + if (xp < 500) return level + xp / 500; + level++; + if (xp < 1500) return level + (xp - 500) / 1000; + level++; + if (xp < 3500) return level + (xp - 1500) / 2000; + level++; + if (xp < 7000) return level + (xp - 3500) / 3500; + level++; + xp -= 7000; + return level + xp / 5000; } } diff --git a/src/Structures/MiniGames/BedWars/BedWarsBeds.test.ts b/src/Structures/MiniGames/BedWars/BedWarsBeds.test.ts index 4ebbe74e4..bcf9aaa9f 100644 --- a/src/Structures/MiniGames/BedWars/BedWarsBeds.test.ts +++ b/src/Structures/MiniGames/BedWars/BedWarsBeds.test.ts @@ -12,7 +12,7 @@ test('BedWarsBeds', () => { expect(data.lost).toBeDefined(); expect(data.lost).toBeGreaterThanOrEqual(0); expectTypeOf(data.lost).toEqualTypeOf(); - expect(data.BLRatio).toBeDefined(); - expect(data.BLRatio).toBeGreaterThanOrEqual(0); - expectTypeOf(data.BLRatio).toEqualTypeOf(); + expect(data.ratio).toBeDefined(); + expect(data.ratio).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ratio).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/BedWars/BedWarsBeds.ts b/src/Structures/MiniGames/BedWars/BedWarsBeds.ts index 0e08709f3..57c446de4 100644 --- a/src/Structures/MiniGames/BedWars/BedWarsBeds.ts +++ b/src/Structures/MiniGames/BedWars/BedWarsBeds.ts @@ -1,15 +1,16 @@ import Divide from '../../../Utils/Divide.js'; -import type { BedWarsGamemodeName } from '../../../Types/Player.js'; +import ParseBedWarsMode from '../../../Utils/ParseBedWarsMode.js'; +import type { BedWarsModeId } from '../../../Types/Player.js'; class BedWarsBeds { broken: number; lost: number; - BLRatio: number; - constructor(data: Record, mode?: BedWarsGamemodeName | string) { - mode = mode ? `${mode}_` : ''; + ratio: number; + constructor(data: Record, mode?: BedWarsModeId) { + mode = ParseBedWarsMode(mode) as BedWarsModeId; this.broken = data?.[`${mode}beds_broken_bedwars`] || 0; this.lost = data?.[`${mode}beds_lost_bedwars`] || 0; - this.BLRatio = Divide(this.broken, this.lost); + this.ratio = Divide(this.broken, this.lost); } } diff --git a/src/Structures/MiniGames/BedWars/BedWarsBoxes.test.ts b/src/Structures/MiniGames/BedWars/BedWarsBoxes.test.ts new file mode 100644 index 000000000..0a932afe1 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsBoxes.test.ts @@ -0,0 +1,57 @@ +import BedWarsBoxes from './BedWarsBoxes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsBoxes', () => { + const data = new BedWarsBoxes({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsBoxes); + expectTypeOf(data).toEqualTypeOf(); + expect(data.openedChests).toBeDefined(); + expect(data.openedChests).toBeGreaterThanOrEqual(0); + expectTypeOf(data.openedChests).toEqualTypeOf(); + expect(data.openedCommons).toBeDefined(); + expect(data.openedCommons).toBeGreaterThanOrEqual(0); + expectTypeOf(data.openedCommons).toEqualTypeOf(); + expect(data.openedEpics).toBeDefined(); + expect(data.openedEpics).toBeGreaterThanOrEqual(0); + expectTypeOf(data.openedEpics).toEqualTypeOf(); + expect(data.openedLegendaries).toBeDefined(); + expect(data.openedLegendaries).toBeGreaterThanOrEqual(0); + expectTypeOf(data.openedLegendaries).toEqualTypeOf(); + expect(data.openedRares).toBeDefined(); + expect(data.openedRares).toBeGreaterThanOrEqual(0); + expectTypeOf(data.openedRares).toEqualTypeOf(); + expect(data.box).toBeDefined(); + expect(data.box).toBeGreaterThanOrEqual(0); + expectTypeOf(data.box).toEqualTypeOf(); + expect(data.commons).toBeDefined(); + expect(data.commons).toBeGreaterThanOrEqual(0); + expectTypeOf(data.commons).toEqualTypeOf(); + expect(data.epics).toBeDefined(); + expect(data.epics).toBeGreaterThanOrEqual(0); + expectTypeOf(data.epics).toEqualTypeOf(); + expect(data.legendaries).toBeDefined(); + expect(data.legendaries).toBeGreaterThanOrEqual(0); + expectTypeOf(data.legendaries).toEqualTypeOf(); + expect(data.rares).toBeDefined(); + expect(data.rares).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rares).toEqualTypeOf(); + expect(data.boxes).toBeDefined(); + expect(data.boxes).toBeGreaterThanOrEqual(0); + expectTypeOf(data.boxes).toEqualTypeOf(); + expect(data.christmas).toBeDefined(); + expect(data.christmas).toBeGreaterThanOrEqual(0); + expectTypeOf(data.christmas).toEqualTypeOf(); + expect(data.easter).toBeDefined(); + expect(data.easter).toBeGreaterThanOrEqual(0); + expectTypeOf(data.easter).toEqualTypeOf(); + expect(data.golden).toBeDefined(); + expect(data.golden).toBeGreaterThanOrEqual(0); + expectTypeOf(data.golden).toEqualTypeOf(); + expect(data.halloween).toBeDefined(); + expect(data.halloween).toBeGreaterThanOrEqual(0); + expectTypeOf(data.halloween).toEqualTypeOf(); + expect(data.lunar).toBeDefined(); + expect(data.lunar).toBeGreaterThanOrEqual(0); + expectTypeOf(data.lunar).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsBoxes.ts b/src/Structures/MiniGames/BedWars/BedWarsBoxes.ts new file mode 100644 index 000000000..84bc572bf --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsBoxes.ts @@ -0,0 +1,38 @@ +class BedWarsBoxes { + openedChests: number; + openedCommons: number; + openedEpics: number; + openedLegendaries: number; + openedRares: number; + box: number; + commons: number; + epics: number; + legendaries: number; + rares: number; + boxes: number; + christmas: number; + easter: number; + golden: number; + halloween: number; + lunar: number; + constructor(data: Record) { + this.openedChests = data?.Bedwars_openedChests || 0; + this.openedCommons = data?.Bedwars_openedCommons || 0; + this.openedEpics = data?.Bedwars_openedEpics || 0; + this.openedLegendaries = data?.Bedwars_openedLegendaries || 0; + this.openedRares = data?.Bedwars_openedRares || 0; + this.box = data?.bedwars_box || 0; + this.commons = data?.bedwars_box_commons || 0; + this.epics = data?.bedwars_box_epics || 0; + this.legendaries = data?.bedwars_box_legendaries || 0; + this.rares = data?.bedwars_box_rares || 0; + this.boxes = data?.bedwars_boxes || 0; + this.christmas = data?.bedwars_christmas_boxes || 0; + this.easter = data?.bedwars_easter_boxes || 0; + this.golden = data?.bedwars_golden_boxes || 0; + this.halloween = data?.bedwars_halloween_boxes || 0; + this.lunar = data?.bedwars_lunar_boxes || 0; + } +} + +export default BedWarsBoxes; diff --git a/src/Structures/MiniGames/BedWars/BedWarsChallenges/BedWarsChallenge.test.ts b/src/Structures/MiniGames/BedWars/BedWarsChallenges/BedWarsChallenge.test.ts new file mode 100644 index 000000000..17c4181c6 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsChallenges/BedWarsChallenge.test.ts @@ -0,0 +1,15 @@ +import BedWarsChallenge from './BedWarsChallenge.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsChallenge', () => { + const data = new BedWarsChallenge({ stats: 'meow' }, 'archer_only'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data).toEqualTypeOf(); + expect(data.bestTime).toBeDefined(); + expect(data.bestTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bestTime).toEqualTypeOf(); + expect(data.timesCompleted).toBeDefined(); + expect(data.timesCompleted).toBeGreaterThanOrEqual(0); + expectTypeOf(data.timesCompleted).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsChallenges/BedWarsChallenge.ts b/src/Structures/MiniGames/BedWars/BedWarsChallenges/BedWarsChallenge.ts new file mode 100644 index 000000000..b829daa5d --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsChallenges/BedWarsChallenge.ts @@ -0,0 +1,12 @@ +import type { BedWarsChallengeId } from '../../../../Types/Player.js'; + +class BedWarsChallenge { + bestTime: number; + timesCompleted: number; + constructor(data: Record, challenge: BedWarsChallengeId) { + this.bestTime = data?.challenge?.[`bw_challenge_${challenge}_best_time`] || 0; + this.timesCompleted = data?.[`bw_challenge_${challenge}`] || 0; + } +} + +export default BedWarsChallenge; diff --git a/src/Structures/MiniGames/BedWars/BedWarsChallenges/BedWarsChallenges.test.ts b/src/Structures/MiniGames/BedWars/BedWarsChallenges/BedWarsChallenges.test.ts new file mode 100644 index 000000000..e3383b90a --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsChallenges/BedWarsChallenges.test.ts @@ -0,0 +1,109 @@ +import BedWarsChallenge from './BedWarsChallenge.js'; +import BedWarsChallenges from './BedWarsChallenges.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { BedWarsChallengeName } from '../../../../Types/Player.js'; + +test('BedWarsChallenges', () => { + const data = new BedWarsChallenges({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsChallenges); + expectTypeOf(data).toEqualTypeOf(); + expect(data.uniqueChallengesCompleted).toBeDefined(); + expect(data.uniqueChallengesCompleted).toBeGreaterThanOrEqual(0); + expectTypeOf(data.uniqueChallengesCompleted).toEqualTypeOf(); + expect(data.selectedChallengeType).toBeDefined(); + expectTypeOf(data.selectedChallengeType).toEqualTypeOf(); + expect(data.totalChallengesCompleted).toBeDefined(); + expect(data.totalChallengesCompleted).toBeGreaterThanOrEqual(0); + expectTypeOf(data.totalChallengesCompleted).toEqualTypeOf(); + expect(data.archerOnly).toBeDefined(); + expect(data.archerOnly).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.archerOnly).toEqualTypeOf(); + expect(data.assassin).toBeDefined(); + expect(data.assassin).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.assassin).toEqualTypeOf(); + expect(data.cantTouchThis).toBeDefined(); + expect(data.cantTouchThis).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.cantTouchThis).toEqualTypeOf(); + expect(data.cappedResources).toBeDefined(); + expect(data.cappedResources).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.cappedResources).toEqualTypeOf(); + expect(data.collector).toBeDefined(); + expect(data.collector).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.collector).toEqualTypeOf(); + expect(data.defuser).toBeDefined(); + expect(data.defuser).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.defuser).toEqualTypeOf(); + expect(data.delayedHitting).toBeDefined(); + expect(data.delayedHitting).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.delayedHitting).toEqualTypeOf(); + expect(data.hotbar).toBeDefined(); + expect(data.hotbar).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.hotbar).toEqualTypeOf(); + expect(data.invisibleShop).toBeDefined(); + expect(data.invisibleShop).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.invisibleShop).toEqualTypeOf(); + expect(data.knockbackStickOnly).toBeDefined(); + expect(data.knockbackStickOnly).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.knockbackStickOnly).toEqualTypeOf(); + expect(data.masterAssassin).toBeDefined(); + expect(data.masterAssassin).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.masterAssassin).toEqualTypeOf(); + expect(data.miningFatigue).toBeDefined(); + expect(data.miningFatigue).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.miningFatigue).toEqualTypeOf(); + expect(data.noHealing).toBeDefined(); + expect(data.noHealing).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.noHealing).toEqualTypeOf(); + expect(data.noHitting).toBeDefined(); + expect(data.noHitting).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.noHitting).toEqualTypeOf(); + expect(data.noShift).toBeDefined(); + expect(data.noShift).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.noShift).toEqualTypeOf(); + expect(data.noSprint).toBeDefined(); + expect(data.noSprint).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.noSprint).toEqualTypeOf(); + expect(data.noSwords).toBeDefined(); + expect(data.noSwords).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.noSwords).toEqualTypeOf(); + expect(data.noTeamUpgrades).toBeDefined(); + expect(data.noTeamUpgrades).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.noTeamUpgrades).toEqualTypeOf(); + expect(data.noUtilities).toBeDefined(); + expect(data.noUtilities).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.noUtilities).toEqualTypeOf(); + expect(data.patriot).toBeDefined(); + expect(data.patriot).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.patriot).toEqualTypeOf(); + expect(data.protectThePresident).toBeDefined(); + expect(data.protectThePresident).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.protectThePresident).toEqualTypeOf(); + expect(data.resetArmor).toBeDefined(); + expect(data.resetArmor).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.resetArmor).toEqualTypeOf(); + expect(data.selfish).toBeDefined(); + expect(data.selfish).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.selfish).toEqualTypeOf(); + expect(data.slowGenerator).toBeDefined(); + expect(data.slowGenerator).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.slowGenerator).toEqualTypeOf(); + expect(data.sponge).toBeDefined(); + expect(data.sponge).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.sponge).toEqualTypeOf(); + expect(data.stamina).toBeDefined(); + expect(data.stamina).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.stamina).toEqualTypeOf(); + expect(data.stopLight).toBeDefined(); + expect(data.stopLight).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.stopLight).toEqualTypeOf(); + expect(data.toxicRain).toBeDefined(); + expect(data.toxicRain).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.toxicRain).toEqualTypeOf(); + expect(data.weightedItems).toBeDefined(); + expect(data.weightedItems).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.weightedItems).toEqualTypeOf(); + expect(data.woodworker).toBeDefined(); + expect(data.woodworker).toBeInstanceOf(BedWarsChallenge); + expectTypeOf(data.woodworker).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsChallenges/BedWarsChallenges.ts b/src/Structures/MiniGames/BedWars/BedWarsChallenges/BedWarsChallenges.ts new file mode 100644 index 000000000..6e5a561ad --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsChallenges/BedWarsChallenges.ts @@ -0,0 +1,75 @@ +import BedWarsChallenge from './BedWarsChallenge.js'; +import type { BedWarsChallengeName } from '../../../../Types/Player.js'; + +class BedWarsChallenges { + uniqueChallengesCompleted: number; + selectedChallengeType: BedWarsChallengeName | 'NONE'; + totalChallengesCompleted: number; + archerOnly: BedWarsChallenge; + assassin: BedWarsChallenge; + cantTouchThis: BedWarsChallenge; + cappedResources: BedWarsChallenge; + collector: BedWarsChallenge; + defuser: BedWarsChallenge; + delayedHitting: BedWarsChallenge; + hotbar: BedWarsChallenge; + invisibleShop: BedWarsChallenge; + knockbackStickOnly: BedWarsChallenge; + masterAssassin: BedWarsChallenge; + miningFatigue: BedWarsChallenge; + noHealing: BedWarsChallenge; + noHitting: BedWarsChallenge; + noShift: BedWarsChallenge; + noSprint: BedWarsChallenge; + noSwords: BedWarsChallenge; + noTeamUpgrades: BedWarsChallenge; + noUtilities: BedWarsChallenge; + patriot: BedWarsChallenge; + protectThePresident: BedWarsChallenge; + resetArmor: BedWarsChallenge; + selfish: BedWarsChallenge; + slowGenerator: BedWarsChallenge; + sponge: BedWarsChallenge; + stamina: BedWarsChallenge; + stopLight: BedWarsChallenge; + toxicRain: BedWarsChallenge; + weightedItems: BedWarsChallenge; + woodworker: BedWarsChallenge; + constructor(data: Record) { + this.uniqueChallengesCompleted = data?.bw_unique_challenges_completed || 0; + this.selectedChallengeType = data?.selected_challenge_type || 'NONE'; + this.totalChallengesCompleted = data?.total_challenges_completed || 0; + this.archerOnly = new BedWarsChallenge(data, 'archer_only'); + this.assassin = new BedWarsChallenge(data, 'assassin'); + this.cantTouchThis = new BedWarsChallenge(data, 'cant_touch_this'); + this.cappedResources = new BedWarsChallenge(data, 'capped_resources'); + this.collector = new BedWarsChallenge(data, 'collector'); + this.defuser = new BedWarsChallenge(data, 'defuser'); + this.delayedHitting = new BedWarsChallenge(data, 'delayed_hitting'); + this.hotbar = new BedWarsChallenge(data, 'hotbar'); + this.invisibleShop = new BedWarsChallenge(data, 'invisible_shop'); + this.knockbackStickOnly = new BedWarsChallenge(data, 'knockback_stick_only'); + this.masterAssassin = new BedWarsChallenge(data, 'master_assassin'); + this.miningFatigue = new BedWarsChallenge(data, 'mining_fatigue'); + this.noHealing = new BedWarsChallenge(data, 'no_healing'); + this.noHitting = new BedWarsChallenge(data, 'no_hitting'); + this.noShift = new BedWarsChallenge(data, 'no_shift'); + this.noSprint = new BedWarsChallenge(data, 'no_sprint'); + this.noSwords = new BedWarsChallenge(data, 'no_swords'); + this.noTeamUpgrades = new BedWarsChallenge(data, 'no_team_upgrades'); + this.noUtilities = new BedWarsChallenge(data, 'no_utilities'); + this.patriot = new BedWarsChallenge(data, 'patriot'); + this.protectThePresident = new BedWarsChallenge(data, 'protect_the_president'); + this.resetArmor = new BedWarsChallenge(data, 'reset_armor'); + this.selfish = new BedWarsChallenge(data, 'selfish'); + this.slowGenerator = new BedWarsChallenge(data, 'slow_generator'); + this.sponge = new BedWarsChallenge(data, 'sponge'); + this.stamina = new BedWarsChallenge(data, 'stamina'); + this.stopLight = new BedWarsChallenge(data, 'stop_light'); + this.toxicRain = new BedWarsChallenge(data, 'toxic_rain'); + this.weightedItems = new BedWarsChallenge(data, 'weighted_items'); + this.woodworker = new BedWarsChallenge(data, 'woodworker'); + } +} + +export default BedWarsChallenges; diff --git a/src/Structures/MiniGames/BedWars/BedWarsCollectedItems.test.ts b/src/Structures/MiniGames/BedWars/BedWarsCollectedItems.test.ts deleted file mode 100644 index 7cd0d5405..000000000 --- a/src/Structures/MiniGames/BedWars/BedWarsCollectedItems.test.ts +++ /dev/null @@ -1,21 +0,0 @@ -import BedWarsCollectedItems from './BedWarsCollectedItems.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('BedWarsCollectedItems', () => { - const data = new BedWarsCollectedItems({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(BedWarsCollectedItems); - expectTypeOf(data).toEqualTypeOf(); - expect(data.iron).toBeDefined(); - expect(data.iron).toBeGreaterThanOrEqual(0); - expectTypeOf(data.iron).toEqualTypeOf(); - expect(data.gold).toBeDefined(); - expect(data.gold).toBeGreaterThanOrEqual(0); - expectTypeOf(data.gold).toEqualTypeOf(); - expect(data.diamond).toBeDefined(); - expect(data.diamond).toBeGreaterThanOrEqual(0); - expectTypeOf(data.diamond).toEqualTypeOf(); - expect(data.emerald).toBeDefined(); - expect(data.emerald).toBeGreaterThanOrEqual(0); - expectTypeOf(data.emerald).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsCollectedItems.ts b/src/Structures/MiniGames/BedWars/BedWarsCollectedItems.ts deleted file mode 100644 index 18d310a37..000000000 --- a/src/Structures/MiniGames/BedWars/BedWarsCollectedItems.ts +++ /dev/null @@ -1,14 +0,0 @@ -class BedWarsCollectedItems { - iron: number; - gold: number; - diamond: number; - emerald: number; - constructor(data: Record) { - this.iron = data?.iron_resources_collected_bedwars || 0; - this.gold = data?.gold_resources_collected_bedwars || 0; - this.diamond = data?.diamond_resources_collected_bedwars || 0; - this.emerald = data?.emerald_resources_collected_bedwars || 0; - } -} - -export default BedWarsCollectedItems; diff --git a/src/Structures/MiniGames/BedWars/BedWarsDreamMode.test.ts b/src/Structures/MiniGames/BedWars/BedWarsDreamMode.test.ts deleted file mode 100644 index 27f51dcc1..000000000 --- a/src/Structures/MiniGames/BedWars/BedWarsDreamMode.test.ts +++ /dev/null @@ -1,16 +0,0 @@ -import BedWarsDreamMode from './BedWarsDreamMode.js'; -import BedWarsMode from './BedWarsMode.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('BedWarsDreamMode', () => { - const data = new BedWarsDreamMode({ stats: 'meow' }, 'armed'); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(BedWarsDreamMode); - expectTypeOf(data).toEqualTypeOf(); - expect(data.doubles).toBeDefined(); - expect(data.doubles).toBeInstanceOf(BedWarsMode); - expectTypeOf(data.doubles).toEqualTypeOf(); - expect(data.fours).toBeDefined(); - expect(data.fours).toBeInstanceOf(BedWarsMode); - expectTypeOf(data.fours).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsDreamMode.ts b/src/Structures/MiniGames/BedWars/BedWarsDreamMode.ts deleted file mode 100644 index 0b2ac4805..000000000 --- a/src/Structures/MiniGames/BedWars/BedWarsDreamMode.ts +++ /dev/null @@ -1,13 +0,0 @@ -import BedWarsMode from './BedWarsMode.js'; -import type { BedWarsDreamGamemodeName } from '../../../Types/Player.js'; - -class BedWarsDreamMode { - doubles: BedWarsMode; - fours: BedWarsMode; - constructor(data: Record, mode: BedWarsDreamGamemodeName) { - this.doubles = new BedWarsMode(data, `eight_two_${mode}`); - this.fours = new BedWarsMode(data, `four_four_${mode}`); - } -} - -export default BedWarsDreamMode; diff --git a/src/Structures/MiniGames/BedWars/BedWarsDreamStats.test.ts b/src/Structures/MiniGames/BedWars/BedWarsDreamStats.test.ts deleted file mode 100644 index 6abe946f2..000000000 --- a/src/Structures/MiniGames/BedWars/BedWarsDreamStats.test.ts +++ /dev/null @@ -1,25 +0,0 @@ -import BedWarsDreamMode from './BedWarsDreamMode.js'; -import BedWarsDreamStats from './BedWarsDreamStats.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('BedWarsDreamStats', () => { - const data = new BedWarsDreamStats({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(BedWarsDreamStats); - expectTypeOf(data).toEqualTypeOf(); - expect(data.ultimate).toBeDefined(); - expect(data.ultimate).toBeInstanceOf(BedWarsDreamMode); - expectTypeOf(data.ultimate).toEqualTypeOf(); - expect(data.rush).toBeDefined(); - expect(data.rush).toBeInstanceOf(BedWarsDreamMode); - expectTypeOf(data.rush).toEqualTypeOf(); - expect(data.armed).toBeDefined(); - expect(data.armed).toBeInstanceOf(BedWarsDreamMode); - expectTypeOf(data.armed).toEqualTypeOf(); - expect(data.lucky).toBeDefined(); - expect(data.lucky).toBeInstanceOf(BedWarsDreamMode); - expectTypeOf(data.lucky).toEqualTypeOf(); - expect(data.voidless).toBeDefined(); - expect(data.voidless).toBeInstanceOf(BedWarsDreamMode); - expectTypeOf(data.voidless).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsDreamStats.ts b/src/Structures/MiniGames/BedWars/BedWarsDreamStats.ts deleted file mode 100644 index 6169cad49..000000000 --- a/src/Structures/MiniGames/BedWars/BedWarsDreamStats.ts +++ /dev/null @@ -1,18 +0,0 @@ -import BedWarsDreamMode from './BedWarsDreamMode.js'; - -class BedWarsDreamStats { - ultimate: BedWarsDreamMode; - rush: BedWarsDreamMode; - armed: BedWarsDreamMode; - lucky: BedWarsDreamMode; - voidless: BedWarsDreamMode; - constructor(data: Record) { - this.ultimate = new BedWarsDreamMode(data, 'ultimate'); - this.rush = new BedWarsDreamMode(data, 'rush'); - this.armed = new BedWarsDreamMode(data, 'armed'); - this.lucky = new BedWarsDreamMode(data, 'lucky'); - this.voidless = new BedWarsDreamMode(data, 'voidless'); - } -} - -export default BedWarsDreamStats; diff --git a/src/Structures/MiniGames/BedWars/BedWarsEightOne.test.ts b/src/Structures/MiniGames/BedWars/BedWarsEightOne.test.ts new file mode 100644 index 000000000..fd25a88f5 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsEightOne.test.ts @@ -0,0 +1,19 @@ +import BedWarsEightOne from './BedWarsEightOne.js'; +import BedWarsMode from './BedWarsMode.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsEightOne', () => { + const data = new BedWarsEightOne({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsEightOne); + expectTypeOf(data).toEqualTypeOf(); + expect(data.oneblock).toBeDefined(); + expect(data.oneblock).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.oneblock).toEqualTypeOf(); + expect(data.rush).toBeDefined(); + expect(data.rush).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.rush).toEqualTypeOf(); + expect(data.ultimate).toBeDefined(); + expect(data.ultimate).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.ultimate).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsEightOne.ts b/src/Structures/MiniGames/BedWars/BedWarsEightOne.ts new file mode 100644 index 000000000..cfc1d4252 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsEightOne.ts @@ -0,0 +1,15 @@ +import BedWarsMode from './BedWarsMode.js'; + +class BedWarsEightOne extends BedWarsMode { + oneblock: BedWarsMode; + rush: BedWarsMode; + ultimate: BedWarsMode; + constructor(data: Record) { + super(data, 'eight_one'); + this.oneblock = new BedWarsMode(data, 'eight_one_oneblock'); + this.rush = new BedWarsMode(data, 'eight_one_rush'); + this.ultimate = new BedWarsMode(data, 'eight_one_ultimate'); + } +} + +export default BedWarsEightOne; diff --git a/src/Structures/MiniGames/BedWars/BedWarsEightTwo.test.ts b/src/Structures/MiniGames/BedWars/BedWarsEightTwo.test.ts new file mode 100644 index 000000000..a07f92d5e --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsEightTwo.test.ts @@ -0,0 +1,40 @@ +import BedWarsEightTwo from './BedWarsEightTwo.js'; +import BedWarsMode from './BedWarsMode.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsEightTwo', () => { + const data = new BedWarsEightTwo({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsEightTwo); + expectTypeOf(data).toEqualTypeOf(); + expect(data.tourney1).toBeDefined(); + expect(data.tourney1).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.tourney1).toEqualTypeOf(); + expect(data.tourney0).toBeDefined(); + expect(data.tourney0).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.tourney0).toEqualTypeOf(); + expect(data.tourney).toBeDefined(); + expect(data.tourney).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.tourney).toEqualTypeOf(); + expect(data.armed).toBeDefined(); + expect(data.armed).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.armed).toEqualTypeOf(); + expect(data.lucky).toBeDefined(); + expect(data.lucky).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.lucky).toEqualTypeOf(); + expect(data.rush).toBeDefined(); + expect(data.rush).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.rush).toEqualTypeOf(); + expect(data.swap).toBeDefined(); + expect(data.swap).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.swap).toEqualTypeOf(); + expect(data.ultimate).toBeDefined(); + expect(data.ultimate).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.ultimate).toEqualTypeOf(); + expect(data.underworld).toBeDefined(); + expect(data.underworld).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.underworld).toEqualTypeOf(); + expect(data.voidless).toBeDefined(); + expect(data.voidless).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.voidless).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsEightTwo.ts b/src/Structures/MiniGames/BedWars/BedWarsEightTwo.ts new file mode 100644 index 000000000..87dadbd20 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsEightTwo.ts @@ -0,0 +1,29 @@ +import BedWarsMode from './BedWarsMode.js'; + +class BedWarsEightTwo extends BedWarsMode { + tourney1: BedWarsMode; + tourney0: BedWarsMode; + tourney: BedWarsMode; + armed: BedWarsMode; + lucky: BedWarsMode; + rush: BedWarsMode; + swap: BedWarsMode; + ultimate: BedWarsMode; + underworld: BedWarsMode; + voidless: BedWarsMode; + constructor(data: Record) { + super(data, 'eight_two'); + this.tourney1 = new BedWarsMode(data, 'tourney_bedwars_eight_two_1'); + this.tourney0 = new BedWarsMode(data, 'tourney_bedwars_eight_two_0'); + this.tourney = new BedWarsMode(data, 'eight_two_tourney'); + this.armed = new BedWarsMode(data, 'eight_two_armed'); + this.lucky = new BedWarsMode(data, 'eight_two_lucky'); + this.rush = new BedWarsMode(data, 'eight_two_rush'); + this.swap = new BedWarsMode(data, 'eight_two_swap'); + this.ultimate = new BedWarsMode(data, 'eight_two_ultimate'); + this.underworld = new BedWarsMode(data, 'eight_two_underworld'); + this.voidless = new BedWarsMode(data, 'eight_two_voidless'); + } +} + +export default BedWarsEightTwo; diff --git a/src/Structures/MiniGames/BedWars/BedWarsFavorites.test.ts b/src/Structures/MiniGames/BedWars/BedWarsFavorites.test.ts new file mode 100644 index 000000000..1c5b9b93c --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsFavorites.test.ts @@ -0,0 +1,43 @@ +import BedWarsFavorites from './BedWarsFavorites.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsFavorites', () => { + const data = new BedWarsFavorites({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsFavorites); + expectTypeOf(data).toEqualTypeOf(); + expect(data.streakSlots).toBeDefined(); + expectTypeOf(data.streakSlots).toEqualTypeOf(); + expect(data.hotbarSlots).toBeDefined(); + expectTypeOf(data.hotbarSlots).toEqualTypeOf(); + expect(data.shopSlots).toBeDefined(); + expectTypeOf(data.shopSlots).toEqualTypeOf(); + expect(data.shopSlots2).toBeDefined(); + expectTypeOf(data.shopSlots2).toEqualTypeOf(); + expect(data.bedDestroy).toBeDefined(); + expectTypeOf(data.bedDestroy).toEqualTypeOf(); + expect(data.deathcry).toBeDefined(); + expectTypeOf(data.deathcry).toEqualTypeOf(); + expect(data.figurine).toBeDefined(); + expectTypeOf(data.figurine).toEqualTypeOf(); + expect(data.glyph).toBeDefined(); + expectTypeOf(data.glyph).toEqualTypeOf(); + expect(data.islandTopper).toBeDefined(); + expectTypeOf(data.islandTopper).toEqualTypeOf(); + expect(data.killEffect).toBeDefined(); + expectTypeOf(data.killEffect).toEqualTypeOf(); + expect(data.killMessages).toBeDefined(); + expectTypeOf(data.killMessages).toEqualTypeOf(); + expect(data.npcSkin).toBeDefined(); + expectTypeOf(data.npcSkin).toEqualTypeOf(); + expect(data.projectileTrail).toBeDefined(); + expectTypeOf(data.projectileTrail).toEqualTypeOf(); + expect(data.sprays).toBeDefined(); + expectTypeOf(data.sprays).toEqualTypeOf(); + expect(data.startingWeapon).toBeDefined(); + expectTypeOf(data.startingWeapon).toEqualTypeOf(); + expect(data.victoryDance).toBeDefined(); + expectTypeOf(data.victoryDance).toEqualTypeOf(); + expect(data.woodSkin).toBeDefined(); + expectTypeOf(data.woodSkin).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsFavorites.ts b/src/Structures/MiniGames/BedWars/BedWarsFavorites.ts new file mode 100644 index 000000000..73da4892b --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsFavorites.ts @@ -0,0 +1,40 @@ +class BedWarsFavorites { + streakSlots: string[]; + hotbarSlots: string[]; + shopSlots: string[]; + shopSlots2: string[]; + bedDestroy: string[]; + deathcry: string[]; + figurine: string[]; + glyph: string[]; + islandTopper: string[]; + killEffect: string[]; + killMessages: string[]; + npcSkin: string[]; + projectileTrail: string[]; + sprays: string[]; + startingWeapon: string[]; + victoryDance: string[]; + woodSkin: string[]; + constructor(data: Record) { + this.streakSlots = (data?.fav_streak_slots || '').split(','); + this.hotbarSlots = (data?.favorite_slots || '').split(','); + this.shopSlots = (data?.favourites_1 || '').split(','); + this.shopSlots2 = (data?.favourites_2 || '').split(','); + this.bedDestroy = data?.favorites?.beddestroy || []; + this.deathcry = data?.favorites?.deathcry || []; + this.figurine = data?.favorites?.figurine || []; + this.glyph = data?.favorites?.glyph || []; + this.islandTopper = data?.favorites?.islandtopper || []; + this.killEffect = data?.favorites?.killeffect || []; + this.killMessages = data?.favorites?.killmessages || []; + this.npcSkin = data?.favorites?.npcskin || []; + this.projectileTrail = data?.favorites?.projectiletrail || []; + this.sprays = data?.favorites?.sprays || []; + this.startingWeapon = data?.favorites?.starting_weapon || []; + this.victoryDance = data?.favorites?.victorydance || []; + this.woodSkin = data?.favorites?.woodSkin || []; + } +} + +export default BedWarsFavorites; diff --git a/src/Structures/MiniGames/BedWars/BedWarsFigurines.test.ts b/src/Structures/MiniGames/BedWars/BedWarsFigurines.test.ts new file mode 100644 index 000000000..897752f62 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsFigurines.test.ts @@ -0,0 +1,17 @@ +import BedWarsFigurines from './BedWarsFigurines.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsFigurines', () => { + const data = new BedWarsFigurines({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsFigurines); + expectTypeOf(data).toEqualTypeOf(); + expect(data.active).toBeDefined(); + expectTypeOf(data.active).toEqualTypeOf(); + expect(data.featuredCommon).toBeDefined(); + expectTypeOf(data.featuredCommon).toEqualTypeOf(); + expect(data.featuredLegendary).toBeDefined(); + expectTypeOf(data.featuredLegendary).toEqualTypeOf(); + expect(data.featuredRare).toBeDefined(); + expectTypeOf(data.featuredRare).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsFigurines.ts b/src/Structures/MiniGames/BedWars/BedWarsFigurines.ts new file mode 100644 index 000000000..efce9902b --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsFigurines.ts @@ -0,0 +1,14 @@ +class BedWarsFigurines { + active: string | 'UNKNOWN'; + featuredCommon: string[]; + featuredLegendary: string[]; + featuredRare: string[]; + constructor(data: Record) { + this.active = data?.active || 'UNKNOWN'; + this.featuredCommon = data?.featured?.COMMON || []; + this.featuredLegendary = data?.featured?.LEGENDARY || []; + this.featuredRare = data?.featured?.RARE || []; + } +} + +export default BedWarsFigurines; diff --git a/src/Structures/MiniGames/BedWars/BedWarsFourFour.test.ts b/src/Structures/MiniGames/BedWars/BedWarsFourFour.test.ts new file mode 100644 index 000000000..15416e681 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsFourFour.test.ts @@ -0,0 +1,40 @@ +import BedWarsFourFour from './BedWarsFourFour.js'; +import BedWarsMode from './BedWarsMode.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsFourFour', () => { + const data = new BedWarsFourFour({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsFourFour); + expectTypeOf(data).toEqualTypeOf(); + expect(data.tourney1).toBeDefined(); + expect(data.tourney1).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.tourney1).toEqualTypeOf(); + expect(data.tourney0).toBeDefined(); + expect(data.tourney0).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.tourney0).toEqualTypeOf(); + expect(data.tourney).toBeDefined(); + expect(data.tourney).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.tourney).toEqualTypeOf(); + expect(data.armed).toBeDefined(); + expect(data.armed).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.armed).toEqualTypeOf(); + expect(data.lucky).toBeDefined(); + expect(data.lucky).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.lucky).toEqualTypeOf(); + expect(data.rush).toBeDefined(); + expect(data.rush).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.rush).toEqualTypeOf(); + expect(data.swap).toBeDefined(); + expect(data.swap).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.swap).toEqualTypeOf(); + expect(data.ultimate).toBeDefined(); + expect(data.ultimate).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.ultimate).toEqualTypeOf(); + expect(data.underworld).toBeDefined(); + expect(data.underworld).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.underworld).toEqualTypeOf(); + expect(data.voidless).toBeDefined(); + expect(data.voidless).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.voidless).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsFourFour.ts b/src/Structures/MiniGames/BedWars/BedWarsFourFour.ts new file mode 100644 index 000000000..9a5950f68 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsFourFour.ts @@ -0,0 +1,29 @@ +import BedWarsMode from './BedWarsMode.js'; + +class BedWarsFourFour extends BedWarsMode { + tourney1: BedWarsMode; + tourney0: BedWarsMode; + tourney: BedWarsMode; + armed: BedWarsMode; + lucky: BedWarsMode; + rush: BedWarsMode; + swap: BedWarsMode; + ultimate: BedWarsMode; + underworld: BedWarsMode; + voidless: BedWarsMode; + constructor(data: Record) { + super(data, 'four_four'); + this.tourney1 = new BedWarsMode(data, 'tourney_bedwars4s_1'); + this.tourney0 = new BedWarsMode(data, 'tourney_bedwars4s_0'); + this.tourney = new BedWarsMode(data, 'tourney_bedwars4s'); + this.armed = new BedWarsMode(data, 'four_four_armed'); + this.lucky = new BedWarsMode(data, 'four_four_lucky'); + this.rush = new BedWarsMode(data, 'four_four_rush'); + this.swap = new BedWarsMode(data, 'four_four_swap'); + this.ultimate = new BedWarsMode(data, 'four_four_ultimate'); + this.underworld = new BedWarsMode(data, 'four_four_underworld'); + this.voidless = new BedWarsMode(data, 'four_four_voidless'); + } +} + +export default BedWarsFourFour; diff --git a/src/Structures/MiniGames/BedWars/BedWarsFourThree.test.ts b/src/Structures/MiniGames/BedWars/BedWarsFourThree.test.ts new file mode 100644 index 000000000..6ed5bc7db --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsFourThree.test.ts @@ -0,0 +1,9 @@ +import BedWarsFourThree from './BedWarsFourThree.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsFourThree', () => { + const data = new BedWarsFourThree({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsFourThree); + expectTypeOf(data).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsFourThree.ts b/src/Structures/MiniGames/BedWars/BedWarsFourThree.ts new file mode 100644 index 000000000..5ddc37d7f --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsFourThree.ts @@ -0,0 +1,9 @@ +import BedWarsMode from './BedWarsMode.js'; + +class BedWarsFourThree extends BedWarsMode { + constructor(data: Record) { + super(data, 'four_three'); + } +} + +export default BedWarsFourThree; diff --git a/src/Structures/MiniGames/BedWars/BedWarsItemsPurchased.test.ts b/src/Structures/MiniGames/BedWars/BedWarsItemsPurchased.test.ts new file mode 100644 index 000000000..3b3197f95 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsItemsPurchased.test.ts @@ -0,0 +1,15 @@ +import BedWarsItemsPurchased from './BedWarsItemsPurchased.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsItemsPurchased', () => { + const data = new BedWarsItemsPurchased({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsItemsPurchased); + expectTypeOf(data).toEqualTypeOf(); + expect(data.itemsPurchased).toBeDefined(); + expect(data.itemsPurchased).toBeGreaterThanOrEqual(0); + expectTypeOf(data.itemsPurchased).toEqualTypeOf(); + expect(data.permanentItemsPurchased).toBeDefined(); + expect(data.permanentItemsPurchased).toBeGreaterThanOrEqual(0); + expectTypeOf(data.permanentItemsPurchased).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsItemsPurchased.ts b/src/Structures/MiniGames/BedWars/BedWarsItemsPurchased.ts new file mode 100644 index 000000000..5b0145f67 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsItemsPurchased.ts @@ -0,0 +1,13 @@ +import ParseBedWarsMode from '../../../Utils/ParseBedWarsMode.js'; + +class BedWarsItemsPurchased { + itemsPurchased: number; + permanentItemsPurchased: number; + constructor(data: Record, mode?: string) { + mode = ParseBedWarsMode(mode); + this.itemsPurchased = data?.[`${mode}items_purchased_bedwars`] || 0; + this.permanentItemsPurchased = data?.[`${mode}permanent_items_purchased_bedwars`] || 0; + } +} + +export default BedWarsItemsPurchased; diff --git a/src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeaths.test.ts b/src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeaths.test.ts new file mode 100644 index 000000000..cd6bf90f8 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeaths.test.ts @@ -0,0 +1,64 @@ +import BedWarsKillsDeaths from './BedWarsKillsDeaths.js'; +import BedWarsKillsDeathsType from './BedWarsKillsDeathsType.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsKillsDeaths', () => { + const data = new BedWarsKillsDeaths({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsKillsDeaths); + expectTypeOf(data).toEqualTypeOf(); + expect(data.total).toBeDefined(); + expect(data.total).toBeInstanceOf(BedWarsKillsDeathsType); + expectTypeOf(data.total).toEqualTypeOf(); + expect(data.custom).toBeDefined(); + expect(data.custom).toBeInstanceOf(BedWarsKillsDeathsType); + expectTypeOf(data.custom).toEqualTypeOf(); + expect(data.drowning).toBeDefined(); + expect(data.drowning).toBeInstanceOf(BedWarsKillsDeathsType); + expectTypeOf(data.drowning).toEqualTypeOf(); + expect(data.entityAttack).toBeDefined(); + expect(data.entityAttack).toBeInstanceOf(BedWarsKillsDeathsType); + expectTypeOf(data.entityAttack).toEqualTypeOf(); + expect(data.entityExplosion).toBeDefined(); + expect(data.entityExplosion).toBeInstanceOf(BedWarsKillsDeathsType); + expectTypeOf(data.entityExplosion).toEqualTypeOf(); + expect(data.fall).toBeDefined(); + expect(data.fall).toBeInstanceOf(BedWarsKillsDeathsType); + expectTypeOf(data.fall).toEqualTypeOf(); + expect(data.fire).toBeDefined(); + expect(data.fire).toBeInstanceOf(BedWarsKillsDeathsType); + expectTypeOf(data.fire).toEqualTypeOf(); + expect(data.fireTick).toBeDefined(); + expect(data.fireTick).toBeInstanceOf(BedWarsKillsDeathsType); + expectTypeOf(data.fireTick).toEqualTypeOf(); + expect(data.magic).toBeDefined(); + expect(data.magic).toBeInstanceOf(BedWarsKillsDeathsType); + expectTypeOf(data.magic).toEqualTypeOf(); + expect(data.projectile).toBeDefined(); + expect(data.projectile).toBeInstanceOf(BedWarsKillsDeathsType); + expectTypeOf(data.projectile).toEqualTypeOf(); + expect(data.suffocation).toBeDefined(); + expect(data.suffocation).toBeInstanceOf(BedWarsKillsDeathsType); + expectTypeOf(data.suffocation).toEqualTypeOf(); + expect(data.void).toBeDefined(); + expect(data.void).toBeInstanceOf(BedWarsKillsDeathsType); + expectTypeOf(data.void).toEqualTypeOf(); + expect(data.fallingBlock).toBeDefined(); + expect(data.fallingBlock).toBeInstanceOf(BedWarsKillsDeathsType); + expectTypeOf(data.fallingBlock).toEqualTypeOf(); + expect(data.lava).toBeDefined(); + expect(data.lava).toBeInstanceOf(BedWarsKillsDeathsType); + expectTypeOf(data.lava).toEqualTypeOf(); + expect(data.contact).toBeDefined(); + expect(data.contact).toBeInstanceOf(BedWarsKillsDeathsType); + expectTypeOf(data.contact).toEqualTypeOf(); + expect(data.thorns).toBeDefined(); + expect(data.thorns).toBeInstanceOf(BedWarsKillsDeathsType); + expectTypeOf(data.thorns).toEqualTypeOf(); + expect(data.wither).toBeDefined(); + expect(data.wither).toBeInstanceOf(BedWarsKillsDeathsType); + expectTypeOf(data.wither).toEqualTypeOf(); + expect(data.blockExplosion).toBeDefined(); + expect(data.blockExplosion).toBeInstanceOf(BedWarsKillsDeathsType); + expectTypeOf(data.blockExplosion).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeaths.ts b/src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeaths.ts new file mode 100644 index 000000000..d7bc1af4c --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeaths.ts @@ -0,0 +1,45 @@ +import BedWarsKillsDeathsType from './BedWarsKillsDeathsType.js'; +import type { BedWarsModeId } from '../../../../Types/Player.js'; + +class BedWarsKillsDeaths { + total: BedWarsKillsDeathsType; + custom: BedWarsKillsDeathsType; + drowning: BedWarsKillsDeathsType; + entityAttack: BedWarsKillsDeathsType; + entityExplosion: BedWarsKillsDeathsType; + fall: BedWarsKillsDeathsType; + fire: BedWarsKillsDeathsType; + fireTick: BedWarsKillsDeathsType; + magic: BedWarsKillsDeathsType; + projectile: BedWarsKillsDeathsType; + suffocation: BedWarsKillsDeathsType; + void: BedWarsKillsDeathsType; + fallingBlock: BedWarsKillsDeathsType; + lava: BedWarsKillsDeathsType; + contact: BedWarsKillsDeathsType; + thorns: BedWarsKillsDeathsType; + wither: BedWarsKillsDeathsType; + blockExplosion: BedWarsKillsDeathsType; + constructor(data: Record, mode?: BedWarsModeId, finals?: boolean) { + this.total = new BedWarsKillsDeathsType(data, '', mode, finals); + this.custom = new BedWarsKillsDeathsType(data, 'custom', mode, finals); + this.drowning = new BedWarsKillsDeathsType(data, 'drowning', mode, finals); + this.entityAttack = new BedWarsKillsDeathsType(data, 'entity_attack', mode, finals); + this.entityExplosion = new BedWarsKillsDeathsType(data, 'entity_explosion', mode, finals); + this.fall = new BedWarsKillsDeathsType(data, 'fall', mode, finals); + this.fire = new BedWarsKillsDeathsType(data, 'fire', mode, finals); + this.fireTick = new BedWarsKillsDeathsType(data, 'fire_tick', mode, finals); + this.magic = new BedWarsKillsDeathsType(data, 'magic', mode, finals); + this.projectile = new BedWarsKillsDeathsType(data, 'projectile', mode, finals); + this.suffocation = new BedWarsKillsDeathsType(data, 'suffocation', mode, finals); + this.void = new BedWarsKillsDeathsType(data, 'void', mode, finals); + this.fallingBlock = new BedWarsKillsDeathsType(data, 'falling_block', mode, finals); + this.lava = new BedWarsKillsDeathsType(data, 'lava', mode, finals); + this.contact = new BedWarsKillsDeathsType(data, 'contact', mode, finals); + this.thorns = new BedWarsKillsDeathsType(data, 'thorns', mode, finals); + this.wither = new BedWarsKillsDeathsType(data, 'wither', mode, finals); + this.blockExplosion = new BedWarsKillsDeathsType(data, 'block_explosion', mode, finals); + } +} + +export default BedWarsKillsDeaths; diff --git a/src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeathsType.test.ts b/src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeathsType.test.ts new file mode 100644 index 000000000..8198265fa --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeathsType.test.ts @@ -0,0 +1,18 @@ +import BedWarsKillsDeathsType from './BedWarsKillsDeathsType.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsKillsDeathsType', () => { + const data = new BedWarsKillsDeathsType({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsKillsDeathsType); + expectTypeOf(data).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.ratio).toBeDefined(); + expect(data.ratio).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ratio).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeathsType.ts b/src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeathsType.ts new file mode 100644 index 000000000..0fcd2e555 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeathsType.ts @@ -0,0 +1,18 @@ +import Divide from '../../../../Utils/Divide.js'; +import ParseBedWarsMode from '../../../../Utils/ParseBedWarsMode.js'; +import type { BedWarsFinalType, BedWarsModeId } from '../../../../Types/Player.js'; + +class BedWarsKillsDeathsType { + kills: number; + deaths: number; + ratio: number; + constructor(data: Record, type?: BedWarsFinalType, mode?: BedWarsModeId, finals: boolean = false) { + type = ParseBedWarsMode(type) as BedWarsFinalType; + mode = ParseBedWarsMode(mode) as BedWarsModeId; + this.kills = data?.[`${mode}${type}${finals ? 'final_' : ''}kills_bedwars`] || 0; + this.deaths = data?.[`${mode}${type}${finals ? 'final_' : ''}deaths_bedwars`] || 0; + this.ratio = Divide(this.kills, this.deaths); + } +} + +export default BedWarsKillsDeathsType; diff --git a/src/Structures/MiniGames/BedWars/BedWarsMode.test.ts b/src/Structures/MiniGames/BedWars/BedWarsMode.test.ts index 292cb3a26..c79a223e1 100644 --- a/src/Structures/MiniGames/BedWars/BedWarsMode.test.ts +++ b/src/Structures/MiniGames/BedWars/BedWarsMode.test.ts @@ -1,49 +1,39 @@ import BedWarsBeds from './BedWarsBeds.js'; +import BedWarsKillsDeaths from './BedWarsKillsDeaths/BedWarsKillsDeaths.js'; import BedWarsMode from './BedWarsMode.js'; +import BedWarsResourcesCollected from './BedWarsResourcesCollected.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type { BedWarsGamemodeName } from '../../../Types/Player.js'; test('BedWarsMode', () => { - const data = new BedWarsMode({ stats: 'meow' }, 'castle'); + const data = new BedWarsMode({ stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(BedWarsMode); expectTypeOf(data).toEqualTypeOf(); - expect(data.mode).toBeDefined(); - expectTypeOf(data.mode).toEqualTypeOf(); - expect(data.winStreak).toBeDefined(); - expect(data.winStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winStreak).toEqualTypeOf(); - expect(data.playedGames).toBeDefined(); - expect(data.playedGames).toBeGreaterThanOrEqual(0); - expectTypeOf(data.playedGames).toEqualTypeOf(); + expect(data.resourcesCollected).toBeDefined(); + expect(data.resourcesCollected).toBeInstanceOf(BedWarsResourcesCollected); + expectTypeOf(data.resourcesCollected).toEqualTypeOf(); expect(data.kills).toBeDefined(); - expect(data.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.kills).toEqualTypeOf(); - expect(data.deaths).toBeDefined(); - expect(data.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.kills).toBeInstanceOf(BedWarsKillsDeaths); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.finals).toBeDefined(); + expect(data.finals).toBeInstanceOf(BedWarsKillsDeaths); + expectTypeOf(data.finals).toEqualTypeOf(); + expect(data.beds).toBeDefined(); + expect(data.beds).toBeInstanceOf(BedWarsBeds); + expectTypeOf(data.beds).toEqualTypeOf(); + expect(data.winstreak).toBeDefined(); + expect(data.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winstreak).toEqualTypeOf(); expect(data.wins).toBeDefined(); expect(data.wins).toBeGreaterThanOrEqual(0); expectTypeOf(data.wins).toEqualTypeOf(); expect(data.losses).toBeDefined(); expect(data.losses).toBeGreaterThanOrEqual(0); expectTypeOf(data.losses).toEqualTypeOf(); - expect(data.finalKills).toBeDefined(); - expect(data.finalKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.finalKills).toEqualTypeOf(); - expect(data.finalDeaths).toBeDefined(); - expect(data.finalDeaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.finalDeaths).toEqualTypeOf(); - expect(data.beds).toBeDefined(); - expect(data.beds).toBeInstanceOf(BedWarsBeds); - expectTypeOf(data.beds).toEqualTypeOf(); - expect(data.KDR).toBeDefined(); - expect(data.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.KDR).toEqualTypeOf(); - expect(data.WLR).toBeDefined(); - expect(data.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.WLR).toEqualTypeOf(); - expect(data.FKDR).toBeDefined(); - expect(data.FKDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.FKDR).toEqualTypeOf(); + expect(data.winLossRatio).toBeDefined(); + expect(data.winLossRatio).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winLossRatio).toEqualTypeOf(); + expect(data.gamesPlayed).toBeDefined(); + expect(data.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gamesPlayed).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/BedWars/BedWarsMode.ts b/src/Structures/MiniGames/BedWars/BedWarsMode.ts index 3dd46d5a3..d59b93028 100644 --- a/src/Structures/MiniGames/BedWars/BedWarsMode.ts +++ b/src/Structures/MiniGames/BedWars/BedWarsMode.ts @@ -1,35 +1,31 @@ import BedWarsBeds from './BedWarsBeds.js'; +import BedWarsKillsDeaths from './BedWarsKillsDeaths/BedWarsKillsDeaths.js'; +import BedWarsResourcesCollected from './BedWarsResourcesCollected.js'; import Divide from '../../../Utils/Divide.js'; -import type { BedWarsGamemodeName } from '../../../Types/Player.js'; +import ParseBedWarsMode from '../../../Utils/ParseBedWarsMode.js'; +import type { BedWarsModeId } from '../../../Types/Player.js'; class BedWarsMode { - mode: BedWarsGamemodeName; - winStreak: number; - playedGames: number; - kills: number; - deaths: number; + resourcesCollected: BedWarsResourcesCollected; + kills: BedWarsKillsDeaths; + finals: BedWarsKillsDeaths; + beds: BedWarsBeds; + winstreak: number; wins: number; losses: number; - finalKills: number; - finalDeaths: number; - beds: BedWarsBeds; - KDR: number; - WLR: number; - FKDR: number; - constructor(data: Record, mode: BedWarsGamemodeName) { - this.mode = mode; - this.winStreak = data?.[`${mode}_winstreak`] || 0; - this.playedGames = data?.[`${mode}_games_played_bedwars`] || 0; - this.kills = data?.[`${mode}_kills_bedwars`] || 0; - this.deaths = data?.[`${mode}_deaths_bedwars`] || 0; - this.wins = data?.[`${mode}_wins_bedwars`] || 0; - this.losses = data?.[`${mode}_losses_bedwars`] || 0; - this.finalKills = data?.[`${mode}_final_kills_bedwars`] || 0; - this.finalDeaths = data?.[`${mode}_final_deaths_bedwars`] || 0; + winLossRatio: number; + gamesPlayed: number; + constructor(data: Record, mode?: BedWarsModeId) { + mode = ParseBedWarsMode(mode) as BedWarsModeId; + this.resourcesCollected = new BedWarsResourcesCollected(data, mode); + this.kills = new BedWarsKillsDeaths(data, mode); + this.finals = new BedWarsKillsDeaths(data, mode, true); this.beds = new BedWarsBeds(data, mode); - this.KDR = Divide(data?.[`${mode}_kills_bedwars`], data?.[`${mode}_deaths_bedwars`]); - this.WLR = Divide(data?.[`${mode}_wins_bedwars`], data?.[`${mode}_losses_bedwars`]); - this.FKDR = Divide(data?.[`${mode}_final_kills_bedwars`], data?.[`${mode}_final_deaths_bedwars`]); + this.winstreak = data?.[`${mode}winstreak`] || 0; + this.wins = data?.[`${mode}wins_bedwars`] || 0; + this.losses = data?.[`${mode}losses_bedwars`] || 0; + this.winLossRatio = Divide(this.wins, this.losses); + this.gamesPlayed = data?.[`${mode}games_played_bedwars`] || 0; } } diff --git a/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPractice.test.ts b/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPractice.test.ts new file mode 100644 index 000000000..5f60e326e --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPractice.test.ts @@ -0,0 +1,26 @@ +import BedWarsPractice from './BedWarsPractice.js'; +import BedWarsPracticeBridging from './BedWarsPracticeBridging.js'; +import BedWarsPracticeMode from './BedWarsPracticeMode.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { BedWarsPracticeModeId } from '../../../../Types/Player.js'; + +test('BedWarsPractice', () => { + const data = new BedWarsPractice({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsPractice); + expectTypeOf(data).toEqualTypeOf(); + expect(data.bridging).toBeDefined(); + expect(data.bridging).toBeInstanceOf(BedWarsPracticeBridging); + expectTypeOf(data.bridging).toEqualTypeOf(); + expect(data.fireballJumping).toBeDefined(); + expect(data.fireballJumping).toBeInstanceOf(BedWarsPracticeMode); + expectTypeOf(data.fireballJumping).toEqualTypeOf(); + expect(data.mlg).toBeDefined(); + expect(data.mlg).toBeInstanceOf(BedWarsPracticeMode); + expectTypeOf(data.mlg).toEqualTypeOf(); + expect(data.pearlClutching).toBeDefined(); + expect(data.pearlClutching).toBeInstanceOf(BedWarsPracticeMode); + expectTypeOf(data.pearlClutching).toEqualTypeOf(); + expect(data.selected).toBeDefined(); + expectTypeOf(data.selected).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPractice.ts b/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPractice.ts new file mode 100644 index 000000000..67758145e --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPractice.ts @@ -0,0 +1,20 @@ +import BedWarsPracticeBridging from './BedWarsPracticeBridging.js'; +import BedWarsPracticeMode from './BedWarsPracticeMode.js'; +import type { BedWarsPracticeModeId } from '../../../../Types/Player.js'; + +class BedWarsPractice { + bridging: BedWarsPracticeBridging; + fireballJumping: BedWarsPracticeMode; + mlg: BedWarsPracticeMode; + pearlClutching: BedWarsPracticeMode; + selected: BedWarsPracticeModeId | 'UNKNOWN'; + constructor(data: Record) { + this.bridging = new BedWarsPracticeBridging(data?.bridging || {}, data?.records || {}); + this.fireballJumping = new BedWarsPracticeMode(data?.fireball_jumping || {}); + this.mlg = new BedWarsPracticeMode(data?.mlg || {}); + this.pearlClutching = new BedWarsPracticeMode(data?.pearl_clutching || {}); + this.selected = data?.selected || 'UNKNOWN'; + } +} + +export default BedWarsPractice; diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridging.test.ts b/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridging.test.ts similarity index 81% rename from src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridging.test.ts rename to src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridging.test.ts index 56a070236..10e56f86b 100644 --- a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridging.test.ts +++ b/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridging.test.ts @@ -1,9 +1,9 @@ import BedWarsPracticeBridging from './BedWarsPracticeBridging.js'; -import BedWarsPracticeBridgingRecords from './BedWarsPracticeBridgingRecords.js'; +import BedWarsPracticeBridgingRecords from './BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecords.js'; import { expect, expectTypeOf, test } from 'vitest'; test('BedWarsPracticeBridging', () => { - const data = new BedWarsPracticeBridging({ stats: 'meow' }, {}); + const data = new BedWarsPracticeBridging({ stats: 'meow' }, { stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(BedWarsPracticeBridging); expectTypeOf(data).toEqualTypeOf(); diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridging.ts b/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridging.ts similarity index 63% rename from src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridging.ts rename to src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridging.ts index 337ef4967..eadab3085 100644 --- a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridging.ts +++ b/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridging.ts @@ -1,7 +1,7 @@ -import BedWarsPracticeBaseBlocksPlaced from './BedWarsPracticeBaseBlocksPlaced.js'; -import BedWarsPracticeBridgingRecords from './BedWarsPracticeBridgingRecords.js'; +import BedWarsPracticeBridgingRecords from './BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecords.js'; +import BedWarsPracticeMode from './BedWarsPracticeMode.js'; -class BedWarsPracticeBridging extends BedWarsPracticeBaseBlocksPlaced { +class BedWarsPracticeBridging extends BedWarsPracticeMode { records: BedWarsPracticeBridgingRecords; constructor(data: Record, records: Record) { super(data); diff --git a/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecords.test.ts b/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecords.test.ts new file mode 100644 index 000000000..d252b72b0 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecords.test.ts @@ -0,0 +1,19 @@ +import BedWarsPracticeBridgingRecords from './BedWarsPracticeBridgingRecords.js'; +import BedWarsPracticeBridgingRecordsDistance from './BedWarsPracticeBridgingRecordsDistance.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsPracticeBridgingRecords', () => { + const data = new BedWarsPracticeBridgingRecords({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsPracticeBridgingRecords); + expectTypeOf(data).toEqualTypeOf(); + expect(data.blocks100).toBeDefined(); + expect(data.blocks100).toBeInstanceOf(BedWarsPracticeBridgingRecordsDistance); + expectTypeOf(data.blocks100).toEqualTypeOf(); + expect(data.blocks50).toBeDefined(); + expect(data.blocks50).toBeInstanceOf(BedWarsPracticeBridgingRecordsDistance); + expectTypeOf(data.blocks50).toEqualTypeOf(); + expect(data.blocks30).toBeDefined(); + expect(data.blocks30).toBeInstanceOf(BedWarsPracticeBridgingRecordsDistance); + expectTypeOf(data.blocks30).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecords.ts b/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecords.ts new file mode 100644 index 000000000..35038a341 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecords.ts @@ -0,0 +1,14 @@ +import BedWarsPracticeBridgingRecordsDistance from './BedWarsPracticeBridgingRecordsDistance.js'; + +class BedWarsPracticeBridgingRecords { + blocks100: BedWarsPracticeBridgingRecordsDistance; + blocks50: BedWarsPracticeBridgingRecordsDistance; + blocks30: BedWarsPracticeBridgingRecordsDistance; + constructor(data: Record) { + this.blocks100 = new BedWarsPracticeBridgingRecordsDistance(data, '100'); + this.blocks50 = new BedWarsPracticeBridgingRecordsDistance(data, '50'); + this.blocks30 = new BedWarsPracticeBridgingRecordsDistance(data, '30'); + } +} + +export default BedWarsPracticeBridgingRecords; diff --git a/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecordsDistance.test.ts b/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecordsDistance.test.ts new file mode 100644 index 000000000..f3e3320b5 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecordsDistance.test.ts @@ -0,0 +1,19 @@ +import BedWarsPracticeBridgingRecordsDistance from './BedWarsPracticeBridgingRecordsDistance.js'; +import BedWarsPracticeBridgingRecordsEevation from './BedWarsPracticeBridgingRecordsEevation.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsPracticeBridgingRecordsDistance', () => { + const data = new BedWarsPracticeBridgingRecordsDistance({ stats: 'meow' }, '100'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsPracticeBridgingRecordsDistance); + expectTypeOf(data).toEqualTypeOf(); + expect(data.none).toBeDefined(); + expect(data.none).toBeInstanceOf(BedWarsPracticeBridgingRecordsEevation); + expectTypeOf(data.none).toEqualTypeOf(); + expect(data.slight).toBeDefined(); + expect(data.slight).toBeInstanceOf(BedWarsPracticeBridgingRecordsEevation); + expectTypeOf(data.slight).toEqualTypeOf(); + expect(data.staircase).toBeDefined(); + expect(data.staircase).toBeInstanceOf(BedWarsPracticeBridgingRecordsEevation); + expectTypeOf(data.staircase).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecordsDistance.ts b/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecordsDistance.ts new file mode 100644 index 000000000..1add09ee4 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecordsDistance.ts @@ -0,0 +1,15 @@ +import BedWarsPracticeBridgingRecordsEevation from './BedWarsPracticeBridgingRecordsEevation.js'; +import type { BedWarsPracticeBridgingRecordsDistances } from '../../../../../Types/Player.js'; + +class BedWarsPracticeBridgingRecordsDistance { + none: BedWarsPracticeBridgingRecordsEevation; + slight: BedWarsPracticeBridgingRecordsEevation; + staircase: BedWarsPracticeBridgingRecordsEevation; + constructor(data: Record, distance: BedWarsPracticeBridgingRecordsDistances) { + this.none = new BedWarsPracticeBridgingRecordsEevation(data, distance, 'NONE'); + this.slight = new BedWarsPracticeBridgingRecordsEevation(data, distance, 'SLIGHT'); + this.staircase = new BedWarsPracticeBridgingRecordsEevation(data, distance, 'STAIRCASE'); + } +} + +export default BedWarsPracticeBridgingRecordsDistance; diff --git a/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecordsEevation.test.ts b/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecordsEevation.test.ts new file mode 100644 index 000000000..a5b916ae0 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecordsEevation.test.ts @@ -0,0 +1,15 @@ +import BedWarsPracticeBridgingRecordsEevation from './BedWarsPracticeBridgingRecordsEevation.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsPracticeBridgingRecordsEevation', () => { + const data = new BedWarsPracticeBridgingRecordsEevation({ stats: 'meow' }, '100', 'NONE'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsPracticeBridgingRecordsEevation); + expectTypeOf(data).toEqualTypeOf(); + expect(data.diagonal).toBeDefined(); + expect(data.diagonal).toBeGreaterThanOrEqual(0); + expectTypeOf(data.diagonal).toEqualTypeOf(); + expect(data.straight).toBeDefined(); + expect(data.straight).toBeGreaterThanOrEqual(0); + expectTypeOf(data.straight).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecordsEevation.ts b/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecordsEevation.ts new file mode 100644 index 000000000..2dcf92dd1 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecordsEevation.ts @@ -0,0 +1,19 @@ +import type { + BedWarsPracticeBridgingRecordsDistances, + BedWarsPracticeBridgingRecordsElevations +} from '../../../../../Types/Player.js'; + +class BedWarsPracticeBridgingRecordsEevation { + diagonal: number; + straight: number; + constructor( + data: Record, + distance: BedWarsPracticeBridgingRecordsDistances, + elevation: BedWarsPracticeBridgingRecordsElevations + ) { + this.diagonal = data?.[`bridging_distance_${distance}:elevation_${elevation}:angle_DIAGONAL`] || 0; + this.straight = data?.[`bridging_distance_${distance}:elevation_${elevation}:angle_STRAIGHT`] || 0; + } +} + +export default BedWarsPracticeBridgingRecordsEevation; diff --git a/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeMode.test.ts b/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeMode.test.ts new file mode 100644 index 000000000..3e4264153 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeMode.test.ts @@ -0,0 +1,24 @@ +import BedWarsPracticeMode from './BedWarsPracticeMode.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsPracticeMode', () => { + const data = new BedWarsPracticeMode({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsPracticeMode); + expectTypeOf(data).toEqualTypeOf(); + expect(data.blocksPlaced).toBeDefined(); + expect(data.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksPlaced).toEqualTypeOf(); + expect(data.successfulAttempts).toBeDefined(); + expect(data.successfulAttempts).toBeGreaterThanOrEqual(0); + expectTypeOf(data.successfulAttempts).toEqualTypeOf(); + expect(data.failedAttempts).toBeDefined(); + expect(data.failedAttempts).toBeGreaterThanOrEqual(0); + expectTypeOf(data.failedAttempts).toEqualTypeOf(); + expect(data.attempts).toBeDefined(); + expect(data.attempts).toBeGreaterThanOrEqual(0); + expectTypeOf(data.attempts).toEqualTypeOf(); + expect(data.successfulRatio).toBeDefined(); + expect(data.successfulRatio).toBeGreaterThanOrEqual(0); + expectTypeOf(data.successfulRatio).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeMode.ts b/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeMode.ts new file mode 100644 index 000000000..afef64ad4 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeMode.ts @@ -0,0 +1,18 @@ +import Divide from '../../../../Utils/Divide.js'; + +class BedWarsPracticeMode { + blocksPlaced: number; + successfulAttempts: number; + failedAttempts: number; + attempts: number; + successfulRatio: number; + constructor(data: Record) { + this.blocksPlaced = data?.blocks_placed || 0; + this.successfulAttempts = data?.successful_attempts || 0; + this.failedAttempts = data?.failed_attempts || 0; + this.attempts = this.successfulAttempts + this.failedAttempts; + this.successfulRatio = Divide(this.successfulAttempts, this.failedAttempts); + } +} + +export default BedWarsPracticeMode; diff --git a/src/Structures/MiniGames/BedWars/BedWarsPrivateGameSettings.test.ts b/src/Structures/MiniGames/BedWars/BedWarsPrivateGameSettings.test.ts new file mode 100644 index 000000000..e70da05b2 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsPrivateGameSettings.test.ts @@ -0,0 +1,37 @@ +import BedWarsPrivateGameSettings from './BedWarsPrivateGameSettings.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { + BedWarsPrivateGameSettingsEventTime, + BedWarsPrivateGameSettingsGameSpeed, + BedWarsPrivateGameSettingsHealthBuff, + BedWarsPrivateGameSettingsRespawnTime +} from '../../../Types/Player.js'; + +test('BedWarsPrivateGameSettings', () => { + const data = new BedWarsPrivateGameSettings({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsPrivateGameSettings); + expectTypeOf(data).toEqualTypeOf(); + expect(data.bedInstaBreak).toBeDefined(); + expectTypeOf(data.bedInstaBreak).toEqualTypeOf(); + expect(data.disableBlockProtection).toBeDefined(); + expectTypeOf(data.disableBlockProtection).toEqualTypeOf(); + expect(data.eventTime).toBeDefined(); + expectTypeOf(data.eventTime).toEqualTypeOf(); + expect(data.healthBuff).toBeDefined(); + expectTypeOf(data.healthBuff).toEqualTypeOf(); + expect(data.lowGravity).toBeDefined(); + expectTypeOf(data.lowGravity).toEqualTypeOf(); + expect(data.maxTeamUpgrades).toBeDefined(); + expectTypeOf(data.maxTeamUpgrades).toEqualTypeOf(); + expect(data.noDiamonds).toBeDefined(); + expectTypeOf(data.noDiamonds).toEqualTypeOf(); + expect(data.noEmeralds).toBeDefined(); + expectTypeOf(data.noEmeralds).toEqualTypeOf(); + expect(data.oneHitOneKill).toBeDefined(); + expectTypeOf(data.oneHitOneKill).toEqualTypeOf(); + expect(data.respawnTime).toBeDefined(); + expectTypeOf(data.respawnTime).toEqualTypeOf(); + expect(data.speed).toBeDefined(); + expectTypeOf(data.speed).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsPrivateGameSettings.ts b/src/Structures/MiniGames/BedWars/BedWarsPrivateGameSettings.ts new file mode 100644 index 000000000..d1428e2ab --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsPrivateGameSettings.ts @@ -0,0 +1,35 @@ +import type { + BedWarsPrivateGameSettingsEventTime, + BedWarsPrivateGameSettingsGameSpeed, + BedWarsPrivateGameSettingsHealthBuff, + BedWarsPrivateGameSettingsRespawnTime +} from '../../../Types/Player.js'; + +class BedWarsPrivateGameSettings { + bedInstaBreak: boolean; + disableBlockProtection: boolean; + eventTime: BedWarsPrivateGameSettingsEventTime; + healthBuff: BedWarsPrivateGameSettingsHealthBuff; + lowGravity: boolean; + maxTeamUpgrades: boolean; + noDiamonds: boolean; + noEmeralds: boolean; + oneHitOneKill: boolean; + respawnTime: BedWarsPrivateGameSettingsRespawnTime; + speed: BedWarsPrivateGameSettingsGameSpeed; + constructor(data: Record) { + this.bedInstaBreak = data?.bed_instabreak || false; + this.disableBlockProtection = data?.disable_block_protection || false; + this.eventTime = data?.event_time || '1x - Normal'; + this.healthBuff = data?.health_buff || 'Normal Health'; + this.lowGravity = data?.low_gravity || false; + this.maxTeamUpgrades = data?.max_team_upgrades || false; + this.noDiamonds = data?.no_diamonds || false; + this.noEmeralds = data?.no_emeralds || false; + this.oneHitOneKill = data?.one_hit_one_kill || false; + this.respawnTime = data?.respawn_time || '5 Seconds'; + this.speed = data?.speed || 'No Speed'; + } +} + +export default BedWarsPrivateGameSettings; diff --git a/src/Structures/MiniGames/BedWars/BedWarsResourcesCollected.test.ts b/src/Structures/MiniGames/BedWars/BedWarsResourcesCollected.test.ts new file mode 100644 index 000000000..3b11ae887 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsResourcesCollected.test.ts @@ -0,0 +1,34 @@ +import BedWarsItemsPurchased from './BedWarsItemsPurchased.js'; +import BedWarsResourcesCollected from './BedWarsResourcesCollected.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsResourcesCollected', () => { + const data = new BedWarsResourcesCollected({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsResourcesCollected); + expectTypeOf(data).toEqualTypeOf(); + expect(data.total).toBeDefined(); + expect(data.total).toBeGreaterThanOrEqual(0); + expectTypeOf(data.total).toEqualTypeOf(); + expect(data.emerald).toBeDefined(); + expect(data.emerald).toBeGreaterThanOrEqual(0); + expectTypeOf(data.emerald).toEqualTypeOf(); + expect(data.diamond).toBeDefined(); + expect(data.diamond).toBeGreaterThanOrEqual(0); + expectTypeOf(data.diamond).toEqualTypeOf(); + expect(data.gold).toBeDefined(); + expect(data.gold).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gold).toEqualTypeOf(); + expect(data.iron).toBeDefined(); + expect(data.iron).toBeGreaterThanOrEqual(0); + expectTypeOf(data.iron).toEqualTypeOf(); + expect(data.wrappedPresent).toBeDefined(); + expect(data.wrappedPresent).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wrappedPresent).toEqualTypeOf(); + expect(data.bed).toBeDefined(); + expect(data.bed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bed).toEqualTypeOf(); + expect(data.itemsPurchased).toBeDefined(); + expect(data.itemsPurchased).toBeInstanceOf(BedWarsItemsPurchased); + expectTypeOf(data.itemsPurchased).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsResourcesCollected.ts b/src/Structures/MiniGames/BedWars/BedWarsResourcesCollected.ts new file mode 100644 index 000000000..47041370b --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsResourcesCollected.ts @@ -0,0 +1,27 @@ +import BedWarsItemsPurchased from './BedWarsItemsPurchased.js'; +import ParseBedWarsMode from '../../../Utils/ParseBedWarsMode.js'; +import type { BedWarsModeId } from '../../../Types/Player.js'; + +class BedWarsResourcesCollected { + total: number; + emerald: number; + diamond: number; + gold: number; + iron: number; + wrappedPresent: number; + bed: number; + itemsPurchased: BedWarsItemsPurchased; + constructor(data: Record, mode?: BedWarsModeId) { + mode = ParseBedWarsMode(mode) as BedWarsModeId; + this.total = data?.[`${mode}resources_collected_bedwars`] || 0; + this.emerald = data?.[`${mode}emerald_resources_collected_bedwars`] || 0; + this.diamond = data?.[`${mode}diamond_resources_collected_bedwars`] || 0; + this.gold = data?.[`${mode}gold_resources_collected_bedwars`] || 0; + this.iron = data?.[`${mode}iron_resources_collected_bedwars`] || 0; + this.wrappedPresent = data?.[`${mode}wrapped_present_resources_collected_bedwars`] || 0; + this.bed = data?.[`${mode}bed_resources_collected_bedwars`] || 0; + this.itemsPurchased = new BedWarsItemsPurchased(data, mode); + } +} + +export default BedWarsResourcesCollected; diff --git a/src/Structures/MiniGames/BedWars/BedWarsSettings.test.ts b/src/Structures/MiniGames/BedWars/BedWarsSettings.test.ts new file mode 100644 index 000000000..c9a125cca --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSettings.test.ts @@ -0,0 +1,18 @@ +import BedWarsSettings from './BedWarsSettings.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { BedWarsSettingsDeposit, BedWarsSettingsSlumberItemNotification } from '../../../Types/Player.js'; + +test('BedWarsSettings', () => { + const data = new BedWarsSettings({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsSettings); + expectTypeOf(data).toEqualTypeOf(); + expect(data.deposit).toBeDefined(); + expectTypeOf(data.deposit).toEqualTypeOf(); + expect(data.slumberItemNotification).toBeDefined(); + expectTypeOf(data.slumberItemNotification).toEqualTypeOf(); + expect(data.slumberWalletFull).toBeDefined(); + expectTypeOf(data.slumberWalletFull).toEqualTypeOf(); + expect(data.trapRemoval).toBeDefined(); + expectTypeOf(data.trapRemoval).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsSettings.ts b/src/Structures/MiniGames/BedWars/BedWarsSettings.ts new file mode 100644 index 000000000..d4af5ed3d --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSettings.ts @@ -0,0 +1,16 @@ +import type { BedWarsSettingsDeposit, BedWarsSettingsSlumberItemNotification } from '../../../Types/Player.js'; + +class BedWarsSettings { + deposit: BedWarsSettingsDeposit; + slumberItemNotification: BedWarsSettingsSlumberItemNotification; + slumberWalletFull: boolean; + trapRemoval: boolean; + constructor(data: Record) { + this.deposit = data?.deposit || 'ENABLED'; + this.slumberItemNotification = data?.slumberItemNotification || 'CHAT_MESSAGES'; + this.slumberWalletFull = data?.slumberWalletFull || true; + this.trapRemoval = data?.trapRemoval || false; + } +} + +export default BedWarsSettings; diff --git a/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumber.test.ts b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumber.test.ts new file mode 100644 index 000000000..153048c6c --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumber.test.ts @@ -0,0 +1,57 @@ +import BedWarsSLumberSandman from './BedWarsSlumberSandman.js'; +import BedWarsSlumber from './BedWarsSlumber.js'; +import BedWarsSlumberMinion from './BedWarsSlumberMinion.js'; +import BedWarsSlumberPhase from './BedWarsSlumberPhase.js'; +import BedWarsSlumberPhaseThree from './BedWarsSlumberPhaseThree.js'; +import BedWarsSlumberQuest from './BedWarsSlumberQuest/BedWarsSlumberQuest.js'; +import BedWarsSlumberRoom from './BedWarsSlumberRoom.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { BedWarsSlumberBag, ShopSort } from '../../../../Types/Player.js'; + +test('BedWarsSlumber', () => { + const data = new BedWarsSlumber({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsSlumber); + expectTypeOf(data).toEqualTypeOf(); + expect(data.bagType).toBeDefined(); + expectTypeOf(data.bagType).toEqualTypeOf(); + expect(data.boonMultiplier).toBeDefined(); + expect(data.boonMultiplier).toBeGreaterThanOrEqual(0); + expectTypeOf(data.boonMultiplier).toEqualTypeOf(); + expect(data.currentCosmeticSorting).toBeDefined(); + expectTypeOf(data.currentCosmeticSorting).toEqualTypeOf(); + expect(data.doublers).toBeDefined(); + expect(data.doublers).toBeGreaterThanOrEqual(0); + expectTypeOf(data.doublers).toEqualTypeOf(); + expect(data.minion).toBeDefined(); + expect(data.minion).toBeInstanceOf(BedWarsSlumberMinion); + expectTypeOf(data.minion).toEqualTypeOf(); + expect(data.phase).toBeDefined(); + expect(data.phase).toBeInstanceOf(BedWarsSlumberPhase); + expectTypeOf(data.phase).toEqualTypeOf(); + expect(data.phasethree).toBeDefined(); + expect(data.phasethree).toBeInstanceOf(BedWarsSlumberPhaseThree); + expectTypeOf(data.phasethree).toEqualTypeOf(); + expect(data.quest).toBeDefined(); + expect(data.quest).toBeInstanceOf(BedWarsSlumberQuest); + expectTypeOf(data.quest).toEqualTypeOf(); + expect(data.rooms).toBeDefined(); + expect(data.rooms).toBeInstanceOf(BedWarsSlumberRoom); + expectTypeOf(data.rooms).toEqualTypeOf(); + expect(data.sandman).toBeDefined(); + expect(data.sandman).toBeInstanceOf(BedWarsSLumberSandman); + expectTypeOf(data.sandman).toEqualTypeOf(); + expect(data.tickets).toBeDefined(); + expect(data.tickets).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tickets).toEqualTypeOf(); + expect(data.ticketsGivenToDoorman).toBeDefined(); + expect(data.ticketsGivenToDoorman).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ticketsGivenToDoorman).toEqualTypeOf(); + expect(data.ticketsRequirementMet).toBeDefined(); + expectTypeOf(data.ticketsRequirementMet).toEqualTypeOf(); + expect(data.totalTicketsEarned).toBeDefined(); + expect(data.totalTicketsEarned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.totalTicketsEarned).toEqualTypeOf(); + expect(data.walletFullWarning).toBeDefined(); + expectTypeOf(data.walletFullWarning).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumber.ts b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumber.ts new file mode 100644 index 000000000..91721f509 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumber.ts @@ -0,0 +1,44 @@ +import BedWarsSLumberSandman from './BedWarsSlumberSandman.js'; +import BedWarsSlumberMinion from './BedWarsSlumberMinion.js'; +import BedWarsSlumberPhase from './BedWarsSlumberPhase.js'; +import BedWarsSlumberPhaseThree from './BedWarsSlumberPhaseThree.js'; +import BedWarsSlumberQuest from './BedWarsSlumberQuest/BedWarsSlumberQuest.js'; +import BedWarsSlumberRoom from './BedWarsSlumberRoom.js'; +import type { BedWarsSlumberBag, ShopSort } from '../../../../Types/Player.js'; + +class BedWarsSlumber { + bagType: BedWarsSlumberBag | 'UNKNOWN'; + boonMultiplier: number; + currentCosmeticSorting: ShopSort | 'UNKNOWN'; + doublers: number; + minion: BedWarsSlumberMinion; + phase: BedWarsSlumberPhase; + phasethree: BedWarsSlumberPhaseThree; + quest: BedWarsSlumberQuest; + rooms: BedWarsSlumberRoom; + sandman: BedWarsSLumberSandman; + tickets: number; + ticketsGivenToDoorman: number; + ticketsRequirementMet: boolean; + totalTicketsEarned: number; + walletFullWarning: boolean; + constructor(data: Record) { + this.bagType = data?.bag_type || 'UNKNOWN'; + this.boonMultiplier = data?.boon_multiplier || 0; + this.currentCosmeticSorting = data?.currentCosmeticSorting || 'UNKNOWN'; + this.doublers = data?.doublers || 0; + this.minion = new BedWarsSlumberMinion(data?.minion || {}); + this.phase = new BedWarsSlumberPhase(data?.phase || {}); + this.phasethree = new BedWarsSlumberPhaseThree(data?.phasethree || {}); + this.quest = new BedWarsSlumberQuest(data?.quest || {}); + this.rooms = new BedWarsSlumberRoom(data?.room || {}); + this.sandman = new BedWarsSLumberSandman(data?.sandman || {}); + this.tickets = data?.tickets || 0; + this.ticketsGivenToDoorman = data?.tickets_given_doorman || 0; + this.ticketsRequirementMet = data?.tickets_requirement_met || false; + this.totalTicketsEarned = data?.total_tickets_earned || 0; + this.walletFullWarning = data?.wallet_full_warning || false; + } +} + +export default BedWarsSlumber; diff --git a/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberMinion.test.ts b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberMinion.test.ts new file mode 100644 index 000000000..0c60da22e --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberMinion.test.ts @@ -0,0 +1,24 @@ +import BedWarsSlumberMinion from './BedWarsSlumberMinion.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsSlumberMinion', () => { + const data = new BedWarsSlumberMinion({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsSlumberMinion); + expectTypeOf(data).toEqualTypeOf(); + expect(data.enderDust).toBeDefined(); + expect(data.enderDust).toBeGreaterThanOrEqual(0); + expectTypeOf(data.enderDust).toEqualTypeOf(); + expect(data.enderDustCollected).toBeDefined(); + expect(data.enderDustCollected).toBeGreaterThanOrEqual(0); + expectTypeOf(data.enderDustCollected).toEqualTypeOf(); + expect(data.games).toBeDefined(); + expect(data.games).toBeGreaterThanOrEqual(0); + expectTypeOf(data.games).toEqualTypeOf(); + expect(data.tickets).toBeDefined(); + expect(data.tickets).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tickets).toEqualTypeOf(); + expect(data.ticketsCollected).toBeDefined(); + expect(data.ticketsCollected).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ticketsCollected).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberMinion.ts b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberMinion.ts new file mode 100644 index 000000000..8f6a1fa14 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberMinion.ts @@ -0,0 +1,16 @@ +class BedWarsSlumberMinion { + enderDust: number; + enderDustCollected: number; + games: number; + tickets: number; + ticketsCollected: number; + constructor(data: Record) { + this.enderDust = data?.ender_dust || 0; + this.enderDustCollected = data?.ender_dust_collected || 0; + this.games = data?.games || 0; + this.tickets = data?.tickets || 0; + this.ticketsCollected = data?.tickets_collected || 0; + } +} + +export default BedWarsSlumberMinion; diff --git a/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberPhase.test.ts b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberPhase.test.ts new file mode 100644 index 000000000..7d4aa204d --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberPhase.test.ts @@ -0,0 +1,12 @@ +import BedWarsSlumberPhase from './BedWarsSlumberPhase.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsSlumberPhase', () => { + const data = new BedWarsSlumberPhase({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsSlumberPhase); + expectTypeOf(data).toEqualTypeOf(); + expect(data.current).toBeDefined(); + expect(data.current).toBeGreaterThanOrEqual(0); + expectTypeOf(data.current).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberPhase.ts b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberPhase.ts new file mode 100644 index 000000000..18e7ab349 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberPhase.ts @@ -0,0 +1,8 @@ +class BedWarsSlumberPhase { + current: number; + constructor(data: Record) { + this.current = data?.current || 0; + } +} + +export default BedWarsSlumberPhase; diff --git a/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberPhaseThree.test.ts b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberPhaseThree.test.ts new file mode 100644 index 000000000..1789d662a --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberPhaseThree.test.ts @@ -0,0 +1,12 @@ +import BedWarsSlumberPhaseThree from './BedWarsSlumberPhaseThree.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsSlumberPhaseThree', () => { + const data = new BedWarsSlumberPhaseThree({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsSlumberPhaseThree); + expectTypeOf(data).toEqualTypeOf(); + expect(data.completedQuests).toBeDefined(); + expect(data.completedQuests).toBeGreaterThanOrEqual(0); + expectTypeOf(data.completedQuests).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberPhaseThree.ts b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberPhaseThree.ts new file mode 100644 index 000000000..733292123 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberPhaseThree.ts @@ -0,0 +1,8 @@ +class BedWarsSlumberPhaseThree { + completedQuests: number; + constructor(data: Record) { + this.completedQuests = data?.completed_quests || 0; + } +} + +export default BedWarsSlumberPhaseThree; diff --git a/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuest.test.ts b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuest.test.ts new file mode 100644 index 000000000..1cf98bd9f --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuest.test.ts @@ -0,0 +1,39 @@ +import BedWarsSlumberQuest from './BedWarsSlumberQuest.js'; +import BedWarsSlumberQuestGamblerGeorge from './BedWarsSlumberQuestGamblerGeorge.js'; +import BedWarsSlumberQuestItem from './BedWarsSlumberQuestItem.js'; +import BedWarsSlumberQuestNPC from './BedWarsSlumberQuestNPC.js'; +import BedWarsSlumberQuestNPCSBoolean from './BedWarsSlumberQuestNPCSBoolean.js'; +import BedWarsSlumberQuestNPCSNumber from './BedWarsSlumberQuestNPCSNumber.js'; +import BedWarsSlumberQuestObjective from './BedWarsSlumberQuestObjective.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsSlumberQuest', () => { + const data = new BedWarsSlumberQuest({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsSlumberQuest); + expectTypeOf(data).toEqualTypeOf(); + expect(data.completed).toBeDefined(); + expect(data.completed).toBeInstanceOf(BedWarsSlumberQuestNPCSBoolean); + expectTypeOf(data.completed).toEqualTypeOf(); + expect(data.gamblerGeorge).toBeDefined(); + expect(data.gamblerGeorge).toBeInstanceOf(BedWarsSlumberQuestGamblerGeorge); + expectTypeOf(data.gamblerGeorge).toEqualTypeOf(); + expect(data.item).toBeDefined(); + expect(data.item).toBeInstanceOf(BedWarsSlumberQuestItem); + expectTypeOf(data.item).toEqualTypeOf(); + expect(data.lastCompleted).toBeDefined(); + expect(data.lastCompleted).toBeInstanceOf(BedWarsSlumberQuestNPCSNumber); + expectTypeOf(data.lastCompleted).toEqualTypeOf(); + expect(data.lastStarted).toBeDefined(); + expect(data.lastStarted).toBeInstanceOf(BedWarsSlumberQuestNPCSNumber); + expectTypeOf(data.lastStarted).toEqualTypeOf(); + expect(data.npc).toBeDefined(); + expect(data.npc).toBeInstanceOf(BedWarsSlumberQuestNPC); + expectTypeOf(data.npc).toEqualTypeOf(); + expect(data.objective).toBeDefined(); + expect(data.objective).toBeInstanceOf(BedWarsSlumberQuestObjective); + expectTypeOf(data.objective).toEqualTypeOf(); + expect(data.started).toBeDefined(); + expect(data.started).toBeInstanceOf(BedWarsSlumberQuestNPCSBoolean); + expectTypeOf(data.started).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuest.ts b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuest.ts new file mode 100644 index 000000000..fe9113bc8 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuest.ts @@ -0,0 +1,29 @@ +import BedWarsSlumberQuestGamblerGeorge from './BedWarsSlumberQuestGamblerGeorge.js'; +import BedWarsSlumberQuestItem from './BedWarsSlumberQuestItem.js'; +import BedWarsSlumberQuestNPC from './BedWarsSlumberQuestNPC.js'; +import BedWarsSlumberQuestNPCSBoolean from './BedWarsSlumberQuestNPCSBoolean.js'; +import BedWarsSlumberQuestNPCSNumber from './BedWarsSlumberQuestNPCSNumber.js'; +import BedWarsSlumberQuestObjective from './BedWarsSlumberQuestObjective.js'; + +class BedWarsSlumberQuest { + completed: BedWarsSlumberQuestNPCSBoolean; + gamblerGeorge: BedWarsSlumberQuestGamblerGeorge; + item: BedWarsSlumberQuestItem; + lastCompleted: BedWarsSlumberQuestNPCSNumber; + lastStarted: BedWarsSlumberQuestNPCSNumber; + npc: BedWarsSlumberQuestNPC; + objective: BedWarsSlumberQuestObjective; + started: BedWarsSlumberQuestNPCSBoolean; + constructor(data: Record) { + this.completed = new BedWarsSlumberQuestNPCSBoolean(data?.completed || {}); + this.gamblerGeorge = new BedWarsSlumberQuestGamblerGeorge(data?.gambler_george || {}); + this.item = new BedWarsSlumberQuestItem(data?.item || {}); + this.lastCompleted = new BedWarsSlumberQuestNPCSNumber(data?.lastCompleted || {}); + this.lastStarted = new BedWarsSlumberQuestNPCSNumber(data?.lastStarted || {}); + this.npc = new BedWarsSlumberQuestNPC(data?.npc || {}); + this.objective = new BedWarsSlumberQuestObjective(data?.objective || {}); + this.started = new BedWarsSlumberQuestNPCSBoolean(data?.started || {}); + } +} + +export default BedWarsSlumberQuest; diff --git a/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestGamblerGeorge.test.ts b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestGamblerGeorge.test.ts new file mode 100644 index 000000000..cbf129504 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestGamblerGeorge.test.ts @@ -0,0 +1,24 @@ +import BedWarsSlumberQuestGamblerGeorge from './BedWarsSlumberQuestGamblerGeorge.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsSlumberQuestGamblerGeorge', () => { + const data = new BedWarsSlumberQuestGamblerGeorge({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsSlumberQuestGamblerGeorge); + expectTypeOf(data).toEqualTypeOf(); + expect(data.betAmount).toBeDefined(); + expect(data.betAmount).toBeGreaterThanOrEqual(0); + expectTypeOf(data.betAmount).toEqualTypeOf(); + expect(data.gambleGamesWon).toBeDefined(); + expect(data.gambleGamesWon).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gambleGamesWon).toEqualTypeOf(); + expect(data.lostBet).toBeDefined(); + expectTypeOf(data.lostBet).toEqualTypeOf(); + expect(data.lostBetTime).toBeDefined(); + expect(data.lostBetTime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.lostBetTime).toEqualTypeOf(); + expect(data.shouldReward).toBeDefined(); + expectTypeOf(data.shouldReward).toEqualTypeOf(); + expect(data.wonLastGame).toBeDefined(); + expectTypeOf(data.wonLastGame).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestGamblerGeorge.ts b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestGamblerGeorge.ts new file mode 100644 index 000000000..e8f5ce1a3 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestGamblerGeorge.ts @@ -0,0 +1,18 @@ +class BedWarsSlumberQuestGamblerGeorge { + betAmount: number; + gambleGamesWon: number; + lostBet: boolean; + lostBetTime: number; + shouldReward: boolean; + wonLastGame: boolean; + constructor(data: Record) { + this.betAmount = data?.bet_amount || 0; + this.gambleGamesWon = data?.gamble_games_won || 0; + this.lostBet = data?.lost_bet || false; + this.lostBetTime = data?.lost_bet_time || 0; + this.shouldReward = data?.should_reward || false; + this.wonLastGame = data?.won_last_game || false; + } +} + +export default BedWarsSlumberQuestGamblerGeorge; diff --git a/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestItem.test.ts b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestItem.test.ts new file mode 100644 index 000000000..55e563130 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestItem.test.ts @@ -0,0 +1,135 @@ +import BedWarsSlumberQuestItem from './BedWarsSlumberQuestItem.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsSlumberQuestItem', () => { + const data = new BedWarsSlumberQuestItem({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsSlumberQuestItem); + expectTypeOf(data).toEqualTypeOf(); + expect(data.airFreshener).toBeDefined(); + expect(data.airFreshener).toBeGreaterThanOrEqual(0); + expectTypeOf(data.airFreshener).toEqualTypeOf(); + expect(data.amulet).toBeDefined(); + expect(data.amulet).toBeGreaterThanOrEqual(0); + expectTypeOf(data.amulet).toEqualTypeOf(); + expect(data.bedSheets).toBeDefined(); + expect(data.bedSheets).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bedSheets).toEqualTypeOf(); + expect(data.blitzStar).toBeDefined(); + expect(data.blitzStar).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blitzStar).toEqualTypeOf(); + expect(data.blockOfMegaWallsObsidian).toBeDefined(); + expect(data.blockOfMegaWallsObsidian).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blockOfMegaWallsObsidian).toEqualTypeOf(); + expect(data.boots).toBeDefined(); + expect(data.boots).toBeGreaterThanOrEqual(0); + expectTypeOf(data.boots).toEqualTypeOf(); + expect(data.cable).toBeDefined(); + expect(data.cable).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cable).toEqualTypeOf(); + expect(data.cleanedUpMurderKnife).toBeDefined(); + expect(data.cleanedUpMurderKnife).toBeGreaterThanOrEqual(0); + expectTypeOf(data.cleanedUpMurderKnife).toEqualTypeOf(); + expect(data.comfyPillow).toBeDefined(); + expect(data.comfyPillow).toBeGreaterThanOrEqual(0); + expectTypeOf(data.comfyPillow).toEqualTypeOf(); + expect(data.diamondFragment).toBeDefined(); + expect(data.diamondFragment).toBeGreaterThanOrEqual(0); + expectTypeOf(data.diamondFragment).toEqualTypeOf(); + expect(data.discardedKartWheel).toBeDefined(); + expect(data.discardedKartWheel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.discardedKartWheel).toEqualTypeOf(); + expect(data.dwarvenMithril).toBeDefined(); + expect(data.dwarvenMithril).toBeGreaterThanOrEqual(0); + expectTypeOf(data.dwarvenMithril).toEqualTypeOf(); + expect(data.emeraldShard).toBeDefined(); + expect(data.emeraldShard).toBeGreaterThanOrEqual(0); + expectTypeOf(data.emeraldShard).toEqualTypeOf(); + expect(data.enchantedHammer).toBeDefined(); + expect(data.enchantedHammer).toBeGreaterThanOrEqual(0); + expectTypeOf(data.enchantedHammer).toEqualTypeOf(); + expect(data.enderDust).toBeDefined(); + expect(data.enderDust).toBeGreaterThanOrEqual(0); + expectTypeOf(data.enderDust).toEqualTypeOf(); + expect(data.fadedBlitzStar).toBeDefined(); + expect(data.fadedBlitzStar).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fadedBlitzStar).toEqualTypeOf(); + expect(data.gloves).toBeDefined(); + expect(data.gloves).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gloves).toEqualTypeOf(); + expect(data.glowingSandPaper).toBeDefined(); + expect(data.glowingSandPaper).toBeGreaterThanOrEqual(0); + expectTypeOf(data.glowingSandPaper).toEqualTypeOf(); + expect(data.goldBar).toBeDefined(); + expect(data.goldBar).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goldBar).toEqualTypeOf(); + expect(data.goldenTicket).toBeDefined(); + expect(data.goldenTicket).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goldenTicket).toEqualTypeOf(); + expect(data.imperialLeather).toBeDefined(); + expect(data.imperialLeather).toBeGreaterThanOrEqual(0); + expectTypeOf(data.imperialLeather).toEqualTypeOf(); + expect(data.indigosMap).toBeDefined(); + expect(data.indigosMap).toBeGreaterThanOrEqual(0); + expectTypeOf(data.indigosMap).toEqualTypeOf(); + expect(data.ironNugget).toBeDefined(); + expect(data.ironNugget).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ironNugget).toEqualTypeOf(); + expect(data.limboDust).toBeDefined(); + expect(data.limboDust).toBeGreaterThanOrEqual(0); + expectTypeOf(data.limboDust).toEqualTypeOf(); + expect(data.missingAmulet).toBeDefined(); + expect(data.missingAmulet).toBeGreaterThanOrEqual(0); + expectTypeOf(data.missingAmulet).toEqualTypeOf(); + expect(data.moonStoneNugget).toBeDefined(); + expect(data.moonStoneNugget).toBeGreaterThanOrEqual(0); + expectTypeOf(data.moonStoneNugget).toEqualTypeOf(); + expect(data.murderWeapon).toBeDefined(); + expect(data.murderWeapon).toBeGreaterThanOrEqual(0); + expectTypeOf(data.murderWeapon).toEqualTypeOf(); + expect(data.netherStar).toBeDefined(); + expect(data.netherStar).toBeGreaterThanOrEqual(0); + expectTypeOf(data.netherStar).toEqualTypeOf(); + expect(data.oasisWater).toBeDefined(); + expect(data.oasisWater).toBeGreaterThanOrEqual(0); + expectTypeOf(data.oasisWater).toEqualTypeOf(); + expect(data.perfume).toBeDefined(); + expect(data.perfume).toBeGreaterThanOrEqual(0); + expectTypeOf(data.perfume).toEqualTypeOf(); + expect(data.proofOfSuccess).toBeDefined(); + expect(data.proofOfSuccess).toBeGreaterThanOrEqual(0); + expectTypeOf(data.proofOfSuccess).toEqualTypeOf(); + expect(data.ratmanMask).toBeDefined(); + expect(data.ratmanMask).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ratmanMask).toEqualTypeOf(); + expect(data.silverBladeReplay).toBeDefined(); + expect(data.silverBladeReplay).toBeGreaterThanOrEqual(0); + expectTypeOf(data.silverBladeReplay).toEqualTypeOf(); + expect(data.silverCoins).toBeDefined(); + expect(data.silverCoins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.silverCoins).toEqualTypeOf(); + expect(data.soul).toBeDefined(); + expect(data.soul).toBeGreaterThanOrEqual(0); + expectTypeOf(data.soul).toEqualTypeOf(); + expect(data.sparkPlug).toBeDefined(); + expect(data.sparkPlug).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sparkPlug).toEqualTypeOf(); + expect(data.timewornMysteryBox).toBeDefined(); + expect(data.timewornMysteryBox).toBeGreaterThanOrEqual(0); + expectTypeOf(data.timewornMysteryBox).toEqualTypeOf(); + expect(data.tokenOfFerocity).toBeDefined(); + expect(data.tokenOfFerocity).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tokenOfFerocity).toEqualTypeOf(); + expect(data.trustyRope).toBeDefined(); + expect(data.trustyRope).toBeGreaterThanOrEqual(0); + expectTypeOf(data.trustyRope).toEqualTypeOf(); + expect(data.unusedBombMaterials).toBeDefined(); + expect(data.unusedBombMaterials).toBeGreaterThanOrEqual(0); + expectTypeOf(data.unusedBombMaterials).toEqualTypeOf(); + expect(data.victimPhoto).toBeDefined(); + expect(data.victimPhoto).toBeGreaterThanOrEqual(0); + expectTypeOf(data.victimPhoto).toEqualTypeOf(); + expect(data.weaponMold).toBeDefined(); + expect(data.weaponMold).toBeGreaterThanOrEqual(0); + expectTypeOf(data.weaponMold).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestItem.ts b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestItem.ts new file mode 100644 index 000000000..a9bc709ed --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestItem.ts @@ -0,0 +1,90 @@ +class BedWarsSlumberQuestItem { + airFreshener: number; + amulet: number; + bedSheets: number; + blitzStar: number; + blockOfMegaWallsObsidian: number; + boots: number; + cable: number; + cleanedUpMurderKnife: number; + comfyPillow: number; + diamondFragment: number; + discardedKartWheel: number; + dwarvenMithril: number; + emeraldShard: number; + enchantedHammer: number; + enderDust: number; + fadedBlitzStar: number; + gloves: number; + glowingSandPaper: number; + goldBar: number; + goldenTicket: number; + imperialLeather: number; + indigosMap: number; + ironNugget: number; + limboDust: number; + missingAmulet: number; + moonStoneNugget: number; + murderWeapon: number; + netherStar: number; + oasisWater: number; + perfume: number; + proofOfSuccess: number; + ratmanMask: number; + silverBladeReplay: number; + silverCoins: number; + soul: number; + sparkPlug: number; + timewornMysteryBox: number; + tokenOfFerocity: number; + trustyRope: number; + unusedBombMaterials: number; + victimPhoto: number; + weaponMold: number; + constructor(data: Record) { + this.airFreshener = data?.slumber_item_air_freshener || 0; + this.amulet = data?.slumber_item_amulet || 0; + this.bedSheets = data?.slumber_item_bed_sheets || 0; + this.blitzStar = data?.slumber_item_blitz_star || 0; + this.blockOfMegaWallsObsidian = data?.slumber_item_block_of_mega_walls_obsidian || 0; + this.boots = data?.slumber_item_boots || 0; + this.cable = data?.slumber_item_cable || 0; + this.cleanedUpMurderKnife = data?.slumber_item_cleaned_up_murder_knife || 0; + this.comfyPillow = data?.slumber_item_comfy_pillow || 0; + this.diamondFragment = data?.slumber_item_diamond_fragment || 0; + this.discardedKartWheel = data?.slumber_item_discarded_kart_wheel || 0; + this.dwarvenMithril = data?.slumber_item_dwarven_mithril || 0; + this.emeraldShard = data?.slumber_item_emerald_shard || 0; + this.enchantedHammer = data?.slumber_item_enchanted_hammer || 0; + this.enderDust = data?.slumber_item_ender_dust || 0; + this.fadedBlitzStar = data?.slumber_item_faded_blitz_star || 0; + this.gloves = data?.slumber_item_gloves || 0; + this.glowingSandPaper = data?.slumber_item_glowing_sand_paper || 0; + this.goldBar = data?.slumber_item_gold_bar || 0; + this.goldenTicket = data?.slumber_item_golden_ticket || 0; + this.imperialLeather = data?.slumber_item_imperial_leather || 0; + this.indigosMap = data?.slumber_item_indigos_map || 0; + this.ironNugget = data?.slumber_item_iron_nugget || 0; + this.limboDust = data?.slumber_item_limbo_dust || 0; + this.missingAmulet = data?.slumber_item_missing_amulet || 0; + this.moonStoneNugget = data?.slumber_item_moon_stone_nugget || 0; + this.murderWeapon = data?.slumber_item_murder_weapon || 0; + this.netherStar = data?.slumber_item_nether_star || 0; + this.oasisWater = data?.slumber_item_oasis_water || 0; + this.perfume = data?.slumber_item_perfume || 0; + this.proofOfSuccess = data?.slumber_item_proof_of_success || 0; + this.ratmanMask = data?.slumber_item_ratman_mask || 0; + this.silverBladeReplay = data?.slumber_item_silver_blade_replay || 0; + this.silverCoins = data?.slumber_item_silver_coins || 0; + this.soul = data?.slumber_item_soul || 0; + this.sparkPlug = data?.slumber_item_spark_plug || 0; + this.timewornMysteryBox = data?.slumber_item_timeworn_mystery_box || 0; + this.tokenOfFerocity = data?.slumber_item_token_of_ferocity || 0; + this.trustyRope = data?.slumber_item_trusty_rope || 0; + this.unusedBombMaterials = data?.slumber_item_unused_bomb_materials || 0; + this.victimPhoto = data?.slumber_item_victim_photo || 0; + this.weaponMold = data?.slumber_item_weapon_mold || 0; + } +} + +export default BedWarsSlumberQuestItem; diff --git a/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPC.test.ts b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPC.test.ts new file mode 100644 index 000000000..cb2490f4b --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPC.test.ts @@ -0,0 +1,25 @@ +import BedWarsSlumberQuestNPC from './BedWarsSlumberQuestNPC.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsSlumberQuestNPC', () => { + const data = new BedWarsSlumberQuestNPC({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsSlumberQuestNPC); + expectTypeOf(data).toEqualTypeOf(); + expect(data.doorMan).toBeDefined(); + expectTypeOf(data.doorMan).toEqualTypeOf(); + expect(data.fredericFernton).toBeDefined(); + expectTypeOf(data.fredericFernton).toEqualTypeOf(); + expect(data.generalDaku).toBeDefined(); + expectTypeOf(data.generalDaku).toEqualTypeOf(); + expect(data.hostessKatrina).toBeDefined(); + expectTypeOf(data.hostessKatrina).toEqualTypeOf(); + expect(data.hotelReceptionist).toBeDefined(); + expectTypeOf(data.hotelReceptionist).toEqualTypeOf(); + expect(data.johnIndigos).toBeDefined(); + expectTypeOf(data.johnIndigos).toEqualTypeOf(); + expect(data.ladySaichi).toBeDefined(); + expectTypeOf(data.ladySaichi).toEqualTypeOf(); + expect(data.ticketMachine).toBeDefined(); + expectTypeOf(data.ticketMachine).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPC.ts b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPC.ts new file mode 100644 index 000000000..929202cd3 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPC.ts @@ -0,0 +1,22 @@ +class BedWarsSlumberQuestNPC { + doorMan: boolean; + fredericFernton: boolean; + generalDaku: boolean; + hostessKatrina: boolean; + hotelReceptionist: boolean; + johnIndigos: boolean; + ladySaichi: boolean; + ticketMachine: boolean; + constructor(data: Record) { + this.doorMan = data?.DoorManNpc || false; + this.fredericFernton = data?.FredericFerntonNpc || false; + this.generalDaku = data?.GeneralDakuNpc || false; + this.hostessKatrina = data?.HostessKatrinaNpc || false; + this.hotelReceptionist = data?.HotelReceptionistNpc || false; + this.johnIndigos = data?.JohnIndigosNpc || false; + this.ladySaichi = data?.LadySaichiNpc || false; + this.ticketMachine = data?.TicketMachineNpc || false; + } +} + +export default BedWarsSlumberQuestNPC; diff --git a/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPCSBoolean.test.ts b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPCSBoolean.test.ts new file mode 100644 index 000000000..99f07db45 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPCSBoolean.test.ts @@ -0,0 +1,99 @@ +import BedWarsSlumberQuestNPCSBoolean from './BedWarsSlumberQuestNPCSBoolean.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsSlumberQuestNPCSBoolean', () => { + const data = new BedWarsSlumberQuestNPCSBoolean({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsSlumberQuestNPCSBoolean); + expectTypeOf(data).toEqualTypeOf(); + expect(data.arcadePlayer).toBeDefined(); + expectTypeOf(data.arcadePlayer).toEqualTypeOf(); + expect(data.billStarr).toBeDefined(); + expectTypeOf(data.billStarr).toEqualTypeOf(); + expect(data.blacksmith).toBeDefined(); + expectTypeOf(data.blacksmith).toEqualTypeOf(); + expect(data.blacksmithApprentice).toBeDefined(); + expectTypeOf(data.blacksmithApprentice).toEqualTypeOf(); + expect(data.bucky).toBeDefined(); + expectTypeOf(data.bucky).toEqualTypeOf(); + expect(data.combatArtistSally).toBeDefined(); + expectTypeOf(data.combatArtistSally).toEqualTypeOf(); + expect(data.donEspresso).toBeDefined(); + expectTypeOf(data.donEspresso).toEqualTypeOf(); + expect(data.electricianRussel).toBeDefined(); + expectTypeOf(data.electricianRussel).toEqualTypeOf(); + expect(data.executives).toBeDefined(); + expectTypeOf(data.executives).toEqualTypeOf(); + expect(data.gamblerGeorge).toBeDefined(); + expectTypeOf(data.gamblerGeorge).toEqualTypeOf(); + expect(data.generalDaku).toBeDefined(); + expectTypeOf(data.generalDaku).toEqualTypeOf(); + expect(data.gizzyMoonpowder).toBeDefined(); + expectTypeOf(data.gizzyMoonpowder).toEqualTypeOf(); + expect(data.hammer).toBeDefined(); + expectTypeOf(data.hammer).toEqualTypeOf(); + expect(data.hammerPartTwo).toBeDefined(); + expectTypeOf(data.hammerPartTwo).toEqualTypeOf(); + expect(data.hermes).toBeDefined(); + expectTypeOf(data.hermes).toEqualTypeOf(); + expect(data.inspector).toBeDefined(); + expectTypeOf(data.inspector).toEqualTypeOf(); + expect(data.jeremyJagger).toBeDefined(); + expectTypeOf(data.jeremyJagger).toEqualTypeOf(); + expect(data.jetsMcturbo).toBeDefined(); + expectTypeOf(data.jetsMcturbo).toEqualTypeOf(); + expect(data.jimmyBimmy).toBeDefined(); + expectTypeOf(data.jimmyBimmy).toEqualTypeOf(); + expect(data.johnIndigosHammer).toBeDefined(); + expectTypeOf(data.johnIndigosHammer).toEqualTypeOf(); + expect(data.johnPireso).toBeDefined(); + expectTypeOf(data.johnPireso).toEqualTypeOf(); + expect(data.kingFlut).toBeDefined(); + expectTypeOf(data.kingFlut).toEqualTypeOf(); + expect(data.ladySaichi).toBeDefined(); + expectTypeOf(data.ladySaichi).toEqualTypeOf(); + expect(data.laundry).toBeDefined(); + expectTypeOf(data.laundry).toEqualTypeOf(); + expect(data.laundryGal).toBeDefined(); + expectTypeOf(data.laundryGal).toEqualTypeOf(); + expect(data.lesterBrody).toBeDefined(); + expectTypeOf(data.lesterBrody).toEqualTypeOf(); + expect(data.masterMeyer).toBeDefined(); + expectTypeOf(data.masterMeyer).toEqualTypeOf(); + expect(data.meetTheSandman).toBeDefined(); + expectTypeOf(data.meetTheSandman).toEqualTypeOf(); + expect(data.oasis).toBeDefined(); + expectTypeOf(data.oasis).toEqualTypeOf(); + expect(data.peter).toBeDefined(); + expectTypeOf(data.peter).toEqualTypeOf(); + expect(data.quizShowHost).toBeDefined(); + expectTypeOf(data.quizShowHost).toEqualTypeOf(); + expect(data.receptionStart).toBeDefined(); + expectTypeOf(data.receptionStart).toEqualTypeOf(); + expect(data.skyblockPlayer).toBeDefined(); + expectTypeOf(data.skyblockPlayer).toEqualTypeOf(); + expect(data.spaceman).toBeDefined(); + expectTypeOf(data.spaceman).toEqualTypeOf(); + expect(data.theRatman).toBeDefined(); + expectTypeOf(data.theRatman).toEqualTypeOf(); + expect(data.wally).toBeDefined(); + expectTypeOf(data.wally).toEqualTypeOf(); + expect(data.phaseFourAscensionQ1).toBeDefined(); + expectTypeOf(data.phaseFourAscensionQ1).toEqualTypeOf(); + expect(data.phaseFourAscensionQ2).toBeDefined(); + expectTypeOf(data.phaseFourAscensionQ2).toEqualTypeOf(); + expect(data.phaseFourAscensionQ3).toBeDefined(); + expectTypeOf(data.phaseFourAscensionQ3).toEqualTypeOf(); + expect(data.phaseFourAscensionQ4).toBeDefined(); + expectTypeOf(data.phaseFourAscensionQ4).toEqualTypeOf(); + expect(data.phaseFourAscensionQ5).toBeDefined(); + expectTypeOf(data.phaseFourAscensionQ5).toEqualTypeOf(); + expect(data.phaseFourAscensionWalletQ).toBeDefined(); + expectTypeOf(data.phaseFourAscensionWalletQ).toEqualTypeOf(); + expect(data.phaseThreeAsc).toBeDefined(); + expectTypeOf(data.phaseThreeAsc).toEqualTypeOf(); + expect(data.phaseTwoAsc).toBeDefined(); + expectTypeOf(data.phaseTwoAsc).toEqualTypeOf(); + expect(data.staffWalletUpgrade).toBeDefined(); + expectTypeOf(data.staffWalletUpgrade).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPCSBoolean.ts b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPCSBoolean.ts new file mode 100644 index 000000000..43b3f3d37 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPCSBoolean.ts @@ -0,0 +1,96 @@ +class BedWarsSlumberQuestNPCSBoolean { + arcadePlayer: boolean; + billStarr: boolean; + blacksmith: boolean; + blacksmithApprentice: boolean; + bucky: boolean; + combatArtistSally: boolean; + donEspresso: boolean; + electricianRussel: boolean; + executives: boolean; + gamblerGeorge: boolean; + generalDaku: boolean; + gizzyMoonpowder: boolean; + hammer: boolean; + hammerPartTwo: boolean; + hermes: boolean; + inspector: boolean; + jeremyJagger: boolean; + jetsMcturbo: boolean; + jimmyBimmy: boolean; + johnIndigosHammer: boolean; + johnPireso: boolean; + kingFlut: boolean; + ladySaichi: boolean; + laundry: boolean; + laundryGal: boolean; + lesterBrody: boolean; + masterMeyer: boolean; + meetTheSandman: boolean; + oasis: boolean; + peter: boolean; + quizShowHost: boolean; + receptionStart: boolean; + skyblockPlayer: boolean; + spaceman: boolean; + theRatman: boolean; + wally: boolean; + phaseFourAscensionQ1: boolean; + phaseFourAscensionQ2: boolean; + phaseFourAscensionQ3: boolean; + phaseFourAscensionQ4: boolean; + phaseFourAscensionQ5: boolean; + phaseFourAscensionWalletQ: boolean; + phaseThreeAsc: boolean; + phaseTwoAsc: boolean; + staffWalletUpgrade: boolean; + constructor(data: Record) { + this.arcadePlayer = data?.npc_arcade_player || false; + this.billStarr = data?.npc_bill_starr || false; + this.blacksmith = data?.npc_blacksmith || false; + this.blacksmithApprentice = data?.npc_blacksmith_apprentice || false; + this.bucky = data?.npc_bucky || false; + this.combatArtistSally = data?.npc_combat_artist_sally || false; + this.donEspresso = data?.npc_don_espresso || false; + this.electricianRussel = data?.npc_electrician_russel || false; + this.executives = data?.npc_executives || false; + this.gamblerGeorge = data?.npc_gambler_george || false; + this.generalDaku = data?.npc_general_daku || false; + this.gizzyMoonpowder = data?.npc_gizzy_moonpowder || false; + this.hammer = data?.npc_hammer || false; + this.hammerPartTwo = data?.npc_hammer_part_two || false; + this.hermes = data?.npc_hermes || false; + this.inspector = data?.npc_inspector || false; + this.jeremyJagger = data?.npc_jeremy_jagger || false; + this.jetsMcturbo = data?.npc_jets_mcturbo || false; + this.jimmyBimmy = data?.npc_jimmy_bimmy || false; + this.johnIndigosHammer = data?.npc_john_indigos_hammer || false; + this.johnPireso = data?.npc_john_pireso || false; + this.kingFlut = data?.npc_king_flut || false; + this.ladySaichi = data?.npc_lady_saichi || false; + this.laundry = data?.npc_laundry || false; + this.laundryGal = data?.npc_laundry_gal || false; + this.lesterBrody = data?.npc_lester_brody || false; + this.masterMeyer = data?.npc_master_meyer || false; + this.meetTheSandman = data?.npc_meet_the_sandman || false; + this.oasis = data?.npc_oasis || false; + this.peter = data?.npc_peter || false; + this.quizShowHost = data?.npc_quiz_show_host || false; + this.receptionStart = data?.npc_reception_start || false; + this.skyblockPlayer = data?.npc_skyblock_player || false; + this.spaceman = data?.npc_spaceman || false; + this.theRatman = data?.npc_the_ratman || false; + this.wally = data?.npc_wally || false; + this.phaseFourAscensionQ1 = data?.phase_four_ascension_q1 || false; + this.phaseFourAscensionQ2 = data?.phase_four_ascension_q2 || false; + this.phaseFourAscensionQ3 = data?.phase_four_ascension_q3 || false; + this.phaseFourAscensionQ4 = data?.phase_four_ascension_q4 || false; + this.phaseFourAscensionQ5 = data?.phase_four_ascension_q5 || false; + this.phaseFourAscensionWalletQ = data?.phase_four_ascension_wallet_q || false; + this.phaseThreeAsc = data?.phase_three_asc || false; + this.phaseTwoAsc = data?.phase_two_asc || false; + this.staffWalletUpgrade = data?.staff_wallet_upgrade || false; + } +} + +export default BedWarsSlumberQuestNPCSBoolean; diff --git a/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPCSNumber.test.ts b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPCSNumber.test.ts new file mode 100644 index 000000000..6a6a0a279 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPCSNumber.test.ts @@ -0,0 +1,144 @@ +import BedWarsSlumberQuestNPCSNumber from './BedWarsSlumberQuestNPCSNumber.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsSlumberQuestNPCSNumber', () => { + const data = new BedWarsSlumberQuestNPCSNumber({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsSlumberQuestNPCSNumber); + expectTypeOf(data).toEqualTypeOf(); + expect(data.arcadePlayer).toBeDefined(); + expect(data.arcadePlayer).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arcadePlayer).toEqualTypeOf(); + expect(data.billStarr).toBeDefined(); + expect(data.billStarr).toBeGreaterThanOrEqual(0); + expectTypeOf(data.billStarr).toEqualTypeOf(); + expect(data.blacksmith).toBeDefined(); + expect(data.blacksmith).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blacksmith).toEqualTypeOf(); + expect(data.blacksmithApprentice).toBeDefined(); + expect(data.blacksmithApprentice).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blacksmithApprentice).toEqualTypeOf(); + expect(data.bucky).toBeDefined(); + expect(data.bucky).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bucky).toEqualTypeOf(); + expect(data.combatArtistSally).toBeDefined(); + expect(data.combatArtistSally).toBeGreaterThanOrEqual(0); + expectTypeOf(data.combatArtistSally).toEqualTypeOf(); + expect(data.donEspresso).toBeDefined(); + expect(data.donEspresso).toBeGreaterThanOrEqual(0); + expectTypeOf(data.donEspresso).toEqualTypeOf(); + expect(data.electricianRussel).toBeDefined(); + expect(data.electricianRussel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.electricianRussel).toEqualTypeOf(); + expect(data.executives).toBeDefined(); + expect(data.executives).toBeGreaterThanOrEqual(0); + expectTypeOf(data.executives).toEqualTypeOf(); + expect(data.gamblerGeorge).toBeDefined(); + expect(data.gamblerGeorge).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gamblerGeorge).toEqualTypeOf(); + expect(data.generalDaku).toBeDefined(); + expect(data.generalDaku).toBeGreaterThanOrEqual(0); + expectTypeOf(data.generalDaku).toEqualTypeOf(); + expect(data.gizzyMoonpowder).toBeDefined(); + expect(data.gizzyMoonpowder).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gizzyMoonpowder).toEqualTypeOf(); + expect(data.hammer).toBeDefined(); + expect(data.hammer).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hammer).toEqualTypeOf(); + expect(data.hammerPartTwo).toBeDefined(); + expect(data.hammerPartTwo).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hammerPartTwo).toEqualTypeOf(); + expect(data.hermes).toBeDefined(); + expect(data.hermes).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hermes).toEqualTypeOf(); + expect(data.inspector).toBeDefined(); + expect(data.inspector).toBeGreaterThanOrEqual(0); + expectTypeOf(data.inspector).toEqualTypeOf(); + expect(data.jeremyJagger).toBeDefined(); + expect(data.jeremyJagger).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jeremyJagger).toEqualTypeOf(); + expect(data.jetsMcturbo).toBeDefined(); + expect(data.jetsMcturbo).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jetsMcturbo).toEqualTypeOf(); + expect(data.jimmyBimmy).toBeDefined(); + expect(data.jimmyBimmy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.jimmyBimmy).toEqualTypeOf(); + expect(data.johnIndigosHammer).toBeDefined(); + expect(data.johnIndigosHammer).toBeGreaterThanOrEqual(0); + expectTypeOf(data.johnIndigosHammer).toEqualTypeOf(); + expect(data.johnPireso).toBeDefined(); + expect(data.johnPireso).toBeGreaterThanOrEqual(0); + expectTypeOf(data.johnPireso).toEqualTypeOf(); + expect(data.kingFlut).toBeDefined(); + expect(data.kingFlut).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kingFlut).toEqualTypeOf(); + expect(data.ladySaichi).toBeDefined(); + expect(data.ladySaichi).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ladySaichi).toEqualTypeOf(); + expect(data.laundry).toBeDefined(); + expect(data.laundry).toBeGreaterThanOrEqual(0); + expectTypeOf(data.laundry).toEqualTypeOf(); + expect(data.laundryGal).toBeDefined(); + expect(data.laundryGal).toBeGreaterThanOrEqual(0); + expectTypeOf(data.laundryGal).toEqualTypeOf(); + expect(data.lesterBrody).toBeDefined(); + expect(data.lesterBrody).toBeGreaterThanOrEqual(0); + expectTypeOf(data.lesterBrody).toEqualTypeOf(); + expect(data.masterMeyer).toBeDefined(); + expect(data.masterMeyer).toBeGreaterThanOrEqual(0); + expectTypeOf(data.masterMeyer).toEqualTypeOf(); + expect(data.meetTheSandman).toBeDefined(); + expect(data.meetTheSandman).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meetTheSandman).toEqualTypeOf(); + expect(data.oasis).toBeDefined(); + expect(data.oasis).toBeGreaterThanOrEqual(0); + expectTypeOf(data.oasis).toEqualTypeOf(); + expect(data.peter).toBeDefined(); + expect(data.peter).toBeGreaterThanOrEqual(0); + expectTypeOf(data.peter).toEqualTypeOf(); + expect(data.quizShowHost).toBeDefined(); + expect(data.quizShowHost).toBeGreaterThanOrEqual(0); + expectTypeOf(data.quizShowHost).toEqualTypeOf(); + expect(data.receptionStart).toBeDefined(); + expect(data.receptionStart).toBeGreaterThanOrEqual(0); + expectTypeOf(data.receptionStart).toEqualTypeOf(); + expect(data.skyblockPlayer).toBeDefined(); + expect(data.skyblockPlayer).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skyblockPlayer).toEqualTypeOf(); + expect(data.spaceman).toBeDefined(); + expect(data.spaceman).toBeGreaterThanOrEqual(0); + expectTypeOf(data.spaceman).toEqualTypeOf(); + expect(data.theRatman).toBeDefined(); + expect(data.theRatman).toBeGreaterThanOrEqual(0); + expectTypeOf(data.theRatman).toEqualTypeOf(); + expect(data.wally).toBeDefined(); + expect(data.wally).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wally).toEqualTypeOf(); + expect(data.phaseFourAscensionQ1).toBeDefined(); + expect(data.phaseFourAscensionQ1).toBeGreaterThanOrEqual(0); + expectTypeOf(data.phaseFourAscensionQ1).toEqualTypeOf(); + expect(data.phaseFourAscensionQ2).toBeDefined(); + expect(data.phaseFourAscensionQ2).toBeGreaterThanOrEqual(0); + expectTypeOf(data.phaseFourAscensionQ2).toEqualTypeOf(); + expect(data.phaseFourAscensionQ3).toBeDefined(); + expect(data.phaseFourAscensionQ3).toBeGreaterThanOrEqual(0); + expectTypeOf(data.phaseFourAscensionQ3).toEqualTypeOf(); + expect(data.phaseFourAscensionQ4).toBeDefined(); + expect(data.phaseFourAscensionQ4).toBeGreaterThanOrEqual(0); + expectTypeOf(data.phaseFourAscensionQ4).toEqualTypeOf(); + expect(data.phaseFourAscensionQ5).toBeDefined(); + expect(data.phaseFourAscensionQ5).toBeGreaterThanOrEqual(0); + expectTypeOf(data.phaseFourAscensionQ5).toEqualTypeOf(); + expect(data.phaseFourAscensionWalletQ).toBeDefined(); + expect(data.phaseFourAscensionWalletQ).toBeGreaterThanOrEqual(0); + expectTypeOf(data.phaseFourAscensionWalletQ).toEqualTypeOf(); + expect(data.phaseThreeAsc).toBeDefined(); + expect(data.phaseThreeAsc).toBeGreaterThanOrEqual(0); + expectTypeOf(data.phaseThreeAsc).toEqualTypeOf(); + expect(data.phaseTwoAsc).toBeDefined(); + expect(data.phaseTwoAsc).toBeGreaterThanOrEqual(0); + expectTypeOf(data.phaseTwoAsc).toEqualTypeOf(); + expect(data.staffWalletUpgrade).toBeDefined(); + expect(data.staffWalletUpgrade).toBeGreaterThanOrEqual(0); + expectTypeOf(data.staffWalletUpgrade).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPCSNumber.ts b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPCSNumber.ts new file mode 100644 index 000000000..770758be3 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPCSNumber.ts @@ -0,0 +1,96 @@ +class BedWarsSlumberQuestNPCSNumber { + arcadePlayer: number; + billStarr: number; + blacksmith: number; + blacksmithApprentice: number; + bucky: number; + combatArtistSally: number; + donEspresso: number; + electricianRussel: number; + executives: number; + gamblerGeorge: number; + generalDaku: number; + gizzyMoonpowder: number; + hammer: number; + hammerPartTwo: number; + hermes: number; + inspector: number; + jeremyJagger: number; + jetsMcturbo: number; + jimmyBimmy: number; + johnIndigosHammer: number; + johnPireso: number; + kingFlut: number; + ladySaichi: number; + laundry: number; + laundryGal: number; + lesterBrody: number; + masterMeyer: number; + meetTheSandman: number; + oasis: number; + peter: number; + quizShowHost: number; + receptionStart: number; + skyblockPlayer: number; + spaceman: number; + theRatman: number; + wally: number; + phaseFourAscensionQ1: number; + phaseFourAscensionQ2: number; + phaseFourAscensionQ3: number; + phaseFourAscensionQ4: number; + phaseFourAscensionQ5: number; + phaseFourAscensionWalletQ: number; + phaseThreeAsc: number; + phaseTwoAsc: number; + staffWalletUpgrade: number; + constructor(data: Record) { + this.arcadePlayer = data?.npc_arcade_player || 0; + this.billStarr = data?.npc_bill_starr || 0; + this.blacksmith = data?.npc_blacksmith || 0; + this.blacksmithApprentice = data?.npc_blacksmith_apprentice || 0; + this.bucky = data?.npc_bucky || 0; + this.combatArtistSally = data?.npc_combat_artist_sally || 0; + this.donEspresso = data?.npc_don_espresso || 0; + this.electricianRussel = data?.npc_electrician_russel || 0; + this.executives = data?.npc_executives || 0; + this.gamblerGeorge = data?.npc_gambler_george || 0; + this.generalDaku = data?.npc_general_daku || 0; + this.gizzyMoonpowder = data?.npc_gizzy_moonpowder || 0; + this.hammer = data?.npc_hammer || 0; + this.hammerPartTwo = data?.npc_hammer_part_two || 0; + this.hermes = data?.npc_hermes || 0; + this.inspector = data?.npc_inspector || 0; + this.jeremyJagger = data?.npc_jeremy_jagger || 0; + this.jetsMcturbo = data?.npc_jets_mcturbo || 0; + this.jimmyBimmy = data?.npc_jimmy_bimmy || 0; + this.johnIndigosHammer = data?.npc_john_indigos_hammer || 0; + this.johnPireso = data?.npc_john_pireso || 0; + this.kingFlut = data?.npc_king_flut || 0; + this.ladySaichi = data?.npc_lady_saichi || 0; + this.laundry = data?.npc_laundry || 0; + this.laundryGal = data?.npc_laundry_gal || 0; + this.lesterBrody = data?.npc_lester_brody || 0; + this.masterMeyer = data?.npc_master_meyer || 0; + this.meetTheSandman = data?.npc_meet_the_sandman || 0; + this.oasis = data?.npc_oasis || 0; + this.peter = data?.npc_peter || 0; + this.quizShowHost = data?.npc_quiz_show_host || 0; + this.receptionStart = data?.npc_reception_start || 0; + this.skyblockPlayer = data?.npc_skyblock_player || 0; + this.spaceman = data?.npc_spaceman || 0; + this.theRatman = data?.npc_the_ratman || 0; + this.wally = data?.npc_wally || 0; + this.phaseFourAscensionQ1 = data?.phase_four_ascension_q1 || 0; + this.phaseFourAscensionQ2 = data?.phase_four_ascension_q2 || 0; + this.phaseFourAscensionQ3 = data?.phase_four_ascension_q3 || 0; + this.phaseFourAscensionQ4 = data?.phase_four_ascension_q4 || 0; + this.phaseFourAscensionQ5 = data?.phase_four_ascension_q5 || 0; + this.phaseFourAscensionWalletQ = data?.phase_four_ascension_wallet_q || 0; + this.phaseThreeAsc = data?.phase_three_asc || 0; + this.phaseTwoAsc = data?.phase_two_asc || 0; + this.staffWalletUpgrade = data?.staff_wallet_upgrade || 0; + } +} + +export default BedWarsSlumberQuestNPCSNumber; diff --git a/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestObjective.test.ts b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestObjective.test.ts new file mode 100644 index 000000000..29e1ee4b2 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestObjective.test.ts @@ -0,0 +1,167 @@ +import BedWarsSlumberQuestObjective from './BedWarsSlumberQuestObjective.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsSlumberQuestObjective', () => { + const data = new BedWarsSlumberQuestObjective({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsSlumberQuestObjective); + expectTypeOf(data).toEqualTypeOf(); + expect(data.arcadeQuarters).toBeDefined(); + expectTypeOf(data.arcadeQuarters).toEqualTypeOf(); + expect(data.arcadeQuartersRepeat).toBeDefined(); + expectTypeOf(data.arcadeQuartersRepeat).toEqualTypeOf(); + expect(data.billStarrBlitz).toBeDefined(); + expectTypeOf(data.billStarrBlitz).toEqualTypeOf(); + expect(data.blacksmithAmulet).toBeDefined(); + expectTypeOf(data.blacksmithAmulet).toEqualTypeOf(); + expect(data.blacksmithApprenticeCoins).toBeDefined(); + expectTypeOf(data.blacksmithApprenticeCoins).toEqualTypeOf(); + expect(data.blacksmithApprenticeCoinsRepeat).toBeDefined(); + expectTypeOf(data.blacksmithApprenticeCoinsRepeat).toEqualTypeOf(); + expect(data.blacksmithApprenticeIron).toBeDefined(); + expectTypeOf(data.blacksmithApprenticeIron).toEqualTypeOf(); + expect(data.blacksmithApprenticeIronRepeat).toBeDefined(); + expectTypeOf(data.blacksmithApprenticeIronRepeat).toEqualTypeOf(); + expect(data.blacksmithGoldenTicket).toBeDefined(); + expectTypeOf(data.blacksmithGoldenTicket).toEqualTypeOf(); + expect(data.blacksmithIronBars).toBeDefined(); + expectTypeOf(data.blacksmithIronBars).toEqualTypeOf(); + expect(data.blacksmithMold).toBeDefined(); + expectTypeOf(data.blacksmithMold).toEqualTypeOf(); + expect(data.blacksmithWater).toBeDefined(); + expectTypeOf(data.blacksmithWater).toEqualTypeOf(); + expect(data.buckyFragments).toBeDefined(); + expectTypeOf(data.buckyFragments).toEqualTypeOf(); + expect(data.buckyFragmentsRepeat).toBeDefined(); + expectTypeOf(data.buckyFragmentsRepeat).toEqualTypeOf(); + expect(data.buckySkyTeaLeaves).toBeDefined(); + expectTypeOf(data.buckySkyTeaLeaves).toEqualTypeOf(); + expect(data.buckySkyTeaLeavesRepeat).toBeDefined(); + expectTypeOf(data.buckySkyTeaLeavesRepeat).toEqualTypeOf(); + expect(data.chessTickets).toBeDefined(); + expectTypeOf(data.chessTickets).toEqualTypeOf(); + expect(data.chessTokensOfFerocity).toBeDefined(); + expectTypeOf(data.chessTokensOfFerocity).toEqualTypeOf(); + expect(data.chessWoolCables).toBeDefined(); + expectTypeOf(data.chessWoolCables).toEqualTypeOf(); + expect(data.combatArtistSally).toBeDefined(); + expectTypeOf(data.combatArtistSally).toEqualTypeOf(); + expect(data.combatArtistSallyRepeat).toBeDefined(); + expectTypeOf(data.combatArtistSallyRepeat).toEqualTypeOf(); + expect(data.donEspressoGold).toBeDefined(); + expectTypeOf(data.donEspressoGold).toEqualTypeOf(); + expect(data.electricianRussel).toBeDefined(); + expectTypeOf(data.electricianRussel).toEqualTypeOf(); + expect(data.electricianRusselRepeat).toBeDefined(); + expectTypeOf(data.electricianRusselRepeat).toEqualTypeOf(); + expect(data.executivesMeetingNumbers).toBeDefined(); + expectTypeOf(data.executivesMeetingNumbers).toEqualTypeOf(); + expect(data.gamblerGeorgeWin).toBeDefined(); + expectTypeOf(data.gamblerGeorgeWin).toEqualTypeOf(); + expect(data.generalDakuTea).toBeDefined(); + expectTypeOf(data.generalDakuTea).toEqualTypeOf(); + expect(data.gizzyMoonpowder).toBeDefined(); + expectTypeOf(data.gizzyMoonpowder).toEqualTypeOf(); + expect(data.gizzyMoonpowderRepeat).toBeDefined(); + expectTypeOf(data.gizzyMoonpowderRepeat).toEqualTypeOf(); + expect(data.hammerCoins).toBeDefined(); + expectTypeOf(data.hammerCoins).toEqualTypeOf(); + expect(data.hammerPartTwoSilverBlade).toBeDefined(); + expectTypeOf(data.hammerPartTwoSilverBlade).toEqualTypeOf(); + expect(data.hermesMysteryBoxes).toBeDefined(); + expectTypeOf(data.hermesMysteryBoxes).toEqualTypeOf(); + expect(data.inspectorAirFreshener).toBeDefined(); + expectTypeOf(data.inspectorAirFreshener).toEqualTypeOf(); + expect(data.inspectorClueWeapon).toBeDefined(); + expectTypeOf(data.inspectorClueWeapon).toEqualTypeOf(); + expect(data.inspectorGloves).toBeDefined(); + expectTypeOf(data.inspectorGloves).toEqualTypeOf(); + expect(data.inspectorPhoto).toBeDefined(); + expectTypeOf(data.inspectorPhoto).toEqualTypeOf(); + expect(data.inspectorWorkBoots).toBeDefined(); + expectTypeOf(data.inspectorWorkBoots).toEqualTypeOf(); + expect(data.jaggerDiamond).toBeDefined(); + expectTypeOf(data.jaggerDiamond).toEqualTypeOf(); + expect(data.jaggerEmerald).toBeDefined(); + expectTypeOf(data.jaggerEmerald).toEqualTypeOf(); + expect(data.jaggerGold).toBeDefined(); + expectTypeOf(data.jaggerGold).toEqualTypeOf(); + expect(data.jaggerIron).toBeDefined(); + expectTypeOf(data.jaggerIron).toEqualTypeOf(); + expect(data.jaggerWool).toBeDefined(); + expectTypeOf(data.jaggerWool).toEqualTypeOf(); + expect(data.jetsCables).toBeDefined(); + expectTypeOf(data.jetsCables).toEqualTypeOf(); + expect(data.jetsEmeralds).toBeDefined(); + expectTypeOf(data.jetsEmeralds).toEqualTypeOf(); + expect(data.jetsIronBars).toBeDefined(); + expectTypeOf(data.jetsIronBars).toEqualTypeOf(); + expect(data.jetsNetherStars).toBeDefined(); + expectTypeOf(data.jetsNetherStars).toEqualTypeOf(); + expect(data.johnIndigosHammer).toBeDefined(); + expectTypeOf(data.johnIndigosHammer).toEqualTypeOf(); + expect(data.johnPiresoMap).toBeDefined(); + expectTypeOf(data.johnPiresoMap).toEqualTypeOf(); + expect(data.kingFlutAmulet).toBeDefined(); + expectTypeOf(data.kingFlutAmulet).toEqualTypeOf(); + expect(data.kingFlutPillow).toBeDefined(); + expectTypeOf(data.kingFlutPillow).toEqualTypeOf(); + expect(data.ladySaichiMattress).toBeDefined(); + expectTypeOf(data.ladySaichiMattress).toEqualTypeOf(); + expect(data.laundryGalPillows).toBeDefined(); + expectTypeOf(data.laundryGalPillows).toEqualTypeOf(); + expect(data.laundryGalPillowsRepeat).toBeDefined(); + expectTypeOf(data.laundryGalPillowsRepeat).toEqualTypeOf(); + expect(data.laundryManagerSheets).toBeDefined(); + expectTypeOf(data.laundryManagerSheets).toEqualTypeOf(); + expect(data.laundryManagerSheetsRepeat).toBeDefined(); + expectTypeOf(data.laundryManagerSheetsRepeat).toEqualTypeOf(); + expect(data.lesterBrody).toBeDefined(); + expectTypeOf(data.lesterBrody).toEqualTypeOf(); + expect(data.lesterBrodyRepeat).toBeDefined(); + expectTypeOf(data.lesterBrodyRepeat).toEqualTypeOf(); + expect(data.masterMeyer).toBeDefined(); + expectTypeOf(data.masterMeyer).toEqualTypeOf(); + expect(data.masterMeyerRepeat).toBeDefined(); + expectTypeOf(data.masterMeyerRepeat).toEqualTypeOf(); + expect(data.meetTheSandman).toBeDefined(); + expectTypeOf(data.meetTheSandman).toEqualTypeOf(); + expect(data.oasisSouls).toBeDefined(); + expectTypeOf(data.oasisSouls).toEqualTypeOf(); + expect(data.peterEscape).toBeDefined(); + expectTypeOf(data.peterEscape).toEqualTypeOf(); + expect(data.phaseFourAscensionO1).toBeDefined(); + expectTypeOf(data.phaseFourAscensionO1).toEqualTypeOf(); + expect(data.phaseFourAscensionO2).toBeDefined(); + expectTypeOf(data.phaseFourAscensionO2).toEqualTypeOf(); + expect(data.phaseFourAscensionO3).toBeDefined(); + expectTypeOf(data.phaseFourAscensionO3).toEqualTypeOf(); + expect(data.phaseFourAscensionO4).toBeDefined(); + expectTypeOf(data.phaseFourAscensionO4).toEqualTypeOf(); + expect(data.phaseFourAscensionO5).toBeDefined(); + expectTypeOf(data.phaseFourAscensionO5).toEqualTypeOf(); + expect(data.phaseThreeRecp).toBeDefined(); + expectTypeOf(data.phaseThreeRecp).toEqualTypeOf(); + expect(data.phaseTwoRecp).toBeDefined(); + expectTypeOf(data.phaseTwoRecp).toEqualTypeOf(); + expect(data.ratmanBedsheets).toBeDefined(); + expectTypeOf(data.ratmanBedsheets).toEqualTypeOf(); + expect(data.ratmanIronBars).toBeDefined(); + expectTypeOf(data.ratmanIronBars).toEqualTypeOf(); + expect(data.ratmanPillow).toBeDefined(); + expectTypeOf(data.ratmanPillow).toEqualTypeOf(); + expect(data.ratmanSparkPlug).toBeDefined(); + expectTypeOf(data.ratmanSparkPlug).toEqualTypeOf(); + expect(data.receptionistIntroduction).toBeDefined(); + expectTypeOf(data.receptionistIntroduction).toEqualTypeOf(); + expect(data.skyblockPlayerLeaves).toBeDefined(); + expectTypeOf(data.skyblockPlayerLeaves).toEqualTypeOf(); + expect(data.spacemanNetherStars).toBeDefined(); + expectTypeOf(data.spacemanNetherStars).toEqualTypeOf(); + expect(data.wallyBedSheets).toBeDefined(); + expectTypeOf(data.wallyBedSheets).toEqualTypeOf(); + expect(data.wallyNetherStars).toBeDefined(); + expectTypeOf(data.wallyNetherStars).toEqualTypeOf(); + expect(data.zzzzzzzmeow).toBeDefined(); + expectTypeOf(data.zzzzzzzmeow).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestObjective.ts b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestObjective.ts new file mode 100644 index 000000000..38573bc23 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestObjective.ts @@ -0,0 +1,164 @@ +class BedWarsSlumberQuestObjective { + arcadeQuarters: boolean; + arcadeQuartersRepeat: boolean; + billStarrBlitz: boolean; + blacksmithAmulet: boolean; + blacksmithApprenticeCoins: boolean; + blacksmithApprenticeCoinsRepeat: boolean; + blacksmithApprenticeIron: boolean; + blacksmithApprenticeIronRepeat: boolean; + blacksmithGoldenTicket: boolean; + blacksmithIronBars: boolean; + blacksmithMold: boolean; + blacksmithWater: boolean; + buckyFragments: boolean; + buckyFragmentsRepeat: boolean; + buckySkyTeaLeaves: boolean; + buckySkyTeaLeavesRepeat: boolean; + chessTickets: boolean; + chessTokensOfFerocity: boolean; + chessWoolCables: boolean; + combatArtistSally: boolean; + combatArtistSallyRepeat: boolean; + donEspressoGold: boolean; + electricianRussel: boolean; + electricianRusselRepeat: boolean; + executivesMeetingNumbers: boolean; + gamblerGeorgeWin: boolean; + generalDakuTea: boolean; + gizzyMoonpowder: boolean; + gizzyMoonpowderRepeat: boolean; + hammerCoins: boolean; + hammerPartTwoSilverBlade: boolean; + hermesMysteryBoxes: boolean; + inspectorAirFreshener: boolean; + inspectorClueWeapon: boolean; + inspectorGloves: boolean; + inspectorPhoto: boolean; + inspectorWorkBoots: boolean; + jaggerDiamond: boolean; + jaggerEmerald: boolean; + jaggerGold: boolean; + jaggerIron: boolean; + jaggerWool: boolean; + jetsCables: boolean; + jetsEmeralds: boolean; + jetsIronBars: boolean; + jetsNetherStars: boolean; + johnIndigosHammer: boolean; + johnPiresoMap: boolean; + kingFlutAmulet: boolean; + kingFlutPillow: boolean; + ladySaichiMattress: boolean; + laundryGalPillows: boolean; + laundryGalPillowsRepeat: boolean; + laundryManagerSheets: boolean; + laundryManagerSheetsRepeat: boolean; + lesterBrody: boolean; + lesterBrodyRepeat: boolean; + masterMeyer: boolean; + masterMeyerRepeat: boolean; + meetTheSandman: boolean; + oasisSouls: boolean; + peterEscape: boolean; + phaseFourAscensionO1: boolean; + phaseFourAscensionO2: boolean; + phaseFourAscensionO3: boolean; + phaseFourAscensionO4: boolean; + phaseFourAscensionO5: boolean; + phaseThreeRecp: boolean; + phaseTwoRecp: boolean; + ratmanBedsheets: boolean; + ratmanIronBars: boolean; + ratmanPillow: boolean; + ratmanSparkPlug: boolean; + receptionistIntroduction: boolean; + skyblockPlayerLeaves: boolean; + spacemanNetherStars: boolean; + wallyBedSheets: boolean; + wallyNetherStars: boolean; + zzzzzzzmeow: boolean; + constructor(data: Record) { + this.arcadeQuarters = data?.arcade_quarters || false; + this.arcadeQuartersRepeat = data?.arcade_quarters_repeat || false; + this.billStarrBlitz = data?.bill_starr_blitz || false; + this.blacksmithAmulet = data?.blacksmith_amulet || false; + this.blacksmithApprenticeCoins = data?.blacksmith_apprentice_coins || false; + this.blacksmithApprenticeCoinsRepeat = data?.blacksmith_apprentice_coins_repeat || false; + this.blacksmithApprenticeIron = data?.blacksmith_apprentice_iron || false; + this.blacksmithApprenticeIronRepeat = data?.blacksmith_apprentice_iron_repeat || false; + this.blacksmithGoldenTicket = data?.blacksmith_golden_ticket || false; + this.blacksmithIronBars = data?.blacksmith_iron_bars || false; + this.blacksmithMold = data?.blacksmith_mold || false; + this.blacksmithWater = data?.blacksmith_water || false; + this.buckyFragments = data?.bucky_fragments || false; + this.buckyFragmentsRepeat = data?.bucky_fragments_repeat || false; + this.buckySkyTeaLeaves = data?.bucky_sky_tea_leaves || false; + this.buckySkyTeaLeavesRepeat = data?.bucky_sky_tea_leaves_repeat || false; + this.chessTickets = data?.chess_tickets || false; + this.chessTokensOfFerocity = data?.chess_tokens_of_ferocity || false; + this.chessWoolCables = data?.chess_wool_cables || false; + this.combatArtistSally = data?.combat_artist_sally || false; + this.combatArtistSallyRepeat = data?.combat_artist_sally_repeat || false; + this.donEspressoGold = data?.don_espresso_gold || false; + this.electricianRussel = data?.electrician_russel || false; + this.electricianRusselRepeat = data?.electrician_russel_repeat || false; + this.executivesMeetingNumbers = data?.executives_meeting_numbers || false; + this.gamblerGeorgeWin = data?.gambler_george_win || false; + this.generalDakuTea = data?.general_daku_tea || false; + this.gizzyMoonpowder = data?.gizzy_moonpowder || false; + this.gizzyMoonpowderRepeat = data?.gizzy_moonpowder_repeat || false; + this.hammerCoins = data?.hammer_coins || false; + this.hammerPartTwoSilverBlade = data?.hammer_part_two_silver_blade || false; + this.hermesMysteryBoxes = data?.hermes_mystery_boxes || false; + this.inspectorAirFreshener = data?.inspector_air_freshener || false; + this.inspectorClueWeapon = data?.inspector_clue_weapon || false; + this.inspectorGloves = data?.inspector_gloves || false; + this.inspectorPhoto = data?.inspector_photo || false; + this.inspectorWorkBoots = data?.inspector_work_boots || false; + this.jaggerDiamond = data?.jagger_diamond || false; + this.jaggerEmerald = data?.jagger_emerald || false; + this.jaggerGold = data?.jagger_gold || false; + this.jaggerIron = data?.jagger_iron || false; + this.jaggerWool = data?.jagger_wool || false; + this.jetsCables = data?.jets_cables || false; + this.jetsEmeralds = data?.jets_emeralds || false; + this.jetsIronBars = data?.jets_iron_bars || false; + this.jetsNetherStars = data?.jets_nether_stars || false; + this.johnIndigosHammer = data?.john_indigos_hammer || false; + this.johnPiresoMap = data?.john_pireso_map || false; + this.kingFlutAmulet = data?.king_flut_amulet || false; + this.kingFlutPillow = data?.king_flut_pillow || false; + this.ladySaichiMattress = data?.lady_saichi_mattress || false; + this.laundryGalPillows = data?.laundry_gal_pillows || false; + this.laundryGalPillowsRepeat = data?.laundry_gal_pillows_repeat || false; + this.laundryManagerSheets = data?.laundry_manager_sheets || false; + this.laundryManagerSheetsRepeat = data?.laundry_manager_sheets_repeat || false; + this.lesterBrody = data?.lester_brody || false; + this.lesterBrodyRepeat = data?.lester_brody_repeat || false; + this.masterMeyer = data?.master_meyer || false; + this.masterMeyerRepeat = data?.master_meyer_repeat || false; + this.meetTheSandman = data?.meet_the_sandman || false; + this.oasisSouls = data?.oasis_souls || false; + this.peterEscape = data?.peter_escape || false; + this.phaseFourAscensionO1 = data?.phase_four_ascension_o1 || false; + this.phaseFourAscensionO2 = data?.phase_four_ascension_o2 || false; + this.phaseFourAscensionO3 = data?.phase_four_ascension_o3 || false; + this.phaseFourAscensionO4 = data?.phase_four_ascension_o4 || false; + this.phaseFourAscensionO5 = data?.phase_four_ascension_o5 || false; + this.phaseThreeRecp = data?.phase_three_recp || false; + this.phaseTwoRecp = data?.phase_two_recp || false; + this.ratmanBedsheets = data?.ratman_bedsheets || false; + this.ratmanIronBars = data?.ratman_iron_bars || false; + this.ratmanPillow = data?.ratman_pillow || false; + this.ratmanSparkPlug = data?.ratman_spark_plug || false; + this.receptionistIntroduction = data?.receptionist_introduction || false; + this.skyblockPlayerLeaves = data?.skyblock_player_leaves || false; + this.spacemanNetherStars = data?.spaceman_nether_stars || false; + this.wallyBedSheets = data?.wally_bed_sheets || false; + this.wallyNetherStars = data?.wally_nether_stars || false; + this.zzzzzzzmeow = data?.zzzzzzzMEOW || false; + } +} + +export default BedWarsSlumberQuestObjective; diff --git a/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberRoom.test.ts b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberRoom.test.ts new file mode 100644 index 000000000..ed7130696 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberRoom.test.ts @@ -0,0 +1,35 @@ +import BedWarsSlumberRoom from './BedWarsSlumberRoom.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsSlumberRoom', () => { + const data = new BedWarsSlumberRoom({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsSlumberRoom); + expectTypeOf(data).toEqualTypeOf(); + expect(data.ownersOffice).toBeDefined(); + expectTypeOf(data.ownersOffice).toEqualTypeOf(); + expect(data.room1).toBeDefined(); + expectTypeOf(data.room1).toEqualTypeOf(); + expect(data.room2).toBeDefined(); + expectTypeOf(data.room2).toEqualTypeOf(); + expect(data.room3).toBeDefined(); + expectTypeOf(data.room3).toEqualTypeOf(); + expect(data.room4).toBeDefined(); + expectTypeOf(data.room4).toEqualTypeOf(); + expect(data.room5).toBeDefined(); + expectTypeOf(data.room5).toEqualTypeOf(); + expect(data.room6).toBeDefined(); + expectTypeOf(data.room6).toEqualTypeOf(); + expect(data.room7).toBeDefined(); + expectTypeOf(data.room7).toEqualTypeOf(); + expect(data.room8).toBeDefined(); + expectTypeOf(data.room8).toEqualTypeOf(); + expect(data.room9).toBeDefined(); + expectTypeOf(data.room9).toEqualTypeOf(); + expect(data.room10).toBeDefined(); + expectTypeOf(data.room10).toEqualTypeOf(); + expect(data.room11).toBeDefined(); + expectTypeOf(data.room11).toEqualTypeOf(); + expect(data.room12).toBeDefined(); + expectTypeOf(data.room12).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberRoom.ts b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberRoom.ts new file mode 100644 index 000000000..224f51871 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberRoom.ts @@ -0,0 +1,32 @@ +class BedWarsSlumberRoom { + ownersOffice: boolean; + room1: boolean; + room2: boolean; + room3: boolean; + room4: boolean; + room5: boolean; + room6: boolean; + room7: boolean; + room8: boolean; + room9: boolean; + room10: boolean; + room11: boolean; + room12: boolean; + constructor(data: Record) { + this.ownersOffice = data?.owners_office || false; + this.room1 = data?.room_1 || false; + this.room2 = data?.room_2 || false; + this.room3 = data?.room_3 || false; + this.room4 = data?.room_4 || false; + this.room5 = data?.room_5 || false; + this.room6 = data?.room_6 || false; + this.room7 = data?.room_7 || false; + this.room8 = data?.room_8 || false; + this.room9 = data?.room_9 || false; + this.room10 = data?.room_10 || false; + this.room11 = data?.room_11 || false; + this.room12 = data?.room_12 || false; + } +} + +export default BedWarsSlumberRoom; diff --git a/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberSandman.test.ts b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberSandman.test.ts new file mode 100644 index 000000000..f0d6c4170 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberSandman.test.ts @@ -0,0 +1,15 @@ +import BedWarsSlumberSandman from './BedWarsSlumberSandman.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsSlumberSandman', () => { + const data = new BedWarsSlumberSandman({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsSlumberSandman); + expectTypeOf(data).toEqualTypeOf(); + expect(data.expMultiplier).toBeDefined(); + expect(data.expMultiplier).toBeGreaterThanOrEqual(0); + expectTypeOf(data.expMultiplier).toEqualTypeOf(); + expect(data.ticketMultiplier).toBeDefined(); + expect(data.ticketMultiplier).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ticketMultiplier).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberSandman.ts b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberSandman.ts new file mode 100644 index 000000000..fe56c0549 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberSandman.ts @@ -0,0 +1,10 @@ +class BedWarsSlumberSandman { + expMultiplier: number; + ticketMultiplier: number; + constructor(data: Record) { + this.expMultiplier = data?.exp_multiplier || 0; + this.ticketMultiplier = data?.ticket_multiplier || 0; + } +} + +export default BedWarsSlumberSandman; diff --git a/src/Structures/MiniGames/BedWars/BedWarsTwoFour.test.ts b/src/Structures/MiniGames/BedWars/BedWarsTwoFour.test.ts new file mode 100644 index 000000000..7eb518d60 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsTwoFour.test.ts @@ -0,0 +1,13 @@ +import BedWarsMode from './BedWarsMode.js'; +import BedWarsTwoFour from './BedWarsTwoFour.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BedWarsTwoFour', () => { + const data = new BedWarsTwoFour({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BedWarsTwoFour); + expectTypeOf(data).toEqualTypeOf(); + expect(data.tourney).toBeDefined(); + expect(data.tourney).toBeInstanceOf(BedWarsMode); + expectTypeOf(data.tourney).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BedWars/BedWarsTwoFour.ts b/src/Structures/MiniGames/BedWars/BedWarsTwoFour.ts new file mode 100644 index 000000000..14ef2f8f2 --- /dev/null +++ b/src/Structures/MiniGames/BedWars/BedWarsTwoFour.ts @@ -0,0 +1,11 @@ +import BedWarsMode from './BedWarsMode.js'; + +class BedWarsTwoFour extends BedWarsMode { + tourney: BedWarsMode; + constructor(data: Record) { + super(data, 'four_four'); + this.tourney = new BedWarsMode(data, 'tourney_bedwars_two_four_0'); + } +} + +export default BedWarsTwoFour; diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBase.test.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBase.test.ts deleted file mode 100644 index 104b7c31e..000000000 --- a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBase.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -import BedWarsPracticeBase from './BedWarsPracticeBase.js'; -import BedWarsPracticeModeAttempts from './BedWarsPracticeModeAttempts.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('BedWarsPracticeBase', () => { - const data = new BedWarsPracticeBase({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(BedWarsPracticeBase); - expectTypeOf(data).toEqualTypeOf(); - expect(data.attempts).toBeDefined(); - expect(data.attempts).toBeInstanceOf(BedWarsPracticeModeAttempts); - expectTypeOf(data.attempts).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBase.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBase.ts deleted file mode 100644 index 515a35ee9..000000000 --- a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBase.ts +++ /dev/null @@ -1,10 +0,0 @@ -import BedWarsPracticeModeAttempts from './BedWarsPracticeModeAttempts.js'; - -class BedWarsPracticeBase { - attempts: BedWarsPracticeModeAttempts; - constructor(data: Record) { - this.attempts = new BedWarsPracticeModeAttempts(data); - } -} - -export default BedWarsPracticeBase; diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBaseBlocksPlaced.test.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBaseBlocksPlaced.test.ts deleted file mode 100644 index 5cab5a3a4..000000000 --- a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBaseBlocksPlaced.test.ts +++ /dev/null @@ -1,12 +0,0 @@ -import BedWarsPracticeBaseBlocksPlaced from './BedWarsPracticeBaseBlocksPlaced.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('BedWarsPracticeBaseBlocksPlaced', () => { - const data = new BedWarsPracticeBaseBlocksPlaced({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(BedWarsPracticeBaseBlocksPlaced); - expectTypeOf(data).toEqualTypeOf(); - expect(data.blocksPlaced).toBeDefined(); - expect(data.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blocksPlaced).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBaseBlocksPlaced.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBaseBlocksPlaced.ts deleted file mode 100644 index 672677aa4..000000000 --- a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBaseBlocksPlaced.ts +++ /dev/null @@ -1,11 +0,0 @@ -import BedWarsPracticeBase from './BedWarsPracticeBase.js'; - -class BedWarsPracticeBaseBlocksPlaced extends BedWarsPracticeBase { - blocksPlaced: number; - constructor(data: Record) { - super(data); - this.blocksPlaced = data?.blocks_placed ?? 0; - } -} - -export default BedWarsPracticeBaseBlocksPlaced; diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridgingRecords.test.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridgingRecords.test.ts deleted file mode 100644 index d588fa350..000000000 --- a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridgingRecords.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -import BedWarsPracticeBridgingRecords from './BedWarsPracticeBridgingRecords.js'; -import BedWarsPracticeRecord from './BedWarsPracticeRecord.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('BedWarsPracticeBridgingRecords', () => { - const data = new BedWarsPracticeBridgingRecords({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(BedWarsPracticeBridgingRecords); - expectTypeOf(data).toEqualTypeOf(); - expect(data.blocks30).toBeDefined(); - expect(data.blocks30).toBeInstanceOf(BedWarsPracticeRecord); - expectTypeOf(data.blocks30).toEqualTypeOf(); - expect(data.blocks50).toBeDefined(); - expect(data.blocks50).toBeInstanceOf(BedWarsPracticeRecord); - expectTypeOf(data.blocks50).toEqualTypeOf(); - expect(data.blocks100).toBeDefined(); - expect(data.blocks100).toBeInstanceOf(BedWarsPracticeRecord); - expectTypeOf(data.blocks100).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridgingRecords.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridgingRecords.ts deleted file mode 100644 index 3e37ad75a..000000000 --- a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridgingRecords.ts +++ /dev/null @@ -1,14 +0,0 @@ -import BedWarsPracticeRecord from './BedWarsPracticeRecord.js'; - -class BedWarsPracticeBridgingRecords { - blocks30: BedWarsPracticeRecord; - blocks50: BedWarsPracticeRecord; - blocks100: BedWarsPracticeRecord; - constructor(data: Record) { - this.blocks30 = new BedWarsPracticeRecord(data, 30); - this.blocks50 = new BedWarsPracticeRecord(data, 50); - this.blocks100 = new BedWarsPracticeRecord(data, 100); - } -} - -export default BedWarsPracticeBridgingRecords; diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeModeAttempts.test.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeModeAttempts.test.ts deleted file mode 100644 index 2f47bdbbe..000000000 --- a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeModeAttempts.test.ts +++ /dev/null @@ -1,18 +0,0 @@ -import BedWarsPracticeModeAttempts from './BedWarsPracticeModeAttempts.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('BedWarsPracticeModeAttempts', () => { - const data = new BedWarsPracticeModeAttempts({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(BedWarsPracticeModeAttempts); - expectTypeOf(data).toEqualTypeOf(); - expect(data.failed).toBeDefined(); - expect(data.failed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.failed).toEqualTypeOf(); - expect(data.successful).toBeDefined(); - expect(data.successful).toBeGreaterThanOrEqual(0); - expectTypeOf(data.successful).toEqualTypeOf(); - expect(data.total).toBeDefined(); - expect(data.total).toBeGreaterThanOrEqual(0); - expectTypeOf(data.total).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeModeAttempts.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeModeAttempts.ts deleted file mode 100644 index acb45aff9..000000000 --- a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeModeAttempts.ts +++ /dev/null @@ -1,12 +0,0 @@ -class BedWarsPracticeModeAttempts { - failed: number; - successful: number; - total: number; - constructor(data: Record) { - this.failed = data?.failed_attempts ?? 0; - this.successful = data?.successful_attempts ?? 0; - this.total = this.failed + this.successful; - } -} - -export default BedWarsPracticeModeAttempts; diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecord.test.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecord.test.ts deleted file mode 100644 index 6afcab295..000000000 --- a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecord.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -import BedWarsPracticeRecord from './BedWarsPracticeRecord.js'; -import BedWarsPracticeRecordElevation from './BedWarsPracticeRecordElevation.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('BedWarsPracticeRecord', () => { - const data = new BedWarsPracticeRecord({ stats: 'meow' }, 100); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(BedWarsPracticeRecord); - expectTypeOf(data).toEqualTypeOf(); - expect(data.elevationNone).toBeDefined(); - expect(data.elevationNone).toBeInstanceOf(BedWarsPracticeRecordElevation); - expectTypeOf(data.elevationNone).toEqualTypeOf(); - expect(data.elevationSlight).toBeDefined(); - expect(data.elevationSlight).toBeInstanceOf(BedWarsPracticeRecordElevation); - expectTypeOf(data.elevationSlight).toEqualTypeOf(); - expect(data.elevationStaircase).toBeDefined(); - expect(data.elevationStaircase).toBeInstanceOf(BedWarsPracticeRecordElevation); - expectTypeOf(data.elevationStaircase).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecord.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecord.ts deleted file mode 100644 index bb7f6ca8b..000000000 --- a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecord.ts +++ /dev/null @@ -1,14 +0,0 @@ -import BedWarsPracticeRecordElevation from './BedWarsPracticeRecordElevation.js'; - -class BedWarsPracticeRecord { - elevationNone: BedWarsPracticeRecordElevation; - elevationSlight: BedWarsPracticeRecordElevation; - elevationStaircase: BedWarsPracticeRecordElevation; - constructor(data: Record, distance: 30 | 50 | 100) { - this.elevationNone = new BedWarsPracticeRecordElevation(data, distance, 'NONE'); - this.elevationSlight = new BedWarsPracticeRecordElevation(data, distance, 'SLIGHT'); - this.elevationStaircase = new BedWarsPracticeRecordElevation(data, distance, 'STAIRCASE'); - } -} - -export default BedWarsPracticeRecord; diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecordElevation.test.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecordElevation.test.ts deleted file mode 100644 index 1af77740b..000000000 --- a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecordElevation.test.ts +++ /dev/null @@ -1,15 +0,0 @@ -import BedWarsPracticeRecordElevation from './BedWarsPracticeRecordElevation.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('BedWarsPracticeRecordElevation', () => { - const data = new BedWarsPracticeRecordElevation({ stats: 'meow' }, 30, 'NONE'); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(BedWarsPracticeRecordElevation); - expectTypeOf(data).toEqualTypeOf(); - expect(data.straight).toBeDefined(); - expect(data.straight).toBeGreaterThanOrEqual(0); - expectTypeOf(data.straight).toEqualTypeOf(); - expect(data.diagonal).toBeDefined(); - expect(data.diagonal).toBeGreaterThanOrEqual(0); - expectTypeOf(data.diagonal).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecordElevation.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecordElevation.ts deleted file mode 100644 index 95b619cef..000000000 --- a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecordElevation.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { BedWarsPracticeRecordDistances, BedWarsPracticeRecordElevations } from '../../../../Types/Player.js'; - -class BedWarsPracticeRecordElevation { - straight: number; - diagonal: number; - constructor( - data: Record, - distance: BedWarsPracticeRecordDistances, - elevation: BedWarsPracticeRecordElevations - ) { - this.straight = data?.[`bridging_distance_${distance}:elevation_${elevation}:angle_STRAIGHT:`] ?? 0; - this.diagonal = data?.[`bridging_distance_${distance}:elevation_${elevation}:angle_DIAGONAL:`] ?? 0; - } -} - -export default BedWarsPracticeRecordElevation; diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeStats.test.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeStats.test.ts deleted file mode 100644 index 0499ea15e..000000000 --- a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeStats.test.ts +++ /dev/null @@ -1,27 +0,0 @@ -import BedWarsPracticeBase from './BedWarsPracticeBase.js'; -import BedWarsPracticeBaseBlocksPlaced from './BedWarsPracticeBaseBlocksPlaced.js'; -import BedWarsPracticeBridging from './BedWarsPracticeBridging.js'; -import BedWarsPracticeStats from './BedWarsPracticeStats.js'; -import { expect, expectTypeOf, test } from 'vitest'; -import type { BedWarsPracticeModes } from '../../../../Types/Player.js'; - -test('BedWarsPracticeStats', () => { - const data = new BedWarsPracticeStats({ stats: 'meow' }); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(BedWarsPracticeStats); - expectTypeOf(data).toEqualTypeOf(); - expect(data.selected).toBeDefined(); - expectTypeOf(data.selected).toEqualTypeOf(); - expect(data.bridging).toBeDefined(); - expect(data.bridging).toBeInstanceOf(BedWarsPracticeBridging); - expectTypeOf(data.bridging).toEqualTypeOf(); - expect(data.fireballJumping).toBeDefined(); - expect(data.fireballJumping).toBeInstanceOf(BedWarsPracticeBaseBlocksPlaced); - expectTypeOf(data.fireballJumping).toEqualTypeOf(); - expect(data.pearlClutching).toBeDefined(); - expect(data.pearlClutching).toBeInstanceOf(BedWarsPracticeBase); - expectTypeOf(data.pearlClutching).toEqualTypeOf(); - expect(data.MLG).toBeDefined(); - expect(data.MLG).toBeInstanceOf(BedWarsPracticeBaseBlocksPlaced); - expectTypeOf(data.MLG).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeStats.ts b/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeStats.ts deleted file mode 100644 index 81786c80b..000000000 --- a/src/Structures/MiniGames/BedWars/Practice/BedWarsPracticeStats.ts +++ /dev/null @@ -1,21 +0,0 @@ -import BedWarsPracticeBase from './BedWarsPracticeBase.js'; -import BedWarsPracticeBaseBlocksPlaced from './BedWarsPracticeBaseBlocksPlaced.js'; -import BedWarsPracticeBridging from './BedWarsPracticeBridging.js'; -import type { BedWarsPracticeModes } from '../../../../Types/Player.js'; - -class BedWarsPracticeStats { - selected: BedWarsPracticeModes | 'NONE'; - bridging: BedWarsPracticeBridging; - fireballJumping: BedWarsPracticeBaseBlocksPlaced; - pearlClutching: BedWarsPracticeBase; - MLG: BedWarsPracticeBaseBlocksPlaced; - constructor(data: Record) { - this.selected = data?.practice?.selected || 'NONE'; - this.bridging = new BedWarsPracticeBridging(data?.practice?.bridging, data?.practice?.records); - this.fireballJumping = new BedWarsPracticeBaseBlocksPlaced(data?.practice?.fireball_jumping || {}); - this.pearlClutching = new BedWarsPracticeBase(data?.practice?.pearl_clutching || {}); - this.MLG = new BedWarsPracticeBaseBlocksPlaced(data?.practice?.mlg || {}); - } -} - -export default BedWarsPracticeStats; diff --git a/src/Types/Player.ts b/src/Types/Player.ts index ae4f12322..af5a30be5 100644 --- a/src/Types/Player.ts +++ b/src/Types/Player.ts @@ -26,29 +26,6 @@ export type MegaWallsModes = 'face_off' | 'gvg'; export type SpeedUHCModes = 'solo' | 'solo_normal' | 'solo_insane' | 'team' | 'team_normal' | 'team_insane'; export type UHCModes = 'solo' | 'red_vs_blue' | 'no_diamonds' | 'brawl' | 'solo_brawl' | 'duo_brawl'; export type CopsAndCrimsGamemodes = 'deathmatch' | 'gungame'; -export type BedWarsPracticeRecordDistances = 30 | 50 | 100; -export type BedWarsPracticeRecordElevations = 'NONE' | 'SLIGHT' | 'STAIRCASE'; -export type BedWarsPracticeModes = 'BRIDGING' | 'FIREBALL_JUMPING' | 'BOW' | 'MLG' | 'PEARL_CLUTCHING'; -export type BedWarsDreamGamemodeName = 'ultimate' | 'rush' | 'armed' | 'lucky' | 'voidless'; -export type BedWarsGamemodeName = - | 'eight_one' - | 'eight_two' - | 'four_three' - | 'four_four' - | 'two_four' - | 'castle' - | 'eight_two_ultimate' - | 'four_four_ultimate' - | 'eight_two_rush' - | 'four_four_rush' - | 'eight_two_armed' - | 'four_four_armed' - | 'eight_two_lucky' - | 'four_four_lucky' - | 'eight_two_voidless' - | 'four_four_voidless' - | 'eight_one_oneblock'; - export type BlitzSurvivalGamesKits = | 'archer' | 'meatmaster' @@ -2760,3 +2737,1297 @@ export type ArcadePackage = | ArcadePixelPartyDiscoHelmet | ArcadePixelParty | ArcadeDisguise; +export type BedWarsFinalType = + | '' + | 'custom' + | 'drowning' + | 'entity_attack' + | 'entity_explosion' + | 'fall' + | 'fire' + | 'fire_tick' + | 'magic' + | 'projectile' + | 'suffocation' + | 'void' + | 'falling_block' + | 'lava' + | 'contact' + | 'thorns' + | 'wither' + | 'block_explosion'; +export type BedWarsModesEightOne = 'eight_one_oneblock' | 'eight_one_rush' | 'eight_one_ultimate' | 'eight_one'; +export type BedWarsModesEightTwo = + | 'tourney_bedwars_eight_two_1' + | 'tourney_bedwars_eight_two_0' + | 'eight_two_tourney' + | 'eight_two_armed' + | 'eight_two_lucky' + | 'eight_two_rush' + | 'eight_two_swap' + | 'eight_two_ultimate' + | 'eight_two_underworld' + | 'eight_two_voidless' + | 'eight_two'; +export type BedWarsModesFourThree = 'four_three'; +export type BedWarsModesFourFour = + | 'tourney_bedwars4s_1' + | 'tourney_bedwars4s_0' + | 'tourney_bedwars4s' + | 'four_four_armed' + | 'four_four_lucky' + | 'four_four_rush' + | 'four_four_swap' + | 'four_four_ultimate' + | 'four_four_underworld' + | 'four_four_voidless' + | 'four_four'; +export type BedWarsModesTwoFour = 'tourney_bedwars_two_four_0' | 'two_four'; +export type BedWarsModeId = + | 'castle' + | BedWarsModesEightOne + | BedWarsModesEightTwo + | BedWarsModesFourThree + | BedWarsModesFourFour + | BedWarsModesTwoFour; +export type BedWarsChallengeId = + | 'archer_only' + | 'assassin' + | 'cant_touch_this' + | 'capped_resources' + | 'collector' + | 'defuser' + | 'delayed_hitting' + | 'hotbar' + | 'invisible_shop' + | 'knockback_stick_only' + | 'master_assassin' + | 'mining_fatigue' + | 'no_healing' + | 'no_hitting' + | 'no_shift' + | 'no_sprint' + | 'no_swords' + | 'no_team_upgrades' + | 'no_utilities' + | 'patriot' + | 'protect_the_president' + | 'reset_armor' + | 'selfish' + | 'slow_generator' + | 'sponge' + | 'stamina' + | 'stop_light' + | 'toxic_rain' + | 'weighted_items' + | 'woodworker'; +export type BedWarsChallengeName = + | 'ARCHER_ONLY' + | 'ASSASSIN' + | 'CANT_TOUCH_THIS' + | 'COLLECTOR' + | 'DEFUSER' + | 'INVISIBLE_SHOP' + | 'KNOCKBACK_STICK_ONLY' + | 'MINING_FATIGUE' + | 'NO_HEALING' + | 'NO_HITTING' + | 'NO_SHIFT' + | 'NO_SPRINT' + | 'NO_TEAM_UPGRADES' + | 'NO_UTILITIES' + | 'PROTECT_THE_PRESIDENT' + | 'RESET_ARMOR' + | 'SELFISH' + | 'SLOW_GENERATOR' + | 'STOP_LIGHT' + | 'TOXIC_RAIN'; +export type BedWarsPrivateGameSettingsEventTime = '0.5x - Slower' | '1x - Normal' | '2x - Faster' | '4x - Fastest'; +export type BedWarsPrivateGameSettingsHealthBuff = 'Normal Health' | 'Double Health' | 'Triple Health'; +export type BedWarsPrivateGameSettingsRespawnTime = '1 Second' | '5 Seconds' | '10 Seconds'; +export type BedWarsPrivateGameSettingsGameSpeed = 'No Speed' | 'Speed I' | 'Speed II' | 'Speed III'; +export type BedWarsSettingsDeposit = 'ENABLED' | 'DISABLED' | 'HOLOGRAMS_HIDDEN'; +export type BedWarsSettingsSlumberItemNotification = 'CHAT_MESSAGES' | 'ABOVE_HOTBAR' | 'DISABLED'; +export type BedWarsSlumberBag = + | 'EXPLORERS_WALLET' + | 'HOTEL_STAFF_WALLET' + | 'LIGHT_IMPERIAL_WALLET' + | 'LIGHT_SLUMBERS_WALLET' + | 'MINI_WALLET' + | 'PLATINUM_MEMBERSHIP_WALLET'; +export type BedWarsQuickbuyPrivacy = 'MAX' | 'HIGH' | 'MEDIUM' | 'NONE'; +export type BedWarsUltimate = + | 'BUILDER' + | 'DEMOLITION' + | 'FROZO' + | 'GATHERER' + | 'HEALER' + | 'JUMPER' + | 'KANGAROO' + | 'SWORDSMAN'; +export type BedWarsBedDestroy = + | 'beddestroy_bedbugs' + | 'beddestroy_blizzard' + | 'beddestroy_burned_up' + | 'beddestroy_egg_popper' + | 'beddestroy_eggsplosion' + | 'beddestroy_firework' + | 'beddestroy_fishy' + | 'beddestroy_ghosts' + | 'beddestroy_glyph' + | 'beddestroy_ladybug' + | 'beddestroy_lava_explosion' + | 'beddestroy_lighting_strike' + | 'beddestroy_pig_missile' + | 'beddestroy_pigsplosion' + | 'beddestroy_present' + | 'beddestroy_pumpkin_explosion' + | 'beddestroy_shattering_ice_bed' + | 'beddestroy_squid_missile' + | 'beddestroy_stormy' + | 'beddestroy_thief' + | 'beddestroy_tornado' + | 'beddestroy_water_spout'; +export type BedWarsPackageChallenge = + | 'bw_challenge_archer_only_collected' + | 'bw_challenge_assassin_collected' + | 'bw_challenge_cant_touch_this_collected' + | 'bw_challenge_capped_resources_collected' + | 'bw_challenge_collector_collected' + | 'bw_challenge_defuser_collected' + | 'bw_challenge_delayed_hitting_collected' + | 'bw_challenge_hotbar_collected' + | 'bw_challenge_invisible_shop_collected' + | 'bw_challenge_knockback_stick_only_collected' + | 'bw_challenge_master_assassin_collected' + | 'bw_challenge_mining_fatigue_collected' + | 'bw_challenge_no_healing_collected' + | 'bw_challenge_no_hitting_collected' + | 'bw_challenge_no_shift_collected' + | 'bw_challenge_no_sprint_collected' + | 'bw_challenge_no_swords_collected' + | 'bw_challenge_no_team_upgrades_collected' + | 'bw_challenge_no_utilities_collected' + | 'bw_challenge_patriot_collected' + | 'bw_challenge_protect_the_president_collected' + | 'bw_challenge_reset_armor_collected' + | 'bw_challenge_selfish_collected' + | 'bw_challenge_slow_generator_collected' + | 'bw_challenge_sponge_collected' + | 'bw_challenge_stamina_collected' + | 'bw_challenge_stop_light_collected' + | 'bw_challenge_toxic_rain_collected' + | 'bw_challenge_weighted_items_collected' + | 'bw_challenge_woodworker_collected'; +export type BedWarsDeathCry = + | 'deathcry_arcade' + | 'deathcry_aww' + | 'deathcry_bat' + | 'deathcry_bazinga' + | 'deathcry_burp' + | 'deathcry_cat_hit' + | 'deathcry_dark_portal' + | 'deathcry_deflated_toy' + | 'deathcry_ding' + | 'deathcry_dinosaur' + | 'deathcry_doused_lantern' + | 'deathcry_dragon_roar' + | 'deathcry_dry_bones' + | 'deathcry_enderman' + | 'deathcry_energy' + | 'deathcry_fireball' + | 'deathcry_firework' + | 'deathcry_ghosts_cry' + | 'deathcry_gone' + | 'deathcry_grumble' + | 'deathcry_grumpy_villager' + | 'deathcry_guardian_death' + | 'deathcry_haunted_curse' + | 'deathcry_howl' + | 'deathcry_miracle' + | 'deathcry_monster_burp' + | 'deathcry_pig' + | 'deathcry_plop' + | 'deathcry_rage' + | 'deathcry_robot_mouse' + | 'deathcry_sad_moo' + | 'deathcry_sad_puppy' + | 'deathcry_scurry' + | 'deathcry_sniff' + | 'deathcry_splash' + | 'deathcry_squeak' + | 'deathcry_squeal'; +export type BedWarsFavoriteMap = + | 'favoritemap_acropolis' + | 'favoritemap_aetius' + | 'favoritemap_airshow' + | 'favoritemap_alaric' + | 'favoritemap_amazon' + | 'favoritemap_ambush' + | 'favoritemap_antenna' + | 'favoritemap_apollo' + | 'favoritemap_aqil' + | 'favoritemap_aquarium' + | 'favoritemap_arcade' + | 'favoritemap_archway' + | 'favoritemap_arid' + | 'favoritemap_artemis' + | 'favoritemap_ashfire' + | 'favoritemap_ashore' + | 'favoritemap_babylon' + | 'favoritemap_beeeee' + | 'favoritemap_bio-hazard' + | 'favoritemap_blitzen' + | 'favoritemap_blizzard bay' + | 'favoritemap_bloom' + | 'favoritemap_blossom' + | 'favoritemap_boardwalk' + | 'favoritemap_boletum' + | 'favoritemap_bucket bay' + | 'favoritemap_build site' + | 'favoritemap_bunnywars' + | 'favoritemap_burrow' + | 'favoritemap_carapace' + | 'favoritemap_cascade' + | 'favoritemap_casita' + | 'favoritemap_catalyst' + | 'favoritemap_cauldron' + | 'favoritemap_chained' + | 'favoritemap_chalk cliffs' + | 'favoritemap_cliffside' + | 'favoritemap_coastal' + | 'favoritemap_comet' + | 'favoritemap_crimson' + | 'favoritemap_crogorm' + | 'favoritemap_crypt' + | 'favoritemap_daolong' + | 'favoritemap_darkened' + | 'favoritemap_deadwood' + | 'favoritemap_deposit' + | 'favoritemap_dockyard' + | 'favoritemap_dragon light' + | 'favoritemap_dragonstar' + | 'favoritemap_dreamgrove' + | 'favoritemap_duye' + | 'favoritemap_easter basket' + | 'favoritemap_easter garden' + | 'favoritemap_eastwood' + | 'favoritemap_eden' + | 'favoritemap_egg factory' + | 'favoritemap_egg hunt' + | 'favoritemap_egg run' + | 'favoritemap_enchanted' + | 'favoritemap_extinction' + | 'favoritemap_fang outpost' + | 'favoritemap_fireplace' + | 'favoritemap_fort doon' + | 'favoritemap_foxtrots' + | 'favoritemap_frogiton' + | 'favoritemap_frosted' + | 'favoritemap_fruitbrawl' + | 'favoritemap_gateway' + | 'favoritemap_gelato' + | 'favoritemap_ghoulish' + | 'favoritemap_gingerbread' + | 'favoritemap_glacier' + | 'favoritemap_grave' + | 'favoritemap_graveship' + | 'favoritemap_grotto' + | 'favoritemap_halloweeneastwood' + | 'favoritemap_halloweenspeedway' + | 'favoritemap_haloweeneastwood' + | 'favoritemap_haloweenspeedway' + | 'favoritemap_hanging gardens' + | 'favoritemap_harvest' + | 'favoritemap_harvesting' + | 'favoritemap_hell temple' + | 'favoritemap_highland peaks' + | 'favoritemap_hollow' + | 'favoritemap_hollow hills' + | 'favoritemap_holmgang' + | 'favoritemap_horizon' + | 'favoritemap_impere' + | 'favoritemap_inca' + | 'favoritemap_infinite' + | 'favoritemap_invasion' + | 'favoritemap_ironclad' + | 'favoritemap_jurassic' + | 'favoritemap_katsu' + | 'favoritemap_keep' + | 'favoritemap_kubo' + | 'favoritemap_lectus' + | 'favoritemap_lighthouse' + | 'favoritemap_lightstone' + | 'favoritemap_loft' + | 'favoritemap_lost temple' + | 'favoritemap_lotice' + | 'favoritemap_lotus' + | 'favoritemap_lucky rush' + | 'favoritemap_lunarhouse' + | 'favoritemap_meadow' + | 'favoritemap_meso' + | 'favoritemap_mirage' + | 'favoritemap_montipora' + | 'favoritemap_mortuus' + | 'favoritemap_mystery' + | 'favoritemap_nebuc' + | 'favoritemap_nostalgia' + | 'favoritemap_nutcracker' + | 'favoritemap_obelisk' + | 'favoritemap_ominosity' + | 'favoritemap_orbit' + | 'favoritemap_orchestra' + | 'favoritemap_orchid' + | 'favoritemap_orientwood' + | 'favoritemap_paladin' + | 'favoritemap_paradox' + | 'favoritemap_pavilion' + | 'favoritemap_pernicious' + | 'favoritemap_pharaoh' + | 'favoritemap_pharoah' + | 'favoritemap_planet 98' + | 'favoritemap_playground' + | 'favoritemap_polygon' + | 'favoritemap_pool party' + | 'favoritemap_pumpkin bay' + | 'favoritemap_raze' + | 'favoritemap_relic' + | 'favoritemap_retreat' + | 'favoritemap_rigged' + | 'favoritemap_rise' + | 'favoritemap_rooftop' + | 'favoritemap_rooted' + | 'favoritemap_salmon bay' + | 'favoritemap_sanctuary' + | 'favoritemap_sanctum' + | 'favoritemap_sandcastle' + | "favoritemap_santa's rush" + | 'favoritemap_scareshow' + | 'favoritemap_scorched sands' + | 'favoritemap_screamway' + | 'favoritemap_seraph' + | 'favoritemap_serenity' + | 'favoritemap_shark attack' + | 'favoritemap_siege' + | 'favoritemap_silver birch' + | 'favoritemap_sky festival' + | 'favoritemap_sky rise' + | 'favoritemap_slumber' + | 'favoritemap_snails' + | 'favoritemap_snowkeep' + | 'favoritemap_snowy square' + | 'favoritemap_solace' + | 'favoritemap_speedway' + | 'favoritemap_springtide' + | 'favoritemap_steampumpkin' + | 'favoritemap_steampunk' + | 'favoritemap_stilted' + | 'favoritemap_stonekeep' + | 'favoritemap_sunflower' + | 'favoritemap_swashbuckle' + | 'favoritemap_sweet wonderland' + | 'favoritemap_symphonic' + | 'favoritemap_temple' + | 'favoritemap_tengshe' + | 'favoritemap_terminal' + | 'favoritemap_terraced' + | 'favoritemap_tigris' + | 'favoritemap_tinselbury' + | 'favoritemap_toro' + | 'favoritemap_toy factory' + | 'favoritemap_treenan' + | 'favoritemap_trick or treat' + | 'favoritemap_trick or yeet' + | 'favoritemap_turtle cove' + | 'favoritemap_tuzi' + | 'favoritemap_unchained' + | 'favoritemap_unturned' + | 'favoritemap_urban plaza' + | 'favoritemap_usagi' + | 'favoritemap_varyth' + | 'favoritemap_vigilante' + | 'favoritemap_waterfall' + | 'favoritemap_whiskers' + | 'favoritemap_winterland' + | 'favoritemap_wrapped up' + | 'favoritemap_yandi' + | 'favoritemap_yue' + | 'favoritemap_zarzul' + | 'favoritemap_zen plaza'; +export type BedwarsFigurine = + | 'figurine_alchemy' + | 'figurine_alex' + | 'figurine_blitz_star' + | 'figurine_bridge_egg' + | 'figurine_build_battle' + | 'figurine_cerberus' + | 'figurine_creeper' + | 'figurine_crossed_swords' + | 'figurine_dante' + | 'figurine_defended_bed' + | 'figurine_delivery_man' + | 'figurine_diamond_hoe' + | 'figurine_diamonds' + | 'figurine_don_espresso' + | 'figurine_dragon_slayer' + | 'figurine_emeralds' + | 'figurine_ender_pearl' + | 'figurine_enderman' + | 'figurine_executives_meeting' + | 'figurine_fireballs' + | 'figurine_fishing_rod' + | 'figurine_golden_apple' + | 'figurine_golden_sandman' + | 'figurine_grass_block' + | 'figurine_groopo' + | 'figurine_guardian' + | 'figurine_hammer_vs_heatwave' + | 'figurine_hot_air_balloon' + | 'figurine_housing' + | 'figurine_hypixel' + | 'figurine_hypixel_logo' + | 'figurine_iron_punch' + | 'figurine_iron_rose' + | 'figurine_kart_racing' + | 'figurine_knockback' + | 'figurine_legacy' + | 'figurine_magma_boss' + | 'figurine_missing_bed' + | 'figurine_portal' + | 'figurine_ratman' + | 'figurine_regular_sandman' + | 'figurine_rezzus' + | 'figurine_shears' + | 'figurine_sheep' + | 'figurine_sky_island' + | 'figurine_sniper' + | 'figurine_steve' + | 'figurine_the_pit' + | 'figurine_tic_tac_toe' + | 'figurine_tnt' + | 'figurine_top_beds' + | 'figurine_top_killer' + | 'figurine_zombie'; +export type BedWarsGlyph = + | 'glyph_angry_face' + | 'glyph_bat' + | 'glyph_bauble' + | 'glyph_bed' + | 'glyph_big_smile' + | 'glyph_black_cat' + | 'glyph_bloom' + | 'glyph_blossom' + | 'glyph_bronze_shield' + | 'glyph_bunny' + | 'glyph_bunny_guy' + | 'glyph_burn' + | 'glyph_candy' + | 'glyph_candy_cane' + | 'glyph_candy_corn' + | 'glyph_carrot' + | 'glyph_cat' + | 'glyph_cauldron' + | 'glyph_celebration_popper' + | 'glyph_chick' + | 'glyph_chicken' + | 'glyph_chinese_firecracker' + | 'glyph_chocolate' + | 'glyph_chocolate_egg' + | 'glyph_christmas_tree' + | 'glyph_coconut' + | 'glyph_creeper_scream' + | 'glyph_cry_face' + | 'glyph_cute_ghost' + | 'glyph_cute_pumpkin' + | 'glyph_daisy' + | 'glyph_diamond' + | 'glyph_dog' + | 'glyph_dragon' + | 'glyph_dreidel' + | 'glyph_earth' + | 'glyph_easter_egg' + | 'glyph_easter_flower' + | 'glyph_egg_basket' + | 'glyph_egg_with_bow' + | 'glyph_elf' + | 'glyph_emerald' + | 'glyph_eyeball' + | 'glyph_fai_chun' + | 'glyph_festive_bell' + | 'glyph_flame' + | 'glyph_gg' + | 'glyph_ghost' + | 'glyph_gift' + | 'glyph_gingerbread_man' + | 'glyph_gold' + | 'glyph_gold_lunar' + | 'glyph_gold_shield' + | 'glyph_grave' + | 'glyph_halloween' + | 'glyph_heart' + | 'glyph_hi' + | 'glyph_holly' + | 'glyph_hot' + | 'glyph_hot_cross_bun' + | 'glyph_iron' + | 'glyph_lantern' + | 'glyph_lion_dancer' + | 'glyph_lol' + | 'glyph_lucky_rabbit' + | 'glyph_menorah' + | 'glyph_moon' + | 'glyph_mouse' + | 'glyph_no' + | 'glyph_no_1' + | 'glyph_orange' + | 'glyph_palm_tree' + | 'glyph_party' + | 'glyph_pig' + | 'glyph_pilgrim_hat' + | 'glyph_player_face' + | 'glyph_pumpkin' + | 'glyph_pumpkin_2' + | 'glyph_quack' + | 'glyph_rabbit' + | 'glyph_rainbow' + | 'glyph_red_envelope' + | 'glyph_reindeer' + | 'glyph_rip' + | 'glyph_rose' + | 'glyph_santa_hat' + | 'glyph_scream_face' + | 'glyph_shell' + | 'glyph_shock_face' + | 'glyph_silver_shield' + | 'glyph_skull' + | 'glyph_smiley_face' + | 'glyph_snowflake' + | 'glyph_snowman' + | 'glyph_sparkle' + | 'glyph_spectrum' + | 'glyph_spider' + | 'glyph_squeak' + | 'glyph_star' + | 'glyph_stocking' + | 'glyph_storm' + | 'glyph_strawberry' + | 'glyph_sunflower' + | 'glyph_sword' + | 'glyph_this_is_fine' + | 'glyph_thumbs_down' + | 'glyph_thumbs_up' + | 'glyph_tiger' + | 'glyph_tnt' + | 'glyph_umbrella' + | 'glyph_winky_face' + | 'glyph_witch_hat' + | 'glyph_wreath' + | 'glyph_yes'; +export type BedWarsIslandTopper = + | 'islandtopper_angel' + | 'islandtopper_assassin' + | 'islandtopper_assassin_sword' + | 'islandtopper_ballista' + | 'islandtopper_basket' + | 'islandtopper_bee' + | 'islandtopper_bell' + | 'islandtopper_big_present' + | 'islandtopper_birdhouse' + | 'islandtopper_bleeding_heart' + | 'islandtopper_bluebird' + | 'islandtopper_bomb' + | 'islandtopper_brick_house' + | 'islandtopper_broken_pumpkin' + | 'islandtopper_bungalow' + | 'islandtopper_bunny' + | 'islandtopper_bunny_in_hat' + | 'islandtopper_candle' + | 'islandtopper_candles' + | 'islandtopper_candy_basket' + | 'islandtopper_candy_cane' + | 'islandtopper_candy_corn' + | 'islandtopper_carrot' + | 'islandtopper_chalice' + | 'islandtopper_cherry_blossom' + | 'islandtopper_chicken' + | 'islandtopper_chimney' + | 'islandtopper_chocolate_bunny' + | 'islandtopper_chocolate_egg' + | 'islandtopper_chocolatebar' + | 'islandtopper_christmas_hat' + | 'islandtopper_christmas_tree' + | 'islandtopper_clown' + | 'islandtopper_coconut_drink' + | 'islandtopper_coffin' + | 'islandtopper_collector' + | 'islandtopper_cow' + | 'islandtopper_crab' + | 'islandtopper_crystal_ball' + | 'islandtopper_cyclops' + | 'islandtopper_dead_tree' + | 'islandtopper_demon' + | 'islandtopper_devil' + | 'islandtopper_dragon_head' + | 'islandtopper_dreidel' + | 'islandtopper_easter_bell' + | 'islandtopper_easter_egg' + | 'islandtopper_eyeball' + | 'islandtopper_fancy_helmet' + | 'islandtopper_firecracker' + | 'islandtopper_firework_rocket' + | 'islandtopper_fish_bowl' + | 'islandtopper_fishing_rod' + | 'islandtopper_flame' + | 'islandtopper_flamingo' + | 'islandtopper_fountain_firework' + | 'islandtopper_frankenstein' + | 'islandtopper_gapple' + | 'islandtopper_gargoyle' + | 'islandtopper_ghost' + | 'islandtopper_gingerbread_house' + | 'islandtopper_gold_present' + | 'islandtopper_gong' + | 'islandtopper_gravestone' + | 'islandtopper_hatching_egg' + | 'islandtopper_haunted_mansion' + | 'islandtopper_heart' + | 'islandtopper_hermit_crab' + | 'islandtopper_hot_cocoa' + | 'islandtopper_hypixel_knight' + | 'islandtopper_invisible_villager' + | 'islandtopper_ladybug' + | 'islandtopper_lantern' + | 'islandtopper_large_rabbit' + | 'islandtopper_lazy_miner' + | 'islandtopper_leaf' + | 'islandtopper_lunar_dragon' + | 'islandtopper_mark_of_the_paw' + | 'islandtopper_mister_egg' + | 'islandtopper_monocle' + | 'islandtopper_mummy' + | 'islandtopper_nest_of_chicks' + | 'islandtopper_new_ghost' + | 'islandtopper_note' + | 'islandtopper_nutcracker' + | 'islandtopper_owl' + | 'islandtopper_ox' + | 'islandtopper_pagoda' + | 'islandtopper_panda' + | 'islandtopper_parasol' + | 'islandtopper_parchment' + | 'islandtopper_party_sloth' + | 'islandtopper_penguin' + | 'islandtopper_penguin_stack' + | 'islandtopper_penjing' + | 'islandtopper_picnic_basket' + | 'islandtopper_pig' + | 'islandtopper_pinecone' + | 'islandtopper_pot' + | 'islandtopper_presents' + | 'islandtopper_president_goons' + | 'islandtopper_pudding' + | 'islandtopper_pumpkin' + | 'islandtopper_rabbit_ears' + | 'islandtopper_rain' + | 'islandtopper_rainbow_sheep' + | 'islandtopper_ramen' + | 'islandtopper_reaper' + | 'islandtopper_red_envelope' + | 'islandtopper_reindeer' + | 'islandtopper_roast_turkey' + | 'islandtopper_robin' + | 'islandtopper_rubix_cube' + | 'islandtopper_sailboat' + | 'islandtopper_sand_castle' + | 'islandtopper_sapling' + | 'islandtopper_sheep' + | 'islandtopper_shopping_cart' + | 'islandtopper_skeleton_thumbs_up' + | 'islandtopper_skullsword' + | 'islandtopper_sleigh' + | 'islandtopper_slime' + | 'islandtopper_sloth' + | 'islandtopper_small_rabbit' + | 'islandtopper_smiley_face' + | 'islandtopper_snake' + | 'islandtopper_snowflake' + | 'islandtopper_snowglobe' + | 'islandtopper_snowman' + | 'islandtopper_snowy_cabin' + | 'islandtopper_spooky_hypixel' + | 'islandtopper_spooky_lantern' + | 'islandtopper_sprout' + | 'islandtopper_stocking' + | 'islandtopper_stoplight' + | 'islandtopper_sun_glasses' + | 'islandtopper_sunflower' + | 'islandtopper_surfboard' + | 'islandtopper_sword' + | 'islandtopper_tall_carrot' + | 'islandtopper_temple' + | 'islandtopper_temple_hut' + | 'islandtopper_the_l' + | 'islandtopper_thunder' + | 'islandtopper_tiger' + | 'islandtopper_tnt' + | 'islandtopper_top_hat' + | 'islandtopper_tourney' + | 'islandtopper_toxic_rain' + | 'islandtopper_treasure_chest' + | 'islandtopper_tree' + | 'islandtopper_tulips' + | 'islandtopper_watering_can' + | 'islandtopper_watermelon' + | 'islandtopper_wave' + | 'islandtopper_werewolf' + | 'islandtopper_whale' + | 'islandtopper_wicked_zombie' + | 'islandtopper_witch' + | 'islandtopper_witch_hat' + | 'islandtopper_witch_house' + | 'islandtopper_witchs_potion' + | 'islandtopper_yin_and_yang' + | 'islandtopper_zombiehand'; +export type BedWarsKillEffect = + | 'killeffect_after_life' + | 'killeffect_anvil_smash' + | 'killeffect_balloons' + | 'killeffect_batcrux' + | 'killeffect_bee_abduction' + | 'killeffect_beef_everywhere' + | 'killeffect_black_mark' + | 'killeffect_blood_bats' + | 'killeffect_blood_explosion' + | 'killeffect_bunny_explosion' + | 'killeffect_burning_shoes' + | 'killeffect_campfire' + | 'killeffect_candle' + | 'killeffect_chicken_tower' + | 'killeffect_cookie_fountain' + | 'killeffect_cow_rocket' + | 'killeffect_crackling_ice' + | 'killeffect_draculas_flight' + | 'killeffect_egg_theft' + | 'killeffect_final_smash' + | 'killeffect_fire_breath' + | 'killeffect_firework' + | 'killeffect_frozen_in_time' + | 'killeffect_gift_explosion' + | 'killeffect_golemyeet' + | 'killeffect_guardian_rocket' + | 'killeffect_hatching_eggs' + | 'killeffect_haunted' + | 'killeffect_head_rocket' + | 'killeffect_heart_aura' + | 'killeffect_heartbeat' + | 'killeffect_holiday_fireworks' + | 'killeffect_holiday_tree' + | 'killeffect_jack_o_twister' + | 'killeffect_kill_counter_holo' + | 'killeffect_lantern_spiral' + | 'killeffect_lighting_strike' + | 'killeffect_lightning_strike' + | 'killeffect_lit' + | 'killeffect_magnolia' + | 'killeffect_pedestal' + | 'killeffect_petal_gust' + | 'killeffect_pigsmash' + | 'killeffect_piñata' + | 'killeffect_present_rain' + | 'killeffect_pumpkin_popper' + | 'killeffect_pumpkin_rocket' + | 'killeffect_rain_on_my_parade' + | 'killeffect_rainbow' + | 'killeffect_raining_eggs' + | 'killeffect_raining_gold' + | 'killeffect_rekt' + | 'killeffect_ring_of_fire' + | 'killeffect_rising_dragon' + | 'killeffect_shattered' + | 'killeffect_shockwave' + | 'killeffect_skeletalremains' + | 'killeffect_smiley' + | 'killeffect_snow_globe' + | 'killeffect_snowplosion' + | 'killeffect_soul_ripper' + | 'killeffect_spirit' + | 'killeffect_squid_missile' + | 'killeffect_team_destroy' + | 'killeffect_tnt' + | 'killeffect_tornado' + | 'killeffect_wing_gusts' + | 'killeffect_witch_ritual' + | 'killeffect_xp_orb'; +export type BedWarsKillMessage = + | 'killmessages_bbq' + | 'killmessages_bridging_for_dummies' + | 'killmessages_buzz' + | 'killmessages_celebratory' + | 'killmessages_counter' + | 'killmessages_dramatic' + | 'killmessages_eggy' + | 'killmessages_festive' + | 'killmessages_fire' + | 'killmessages_glorious' + | 'killmessages_honourable' + | 'killmessages_limbo' + | 'killmessages_love' + | 'killmessages_memed' + | 'killmessages_multiverse' + | 'killmessages_noble' + | 'killmessages_oink' + | 'killmessages_old_man' + | 'killmessages_oxed' + | 'killmessages_pirate' + | 'killmessages_primal' + | 'killmessages_roar' + | 'killmessages_santa_workshop' + | 'killmessages_snow_storm' + | 'killmessages_social_distancing' + | 'killmessages_spooky' + | 'killmessages_squeak' + | 'killmessages_to_the_moon' + | 'killmessages_western' + | 'killmessages_woof_woof' + | 'killmessages_wrapped_up'; +export type BedWarsNPCSkin = + | 'npcskin_aqua_duck_pajamas' + | 'npcskin_astronaut' + | 'npcskin_bao' + | 'npcskin_bed_researcher' + | 'npcskin_bed_salesman' + | 'npcskin_blaze' + | 'npcskin_blue_rabbit' + | 'npcskin_blue_sheep_pajamas' + | 'npcskin_bright_tiger' + | 'npcskin_bundled_snowman' + | 'npcskin_bunny_costume' + | 'npcskin_bunny_in_suit' + | 'npcskin_cheesy' + | 'npcskin_chen' + | 'npcskin_clown' + | 'npcskin_cluck_stack' + | 'npcskin_creeper' + | 'npcskin_cute_puppy' + | 'npcskin_dark_dragon' + | 'npcskin_defuser' + | 'npcskin_dragon' + | 'npcskin_egg_delivery' + | 'npcskin_ender_pulse' + | 'npcskin_enderman' + | 'npcskin_evil_eye' + | 'npcskin_frog_man' + | 'npcskin_ghost' + | 'npcskin_gold_tiger' + | 'npcskin_green_cow_pajamas' + | 'npcskin_grinch' + | 'npcskin_hammer' + | 'npcskin_heatwave' + | 'npcskin_holiday_bartender' + | 'npcskin_holiday_tree' + | 'npcskin_ice_queen' + | 'npcskin_john_indigos' + | 'npcskin_killer' + | 'npcskin_king_of_beds' + | 'npcskin_lester_brody' + | 'npcskin_li' + | 'npcskin_lucky_cat' + | 'npcskin_lumberjack' + | 'npcskin_magic_vendor' + | 'npcskin_man_wearing_suit' + | 'npcskin_marksman' + | 'npcskin_merchant' + | 'npcskin_mouse' + | 'npcskin_mr_giftman' + | 'npcskin_oasis_spirit' + | 'npcskin_patriot_eagle' + | 'npcskin_penguin' + | 'npcskin_pink_bunny_pajamas' + | 'npcskin_pink_rabbit' + | 'npcskin_present_man' + | 'npcskin_president_sloth' + | 'npcskin_purple_pig_pajamas' + | 'npcskin_quack' + | 'npcskin_rat' + | 'npcskin_ratman' + | 'npcskin_red_frog_pajamas' + | 'npcskin_reindeer' + | 'npcskin_reindeer2' + | 'npcskin_sacred_cattle' + | 'npcskin_santa' + | 'npcskin_scarecrow' + | 'npcskin_skeleton' + | 'npcskin_skeletor' + | 'npcskin_slumber_receptionist' + | 'npcskin_snow_globe_elf' + | 'npcskin_snowman' + | 'npcskin_spaceman' + | 'npcskin_stack_o_lantern' + | 'npcskin_stellar' + | 'npcskin_upside_down_snowman' + | 'npcskin_villager_zombie' + | 'npcskin_warrior' + | 'npcskin_watcher' + | 'npcskin_wei' + | 'npcskin_witch' + | 'npcskin_wither' + | 'npcskin_wither_skeleton' + | 'npcskin_wither_tower' + | 'npcskin_xiu' + | 'npcskin_you' + | 'npcskin_zhao' + | 'npcskin_zombie' + | 'npcskin_zombie_pigman'; +export type BedWarsProjectileTrail = + | 'projectileTrail_Jack_O_Lantern_Trail' + | 'projectileTrail_angry_villager' + | 'projectileTrail_bee' + | 'projectileTrail_bite' + | 'projectileTrail_black_smoke' + | 'projectileTrail_blood' + | 'projectileTrail_blue_dust' + | 'projectileTrail_bone' + | 'projectileTrail_chains' + | 'projectileTrail_cheese' + | 'projectileTrail_ender' + | 'projectileTrail_fire' + | 'projectileTrail_fire_spiral' + | 'projectileTrail_fireball' + | 'projectileTrail_firework' + | 'projectileTrail_green_star' + | 'projectileTrail_hanukkah' + | 'projectileTrail_hearts' + | 'projectileTrail_hoops' + | 'projectileTrail_lava' + | 'projectileTrail_let_there_be_leather' + | 'projectileTrail_lunar_dust' + | 'projectileTrail_magic' + | 'projectileTrail_magic_wind' + | 'projectileTrail_merry' + | 'projectileTrail_meteorblaze' + | 'projectileTrail_notes' + | 'projectileTrail_peep_hatching' + | 'projectileTrail_portal_trail' + | 'projectileTrail_potion' + | 'projectileTrail_present' + | 'projectileTrail_pumpkin_pie' + | 'projectileTrail_purple_dust' + | 'projectileTrail_rainbow' + | 'projectileTrail_rainy' + | 'projectileTrail_random' + | 'projectileTrail_red_dust' + | 'projectileTrail_rocket' + | 'projectileTrail_slime' + | 'projectileTrail_slumber' + | 'projectileTrail_snowball_rain' + | 'projectileTrail_spring_ribbons' + | 'projectileTrail_the_end_trail' + | 'projectileTrail_tinsel' + | 'projectileTrail_trick_or_treat' + | 'projectileTrail_twin_dragon' + | 'projectileTrail_twisted_trail' + | 'projectileTrail_water' + | 'projectileTrail_white_smoke' + | 'projectileTrail_wingman' + | 'projectiletrail_Jack_O_Lantern_Trail' + | 'projectiletrail_angry_villager' + | 'projectiletrail_bee' + | 'projectiletrail_bite' + | 'projectiletrail_black_smoke' + | 'projectiletrail_blood' + | 'projectiletrail_blue_dust' + | 'projectiletrail_bone' + | 'projectiletrail_candy_basket' + | 'projectiletrail_chains' + | 'projectiletrail_cheese' + | 'projectiletrail_cold' + | 'projectiletrail_cursedflame' + | 'projectiletrail_ender' + | 'projectiletrail_fanged' + | 'projectiletrail_fire' + | 'projectiletrail_fire_spiral' + | 'projectiletrail_fireball' + | 'projectiletrail_firework' + | 'projectiletrail_flame_rings' + | 'projectiletrail_green_star' + | 'projectiletrail_hanukkah' + | 'projectiletrail_hearts' + | 'projectiletrail_hoops' + | 'projectiletrail_howling_wind' + | 'projectiletrail_icicle' + | 'projectiletrail_jack_o_lantern_trail' + | 'projectiletrail_lava' + | 'projectiletrail_let_there_be_leather' + | 'projectiletrail_lunar_dust' + | 'projectiletrail_magic' + | 'projectiletrail_magic_wind' + | 'projectiletrail_merry' + | 'projectiletrail_meteorblaze' + | 'projectiletrail_notes' + | 'projectiletrail_peep_hatching' + | 'projectiletrail_portal_trail' + | 'projectiletrail_potion' + | 'projectiletrail_present' + | 'projectiletrail_pumpkin_pie' + | 'projectiletrail_pumpkin_spice_powered' + | 'projectiletrail_pumpkin_volley_trail' + | 'projectiletrail_purple_dust' + | 'projectiletrail_rainbow' + | 'projectiletrail_rainy' + | 'projectiletrail_random' + | 'projectiletrail_red_dust' + | 'projectiletrail_rocket' + | 'projectiletrail_rose' + | 'projectiletrail_slime' + | 'projectiletrail_slumber' + | 'projectiletrail_snowball_rain' + | 'projectiletrail_sparkler' + | 'projectiletrail_spiders_silk' + | 'projectiletrail_spring_ribbons' + | 'projectiletrail_stormy' + | 'projectiletrail_the_end_trail' + | 'projectiletrail_tinsel' + | 'projectiletrail_trick_or_treat' + | 'projectiletrail_twin_dragon' + | 'projectiletrail_twirling_snowflake' + | 'projectiletrail_twisted_trail' + | 'projectiletrail_water' + | 'projectiletrail_white_smoke' + | 'projectiletrail_wingman' + | 'projectiletrail_wisp_whirlwind'; +export type BedWarsSpray = + | 'sprays_angelic_jerry' + | 'sprays_angry_cow' + | 'sprays_angry_turkey' + | 'sprays_bed_breaker' + | 'sprays_bed_shield' + | 'sprays_bee_that_chicken' + | 'sprays_boo' + | 'sprays_buff_chicken' + | 'sprays_bunny_gg' + | 'sprays_bunny_lantern' + | 'sprays_bunny_parkour' + | 'sprays_bye_bye' + | 'sprays_candy_cane_sniper' + | 'sprays_candy_king' + | 'sprays_carried' + | 'sprays_casual_christmas' + | 'sprays_cat_graffiti' + | 'sprays_chickens' + | 'sprays_choc_feast' + | 'sprays_christmas_tree' + | 'sprays_comfy_web' + | 'sprays_cooler_climates' + | 'sprays_creeper' + | 'sprays_curled_ox' + | 'sprays_cute_bunny' + | 'sprays_decorative_island' + | 'sprays_diamond' + | 'sprays_disco_pumpkin' + | 'sprays_distinguished_ghost' + | 'sprays_dogs_of_wisdom' + | 'sprays_doot' + | 'sprays_dragon' + | 'sprays_dragon_slayer' + | 'sprays_earth_pig' + | 'sprays_easter_basket' + | 'sprays_easter_creeper' + | 'sprays_easter_eggs' + | 'sprays_easter_sweater' + | 'sprays_egg_decorations' + | 'sprays_egg_gunner' + | 'sprays_egg_hit' + | 'sprays_egg_hunt' + | 'sprays_egg_surprise' + | 'sprays_egg_time' + | 'sprays_enderman' + | 'sprays_faboolous' + | 'sprays_fake_vampire' + | 'sprays_family_photo_christmas' + | 'sprays_festive_harbinger' + | 'sprays_fireworks' + | 'sprays_flowers_for_you' + | 'sprays_found_u' + | 'sprays_garlic' + | 'sprays_gg_wp' + | 'sprays_ggwp_pumpkin' + | 'sprays_ghost' + | 'sprays_gingerbread_jerry' + | 'sprays_golden_egg' + | 'sprays_golem_picnic' + | 'sprays_golem_riding' + | 'sprays_good_fortune' + | 'sprays_gothic_jerry' + | 'sprays_great_egg_hunt' + | 'sprays_grudge' + | 'sprays_haunted_conscience' + | 'sprays_haunted_house' + | 'sprays_hypixel_logo' + | 'sprays_hypixel_logo_default' + | 'sprays_i_love_you' + | 'sprays_ice_scream_cart' + | 'sprays_invisibility_potion' + | 'sprays_jerry_island_poster' + | 'sprays_lantern' + | 'sprays_lazy_bunnies' + | 'sprays_lazy_spring' + | 'sprays_leaping_potion' + | 'sprays_lion_dancer' + | 'sprays_loot_chest' + | 'sprays_lucky_rabbit' + | 'sprays_menorah' + | 'sprays_mistletoe' + | 'sprays_mob_party' + | 'sprays_monster_under_bed' + | 'sprays_murder_mystery_poster' + | 'sprays_one_of_us' + | 'sprays_ouija' + | 'sprays_ox_costume' + | 'sprays_painted_dragon_egg' + | 'sprays_party_crasher' + | 'sprays_peaceful' + | 'sprays_perfect_sword_throw' + | 'sprays_pig_peace' + | 'sprays_pumpkin' + | 'sprays_pumpkin_farm' + | 'sprays_pumpkin_pals' + | 'sprays_pumpkinz' + | 'sprays_puppy_surprise' + | 'sprays_rabbit_celebration' + | 'sprays_rabbit_costume' + | 'sprays_rabbits_in_basket' + | 'sprays_rat_costume' + | 'sprays_rats_2020' + | 'sprays_reveillon' + | 'sprays_sabeetage' + | 'sprays_sand_castle' + | 'sprays_santa' + | 'sprays_santa_slips' + | 'sprays_scared' + | 'sprays_sea_bass' + | 'sprays_seasons_greetings' + | 'sprays_shiny' + | 'sprays_silent_night' + | 'sprays_skeleton_wave' + | 'sprays_sleep_well' + | 'sprays_sleeps_and_treats' + | 'sprays_sloth_burn' + | 'sprays_smug_pig' + | 'sprays_sniper_snowball' + | 'sprays_snow_angel' + | 'sprays_snow_jerry' + | 'sprays_snowball_fight' + | 'sprays_snowball_spammer' + | 'sprays_snowman_rampage' + | 'sprays_sorry' + | 'sprays_spooky_game_over' + | 'sprays_spooky_skelington' + | 'sprays_surfs_up' + | 'sprays_surprise_snowball' + | 'sprays_sweet_dreams' + | 'sprays_sweets' + | 'sprays_thanks' + | 'sprays_tnt_drop' + | 'sprays_trick_or_treat' + | 'sprays_turkey_day' + | 'sprays_ugly_bed_wars_sweater' + | 'sprays_undead_lifesaving_association' + | 'sprays_vampire_jerry' + | 'sprays_watcher' + | 'sprays_witch' + | 'sprays_witch_please' + | 'sprays_wrong_eggs' + | 'sprays_year_of_the_dog' + | 'sprays_year_of_the_dragon' + | 'sprays_year_of_the_ox' + | 'sprays_year_of_the_pig' + | 'sprays_year_of_the_rabbit' + | 'sprays_year_of_the_rat' + | 'sprays_year_of_the_snake' + | 'sprays_year_of_the_tiger'; +export type BedWarsVictoryDance = + | 'victorydance_abominable_snowman' + | 'victorydance_anvil_rain' + | 'victorydance_aura' + | 'victorydance_cake_walk' + | 'victorydance_chicken_rider' + | 'victorydance_chinese_dragon' + | 'victorydance_cold_snap' + | 'victorydance_dragon_fire' + | 'victorydance_dragon_rider' + | 'victorydance_dreamscape' + | 'victorydance_easter_bunnies' + | 'victorydance_egg_meteors' + | 'victorydance_elder_guardian_rider' + | 'victorydance_exploding_bunnies' + | 'victorydance_fanbase' + | 'victorydance_festive_music' + | 'victorydance_figurine_rain' + | 'victorydance_fireworks' + | 'victorydance_floating_lanterns' + | 'victorydance_flower_bed' + | 'victorydance_ghast_rider' + | 'victorydance_graveyardrave' + | 'victorydance_guardians' + | 'victorydance_haunted' + | 'victorydance_heat_wave' + | 'victorydance_hurricanehell' + | 'victorydance_infection' + | 'victorydance_kartaway' + | 'victorydance_meteor_shower' + | 'victorydance_night_shift' + | 'victorydance_portal' + | 'victorydance_pumpkin_bomber' + | 'victorydance_pumpkin_laser' + | 'victorydance_pumpkin_patch' + | 'victorydance_puppy_party' + | 'victorydance_rabbit_meteors' + | 'victorydance_rainbow_dolly' + | 'victorydance_raining_pigs' + | 'victorydance_rooted' + | 'victorydance_snow_bomber' + | 'victorydance_snowed_in' + | 'victorydance_special_fireworks' + | 'victorydance_terror' + | 'victorydance_to_build_a_snowman' + | 'victorydance_toy_stick' + | 'victorydance_twerk_apocalypse' + | 'victorydance_winter_twister' + | 'victorydance_wither_rider' + | 'victorydance_yeehaw'; +export type BedWarsWoodSkin = + | 'woodskin_acacia_log' + | 'woodskin_birch_log' + | 'woodskin_dark_oak_log' + | 'woodskin_jungle_log' + | 'woodskin_oak_log' + | 'woodskin_spruce_log'; +export type BedWarsStartingWeapon = 'starting_weapon_golden_sword' | 'starting_weapon_wooden_sword'; +export type BedWarsPackage = + | '5_percent_multiplier_tournament' + | 'capture_book_0' + | 'leaderboards_resync_mar_2021' + | 'tiered_achievement_flag_1' + | 'tiered_achievement_flag_2' + | 'tiered_achievement_flag_3' + | 'tiered_achievement_flag_4' + | 'v14_book' + | BedWarsBedDestroy + | BedWarsPackageChallenge + | BedWarsDeathCry + | BedWarsFavoriteMap + | BedwarsFigurine + | BedWarsGlyph + | BedWarsIslandTopper + | BedWarsKillEffect + | BedWarsKillMessage + | BedWarsNPCSkin + | BedWarsProjectileTrail + | BedWarsSpray + | BedWarsVictoryDance + | BedWarsWoodSkin + | BedWarsStartingWeapon; +export type PlayerGeneralSelectedCosmetic = 'random_cosmetic' | 'random_favorite_cosmetic'; +export type BedWarsPracticeModeId = 'BOW' | 'BRIDGING' | 'FIREBALL_JUMPING' | 'MLG' | 'PEARL_CLUTCHING'; +export type BedWarsPracticeBridgingRecordsDistances = '100' | '50' | '30'; +export type BedWarsPracticeBridgingRecordsElevations = 'NONE' | 'SLIGHT' | 'STAIRCASE'; diff --git a/src/Utils/Constants.ts b/src/Utils/Constants.ts index e53cbf8a7..ab783dc75 100644 --- a/src/Utils/Constants.ts +++ b/src/Utils/Constants.ts @@ -1,3 +1,4 @@ +import type { BedWarsPrestige, BuildBattleTitle, DuelsBaseDivision } from '../Types/Player.js'; import type { BestiaryMobsData, CustomPetLevelingData, @@ -6,7 +7,6 @@ import type { SkyBlockSlayer, SkyBlockXPTables } from '../Types/SkyBlock.js'; -import type { BuildBattleTitle, DuelsBaseDivision } from '../Types/Player.js'; import type { GameCode, GameID, GameString } from '../Types/Game.js'; export const games: { id: GameID; code: GameCode; name: GameString }[] = [ @@ -2474,3 +2474,57 @@ export const BuildBattleTitleRequirements: { title: BuildBattleTitle; requiremen { title: 'Divine', requirement: 400000 }, { title: 'Ascended', requirement: 500000 } ]; + +export const BedWarsPrestiges: { prestige: BedWarsPrestige; requirement: number }[] = [ + { prestige: 'Stone', requirement: 0 }, + { prestige: 'Iron', requirement: 100 }, + { prestige: 'Gold', requirement: 200 }, + { prestige: 'Diamond', requirement: 300 }, + { prestige: 'Emerald', requirement: 400 }, + { prestige: 'Sapphire', requirement: 500 }, + { prestige: 'Ruby', requirement: 600 }, + { prestige: 'Crystal', requirement: 700 }, + { prestige: 'Opal', requirement: 800 }, + { prestige: 'Amethyst', requirement: 900 }, + { prestige: 'Rainbow', requirement: 1000 }, + { prestige: 'Iron', requirement: 1100 }, + { prestige: 'Gold', requirement: 1200 }, + { prestige: 'Diamond', requirement: 1300 }, + { prestige: 'Emerald', requirement: 1400 }, + { prestige: 'Sapphire', requirement: 1500 }, + { prestige: 'Ruby', requirement: 1600 }, + { prestige: 'Crystal', requirement: 1700 }, + { prestige: 'Opal', requirement: 1800 }, + { prestige: 'Amethyst', requirement: 1900 }, + { prestige: 'Mirror', requirement: 2000 }, + { prestige: 'Light', requirement: 2100 }, + { prestige: 'Dawn', requirement: 2200 }, + { prestige: 'Dusk', requirement: 2300 }, + { prestige: 'Air', requirement: 2400 }, + { prestige: 'Wind', requirement: 2500 }, + { prestige: 'Nebula', requirement: 2600 }, + { prestige: 'Thunder', requirement: 2700 }, + { prestige: 'Earth', requirement: 2800 }, + { prestige: 'Water', requirement: 2900 }, + { prestige: 'Fire', requirement: 3000 }, + { prestige: 'Sunrise', requirement: 3100 }, + { prestige: 'Eclipse', requirement: 3200 }, + { prestige: 'Gamma', requirement: 3300 }, + { prestige: 'Majestic', requirement: 3400 }, + { prestige: 'Andesine', requirement: 3500 }, + { prestige: 'Marine', requirement: 3600 }, + { prestige: 'Element', requirement: 3700 }, + { prestige: 'Galaxy', requirement: 3800 }, + { prestige: 'Atomic', requirement: 3900 }, + { prestige: 'Sunset', requirement: 4000 }, + { prestige: 'Time', requirement: 4100 }, + { prestige: 'Winter', requirement: 4200 }, + { prestige: 'Obsidian', requirement: 4300 }, + { prestige: 'Spring', requirement: 4400 }, + { prestige: 'Ice', requirement: 4500 }, + { prestige: 'Summer', requirement: 4600 }, + { prestige: 'Spinel', requirement: 4700 }, + { prestige: 'Autumn', requirement: 4800 }, + { prestige: 'Mystic', requirement: 4900 }, + { prestige: 'Eternal', requirement: 5000 } +]; diff --git a/src/Utils/ParseBedWarsMode.ts b/src/Utils/ParseBedWarsMode.ts new file mode 100644 index 000000000..4f0ceb938 --- /dev/null +++ b/src/Utils/ParseBedWarsMode.ts @@ -0,0 +1,3 @@ +export default function ParseBedWarsMode(mode?: string): string { + return mode && mode.trim() !== '' ? `${mode.replace(/_$/, '')}_` : ''; +} diff --git a/src/index.ts b/src/index.ts index 78e35247e..34080c9c3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -34,18 +34,42 @@ import ArenaBrawlMode from './Structures/MiniGames/ArenaBrawl/ArenaBrawlMode.js' import BaseAchievement from './Structures/Static/Achievements/BaseAchievement.js'; import BedWars from './Structures/MiniGames/BedWars/BedWars.js'; import BedWarsBeds from './Structures/MiniGames/BedWars/BedWarsBeds.js'; -import BedWarsCollectedItems from './Structures/MiniGames/BedWars/BedWarsCollectedItems.js'; -import BedWarsDreamMode from './Structures/MiniGames/BedWars/BedWarsDreamMode.js'; -import BedWarsDreamStats from './Structures/MiniGames/BedWars/BedWarsDreamStats.js'; +import BedWarsBoxes from './Structures/MiniGames/BedWars/BedWarsBoxes.js'; +import BedWarsChallenge from './Structures/MiniGames/BedWars/BedWarsChallenges/BedWarsChallenge.js'; +import BedWarsChallenges from './Structures/MiniGames/BedWars/BedWarsChallenges/BedWarsChallenges.js'; +import BedWarsEightOne from './Structures/MiniGames/BedWars/BedWarsEightOne.js'; +import BedWarsEightTwo from './Structures/MiniGames/BedWars/BedWarsEightTwo.js'; +import BedWarsFavorites from './Structures/MiniGames/BedWars/BedWarsFavorites.js'; +import BedWarsFigurines from './Structures/MiniGames/BedWars/BedWarsFigurines.js'; +import BedWarsFourFour from './Structures/MiniGames/BedWars/BedWarsFourFour.js'; +import BedWarsFourThree from './Structures/MiniGames/BedWars/BedWarsFourThree.js'; +import BedWarsItemsPurchased from './Structures/MiniGames/BedWars/BedWarsItemsPurchased.js'; +import BedWarsKillsDeaths from './Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeaths.js'; +import BedWarsKillsDeathsType from './Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeathsType.js'; import BedWarsMode from './Structures/MiniGames/BedWars/BedWarsMode.js'; -import BedWarsPracticeBase from './Structures/MiniGames/BedWars/Practice/BedWarsPracticeBase.js'; -import BedWarsPracticeBaseBlocksPlaced from './Structures/MiniGames/BedWars/Practice/BedWarsPracticeBaseBlocksPlaced.js'; -import BedWarsPracticeBridging from './Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridging.js'; -import BedWarsPracticeBridgingRecords from './Structures/MiniGames/BedWars/Practice/BedWarsPracticeBridgingRecords.js'; -import BedWarsPracticeModeAttempts from './Structures/MiniGames/BedWars/Practice/BedWarsPracticeModeAttempts.js'; -import BedWarsPracticeRecord from './Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecord.js'; -import BedWarsPracticeRecordElevation from './Structures/MiniGames/BedWars/Practice/BedWarsPracticeRecordElevation.js'; -import BedWarsPracticeStats from './Structures/MiniGames/BedWars/Practice/BedWarsPracticeStats.js'; +import BedWarsPractice from './Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPractice.js'; +import BedWarsPracticeBridging from './Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridging.js'; +import BedWarsPracticeBridgingRecords from './Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecords.js'; +import BedWarsPracticeBridgingRecordsDistance from './Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecordsDistance.js'; +import BedWarsPracticeBridgingRecordsEevation from './Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeBridgingRecords/BedWarsPracticeBridgingRecordsEevation.js'; +import BedWarsPracticeMode from './Structures/MiniGames/BedWars/BedWarsPractice/BedWarsPracticeMode.js'; +import BedWarsPrivateGameSettings from './Structures/MiniGames/BedWars/BedWarsPrivateGameSettings.js'; +import BedWarsResourcesCollected from './Structures/MiniGames/BedWars/BedWarsResourcesCollected.js'; +import BedWarsSettings from './Structures/MiniGames/BedWars/BedWarsSettings.js'; +import BedWarsSlumber from './Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumber.js'; +import BedWarsSlumberMinion from './Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberMinion.js'; +import BedWarsSlumberPhase from './Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberPhase.js'; +import BedWarsSlumberPhaseThree from './Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberPhaseThree.js'; +import BedWarsSlumberQuest from './Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuest.js'; +import BedWarsSlumberQuestGamblerGeorge from './Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestGamblerGeorge.js'; +import BedWarsSlumberQuestItem from './Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestItem.js'; +import BedWarsSlumberQuestNPC from './Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPC.js'; +import BedWarsSlumberQuestNPCSBoolean from './Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPCSBoolean.js'; +import BedWarsSlumberQuestNPCSNumber from './Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestNPCSNumber.js'; +import BedWarsSlumberQuestObjective from './Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberQuest/BedWarsSlumberQuestObjective.js'; +import BedWarsSlumberRoom from './Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberRoom.js'; +import BedWarsSlumberSandman from './Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberSandman.js'; +import BedWarsTwoFour from './Structures/MiniGames/BedWars/BedWarsTwoFour.js'; import BlitzSurvivalGames from './Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.js'; import BlitzSurvivalGamesKit from './Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesKit.js'; import BlockingDead from './Structures/MiniGames/Arcade/BlockingDead.js'; @@ -366,18 +390,42 @@ export { BaseAchievement, BedWars, BedWarsBeds, - BedWarsCollectedItems, - BedWarsDreamMode, - BedWarsDreamStats, + BedWarsBoxes, + BedWarsChallenge, + BedWarsChallenges, + BedWarsEightOne, + BedWarsEightTwo, + BedWarsFavorites, + BedWarsFigurines, + BedWarsFourFour, + BedWarsFourThree, + BedWarsItemsPurchased, + BedWarsKillsDeaths, + BedWarsKillsDeathsType, BedWarsMode, - BedWarsPracticeBase, - BedWarsPracticeBaseBlocksPlaced, + BedWarsPractice, BedWarsPracticeBridging, BedWarsPracticeBridgingRecords, - BedWarsPracticeModeAttempts, - BedWarsPracticeRecord, - BedWarsPracticeRecordElevation, - BedWarsPracticeStats, + BedWarsPracticeBridgingRecordsDistance, + BedWarsPracticeBridgingRecordsEevation, + BedWarsPracticeMode, + BedWarsPrivateGameSettings, + BedWarsResourcesCollected, + BedWarsSettings, + BedWarsSlumber, + BedWarsSlumberMinion, + BedWarsSlumberPhase, + BedWarsSlumberPhaseThree, + BedWarsSlumberQuest, + BedWarsSlumberQuestGamblerGeorge, + BedWarsSlumberQuestItem, + BedWarsSlumberQuestNPC, + BedWarsSlumberQuestNPCSBoolean, + BedWarsSlumberQuestNPCSNumber, + BedWarsSlumberQuestObjective, + BedWarsSlumberRoom, + BedWarsSlumberSandman, + BedWarsTwoFour, BlitzSurvivalGames, BlitzSurvivalGamesKit, BlockingDead, @@ -699,18 +747,42 @@ export default { BaseAchievement, BedWars, BedWarsBeds, - BedWarsCollectedItems, - BedWarsDreamMode, - BedWarsDreamStats, + BedWarsBoxes, + BedWarsChallenge, + BedWarsChallenges, + BedWarsEightOne, + BedWarsEightTwo, + BedWarsFavorites, + BedWarsFigurines, + BedWarsFourFour, + BedWarsFourThree, + BedWarsItemsPurchased, + BedWarsKillsDeaths, + BedWarsKillsDeathsType, BedWarsMode, - BedWarsPracticeBase, - BedWarsPracticeBaseBlocksPlaced, + BedWarsPractice, BedWarsPracticeBridging, BedWarsPracticeBridgingRecords, - BedWarsPracticeModeAttempts, - BedWarsPracticeRecord, - BedWarsPracticeRecordElevation, - BedWarsPracticeStats, + BedWarsPracticeBridgingRecordsDistance, + BedWarsPracticeBridgingRecordsEevation, + BedWarsPracticeMode, + BedWarsPrivateGameSettings, + BedWarsResourcesCollected, + BedWarsSettings, + BedWarsSlumber, + BedWarsSlumberMinion, + BedWarsSlumberPhase, + BedWarsSlumberPhaseThree, + BedWarsSlumberQuest, + BedWarsSlumberQuestGamblerGeorge, + BedWarsSlumberQuestItem, + BedWarsSlumberQuestNPC, + BedWarsSlumberQuestNPCSBoolean, + BedWarsSlumberQuestNPCSNumber, + BedWarsSlumberQuestObjective, + BedWarsSlumberRoom, + BedWarsSlumberSandman, + BedWarsTwoFour, BlitzSurvivalGames, BlitzSurvivalGamesKit, BlockingDead, From 84254d30f5edd8ed001631cdfd58b3be8d60d53c Mon Sep 17 00:00:00 2001 From: Jacob Date: Sun, 23 Nov 2025 15:54:18 +0800 Subject: [PATCH 089/124] fix(imports) Signed-off-by: Jacob --- src/API/getActiveHouses.ts | 2 +- src/API/getBoosters.ts | 2 +- src/API/getGuild.test.ts | 2 +- src/API/getGuild.ts | 2 +- src/API/getHouse.test.ts | 2 +- src/API/getHouse.ts | 2 +- src/API/getLeaderboards.test.ts | 2 +- src/API/getLeaderboards.ts | 4 +- src/API/getPlayer.ts | 2 +- src/API/getPlayerHouses.ts | 4 +- src/API/getRecentGames.test.ts | 2 +- src/API/getRecentGames.ts | 4 +- src/API/getSkyBlockAuction.test.ts | 2 +- src/API/getSkyBlockAuction.ts | 2 +- src/API/getSkyBlockAuctions.test.ts | 2 +- src/API/getSkyBlockAuctions.ts | 2 +- src/API/getSkyBlockFireSales.ts | 2 +- src/API/getSkyBlockGarden.test.ts | 2 +- src/API/getSkyBlockGarden.ts | 2 +- src/API/getSkyBlockItems.ts | 2 +- src/API/getSkyBlockMuseum.test.ts | 2 +- src/API/getSkyBlockMuseum.ts | 2 +- src/API/getSkyBlockProfile.test.ts | 2 +- src/API/getSkyBlockProfile.ts | 2 +- src/API/getSkyBlockProfiles.test.ts | 2 +- src/API/getSkyBlockProfiles.ts | 2 +- src/Client.ts | 2 +- src/Private/Endpoint.test.ts | 2 +- src/Private/Endpoint.ts | 2 +- src/Private/RateLimit.test.ts | 2 +- src/Private/RateLimit.ts | 2 +- src/Private/RequestHandler.test.ts | 2 +- src/Private/RequestHandler.ts | 2 +- src/Private/Updater.test.ts | 2 +- src/Private/Updater.ts | 2 +- src/Structures/Boosters/Booster.ts | 2 +- src/Structures/GameCounts.ts | 2 +- src/Structures/Guild/Guild.ts | 2 +- src/Structures/House.ts | 2 +- src/Structures/MiniGames/Arcade/Arcade.ts | 56 +++++++++---------- .../MiniGames/Arcade/Dropper/Dropper.ts | 2 +- .../MiniGames/Arcade/EnderSpleef.ts | 2 +- src/Structures/MiniGames/Arcade/GalaxyWars.ts | 2 +- .../MiniGames/Arcade/HoleInTheWall.ts | 2 +- .../MiniGames/Arcade/PartyGames/LawnMoower.ts | 2 +- .../MiniGames/Arcade/PartyGames/PartyGames.ts | 6 +- .../Arcade/PartyGames/PartyGamesGame.ts | 2 +- .../MiniGames/Arcade/PartyGames/RPG16.ts | 2 +- src/Structures/MiniGames/Arcade/ThrowOut.ts | 2 +- .../MiniGames/Arcade/Zombies/ZombiesMap.ts | 2 +- .../MiniGames/BuildBattle/BuildBattle.ts | 10 ++-- .../MiniGames/MurderMystery/MurderMystery.ts | 10 ++-- .../MurderMystery/MurderMysteryDescent.ts | 2 +- .../MurderMystery/MurderMysteryFavorites.ts | 2 +- .../MurderMystery/MurderMysteryGamemode.ts | 2 +- .../MurderMysteryKnifeSkinPrestige.ts | 4 +- .../MurderMystery/MurderMysteryMap.ts | 4 +- .../MiniGames/Shared/Emblem/Emblem.test.ts | 2 +- .../MiniGames/Shared/Emblem/Emblem.ts | 4 +- .../MiniGames/Shared/LeaderboardSettings.ts | 2 +- src/Structures/Player/Player.ts | 2 +- .../PlayerAchievementsTotem.ts | 2 +- src/Structures/RecentGame.ts | 2 +- .../SkyBlock/Bazaar/SkyBlockBazaar.ts | 2 +- .../SkyBlock/Bingo/SkyBlockBingo.ts | 2 +- .../Collections/SkyBlockCollections.ts | 2 +- .../SkyBlock/Election/SkyBlockElectionData.ts | 2 +- .../SkyBlock/FireSale/SkyBlockFireSale.ts | 2 +- .../SkyBlock/Garden/SkyBlockGarden.ts | 2 +- .../CrimsonIsle/SkyBlockMemberCrimsonIsle.ts | 2 +- .../SkyBlockMemberCrimsonIsleTrophyFish.ts | 6 +- ...yBlockMemberCrimsonIsleTrophyFishCaught.ts | 6 +- .../SkyBlock/Museum/SkyBlockMuseum.ts | 2 +- src/Structures/SkyBlock/News/SkyBlockNews.ts | 2 +- .../SkyBlock/Profile/SkyBlockProfile.ts | 2 +- .../SkyBlock/Skills/SkyBlockSkills.ts | 2 +- src/Structures/SkyBlock/SkyBlockItem.ts | 2 +- .../Static/Achievements/Achievements.ts | 2 +- .../Static/Achievements/GuildAchievements.ts | 2 +- src/Structures/Static/Challenges.ts | 2 +- src/Structures/Static/Quests.ts | 2 +- src/Structures/Status.ts | 2 +- src/Structures/WatchdogStats.ts | 2 +- src/Types/API.ts | 4 +- src/Types/SkyBlock.ts | 6 +- src/Utils/ParseBoosterType.ts | 2 +- src/Utils/SkyBlockUtils.ts | 2 +- src/index.ts | 1 + 88 files changed, 138 insertions(+), 137 deletions(-) diff --git a/src/API/getActiveHouses.ts b/src/API/getActiveHouses.ts index 45f896be6..503cea5f5 100644 --- a/src/API/getActiveHouses.ts +++ b/src/API/getActiveHouses.ts @@ -2,7 +2,7 @@ import Endpoint from '../Private/Endpoint.js'; import House from '../Structures/House.js'; import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; -import type { WithRaw } from '../Types/API.ts'; +import type { WithRaw } from '../Types/API.js'; class getActiveHouses extends Endpoint { override async execute(options?: RequestOptions): Promise | RequestData> { diff --git a/src/API/getBoosters.ts b/src/API/getBoosters.ts index d48e5121b..64ddb84e9 100644 --- a/src/API/getBoosters.ts +++ b/src/API/getBoosters.ts @@ -2,7 +2,7 @@ import Booster from '../Structures/Boosters/Booster.js'; import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; -import type { WithRaw } from '../Types/API.ts'; +import type { WithRaw } from '../Types/API.js'; class getBoosters extends Endpoint { override async execute(options?: RequestOptions): Promise | RequestData> { diff --git a/src/API/getGuild.test.ts b/src/API/getGuild.test.ts index 8b9bb99e5..bc3a3d5f3 100644 --- a/src/API/getGuild.test.ts +++ b/src/API/getGuild.test.ts @@ -1,6 +1,6 @@ import Client from '../Client.js'; import Color from '../Structures/Color.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import Game from '../Structures/Game.js'; import Guild from '../Structures/Guild/Guild.js'; import GuildMember from '../Structures/Guild/GuildMember.js'; diff --git a/src/API/getGuild.ts b/src/API/getGuild.ts index b12aa9068..5deab5c1c 100644 --- a/src/API/getGuild.ts +++ b/src/API/getGuild.ts @@ -1,5 +1,5 @@ import Endpoint from '../Private/Endpoint.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import Guild from '../Structures/Guild/Guild.js'; import RequestData from '../Private/RequestData.js'; import type { GuildFetchOptions } from '../Types/API.js'; diff --git a/src/API/getHouse.test.ts b/src/API/getHouse.test.ts index f3b0d5d29..7cf525baa 100644 --- a/src/API/getHouse.test.ts +++ b/src/API/getHouse.test.ts @@ -1,5 +1,5 @@ import Client from '../Client.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import House from '../Structures/House.js'; import RequestData from '../Private/RequestData.js'; import { expect, expectTypeOf, test } from 'vitest'; diff --git a/src/API/getHouse.ts b/src/API/getHouse.ts index 1a4d42ef4..518717fda 100644 --- a/src/API/getHouse.ts +++ b/src/API/getHouse.ts @@ -1,5 +1,5 @@ import Endpoint from '../Private/Endpoint.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import House from '../Structures/House.js'; import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; diff --git a/src/API/getLeaderboards.test.ts b/src/API/getLeaderboards.test.ts index 6966fa08b..34050ccb7 100644 --- a/src/API/getLeaderboards.test.ts +++ b/src/API/getLeaderboards.test.ts @@ -1,5 +1,5 @@ import Client from '../Client.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import Leaderboard from '../Structures/Leaderboard.js'; import RequestData from '../Private/RequestData.js'; import { defaultRequestData } from '../../vitest.setup.js'; diff --git a/src/API/getLeaderboards.ts b/src/API/getLeaderboards.ts index cd4bb2924..db88afa70 100644 --- a/src/API/getLeaderboards.ts +++ b/src/API/getLeaderboards.ts @@ -1,9 +1,9 @@ import Endpoint from '../Private/Endpoint.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import Leaderboard from '../Structures/Leaderboard.js'; import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; -import type { WithRaw } from '../Types/API.ts'; +import type { WithRaw } from '../Types/API.js'; class getLeaderboards extends Endpoint { override async execute(options?: RequestOptions): Promise> | RequestData> { diff --git a/src/API/getPlayer.ts b/src/API/getPlayer.ts index 35db54845..35409a1cb 100644 --- a/src/API/getPlayer.ts +++ b/src/API/getPlayer.ts @@ -1,5 +1,5 @@ import Endpoint from '../Private/Endpoint.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import Guild from '../Structures/Guild/Guild.js'; import House from '../Structures/House.js'; import Player from '../Structures/Player/Player.js'; diff --git a/src/API/getPlayerHouses.ts b/src/API/getPlayerHouses.ts index 7d66bf971..a6cdedfd5 100644 --- a/src/API/getPlayerHouses.ts +++ b/src/API/getPlayerHouses.ts @@ -1,9 +1,9 @@ import Endpoint from '../Private/Endpoint.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import House from '../Structures/House.js'; import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; -import type { WithRaw } from '../Types/API.ts'; +import type { WithRaw } from '../Types/API.js'; class getPlayerHouses extends Endpoint { override async execute(query: string, options?: RequestOptions): Promise | RequestData> { diff --git a/src/API/getRecentGames.test.ts b/src/API/getRecentGames.test.ts index 95448ecfa..704705cca 100644 --- a/src/API/getRecentGames.test.ts +++ b/src/API/getRecentGames.test.ts @@ -1,5 +1,5 @@ import Client from '../Client.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import Game from '../Structures/Game.js'; import RecentGame from '../Structures/RecentGame.js'; import RequestData from '../Private/RequestData.js'; diff --git a/src/API/getRecentGames.ts b/src/API/getRecentGames.ts index 0d30b0995..a813fecae 100644 --- a/src/API/getRecentGames.ts +++ b/src/API/getRecentGames.ts @@ -1,9 +1,9 @@ import Endpoint from '../Private/Endpoint.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import RecentGame from '../Structures/RecentGame.js'; import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; -import type { WithRaw } from '../Types/API.ts'; +import type { WithRaw } from '../Types/API.js'; class getRecentGames extends Endpoint { override async execute(query: string, options?: RequestOptions): Promise | RequestData> { diff --git a/src/API/getSkyBlockAuction.test.ts b/src/API/getSkyBlockAuction.test.ts index 1987ea88c..98edf5581 100644 --- a/src/API/getSkyBlockAuction.test.ts +++ b/src/API/getSkyBlockAuction.test.ts @@ -1,5 +1,5 @@ import Client from '../Client.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockAuction from '../Structures/SkyBlock/Auctions/SkyBlockAuction.js'; import SkyBlockBaseAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.js'; diff --git a/src/API/getSkyBlockAuction.ts b/src/API/getSkyBlockAuction.ts index f992e3ec3..0daebe64a 100644 --- a/src/API/getSkyBlockAuction.ts +++ b/src/API/getSkyBlockAuction.ts @@ -1,5 +1,5 @@ import Endpoint from '../Private/Endpoint.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockAuction from '../Structures/SkyBlock/Auctions/SkyBlockAuction.js'; import SkyBlockBaseAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.js'; diff --git a/src/API/getSkyBlockAuctions.test.ts b/src/API/getSkyBlockAuctions.test.ts index 65c826654..71315c571 100644 --- a/src/API/getSkyBlockAuctions.test.ts +++ b/src/API/getSkyBlockAuctions.test.ts @@ -1,5 +1,5 @@ import Client from '../Client.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockAuction from '../Structures/SkyBlock/Auctions/SkyBlockAuction.js'; import { expect, expectTypeOf, test } from 'vitest'; diff --git a/src/API/getSkyBlockAuctions.ts b/src/API/getSkyBlockAuctions.ts index 6fff864c0..93042bdf3 100644 --- a/src/API/getSkyBlockAuctions.ts +++ b/src/API/getSkyBlockAuctions.ts @@ -1,5 +1,5 @@ import Endpoint from '../Private/Endpoint.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import SkyBlockAuction from '../Structures/SkyBlock/Auctions/SkyBlockAuction.js'; import SkyBlockAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockAuctionInfo.js'; import type RequestData from '../Private/RequestData.js'; diff --git a/src/API/getSkyBlockFireSales.ts b/src/API/getSkyBlockFireSales.ts index 9e2d58f0f..675c808e2 100644 --- a/src/API/getSkyBlockFireSales.ts +++ b/src/API/getSkyBlockFireSales.ts @@ -2,7 +2,7 @@ import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockFireSale from '../Structures/SkyBlock/FireSale/SkyBlockFireSale.js'; import type { RequestOptions } from '../Types/Requests.js'; -import type { WithRaw } from '../Types/API.ts'; +import type { WithRaw } from '../Types/API.js'; class getSkyBlockSkyBlockFireSales extends Endpoint { override async execute(options?: RequestOptions): Promise | RequestData> { diff --git a/src/API/getSkyBlockGarden.test.ts b/src/API/getSkyBlockGarden.test.ts index f07a246f0..5c10cc16c 100644 --- a/src/API/getSkyBlockGarden.test.ts +++ b/src/API/getSkyBlockGarden.test.ts @@ -1,5 +1,5 @@ import Client from '../Client.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockGarden from '../Structures/SkyBlock/Garden/SkyBlockGarden.js'; import SkyBlockGardenActiveVisitor from '../Structures/SkyBlock/Garden/SkyBlockGardenActiveVisitor.js'; diff --git a/src/API/getSkyBlockGarden.ts b/src/API/getSkyBlockGarden.ts index 9388e4bb8..99d154b6c 100644 --- a/src/API/getSkyBlockGarden.ts +++ b/src/API/getSkyBlockGarden.ts @@ -1,5 +1,5 @@ import Endpoint from '../Private/Endpoint.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockGarden from '../Structures/SkyBlock/Garden/SkyBlockGarden.js'; import type { RequestOptions } from '../Types/Requests.js'; diff --git a/src/API/getSkyBlockItems.ts b/src/API/getSkyBlockItems.ts index 21bbba61e..30ba15361 100644 --- a/src/API/getSkyBlockItems.ts +++ b/src/API/getSkyBlockItems.ts @@ -2,7 +2,7 @@ import Endpoint from '../Private/Endpoint.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockItem from '../Structures/SkyBlock/SkyBlockItem.js'; import type { RequestOptions } from '../Types/Requests.js'; -import type { WithRaw } from '../Types/API.ts'; +import type { WithRaw } from '../Types/API.js'; class getSkyBlockItems extends Endpoint { override async execute(options?: RequestOptions): Promise | RequestData> { diff --git a/src/API/getSkyBlockMuseum.test.ts b/src/API/getSkyBlockMuseum.test.ts index 6301958a5..d54dab5fd 100644 --- a/src/API/getSkyBlockMuseum.test.ts +++ b/src/API/getSkyBlockMuseum.test.ts @@ -1,5 +1,5 @@ import Client from '../Client.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockMuseum from '../Structures/SkyBlock/Museum/SkyBlockMuseum.js'; import SkyBlockMuseumMember from '../Structures/SkyBlock/Museum/SkyBlockMuseumMember.js'; diff --git a/src/API/getSkyBlockMuseum.ts b/src/API/getSkyBlockMuseum.ts index 4d38d2bf7..6c2f329d0 100644 --- a/src/API/getSkyBlockMuseum.ts +++ b/src/API/getSkyBlockMuseum.ts @@ -1,5 +1,5 @@ import Endpoint from '../Private/Endpoint.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockMuseum from '../Structures/SkyBlock/Museum/SkyBlockMuseum.js'; import type { RequestOptions } from '../Types/Requests.js'; diff --git a/src/API/getSkyBlockProfile.test.ts b/src/API/getSkyBlockProfile.test.ts index 48c28dad3..c5df80acc 100644 --- a/src/API/getSkyBlockProfile.test.ts +++ b/src/API/getSkyBlockProfile.test.ts @@ -1,6 +1,6 @@ /* eslint-disable @stylistic/max-len */ import Client from '../Client.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockGarden from '../Structures/SkyBlock/Garden/SkyBlockGarden.js'; import SkyBlockMember from '../Structures/SkyBlock/Member/SkyBlockMember.js'; diff --git a/src/API/getSkyBlockProfile.ts b/src/API/getSkyBlockProfile.ts index cc3bb4c0e..e4ceb5ec1 100644 --- a/src/API/getSkyBlockProfile.ts +++ b/src/API/getSkyBlockProfile.ts @@ -1,5 +1,5 @@ import Endpoint from '../Private/Endpoint.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockGarden from '../Structures/SkyBlock/Garden/SkyBlockGarden.js'; import SkyBlockProfile from '../Structures/SkyBlock/Profile/SkyBlockProfile.js'; diff --git a/src/API/getSkyBlockProfiles.test.ts b/src/API/getSkyBlockProfiles.test.ts index 80fe84edd..1356a243f 100644 --- a/src/API/getSkyBlockProfiles.test.ts +++ b/src/API/getSkyBlockProfiles.test.ts @@ -1,6 +1,6 @@ /* eslint-disable @stylistic/max-len */ import Client from '../Client.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockGarden from '../Structures/SkyBlock/Garden/SkyBlockGarden.js'; import SkyBlockMember from '../Structures/SkyBlock/Member/SkyBlockMember.js'; diff --git a/src/API/getSkyBlockProfiles.ts b/src/API/getSkyBlockProfiles.ts index 72f228b60..d0a5a6930 100644 --- a/src/API/getSkyBlockProfiles.ts +++ b/src/API/getSkyBlockProfiles.ts @@ -1,5 +1,5 @@ import Endpoint from '../Private/Endpoint.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import RequestData from '../Private/RequestData.js'; import SkyBlockGarden from '../Structures/SkyBlock/Garden/SkyBlockGarden.js'; import SkyBlockProfile from '../Structures/SkyBlock/Profile/SkyBlockProfile.js'; diff --git a/src/Client.ts b/src/Client.ts index 104823fb4..5ee260b03 100644 --- a/src/Client.ts +++ b/src/Client.ts @@ -43,7 +43,7 @@ import type { } from './Types/API.js'; import type { ClientOptions } from './Types/Client.js'; import type { RequestOptions } from './Types/Requests.js'; -import type { SkyBlockProfileName } from './Types/SkyBlock.ts'; +import type { SkyBlockProfileName } from './Types/SkyBlock.js'; const clients: Client[] = []; diff --git a/src/Private/Endpoint.test.ts b/src/Private/Endpoint.test.ts index 51ddd217a..c2252c504 100644 --- a/src/Private/Endpoint.test.ts +++ b/src/Private/Endpoint.test.ts @@ -1,6 +1,6 @@ import Client from '../Client.js'; import Endpoint from './Endpoint.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import { expect, expectTypeOf, test } from 'vitest'; test('Endpoint', () => { diff --git a/src/Private/Endpoint.ts b/src/Private/Endpoint.ts index e15066ec8..7292a7575 100644 --- a/src/Private/Endpoint.ts +++ b/src/Private/Endpoint.ts @@ -1,5 +1,5 @@ import Client from '../Client.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; class Endpoint { readonly client: Client; diff --git a/src/Private/RateLimit.test.ts b/src/Private/RateLimit.test.ts index a57dc4e45..349a278e7 100644 --- a/src/Private/RateLimit.test.ts +++ b/src/Private/RateLimit.test.ts @@ -1,5 +1,5 @@ import Client from '../Client.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import RateLimit from './RateLimit.js'; import { defaultRequestData } from '../../vitest.setup.js'; import { expect, expectTypeOf, test, vi } from 'vitest'; diff --git a/src/Private/RateLimit.ts b/src/Private/RateLimit.ts index 0cc404c2e..86fd39740 100644 --- a/src/Private/RateLimit.ts +++ b/src/Private/RateLimit.ts @@ -1,5 +1,5 @@ import Client from '../Client.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; class RateLimit { readonly client: Client; diff --git a/src/Private/RequestHandler.test.ts b/src/Private/RequestHandler.test.ts index a48840b0a..6f3c722e0 100644 --- a/src/Private/RequestHandler.test.ts +++ b/src/Private/RequestHandler.test.ts @@ -1,5 +1,5 @@ import Client from '../Client.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import RequestHandler from './RequestHandler.js'; import { defaultRequestData } from '../../vitest.setup.js'; import { expect, expectTypeOf, test, vi } from 'vitest'; diff --git a/src/Private/RequestHandler.ts b/src/Private/RequestHandler.ts index 76bb2b09c..ef7558925 100644 --- a/src/Private/RequestHandler.ts +++ b/src/Private/RequestHandler.ts @@ -1,5 +1,5 @@ import Client from '../Client.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import RequestData from './RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; diff --git a/src/Private/Updater.test.ts b/src/Private/Updater.test.ts index 8324aaa11..21f17a7b4 100644 --- a/src/Private/Updater.test.ts +++ b/src/Private/Updater.test.ts @@ -1,5 +1,5 @@ import Client from '../Client.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import Updater from './Updater.js'; import packageJSON from '../../package.json' with { type: 'json' }; import { defaultRequestData } from '../../vitest.setup.js'; diff --git a/src/Private/Updater.ts b/src/Private/Updater.ts index 68d54e8da..1e4cb00b1 100644 --- a/src/Private/Updater.ts +++ b/src/Private/Updater.ts @@ -1,5 +1,5 @@ import Client from '../Client.js'; -import Errors from '../Errors.ts'; +import Errors from '../Errors.js'; import packageJson from '../../package.json' with { type: 'json' }; class Updater { diff --git a/src/Structures/Boosters/Booster.ts b/src/Structures/Boosters/Booster.ts index 387b6c234..5406a89e0 100644 --- a/src/Structures/Boosters/Booster.ts +++ b/src/Structures/Boosters/Booster.ts @@ -1,5 +1,5 @@ import Game from '../Game.js'; -import type RequestData from '../../Private/RequestData.ts'; +import type RequestData from '../../Private/RequestData.js'; import type { BoosterType } from '../../Types/Booster.js'; export function parseType(data: Record): BoosterType { diff --git a/src/Structures/GameCounts.ts b/src/Structures/GameCounts.ts index 6a85b472b..59f180b4c 100644 --- a/src/Structures/GameCounts.ts +++ b/src/Structures/GameCounts.ts @@ -1,6 +1,6 @@ import { MiniGamesString } from '../Utils/Constants.js'; import { RemoveSnakeCaseString, recursive } from '../Utils/RemoveSnakeCase.js'; -import type RequestData from '../Private/RequestData.ts'; +import type RequestData from '../Private/RequestData.js'; class GameCounts { playerCount: number; diff --git a/src/Structures/Guild/Guild.ts b/src/Structures/Guild/Guild.ts index da511e8e2..100269f53 100644 --- a/src/Structures/Guild/Guild.ts +++ b/src/Structures/Guild/Guild.ts @@ -3,7 +3,7 @@ import Game from '../Game.js'; import GuildMember from './GuildMember.js'; import GuildRank from './GuildRank.js'; import { calculateExpHistory, getGuildLevel, members, ranks, totalWeeklyGEXP } from '../../Utils/Guild.js'; -import type RequestData from '../../Private/RequestData.ts'; +import type RequestData from '../../Private/RequestData.js'; import type { ExpHistory } from '../../Types/Guild.js'; class Guild { diff --git a/src/Structures/House.ts b/src/Structures/House.ts index 3af8f7e33..f443afdb8 100644 --- a/src/Structures/House.ts +++ b/src/Structures/House.ts @@ -1,4 +1,4 @@ -import type RequestData from '../Private/RequestData.ts'; +import type RequestData from '../Private/RequestData.js'; import type { UUID } from '../Types/Global.js'; class House { diff --git a/src/Structures/MiniGames/Arcade/Arcade.ts b/src/Structures/MiniGames/Arcade/Arcade.ts index 3ec26790d..05a833339 100644 --- a/src/Structures/MiniGames/Arcade/Arcade.ts +++ b/src/Structures/MiniGames/Arcade/Arcade.ts @@ -1,31 +1,31 @@ -import ArcadeOptions from './ArcadeOptions.ts'; -import BlockingDead from './BlockingDead.ts'; -import DragonWars from './DragonWars.ts'; -import DrawTheirThing from './DrawTheirThing.ts'; -import Dropper from './Dropper/Dropper.ts'; -import Dtt from './Dtt.ts'; -import EasterSimulator from './EasterSimulator.ts'; -import EnderSpleef from './EnderSpleef.ts'; -import FarmHunt from './FarmHunt.ts'; -import FootBall from './FootBall.ts'; -import GalaxyWars from './GalaxyWars.ts'; -import GrinchSimulator from './GrinchSimulator.ts'; -import HalloweenSimulator from './HalloweenSimulator.ts'; -import HideAndSeek from './HideAndSeek.ts'; -import HoleInTheWall from './HoleInTheWall.ts'; -import HypixelSports from './HypixelSports.ts'; -import MiniWalls from './MiniWalls.ts'; -import OneInTheQuiver from './OneInTheQuiver.ts'; +import ArcadeOptions from './ArcadeOptions.js'; +import BlockingDead from './BlockingDead.js'; +import DragonWars from './DragonWars.js'; +import DrawTheirThing from './DrawTheirThing.js'; +import Dropper from './Dropper/Dropper.js'; +import Dtt from './Dtt.js'; +import EasterSimulator from './EasterSimulator.js'; +import EnderSpleef from './EnderSpleef.js'; +import FarmHunt from './FarmHunt.js'; +import FootBall from './FootBall.js'; +import GalaxyWars from './GalaxyWars.js'; +import GrinchSimulator from './GrinchSimulator.js'; +import HalloweenSimulator from './HalloweenSimulator.js'; +import HideAndSeek from './HideAndSeek.js'; +import HoleInTheWall from './HoleInTheWall.js'; +import HypixelSports from './HypixelSports.js'; +import MiniWalls from './MiniWalls.js'; +import OneInTheQuiver from './OneInTheQuiver.js'; import PartyGames from './PartyGames/PartyGames.js'; -import SantaSays from './SantaSays.ts'; -import SantaSimulator from './SantaSimulator.ts'; -import ScubaSimulator from './ScubaSimulator.ts'; -import SimonSays from './SimonSays.ts'; -import Soccer from './Soccer.ts'; -import ThrowOut from './ThrowOut.ts'; -import WoolHunt from './WoolHunt.ts'; -import Zombies from './Zombies/Zombies.ts'; -import { monthAB, weekAB } from '../../../Utils/Oscillation.ts'; +import SantaSays from './SantaSays.js'; +import SantaSimulator from './SantaSimulator.js'; +import ScubaSimulator from './ScubaSimulator.js'; +import SimonSays from './SimonSays.js'; +import Soccer from './Soccer.js'; +import ThrowOut from './ThrowOut.js'; +import WoolHunt from './WoolHunt.js'; +import Zombies from './Zombies/Zombies.js'; +import { monthAB, weekAB } from '../../../Utils/Oscillation.js'; import type { ArcadeBountyHead, ArcadeMeleeWeapon, @@ -36,7 +36,7 @@ import type { Language, PlayerGeneralSelectedCosmetic, ShopSort -} from '../../../Types/Player.ts'; +} from '../../../Types/Player.js'; class Arcade { activeMovementTrail: ArcadeMovementTrail | PlayerGeneralSelectedCosmetic | 'UNKNOWN'; diff --git a/src/Structures/MiniGames/Arcade/Dropper/Dropper.ts b/src/Structures/MiniGames/Arcade/Dropper/Dropper.ts index 47cb57b1f..9204e319a 100644 --- a/src/Structures/MiniGames/Arcade/Dropper/Dropper.ts +++ b/src/Structures/MiniGames/Arcade/Dropper/Dropper.ts @@ -1,4 +1,4 @@ -import DropperMap from './DropperMap.ts'; +import DropperMap from './DropperMap.js'; class Dropper { fails: number; diff --git a/src/Structures/MiniGames/Arcade/EnderSpleef.ts b/src/Structures/MiniGames/Arcade/EnderSpleef.ts index bf5543b15..bea74ada4 100644 --- a/src/Structures/MiniGames/Arcade/EnderSpleef.ts +++ b/src/Structures/MiniGames/Arcade/EnderSpleef.ts @@ -1,4 +1,4 @@ -import type { ArcadeEnderSpleefTrail } from '../../../Types/Player.ts'; +import type { ArcadeEnderSpleefTrail } from '../../../Types/Player.js'; class EnderSpleef { bigshotPowerupActivations: number; diff --git a/src/Structures/MiniGames/Arcade/GalaxyWars.ts b/src/Structures/MiniGames/Arcade/GalaxyWars.ts index 1e8f41eab..5264b1c02 100644 --- a/src/Structures/MiniGames/Arcade/GalaxyWars.ts +++ b/src/Structures/MiniGames/Arcade/GalaxyWars.ts @@ -1,4 +1,4 @@ -import { monthAB, weekAB } from '../../../Utils/Oscillation.ts'; +import { monthAB, weekAB } from '../../../Utils/Oscillation.js'; class GalaxyWars { deaths: number; diff --git a/src/Structures/MiniGames/Arcade/HoleInTheWall.ts b/src/Structures/MiniGames/Arcade/HoleInTheWall.ts index 67fb26032..64759d124 100644 --- a/src/Structures/MiniGames/Arcade/HoleInTheWall.ts +++ b/src/Structures/MiniGames/Arcade/HoleInTheWall.ts @@ -1,4 +1,4 @@ -import type { ArcadeHoleInTheWallColor } from '../../../Types/Player.ts'; +import type { ArcadeHoleInTheWallColor } from '../../../Types/Player.js'; class HoleInTheWall { rounds: number; diff --git a/src/Structures/MiniGames/Arcade/PartyGames/LawnMoower.ts b/src/Structures/MiniGames/Arcade/PartyGames/LawnMoower.ts index 27981d6e3..cd56af347 100644 --- a/src/Structures/MiniGames/Arcade/PartyGames/LawnMoower.ts +++ b/src/Structures/MiniGames/Arcade/PartyGames/LawnMoower.ts @@ -1,4 +1,4 @@ -import PartyGamesGame from './PartyGamesGame.ts'; +import PartyGamesGame from './PartyGamesGame.js'; class LawnMoower extends PartyGamesGame { constructor(data: Record) { diff --git a/src/Structures/MiniGames/Arcade/PartyGames/PartyGames.ts b/src/Structures/MiniGames/Arcade/PartyGames/PartyGames.ts index 69c1ffe0b..abd3d0824 100644 --- a/src/Structures/MiniGames/Arcade/PartyGames/PartyGames.ts +++ b/src/Structures/MiniGames/Arcade/PartyGames/PartyGames.ts @@ -1,6 +1,6 @@ -import LawnMoower from './LawnMoower.ts'; -import PartyGamesGame from './PartyGamesGame.ts'; -import RPG16 from './RPG16.ts'; +import LawnMoower from './LawnMoower.js'; +import PartyGamesGame from './PartyGamesGame.js'; +import RPG16 from './RPG16.js'; class PartyGames { animalSlaughter: PartyGamesGame; diff --git a/src/Structures/MiniGames/Arcade/PartyGames/PartyGamesGame.ts b/src/Structures/MiniGames/Arcade/PartyGames/PartyGamesGame.ts index 4ecb7525f..5e012a655 100644 --- a/src/Structures/MiniGames/Arcade/PartyGames/PartyGamesGame.ts +++ b/src/Structures/MiniGames/Arcade/PartyGames/PartyGamesGame.ts @@ -1,4 +1,4 @@ -import type { ArcadePartyGamesGame } from '../../../../Types/Player.ts'; +import type { ArcadePartyGamesGame } from '../../../../Types/Player.js'; class PartyGamesGame { bestScore: number; diff --git a/src/Structures/MiniGames/Arcade/PartyGames/RPG16.ts b/src/Structures/MiniGames/Arcade/PartyGames/RPG16.ts index b17133e78..c1bc2978a 100644 --- a/src/Structures/MiniGames/Arcade/PartyGames/RPG16.ts +++ b/src/Structures/MiniGames/Arcade/PartyGames/RPG16.ts @@ -1,4 +1,4 @@ -import PartyGamesGame from './PartyGamesGame.ts'; +import PartyGamesGame from './PartyGamesGame.js'; class RPG16 extends PartyGamesGame { constructor(data: Record) { diff --git a/src/Structures/MiniGames/Arcade/ThrowOut.ts b/src/Structures/MiniGames/Arcade/ThrowOut.ts index 728b369f0..a3d68a523 100644 --- a/src/Structures/MiniGames/Arcade/ThrowOut.ts +++ b/src/Structures/MiniGames/Arcade/ThrowOut.ts @@ -1,4 +1,4 @@ -import type { ArcadeThrowOutDisguise } from '../../../Types/Player.ts'; +import type { ArcadeThrowOutDisguise } from '../../../Types/Player.js'; class ThrowOut { deaths: number; diff --git a/src/Structures/MiniGames/Arcade/Zombies/ZombiesMap.ts b/src/Structures/MiniGames/Arcade/Zombies/ZombiesMap.ts index cdfec52cd..c699d5544 100644 --- a/src/Structures/MiniGames/Arcade/Zombies/ZombiesMap.ts +++ b/src/Structures/MiniGames/Arcade/Zombies/ZombiesMap.ts @@ -1,4 +1,4 @@ -import type { ArcadeZombiesMaps } from '../../../../Types/Player.ts'; +import type { ArcadeZombiesMaps } from '../../../../Types/Player.js'; class ZombiesMap { bestRoundZombies: number; diff --git a/src/Structures/MiniGames/BuildBattle/BuildBattle.ts b/src/Structures/MiniGames/BuildBattle/BuildBattle.ts index aeeb1aea8..638c656cd 100644 --- a/src/Structures/MiniGames/BuildBattle/BuildBattle.ts +++ b/src/Structures/MiniGames/BuildBattle/BuildBattle.ts @@ -1,9 +1,9 @@ import BuildBattleLastWin from './BuildBattleLastWin.js'; import BuildBattleVotes from './BuildBattleVotes.js'; -import Emblem from '../Shared/Emblem/Emblem.ts'; -import LeaderboardSettings from '../Shared/LeaderboardSettings.ts'; -import { BuildBattleTitleRequirements } from '../../../Utils/Constants.ts'; -import { monthAB } from '../../../Utils/Oscillation.ts'; +import Emblem from '../Shared/Emblem/Emblem.js'; +import LeaderboardSettings from '../Shared/LeaderboardSettings.js'; +import { BuildBattleTitleRequirements } from '../../../Utils/Constants.js'; +import { monthAB } from '../../../Utils/Oscillation.js'; import type { BuildBattleBackdrop, BuildBattleEmblemIcon, @@ -17,7 +17,7 @@ import type { BuildBattleTitle, BuildBattleVictoryDance, ShopSort -} from '../../../Types/Player.ts'; +} from '../../../Types/Player.js'; class BuildBattle { activeIsland: BuildBattleIsland | 'island_none'; diff --git a/src/Structures/MiniGames/MurderMystery/MurderMystery.ts b/src/Structures/MiniGames/MurderMystery/MurderMystery.ts index 64162d53b..052c4ce00 100644 --- a/src/Structures/MiniGames/MurderMystery/MurderMystery.ts +++ b/src/Structures/MiniGames/MurderMystery/MurderMystery.ts @@ -1,10 +1,10 @@ import Emblem from '../Shared/Emblem/Emblem.js'; import LeaderboardSettings from '../Shared/LeaderboardSettings.js'; import MurderMysteryDescent from './MurderMysteryDescent.js'; -import MurderMysteryFavorites from './MurderMysteryFavorites.ts'; -import MurderMysteryGamemode from './MurderMysteryGamemode.ts'; -import MurderMysteryKnifeSkinPrestige from './MurderMysteryKnifeSkinPrestige.ts'; -import MurderMysteryMap from './MurderMysteryMap.ts'; +import MurderMysteryFavorites from './MurderMysteryFavorites.js'; +import MurderMysteryGamemode from './MurderMysteryGamemode.js'; +import MurderMysteryKnifeSkinPrestige from './MurderMysteryKnifeSkinPrestige.js'; +import MurderMysteryMap from './MurderMysteryMap.js'; import type { MurderMysteryAnimatedHat, MurderMysteryDeathCry, @@ -21,7 +21,7 @@ import type { MurderMysteryRole, MurderMysteryVictoryDance, ShopSort -} from '../../../Types/Player.ts'; +} from '../../../Types/Player.js'; class MurderMystery { activeAnimatedHat: MurderMysteryAnimatedHat | 'UNKNOWN'; diff --git a/src/Structures/MiniGames/MurderMystery/MurderMysteryDescent.ts b/src/Structures/MiniGames/MurderMystery/MurderMysteryDescent.ts index fc60837be..57213dd2d 100644 --- a/src/Structures/MiniGames/MurderMystery/MurderMysteryDescent.ts +++ b/src/Structures/MiniGames/MurderMystery/MurderMysteryDescent.ts @@ -1,4 +1,4 @@ -import MurderMysteryDescentItem from './MurderMysteryDescentItem.ts'; +import MurderMysteryDescentItem from './MurderMysteryDescentItem.js'; class MurderMysteryDescent { Armed: MurderMysteryDescentItem; diff --git a/src/Structures/MiniGames/MurderMystery/MurderMysteryFavorites.ts b/src/Structures/MiniGames/MurderMystery/MurderMysteryFavorites.ts index 59b533e1e..5dd8d5585 100644 --- a/src/Structures/MiniGames/MurderMystery/MurderMysteryFavorites.ts +++ b/src/Structures/MiniGames/MurderMystery/MurderMysteryFavorites.ts @@ -8,7 +8,7 @@ import type { MurderMysteryLastWordsRaw, MurderMysteryProjectileTrailRaw, MurderMysteryVictoryDanceRaw -} from '../../../Types/Player.ts'; +} from '../../../Types/Player.js'; class MurderMysteryFavorites { animatedHat: MurderMysteryAnimatedHatRaw[]; diff --git a/src/Structures/MiniGames/MurderMystery/MurderMysteryGamemode.ts b/src/Structures/MiniGames/MurderMystery/MurderMysteryGamemode.ts index 8acb6b813..f7d06a57d 100644 --- a/src/Structures/MiniGames/MurderMystery/MurderMysteryGamemode.ts +++ b/src/Structures/MiniGames/MurderMystery/MurderMysteryGamemode.ts @@ -1,4 +1,4 @@ -import type { MurderMysteryMapName, MurderMysteryMode } from '../../../Types/Player.ts'; +import type { MurderMysteryMapName, MurderMysteryMode } from '../../../Types/Player.js'; class MurderMysteryGamemode { alphaWins: number; diff --git a/src/Structures/MiniGames/MurderMystery/MurderMysteryKnifeSkinPrestige.ts b/src/Structures/MiniGames/MurderMystery/MurderMysteryKnifeSkinPrestige.ts index e5b680be4..d7743980d 100644 --- a/src/Structures/MiniGames/MurderMystery/MurderMysteryKnifeSkinPrestige.ts +++ b/src/Structures/MiniGames/MurderMystery/MurderMysteryKnifeSkinPrestige.ts @@ -1,5 +1,5 @@ -import MurderMysteryKnifeSkinPrestigeXp from './MurderMysteryKnifeSkinPrestigeXp.ts'; -import type { MurderMysteryKnifeSkinRaw } from '../../../Types/Player.ts'; +import MurderMysteryKnifeSkinPrestigeXp from './MurderMysteryKnifeSkinPrestigeXp.js'; +import type { MurderMysteryKnifeSkinRaw } from '../../../Types/Player.js'; class MurderMysteryKnifeSkinPrestige { usePrestige: MurderMysteryKnifeSkinRaw[]; diff --git a/src/Structures/MiniGames/MurderMystery/MurderMysteryMap.ts b/src/Structures/MiniGames/MurderMystery/MurderMysteryMap.ts index c1136ccbc..1d9d59fa3 100644 --- a/src/Structures/MiniGames/MurderMystery/MurderMysteryMap.ts +++ b/src/Structures/MiniGames/MurderMystery/MurderMysteryMap.ts @@ -1,5 +1,5 @@ -import MurderMysteryGamemode from './MurderMysteryGamemode.ts'; -import type { MurderMysteryMapName } from '../../../Types/Player.ts'; +import MurderMysteryGamemode from './MurderMysteryGamemode.js'; +import type { MurderMysteryMapName } from '../../../Types/Player.js'; class MurderMysteryMap { alphaWins: number; diff --git a/src/Structures/MiniGames/Shared/Emblem/Emblem.test.ts b/src/Structures/MiniGames/Shared/Emblem/Emblem.test.ts index c247e8018..f702e32e1 100644 --- a/src/Structures/MiniGames/Shared/Emblem/Emblem.test.ts +++ b/src/Structures/MiniGames/Shared/Emblem/Emblem.test.ts @@ -1,7 +1,7 @@ import Emblem from './Emblem.js'; import EmblemColors from './EmblemColors.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type { BuildBattleEmblemIcon } from '../../../../Types/Player.ts'; +import type { BuildBattleEmblemIcon } from '../../../../Types/Player.js'; import type { ColorCode } from '../../../../Types/Color.js'; test('Emblem', () => { diff --git a/src/Structures/MiniGames/Shared/Emblem/Emblem.ts b/src/Structures/MiniGames/Shared/Emblem/Emblem.ts index e44a82467..1c1bd7d5c 100644 --- a/src/Structures/MiniGames/Shared/Emblem/Emblem.ts +++ b/src/Structures/MiniGames/Shared/Emblem/Emblem.ts @@ -1,5 +1,5 @@ -import EmblemColors from './EmblemColors.ts'; -import type { ColorCode } from '../../../../Types/Color.ts'; +import EmblemColors from './EmblemColors.js'; +import type { ColorCode } from '../../../../Types/Color.js'; class Emblem { colorUnlocked: EmblemColors; diff --git a/src/Structures/MiniGames/Shared/LeaderboardSettings.ts b/src/Structures/MiniGames/Shared/LeaderboardSettings.ts index f684a01a1..a10d42e02 100644 --- a/src/Structures/MiniGames/Shared/LeaderboardSettings.ts +++ b/src/Structures/MiniGames/Shared/LeaderboardSettings.ts @@ -1,4 +1,4 @@ -import type { LeaderboardSettingsResetType } from '../../../Types/Player.ts'; +import type { LeaderboardSettingsResetType } from '../../../Types/Player.js'; class LeaderboardSettings { mode: ModeType | 'UNKNOWN'; diff --git a/src/Structures/Player/Player.ts b/src/Structures/Player/Player.ts index d811a93a2..fefb69812 100644 --- a/src/Structures/Player/Player.ts +++ b/src/Structures/Player/Player.ts @@ -13,7 +13,7 @@ import PlayerScorpiusBribe from './PlayerScorpiusBribe.js'; import PlayerSocialMedia from './PlayerSocialMedia.js'; import PlayerStats from './PlayerStats.js'; import RecentGame from '../RecentGame.js'; -import type RequestData from '../../Private/RequestData.ts'; +import type RequestData from '../../Private/RequestData.js'; import type { ChatChannel, Language, LevelProgress, PlayerRank } from '../../Types/Player.js'; class Player { diff --git a/src/Structures/Player/PlayerAchievements/PlayerAchievementsTotem.ts b/src/Structures/Player/PlayerAchievements/PlayerAchievementsTotem.ts index 9b1ee9186..6315ab90e 100644 --- a/src/Structures/Player/PlayerAchievements/PlayerAchievementsTotem.ts +++ b/src/Structures/Player/PlayerAchievements/PlayerAchievementsTotem.ts @@ -1,4 +1,4 @@ -import type { PlayerAchievementsTotemColors, PlayerAchievementsTotemParts } from '../../../Types/Player.ts'; +import type { PlayerAchievementsTotemColors, PlayerAchievementsTotemParts } from '../../../Types/Player.js'; class PlayerAchievementsTotem { canCustomize: boolean; diff --git a/src/Structures/RecentGame.ts b/src/Structures/RecentGame.ts index b62038823..671b994fe 100644 --- a/src/Structures/RecentGame.ts +++ b/src/Structures/RecentGame.ts @@ -1,5 +1,5 @@ import Game from './Game.js'; -import type RequestData from '../Private/RequestData.ts'; +import type RequestData from '../Private/RequestData.js'; class RecentGame { game: Game | null; diff --git a/src/Structures/SkyBlock/Bazaar/SkyBlockBazaar.ts b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaar.ts index 753649b7f..172d10dfd 100644 --- a/src/Structures/SkyBlock/Bazaar/SkyBlockBazaar.ts +++ b/src/Structures/SkyBlock/Bazaar/SkyBlockBazaar.ts @@ -1,5 +1,5 @@ import SkyBlockBazaarProduct from './SkyBlockBazaarProduct.js'; -import type RequestData from '../../../Private/RequestData.ts'; +import type RequestData from '../../../Private/RequestData.js'; class SkyBlockBazaar { lastUpdated: number; diff --git a/src/Structures/SkyBlock/Bingo/SkyBlockBingo.ts b/src/Structures/SkyBlock/Bingo/SkyBlockBingo.ts index 7a77f3dee..c1a3b2305 100644 --- a/src/Structures/SkyBlock/Bingo/SkyBlockBingo.ts +++ b/src/Structures/SkyBlock/Bingo/SkyBlockBingo.ts @@ -1,5 +1,5 @@ import SkyBlockBingoGoal from './SkyBlockBingoGoal.js'; -import type RequestData from '../../../Private/RequestData.ts'; +import type RequestData from '../../../Private/RequestData.js'; class SkyBlockBingo { lastUpdatedTimestamp: number; diff --git a/src/Structures/SkyBlock/Collections/SkyBlockCollections.ts b/src/Structures/SkyBlock/Collections/SkyBlockCollections.ts index 2ee9121e5..d2fed7b51 100644 --- a/src/Structures/SkyBlock/Collections/SkyBlockCollections.ts +++ b/src/Structures/SkyBlock/Collections/SkyBlockCollections.ts @@ -1,5 +1,5 @@ import SkyBlockCollection from './SkyBlockCollection.js'; -import type RequestData from '../../../Private/RequestData.ts'; +import type RequestData from '../../../Private/RequestData.js'; class SkyBlockCollections { lastUpdated: number; diff --git a/src/Structures/SkyBlock/Election/SkyBlockElectionData.ts b/src/Structures/SkyBlock/Election/SkyBlockElectionData.ts index cf042fe1b..627ee9a1c 100644 --- a/src/Structures/SkyBlock/Election/SkyBlockElectionData.ts +++ b/src/Structures/SkyBlock/Election/SkyBlockElectionData.ts @@ -1,5 +1,5 @@ import SkyBlockElection from './SkyBlockElection.js'; -import type RequestData from '../../../Private/RequestData.ts'; +import type RequestData from '../../../Private/RequestData.js'; class SkyBlockElectionData { lastUpdatedTimestamp: number; diff --git a/src/Structures/SkyBlock/FireSale/SkyBlockFireSale.ts b/src/Structures/SkyBlock/FireSale/SkyBlockFireSale.ts index caeba4f29..917495a2d 100644 --- a/src/Structures/SkyBlock/FireSale/SkyBlockFireSale.ts +++ b/src/Structures/SkyBlock/FireSale/SkyBlockFireSale.ts @@ -1,4 +1,4 @@ -import type RequestData from '../../../Private/RequestData.ts'; +import type RequestData from '../../../Private/RequestData.js'; class SkyBlockFireSale { itemId: string; diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGarden.ts b/src/Structures/SkyBlock/Garden/SkyBlockGarden.ts index 724de47cf..a7657fbbf 100644 --- a/src/Structures/SkyBlock/Garden/SkyBlockGarden.ts +++ b/src/Structures/SkyBlock/Garden/SkyBlockGarden.ts @@ -4,7 +4,7 @@ import SkyBlockGardenCropMilestones from './SkyBlockGardenCropMilestones.js'; import SkyBlockGardenCropsUpgrades from './SkyBlockGardenCropsUpgrades.js'; import SkyBlockGardenVisitors from './SkyBlockGardenVisitors.js'; import { getLevelByXp } from '../../../Utils/SkyBlockUtils.js'; -import type RequestData from '../../../Private/RequestData.ts'; +import type RequestData from '../../../Private/RequestData.js'; import type { BarnPlot, BarnSkin, SkillLevelData } from '../../../Types/SkyBlock.js'; class SkyBlockGarden { diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsle.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsle.ts index ec0163550..24b64b17a 100644 --- a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsle.ts +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsle.ts @@ -3,7 +3,7 @@ import SkyBlockMemberCrimsonIsleAbiphone from './SkyBlockMemberCrimsonIsleAbipho import SkyBlockMemberCrimsonIsleDojo from './SkyBlockMemberCrimsonIsleDojo.js'; import SkyBlockMemberCrimsonIsleKuudra from './SkyBlockMemberCrimsonIsleKuudra.js'; import SkyBlockMemberCrimsonIsleMatriarch from './SkyBlockMemberCrimsonIsleMatriarch.js'; -import SkyBlockMemberCrimsonIsleTrophyFish from './SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.ts'; +import SkyBlockMemberCrimsonIsleTrophyFish from './SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.js'; import type { CrimsonIsleBoss, CrimsonIsleFaction } from '../../../../Types/SkyBlock.js'; /* eslint-enable @stylistic/max-len */ diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.ts index d008abfba..c927726bf 100644 --- a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.ts +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.ts @@ -1,6 +1,6 @@ -import SkyBlockMemberCrimsonIsleTrophyFishCaught from './SkyBlockMemberCrimsonIsleTrophyFishCaught.ts'; -import SkyBlockMemberCrimsonIsleTrophyFishFish from './SkyBlockMemberCrimsonIsleTrophyFishFish.ts'; -import type { CrimsonIsleTrophyFishRank } from '../../../../../Types/SkyBlock.ts'; +import SkyBlockMemberCrimsonIsleTrophyFishCaught from './SkyBlockMemberCrimsonIsleTrophyFishCaught.js'; +import SkyBlockMemberCrimsonIsleTrophyFishFish from './SkyBlockMemberCrimsonIsleTrophyFishFish.js'; +import type { CrimsonIsleTrophyFishRank } from '../../../../../Types/SkyBlock.js'; class SkyBlockMemberCrimsonIsleTrophyFish { rank: CrimsonIsleTrophyFishRank; diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFishCaught.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFishCaught.ts index 6f63e3ff9..c2d451493 100644 --- a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFishCaught.ts +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFishCaught.ts @@ -1,6 +1,6 @@ -import SkyBlockMemberCrimsonIsleTrophyFishFish from './SkyBlockMemberCrimsonIsleTrophyFishFish.ts'; -import type SkyBlockMemberCrimsonIsleTrophyFish from './SkyBlockMemberCrimsonIsleTrophyFish.ts'; -import type { CrimsonIsleTrophyFishRank } from '../../../../../Types/SkyBlock.ts'; +import SkyBlockMemberCrimsonIsleTrophyFishFish from './SkyBlockMemberCrimsonIsleTrophyFishFish.js'; +import type SkyBlockMemberCrimsonIsleTrophyFish from './SkyBlockMemberCrimsonIsleTrophyFish.js'; +import type { CrimsonIsleTrophyFishRank } from '../../../../../Types/SkyBlock.js'; class SkyBlockMemberCrimsonIsleTrophyFishCaught { total: number; diff --git a/src/Structures/SkyBlock/Museum/SkyBlockMuseum.ts b/src/Structures/SkyBlock/Museum/SkyBlockMuseum.ts index 75cab2317..72a48fb64 100644 --- a/src/Structures/SkyBlock/Museum/SkyBlockMuseum.ts +++ b/src/Structures/SkyBlock/Museum/SkyBlockMuseum.ts @@ -1,5 +1,5 @@ import SkyBlockMuseumMember from './SkyBlockMuseumMember.js'; -import type RequestData from '../../../Private/RequestData.ts'; +import type RequestData from '../../../Private/RequestData.js'; import type { UUID } from '../../../Types/Global.js'; class SkyBlockMuseum { diff --git a/src/Structures/SkyBlock/News/SkyBlockNews.ts b/src/Structures/SkyBlock/News/SkyBlockNews.ts index c573dad91..6f209889f 100644 --- a/src/Structures/SkyBlock/News/SkyBlockNews.ts +++ b/src/Structures/SkyBlock/News/SkyBlockNews.ts @@ -1,4 +1,4 @@ -import type RequestData from '../../../Private/RequestData.ts'; +import type RequestData from '../../../Private/RequestData.js'; const dateRegExp = /(\d{1,2})(?:st|nd|rd|th|) ([A-Za-z]+) (\d+)/; const versionRegExp = /v\d+(\.\d+){1,}/; diff --git a/src/Structures/SkyBlock/Profile/SkyBlockProfile.ts b/src/Structures/SkyBlock/Profile/SkyBlockProfile.ts index f2a91e7c0..a1133f7c7 100644 --- a/src/Structures/SkyBlock/Profile/SkyBlockProfile.ts +++ b/src/Structures/SkyBlock/Profile/SkyBlockProfile.ts @@ -1,7 +1,7 @@ import SkyBlockMember from '../Member/SkyBlockMember.js'; import SkyBlockProfileBanking from './Banking/SkyBlockProfileBanking.js'; import SkyBlockProfileCommunityUpgrades from './CommunityUpgrades/SkyBlockProfileCommunityUpgrades.js'; -import type RequestData from '../../../Private/RequestData.ts'; +import type RequestData from '../../../Private/RequestData.js'; import type SkyBlockGarden from '../Garden/SkyBlockGarden.js'; import type SkyBlockMuseum from '../Museum/SkyBlockMuseum.js'; import type { SkyBlockProfileName, SkyBlockProfileType } from '../../../Types/SkyBlock.js'; diff --git a/src/Structures/SkyBlock/Skills/SkyBlockSkills.ts b/src/Structures/SkyBlock/Skills/SkyBlockSkills.ts index 897f85c02..2c52d9cb7 100644 --- a/src/Structures/SkyBlock/Skills/SkyBlockSkills.ts +++ b/src/Structures/SkyBlock/Skills/SkyBlockSkills.ts @@ -1,5 +1,5 @@ import SkyBlockSkill from './SkyBlockSkill.js'; -import type RequestData from '../../../Private/RequestData.ts'; +import type RequestData from '../../../Private/RequestData.js'; class SkyBlockSkills { lastUpdated: number; diff --git a/src/Structures/SkyBlock/SkyBlockItem.ts b/src/Structures/SkyBlock/SkyBlockItem.ts index f72704ec2..6fb93c69d 100644 --- a/src/Structures/SkyBlock/SkyBlockItem.ts +++ b/src/Structures/SkyBlock/SkyBlockItem.ts @@ -1,4 +1,4 @@ -import type RequestData from '../../Private/RequestData.ts'; +import type RequestData from '../../Private/RequestData.js'; class SkyBlockItem { name: string; diff --git a/src/Structures/Static/Achievements/Achievements.ts b/src/Structures/Static/Achievements/Achievements.ts index 89e869351..5ca1fbb0d 100644 --- a/src/Structures/Static/Achievements/Achievements.ts +++ b/src/Structures/Static/Achievements/Achievements.ts @@ -1,5 +1,5 @@ import GameAchievements from './GameAchievements.js'; -import type RequestData from '../../../Private/RequestData.ts'; +import type RequestData from '../../../Private/RequestData.js'; class Achievements { lastUpdatedTimestamp: number; diff --git a/src/Structures/Static/Achievements/GuildAchievements.ts b/src/Structures/Static/Achievements/GuildAchievements.ts index 4c55fa30c..b90bcd587 100644 --- a/src/Structures/Static/Achievements/GuildAchievements.ts +++ b/src/Structures/Static/Achievements/GuildAchievements.ts @@ -1,6 +1,6 @@ import OneTimeAchievement from './OneTimeAchievement.js'; import TieredAchievement from './TieredAchievement.js'; -import type RequestData from '../../../Private/RequestData.ts'; +import type RequestData from '../../../Private/RequestData.js'; class GuildAchievements { lastUpdatedTimestamp: number; diff --git a/src/Structures/Static/Challenges.ts b/src/Structures/Static/Challenges.ts index e9b46e69a..db143e222 100644 --- a/src/Structures/Static/Challenges.ts +++ b/src/Structures/Static/Challenges.ts @@ -1,5 +1,5 @@ import GameChallenges from './GameChallenges.js'; -import type RequestData from '../../Private/RequestData.ts'; +import type RequestData from '../../Private/RequestData.js'; class Challenges { lastUpdatedTimestamp: number; diff --git a/src/Structures/Static/Quests.ts b/src/Structures/Static/Quests.ts index fd6647c21..8b84230d0 100644 --- a/src/Structures/Static/Quests.ts +++ b/src/Structures/Static/Quests.ts @@ -1,5 +1,5 @@ import GameQuests from './GameQuests.js'; -import type RequestData from '../../Private/RequestData.ts'; +import type RequestData from '../../Private/RequestData.js'; class Quests { lastUpdatedTimestamp: number; diff --git a/src/Structures/Status.ts b/src/Structures/Status.ts index 99d7127ed..18494bf18 100644 --- a/src/Structures/Status.ts +++ b/src/Structures/Status.ts @@ -1,5 +1,5 @@ import Game from './Game.js'; -import type RequestData from '../Private/RequestData.ts'; +import type RequestData from '../Private/RequestData.js'; class Status { online: boolean; diff --git a/src/Structures/WatchdogStats.ts b/src/Structures/WatchdogStats.ts index d467d94c3..1d6dae870 100644 --- a/src/Structures/WatchdogStats.ts +++ b/src/Structures/WatchdogStats.ts @@ -1,4 +1,4 @@ -import type RequestData from '../Private/RequestData.ts'; +import type RequestData from '../Private/RequestData.js'; class WatchdogStats { byWatchdogTotal: number; diff --git a/src/Types/API.ts b/src/Types/API.ts index c5d269f31..72c0c1061 100644 --- a/src/Types/API.ts +++ b/src/Types/API.ts @@ -1,9 +1,9 @@ -import type RequestData from '../Private/RequestData.ts'; +import type RequestData from '../Private/RequestData.js'; import type SkyBlockAuction from '../Structures/SkyBlock/Auctions/SkyBlockAuction.js'; import type SkyBlockAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockAuctionInfo.js'; import type SkyBlockBaseAuctionInfo from '../Structures/SkyBlock/Auctions/SkyBlockBaseAuctionInfo.js'; import type { RequestOptions } from './Requests.js'; -import type { SkyblockProfileWithMe } from './SkyBlock.ts'; +import type { SkyblockProfileWithMe } from './SkyBlock.js'; export interface PlayerRequestOptions extends RequestOptions { guild?: boolean; diff --git a/src/Types/SkyBlock.ts b/src/Types/SkyBlock.ts index 7fe5e1b2a..ef2ade537 100644 --- a/src/Types/SkyBlock.ts +++ b/src/Types/SkyBlock.ts @@ -1,6 +1,6 @@ -import type SkyBlockMemberLeveling from '../Structures/SkyBlock/Member/SkyBlockMemberLeveling.ts'; -import type SkyBlockMemberPlayerData from '../Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerData.ts'; -import type SkyBlockProfile from '../Structures/SkyBlock/Profile/SkyBlockProfile.ts'; +import type SkyBlockMemberLeveling from '../Structures/SkyBlock/Member/SkyBlockMemberLeveling.js'; +import type SkyBlockMemberPlayerData from '../Structures/SkyBlock/Member/PlayerData/SkyBlockMemberPlayerData.js'; +import type SkyBlockProfile from '../Structures/SkyBlock/Profile/SkyBlockProfile.js'; import type { SortName } from './Global.js'; export interface RawAbiphoneData { diff --git a/src/Utils/ParseBoosterType.ts b/src/Utils/ParseBoosterType.ts index 8c6254eb5..cc811af32 100644 --- a/src/Utils/ParseBoosterType.ts +++ b/src/Utils/ParseBoosterType.ts @@ -1,4 +1,4 @@ -import type { BoosterType } from '../Types/Booster.ts'; +import type { BoosterType } from '../Types/Booster.js'; export default function ParseBoosterType(data: Record): BoosterType { if (data.stacked === true) return 'STACKED'; diff --git a/src/Utils/SkyBlockUtils.ts b/src/Utils/SkyBlockUtils.ts index d3521560f..82f98e249 100644 --- a/src/Utils/SkyBlockUtils.ts +++ b/src/Utils/SkyBlockUtils.ts @@ -23,7 +23,7 @@ import { petRarityOffset } from './Constants.js'; import { parse, simplify } from 'prismarine-nbt'; -import type SkyBlockProfile from '../Structures/SkyBlock/Profile/SkyBlockProfile.ts'; +import type SkyBlockProfile from '../Structures/SkyBlock/Profile/SkyBlockProfile.js'; import type { LevelData, PetLevelData, diff --git a/src/index.ts b/src/index.ts index 34080c9c3..41bda3327 100644 --- a/src/index.ts +++ b/src/index.ts @@ -20,6 +20,7 @@ export * from './Utils/Constants.js'; export * from './Utils/Divide.js'; export * from './Utils/Guild.js'; export * from './Utils/Oscillation.js'; +export * from './Utils/ParseBedWarsMode.js'; export * from './Utils/ParseBoosterType.js'; export * from './Utils/RemoveSnakeCase.js'; export * from './Utils/Romanize.js'; From f85891dfe7d7dad545cd2690538153081240eaee Mon Sep 17 00:00:00 2001 From: Jacob Date: Mon, 24 Nov 2025 11:42:10 +0800 Subject: [PATCH 090/124] Release 12.0.0-17 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bac6715d6..395a366a6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hypixel-api-reborn", - "version": "12.0.0-16", + "version": "12.0.0-17", "description": "Feature-rich Hypixel API wrapper for Node.js", "main": "dist/index.js", "types": "dist/index.d.ts", From 7345a90d3123ec92d014f82326abe38fe0fcae21 Mon Sep 17 00:00:00 2001 From: Jacob Date: Sun, 14 Dec 2025 10:06:47 +0800 Subject: [PATCH 091/124] fix(BedWars): Unable to get modes Signed-off-by: Jacob --- src/Structures/MiniGames/BedWars/BedWars.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/Structures/MiniGames/BedWars/BedWars.ts b/src/Structures/MiniGames/BedWars/BedWars.ts index 7a7c66867..57697a21a 100644 --- a/src/Structures/MiniGames/BedWars/BedWars.ts +++ b/src/Structures/MiniGames/BedWars/BedWars.ts @@ -24,6 +24,11 @@ import type { PlayerGeneralSelectedCosmetic, ShopSort } from '../../../Types/Player.js'; +import BedWarsEightOne from './BedWarsEightOne.ts'; +import BedWarsEightTwo from './BedWarsEightTwo.ts'; +import BedWarsFourThree from './BedWarsFourThree.ts'; +import BedWarsFourFour from './BedWarsFourFour.ts'; +import BedWarsTwoFour from './BedWarsTwoFour.ts'; class BedWars extends BedWarsMode { experience: number; @@ -61,6 +66,11 @@ class BedWars extends BedWarsMode { figurines: BedWarsFigurines; privateGameSettings: BedWarsPrivateGameSettings; settings: BedWarsSettings; + eightOne: BedWarsEightOne; + eightTwo: BedWarsEightTwo; + fourThree: BedWarsFourThree; + fourFour: BedWarsFourFour; + twoFour: BedWarsTwoFour; constructor(data: Record) { super(data); this.experience = data?.Experience || 0; @@ -98,6 +108,11 @@ class BedWars extends BedWarsMode { this.figurines = new BedWarsFigurines(data?.figurines || {}); this.privateGameSettings = new BedWarsPrivateGameSettings(data?.privategames || {}); this.settings = new BedWarsSettings(data?.settings || {}); + this.eightOne = new BedWarsEightOne(data || {}); + this.eightTwo = new BedWarsEightTwo(data || {}); + this.fourThree = new BedWarsFourThree(data || {}); + this.fourFour = new BedWarsFourFour(data || {}); + this.twoFour = new BedWarsTwoFour(data || {}); } static getPrestige(level: number): BedWarsPrestige { From 8206a9fd1166b544e2d8049eb2da1399591f4311 Mon Sep 17 00:00:00 2001 From: Jacob Date: Sun, 14 Dec 2025 10:07:50 +0800 Subject: [PATCH 092/124] fix(imports) Signed-off-by: Jacob --- src/Structures/MiniGames/BedWars/BedWars.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Structures/MiniGames/BedWars/BedWars.ts b/src/Structures/MiniGames/BedWars/BedWars.ts index 57697a21a..a312687d5 100644 --- a/src/Structures/MiniGames/BedWars/BedWars.ts +++ b/src/Structures/MiniGames/BedWars/BedWars.ts @@ -1,9 +1,14 @@ import BedWarsBoxes from './BedWarsBoxes.js'; +import BedWarsEightOne from './BedWarsEightOne.ts'; +import BedWarsEightTwo from './BedWarsEightTwo.ts'; import BedWarsFavorites from './BedWarsFavorites.js'; import BedWarsFigurines from './BedWarsFigurines.js'; +import BedWarsFourFour from './BedWarsFourFour.ts'; +import BedWarsFourThree from './BedWarsFourThree.ts'; import BedWarsMode from './BedWarsMode.js'; import BedWarsPrivateGameSettings from './BedWarsPrivateGameSettings.js'; import BedWarsSettings from './BedWarsSettings.js'; +import BedWarsTwoFour from './BedWarsTwoFour.ts'; import { BedWarsPrestiges } from '../../../Utils/Constants.js'; import type { BedWarsBedDestroy, @@ -24,11 +29,6 @@ import type { PlayerGeneralSelectedCosmetic, ShopSort } from '../../../Types/Player.js'; -import BedWarsEightOne from './BedWarsEightOne.ts'; -import BedWarsEightTwo from './BedWarsEightTwo.ts'; -import BedWarsFourThree from './BedWarsFourThree.ts'; -import BedWarsFourFour from './BedWarsFourFour.ts'; -import BedWarsTwoFour from './BedWarsTwoFour.ts'; class BedWars extends BedWarsMode { experience: number; From e1556fdab11f6b8770fea33bc00671c8eb6e4680 Mon Sep 17 00:00:00 2001 From: Jacob Date: Sun, 14 Dec 2025 10:15:06 +0800 Subject: [PATCH 093/124] Release 12.0.0-18 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 395a366a6..1ef900ce8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hypixel-api-reborn", - "version": "12.0.0-17", + "version": "12.0.0-18", "description": "Feature-rich Hypixel API wrapper for Node.js", "main": "dist/index.js", "types": "dist/index.d.ts", From b21ee53a29319b0a30eaa2adcebcc73b63519846 Mon Sep 17 00:00:00 2001 From: Jacob Date: Tue, 16 Dec 2025 09:36:38 +0800 Subject: [PATCH 094/124] feat(SkyBlockGardenCropMilestones): New crops from 0.24 Signed-off-by: Jacob --- .../SkyBlockGardenCropMilestones.test.ts | 6 + .../Garden/SkyBlockGardenCropMilestones.ts | 13 +- src/Types/SkyBlock.ts | 5 +- src/Utils/Constants.ts | 810 +++++++++++------- src/Utils/SkyBlockUtils.ts | 8 +- 5 files changed, 508 insertions(+), 334 deletions(-) diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGardenCropMilestones.test.ts b/src/Structures/SkyBlock/Garden/SkyBlockGardenCropMilestones.test.ts index f314f878d..f4d621d49 100644 --- a/src/Structures/SkyBlock/Garden/SkyBlockGardenCropMilestones.test.ts +++ b/src/Structures/SkyBlock/Garden/SkyBlockGardenCropMilestones.test.ts @@ -27,6 +27,12 @@ test('SkyBlockGardenCropMilestones', () => { expectTypeOf(data.mushroom).toEqualTypeOf(); expect(data.netherWart).toBeDefined(); expectTypeOf(data.netherWart).toEqualTypeOf(); + expect(data.moonFlower).toBeDefined(); + expectTypeOf(data.moonFlower).toEqualTypeOf(); + expect(data.sunFlower).toBeDefined(); + expectTypeOf(data.sunFlower).toEqualTypeOf(); + expect(data.wildRose).toBeDefined(); + expectTypeOf(data.wildRose).toEqualTypeOf(); expect(data.average).toBeDefined(); expect(data.average).toBeGreaterThanOrEqual(0); expectTypeOf(data.average).toEqualTypeOf(); diff --git a/src/Structures/SkyBlock/Garden/SkyBlockGardenCropMilestones.ts b/src/Structures/SkyBlock/Garden/SkyBlockGardenCropMilestones.ts index 6b216c4b7..aa9be2f3b 100644 --- a/src/Structures/SkyBlock/Garden/SkyBlockGardenCropMilestones.ts +++ b/src/Structures/SkyBlock/Garden/SkyBlockGardenCropMilestones.ts @@ -12,6 +12,9 @@ class SkyBlockGardenCropMilestones { cocoaBeans: SkillLevelData; mushroom: SkillLevelData; netherWart: SkillLevelData; + moonFlower: SkillLevelData; + sunFlower: SkillLevelData; + wildRose: SkillLevelData; average: number; constructor(data: Record) { this.wheat = getLevelByXp(data?.WHEAT || 0, { type: 'wheat' }); @@ -24,6 +27,9 @@ class SkyBlockGardenCropMilestones { this.cocoaBeans = getLevelByXp(data?.['INK_SACK:3'] || 0, { type: 'cocoaBeans' }); this.mushroom = getLevelByXp(data?.MUSHROOM_COLLECTION || 0, { type: 'mushroom' }); this.netherWart = getLevelByXp(data?.NETHER_STALK || 0, { type: 'netherWart' }); + this.moonFlower = getLevelByXp(data?.MOONFLOWER || 0, { type: 'moonFlower' }); + this.sunFlower = getLevelByXp(data?.DOUBLE_PLANT || 0, { type: 'sunFlower' }); + this.wildRose = getLevelByXp(data?.WILD_ROSE || 0, { type: 'wildRose' }); this.average = (this.wheat.level + this.carrot.level + @@ -34,8 +40,11 @@ class SkyBlockGardenCropMilestones { this.cactus.level + this.cocoaBeans.level + this.mushroom.level + - this.netherWart.level) / - 10; + this.netherWart.level + + this.moonFlower.level + + this.sunFlower.level + + this.wildRose.level) / + 13; } toString(): number { diff --git a/src/Types/SkyBlock.ts b/src/Types/SkyBlock.ts index ef2ade537..76855c7ea 100644 --- a/src/Types/SkyBlock.ts +++ b/src/Types/SkyBlock.ts @@ -65,7 +65,10 @@ export type GardenCrops = | 'cactus' | 'cocoaBeans' | 'mushroom' - | 'netherWart'; + | 'netherWart' + | 'moonFlower' + | 'sunFlower' + | 'wildRose'; export type BankingTransactionAction = 'DEPOSIT' | 'WITHDRAW'; export type CommunityUpgradesUpgrades = diff --git a/src/Utils/Constants.ts b/src/Utils/Constants.ts index ab783dc75..5179fd46b 100644 --- a/src/Utils/Constants.ts +++ b/src/Utils/Constants.ts @@ -439,6 +439,9 @@ export const DEFAULT_SKILL_CAPS: { [key in SkyBlockXPTables]: number } = { cocoaBeans: 46, mushroom: 46, netherWart: 46, + moonFlower: 46, + sunFlower: 46, + wildRose: 46, garden: 15 }; @@ -656,10 +659,10 @@ export const WHEAT = { 1: 30, 2: 50, 3: 80, - 4: 170, - 5: 330, - 6: 670, - 7: 1330, + 4: 200, + 5: 350, + 6: 700, + 7: 1500, 8: 2500, 9: 3500, 10: 5000, @@ -673,32 +676,32 @@ export const WHEAT = { 18: 100000, 19: 175000, 20: 250000, - 21: 350000, - 22: 500000, - 23: 750000, - 24: 1000000, - 25: 1300000, - 26: 1600000, - 27: 2000000, - 28: 2300000, - 29: 2600000, - 30: 3000000, - 31: 3000000, - 32: 3000000, - 33: 3000000, - 34: 3000000, - 35: 3000000, - 36: 3000000, - 37: 3000000, - 38: 3000000, - 39: 3000000, - 40: 3000000, - 41: 3000000, - 42: 3000000, - 43: 3000000, - 44: 3000000, - 45: 3000000, - 46: 3000000 + 21: 375000, + 22: 400000, + 23: 450000, + 24: 650000, + 25: 800000, + 26: 800000, + 27: 800000, + 28: 800000, + 29: 800000, + 30: 800000, + 31: 800000, + 32: 800000, + 33: 800000, + 34: 800000, + 35: 800000, + 36: 800000, + 37: 800000, + 38: 800000, + 39: 800000, + 40: 800000, + 41: 800000, + 42: 800000, + 43: 800000, + 44: 800000, + 45: 800000, + 46: 800000 }; export const CARROT = { @@ -706,48 +709,48 @@ export const CARROT = { 2: 150, 3: 250, 4: 500, - 5: 1500, - 6: 2500, - 7: 5000, - 8: 7500, - 9: 10000, + 5: 1000, + 6: 2000, + 7: 4500, + 8: 9000, + 9: 12000, 10: 15000, 11: 20000, 12: 25000, - 13: 40000, + 13: 35000, 14: 70000, - 15: 100000, - 16: 200000, + 15: 120000, + 16: 180000, 17: 250000, - 18: 250000, - 19: 500000, - 20: 750000, - 21: 1000000, - 22: 1500000, - 23: 2000000, - 24: 3000000, - 25: 4000000, - 26: 5000000, - 27: 6000000, - 28: 7000000, - 29: 8000000, - 30: 9000000, - 31: 10000000, - 32: 10000000, - 33: 10000000, - 34: 10000000, - 35: 10000000, - 36: 10000000, - 37: 10000000, - 38: 10000000, - 39: 10000000, - 40: 10000000, - 41: 10000000, - 42: 10000000, - 43: 10000000, - 44: 10000000, - 45: 10000000, - 46: 10000000 + 18: 350000, + 19: 600000, + 20: 850000, + 21: 1100000, + 22: 1400000, + 23: 1800000, + 24: 2200000, + 25: 2600000, + 26: 2600000, + 27: 2600000, + 28: 2600000, + 29: 2600000, + 30: 2600000, + 31: 2600000, + 32: 2600000, + 33: 2600000, + 34: 2600000, + 35: 2600000, + 36: 2600000, + 37: 2600000, + 38: 2600000, + 39: 2600000, + 40: 2600000, + 41: 2600000, + 42: 2600000, + 43: 2600000, + 44: 2600000, + 45: 2600000, + 46: 2600000 }; export const POTATO = { @@ -755,58 +758,58 @@ export const POTATO = { 2: 150, 3: 250, 4: 500, - 5: 1500, - 6: 2500, - 7: 5000, - 8: 7500, - 9: 10000, + 5: 1000, + 6: 2000, + 7: 4500, + 8: 9000, + 9: 12000, 10: 15000, 11: 20000, 12: 25000, - 13: 40000, + 13: 35000, 14: 70000, - 15: 100000, - 16: 200000, + 15: 120000, + 16: 180000, 17: 250000, - 18: 250000, - 19: 500000, - 20: 750000, - 21: 1000000, - 22: 1500000, - 23: 2000000, - 24: 3000000, - 25: 4000000, - 26: 5000000, - 27: 6000000, - 28: 7000000, - 29: 8000000, - 30: 9000000, - 31: 10000000, - 32: 10000000, - 33: 10000000, - 34: 10000000, - 35: 10000000, - 36: 10000000, - 37: 10000000, - 38: 10000000, - 39: 10000000, - 40: 10000000, - 41: 10000000, - 42: 10000000, - 43: 10000000, - 44: 10000000, - 45: 10000000, - 46: 10000000 + 18: 350000, + 19: 600000, + 20: 850000, + 21: 1100000, + 22: 1400000, + 23: 1800000, + 24: 2200000, + 25: 2600000, + 26: 2600000, + 27: 2600000, + 28: 2600000, + 29: 2600000, + 30: 2600000, + 31: 2600000, + 32: 2600000, + 33: 2600000, + 34: 2600000, + 35: 2600000, + 36: 2600000, + 37: 2600000, + 38: 2600000, + 39: 2600000, + 40: 2600000, + 41: 2600000, + 42: 2600000, + 43: 2600000, + 44: 2600000, + 45: 2600000, + 46: 2600000 }; export const MELON = { 1: 150, 2: 250, 3: 400, - 4: 850, - 5: 1650, - 6: 3350, - 7: 6650, + 4: 1000, + 5: 1750, + 6: 3500, + 7: 7500, 8: 12500, 9: 17500, 10: 25000, @@ -820,42 +823,42 @@ export const MELON = { 18: 500000, 19: 875000, 20: 1250000, - 21: 1750000, - 22: 2500000, - 23: 3750000, - 24: 5000000, - 25: 6500000, - 26: 8000000, - 27: 10000000, - 28: 11500000, - 29: 13000000, - 30: 15000000, - 31: 15000000, - 32: 15000000, - 33: 15000000, - 34: 15000000, - 35: 15000000, - 36: 15000000, - 37: 15000000, - 38: 15000000, - 39: 15000000, - 40: 15000000, - 41: 15000000, - 42: 15000000, - 43: 15000000, - 44: 15000000, - 45: 15000000, - 46: 15000000 + 21: 1875000, + 22: 2000000, + 23: 2250000, + 24: 3250000, + 25: 4000000, + 26: 4000000, + 27: 4000000, + 28: 4000000, + 29: 4000000, + 30: 4000000, + 31: 4000000, + 32: 4000000, + 33: 4000000, + 34: 4000000, + 35: 4000000, + 36: 4000000, + 37: 4000000, + 38: 4000000, + 39: 4000000, + 40: 4000000, + 41: 4000000, + 42: 4000000, + 43: 4000000, + 44: 4000000, + 45: 4000000, + 46: 4000000 }; export const PUMPKIN = { 1: 30, 2: 50, 3: 80, - 4: 170, - 5: 330, - 6: 670, - 7: 1330, + 4: 200, + 5: 350, + 6: 700, + 7: 1500, 8: 2500, 9: 3500, 10: 5000, @@ -869,42 +872,42 @@ export const PUMPKIN = { 18: 100000, 19: 175000, 20: 250000, - 21: 350000, - 22: 500000, - 23: 750000, - 24: 1000000, - 25: 1300000, - 26: 1600000, - 27: 2000000, - 28: 2300000, - 29: 2600000, - 30: 3000000, - 31: 3000000, - 32: 3000000, - 33: 3000000, - 34: 3000000, - 35: 3000000, - 36: 3000000, - 37: 3000000, - 38: 3000000, - 39: 3000000, - 40: 3000000, - 41: 3000000, - 42: 3000000, - 43: 3000000, - 44: 3000000, - 45: 3000000, - 46: 3000000 + 21: 375000, + 22: 400000, + 23: 450000, + 24: 650000, + 25: 800000, + 26: 800000, + 27: 800000, + 28: 800000, + 29: 800000, + 30: 800000, + 31: 800000, + 32: 800000, + 33: 800000, + 34: 800000, + 35: 800000, + 36: 800000, + 37: 800000, + 38: 800000, + 39: 800000, + 40: 800000, + 41: 800000, + 42: 800000, + 43: 800000, + 44: 800000, + 45: 800000, + 46: 800000 }; export const SUGAR_CANE = { 1: 60, 2: 100, 3: 160, - 4: 340, - 5: 660, - 6: 1340, - 7: 2660, + 4: 400, + 5: 700, + 6: 1400, + 7: 3000, 8: 5000, 9: 7000, 10: 10000, @@ -918,91 +921,91 @@ export const SUGAR_CANE = { 18: 200000, 19: 350000, 20: 500000, - 21: 700000, - 22: 1000000, - 23: 1500000, - 24: 2000000, - 25: 2600000, - 26: 3200000, - 27: 4000000, - 28: 4600000, - 29: 5200000, - 30: 6000000, - 31: 6000000, - 32: 6000000, - 33: 6000000, - 34: 6000000, - 35: 6000000, - 36: 6000000, - 37: 6000000, - 38: 6000000, - 39: 6000000, - 40: 6000000, - 41: 6000000, - 42: 6000000, - 43: 6000000, - 44: 6000000, - 45: 6000000, - 46: 6000000 + 21: 750000, + 22: 800000, + 23: 900000, + 24: 1300000, + 25: 1600000, + 26: 1600000, + 27: 1600000, + 28: 1600000, + 29: 1600000, + 30: 1600000, + 31: 1600000, + 32: 1600000, + 33: 1600000, + 34: 1600000, + 35: 1600000, + 36: 1600000, + 37: 1600000, + 38: 1600000, + 39: 1600000, + 40: 1600000, + 41: 1600000, + 42: 1600000, + 43: 1600000, + 44: 1600000, + 45: 1600000, + 46: 1600000 }; export const COCOA_BEANS = { 1: 90, 2: 150, - 3: 250, - 4: 500, - 5: 1000, - 6: 2000, - 7: 4000, + 3: 240, + 4: 600, + 5: 1050, + 6: 2100, + 7: 4500, 8: 7500, - 9: 10000, + 9: 10500, 10: 15000, - 11: 20000, - 12: 25000, + 11: 19500, + 12: 24000, 13: 30000, - 14: 50000, - 15: 100000, + 14: 60000, + 15: 105000, 16: 150000, - 17: 200000, + 17: 225000, 18: 300000, - 19: 500000, + 19: 525000, 20: 750000, - 21: 1000000, - 22: 1500000, - 23: 2000000, - 24: 3000000, - 25: 4000000, - 26: 5000000, - 27: 6000000, - 28: 7000000, - 29: 8000000, - 30: 9000000, - 31: 9000000, - 32: 9000000, - 33: 9000000, - 34: 9000000, - 35: 9000000, - 36: 9000000, - 37: 9000000, - 38: 9000000, - 39: 9000000, - 40: 9000000, - 41: 9000000, - 42: 9000000, - 43: 9000000, - 44: 9000000, - 45: 9000000, - 46: 9000000 + 21: 1125000, + 22: 1200000, + 23: 1350000, + 24: 1950000, + 25: 2400000, + 26: 2400000, + 27: 2400000, + 28: 2400000, + 29: 2400000, + 30: 2400000, + 31: 2400000, + 32: 2400000, + 33: 2400000, + 34: 2400000, + 35: 2400000, + 36: 2400000, + 37: 2400000, + 38: 2400000, + 39: 2400000, + 40: 2400000, + 41: 2400000, + 42: 2400000, + 43: 2400000, + 44: 2400000, + 45: 2400000, + 46: 2400000 }; export const CACTUS = { 1: 60, 2: 100, 3: 160, - 4: 340, - 5: 660, - 6: 1340, - 7: 2660, + 4: 400, + 5: 700, + 6: 1400, + 7: 3000, 8: 5000, 9: 7000, 10: 10000, @@ -1016,42 +1019,42 @@ export const CACTUS = { 18: 200000, 19: 350000, 20: 500000, - 21: 700000, - 22: 1000000, - 23: 1500000, - 24: 2000000, - 25: 2600000, - 26: 3200000, - 27: 4000000, - 28: 4600000, - 29: 5200000, - 30: 6000000, - 31: 6000000, - 32: 6000000, - 33: 6000000, - 34: 6000000, - 35: 6000000, - 36: 6000000, - 37: 6000000, - 38: 6000000, - 39: 6000000, - 40: 6000000, - 41: 6000000, - 42: 6000000, - 43: 6000000, - 44: 6000000, - 45: 6000000, - 46: 6000000 + 21: 750000, + 22: 800000, + 23: 900000, + 24: 1300000, + 25: 1600000, + 26: 1600000, + 27: 1600000, + 28: 1600000, + 29: 1600000, + 30: 1600000, + 31: 1600000, + 32: 1600000, + 33: 1600000, + 34: 1600000, + 35: 1600000, + 36: 1600000, + 37: 1600000, + 38: 1600000, + 39: 1600000, + 40: 1600000, + 41: 1600000, + 42: 1600000, + 43: 1600000, + 44: 1600000, + 45: 1600000, + 46: 1600000 }; export const MUSHROOM = { 1: 30, 2: 50, 3: 80, - 4: 170, - 5: 330, - 6: 670, - 7: 1330, + 4: 200, + 5: 350, + 6: 700, + 7: 1500, 8: 2500, 9: 3500, 10: 5000, @@ -1065,81 +1068,228 @@ export const MUSHROOM = { 18: 100000, 19: 175000, 20: 250000, - 21: 350000, - 22: 500000, - 23: 750000, - 24: 1000000, - 25: 1300000, - 26: 1600000, - 27: 2000000, - 28: 2300000, - 29: 2600000, - 30: 3000000, - 31: 3000000, - 32: 3000000, - 33: 3000000, - 34: 3000000, - 35: 3000000, - 36: 3000000, - 37: 3000000, - 38: 3000000, - 39: 3000000, - 40: 3000000, - 41: 3000000, - 42: 3000000, - 43: 3000000, - 44: 3000000, - 45: 3000000, - 46: 3000000 + 21: 375000, + 22: 400000, + 23: 450000, + 24: 650000, + 25: 800000, + 26: 800000, + 27: 800000, + 28: 800000, + 29: 800000, + 30: 800000, + 31: 800000, + 32: 800000, + 33: 800000, + 34: 800000, + 35: 800000, + 36: 800000, + 37: 800000, + 38: 800000, + 39: 800000, + 40: 800000, + 41: 800000, + 42: 800000, + 43: 800000, + 44: 800000, + 45: 800000, + 46: 800000 }; export const NETHER_WART = { 1: 90, 2: 150, - 3: 250, - 4: 500, - 5: 1000, - 6: 2000, - 7: 4000, + 3: 240, + 4: 600, + 5: 1050, + 6: 2100, + 7: 4500, 8: 7500, - 9: 10000, + 9: 10500, 10: 15000, - 11: 20000, - 12: 25000, + 11: 19500, + 12: 24000, 13: 30000, - 14: 50000, - 15: 100000, + 14: 60000, + 15: 105000, 16: 150000, - 17: 200000, + 17: 225000, 18: 300000, - 19: 500000, + 19: 525000, 20: 750000, - 21: 1000000, - 22: 1500000, - 23: 2000000, - 24: 3000000, - 25: 4000000, - 26: 5000000, - 27: 6000000, - 28: 7000000, - 29: 8000000, - 30: 9000000, - 31: 9000000, - 32: 9000000, - 33: 9000000, - 34: 9000000, - 35: 9000000, - 36: 9000000, - 37: 9000000, - 38: 9000000, - 39: 9000000, - 40: 9000000, - 41: 9000000, - 42: 9000000, - 43: 9000000, - 44: 9000000, - 45: 9000000, - 46: 9000000 + 21: 1125000, + 22: 1200000, + 23: 1350000, + 24: 1950000, + 25: 2400000, + 26: 2400000, + 27: 2400000, + 28: 2400000, + 29: 2400000, + 30: 2400000, + 31: 2400000, + 32: 2400000, + 33: 2400000, + 34: 2400000, + 35: 2400000, + 36: 2400000, + 37: 2400000, + 38: 2400000, + 39: 2400000, + 40: 2400000, + 41: 2400000, + 42: 2400000, + 43: 2400000, + 44: 2400000, + 45: 2400000, + 46: 2400000 +}; + +export const MOONFLOWER = { + 1: 30, + 2: 50, + 3: 80, + 4: 200, + 5: 700, + 6: 700, + 7: 1500, + 8: 2500, + 9: 3500, + 10: 5000, + 11: 6500, + 12: 8000, + 13: 10000, + 14: 20000, + 15: 35000, + 16: 50000, + 17: 75000, + 18: 100000, + 19: 175000, + 20: 250000, + 21: 375000, + 22: 400000, + 23: 450000, + 24: 650000, + 25: 800000, + 26: 800000, + 27: 800000, + 28: 800000, + 29: 800000, + 30: 800000, + 31: 800000, + 32: 800000, + 33: 800000, + 34: 800000, + 35: 800000, + 36: 800000, + 37: 800000, + 38: 800000, + 39: 800000, + 40: 800000, + 41: 800000, + 42: 800000, + 43: 800000, + 44: 800000, + 45: 800000, + 46: 800000 +}; + +export const SUNFLOWER = { + 1: 30, + 2: 50, + 3: 80, + 4: 200, + 5: 350, + 6: 700, + 7: 1500, + 8: 2500, + 9: 3500, + 10: 5000, + 11: 6500, + 12: 8000, + 13: 10000, + 14: 20000, + 15: 35000, + 16: 50000, + 17: 75000, + 18: 100000, + 19: 175000, + 20: 250000, + 21: 375000, + 22: 400000, + 23: 450000, + 24: 650000, + 25: 800000, + 26: 800000, + 27: 800000, + 28: 800000, + 29: 800000, + 30: 800000, + 31: 800000, + 32: 800000, + 33: 800000, + 34: 800000, + 35: 800000, + 36: 800000, + 37: 800000, + 38: 800000, + 39: 800000, + 40: 800000, + 41: 800000, + 42: 800000, + 43: 800000, + 44: 800000, + 45: 800000, + 46: 800000 +}; + +export const WILD_ROSE = { + 1: 60, + 2: 100, + 3: 160, + 4: 400, + 5: 700, + 6: 1400, + 7: 3000, + 8: 5000, + 9: 7000, + 10: 10000, + 11: 13000, + 12: 16000, + 13: 20000, + 14: 40000, + 15: 70000, + 16: 100000, + 17: 150000, + 18: 200000, + 19: 350000, + 20: 500000, + 21: 750000, + 22: 800000, + 23: 900000, + 24: 1300000, + 25: 1600000, + 26: 1600000, + 27: 1600000, + 28: 1600000, + 29: 1600000, + 30: 1600000, + 31: 1600000, + 32: 1600000, + 33: 1600000, + 34: 1600000, + 35: 1600000, + 36: 1600000, + 37: 1600000, + 38: 1600000, + 39: 1600000, + 40: 1600000, + 41: 1600000, + 42: 1600000, + 43: 1600000, + 44: 1600000, + 45: 1600000, + 46: 1600000 }; /* eslint-disable camelcase */ diff --git a/src/Utils/SkyBlockUtils.ts b/src/Utils/SkyBlockUtils.ts index 82f98e249..b5b53c255 100644 --- a/src/Utils/SkyBlockUtils.ts +++ b/src/Utils/SkyBlockUtils.ts @@ -10,6 +10,7 @@ import { HOTM_XP, INFINITE, MELON, + MOONFLOWER, MUSHROOM, NETHER_WART, POTATO, @@ -19,7 +20,9 @@ import { SLAYER_XP, SOCIAL_XP, SUGAR_CANE, + SUNFLOWER, WHEAT, + WILD_ROSE, petRarityOffset } from './Constants.js'; import { parse, simplify } from 'prismarine-nbt'; @@ -134,7 +137,10 @@ function getXpTable(type: SkyBlockXPTables): Record { cactus: CACTUS, cocoaBeans: COCOA_BEANS, mushroom: MUSHROOM, - netherWart: NETHER_WART + netherWart: NETHER_WART, + moonFlower: MOONFLOWER, + sunFlower: SUNFLOWER, + wildRose: WILD_ROSE }; return SKILL_TABLES[type] ?? DEFAULT_LEVELING_XP; From 202b78152b196c23b36ad56e3d9ae7405b09cbb6 Mon Sep 17 00:00:00 2001 From: Jacob Date: Sat, 20 Dec 2025 00:46:07 +0800 Subject: [PATCH 095/124] refactor(SkyWars) Signed-off-by: Jacob --- .../MiniGames/BedWars/BedWarsBeds.ts | 4 +- .../BedWars/BedWarsItemsPurchased.ts | 4 +- .../BedWarsKillsDeathsType.ts | 15 +- .../MiniGames/BedWars/BedWarsMode.ts | 4 +- .../BedWarsPrivateGameSettings.test.ts | 10 +- .../BedWars/BedWarsPrivateGameSettings.ts | 10 +- .../BedWars/BedWarsResourcesCollected.ts | 4 +- .../MiniGames/Shared/BaseKillDeathsType.ts | 14 + .../MiniGames/SkyWars/SkyWars.test.ts | 254 ++++++----- src/Structures/MiniGames/SkyWars/SkyWars.ts | 241 +++++----- .../MiniGames/SkyWars/SkyWarsHeads.test.ts | 51 +++ .../MiniGames/SkyWars/SkyWarsHeads.ts | 38 ++ .../SkyWars/SkyWarsKillsDeaths.test.ts | 28 ++ .../MiniGames/SkyWars/SkyWarsKillsDeaths.ts | 23 + .../SkyWars/SkyWarsKillsDeathsType.test.ts | 9 + .../SkyWars/SkyWarsKillsDeathsType.ts | 15 + .../MiniGames/SkyWars/SkyWarsKit.ts | 19 - .../MiniGames/SkyWars/SkyWarsKits.ts | 13 - .../SkyWarsKitsMythic.test.ts | 14 + .../SkyWarsKitsMythics/SkyWarsKitsMythic.ts | 16 + .../SkyWarsKitsMythics.test.ts | 31 ++ .../SkyWarsKitsMythics/SkyWarsKitsMythics.ts | 22 + .../SkyWars/SkyWarsMega/SkyWarsMega.test.ts | 75 ++++ .../SkyWars/SkyWarsMega/SkyWarsMega.ts | 53 +++ .../SkyWarsMega/SkyWarsMegaKits.test.ts | 58 +++ .../SkyWars/SkyWarsMega/SkyWarsMegaKits.ts | 40 ++ .../MiniGames/SkyWars/SkyWarsMini.test.ts | 13 + .../MiniGames/SkyWars/SkyWarsMini.ts | 11 + .../MiniGames/SkyWars/SkyWarsMode.test.ts | 27 -- .../MiniGames/SkyWars/SkyWarsMode.ts | 21 - .../SkyWars/SkyWarsMode/SkyWarsMode.test.ts | 89 ++++ .../SkyWars/SkyWarsMode/SkyWarsMode.ts | 65 +++ .../SkyWarsMode/SkyWarsModePerk.test.ts | 14 + .../SkyWars/SkyWarsMode/SkyWarsModePerk.ts | 16 + .../SkyWars/SkyWarsModeStats.test.ts | 88 ---- .../MiniGames/SkyWars/SkyWarsModeStats.ts | 62 --- .../MiniGames/SkyWars/SkyWarsPackages.test.ts | 19 - .../MiniGames/SkyWars/SkyWarsPackages.ts | 26 -- .../SkyWars/SkyWarsPrivateGames.test.ts | 36 ++ .../MiniGames/SkyWars/SkyWarsPrivateGames.ts | 34 ++ .../SkyWarsRanked/SkyWarsRanked.test.ts | 17 + .../SkyWars/SkyWarsRanked/SkyWarsRanked.ts | 14 + .../SkyWarsRanked/SkyWarsRankedKits.test.ts | 46 ++ .../SkyWarsRanked/SkyWarsRankedKits.ts | 32 ++ .../SkyWars/SkyWarsSolo/SkyWarsSolo.test.ts | 96 ++++ .../SkyWars/SkyWarsSolo/SkyWarsSolo.ts | 67 +++ .../SkyWarsSoloKits/SkyWarsSoloKits.test.ts | 33 ++ .../SkyWarsSoloKits/SkyWarsSoloKits.ts | 25 ++ .../SkyWarsSoloKitsAdvanced.test.ts | 61 +++ .../SkyWarsSoloKitsAdvanced.ts | 42 ++ .../SkyWarsSoloKitsBasic.test.ts | 76 ++++ .../SkyWarsSoloKits/SkyWarsSoloKitsBasic.ts | 52 +++ .../SkyWarsSoloKitsLab.test.ts | 21 + .../SkyWarsSoloKitsLab/SkyWarsSoloKitsLab.ts | 16 + .../SkyWarsSoloKitsLabAdvanced.test.ts | 58 +++ .../SkyWarsSoloKitsLabAdvanced.ts | 40 ++ .../SkyWarsSoloKitsLabBasic.test.ts | 61 +++ .../SkyWarsSoloKitsLabBasic.ts | 42 ++ .../SkyWarsSoloKitsMini.test.ts | 43 ++ .../SkyWarsSoloKits/SkyWarsSoloKitsMini.ts | 30 ++ .../SkyWarsSoloKitsTourney.test.ts | 21 + .../SkyWarsSoloKitsTourney.ts | 16 + .../SkyWarsSoloKitsTourneyAdvanced.test.ts | 49 ++ .../SkyWarsSoloKitsTourneyAdvanced.ts | 34 ++ .../SkyWarsSoloKitsTourneyBasic.test.ts | 70 +++ .../SkyWarsSoloKitsTourneyBasic.ts | 48 ++ .../SkyWars/SkyWarsTeams/SkyWarsTeams.test.ts | 90 ++++ .../SkyWars/SkyWarsTeams/SkyWarsTeams.ts | 63 +++ .../SkyWarsTeamsKits/SkyWarsTeamsKits.test.ts | 29 ++ .../SkyWarsTeamsKits/SkyWarsTeamsKits.ts | 22 + .../SkyWarsTeamsKitsAttacking.test.ts | 67 +++ .../SkyWarsTeamsKitsAttacking.ts | 46 ++ .../SkyWarsTeamsKitsDefending.test.ts | 37 ++ .../SkyWarsTeamsKitsDefending.ts | 26 ++ .../SkyWarsTeamsKitsMining.test.ts | 22 + .../SkyWarsTeamsKitsMining.ts | 16 + .../SkyWarsTeamsKitsSupporting.test.ts | 43 ++ .../SkyWarsTeamsKitsSupporting.ts | 30 ++ src/Types/Player.ts | 419 ++++++++++++++---- src/Utils/ParseBedWarsMode.ts | 3 - src/Utils/ParseMode.ts | 11 + src/index.ts | 106 ++++- 82 files changed, 3047 insertions(+), 679 deletions(-) create mode 100644 src/Structures/MiniGames/Shared/BaseKillDeathsType.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsHeads.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsHeads.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsKillsDeaths.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsKillsDeaths.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsKillsDeathsType.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsKillsDeathsType.ts delete mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsKit.ts delete mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsKits.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsKitsMythics/SkyWarsKitsMythic.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsKitsMythics/SkyWarsKitsMythic.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsKitsMythics/SkyWarsKitsMythics.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsKitsMythics/SkyWarsKitsMythics.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMega.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMega.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMegaKits.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMegaKits.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsMini.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsMini.ts delete mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsMode.test.ts delete mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsMode.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsMode/SkyWarsMode.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsMode/SkyWarsMode.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsMode/SkyWarsModePerk.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsMode/SkyWarsModePerk.ts delete mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsModeStats.test.ts delete mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsModeStats.ts delete mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsPackages.test.ts delete mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsPackages.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsPrivateGames.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsPrivateGames.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRanked.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRanked.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRankedKits.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRankedKits.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSolo.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSolo.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKits.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKits.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsAdvanced.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsAdvanced.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsBasic.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsBasic.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLab.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLab.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabAdvanced.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabAdvanced.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabBasic.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabBasic.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsMini.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsMini.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourney.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourney.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyAdvanced.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyAdvanced.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyBasic.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyBasic.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeams.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeams.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKits.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKits.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsAttacking.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsAttacking.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsDefending.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsDefending.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsMining.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsMining.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsSupporting.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsSupporting.ts delete mode 100644 src/Utils/ParseBedWarsMode.ts create mode 100644 src/Utils/ParseMode.ts diff --git a/src/Structures/MiniGames/BedWars/BedWarsBeds.ts b/src/Structures/MiniGames/BedWars/BedWarsBeds.ts index 57c446de4..39d8bdf90 100644 --- a/src/Structures/MiniGames/BedWars/BedWarsBeds.ts +++ b/src/Structures/MiniGames/BedWars/BedWarsBeds.ts @@ -1,5 +1,5 @@ import Divide from '../../../Utils/Divide.js'; -import ParseBedWarsMode from '../../../Utils/ParseBedWarsMode.js'; +import { ParseModeBefore } from '../../../Utils/ParseMode.ts'; import type { BedWarsModeId } from '../../../Types/Player.js'; class BedWarsBeds { @@ -7,7 +7,7 @@ class BedWarsBeds { lost: number; ratio: number; constructor(data: Record, mode?: BedWarsModeId) { - mode = ParseBedWarsMode(mode) as BedWarsModeId; + mode = ParseModeBefore(mode) as BedWarsModeId; this.broken = data?.[`${mode}beds_broken_bedwars`] || 0; this.lost = data?.[`${mode}beds_lost_bedwars`] || 0; this.ratio = Divide(this.broken, this.lost); diff --git a/src/Structures/MiniGames/BedWars/BedWarsItemsPurchased.ts b/src/Structures/MiniGames/BedWars/BedWarsItemsPurchased.ts index 5b0145f67..94870dd42 100644 --- a/src/Structures/MiniGames/BedWars/BedWarsItemsPurchased.ts +++ b/src/Structures/MiniGames/BedWars/BedWarsItemsPurchased.ts @@ -1,10 +1,10 @@ -import ParseBedWarsMode from '../../../Utils/ParseBedWarsMode.js'; +import { ParseModeBefore } from '../../../Utils/ParseMode.ts'; class BedWarsItemsPurchased { itemsPurchased: number; permanentItemsPurchased: number; constructor(data: Record, mode?: string) { - mode = ParseBedWarsMode(mode); + mode = ParseModeBefore(mode); this.itemsPurchased = data?.[`${mode}items_purchased_bedwars`] || 0; this.permanentItemsPurchased = data?.[`${mode}permanent_items_purchased_bedwars`] || 0; } diff --git a/src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeathsType.ts b/src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeathsType.ts index 0fcd2e555..50749ea9b 100644 --- a/src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeathsType.ts +++ b/src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeathsType.ts @@ -1,17 +1,14 @@ -import Divide from '../../../../Utils/Divide.js'; -import ParseBedWarsMode from '../../../../Utils/ParseBedWarsMode.js'; +import BaseKillsDeathsType from '../../Shared/BaseKillDeathsType.ts'; +import { ParseModeBefore } from '../../../../Utils/ParseMode.ts'; import type { BedWarsFinalType, BedWarsModeId } from '../../../../Types/Player.js'; -class BedWarsKillsDeathsType { - kills: number; - deaths: number; - ratio: number; +class BedWarsKillsDeathsType extends BaseKillsDeathsType { constructor(data: Record, type?: BedWarsFinalType, mode?: BedWarsModeId, finals: boolean = false) { - type = ParseBedWarsMode(type) as BedWarsFinalType; - mode = ParseBedWarsMode(mode) as BedWarsModeId; + type = ParseModeBefore(type) as BedWarsFinalType; + mode = ParseModeBefore(mode) as BedWarsModeId; + super(data); this.kills = data?.[`${mode}${type}${finals ? 'final_' : ''}kills_bedwars`] || 0; this.deaths = data?.[`${mode}${type}${finals ? 'final_' : ''}deaths_bedwars`] || 0; - this.ratio = Divide(this.kills, this.deaths); } } diff --git a/src/Structures/MiniGames/BedWars/BedWarsMode.ts b/src/Structures/MiniGames/BedWars/BedWarsMode.ts index d59b93028..383181fa4 100644 --- a/src/Structures/MiniGames/BedWars/BedWarsMode.ts +++ b/src/Structures/MiniGames/BedWars/BedWarsMode.ts @@ -2,7 +2,7 @@ import BedWarsBeds from './BedWarsBeds.js'; import BedWarsKillsDeaths from './BedWarsKillsDeaths/BedWarsKillsDeaths.js'; import BedWarsResourcesCollected from './BedWarsResourcesCollected.js'; import Divide from '../../../Utils/Divide.js'; -import ParseBedWarsMode from '../../../Utils/ParseBedWarsMode.js'; +import { ParseModeBefore } from '../../../Utils/ParseMode.ts'; import type { BedWarsModeId } from '../../../Types/Player.js'; class BedWarsMode { @@ -16,7 +16,7 @@ class BedWarsMode { winLossRatio: number; gamesPlayed: number; constructor(data: Record, mode?: BedWarsModeId) { - mode = ParseBedWarsMode(mode) as BedWarsModeId; + mode = ParseModeBefore(mode) as BedWarsModeId; this.resourcesCollected = new BedWarsResourcesCollected(data, mode); this.kills = new BedWarsKillsDeaths(data, mode); this.finals = new BedWarsKillsDeaths(data, mode, true); diff --git a/src/Structures/MiniGames/BedWars/BedWarsPrivateGameSettings.test.ts b/src/Structures/MiniGames/BedWars/BedWarsPrivateGameSettings.test.ts index e70da05b2..50f413fac 100644 --- a/src/Structures/MiniGames/BedWars/BedWarsPrivateGameSettings.test.ts +++ b/src/Structures/MiniGames/BedWars/BedWarsPrivateGameSettings.test.ts @@ -2,9 +2,9 @@ import BedWarsPrivateGameSettings from './BedWarsPrivateGameSettings.js'; import { expect, expectTypeOf, test } from 'vitest'; import type { BedWarsPrivateGameSettingsEventTime, - BedWarsPrivateGameSettingsGameSpeed, - BedWarsPrivateGameSettingsHealthBuff, - BedWarsPrivateGameSettingsRespawnTime + BedWarsPrivateGameSettingsRespawnTime, + PrivateGameSettingsGameSpeed, + PrivateGameSettingsHealthBuff } from '../../../Types/Player.js'; test('BedWarsPrivateGameSettings', () => { @@ -19,7 +19,7 @@ test('BedWarsPrivateGameSettings', () => { expect(data.eventTime).toBeDefined(); expectTypeOf(data.eventTime).toEqualTypeOf(); expect(data.healthBuff).toBeDefined(); - expectTypeOf(data.healthBuff).toEqualTypeOf(); + expectTypeOf(data.healthBuff).toEqualTypeOf(); expect(data.lowGravity).toBeDefined(); expectTypeOf(data.lowGravity).toEqualTypeOf(); expect(data.maxTeamUpgrades).toBeDefined(); @@ -33,5 +33,5 @@ test('BedWarsPrivateGameSettings', () => { expect(data.respawnTime).toBeDefined(); expectTypeOf(data.respawnTime).toEqualTypeOf(); expect(data.speed).toBeDefined(); - expectTypeOf(data.speed).toEqualTypeOf(); + expectTypeOf(data.speed).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/BedWars/BedWarsPrivateGameSettings.ts b/src/Structures/MiniGames/BedWars/BedWarsPrivateGameSettings.ts index d1428e2ab..38512cbdc 100644 --- a/src/Structures/MiniGames/BedWars/BedWarsPrivateGameSettings.ts +++ b/src/Structures/MiniGames/BedWars/BedWarsPrivateGameSettings.ts @@ -1,22 +1,22 @@ import type { BedWarsPrivateGameSettingsEventTime, - BedWarsPrivateGameSettingsGameSpeed, - BedWarsPrivateGameSettingsHealthBuff, - BedWarsPrivateGameSettingsRespawnTime + BedWarsPrivateGameSettingsRespawnTime, + PrivateGameSettingsGameSpeed, + PrivateGameSettingsHealthBuff } from '../../../Types/Player.js'; class BedWarsPrivateGameSettings { bedInstaBreak: boolean; disableBlockProtection: boolean; eventTime: BedWarsPrivateGameSettingsEventTime; - healthBuff: BedWarsPrivateGameSettingsHealthBuff; + healthBuff: PrivateGameSettingsHealthBuff; lowGravity: boolean; maxTeamUpgrades: boolean; noDiamonds: boolean; noEmeralds: boolean; oneHitOneKill: boolean; respawnTime: BedWarsPrivateGameSettingsRespawnTime; - speed: BedWarsPrivateGameSettingsGameSpeed; + speed: PrivateGameSettingsGameSpeed; constructor(data: Record) { this.bedInstaBreak = data?.bed_instabreak || false; this.disableBlockProtection = data?.disable_block_protection || false; diff --git a/src/Structures/MiniGames/BedWars/BedWarsResourcesCollected.ts b/src/Structures/MiniGames/BedWars/BedWarsResourcesCollected.ts index 47041370b..a30c04e95 100644 --- a/src/Structures/MiniGames/BedWars/BedWarsResourcesCollected.ts +++ b/src/Structures/MiniGames/BedWars/BedWarsResourcesCollected.ts @@ -1,5 +1,5 @@ import BedWarsItemsPurchased from './BedWarsItemsPurchased.js'; -import ParseBedWarsMode from '../../../Utils/ParseBedWarsMode.js'; +import { ParseModeBefore } from '../../../Utils/ParseMode.ts'; import type { BedWarsModeId } from '../../../Types/Player.js'; class BedWarsResourcesCollected { @@ -12,7 +12,7 @@ class BedWarsResourcesCollected { bed: number; itemsPurchased: BedWarsItemsPurchased; constructor(data: Record, mode?: BedWarsModeId) { - mode = ParseBedWarsMode(mode) as BedWarsModeId; + mode = ParseModeBefore(mode) as BedWarsModeId; this.total = data?.[`${mode}resources_collected_bedwars`] || 0; this.emerald = data?.[`${mode}emerald_resources_collected_bedwars`] || 0; this.diamond = data?.[`${mode}diamond_resources_collected_bedwars`] || 0; diff --git a/src/Structures/MiniGames/Shared/BaseKillDeathsType.ts b/src/Structures/MiniGames/Shared/BaseKillDeathsType.ts new file mode 100644 index 000000000..d9c3879b4 --- /dev/null +++ b/src/Structures/MiniGames/Shared/BaseKillDeathsType.ts @@ -0,0 +1,14 @@ +import Divide from '../../../Utils/Divide.ts'; + +class BaseKillsDeathsType { + kills: number; + deaths: number; + ratio: number; + constructor(data: Record) { + this.kills = data?.kills || 0; + this.deaths = data?.deaths || 0; + this.ratio = Divide(this.kills, this.deaths); + } +} + +export default BaseKillsDeathsType; diff --git a/src/Structures/MiniGames/SkyWars/SkyWars.test.ts b/src/Structures/MiniGames/SkyWars/SkyWars.test.ts index a3cc4443e..bc1bd9732 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWars.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWars.test.ts @@ -1,148 +1,146 @@ import SkyWars from './SkyWars.js'; -import SkyWarsMode from './SkyWarsMode.js'; -import SkyWarsModeStats from './SkyWarsModeStats.js'; -import SkyWarsPackages from './SkyWarsPackages.js'; +import SkyWarsKitsMythics from './SkyWarsKitsMythics/SkyWarsKitsMythics.js'; +import SkyWarsMega from './SkyWarsMega/SkyWarsMega.js'; +import SkyWarsMini from './SkyWarsMini.js'; +import SkyWarsPrivateGames from './SkyWarsPrivateGames.js'; +import SkyWarsSolo from './SkyWarsSolo/SkyWarsSolo.js'; +import SkyWarsTeams from './SkyWarsTeams/SkyWarsTeams.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type { SkyWarsPrestige } from '../../../Types/Player.js'; +import type { ShopSort } from '../../../Types/Player.js'; test('SkyWars', () => { const data = new SkyWars({ stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyWars); expectTypeOf(data).toEqualTypeOf(); + expect(data.activeKillEffect).toBeDefined(); + expectTypeOf(data.activeKillEffect).toEqualTypeOf(); + expect(data.activeVictoryDance).toBeDefined(); + expectTypeOf(data.activeVictoryDance).toEqualTypeOf(); + expect(data.activeKillMessages).toBeDefined(); + expectTypeOf(data.activeKillMessages).toEqualTypeOf(); + expect(data.activeDeathCry).toBeDefined(); + expectTypeOf(data.activeDeathCry).toEqualTypeOf(); + expect(data.activeBalloon).toBeDefined(); + expectTypeOf(data.activeBalloon).toEqualTypeOf(); + expect(data.activeCage).toBeDefined(); + expectTypeOf(data.activeCage).toEqualTypeOf(); + expect(data.activeSprays).toBeDefined(); + expectTypeOf(data.activeSprays).toEqualTypeOf(); + expect(data.activeProjectileTrail).toBeDefined(); + expectTypeOf(data.activeProjectileTrail).toEqualTypeOf(); + expect(data.shopSort).toBeDefined(); + expectTypeOf(data.shopSort).toEqualTypeOf(); expect(data.coins).toBeDefined(); expect(data.coins).toBeGreaterThanOrEqual(0); expectTypeOf(data.coins).toEqualTypeOf(); - expect(data.souls).toBeDefined(); - expect(data.souls).toBeGreaterThanOrEqual(0); - expectTypeOf(data.souls).toEqualTypeOf(); expect(data.tokens).toBeDefined(); expect(data.tokens).toBeGreaterThanOrEqual(0); expectTypeOf(data.tokens).toEqualTypeOf(); - expect(data.experience).toBeDefined(); - expect(data.experience).toBeGreaterThanOrEqual(0); - expectTypeOf(data.experience).toEqualTypeOf(); - expect(data.level).toBeDefined(); - expect(data.level).toBeGreaterThanOrEqual(0); - expectTypeOf(data.level).toEqualTypeOf(); - expect(data.levelProgress).toBeDefined(); - expectTypeOf(data.levelProgress).toEqualTypeOf(); - expect(data.levelFormatted).toBeDefined(); - expectTypeOf(data.levelFormatted).toEqualTypeOf(); - expect(data.prestige).toBeDefined(); - expectTypeOf(data.prestige).toEqualTypeOf(); - expect(data.opals).toBeDefined(); - expect(data.opals).toBeGreaterThanOrEqual(0); - expectTypeOf(data.opals).toEqualTypeOf(); - expect(data.avarice).toBeDefined(); - expect(data.avarice).toBeGreaterThanOrEqual(0); - expectTypeOf(data.avarice).toEqualTypeOf(); - expect(data.tenacity).toBeDefined(); - expect(data.tenacity).toBeGreaterThanOrEqual(0); - expectTypeOf(data.tenacity).toEqualTypeOf(); - expect(data.shards).toBeDefined(); - expect(data.shards).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shards).toEqualTypeOf(); + expect(data.xp).toBeDefined(); + expect(data.xp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.xp).toEqualTypeOf(); + expect(data.mythicalKits).toBeDefined(); + expect(data.mythicalKits).toBeInstanceOf(SkyWarsKitsMythics); + expectTypeOf(data.mythicalKits).toEqualTypeOf(); + expect(data.selectedPrestigeIcon).toBeDefined(); + expectTypeOf(data.selectedPrestigeIcon).toEqualTypeOf(); expect(data.angelOfDeathLevel).toBeDefined(); expect(data.angelOfDeathLevel).toBeGreaterThanOrEqual(0); expectTypeOf(data.angelOfDeathLevel).toEqualTypeOf(); - expect(data.killStreak).toBeDefined(); - expect(data.killStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.killStreak).toEqualTypeOf(); - expect(data.kills).toBeDefined(); - expect(data.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.kills).toEqualTypeOf(); - expect(data.voidKills).toBeDefined(); - expect(data.voidKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.voidKills).toEqualTypeOf(); - expect(data.meleeKills).toBeDefined(); - expect(data.meleeKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.meleeKills).toEqualTypeOf(); - expect(data.bowKills).toBeDefined(); - expect(data.bowKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowKills).toEqualTypeOf(); - expect(data.mobKills).toBeDefined(); - expect(data.mobKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.mobKills).toEqualTypeOf(); - expect(data.assists).toBeDefined(); - expect(data.assists).toBeGreaterThanOrEqual(0); - expectTypeOf(data.assists).toEqualTypeOf(); - expect(data.deaths).toBeDefined(); - expect(data.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.deaths).toEqualTypeOf(); - expect(data.KDR).toBeDefined(); - expect(data.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.KDR).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.losses).toBeDefined(); - expect(data.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.losses).toEqualTypeOf(); - expect(data.WLR).toBeDefined(); - expect(data.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.WLR).toEqualTypeOf(); - expect(data.gamesPlayed).toBeDefined(); - expect(data.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.gamesPlayed).toEqualTypeOf(); - expect(data.survivedPlayers).toBeDefined(); - expect(data.survivedPlayers).toBeGreaterThanOrEqual(0); - expectTypeOf(data.survivedPlayers).toEqualTypeOf(); - expect(data.chestsOpened).toBeDefined(); - expect(data.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.chestsOpened).toEqualTypeOf(); - expect(data.timePlayed).toBeDefined(); - expect(data.timePlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.timePlayed).toEqualTypeOf(); - expect(data.shard).toBeDefined(); - expect(data.shard).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shard).toEqualTypeOf(); - expect(data.longestBowShot).toBeDefined(); - expect(data.longestBowShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.longestBowShot).toEqualTypeOf(); - expect(data.arrowsShot).toBeDefined(); - expect(data.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arrowsShot).toEqualTypeOf(); - expect(data.arrowsHit).toBeDefined(); - expect(data.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arrowsHit).toEqualTypeOf(); - expect(data.bowAccuracy).toBeDefined(); - expect(data.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowAccuracy).toEqualTypeOf(); - expect(data.fastestWin).toBeDefined(); - expect(data.fastestWin).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fastestWin).toEqualTypeOf(); - expect(data.heads).toBeDefined(); - expect(data.heads).toBeGreaterThanOrEqual(0); - expectTypeOf(data.heads).toEqualTypeOf(); - expect(data.blocksPlaced).toBeDefined(); - expect(data.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blocksPlaced).toEqualTypeOf(); - expect(data.blocksBroken).toBeDefined(); - expect(data.blocksBroken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blocksBroken).toEqualTypeOf(); - expect(data.eggThrown).toBeDefined(); - expect(data.eggThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.eggThrown).toEqualTypeOf(); - expect(data.enderpearlsThrown).toBeDefined(); - expect(data.enderpearlsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.enderpearlsThrown).toEqualTypeOf(); + expect(data.quits).toBeDefined(); + expect(data.quits).toBeGreaterThanOrEqual(0); + expectTypeOf(data.quits).toEqualTypeOf(); + expect(data.souls).toBeDefined(); + expect(data.souls).toBeGreaterThanOrEqual(0); + expectTypeOf(data.souls).toEqualTypeOf(); + expect(data.soulWell).toBeDefined(); + expect(data.soulWell).toBeGreaterThanOrEqual(0); + expectTypeOf(data.soulWell).toEqualTypeOf(); + expect(data.soulsGathered).toBeDefined(); + expect(data.soulsGathered).toBeGreaterThanOrEqual(0); + expectTypeOf(data.soulsGathered).toEqualTypeOf(); + expect(data.paidSouls).toBeDefined(); + expect(data.paidSouls).toBeGreaterThanOrEqual(0); + expectTypeOf(data.paidSouls).toEqualTypeOf(); + expect(data.soulWellRares).toBeDefined(); + expect(data.soulWellRares).toBeGreaterThanOrEqual(0); + expectTypeOf(data.soulWellRares).toEqualTypeOf(); + expect(data.soulWellLegendaries).toBeDefined(); + expect(data.soulWellLegendaries).toBeGreaterThanOrEqual(0); + expectTypeOf(data.soulWellLegendaries).toEqualTypeOf(); + expect(data.refillChestDestroy).toBeDefined(); + expect(data.refillChestDestroy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.refillChestDestroy).toEqualTypeOf(); + expect(data.harvestingSeason).toBeDefined(); + expect(data.harvestingSeason).toBeGreaterThanOrEqual(0); + expectTypeOf(data.harvestingSeason).toEqualTypeOf(); + expect(data.xezbethLuck).toBeDefined(); + expect(data.xezbethLuck).toBeGreaterThanOrEqual(0); + expectTypeOf(data.xezbethLuck).toEqualTypeOf(); + expect(data.extraWheels).toBeDefined(); + expect(data.extraWheels).toBeGreaterThanOrEqual(0); + expectTypeOf(data.extraWheels).toEqualTypeOf(); + expect(data.weeklyKills).toBeDefined(); + expect(data.weeklyKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.weeklyKills).toEqualTypeOf(); + expect(data.weeklyKillsA).toBeDefined(); + expect(data.weeklyKillsA).toBeGreaterThanOrEqual(0); + expectTypeOf(data.weeklyKillsA).toEqualTypeOf(); + expect(data.weeklyKillsB).toBeDefined(); + expect(data.weeklyKillsB).toBeGreaterThanOrEqual(0); + expectTypeOf(data.weeklyKillsB).toEqualTypeOf(); + expect(data.monthlyKills).toBeDefined(); + expect(data.monthlyKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.monthlyKills).toEqualTypeOf(); + expect(data.monthlyKillsA).toBeDefined(); + expect(data.monthlyKillsA).toBeGreaterThanOrEqual(0); + expectTypeOf(data.monthlyKillsA).toEqualTypeOf(); + expect(data.monthlyKillsB).toBeDefined(); + expect(data.monthlyKillsB).toBeGreaterThanOrEqual(0); + expectTypeOf(data.monthlyKillsB).toEqualTypeOf(); + expect(data.quickjoinUsesTotal).toBeDefined(); + expect(data.quickjoinUsesTotal).toBeGreaterThanOrEqual(0); + expectTypeOf(data.quickjoinUsesTotal).toEqualTypeOf(); + expect(data.quickjoinUsesRandom).toBeDefined(); + expect(data.quickjoinUsesRandom).toBeGreaterThanOrEqual(0); + expectTypeOf(data.quickjoinUsesRandom).toEqualTypeOf(); + expect(data.chests).toBeDefined(); + expect(data.chests).toBeGreaterThanOrEqual(0); + expectTypeOf(data.chests).toEqualTypeOf(); + expect(data.chestHistory).toBeDefined(); + expectTypeOf(data.chestHistory).toEqualTypeOf(); + expect(data.goldenBoxes).toBeDefined(); + expect(data.goldenBoxes).toBeGreaterThanOrEqual(0); + expectTypeOf(data.goldenBoxes).toEqualTypeOf(); + expect(data.halloweenBoxes).toBeDefined(); + expect(data.halloweenBoxes).toBeGreaterThanOrEqual(0); + expectTypeOf(data.halloweenBoxes).toEqualTypeOf(); + expect(data.christmasBoxes).toBeDefined(); + expect(data.christmasBoxes).toBeGreaterThanOrEqual(0); + expectTypeOf(data.christmasBoxes).toEqualTypeOf(); + expect(data.lunarBoxes).toBeDefined(); + expect(data.lunarBoxes).toBeGreaterThanOrEqual(0); + expectTypeOf(data.lunarBoxes).toEqualTypeOf(); + expect(data.easterBoxes).toBeDefined(); + expect(data.easterBoxes).toBeGreaterThanOrEqual(0); + expectTypeOf(data.easterBoxes).toEqualTypeOf(); + expect(data.beastChance).toBeDefined(); + expect(data.beastChance).toBeGreaterThanOrEqual(0); + expectTypeOf(data.beastChance).toEqualTypeOf(); + expect(data.privateGamesSettings).toBeDefined(); + expect(data.privateGamesSettings).toBeInstanceOf(SkyWarsPrivateGames); + expectTypeOf(data.privateGamesSettings).toEqualTypeOf(); expect(data.solo).toBeDefined(); - expect(data.solo).toBeInstanceOf(SkyWarsModeStats); - expectTypeOf(data.solo).toEqualTypeOf(); - expect(data.team).toBeDefined(); - expect(data.team).toBeInstanceOf(SkyWarsModeStats); - expectTypeOf(data.team).toEqualTypeOf(); + expect(data.solo).toBeInstanceOf(SkyWarsSolo); + expectTypeOf(data.solo).toEqualTypeOf(); + expect(data.teams).toBeDefined(); + expect(data.teams).toBeInstanceOf(SkyWarsTeams); + expectTypeOf(data.teams).toEqualTypeOf(); expect(data.mega).toBeDefined(); - expect(data.mega).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.mega).toEqualTypeOf(); - expect(data.megaDoubles).toBeDefined(); - expect(data.megaDoubles).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.megaDoubles).toEqualTypeOf(); - expect(data.lab).toBeDefined(); - expect(data.lab).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.lab).toEqualTypeOf(); - expect(data.packages).toBeDefined(); - expect(data.packages).toBeInstanceOf(SkyWarsPackages); - expectTypeOf(data.packages).toEqualTypeOf(); + expect(data.mega).toBeInstanceOf(SkyWarsMega); + expectTypeOf(data.mega).toEqualTypeOf(); + expect(data.mini).toBeDefined(); + expect(data.mini).toBeInstanceOf(SkyWarsMini); + expectTypeOf(data.mini).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/SkyWars/SkyWars.ts b/src/Structures/MiniGames/SkyWars/SkyWars.ts index 025ac860b..6ae002689 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWars.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWars.ts @@ -1,152 +1,111 @@ -import Divide from '../../../Utils/Divide.js'; -import SkyWarsMode from './SkyWarsMode.js'; -import SkyWarsModeStats from './SkyWarsModeStats.js'; -import SkyWarsPackages from './SkyWarsPackages.js'; -import type { SkyWarsPrestige } from '../../../Types/Player.js'; +import SkyWarsKitsMythics from './SkyWarsKitsMythics/SkyWarsKitsMythics.ts'; +import SkyWarsMega from './SkyWarsMega/SkyWarsMega.ts'; +import SkyWarsMini from './SkyWarsMini.ts'; +import SkyWarsMode from './SkyWarsMode/SkyWarsMode.ts'; +import SkyWarsPrivateGames from './SkyWarsPrivateGames.ts'; +import SkyWarsSolo from './SkyWarsSolo/SkyWarsSolo.ts'; +import SkyWarsTeams from './SkyWarsTeams/SkyWarsTeams.js'; +import { weekAB } from '../../../Utils/Oscillation.ts'; +import type { ShopSort } from '../../../Types/Player.ts'; -function getSkyWarsPrestige(level: number): SkyWarsPrestige { - if (level >= 60) return 'Mythic'; - return (['Iron', 'Iron', 'Gold', 'Diamond', 'Emerald', 'Sapphire', 'Ruby', 'Crystal', 'Opal', 'Amethyst', 'Rainbow'][ - Math.floor(level / 5) - ] || 'Iron') as SkyWarsPrestige; -} - -function getSkyWarsLevel(xp: number): number { - const totalXp = [0, 2, 7, 15, 25, 50, 100, 200, 350, 600, 1000, 1500]; - if (xp === 0) return 0; - if (xp >= 15000) return Math.floor((xp - 15000) / 10000 + 12); - const level = totalXp.findIndex((x) => x * 10 - xp > 0); - return level === -1 ? 0 : level; -} - -function getSkyWarsLevelProgress(xp: number) { - const totalXp: number[] = [0, 2, 7, 15, 25, 50, 100, 200, 350, 600, 1000, 1500]; - const xpToNextLvl: number[] = [0, 2, 5, 8, 10, 25, 50, 100, 150, 250, 400, 500]; - let percent; - let xpToNextLevel; - let currentLevelXp = xp; - if (xp >= 15000) { - currentLevelXp -= 15000; - if (currentLevelXp === 0) return { currentLevelXp: 0, xpToNextLevel: 10000, percent: 0, xpNextLevel: 10000 }; - if (currentLevelXp > 10000) { - do { - currentLevelXp -= 10000; - } while (currentLevelXp >= 10000); - } - xpToNextLevel = 10000 - currentLevelXp; - percent = Math.round(currentLevelXp) / 100; - const percentRemaining = Math.round((100 - percent) * 100) / 100; - return { currentLevelXp, xpToNextLevel, percent, xpNextLevel: 10000, percentRemaining }; - } - const totalXpToNextLevel = (xpToNextLvl?.[totalXp.findIndex((x) => x * 10 - xp > 0)] || 0) * 10; - for (let i = 0; i < xpToNextLvl.length; i++) { - if (currentLevelXp - (xpToNextLvl?.[i] || 0) * 10 < 0) break; - currentLevelXp -= (xpToNextLvl?.[i] || 0) * 10; - } - xpToNextLevel = totalXpToNextLevel - currentLevelXp; - percent = Math.round((currentLevelXp / totalXpToNextLevel) * 10000) / 100; - return { currentLevelXp, xpToNextLevel, percent, xpNextLevel: totalXpToNextLevel }; -} - -class SkyWars { +class SkyWars extends SkyWarsMode { + activeKillEffect: string | 'UNKNOWN'; + activeVictoryDance: string | 'UNKNOWN'; + activeKillMessages: string | 'UNKNOWN'; + activeDeathCry: string | 'UNKNOWN'; + activeBalloon: string | 'UNKNOWN'; + activeCage: string | 'UNKNOWN'; + activeSprays: string | 'UNKNOWN'; + activeProjectileTrail: string | 'UNKNOWN'; + shopSort: ShopSort | 'UNKNOWN'; coins: number; - souls: number; tokens: number; - experience: number; - level: number; - levelProgress: any; - levelFormatted: string | null; - prestige: SkyWarsPrestige; - opals: number; - avarice: number; - tenacity: number; - shards: number; + xp: number; + mythicalKits: SkyWarsKitsMythics; + selectedPrestigeIcon: string | 'UNKNOWN'; angelOfDeathLevel: number; - killStreak: number; - kills: number; - voidKills: number; - meleeKills: number; - bowKills: number; - mobKills: number; - assists: number; - deaths: number; - KDR: number; - wins: number; - losses: number; - WLR: number; - gamesPlayed: number; - survivedPlayers: number; - chestsOpened: number; - timePlayed: number; - shard: number; - longestBowShot: number; - arrowsShot: number; - arrowsHit: number; - bowAccuracy: number; - fastestWin: number; - heads: number; - blocksPlaced: number; - blocksBroken: number; - eggThrown: number; - enderpearlsThrown: number; - solo: SkyWarsModeStats; - team: SkyWarsModeStats; - mega: SkyWarsMode; - megaDoubles: SkyWarsMode; - lab: SkyWarsMode; - packages: SkyWarsPackages; + quits: number; + souls: number; + soulWell: number; + soulsGathered: number; + paidSouls: number; + soulWellRares: number; + soulWellLegendaries: number; + refillChestDestroy: number; + harvestingSeason: number; + xezbethLuck: number; + extraWheels: number; + weeklyKills: number; + weeklyKillsA: number; + weeklyKillsB: number; + monthlyKills: number; + monthlyKillsA: number; + monthlyKillsB: number; + quickjoinUsesTotal: number; + quickjoinUsesRandom: number; + chests: number; + chestHistory: string[]; + goldenBoxes: number; + halloweenBoxes: number; + christmasBoxes: number; + lunarBoxes: number; + easterBoxes: number; + beastChance: number; + privateGamesSettings: SkyWarsPrivateGames; + solo: SkyWarsSolo; + teams: SkyWarsTeams; + mega: SkyWarsMega; + mini: SkyWarsMini; constructor(data: Record) { + super(data); + this.activeKillEffect = data?.active_killeffect || 'UNKNOWN'; + this.activeVictoryDance = data?.active_victorydance || 'UNKNOWN'; + this.activeKillMessages = data?.active_killmessages || 'UNKNOWN'; + this.activeDeathCry = data?.active_deathcry || 'UNKNOWN'; + this.activeBalloon = data?.active_balloon || 'UNKNOWN'; + this.activeCage = data?.active_cage || 'UNKNOWN'; + this.activeSprays = data?.active_sprays || 'UNKNOWN'; + this.activeProjectileTrail = data?.active_projectiletrail || 'UNKNOWN'; + this.shopSort = data?.shop_sort || 'UNKNOWN'; this.coins = data?.coins || 0; - this.souls = data?.souls || 0; this.tokens = data?.cosmetic_tokens || 0; - this.experience = data?.skywars_experience || 0; - this.level = getSkyWarsLevel(data?.skywars_experience); - this.levelProgress = getSkyWarsLevelProgress(data?.skywars_experience); - this.levelFormatted = data?.levelFormatted - ? data?.levelFormatted - ?.replace(/§l/gm, '**') - ?.replace(/§([a-f]|[1-9])/gm, '') - ?.replace(/§r/gm, '') - : null; - this.prestige = getSkyWarsPrestige(this.level); - this.opals = data?.opals || 0; - this.avarice = data?.avarice || 0; - this.tenacity = data?.tenacity || 0; - this.shards = data?.shard || 0; - this.angelOfDeathLevel = data?.angel_of_death_level || 0; - this.killStreak = data?.killstreak || 0; - this.kills = data?.kills || 0; - this.voidKills = data?.void_kills || 0; - this.meleeKills = data?.melee_kills || 0; - this.bowKills = data?.bow_kills || 0; - this.mobKills = data?.mob_kills || 0; - this.assists = data?.assists || 0; - this.deaths = data?.deaths || 0; - this.KDR = Divide(data?.kills, data?.deaths); - this.wins = data?.wins || 0; - this.losses = data?.losses || 0; - this.WLR = Divide(data?.wins, data?.losses); - this.gamesPlayed = data?.games || 0; - this.survivedPlayers = data?.survived_players || 0; - this.chestsOpened = data?.chests_opened || 0; - this.timePlayed = data?.time_played || 0; - this.shard = data?.shard || 0; - this.longestBowShot = data?.longest_bow_shot || 0; - this.arrowsShot = data?.arrows_shot || 0; - this.arrowsHit = data?.arrows_hit || 0; - this.bowAccuracy = Divide(this.arrowsHit, this.arrowsShot); - this.fastestWin = data?.fastest_win || 0; this.heads = data?.heads || 0; - this.blocksPlaced = data?.blocks_placed || 0; - this.blocksBroken = data?.blocks_broken || 0; - this.eggThrown = data?.egg_thrown || 0; - this.enderpearlsThrown = data?.enderpearls_thrown || 0; - this.solo = new SkyWarsModeStats(data, 'solo'); - this.team = new SkyWarsModeStats(data, 'team'); - this.mega = new SkyWarsMode(data, 'mega'); - this.megaDoubles = new SkyWarsMode(data, 'mega_doubles'); - this.lab = new SkyWarsMode(data, 'lab'); - this.packages = new SkyWarsPackages(data?.packages || []); + this.xp = data?.skywars_experience || 0; + this.mythicalKits = new SkyWarsKitsMythics(data); + this.selectedPrestigeIcon = data?.selected_prestige_icon || 'UNKNOWN'; + this.angelOfDeathLevel = data?.angel_of_death_level || 0; + this.quits = data?.quits || 0; + this.souls = data?.souls || 0; + this.soulWell = data?.soul_well || 0; + this.soulsGathered = data?.souls_gathered || 0; + this.paidSouls = data?.paid_souls || 0; + this.soulWellRares = data?.soul_well_rares || 0; + this.soulWellLegendaries = data?.soul_well_legendaries || 0; + this.refillChestDestroy = data?.refill_chest_destroy || 0; + this.harvestingSeason = data?.harvesting_season || 0; + this.xezbethLuck = data?.xezbeth_luck || 0; + this.extraWheels = data?.extra_wheels || 0; + this.weeklyKills = parseInt(data?.[`kills_weekly_${weekAB()}`] || 0, 10); + this.weeklyKillsA = data?.kills_weekly_a || 0; + this.weeklyKillsB = data?.kills_weekly_b || 0; + this.monthlyKills = parseInt(data?.[`kills_monthly_${weekAB()}`] || 0, 10); + this.monthlyKillsA = data?.kills_monthly_a || 0; + this.monthlyKillsB = data?.kills_monthly_b || 0; + this.quickjoinUsesTotal = data?.quickjoin_uses_total || 0; + this.quickjoinUsesRandom = data?.quickjoin_uses_random || 0; + this.chests = data?.skywars_chests || 0; + this.chestHistory = data?.skywars_chest_history || []; + this.goldenBoxes = data?.skywars_golden_boxes || 0; + this.halloweenBoxes = data?.skywars_halloween_boxes || 0; + this.christmasBoxes = data?.skywars_christmas_boxes || 0; + this.lunarBoxes = data?.skywars_lunar_boxes || 0; + this.easterBoxes = data?.skywars_easter_boxes || 0; + this.beastChance = data?.beast_chance || 0; + this.privateGamesSettings = new SkyWarsPrivateGames(data?.privategames || {}); + this.solo = new SkyWarsSolo(data); + this.teams = new SkyWarsTeams(data); + this.mega = new SkyWarsMega(data); + this.mini = new SkyWarsMini(data); } } diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsHeads.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsHeads.test.ts new file mode 100644 index 000000000..bebd31691 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsHeads.test.ts @@ -0,0 +1,51 @@ +import SkyWarsHeads from './SkyWarsHeads.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsHeads', () => { + const data = new SkyWarsHeads({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsHeads); + expectTypeOf(data).toEqualTypeOf(); + expect(data.total).toBeDefined(); + expect(data.total).toBeGreaterThanOrEqual(0); + expectTypeOf(data.total).toEqualTypeOf(); + expect(data.tasty).toBeDefined(); + expect(data.tasty).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tasty).toEqualTypeOf(); + expect(data.yucky).toBeDefined(); + expect(data.yucky).toBeGreaterThanOrEqual(0); + expectTypeOf(data.yucky).toEqualTypeOf(); + expect(data.eww).toBeDefined(); + expect(data.eww).toBeGreaterThanOrEqual(0); + expectTypeOf(data.eww).toEqualTypeOf(); + expect(data.salty).toBeDefined(); + expect(data.salty).toBeGreaterThanOrEqual(0); + expectTypeOf(data.salty).toEqualTypeOf(); + expect(data.divine).toBeDefined(); + expect(data.divine).toBeGreaterThanOrEqual(0); + expectTypeOf(data.divine).toEqualTypeOf(); + expect(data.heavenly).toBeDefined(); + expect(data.heavenly).toBeGreaterThanOrEqual(0); + expectTypeOf(data.heavenly).toEqualTypeOf(); + expect(data.decent).toBeDefined(); + expect(data.decent).toBeGreaterThanOrEqual(0); + expectTypeOf(data.decent).toEqualTypeOf(); + expect(data.meh).toBeDefined(); + expect(data.meh).toBeGreaterThanOrEqual(0); + expectTypeOf(data.meh).toEqualTypeOf(); + expect(data.succulent).toBeDefined(); + expect(data.succulent).toBeGreaterThanOrEqual(0); + expectTypeOf(data.succulent).toEqualTypeOf(); + expect(data.sweet).toBeDefined(); + expect(data.sweet).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sweet).toEqualTypeOf(); + expect(data.ethereal).toBeDefined(); + expect(data.ethereal).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ethereal).toEqualTypeOf(); + expect(data.indescribable).toBeDefined(); + expect(data.indescribable).toBeGreaterThanOrEqual(0); + expectTypeOf(data.indescribable).toEqualTypeOf(); + expect(data.special).toBeDefined(); + expect(data.special).toBeGreaterThanOrEqual(0); + expectTypeOf(data.special).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsHeads.ts b/src/Structures/MiniGames/SkyWars/SkyWarsHeads.ts new file mode 100644 index 000000000..98c1e7309 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsHeads.ts @@ -0,0 +1,38 @@ +import { ParseModeAfter } from '../../../Utils/ParseMode.ts'; +import type { SkyWarsKitId, SkyWarsModeId } from '../../../Types/Player.ts'; + +class SkyWarsHeads { + total: number; + tasty: number; + yucky: number; + eww: number; + salty: number; + divine: number; + heavenly: number; + decent: number; + meh: number; + succulent: number; + sweet: number; + ethereal: number; + indescribable: number; + special: number; + constructor(data: Record, mode?: SkyWarsModeId | SkyWarsKitId) { + mode = ParseModeAfter(mode) as SkyWarsModeId; + this.total = data?.[`heads${mode}`] || 0; + this.tasty = data?.[`heads_tasty${mode}`] || 0; + this.yucky = data?.[`heads_yucky${mode}`] || 0; + this.eww = data?.[`heads_eww${mode}`] || 0; + this.salty = data?.[`heads_salty${mode}`] || 0; + this.divine = data?.[`heads_divine${mode}`] || 0; + this.heavenly = data?.[`heads_heavenly${mode}`] || 0; + this.decent = data?.[`heads_decent${mode}`] || 0; + this.meh = data?.[`heads_meh${mode}`] || 0; + this.succulent = data?.[`heads_succulent${mode}`] || 0; + this.sweet = data?.[`heads_sweet${mode}`] || 0; + this.ethereal = data?.[`heads_ethereal${mode}`] || 0; + this.indescribable = data?.[`heads_indescribable${mode}`] || 0; + this.special = data?.[`heads_special${mode}`] || 0; + } +} + +export default SkyWarsHeads; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsKillsDeaths.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsKillsDeaths.test.ts new file mode 100644 index 000000000..e4e6e631c --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsKillsDeaths.test.ts @@ -0,0 +1,28 @@ +import SkyWarsKillsDeaths from './SkyWarsKillsDeaths.js'; +import SkyWarsKillsDeathsType from './SkyWarsKillsDeathsType.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsKillsDeaths', () => { + const data = new SkyWarsKillsDeaths({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsKillsDeaths); + expectTypeOf(data).toEqualTypeOf(); + expect(data.total).toBeDefined(); + expect(data.total).toBeInstanceOf(SkyWarsKillsDeathsType); + expectTypeOf(data.total).toEqualTypeOf(); + expect(data.melee).toBeDefined(); + expect(data.melee).toBeInstanceOf(SkyWarsKillsDeathsType); + expectTypeOf(data.melee).toEqualTypeOf(); + expect(data.void).toBeDefined(); + expect(data.void).toBeInstanceOf(SkyWarsKillsDeathsType); + expectTypeOf(data.void).toEqualTypeOf(); + expect(data.bow).toBeDefined(); + expect(data.bow).toBeInstanceOf(SkyWarsKillsDeathsType); + expectTypeOf(data.bow).toEqualTypeOf(); + expect(data.mob).toBeDefined(); + expect(data.mob).toBeInstanceOf(SkyWarsKillsDeathsType); + expectTypeOf(data.mob).toEqualTypeOf(); + expect(data.fall).toBeDefined(); + expect(data.fall).toBeInstanceOf(SkyWarsKillsDeathsType); + expectTypeOf(data.fall).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsKillsDeaths.ts b/src/Structures/MiniGames/SkyWars/SkyWarsKillsDeaths.ts new file mode 100644 index 000000000..cde17d44c --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsKillsDeaths.ts @@ -0,0 +1,23 @@ +import SkyWarsKillsDeathsType from './SkyWarsKillsDeathsType.ts'; +import { ParseModeAfter } from '../../../Utils/ParseMode.ts'; +import type { SkyWarsKitId, SkyWarsModeId } from '../../../Types/Player.ts'; + +class SkyWarsKillsDeaths { + total: SkyWarsKillsDeathsType; + melee: SkyWarsKillsDeathsType; + void: SkyWarsKillsDeathsType; + bow: SkyWarsKillsDeathsType; + mob: SkyWarsKillsDeathsType; + fall: SkyWarsKillsDeathsType; + constructor(data: Record, mode?: SkyWarsModeId | SkyWarsKitId) { + mode = ParseModeAfter(mode) as SkyWarsModeId; + this.total = new SkyWarsKillsDeathsType(data, '', mode); + this.melee = new SkyWarsKillsDeathsType(data, 'melee', mode); + this.void = new SkyWarsKillsDeathsType(data, 'void', mode); + this.bow = new SkyWarsKillsDeathsType(data, 'bow', mode); + this.mob = new SkyWarsKillsDeathsType(data, 'mob', mode); + this.fall = new SkyWarsKillsDeathsType(data, 'fall', mode); + } +} + +export default SkyWarsKillsDeaths; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsKillsDeathsType.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsKillsDeathsType.test.ts new file mode 100644 index 000000000..fff407229 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsKillsDeathsType.test.ts @@ -0,0 +1,9 @@ +import SkyWarsKillsDeathsType from './SkyWarsKillsDeathsType.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsKillsDeathsType', () => { + const data = new SkyWarsKillsDeathsType({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsKillsDeathsType); + expectTypeOf(data).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsKillsDeathsType.ts b/src/Structures/MiniGames/SkyWars/SkyWarsKillsDeathsType.ts new file mode 100644 index 000000000..5bb678941 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsKillsDeathsType.ts @@ -0,0 +1,15 @@ +import BaseKillsDeathsType from '../Shared/BaseKillDeathsType.ts'; +import { ParseModeAfter, ParseModeBefore } from '../../../Utils/ParseMode.ts'; +import type { SkyWarsKillType, SkyWarsKitId, SkyWarsModeId } from '../../../Types/Player.ts'; + +class SkyWarsKillsDeathsType extends BaseKillsDeathsType { + constructor(data: Record, type?: SkyWarsKillType, mode?: SkyWarsModeId | SkyWarsKitId) { + type = ParseModeBefore(type) as SkyWarsKillType; + mode = ParseModeAfter(mode) as SkyWarsModeId; + super(data); + this.kills = data?.[`${type}kills${mode}`] || 0; + this.deaths = data?.[`${type}kills${mode}`] || 0; + } +} + +export default SkyWarsKillsDeathsType; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsKit.ts b/src/Structures/MiniGames/SkyWars/SkyWarsKit.ts deleted file mode 100644 index b488d1656..000000000 --- a/src/Structures/MiniGames/SkyWars/SkyWarsKit.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { RemoveSnakeCaseString } from '../../../Utils/RemoveSnakeCase.js'; -import type { SkyWarsKitNames } from '../../../Types/Player.js'; - -class SkyWarsKit { - kitData: string[]; - isKit: boolean; - gameMode: string; - kitType: string; - kitName: SkyWarsKitNames; - constructor(kit: Record) { - this.kitData = kit?.match(/^kit_([a-z]+)_([a-z]+)_([a-z]+)$/); - this.isKit = Boolean(this.kitData); - this.gameMode = this.kitData ? this.kitData?.[2] || '' : ''; - this.kitType = this.kitData ? this.kitData?.[1] || '' : ''; - this.kitName = RemoveSnakeCaseString(this.kitData ? this.kitData?.[3] || '' : '') as SkyWarsKitNames; - } -} - -export default SkyWarsKit; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsKits.ts b/src/Structures/MiniGames/SkyWars/SkyWarsKits.ts deleted file mode 100644 index 0c55a2ae2..000000000 --- a/src/Structures/MiniGames/SkyWars/SkyWarsKits.ts +++ /dev/null @@ -1,13 +0,0 @@ -import SkyWarsKit from './SkyWarsKit.js'; - -class SkyWarsKits { - kits: SkyWarsKit[]; - constructor(kits: Record) { - this.kits = kits.map((kit: any) => new SkyWarsKit(kit)).filter((kit: SkyWarsKit) => kit?.isKit); - } - get(gameMode: string = '', type: string = ''): SkyWarsKit[] { - return this.kits.filter((kit) => kit?.gameMode?.startsWith(gameMode) && kit?.kitType.startsWith(type)); - } -} - -export default SkyWarsKits; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsKitsMythics/SkyWarsKitsMythic.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsKitsMythics/SkyWarsKitsMythic.test.ts new file mode 100644 index 000000000..b2e3a8afc --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsKitsMythics/SkyWarsKitsMythic.test.ts @@ -0,0 +1,14 @@ +import SkyWarsKitsMythic from './SkyWarsKitsMythic.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsKitsMythic', () => { + const data = new SkyWarsKitsMythic({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsKitsMythic); + expectTypeOf(data).toEqualTypeOf(); + expect(data.autoEquipArmor).toBeDefined(); + expectTypeOf(data.autoEquipArmor).toEqualTypeOf(); + expect(data.xp).toBeDefined(); + expect(data.xp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.xp).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsKitsMythics/SkyWarsKitsMythic.ts b/src/Structures/MiniGames/SkyWars/SkyWarsKitsMythics/SkyWarsKitsMythic.ts new file mode 100644 index 000000000..7967a4dcf --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsKitsMythics/SkyWarsKitsMythic.ts @@ -0,0 +1,16 @@ +import SkyWarsMode from '../SkyWarsMode/SkyWarsMode.ts'; +import { ParseModeAfter, ParseModeBefore } from '../../../../Utils/ParseMode.ts'; +import type { SkyWarsMythicKitId } from '../../../../Types/Player.ts'; + +class SkyWarsKitsMythic extends SkyWarsMode { + autoEquipArmor: boolean; + xp: number; + constructor(data: Record, kit?: SkyWarsMythicKitId) { + kit = ParseModeAfter(kit) as SkyWarsMythicKitId; + super(data, kit); + this.autoEquipArmor = data?.[`${ParseModeBefore(kit)}inventory_auto_equip_armor`] || true; + this.xp = data?.[`xp${kit}`] || 0; + } +} + +export default SkyWarsKitsMythic; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsKitsMythics/SkyWarsKitsMythics.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsKitsMythics/SkyWarsKitsMythics.test.ts new file mode 100644 index 000000000..2124e0efb --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsKitsMythics/SkyWarsKitsMythics.test.ts @@ -0,0 +1,31 @@ +import SkyWarsKitsMythic from './SkyWarsKitsMythic.js'; +import SkyWarsKitsMythics from './SkyWarsKitsMythics.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsKitsMythics', () => { + const data = new SkyWarsKitsMythics({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsKitsMythics); + expectTypeOf(data).toEqualTypeOf(); + expect(data.chronobreaker).toBeDefined(); + expect(data.chronobreaker).toBeInstanceOf(SkyWarsKitsMythic); + expectTypeOf(data.chronobreaker).toEqualTypeOf(); + expect(data.netherLord).toBeDefined(); + expect(data.netherLord).toBeInstanceOf(SkyWarsKitsMythic); + expectTypeOf(data.netherLord).toEqualTypeOf(); + expect(data.endLord).toBeDefined(); + expect(data.endLord).toBeInstanceOf(SkyWarsKitsMythic); + expectTypeOf(data.endLord).toEqualTypeOf(); + expect(data.monsterTrainer).toBeDefined(); + expect(data.monsterTrainer).toBeInstanceOf(SkyWarsKitsMythic); + expectTypeOf(data.monsterTrainer).toEqualTypeOf(); + expect(data.cryomancer).toBeDefined(); + expect(data.cryomancer).toBeInstanceOf(SkyWarsKitsMythic); + expectTypeOf(data.cryomancer).toEqualTypeOf(); + expect(data.thundermeister).toBeDefined(); + expect(data.thundermeister).toBeInstanceOf(SkyWarsKitsMythic); + expectTypeOf(data.thundermeister).toEqualTypeOf(); + expect(data.fishmonger).toBeDefined(); + expect(data.fishmonger).toBeInstanceOf(SkyWarsKitsMythic); + expectTypeOf(data.fishmonger).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsKitsMythics/SkyWarsKitsMythics.ts b/src/Structures/MiniGames/SkyWars/SkyWarsKitsMythics/SkyWarsKitsMythics.ts new file mode 100644 index 000000000..47f5f92f0 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsKitsMythics/SkyWarsKitsMythics.ts @@ -0,0 +1,22 @@ +import SkyWarsKitsMythic from './SkyWarsKitsMythic.ts'; + +class SkyWarsKitsMythics { + chronobreaker: SkyWarsKitsMythic; + netherLord: SkyWarsKitsMythic; + endLord: SkyWarsKitsMythic; + monsterTrainer: SkyWarsKitsMythic; + cryomancer: SkyWarsKitsMythic; + thundermeister: SkyWarsKitsMythic; + fishmonger: SkyWarsKitsMythic; + constructor(data: Record) { + this.chronobreaker = new SkyWarsKitsMythic(data, 'kit_mythical_chronobreaker'); + this.netherLord = new SkyWarsKitsMythic(data, 'kit_mythical_nether-lord'); + this.endLord = new SkyWarsKitsMythic(data, 'kit_mythical_end-lord'); + this.monsterTrainer = new SkyWarsKitsMythic(data, 'kit_mythical_monster-trainer'); + this.cryomancer = new SkyWarsKitsMythic(data, 'kit_mythical_cryomancer'); + this.thundermeister = new SkyWarsKitsMythic(data, 'kit_mythical_thundermeister'); + this.fishmonger = new SkyWarsKitsMythic(data, 'kit_mythical_fishmonger'); + } +} + +export default SkyWarsKitsMythics; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMega.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMega.test.ts new file mode 100644 index 000000000..d74866ff6 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMega.test.ts @@ -0,0 +1,75 @@ +import SkyWarsMega from './SkyWarsMega.js'; +import SkyWarsMegaKits from './SkyWarsMegaKits.js'; +import SkyWarsMode from '../SkyWarsMode/SkyWarsMode.js'; +import SkyWarsModePerk from '../SkyWarsMode/SkyWarsModePerk.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsMega', () => { + const data = new SkyWarsMega({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsMega); + expectTypeOf(data).toEqualTypeOf(); + expect(data.doubles).toBeDefined(); + expect(data.doubles).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.doubles).toEqualTypeOf(); + expect(data.doublesNormal).toBeDefined(); + expect(data.doublesNormal).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.doublesNormal).toEqualTypeOf(); + expect(data.normal).toBeDefined(); + expect(data.normal).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.normal).toEqualTypeOf(); + expect(data.kits).toBeDefined(); + expect(data.kits).toBeInstanceOf(SkyWarsMegaKits); + expectTypeOf(data.kits).toEqualTypeOf(); + expect(data.rusher).toBeDefined(); + expect(data.rusher).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.rusher).toEqualTypeOf(); + expect(data.miningExpertise).toBeDefined(); + expect(data.miningExpertise).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.miningExpertise).toEqualTypeOf(); + expect(data.enderMastery).toBeDefined(); + expect(data.enderMastery).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.enderMastery).toEqualTypeOf(); + expect(data.blazingArrows).toBeDefined(); + expect(data.blazingArrows).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.blazingArrows).toEqualTypeOf(); + expect(data.arrowRecovery).toBeDefined(); + expect(data.arrowRecovery).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.arrowRecovery).toEqualTypeOf(); + expect(data.juggernaut).toBeDefined(); + expect(data.juggernaut).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.juggernaut).toEqualTypeOf(); + expect(data.tank).toBeDefined(); + expect(data.tank).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.tank).toEqualTypeOf(); + expect(data.nourishment).toBeDefined(); + expect(data.nourishment).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.nourishment).toEqualTypeOf(); + expect(data.notoriety).toBeDefined(); + expect(data.notoriety).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.notoriety).toEqualTypeOf(); + expect(data.instantSmelting).toBeDefined(); + expect(data.instantSmelting).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.instantSmelting).toEqualTypeOf(); + expect(data.marksmanship).toBeDefined(); + expect(data.marksmanship).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.marksmanship).toEqualTypeOf(); + expect(data.environmentalExpert).toBeDefined(); + expect(data.environmentalExpert).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.environmentalExpert).toEqualTypeOf(); + expect(data.bridger).toBeDefined(); + expect(data.bridger).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.bridger).toEqualTypeOf(); + expect(data.luckyCharm).toBeDefined(); + expect(data.luckyCharm).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.luckyCharm).toEqualTypeOf(); + expect(data.blackMagic).toBeDefined(); + expect(data.blackMagic).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.blackMagic).toEqualTypeOf(); + expect(data.necromancer).toBeDefined(); + expect(data.necromancer).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.necromancer).toEqualTypeOf(); + expect(data.telekinesis).toBeDefined(); + expect(data.telekinesis).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.telekinesis).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMega.ts b/src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMega.ts new file mode 100644 index 000000000..c7ddece02 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMega.ts @@ -0,0 +1,53 @@ +import SkyWarsMegaKits from './SkyWarsMegaKits.ts'; +import SkyWarsMode from '../SkyWarsMode/SkyWarsMode.ts'; +import SkyWarsModePerk from '../SkyWarsMode/SkyWarsModePerk.js'; + +class SkyWarsMega extends SkyWarsMode { + doubles: SkyWarsMode; + doublesNormal: SkyWarsMode; + normal: SkyWarsMode; + kits: SkyWarsMegaKits; + rusher: SkyWarsModePerk; + miningExpertise: SkyWarsModePerk; + enderMastery: SkyWarsModePerk; + blazingArrows: SkyWarsModePerk; + arrowRecovery: SkyWarsModePerk; + juggernaut: SkyWarsModePerk; + tank: SkyWarsModePerk; + nourishment: SkyWarsModePerk; + notoriety: SkyWarsModePerk; + instantSmelting: SkyWarsModePerk; + marksmanship: SkyWarsModePerk; + environmentalExpert: SkyWarsModePerk; + bridger: SkyWarsModePerk; + luckyCharm: SkyWarsModePerk; + blackMagic: SkyWarsModePerk; + necromancer: SkyWarsModePerk; + telekinesis: SkyWarsModePerk; + constructor(data: Record) { + super(data, 'mega'); + this.doubles = new SkyWarsMode(data, 'mega_doubles'); + this.doublesNormal = new SkyWarsMode(data, 'mega_doubles_normal'); + this.normal = new SkyWarsMode(data, 'mega_normal'); + this.kits = new SkyWarsMegaKits(data); + this.rusher = new SkyWarsModePerk(data, 'rusher', 'mega'); + this.miningExpertise = new SkyWarsModePerk(data, 'mining_expertise', 'mega'); + this.enderMastery = new SkyWarsModePerk(data, 'ender_mastery', 'mega'); + this.blazingArrows = new SkyWarsModePerk(data, 'blazing_arrows', 'mega'); + this.arrowRecovery = new SkyWarsModePerk(data, 'arrow_recovery', 'mega'); + this.juggernaut = new SkyWarsModePerk(data, 'juggernaut', 'mega'); + this.tank = new SkyWarsModePerk(data, 'tank', 'mega'); + this.nourishment = new SkyWarsModePerk(data, 'nourishment', 'mega'); + this.notoriety = new SkyWarsModePerk(data, 'notoriety', 'mega'); + this.instantSmelting = new SkyWarsModePerk(data, 'instant_smelting', 'mega'); + this.marksmanship = new SkyWarsModePerk(data, 'marksmanship', 'mega'); + this.environmentalExpert = new SkyWarsModePerk(data, 'environmental_expert', 'mega'); + this.bridger = new SkyWarsModePerk(data, 'bridger', 'mega'); + this.luckyCharm = new SkyWarsModePerk(data, 'lucky_charm', 'mega'); + this.blackMagic = new SkyWarsModePerk(data, 'black_magic', 'mega'); + this.necromancer = new SkyWarsModePerk(data, 'necromancer', 'mega'); + this.telekinesis = new SkyWarsModePerk(data, 'telekinesis', 'mega'); + } +} + +export default SkyWarsMega; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMegaKits.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMegaKits.test.ts new file mode 100644 index 000000000..468d09935 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMegaKits.test.ts @@ -0,0 +1,58 @@ +import SkyWarsMegaKits from './SkyWarsMegaKits.js'; +import SkyWarsMode from '../SkyWarsMode/SkyWarsMode.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsMegaKits', () => { + const data = new SkyWarsMegaKits({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsMegaKits); + expectTypeOf(data).toEqualTypeOf(); + expect(data.default).toBeDefined(); + expect(data.default).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.default).toEqualTypeOf(); + expect(data.hunter).toBeDefined(); + expect(data.hunter).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.hunter).toEqualTypeOf(); + expect(data.scout).toBeDefined(); + expect(data.scout).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.scout).toEqualTypeOf(); + expect(data.baseballPlayer).toBeDefined(); + expect(data.baseballPlayer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.baseballPlayer).toEqualTypeOf(); + expect(data.armorer).toBeDefined(); + expect(data.armorer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.armorer).toEqualTypeOf(); + expect(data.knight).toBeDefined(); + expect(data.knight).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.knight).toEqualTypeOf(); + expect(data.cannoneer).toBeDefined(); + expect(data.cannoneer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.cannoneer).toEqualTypeOf(); + expect(data.hellhound).toBeDefined(); + expect(data.hellhound).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.hellhound).toEqualTypeOf(); + expect(data.witch).toBeDefined(); + expect(data.witch).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.witch).toEqualTypeOf(); + expect(data.fisherman).toBeDefined(); + expect(data.fisherman).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.fisherman).toEqualTypeOf(); + expect(data.armorsmith).toBeDefined(); + expect(data.armorsmith).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.armorsmith).toEqualTypeOf(); + expect(data.pyromaniac).toBeDefined(); + expect(data.pyromaniac).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.pyromaniac).toEqualTypeOf(); + expect(data.paladin).toBeDefined(); + expect(data.paladin).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.paladin).toEqualTypeOf(); + expect(data.healer).toBeDefined(); + expect(data.healer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.healer).toEqualTypeOf(); + expect(data.skeletor).toBeDefined(); + expect(data.skeletor).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.skeletor).toEqualTypeOf(); + expect(data.enderman).toBeDefined(); + expect(data.enderman).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.enderman).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMegaKits.ts b/src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMegaKits.ts new file mode 100644 index 000000000..ae3b5420e --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMegaKits.ts @@ -0,0 +1,40 @@ +import SkyWarsMode from '../SkyWarsMode/SkyWarsMode.ts'; + +class SkyWarsMegaKits { + default: SkyWarsMode; + hunter: SkyWarsMode; + scout: SkyWarsMode; + baseballPlayer: SkyWarsMode; + armorer: SkyWarsMode; + knight: SkyWarsMode; + cannoneer: SkyWarsMode; + hellhound: SkyWarsMode; + witch: SkyWarsMode; + fisherman: SkyWarsMode; + armorsmith: SkyWarsMode; + pyromaniac: SkyWarsMode; + paladin: SkyWarsMode; + healer: SkyWarsMode; + skeletor: SkyWarsMode; + enderman: SkyWarsMode; + constructor(data: Record) { + this.default = new SkyWarsMode(data, 'kit_mega_mega_default'); + this.hunter = new SkyWarsMode(data, 'kit_mega_mega_hunter'); + this.scout = new SkyWarsMode(data, 'kit_mega_mega_scout'); + this.baseballPlayer = new SkyWarsMode(data, 'kit_mega_mega_baseball-player'); + this.armorer = new SkyWarsMode(data, 'kit_mega_mega_armorer'); + this.knight = new SkyWarsMode(data, 'kit_mega_mega_knight'); + this.cannoneer = new SkyWarsMode(data, 'kit_mega_mega_cannoneer'); + this.hellhound = new SkyWarsMode(data, 'kit_mega_mega_hellhound'); + this.witch = new SkyWarsMode(data, 'kit_mega_mega_witch'); + this.fisherman = new SkyWarsMode(data, 'kit_mega_mega_fisherman'); + this.armorsmith = new SkyWarsMode(data, 'kit_mega_mega_armorsmith'); + this.pyromaniac = new SkyWarsMode(data, 'kit_mega_mega_pyromaniac'); + this.paladin = new SkyWarsMode(data, 'kit_mega_mega_paladin'); + this.healer = new SkyWarsMode(data, 'kit_mega_mega_healer'); + this.skeletor = new SkyWarsMode(data, 'kit_mega_mega_skeletor'); + this.enderman = new SkyWarsMode(data, 'kit_mega_mega_enderman'); + } +} + +export default SkyWarsMegaKits; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsMini.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsMini.test.ts new file mode 100644 index 000000000..5cc9ed340 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsMini.test.ts @@ -0,0 +1,13 @@ +import SkyWarsMini from './SkyWarsMini.js'; +import SkyWarsMode from './SkyWarsMode/SkyWarsMode.ts'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsMini', () => { + const data = new SkyWarsMini({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsMini); + expectTypeOf(data).toEqualTypeOf(); + expect(data.normal).toBeDefined(); + expect(data.normal).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.normal).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsMini.ts b/src/Structures/MiniGames/SkyWars/SkyWarsMini.ts new file mode 100644 index 000000000..44b017df5 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsMini.ts @@ -0,0 +1,11 @@ +import SkyWarsMode from './SkyWarsMode/SkyWarsMode.ts'; + +class SkyWarsMini extends SkyWarsMode { + normal: SkyWarsMode; + constructor(data: Record) { + super(data, 'mini'); + this.normal = new SkyWarsMode(data, 'mini_normal'); + } +} + +export default SkyWarsMini; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsMode.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsMode.test.ts deleted file mode 100644 index 6a40af230..000000000 --- a/src/Structures/MiniGames/SkyWars/SkyWarsMode.test.ts +++ /dev/null @@ -1,27 +0,0 @@ -import SkyWarsMode from './SkyWarsMode.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('SkyWarsMode', () => { - const data = new SkyWarsMode({ stats: 'meow' }, 'lab'); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data).toEqualTypeOf(); - expect(data.kills).toBeDefined(); - expect(data.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.kills).toEqualTypeOf(); - expect(data.deaths).toBeDefined(); - expect(data.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.deaths).toEqualTypeOf(); - expect(data.KDR).toBeDefined(); - expect(data.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.KDR).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.losses).toBeDefined(); - expect(data.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.losses).toEqualTypeOf(); - expect(data.WLR).toBeDefined(); - expect(data.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.WLR).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsMode.ts b/src/Structures/MiniGames/SkyWars/SkyWarsMode.ts deleted file mode 100644 index 258c2cc6f..000000000 --- a/src/Structures/MiniGames/SkyWars/SkyWarsMode.ts +++ /dev/null @@ -1,21 +0,0 @@ -import Divide from '../../../Utils/Divide.js'; -import type { SkyWarsModes } from '../../../Types/Player.js'; - -class SkyWarsMode { - kills: number; - deaths: number; - KDR: number; - wins: number; - losses: number; - WLR: number; - constructor(data: Record, gamemode: SkyWarsModes) { - this.kills = data?.[`kills_${gamemode}`] || 0; - this.deaths = data?.[`deaths_${gamemode}`] || 0; - this.KDR = Divide(data?.kills, data?.deaths); - this.wins = data?.[`wins_${gamemode}`] || 0; - this.losses = data?.[`losses_${gamemode}`] || 0; - this.WLR = Divide(data?.wins, data?.losses); - } -} - -export default SkyWarsMode; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsMode/SkyWarsMode.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsMode/SkyWarsMode.test.ts new file mode 100644 index 000000000..22226c896 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsMode/SkyWarsMode.test.ts @@ -0,0 +1,89 @@ +import SkyWarsHeads from '../SkyWarsHeads.js'; +import SkyWarsKillsDeaths from '../SkyWarsKillsDeaths.js'; +import SkyWarsMode from './SkyWarsMode.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsMode', () => { + const data = new SkyWarsMode({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeInstanceOf(SkyWarsKillsDeaths); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeInstanceOf(SkyWarsKillsDeaths); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.heads).toBeDefined(); + expect(data.heads).toBeInstanceOf(SkyWarsHeads); + expectTypeOf(data.heads).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLRatio).toBeDefined(); + expect(data.WLRatio).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLRatio).toEqualTypeOf(); + expect(data.gamesPlayed).toBeDefined(); + expect(data.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gamesPlayed).toEqualTypeOf(); + expect(data.timePlayed).toBeDefined(); + expect(data.timePlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.timePlayed).toEqualTypeOf(); + expect(data.winstreak).toBeDefined(); + expect(data.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winstreak).toEqualTypeOf(); + expect(data.survivedPlayers).toBeDefined(); + expect(data.survivedPlayers).toBeGreaterThanOrEqual(0); + expectTypeOf(data.survivedPlayers).toEqualTypeOf(); + expect(data.chestsOpened).toBeDefined(); + expect(data.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.chestsOpened).toEqualTypeOf(); + expect(data.killstreak).toBeDefined(); + expect(data.killstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.killstreak).toEqualTypeOf(); + expect(data.longestBowKill).toBeDefined(); + expect(data.longestBowKill).toBeGreaterThanOrEqual(0); + expectTypeOf(data.longestBowKill).toEqualTypeOf(); + expect(data.fastestWin).toBeDefined(); + expect(data.fastestWin).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fastestWin).toEqualTypeOf(); + expect(data.assists).toBeDefined(); + expect(data.assists).toBeGreaterThanOrEqual(0); + expectTypeOf(data.assists).toEqualTypeOf(); + expect(data.mostKillsGame).toBeDefined(); + expect(data.mostKillsGame).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mostKillsGame).toEqualTypeOf(); + expect(data.longestBowShot).toBeDefined(); + expect(data.longestBowShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.longestBowShot).toEqualTypeOf(); + expect(data.arrowsHit).toBeDefined(); + expect(data.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arrowsHit).toEqualTypeOf(); + expect(data.arrowsShot).toBeDefined(); + expect(data.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arrowsShot).toEqualTypeOf(); + expect(data.shard).toBeDefined(); + expect(data.shard).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shard).toEqualTypeOf(); + expect(data.mobsKilled).toBeDefined(); + expect(data.mobsKilled).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mobsKilled).toEqualTypeOf(); + expect(data.blocksBroken).toBeDefined(); + expect(data.blocksBroken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksBroken).toEqualTypeOf(); + expect(data.blocksPlaced).toBeDefined(); + expect(data.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksPlaced).toEqualTypeOf(); + expect(data.eggThrown).toBeDefined(); + expect(data.eggThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.eggThrown).toEqualTypeOf(); + expect(data.enderpearlsThrown).toBeDefined(); + expect(data.enderpearlsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.enderpearlsThrown).toEqualTypeOf(); + expect(data.itemsEnchanted).toBeDefined(); + expect(data.itemsEnchanted).toBeGreaterThanOrEqual(0); + expectTypeOf(data.itemsEnchanted).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsMode/SkyWarsMode.ts b/src/Structures/MiniGames/SkyWars/SkyWarsMode/SkyWarsMode.ts new file mode 100644 index 000000000..ef1a968a7 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsMode/SkyWarsMode.ts @@ -0,0 +1,65 @@ +import Divide from '../../../../Utils/Divide.ts'; +import SkyWarsHeads from '../SkyWarsHeads.ts'; +import SkyWarsKillsDeaths from '../SkyWarsKillsDeaths.ts'; +import { ParseModeAfter } from '../../../../Utils/ParseMode.ts'; +import type { SkyWarsKitId, SkyWarsModeId } from '../../../../Types/Player.ts'; + +class SkyWarsMode { + kills: SkyWarsKillsDeaths; + deaths: SkyWarsKillsDeaths; + heads: SkyWarsHeads; + wins: number; + losses: number; + WLRatio: number; + gamesPlayed: number; + timePlayed: number; + winstreak: number; + survivedPlayers: number; + chestsOpened: number; + killstreak: number; + longestBowKill: number; + fastestWin: number; + assists: number; + mostKillsGame: number; + longestBowShot: number; + arrowsHit: number; + arrowsShot: number; + shard: number; + mobsKilled: number; + blocksBroken: number; + blocksPlaced: number; + eggThrown: number; + enderpearlsThrown: number; + itemsEnchanted: number; + constructor(data: Record, mode?: SkyWarsModeId | SkyWarsKitId) { + mode = ParseModeAfter(mode) as SkyWarsModeId; + this.kills = new SkyWarsKillsDeaths(data, mode); + this.deaths = new SkyWarsKillsDeaths(data, mode); + this.heads = new SkyWarsHeads(data, mode); + this.wins = data?.[`wins${mode}`] || 0; + this.losses = data?.[`losses${mode}`] || 0; + this.WLRatio = Divide(this.wins, this.losses) || 0; + this.gamesPlayed = data?.[`games${mode}`] || 0; + this.timePlayed = data?.[`time_played${mode}`] || 0; + this.winstreak = data?.[`winstreak${mode}`] || 0; + this.survivedPlayers = data?.[`survived_players${mode}`] || 0; + this.chestsOpened = data?.[`chests_opened${mode}`] || 0; + this.killstreak = data?.[`killstreak${mode}`] || 0; + this.longestBowKill = data?.[`longest_bow_kill${mode}`] || 0; + this.fastestWin = data?.[`fastest_win${mode}`] || 0; + this.assists = data?.[`assists${mode}`] || 0; + this.mostKillsGame = data?.[`most_kills_game${mode}`] || 0; + this.longestBowShot = data?.[`longest_bow_shot${mode}`] || 0; + this.arrowsHit = data?.[`arrows_hit${mode}`] || 0; + this.arrowsShot = data?.[`arrows_shot${mode}`] || 0; + this.shard = data?.[`shard${mode}`] || 0; + this.mobsKilled = data?.[`mobs_killed${mode}`] || 0; + this.blocksBroken = data?.[`blocks_broken${mode}`] || 0; + this.blocksPlaced = data?.[`blocks_placed${mode}`] || 0; + this.eggThrown = data?.[`egg_thrown${mode}`] || 0; + this.enderpearlsThrown = data?.[`enderpearls_thrown${mode}`] || 0; + this.itemsEnchanted = data?.[`items_enchanted${mode}`] || 0; + } +} + +export default SkyWarsMode; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsMode/SkyWarsModePerk.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsMode/SkyWarsModePerk.test.ts new file mode 100644 index 000000000..533465fff --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsMode/SkyWarsModePerk.test.ts @@ -0,0 +1,14 @@ +import SkyWarsModePerk from './SkyWarsModePerk.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsModePerk', () => { + const data = new SkyWarsModePerk({ stats: 'meow' }, 'annoy', 'crazytourney'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expect(data.level).toBeGreaterThanOrEqual(0); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.enabled).toBeDefined(); + expectTypeOf(data.enabled).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsMode/SkyWarsModePerk.ts b/src/Structures/MiniGames/SkyWars/SkyWarsMode/SkyWarsModePerk.ts new file mode 100644 index 000000000..8c812d7b8 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsMode/SkyWarsModePerk.ts @@ -0,0 +1,16 @@ +import { ParseModeAfter, ParseModeBefore, ParseModeBeforeAfter } from '../../../../Utils/ParseMode.ts'; +import type { SkyWarsModeId, SkyWarsPerkId } from '../../../../Types/Player.ts'; + +class SkyWarsModePerk { + level: number; + enabled: boolean; + constructor(data: Record, perk: SkyWarsPerkId, mode: SkyWarsModeId) { + perk = ParseModeAfter(mode) as SkyWarsPerkId; + mode = ParseModeBefore(mode) as SkyWarsModeId; + this.level = data?.[`${mode}${perk}`] || 0; + mode = ParseModeBeforeAfter(mode) as SkyWarsModeId; + this.enabled = data?.[`toggle_${mode}${perk}`] || 0; + } +} + +export default SkyWarsModePerk; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsModeStats.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsModeStats.test.ts deleted file mode 100644 index 2dc0d5948..000000000 --- a/src/Structures/MiniGames/SkyWars/SkyWarsModeStats.test.ts +++ /dev/null @@ -1,88 +0,0 @@ -import SkyWarsMode from './SkyWarsMode.js'; -import SkyWarsModeStats from './SkyWarsModeStats.js'; -import { expect, expectTypeOf, test } from 'vitest'; -import type { SkyWarsKitNames } from '../../../Types/Player.js'; - -test('SkyWarsModeStats', () => { - const data = new SkyWarsModeStats({ stats: 'meow' }, 'solo'); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(SkyWarsModeStats); - expectTypeOf(data).toEqualTypeOf(); - expect(data.activeKit).toBeDefined(); - expectTypeOf(data.activeKit).toEqualTypeOf(); - expect(data.killStreak).toBeDefined(); - expect(data.killStreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.killStreak).toEqualTypeOf(); - expect(data.kills).toBeDefined(); - expect(data.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.kills).toEqualTypeOf(); - expect(data.voidKills).toBeDefined(); - expect(data.voidKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.voidKills).toEqualTypeOf(); - expect(data.meleeKills).toBeDefined(); - expect(data.meleeKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.meleeKills).toEqualTypeOf(); - expect(data.bowKills).toBeDefined(); - expect(data.bowKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowKills).toEqualTypeOf(); - expect(data.mobKills).toBeDefined(); - expect(data.mobKills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.mobKills).toEqualTypeOf(); - expect(data.assists).toBeDefined(); - expect(data.assists).toBeGreaterThanOrEqual(0); - expectTypeOf(data.assists).toEqualTypeOf(); - expect(data.deaths).toBeDefined(); - expect(data.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.deaths).toEqualTypeOf(); - expect(data.KDR).toBeDefined(); - expect(data.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.KDR).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.losses).toBeDefined(); - expect(data.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.losses).toEqualTypeOf(); - expect(data.WLR).toBeDefined(); - expect(data.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.WLR).toEqualTypeOf(); - expect(data.gamesPlayed).toBeDefined(); - expect(data.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.gamesPlayed).toEqualTypeOf(); - expect(data.survivedPlayers).toBeDefined(); - expect(data.survivedPlayers).toBeGreaterThanOrEqual(0); - expectTypeOf(data.survivedPlayers).toEqualTypeOf(); - expect(data.chestsOpened).toBeDefined(); - expect(data.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.chestsOpened).toEqualTypeOf(); - expect(data.timePlayed).toBeDefined(); - expect(data.timePlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.timePlayed).toEqualTypeOf(); - expect(data.shard).toBeDefined(); - expect(data.shard).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shard).toEqualTypeOf(); - expect(data.longestBowShot).toBeDefined(); - expect(data.longestBowShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.longestBowShot).toEqualTypeOf(); - expect(data.arrowsShot).toBeDefined(); - expect(data.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arrowsShot).toEqualTypeOf(); - expect(data.arrowsHit).toBeDefined(); - expect(data.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arrowsHit).toEqualTypeOf(); - expect(data.bowAccuracy).toBeDefined(); - expect(data.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowAccuracy).toEqualTypeOf(); - expect(data.fastestWin).toBeDefined(); - expect(data.fastestWin).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fastestWin).toEqualTypeOf(); - expect(data.heads).toBeDefined(); - expect(data.heads).toBeGreaterThanOrEqual(0); - expectTypeOf(data.heads).toEqualTypeOf(); - expect(data.normal).toBeDefined(); - expect(data.normal).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.normal).toEqualTypeOf(); - expect(data.insane).toBeDefined(); - expect(data.insane).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.insane).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsModeStats.ts b/src/Structures/MiniGames/SkyWars/SkyWarsModeStats.ts deleted file mode 100644 index dfa737cfa..000000000 --- a/src/Structures/MiniGames/SkyWars/SkyWarsModeStats.ts +++ /dev/null @@ -1,62 +0,0 @@ -import Divide from '../../../Utils/Divide.js'; -import SkyWarsMode from './SkyWarsMode.js'; -import type { SkyWarsBaseModes, SkyWarsKitNames } from '../../../Types/Player.js'; - -class SkyWarsModeStats { - activeKit: SkyWarsKitNames; - killStreak: number; - kills: number; - voidKills: number; - meleeKills: number; - bowKills: number; - mobKills: number; - assists: number; - deaths: number; - KDR: number; - wins: number; - losses: number; - WLR: number; - gamesPlayed: number; - survivedPlayers: number; - chestsOpened: number; - timePlayed: number; - shard: number; - longestBowShot: number; - arrowsShot: number; - arrowsHit: number; - bowAccuracy: number; - fastestWin: number; - heads: number; - normal: SkyWarsMode; - insane: SkyWarsMode; - constructor(data: Record, gamemode: SkyWarsBaseModes) { - this.activeKit = data?.[`activeKit_${gamemode?.toUpperCase()}`] || ''; - this.killStreak = data?.[`killstreak_${gamemode}`] || 0; - this.kills = data?.[`kills_${gamemode}`] || 0; - this.voidKills = data?.[`void_kills_${gamemode}`] || 0; - this.meleeKills = data?.[`melee_kills_${gamemode}`] || 0; - this.bowKills = data?.[`bow_kills_${gamemode}`] || 0; - this.mobKills = data?.[`mob_kills_${gamemode}`] || 0; - this.assists = data?.[`assists_${gamemode}`] || 0; - this.deaths = data?.[`deaths_${gamemode}`] || 0; - this.KDR = Divide(data?.kills, data?.deaths); - this.wins = data?.[`wins_${gamemode}`] || 0; - this.losses = data?.[`losses_${gamemode}`] || 0; - this.WLR = Divide(data?.wins, data?.losses); - this.gamesPlayed = data?.[`games_${gamemode}`] || 0; - this.survivedPlayers = data?.[`survived_players_${gamemode}`] || 0; - this.chestsOpened = data?.[`chests_opened_${gamemode}`] || 0; - this.timePlayed = data?.[`time_played_${gamemode}`] || 0; - this.shard = data?.[`shard_${gamemode}`] || 0; - this.longestBowShot = data?.[`longest_bow_shot_${gamemode}`] || 0; - this.arrowsShot = data?.[`arrows_shot_${gamemode}`] || 0; - this.arrowsHit = data?.[`arrows_hit_${gamemode}`] || 0; - this.bowAccuracy = Divide(this.arrowsHit, this.arrowsShot); - this.fastestWin = data?.[`fastest_win_${gamemode}`] || 0; - this.heads = data?.[`heads_${gamemode}`] || 0; - this.insane = new SkyWarsMode(data, `${gamemode}_insane`); - this.normal = new SkyWarsMode(data, `${gamemode}_normal`); - } -} - -export default SkyWarsModeStats; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsPackages.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsPackages.test.ts deleted file mode 100644 index 24f45d741..000000000 --- a/src/Structures/MiniGames/SkyWars/SkyWarsPackages.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -import SkyWarsKits from './SkyWarsKits.js'; -import SkyWarsPackages from './SkyWarsPackages.js'; -import { expect, expectTypeOf, test } from 'vitest'; - -test('SkyWarsPackages', () => { - const data = new SkyWarsPackages([]); - expect(data).toBeDefined(); - expect(data).toBeInstanceOf(SkyWarsPackages); - expectTypeOf(data).toEqualTypeOf(); - expect(data.rawPackages).toBeDefined(); - expectTypeOf(data.rawPackages).toEqualTypeOf>(); - expect(data.cages).toBeDefined(); - expectTypeOf(data.cages).toEqualTypeOf(); - expect(data.kits).toBeDefined(); - expect(data.kits).toBeInstanceOf(SkyWarsKits); - expectTypeOf(data.kits).toEqualTypeOf(); - expect(data.achievements).toBeDefined(); - expectTypeOf(data.achievements).toEqualTypeOf(); -}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsPackages.ts b/src/Structures/MiniGames/SkyWars/SkyWarsPackages.ts deleted file mode 100644 index 1ae830715..000000000 --- a/src/Structures/MiniGames/SkyWars/SkyWarsPackages.ts +++ /dev/null @@ -1,26 +0,0 @@ -import SkyWarsKits from './SkyWarsKits.js'; - -class SkyWarsPackages { - rawPackages: Record; - cages: any; - kits: SkyWarsKits; - achievements: any; - constructor(data: Record[]) { - this.rawPackages = data || []; - this.cages = this.parseCages(); - this.kits = new SkyWarsKits(data); - this.achievements = this.rawPackages - ?.map((pkg: string) => pkg?.match(/^([A-Za-z]+)_?achievement([0-9]?)$/)) - ?.filter((x: any) => x) - ?.map((x: any[]) => x?.slice(1)?.join('')); - } - - parseCages(): string[] { - return this.rawPackages - .map((pkg: string) => pkg?.match(/^cage_([A-Za-z]+)-cage$/)) - .filter((x: any) => x) - .map((x: string[]) => x[1]?.replace(/-[a-z]/g, (x) => (x?.[1] || '').toUpperCase())); - } -} - -export default SkyWarsPackages; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsPrivateGames.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsPrivateGames.test.ts new file mode 100644 index 000000000..359a1f23d --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsPrivateGames.test.ts @@ -0,0 +1,36 @@ +import SkyWarsPrivateGames from './SkyWarsPrivateGames.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { PrivateGameSettingsGameSpeed, PrivateGameSettingsHealthBuff } from '../../../Types/Player.js'; + +test('SkyWarsPrivateGames', () => { + const data = new SkyWarsPrivateGames({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsPrivateGames); + expectTypeOf(data).toEqualTypeOf(); + expect(data.maxKitsAndPerks).toBeDefined(); + expectTypeOf(data.maxKitsAndPerks).toEqualTypeOf(); + expect(data.legacyItems).toBeDefined(); + expectTypeOf(data.legacyItems).toEqualTypeOf(); + expect(data.speed).toBeDefined(); + expectTypeOf(data.speed).toEqualTypeOf(); + expect(data.dragons).toBeDefined(); + expectTypeOf(data.dragons).toEqualTypeOf(); + expect(data.noKits).toBeDefined(); + expectTypeOf(data.noKits).toEqualTypeOf(); + expect(data.nightTime).toBeDefined(); + expectTypeOf(data.nightTime).toEqualTypeOf(); + expect(data.healthBuff).toBeDefined(); + expectTypeOf(data.healthBuff).toEqualTypeOf(); + expect(data.teleportMayhem).toBeDefined(); + expectTypeOf(data.teleportMayhem).toEqualTypeOf(); + expect(data.chestSwords).toBeDefined(); + expectTypeOf(data.chestSwords).toEqualTypeOf(); + expect(data.chestArmour).toBeDefined(); + expectTypeOf(data.chestArmour).toEqualTypeOf(); + expect(data.oneHitOneKill).toBeDefined(); + expectTypeOf(data.oneHitOneKill).toEqualTypeOf(); + expect(data.lowGravity).toBeDefined(); + expectTypeOf(data.lowGravity).toEqualTypeOf(); + expect(data.chestBows).toBeDefined(); + expectTypeOf(data.chestBows).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsPrivateGames.ts b/src/Structures/MiniGames/SkyWars/SkyWarsPrivateGames.ts new file mode 100644 index 000000000..ce394750d --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsPrivateGames.ts @@ -0,0 +1,34 @@ +import type { PrivateGameSettingsGameSpeed, PrivateGameSettingsHealthBuff } from '../../../Types/Player.ts'; + +class SkyWarsPrivateGames { + maxKitsAndPerks: boolean; + legacyItems: boolean; + speed: PrivateGameSettingsGameSpeed | 'UNKNOWN'; + dragons: string | 'UNKNOWN'; + noKits: boolean; + nightTime: boolean; + healthBuff: PrivateGameSettingsHealthBuff | 'UNKNOWN'; + teleportMayhem: boolean; + chestSwords: string | 'UNKNOWN'; + chestArmour: string | 'UNKNOWN'; + oneHitOneKill: boolean; + lowGravity: boolean; + chestBows: string | 'UNKNOWN'; + constructor(data: Record) { + this.maxKitsAndPerks = data?.enable_max_kits_and_perks || false; + this.legacyItems = data?.enable_legacy_items || false; + this.speed = data?.speed || 'UNKNOWN'; + this.dragons = data?.dragons || 'UNKNOWN'; + this.noKits = data?.no_kits || false; + this.nightTime = data?.enable_night_time || false; + this.healthBuff = data?.health_buff || 'UNKNOWN'; + this.teleportMayhem = data?.enable_teleport_mayhem || false; + this.chestSwords = data?.chest_swords || 'UNKNOWN'; + this.chestArmour = data?.chest_armour || 'UNKNOWN'; + this.oneHitOneKill = data?.one_hit_one_kill || false; + this.lowGravity = data?.low_gravity || false; + this.chestBows = data?.chest_bows || 'UNKNOWN'; + } +} + +export default SkyWarsPrivateGames; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRanked.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRanked.test.ts new file mode 100644 index 000000000..10f5f398d --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRanked.test.ts @@ -0,0 +1,17 @@ +import SkyWarsMode from '../SkyWarsMode/SkyWarsMode.ts'; +import SkyWarsRanked from './SkyWarsRanked.js'; +import SkyWarsRankedKits from './SkyWarsRankedKits.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsRanked', () => { + const data = new SkyWarsRanked({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsRanked); + expectTypeOf(data).toEqualTypeOf(); + expect(data.normal).toBeDefined(); + expect(data.normal).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.normal).toEqualTypeOf(); + expect(data.kits).toBeDefined(); + expect(data.kits).toBeInstanceOf(SkyWarsRankedKits); + expectTypeOf(data.kits).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRanked.ts b/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRanked.ts new file mode 100644 index 000000000..3f7bcb194 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRanked.ts @@ -0,0 +1,14 @@ +import SkyWarsMode from '../SkyWarsMode/SkyWarsMode.ts'; +import SkyWarsRankedKits from './SkyWarsRankedKits.ts'; + +class SkyWarsRanked extends SkyWarsMode { + normal: SkyWarsMode; + kits: SkyWarsRankedKits; + constructor(data: Record) { + super(data, 'ranked'); + this.normal = new SkyWarsMode(data, 'ranked_normal'); + this.kits = new SkyWarsRankedKits(data); + } +} + +export default SkyWarsRanked; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRankedKits.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRankedKits.test.ts new file mode 100644 index 000000000..b74db3976 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRankedKits.test.ts @@ -0,0 +1,46 @@ +import SkyWarsMode from '../SkyWarsMode/SkyWarsMode.js'; +import SkyWarsRankedKits from './SkyWarsRankedKits.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsRankedKits', () => { + const data = new SkyWarsRankedKits({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsRankedKits); + expectTypeOf(data).toEqualTypeOf(); + expect(data.default).toBeDefined(); + expect(data.default).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.default).toEqualTypeOf(); + expect(data.scout).toBeDefined(); + expect(data.scout).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.scout).toEqualTypeOf(); + expect(data.armorer).toBeDefined(); + expect(data.armorer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.armorer).toEqualTypeOf(); + expect(data.bowman).toBeDefined(); + expect(data.bowman).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.bowman).toEqualTypeOf(); + expect(data.champion).toBeDefined(); + expect(data.champion).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.champion).toEqualTypeOf(); + expect(data.pyromancer).toBeDefined(); + expect(data.pyromancer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.pyromancer).toEqualTypeOf(); + expect(data.hound).toBeDefined(); + expect(data.hound).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.hound).toEqualTypeOf(); + expect(data.athlete).toBeDefined(); + expect(data.athlete).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.athlete).toEqualTypeOf(); + expect(data.magician).toBeDefined(); + expect(data.magician).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.magician).toEqualTypeOf(); + expect(data.healer).toBeDefined(); + expect(data.healer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.healer).toEqualTypeOf(); + expect(data.paladin).toBeDefined(); + expect(data.paladin).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.paladin).toEqualTypeOf(); + expect(data.blacksmith).toBeDefined(); + expect(data.blacksmith).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.blacksmith).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRankedKits.ts b/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRankedKits.ts new file mode 100644 index 000000000..910b35665 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRankedKits.ts @@ -0,0 +1,32 @@ +import SkyWarsMode from '../SkyWarsMode/SkyWarsMode.ts'; + +class SkyWarsRankedKits { + default: SkyWarsMode; + scout: SkyWarsMode; + armorer: SkyWarsMode; + bowman: SkyWarsMode; + champion: SkyWarsMode; + pyromancer: SkyWarsMode; + hound: SkyWarsMode; + athlete: SkyWarsMode; + magician: SkyWarsMode; + healer: SkyWarsMode; + paladin: SkyWarsMode; + blacksmith: SkyWarsMode; + constructor(data: Record) { + this.default = new SkyWarsMode(data, 'kit_ranked_ranked_default'); + this.scout = new SkyWarsMode(data, 'kit_ranked_ranked_scout'); + this.armorer = new SkyWarsMode(data, 'kit_ranked_ranked_armorer'); + this.bowman = new SkyWarsMode(data, 'kit_ranked_ranked_bowman'); + this.champion = new SkyWarsMode(data, 'kit_ranked_ranked_champion'); + this.pyromancer = new SkyWarsMode(data, 'kit_ranked_ranked_pyromancer'); + this.hound = new SkyWarsMode(data, 'kit_ranked_ranked_hound'); + this.athlete = new SkyWarsMode(data, 'kit_ranked_ranked_athlete'); + this.magician = new SkyWarsMode(data, 'kit_ranked_ranked_magician'); + this.healer = new SkyWarsMode(data, 'kit_ranked_ranked_healer'); + this.paladin = new SkyWarsMode(data, 'kit_ranked_ranked_paladin'); + this.blacksmith = new SkyWarsMode(data, 'kit_ranked_ranked_blacksmith'); + } +} + +export default SkyWarsRankedKits; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSolo.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSolo.test.ts new file mode 100644 index 000000000..adeda206e --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSolo.test.ts @@ -0,0 +1,96 @@ +import SkyWarsMode from '../SkyWarsMode/SkyWarsMode.ts'; +import SkyWarsModePerk from '../SkyWarsMode/SkyWarsModePerk.js'; +import SkyWarsSolo from './SkyWarsSolo.js'; +import SkyWarsSoloKits from './SkyWarsSoloKits/SkyWarsSoloKits.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsSolo', () => { + const data = new SkyWarsSolo({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsSolo); + expectTypeOf(data).toEqualTypeOf(); + expect(data.normal).toBeDefined(); + expect(data.normal).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.normal).toEqualTypeOf(); + expect(data.insane).toBeDefined(); + expect(data.insane).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.insane).toEqualTypeOf(); + expect(data.lab).toBeDefined(); + expect(data.lab).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.lab).toEqualTypeOf(); + expect(data.kits).toBeDefined(); + expect(data.kits).toBeInstanceOf(SkyWarsSoloKits); + expectTypeOf(data.kits).toEqualTypeOf(); + expect(data.enderMastery).toBeDefined(); + expect(data.enderMastery).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.enderMastery).toEqualTypeOf(); + expect(data.arrowRecovery).toBeDefined(); + expect(data.arrowRecovery).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.arrowRecovery).toEqualTypeOf(); + expect(data.miningExpertise).toBeDefined(); + expect(data.miningExpertise).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.miningExpertise).toEqualTypeOf(); + expect(data.blazingArrows).toBeDefined(); + expect(data.blazingArrows).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.blazingArrows).toEqualTypeOf(); + expect(data.instantSmelting).toBeDefined(); + expect(data.instantSmelting).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.instantSmelting).toEqualTypeOf(); + expect(data.resistanceBoost).toBeDefined(); + expect(data.resistanceBoost).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.resistanceBoost).toEqualTypeOf(); + expect(data.speedBoost).toBeDefined(); + expect(data.speedBoost).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.speedBoost).toEqualTypeOf(); + expect(data.bulldozer).toBeDefined(); + expect(data.bulldozer).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.bulldozer).toEqualTypeOf(); + expect(data.marksmanship).toBeDefined(); + expect(data.marksmanship).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.marksmanship).toEqualTypeOf(); + expect(data.juggernaut).toBeDefined(); + expect(data.juggernaut).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.juggernaut).toEqualTypeOf(); + expect(data.knowledge).toBeDefined(); + expect(data.knowledge).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.knowledge).toEqualTypeOf(); + expect(data.fat).toBeDefined(); + expect(data.fat).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.fat).toEqualTypeOf(); + expect(data.nourishment).toBeDefined(); + expect(data.nourishment).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.nourishment).toEqualTypeOf(); + expect(data.annoy).toBeDefined(); + expect(data.annoy).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.annoy).toEqualTypeOf(); + expect(data.revenge).toBeDefined(); + expect(data.revenge).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.revenge).toEqualTypeOf(); + expect(data.luckyCharm).toBeDefined(); + expect(data.luckyCharm).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.luckyCharm).toEqualTypeOf(); + expect(data.bridger).toBeDefined(); + expect(data.bridger).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.bridger).toEqualTypeOf(); + expect(data.environmentalExpert).toBeDefined(); + expect(data.environmentalExpert).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.environmentalExpert).toEqualTypeOf(); + expect(data.necromancer).toBeDefined(); + expect(data.necromancer).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.necromancer).toEqualTypeOf(); + expect(data.blackMagic).toBeDefined(); + expect(data.blackMagic).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.blackMagic).toEqualTypeOf(); + expect(data.robbery).toBeDefined(); + expect(data.robbery).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.robbery).toEqualTypeOf(); + expect(data.frost).toBeDefined(); + expect(data.frost).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.frost).toEqualTypeOf(); + expect(data.barbarian).toBeDefined(); + expect(data.barbarian).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.barbarian).toEqualTypeOf(); + expect(data.savior).toBeDefined(); + expect(data.savior).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.savior).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSolo.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSolo.ts new file mode 100644 index 000000000..95a976dfd --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSolo.ts @@ -0,0 +1,67 @@ +import SkyWarsMode from '../SkyWarsMode/SkyWarsMode.ts'; +import SkyWarsModePerk from '../SkyWarsMode/SkyWarsModePerk.ts'; +import SkyWarsSoloKits from './SkyWarsSoloKits/SkyWarsSoloKits.js'; + +class SkyWarsSolo extends SkyWarsMode { + normal: SkyWarsMode; + insane: SkyWarsMode; + lab: SkyWarsMode; + kits: SkyWarsSoloKits; + enderMastery: SkyWarsModePerk; + arrowRecovery: SkyWarsModePerk; + miningExpertise: SkyWarsModePerk; + blazingArrows: SkyWarsModePerk; + instantSmelting: SkyWarsModePerk; + resistanceBoost: SkyWarsModePerk; + speedBoost: SkyWarsModePerk; + bulldozer: SkyWarsModePerk; + marksmanship: SkyWarsModePerk; + juggernaut: SkyWarsModePerk; + knowledge: SkyWarsModePerk; + fat: SkyWarsModePerk; + nourishment: SkyWarsModePerk; + annoy: SkyWarsModePerk; + revenge: SkyWarsModePerk; + luckyCharm: SkyWarsModePerk; + bridger: SkyWarsModePerk; + environmentalExpert: SkyWarsModePerk; + necromancer: SkyWarsModePerk; + blackMagic: SkyWarsModePerk; + robbery: SkyWarsModePerk; + frost: SkyWarsModePerk; + barbarian: SkyWarsModePerk; + savior: SkyWarsModePerk; + constructor(data: Record) { + super(data, 'solo'); + this.normal = new SkyWarsMode(data, 'solo_normal'); + this.insane = new SkyWarsMode(data, 'solo_insane'); + this.lab = new SkyWarsMode(data, 'lab_solo'); + this.kits = new SkyWarsSoloKits(data); + this.enderMastery = new SkyWarsModePerk(data, 'ender_mastery', 'solo'); + this.arrowRecovery = new SkyWarsModePerk(data, 'arrow_recovery', 'solo'); + this.miningExpertise = new SkyWarsModePerk(data, 'mining_expertise', 'solo'); + this.blazingArrows = new SkyWarsModePerk(data, 'blazing_arrows', 'solo'); + this.instantSmelting = new SkyWarsModePerk(data, 'instant_smelting', 'solo'); + this.resistanceBoost = new SkyWarsModePerk(data, 'resistance_boost', 'solo'); + this.speedBoost = new SkyWarsModePerk(data, 'speed_boost', 'solo'); + this.bulldozer = new SkyWarsModePerk(data, 'bulldozer', 'solo'); + this.marksmanship = new SkyWarsModePerk(data, 'marksmanship', 'solo'); + this.juggernaut = new SkyWarsModePerk(data, 'juggernaut', 'solo'); + this.knowledge = new SkyWarsModePerk(data, 'knowledge', 'solo'); + this.fat = new SkyWarsModePerk(data, 'fat', 'solo'); + this.nourishment = new SkyWarsModePerk(data, 'nourishment', 'solo'); + this.annoy = new SkyWarsModePerk(data, 'annoy', 'solo'); + this.revenge = new SkyWarsModePerk(data, 'revenge', 'solo'); + this.luckyCharm = new SkyWarsModePerk(data, 'lucky_charm', 'solo'); + this.bridger = new SkyWarsModePerk(data, 'bridger', 'solo'); + this.environmentalExpert = new SkyWarsModePerk(data, 'environmental_expert', 'solo'); + this.necromancer = new SkyWarsModePerk(data, 'necromancer', 'solo'); + this.blackMagic = new SkyWarsModePerk(data, 'black_magic', 'solo'); + this.robbery = new SkyWarsModePerk(data, 'robbery', 'solo'); + this.frost = new SkyWarsModePerk(data, 'frost', 'solo'); + this.barbarian = new SkyWarsModePerk(data, 'barbarian', 'solo'); + this.savior = new SkyWarsModePerk(data, 'savior', 'solo'); + } +} + +export default SkyWarsSolo; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKits.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKits.test.ts new file mode 100644 index 000000000..10c528ae5 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKits.test.ts @@ -0,0 +1,33 @@ +import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.js'; +import SkyWarsSoloKits from './SkyWarsSoloKits.js'; +import SkyWarsSoloKitsAdvanced from './SkyWarsSoloKitsAdvanced.js'; +import SkyWarsSoloKitsBasic from './SkyWarsSoloKitsBasic.js'; +import SkyWarsSoloKitsLab from './SkyWarsSoloKitsLab/SkyWarsSoloKitsLab.js'; +import SkyWarsSoloKitsMini from './SkyWarsSoloKitsMini.js'; +import SkyWarsSoloKitsTourney from './SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourney.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsSoloKits', () => { + const data = new SkyWarsSoloKits({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsSoloKits); + expectTypeOf(data).toEqualTypeOf(); + expect(data.lab).toBeDefined(); + expect(data.lab).toBeInstanceOf(SkyWarsSoloKitsLab); + expectTypeOf(data.lab).toEqualTypeOf(); + expect(data.basic).toBeDefined(); + expect(data.basic).toBeInstanceOf(SkyWarsSoloKitsBasic); + expectTypeOf(data.basic).toEqualTypeOf(); + expect(data.advanced).toBeDefined(); + expect(data.advanced).toBeInstanceOf(SkyWarsSoloKitsAdvanced); + expectTypeOf(data.advanced).toEqualTypeOf(); + expect(data.mini).toBeDefined(); + expect(data.mini).toBeInstanceOf(SkyWarsSoloKitsMini); + expectTypeOf(data.mini).toEqualTypeOf(); + expect(data.tourney).toBeDefined(); + expect(data.tourney).toBeInstanceOf(SkyWarsSoloKitsTourney); + expectTypeOf(data.tourney).toEqualTypeOf(); + expect(data.enderChest).toBeDefined(); + expect(data.enderChest).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.enderChest).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKits.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKits.ts new file mode 100644 index 000000000..1917f8745 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKits.ts @@ -0,0 +1,25 @@ +import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.ts'; +import SkyWarsSoloKitsAdvanced from './SkyWarsSoloKitsAdvanced.ts'; +import SkyWarsSoloKitsBasic from './SkyWarsSoloKitsBasic.ts'; +import SkyWarsSoloKitsLab from './SkyWarsSoloKitsLab/SkyWarsSoloKitsLab.ts'; +import SkyWarsSoloKitsMini from './SkyWarsSoloKitsMini.ts'; +import SkyWarsSoloKitsTourney from './SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourney.ts'; + +class SkyWarsSoloKits { + lab: SkyWarsSoloKitsLab; + basic: SkyWarsSoloKitsBasic; + advanced: SkyWarsSoloKitsAdvanced; + mini: SkyWarsSoloKitsMini; + tourney: SkyWarsSoloKitsTourney; + enderChest: SkyWarsMode; + constructor(data: Record) { + this.lab = new SkyWarsSoloKitsLab(data); + this.basic = new SkyWarsSoloKitsBasic(data); + this.advanced = new SkyWarsSoloKitsAdvanced(data); + this.mini = new SkyWarsSoloKitsMini(data); + this.tourney = new SkyWarsSoloKitsTourney(data); + this.enderChest = new SkyWarsMode(data, 'kit_enderchest_solo_enderchest'); + } +} + +export default SkyWarsSoloKits; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsAdvanced.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsAdvanced.test.ts new file mode 100644 index 000000000..c2ba2d6b5 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsAdvanced.test.ts @@ -0,0 +1,61 @@ +import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.js'; +import SkyWarsSoloKitsAdvanced from './SkyWarsSoloKitsAdvanced.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsSoloKitsAdvanced', () => { + const data = new SkyWarsSoloKitsAdvanced({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsSoloKitsAdvanced); + expectTypeOf(data).toEqualTypeOf(); + expect(data.farmer).toBeDefined(); + expect(data.farmer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.farmer).toEqualTypeOf(); + expect(data.enchanter).toBeDefined(); + expect(data.enchanter).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.enchanter).toEqualTypeOf(); + expect(data.hunter).toBeDefined(); + expect(data.hunter).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.hunter).toEqualTypeOf(); + expect(data.knight).toBeDefined(); + expect(data.knight).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.knight).toEqualTypeOf(); + expect(data.armorer).toBeDefined(); + expect(data.armorer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.armorer).toEqualTypeOf(); + expect(data.cannoneer).toBeDefined(); + expect(data.cannoneer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.cannoneer).toEqualTypeOf(); + expect(data.pyro).toBeDefined(); + expect(data.pyro).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.pyro).toEqualTypeOf(); + expect(data.salmon).toBeDefined(); + expect(data.salmon).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.salmon).toEqualTypeOf(); + expect(data.zookeeper).toBeDefined(); + expect(data.zookeeper).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.zookeeper).toEqualTypeOf(); + expect(data.enderman).toBeDefined(); + expect(data.enderman).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.enderman).toEqualTypeOf(); + expect(data.slime).toBeDefined(); + expect(data.slime).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.slime).toEqualTypeOf(); + expect(data.pigRider).toBeDefined(); + expect(data.pigRider).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.pigRider).toEqualTypeOf(); + expect(data.sloth).toBeDefined(); + expect(data.sloth).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.sloth).toEqualTypeOf(); + expect(data.jester).toBeDefined(); + expect(data.jester).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.jester).toEqualTypeOf(); + expect(data.guardian).toBeDefined(); + expect(data.guardian).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.guardian).toEqualTypeOf(); + expect(data.engineer).toBeDefined(); + expect(data.engineer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.engineer).toEqualTypeOf(); + expect(data.magician).toBeDefined(); + expect(data.magician).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.magician).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsAdvanced.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsAdvanced.ts new file mode 100644 index 000000000..46784eda6 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsAdvanced.ts @@ -0,0 +1,42 @@ +import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.ts'; + +class SkyWarsSoloKitsAdvanced { + farmer: SkyWarsMode; + enchanter: SkyWarsMode; + hunter: SkyWarsMode; + knight: SkyWarsMode; + armorer: SkyWarsMode; + cannoneer: SkyWarsMode; + pyro: SkyWarsMode; + salmon: SkyWarsMode; + zookeeper: SkyWarsMode; + enderman: SkyWarsMode; + slime: SkyWarsMode; + pigRider: SkyWarsMode; + sloth: SkyWarsMode; + jester: SkyWarsMode; + guardian: SkyWarsMode; + engineer: SkyWarsMode; + magician: SkyWarsMode; + constructor(data: Record) { + this.farmer = new SkyWarsMode(data, 'kit_advanced_solo_farmer'); + this.enchanter = new SkyWarsMode(data, 'kit_advanced_solo_enchanter'); + this.hunter = new SkyWarsMode(data, 'kit_advanced_solo_hunter'); + this.knight = new SkyWarsMode(data, 'kit_advanced_solo_knight'); + this.armorer = new SkyWarsMode(data, 'kit_advanced_solo_armorer'); + this.cannoneer = new SkyWarsMode(data, 'kit_advanced_solo_cannoneer'); + this.pyro = new SkyWarsMode(data, 'kit_advanced_solo_pyro'); + this.salmon = new SkyWarsMode(data, 'kit_advanced_solo_salmon'); + this.zookeeper = new SkyWarsMode(data, 'kit_advanced_solo_zookeeper'); + this.enderman = new SkyWarsMode(data, 'kit_advanced_solo_enderman'); + this.slime = new SkyWarsMode(data, 'kit_advanced_solo_slime'); + this.pigRider = new SkyWarsMode(data, 'kit_advanced_solo_pig-rider'); + this.sloth = new SkyWarsMode(data, 'kit_advanced_solo_sloth'); + this.jester = new SkyWarsMode(data, 'kit_advanced_solo_jester'); + this.guardian = new SkyWarsMode(data, 'kit_advanced_solo_guardian'); + this.engineer = new SkyWarsMode(data, 'kit_advanced_solo_engineer'); + this.magician = new SkyWarsMode(data, 'kit_advanced_solo_magician'); + } +} + +export default SkyWarsSoloKitsAdvanced; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsBasic.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsBasic.test.ts new file mode 100644 index 000000000..58f14b9db --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsBasic.test.ts @@ -0,0 +1,76 @@ +import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.js'; +import SkyWarsSoloKitsBasic from './SkyWarsSoloKitsBasic.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsSoloKitsBasic', () => { + const data = new SkyWarsSoloKitsBasic({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsSoloKitsBasic); + expectTypeOf(data).toEqualTypeOf(); + expect(data.default).toBeDefined(); + expect(data.default).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.default).toEqualTypeOf(); + expect(data.armorsmith).toBeDefined(); + expect(data.armorsmith).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.armorsmith).toEqualTypeOf(); + expect(data.ecologist).toBeDefined(); + expect(data.ecologist).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.ecologist).toEqualTypeOf(); + expect(data.fisherman).toBeDefined(); + expect(data.fisherman).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.fisherman).toEqualTypeOf(); + expect(data.speleologist).toBeDefined(); + expect(data.speleologist).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.speleologist).toEqualTypeOf(); + expect(data.troll).toBeDefined(); + expect(data.troll).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.troll).toEqualTypeOf(); + expect(data.snowman).toBeDefined(); + expect(data.snowman).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.snowman).toEqualTypeOf(); + expect(data.rookie).toBeDefined(); + expect(data.rookie).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.rookie).toEqualTypeOf(); + expect(data.scout).toBeDefined(); + expect(data.scout).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.scout).toEqualTypeOf(); + expect(data.energix).toBeDefined(); + expect(data.energix).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.energix).toEqualTypeOf(); + expect(data.grenade).toBeDefined(); + expect(data.grenade).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.grenade).toEqualTypeOf(); + expect(data.pharaoh).toBeDefined(); + expect(data.pharaoh).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.pharaoh).toEqualTypeOf(); + expect(data.disco).toBeDefined(); + expect(data.disco).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.disco).toEqualTypeOf(); + expect(data.frog).toBeDefined(); + expect(data.frog).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.frog).toEqualTypeOf(); + expect(data.baseballPlayer).toBeDefined(); + expect(data.baseballPlayer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.baseballPlayer).toEqualTypeOf(); + expect(data.princess).toBeDefined(); + expect(data.princess).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.princess).toEqualTypeOf(); + expect(data.batguy).toBeDefined(); + expect(data.batguy).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.batguy).toEqualTypeOf(); + expect(data.healer).toBeDefined(); + expect(data.healer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.healer).toEqualTypeOf(); + expect(data.cactus).toBeDefined(); + expect(data.cactus).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.cactus).toEqualTypeOf(); + expect(data.warlock).toBeDefined(); + expect(data.warlock).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.warlock).toEqualTypeOf(); + expect(data.archeologist).toBeDefined(); + expect(data.archeologist).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.archeologist).toEqualTypeOf(); + expect(data.fallenAngel).toBeDefined(); + expect(data.fallenAngel).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.fallenAngel).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsBasic.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsBasic.ts new file mode 100644 index 000000000..b96323e7d --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsBasic.ts @@ -0,0 +1,52 @@ +import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.ts'; + +class SkyWarsSoloKitsBasic { + default: SkyWarsMode; + armorsmith: SkyWarsMode; + ecologist: SkyWarsMode; + fisherman: SkyWarsMode; + speleologist: SkyWarsMode; + troll: SkyWarsMode; + snowman: SkyWarsMode; + rookie: SkyWarsMode; + scout: SkyWarsMode; + energix: SkyWarsMode; + grenade: SkyWarsMode; + pharaoh: SkyWarsMode; + disco: SkyWarsMode; + frog: SkyWarsMode; + baseballPlayer: SkyWarsMode; + princess: SkyWarsMode; + batguy: SkyWarsMode; + healer: SkyWarsMode; + cactus: SkyWarsMode; + warlock: SkyWarsMode; + archeologist: SkyWarsMode; + fallenAngel: SkyWarsMode; + constructor(data: Record) { + this.default = new SkyWarsMode(data, 'kit_basic_solo_default'); + this.armorsmith = new SkyWarsMode(data, 'kit_basic_solo_armorsmith'); + this.ecologist = new SkyWarsMode(data, 'kit_basic_solo_ecologist'); + this.fisherman = new SkyWarsMode(data, 'kit_basic_solo_fisherman'); + this.speleologist = new SkyWarsMode(data, 'kit_basic_solo_speleologist'); + this.troll = new SkyWarsMode(data, 'kit_basic_solo_troll'); + this.snowman = new SkyWarsMode(data, 'kit_basic_solo_snowman'); + this.rookie = new SkyWarsMode(data, 'kit_basic_solo_rookie'); + this.scout = new SkyWarsMode(data, 'kit_basic_solo_scout'); + this.energix = new SkyWarsMode(data, 'kit_basic_solo_energix'); + this.grenade = new SkyWarsMode(data, 'kit_basic_solo_grenade'); + this.pharaoh = new SkyWarsMode(data, 'kit_basic_solo_pharaoh'); + this.disco = new SkyWarsMode(data, 'kit_basic_solo_disco'); + this.frog = new SkyWarsMode(data, 'kit_basic_solo_frog'); + this.baseballPlayer = new SkyWarsMode(data, 'kit_basic_solo_baseball-player'); + this.princess = new SkyWarsMode(data, 'kit_basic_solo_princess'); + this.batguy = new SkyWarsMode(data, 'kit_basic_solo_batguy'); + this.healer = new SkyWarsMode(data, 'kit_basic_solo_healer'); + this.cactus = new SkyWarsMode(data, 'kit_basic_solo_cactus'); + this.warlock = new SkyWarsMode(data, 'kit_basic_solo_warlock'); + this.archeologist = new SkyWarsMode(data, 'kit_basic_solo_archeologist'); + this.fallenAngel = new SkyWarsMode(data, 'kit_basic_solo_fallen-angel'); + } +} + +export default SkyWarsSoloKitsBasic; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLab.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLab.test.ts new file mode 100644 index 000000000..dbd8072db --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLab.test.ts @@ -0,0 +1,21 @@ +import SkyWarsMode from '../../../SkyWarsMode/SkyWarsMode.js'; +import SkyWarsSoloKitsLab from './SkyWarsSoloKitsLab.js'; +import SkyWarsSoloKitsLabAdvanced from './SkyWarsSoloKitsLabAdvanced.js'; +import SkyWarsSoloKitsLabBasic from './SkyWarsSoloKitsLabBasic.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsSoloKitsLab', () => { + const data = new SkyWarsSoloKitsLab({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsSoloKitsLab); + expectTypeOf(data).toEqualTypeOf(); + expect(data.basic).toBeDefined(); + expect(data.basic).toBeInstanceOf(SkyWarsSoloKitsLabBasic); + expectTypeOf(data.basic).toEqualTypeOf(); + expect(data.advanced).toBeDefined(); + expect(data.advanced).toBeInstanceOf(SkyWarsSoloKitsLabAdvanced); + expectTypeOf(data.advanced).toEqualTypeOf(); + expect(data.enderChest).toBeDefined(); + expect(data.enderChest).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.enderChest).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLab.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLab.ts new file mode 100644 index 000000000..37d0ef78c --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLab.ts @@ -0,0 +1,16 @@ +import SkyWarsMode from '../../../SkyWarsMode/SkyWarsMode.ts'; +import SkyWarsSoloKitsLabAdvanced from './SkyWarsSoloKitsLabAdvanced.ts'; +import SkyWarsSoloKitsLabBasic from './SkyWarsSoloKitsLabBasic.js'; + +class SkyWarsSoloKitsLab { + basic: SkyWarsSoloKitsLabBasic; + advanced: SkyWarsSoloKitsLabAdvanced; + enderChest: SkyWarsMode; + constructor(data: Record) { + this.basic = new SkyWarsSoloKitsLabBasic(data); + this.advanced = new SkyWarsSoloKitsLabAdvanced(data); + this.enderChest = new SkyWarsMode(data, 'lab_kit_enderchest_solo_enderchest'); + } +} + +export default SkyWarsSoloKitsLab; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabAdvanced.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabAdvanced.test.ts new file mode 100644 index 000000000..02fd92fcf --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabAdvanced.test.ts @@ -0,0 +1,58 @@ +import SkyWarsMode from '../../../SkyWarsMode/SkyWarsMode.js'; +import SkyWarsSoloKitsLabAdvanced from './SkyWarsSoloKitsLabAdvanced.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsSoloKitsLabAdvanced', () => { + const data = new SkyWarsSoloKitsLabAdvanced({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsSoloKitsLabAdvanced); + expectTypeOf(data).toEqualTypeOf(); + expect(data.armorer).toBeDefined(); + expect(data.armorer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.armorer).toEqualTypeOf(); + expect(data.salmon).toBeDefined(); + expect(data.salmon).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.salmon).toEqualTypeOf(); + expect(data.knight).toBeDefined(); + expect(data.knight).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.knight).toEqualTypeOf(); + expect(data.pyro).toBeDefined(); + expect(data.pyro).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.pyro).toEqualTypeOf(); + expect(data.zookeeper).toBeDefined(); + expect(data.zookeeper).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.zookeeper).toEqualTypeOf(); + expect(data.slime).toBeDefined(); + expect(data.slime).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.slime).toEqualTypeOf(); + expect(data.farmer).toBeDefined(); + expect(data.farmer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.farmer).toEqualTypeOf(); + expect(data.enchanter).toBeDefined(); + expect(data.enchanter).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.enchanter).toEqualTypeOf(); + expect(data.jester).toBeDefined(); + expect(data.jester).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.jester).toEqualTypeOf(); + expect(data.engineer).toBeDefined(); + expect(data.engineer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.engineer).toEqualTypeOf(); + expect(data.enderman).toBeDefined(); + expect(data.enderman).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.enderman).toEqualTypeOf(); + expect(data.cannoneer).toBeDefined(); + expect(data.cannoneer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.cannoneer).toEqualTypeOf(); + expect(data.hunter).toBeDefined(); + expect(data.hunter).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.hunter).toEqualTypeOf(); + expect(data.sloth).toBeDefined(); + expect(data.sloth).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.sloth).toEqualTypeOf(); + expect(data.pigRider).toBeDefined(); + expect(data.pigRider).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.pigRider).toEqualTypeOf(); + expect(data.magician).toBeDefined(); + expect(data.magician).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.magician).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabAdvanced.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabAdvanced.ts new file mode 100644 index 000000000..6b98203bd --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabAdvanced.ts @@ -0,0 +1,40 @@ +import SkyWarsMode from '../../../SkyWarsMode/SkyWarsMode.ts'; + +class SkyWarsSoloKitsLabAdvanced { + armorer: SkyWarsMode; + salmon: SkyWarsMode; + knight: SkyWarsMode; + pyro: SkyWarsMode; + zookeeper: SkyWarsMode; + slime: SkyWarsMode; + farmer: SkyWarsMode; + enchanter: SkyWarsMode; + jester: SkyWarsMode; + engineer: SkyWarsMode; + enderman: SkyWarsMode; + cannoneer: SkyWarsMode; + hunter: SkyWarsMode; + sloth: SkyWarsMode; + pigRider: SkyWarsMode; + magician: SkyWarsMode; + constructor(data: Record) { + this.armorer = new SkyWarsMode(data, 'lab_kit_advanced_solo_armorer'); + this.salmon = new SkyWarsMode(data, 'lab_kit_advanced_solo_salmon'); + this.knight = new SkyWarsMode(data, 'lab_kit_advanced_solo_knight'); + this.pyro = new SkyWarsMode(data, 'lab_kit_advanced_solo_pyro'); + this.zookeeper = new SkyWarsMode(data, 'lab_kit_advanced_solo_zookeeper'); + this.slime = new SkyWarsMode(data, 'lab_kit_advanced_solo_slime'); + this.farmer = new SkyWarsMode(data, 'lab_kit_advanced_solo_farmer'); + this.enchanter = new SkyWarsMode(data, 'lab_kit_advanced_solo_enchanter'); + this.jester = new SkyWarsMode(data, 'lab_kit_advanced_solo_jester'); + this.engineer = new SkyWarsMode(data, 'lab_kit_advanced_solo_engineer'); + this.enderman = new SkyWarsMode(data, 'lab_kit_advanced_solo_enderman'); + this.cannoneer = new SkyWarsMode(data, 'lab_kit_advanced_solo_cannoneer'); + this.hunter = new SkyWarsMode(data, 'lab_kit_advanced_solo_hunter'); + this.sloth = new SkyWarsMode(data, 'lab_kit_advanced_solo_sloth'); + this.pigRider = new SkyWarsMode(data, 'lab_kit_advanced_solo_pig-rider'); + this.magician = new SkyWarsMode(data, 'lab_kit_advanced_solo_magician'); + } +} + +export default SkyWarsSoloKitsLabAdvanced; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabBasic.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabBasic.test.ts new file mode 100644 index 000000000..86f519e98 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabBasic.test.ts @@ -0,0 +1,61 @@ +import SkyWarsMode from '../../../SkyWarsMode/SkyWarsMode.js'; +import SkyWarsSoloKitsLabBasic from './SkyWarsSoloKitsLabBasic.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsSoloKitsLabBasic', () => { + const data = new SkyWarsSoloKitsLabBasic({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsSoloKitsLabBasic); + expectTypeOf(data).toEqualTypeOf(); + expect(data.default).toBeDefined(); + expect(data.default).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.default).toEqualTypeOf(); + expect(data.scout).toBeDefined(); + expect(data.scout).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.scout).toEqualTypeOf(); + expect(data.ecologist).toBeDefined(); + expect(data.ecologist).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.ecologist).toEqualTypeOf(); + expect(data.speleologist).toBeDefined(); + expect(data.speleologist).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.speleologist).toEqualTypeOf(); + expect(data.armorsmith).toBeDefined(); + expect(data.armorsmith).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.armorsmith).toEqualTypeOf(); + expect(data.energix).toBeDefined(); + expect(data.energix).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.energix).toEqualTypeOf(); + expect(data.baseballPlayer).toBeDefined(); + expect(data.baseballPlayer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.baseballPlayer).toEqualTypeOf(); + expect(data.disco).toBeDefined(); + expect(data.disco).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.disco).toEqualTypeOf(); + expect(data.pharaoh).toBeDefined(); + expect(data.pharaoh).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.pharaoh).toEqualTypeOf(); + expect(data.frog).toBeDefined(); + expect(data.frog).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.frog).toEqualTypeOf(); + expect(data.grenade).toBeDefined(); + expect(data.grenade).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.grenade).toEqualTypeOf(); + expect(data.fisherman).toBeDefined(); + expect(data.fisherman).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.fisherman).toEqualTypeOf(); + expect(data.rookie).toBeDefined(); + expect(data.rookie).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.rookie).toEqualTypeOf(); + expect(data.troll).toBeDefined(); + expect(data.troll).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.troll).toEqualTypeOf(); + expect(data.snowman).toBeDefined(); + expect(data.snowman).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.snowman).toEqualTypeOf(); + expect(data.princess).toBeDefined(); + expect(data.princess).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.princess).toEqualTypeOf(); + expect(data.batguy).toBeDefined(); + expect(data.batguy).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.batguy).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabBasic.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabBasic.ts new file mode 100644 index 000000000..9eac077c9 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabBasic.ts @@ -0,0 +1,42 @@ +import SkyWarsMode from '../../../SkyWarsMode/SkyWarsMode.ts'; + +class SkyWarsSoloKitsLabBasic { + default: SkyWarsMode; + scout: SkyWarsMode; + ecologist: SkyWarsMode; + speleologist: SkyWarsMode; + armorsmith: SkyWarsMode; + energix: SkyWarsMode; + baseballPlayer: SkyWarsMode; + disco: SkyWarsMode; + pharaoh: SkyWarsMode; + frog: SkyWarsMode; + grenade: SkyWarsMode; + fisherman: SkyWarsMode; + rookie: SkyWarsMode; + troll: SkyWarsMode; + snowman: SkyWarsMode; + princess: SkyWarsMode; + batguy: SkyWarsMode; + constructor(data: Record) { + this.default = new SkyWarsMode(data, 'lab_kit_basic_solo_default'); + this.scout = new SkyWarsMode(data, 'lab_kit_basic_solo_scout'); + this.ecologist = new SkyWarsMode(data, 'lab_kit_basic_solo_ecologist'); + this.speleologist = new SkyWarsMode(data, 'lab_kit_basic_solo_speleologist'); + this.armorsmith = new SkyWarsMode(data, 'lab_kit_basic_solo_armorsmith'); + this.energix = new SkyWarsMode(data, 'lab_kit_basic_solo_energix'); + this.baseballPlayer = new SkyWarsMode(data, 'lab_kit_basic_solo_baseball-player'); + this.disco = new SkyWarsMode(data, 'lab_kit_basic_solo_disco'); + this.pharaoh = new SkyWarsMode(data, 'lab_kit_basic_solo_pharaoh'); + this.frog = new SkyWarsMode(data, 'lab_kit_basic_solo_frog'); + this.grenade = new SkyWarsMode(data, 'lab_kit_basic_solo_grenade'); + this.fisherman = new SkyWarsMode(data, 'lab_kit_basic_solo_fisherman'); + this.rookie = new SkyWarsMode(data, 'lab_kit_basic_solo_rookie'); + this.troll = new SkyWarsMode(data, 'lab_kit_basic_solo_troll'); + this.snowman = new SkyWarsMode(data, 'lab_kit_basic_solo_snowman'); + this.princess = new SkyWarsMode(data, 'lab_kit_basic_solo_princess'); + this.batguy = new SkyWarsMode(data, 'lab_kit_basic_solo_batguy'); + } +} + +export default SkyWarsSoloKitsLabBasic; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsMini.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsMini.test.ts new file mode 100644 index 000000000..42af36ad6 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsMini.test.ts @@ -0,0 +1,43 @@ +import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.js'; +import SkyWarsSoloKitsMini from './SkyWarsSoloKitsMini.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsSoloKitsMini', () => { + const data = new SkyWarsSoloKitsMini({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsSoloKitsMini); + expectTypeOf(data).toEqualTypeOf(); + expect(data.athlete).toBeDefined(); + expect(data.athlete).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.athlete).toEqualTypeOf(); + expect(data.scout).toBeDefined(); + expect(data.scout).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.scout).toEqualTypeOf(); + expect(data.champion).toBeDefined(); + expect(data.champion).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.champion).toEqualTypeOf(); + expect(data.magician).toBeDefined(); + expect(data.magician).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.magician).toEqualTypeOf(); + expect(data.bowman).toBeDefined(); + expect(data.bowman).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.bowman).toEqualTypeOf(); + expect(data.healer).toBeDefined(); + expect(data.healer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.healer).toEqualTypeOf(); + expect(data.pyromancer).toBeDefined(); + expect(data.pyromancer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.pyromancer).toEqualTypeOf(); + expect(data.armorer).toBeDefined(); + expect(data.armorer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.armorer).toEqualTypeOf(); + expect(data.blacksmith).toBeDefined(); + expect(data.blacksmith).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.blacksmith).toEqualTypeOf(); + expect(data.hound).toBeDefined(); + expect(data.hound).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.hound).toEqualTypeOf(); + expect(data.paladin).toBeDefined(); + expect(data.paladin).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.paladin).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsMini.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsMini.ts new file mode 100644 index 000000000..8647a8e6c --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsMini.ts @@ -0,0 +1,30 @@ +import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.ts'; + +class SkyWarsSoloKitsMini { + athlete: SkyWarsMode; + scout: SkyWarsMode; + champion: SkyWarsMode; + magician: SkyWarsMode; + bowman: SkyWarsMode; + healer: SkyWarsMode; + pyromancer: SkyWarsMode; + armorer: SkyWarsMode; + blacksmith: SkyWarsMode; + hound: SkyWarsMode; + paladin: SkyWarsMode; + constructor(data: Record) { + this.athlete = new SkyWarsMode(data, 'kit_mini_solo_athlete'); + this.scout = new SkyWarsMode(data, 'kit_mini_solo_scout'); + this.champion = new SkyWarsMode(data, 'kit_mini_solo_champion'); + this.magician = new SkyWarsMode(data, 'kit_mini_solo_magician'); + this.bowman = new SkyWarsMode(data, 'kit_mini_solo_bowman'); + this.healer = new SkyWarsMode(data, 'kit_mini_solo_healer'); + this.pyromancer = new SkyWarsMode(data, 'kit_mini_solo_pyromancer'); + this.armorer = new SkyWarsMode(data, 'kit_mini_solo_armorer'); + this.blacksmith = new SkyWarsMode(data, 'kit_mini_solo_blacksmith'); + this.hound = new SkyWarsMode(data, 'kit_mini_solo_hound'); + this.paladin = new SkyWarsMode(data, 'kit_mini_solo_paladin'); + } +} + +export default SkyWarsSoloKitsMini; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourney.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourney.test.ts new file mode 100644 index 000000000..83d5ed50f --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourney.test.ts @@ -0,0 +1,21 @@ +import SkyWarsMode from '../../../SkyWarsMode/SkyWarsMode.js'; +import SkyWarsSoloKitsTourney from './SkyWarsSoloKitsTourney.js'; +import SkyWarsSoloKitsTourneyAdvanced from './SkyWarsSoloKitsTourneyAdvanced.js'; +import SkyWarsSoloKitsTourneyBasic from './SkyWarsSoloKitsTourneyBasic.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsSoloKitsTourney', () => { + const data = new SkyWarsSoloKitsTourney({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsSoloKitsTourney); + expectTypeOf(data).toEqualTypeOf(); + expect(data.basic).toBeDefined(); + expect(data.basic).toBeInstanceOf(SkyWarsSoloKitsTourneyBasic); + expectTypeOf(data.basic).toEqualTypeOf(); + expect(data.advanced).toBeDefined(); + expect(data.advanced).toBeInstanceOf(SkyWarsSoloKitsTourneyAdvanced); + expectTypeOf(data.advanced).toEqualTypeOf(); + expect(data.enderChest).toBeDefined(); + expect(data.enderChest).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.enderChest).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourney.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourney.ts new file mode 100644 index 000000000..1c7f093eb --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourney.ts @@ -0,0 +1,16 @@ +import SkyWarsMode from '../../../SkyWarsMode/SkyWarsMode.ts'; +import SkyWarsSoloKitsTourneyAdvanced from './SkyWarsSoloKitsTourneyAdvanced.ts'; +import SkyWarsSoloKitsTourneyBasic from './SkyWarsSoloKitsTourneyBasic.ts'; + +class SkyWarsSoloKitsTourney { + basic: SkyWarsSoloKitsTourneyBasic; + advanced: SkyWarsSoloKitsTourneyAdvanced; + enderChest: SkyWarsMode; + constructor(data: Record) { + this.basic = new SkyWarsSoloKitsTourneyBasic(data); + this.advanced = new SkyWarsSoloKitsTourneyAdvanced(data); + this.enderChest = new SkyWarsMode(data, 'tourney_kit_enderchest_solo_enderchest'); + } +} + +export default SkyWarsSoloKitsTourney; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyAdvanced.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyAdvanced.test.ts new file mode 100644 index 000000000..c688beac2 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyAdvanced.test.ts @@ -0,0 +1,49 @@ +import SkyWarsMode from '../../../SkyWarsMode/SkyWarsMode.js'; +import SkyWarsSoloKitsTourneyAdvanced from './SkyWarsSoloKitsTourneyAdvanced.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsSoloKitsTourneyAdvanced', () => { + const data = new SkyWarsSoloKitsTourneyAdvanced({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsSoloKitsTourneyAdvanced); + expectTypeOf(data).toEqualTypeOf(); + expect(data.armorer).toBeDefined(); + expect(data.armorer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.armorer).toEqualTypeOf(); + expect(data.enderman).toBeDefined(); + expect(data.enderman).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.enderman).toEqualTypeOf(); + expect(data.knight).toBeDefined(); + expect(data.knight).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.knight).toEqualTypeOf(); + expect(data.enchanter).toBeDefined(); + expect(data.enchanter).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.enchanter).toEqualTypeOf(); + expect(data.farmer).toBeDefined(); + expect(data.farmer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.farmer).toEqualTypeOf(); + expect(data.cannoneer).toBeDefined(); + expect(data.cannoneer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.cannoneer).toEqualTypeOf(); + expect(data.jester).toBeDefined(); + expect(data.jester).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.jester).toEqualTypeOf(); + expect(data.hunter).toBeDefined(); + expect(data.hunter).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.hunter).toEqualTypeOf(); + expect(data.magician).toBeDefined(); + expect(data.magician).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.magician).toEqualTypeOf(); + expect(data.zookeeper).toBeDefined(); + expect(data.zookeeper).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.zookeeper).toEqualTypeOf(); + expect(data.slime).toBeDefined(); + expect(data.slime).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.slime).toEqualTypeOf(); + expect(data.engineer).toBeDefined(); + expect(data.engineer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.engineer).toEqualTypeOf(); + expect(data.pigRider).toBeDefined(); + expect(data.pigRider).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.pigRider).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyAdvanced.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyAdvanced.ts new file mode 100644 index 000000000..19a4906af --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyAdvanced.ts @@ -0,0 +1,34 @@ +import SkyWarsMode from '../../../SkyWarsMode/SkyWarsMode.ts'; + +class SkyWarsSoloKitsTourneyAdvanced { + armorer: SkyWarsMode; + enderman: SkyWarsMode; + knight: SkyWarsMode; + enchanter: SkyWarsMode; + farmer: SkyWarsMode; + cannoneer: SkyWarsMode; + jester: SkyWarsMode; + hunter: SkyWarsMode; + magician: SkyWarsMode; + zookeeper: SkyWarsMode; + slime: SkyWarsMode; + engineer: SkyWarsMode; + pigRider: SkyWarsMode; + constructor(data: Record) { + this.armorer = new SkyWarsMode(data, 'tourney_kit_advanced_solo_armorer'); + this.enderman = new SkyWarsMode(data, 'tourney_kit_advanced_solo_enderman'); + this.knight = new SkyWarsMode(data, 'tourney_kit_advanced_solo_knight'); + this.enchanter = new SkyWarsMode(data, 'tourney_kit_advanced_solo_enchanter'); + this.farmer = new SkyWarsMode(data, 'tourney_kit_advanced_solo_farmer'); + this.cannoneer = new SkyWarsMode(data, 'tourney_kit_advanced_solo_cannoneer'); + this.jester = new SkyWarsMode(data, 'tourney_kit_advanced_solo_jester'); + this.hunter = new SkyWarsMode(data, 'tourney_kit_advanced_solo_hunter'); + this.magician = new SkyWarsMode(data, 'tourney_kit_advanced_solo_magician'); + this.zookeeper = new SkyWarsMode(data, 'tourney_kit_advanced_solo_zookeeper'); + this.slime = new SkyWarsMode(data, 'tourney_kit_advanced_solo_slime'); + this.engineer = new SkyWarsMode(data, 'tourney_kit_advanced_solo_engineer'); + this.pigRider = new SkyWarsMode(data, 'tourney_kit_advanced_solo_pig-rider'); + } +} + +export default SkyWarsSoloKitsTourneyAdvanced; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyBasic.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyBasic.test.ts new file mode 100644 index 000000000..16f6aae39 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyBasic.test.ts @@ -0,0 +1,70 @@ +import SkyWarsMode from '../../../SkyWarsMode/SkyWarsMode.js'; +import SkyWarsSoloKitsTourneyBasic from './SkyWarsSoloKitsTourneyBasic.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsSoloKitsTourneyBasic', () => { + const data = new SkyWarsSoloKitsTourneyBasic({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsSoloKitsTourneyBasic); + expectTypeOf(data).toEqualTypeOf(); + expect(data.frog).toBeDefined(); + expect(data.frog).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.frog).toEqualTypeOf(); + expect(data.disco).toBeDefined(); + expect(data.disco).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.disco).toEqualTypeOf(); + expect(data.armorsmith).toBeDefined(); + expect(data.armorsmith).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.armorsmith).toEqualTypeOf(); + expect(data.fisherman).toBeDefined(); + expect(data.fisherman).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.fisherman).toEqualTypeOf(); + expect(data.pharaoh).toBeDefined(); + expect(data.pharaoh).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.pharaoh).toEqualTypeOf(); + expect(data.ecologist).toBeDefined(); + expect(data.ecologist).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.ecologist).toEqualTypeOf(); + expect(data.healer).toBeDefined(); + expect(data.healer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.healer).toEqualTypeOf(); + expect(data.energix).toBeDefined(); + expect(data.energix).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.energix).toEqualTypeOf(); + expect(data.speleologist).toBeDefined(); + expect(data.speleologist).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.speleologist).toEqualTypeOf(); + expect(data.cactus).toBeDefined(); + expect(data.cactus).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.cactus).toEqualTypeOf(); + expect(data.rookie).toBeDefined(); + expect(data.rookie).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.rookie).toEqualTypeOf(); + expect(data.baseballPlayer).toBeDefined(); + expect(data.baseballPlayer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.baseballPlayer).toEqualTypeOf(); + expect(data.default).toBeDefined(); + expect(data.default).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.default).toEqualTypeOf(); + expect(data.scout).toBeDefined(); + expect(data.scout).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.scout).toEqualTypeOf(); + expect(data.snowman).toBeDefined(); + expect(data.snowman).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.snowman).toEqualTypeOf(); + expect(data.princess).toBeDefined(); + expect(data.princess).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.princess).toEqualTypeOf(); + expect(data.grenade).toBeDefined(); + expect(data.grenade).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.grenade).toEqualTypeOf(); + expect(data.troll).toBeDefined(); + expect(data.troll).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.troll).toEqualTypeOf(); + expect(data.warlock).toBeDefined(); + expect(data.warlock).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.warlock).toEqualTypeOf(); + expect(data.batguy).toBeDefined(); + expect(data.batguy).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.batguy).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyBasic.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyBasic.ts new file mode 100644 index 000000000..dd589319c --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyBasic.ts @@ -0,0 +1,48 @@ +import SkyWarsMode from '../../../SkyWarsMode/SkyWarsMode.ts'; + +class SkyWarsSoloKitsTourneyBasic { + frog: SkyWarsMode; + disco: SkyWarsMode; + armorsmith: SkyWarsMode; + fisherman: SkyWarsMode; + pharaoh: SkyWarsMode; + ecologist: SkyWarsMode; + healer: SkyWarsMode; + energix: SkyWarsMode; + speleologist: SkyWarsMode; + cactus: SkyWarsMode; + rookie: SkyWarsMode; + baseballPlayer: SkyWarsMode; + default: SkyWarsMode; + scout: SkyWarsMode; + snowman: SkyWarsMode; + princess: SkyWarsMode; + grenade: SkyWarsMode; + troll: SkyWarsMode; + warlock: SkyWarsMode; + batguy: SkyWarsMode; + constructor(data: Record) { + this.frog = new SkyWarsMode(data, 'tourney_kit_basic_solo_frog'); + this.disco = new SkyWarsMode(data, 'tourney_kit_basic_solo_disco'); + this.armorsmith = new SkyWarsMode(data, 'tourney_kit_basic_solo_armorsmith'); + this.fisherman = new SkyWarsMode(data, 'tourney_kit_basic_solo_fisherman'); + this.pharaoh = new SkyWarsMode(data, 'tourney_kit_basic_solo_pharaoh'); + this.ecologist = new SkyWarsMode(data, 'tourney_kit_basic_solo_ecologist'); + this.healer = new SkyWarsMode(data, 'tourney_kit_basic_solo_healer'); + this.energix = new SkyWarsMode(data, 'tourney_kit_basic_solo_energix'); + this.speleologist = new SkyWarsMode(data, 'tourney_kit_basic_solo_speleologist'); + this.cactus = new SkyWarsMode(data, 'tourney_kit_basic_solo_cactus'); + this.rookie = new SkyWarsMode(data, 'tourney_kit_basic_solo_rookie'); + this.baseballPlayer = new SkyWarsMode(data, 'tourney_kit_basic_solo_baseball-player'); + this.default = new SkyWarsMode(data, 'tourney_kit_basic_solo_default'); + this.scout = new SkyWarsMode(data, 'tourney_kit_basic_solo_scout'); + this.snowman = new SkyWarsMode(data, 'tourney_kit_basic_solo_snowman'); + this.princess = new SkyWarsMode(data, 'tourney_kit_basic_solo_princess'); + this.grenade = new SkyWarsMode(data, 'tourney_kit_basic_solo_grenade'); + this.troll = new SkyWarsMode(data, 'tourney_kit_basic_solo_troll'); + this.warlock = new SkyWarsMode(data, 'tourney_kit_basic_solo_warlock'); + this.batguy = new SkyWarsMode(data, 'tourney_kit_basic_solo_batguy'); + } +} + +export default SkyWarsSoloKitsTourneyBasic; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeams.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeams.test.ts new file mode 100644 index 000000000..10815d401 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeams.test.ts @@ -0,0 +1,90 @@ +import SkyWarsMode from '../SkyWarsMode/SkyWarsMode.ts'; +import SkyWarsModePerk from '../SkyWarsMode/SkyWarsModePerk.js'; +import SkyWarsTeams from './SkyWarsTeams.js'; +import SkyWarsTeamsKits from './SkyWarsTeamsKits/SkyWarsTeamsKits.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsTeams', () => { + const data = new SkyWarsTeams({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsTeams); + expectTypeOf(data).toEqualTypeOf(); + expect(data.normal).toBeDefined(); + expect(data.normal).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.normal).toEqualTypeOf(); + expect(data.insane).toBeDefined(); + expect(data.insane).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.insane).toEqualTypeOf(); + expect(data.kits).toBeDefined(); + expect(data.kits).toBeInstanceOf(SkyWarsTeamsKits); + expectTypeOf(data.kits).toEqualTypeOf(); + expect(data.instantSmelting).toBeDefined(); + expect(data.instantSmelting).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.instantSmelting).toEqualTypeOf(); + expect(data.enderMastery).toBeDefined(); + expect(data.enderMastery).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.enderMastery).toEqualTypeOf(); + expect(data.resistanceBoost).toBeDefined(); + expect(data.resistanceBoost).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.resistanceBoost).toEqualTypeOf(); + expect(data.miningExpertise).toBeDefined(); + expect(data.miningExpertise).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.miningExpertise).toEqualTypeOf(); + expect(data.juggernaut).toBeDefined(); + expect(data.juggernaut).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.juggernaut).toEqualTypeOf(); + expect(data.blazingArrows).toBeDefined(); + expect(data.blazingArrows).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.blazingArrows).toEqualTypeOf(); + expect(data.arrowRecovery).toBeDefined(); + expect(data.arrowRecovery).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.arrowRecovery).toEqualTypeOf(); + expect(data.speedBoost).toBeDefined(); + expect(data.speedBoost).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.speedBoost).toEqualTypeOf(); + expect(data.fat).toBeDefined(); + expect(data.fat).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.fat).toEqualTypeOf(); + expect(data.nourishment).toBeDefined(); + expect(data.nourishment).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.nourishment).toEqualTypeOf(); + expect(data.knowledge).toBeDefined(); + expect(data.knowledge).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.knowledge).toEqualTypeOf(); + expect(data.savior).toBeDefined(); + expect(data.savior).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.savior).toEqualTypeOf(); + expect(data.marksmanship).toBeDefined(); + expect(data.marksmanship).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.marksmanship).toEqualTypeOf(); + expect(data.bridger).toBeDefined(); + expect(data.bridger).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.bridger).toEqualTypeOf(); + expect(data.luckyCharm).toBeDefined(); + expect(data.luckyCharm).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.luckyCharm).toEqualTypeOf(); + expect(data.necromancer).toBeDefined(); + expect(data.necromancer).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.necromancer).toEqualTypeOf(); + expect(data.blackMagic).toBeDefined(); + expect(data.blackMagic).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.blackMagic).toEqualTypeOf(); + expect(data.environmentalExpert).toBeDefined(); + expect(data.environmentalExpert).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.environmentalExpert).toEqualTypeOf(); + expect(data.robbery).toBeDefined(); + expect(data.robbery).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.robbery).toEqualTypeOf(); + expect(data.frost).toBeDefined(); + expect(data.frost).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.frost).toEqualTypeOf(); + expect(data.annoyOMite).toBeDefined(); + expect(data.annoyOMite).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.annoyOMite).toEqualTypeOf(); + expect(data.bulldozer).toBeDefined(); + expect(data.bulldozer).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.bulldozer).toEqualTypeOf(); + expect(data.barbarian).toBeDefined(); + expect(data.barbarian).toBeInstanceOf(SkyWarsModePerk); + expectTypeOf(data.barbarian).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeams.ts b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeams.ts new file mode 100644 index 000000000..eb4605726 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeams.ts @@ -0,0 +1,63 @@ +import SkyWarsMode from '../SkyWarsMode/SkyWarsMode.ts'; +import SkyWarsModePerk from '../SkyWarsMode/SkyWarsModePerk.ts'; +import SkyWarsTeamsKits from './SkyWarsTeamsKits/SkyWarsTeamsKits.ts'; + +class SkyWarsTeams extends SkyWarsMode { + normal: SkyWarsMode; + insane: SkyWarsMode; + kits: SkyWarsTeamsKits; + instantSmelting: SkyWarsModePerk; + enderMastery: SkyWarsModePerk; + resistanceBoost: SkyWarsModePerk; + miningExpertise: SkyWarsModePerk; + juggernaut: SkyWarsModePerk; + blazingArrows: SkyWarsModePerk; + arrowRecovery: SkyWarsModePerk; + speedBoost: SkyWarsModePerk; + fat: SkyWarsModePerk; + nourishment: SkyWarsModePerk; + knowledge: SkyWarsModePerk; + savior: SkyWarsModePerk; + marksmanship: SkyWarsModePerk; + bridger: SkyWarsModePerk; + luckyCharm: SkyWarsModePerk; + necromancer: SkyWarsModePerk; + blackMagic: SkyWarsModePerk; + environmentalExpert: SkyWarsModePerk; + robbery: SkyWarsModePerk; + frost: SkyWarsModePerk; + annoyOMite: SkyWarsModePerk; + bulldozer: SkyWarsModePerk; + barbarian: SkyWarsModePerk; + constructor(data: Record) { + super(data, 'team'); + this.normal = new SkyWarsMode(data, 'team_normal'); + this.insane = new SkyWarsMode(data, 'team_insane'); + this.kits = new SkyWarsTeamsKits(data); + this.instantSmelting = new SkyWarsModePerk(data, 'instant_smelting', 'team'); + this.enderMastery = new SkyWarsModePerk(data, 'ender_mastery', 'team'); + this.resistanceBoost = new SkyWarsModePerk(data, 'resistance_boost', 'team'); + this.miningExpertise = new SkyWarsModePerk(data, 'mining_expertise', 'team'); + this.juggernaut = new SkyWarsModePerk(data, 'juggernaut', 'team'); + this.blazingArrows = new SkyWarsModePerk(data, 'blazing_arrows', 'team'); + this.arrowRecovery = new SkyWarsModePerk(data, 'arrow_recovery', 'team'); + this.speedBoost = new SkyWarsModePerk(data, 'speed_boost', 'team'); + this.fat = new SkyWarsModePerk(data, 'fat', 'team'); + this.nourishment = new SkyWarsModePerk(data, 'nourishment', 'team'); + this.knowledge = new SkyWarsModePerk(data, 'knowledge', 'team'); + this.savior = new SkyWarsModePerk(data, 'savior', 'team'); + this.marksmanship = new SkyWarsModePerk(data, 'marksmanship', 'team'); + this.bridger = new SkyWarsModePerk(data, 'bridger', 'team'); + this.luckyCharm = new SkyWarsModePerk(data, 'lucky_charm', 'team'); + this.necromancer = new SkyWarsModePerk(data, 'necromancer', 'team'); + this.blackMagic = new SkyWarsModePerk(data, 'black_magic', 'team'); + this.environmentalExpert = new SkyWarsModePerk(data, 'environmental_expert', 'team'); + this.robbery = new SkyWarsModePerk(data, 'robbery', 'team'); + this.frost = new SkyWarsModePerk(data, 'frost', 'team'); + this.annoyOMite = new SkyWarsModePerk(data, 'annoy-o-mite', 'team'); + this.bulldozer = new SkyWarsModePerk(data, 'bulldozer', 'team'); + this.barbarian = new SkyWarsModePerk(data, 'barbarian', 'team'); + } +} + +export default SkyWarsTeams; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKits.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKits.test.ts new file mode 100644 index 000000000..f9cdd8e7e --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKits.test.ts @@ -0,0 +1,29 @@ +import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.js'; +import SkyWarsTeamsKits from './SkyWarsTeamsKits.js'; +import SkyWarsTeamsKitsAttacking from './SkyWarsTeamsKitsAttacking.js'; +import SkyWarsTeamsKitsDefending from './SkyWarsTeamsKitsDefending.js'; +import SkyWarsTeamsKitsMining from './SkyWarsTeamsKitsMining.js'; +import SkyWarsTeamsKitsSupporting from './SkyWarsTeamsKitsSupporting.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsTeamsKits', () => { + const data = new SkyWarsTeamsKits({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsTeamsKits); + expectTypeOf(data).toEqualTypeOf(); + expect(data.mining).toBeDefined(); + expect(data.mining).toBeInstanceOf(SkyWarsTeamsKitsMining); + expectTypeOf(data.mining).toEqualTypeOf(); + expect(data.defending).toBeDefined(); + expect(data.defending).toBeInstanceOf(SkyWarsTeamsKitsDefending); + expectTypeOf(data.defending).toEqualTypeOf(); + expect(data.supporting).toBeDefined(); + expect(data.supporting).toBeInstanceOf(SkyWarsTeamsKitsSupporting); + expectTypeOf(data.supporting).toEqualTypeOf(); + expect(data.attacking).toBeDefined(); + expect(data.attacking).toBeInstanceOf(SkyWarsTeamsKitsAttacking); + expectTypeOf(data.attacking).toEqualTypeOf(); + expect(data.enderChest).toBeDefined(); + expect(data.enderChest).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.enderChest).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKits.ts b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKits.ts new file mode 100644 index 000000000..9ea0ff743 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKits.ts @@ -0,0 +1,22 @@ +import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.ts'; +import SkyWarsTeamsKitsAttacking from './SkyWarsTeamsKitsAttacking.ts'; +import SkyWarsTeamsKitsDefending from './SkyWarsTeamsKitsDefending.ts'; +import SkyWarsTeamsKitsMining from './SkyWarsTeamsKitsMining.ts'; +import SkyWarsTeamsKitsSupporting from './SkyWarsTeamsKitsSupporting.ts'; + +class SkyWarsTeamsKits { + mining: SkyWarsTeamsKitsMining; + defending: SkyWarsTeamsKitsDefending; + supporting: SkyWarsTeamsKitsSupporting; + attacking: SkyWarsTeamsKitsAttacking; + enderChest: SkyWarsMode; + constructor(data: Record) { + this.mining = new SkyWarsTeamsKitsMining(data); + this.defending = new SkyWarsTeamsKitsDefending(data); + this.supporting = new SkyWarsTeamsKitsSupporting(data); + this.attacking = new SkyWarsTeamsKitsAttacking(data); + this.enderChest = new SkyWarsMode(data, 'kit_enderchest_team_enderchest'); + } +} + +export default SkyWarsTeamsKits; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsAttacking.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsAttacking.test.ts new file mode 100644 index 000000000..1d81050b6 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsAttacking.test.ts @@ -0,0 +1,67 @@ +import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.js'; +import SkyWarsTeamsKitsAttacking from './SkyWarsTeamsKitsAttacking.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsTeamsKitsAttacking', () => { + const data = new SkyWarsTeamsKitsAttacking({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsTeamsKitsAttacking); + expectTypeOf(data).toEqualTypeOf(); + expect(data.scout).toBeDefined(); + expect(data.scout).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.scout).toEqualTypeOf(); + expect(data.knight).toBeDefined(); + expect(data.knight).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.knight).toEqualTypeOf(); + expect(data.snowman).toBeDefined(); + expect(data.snowman).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.snowman).toEqualTypeOf(); + expect(data.hunter).toBeDefined(); + expect(data.hunter).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.hunter).toEqualTypeOf(); + expect(data.enderman).toBeDefined(); + expect(data.enderman).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.enderman).toEqualTypeOf(); + expect(data.energix).toBeDefined(); + expect(data.energix).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.energix).toEqualTypeOf(); + expect(data.slime).toBeDefined(); + expect(data.slime).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.slime).toEqualTypeOf(); + expect(data.salmon).toBeDefined(); + expect(data.salmon).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.salmon).toEqualTypeOf(); + expect(data.sloth).toBeDefined(); + expect(data.sloth).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.sloth).toEqualTypeOf(); + expect(data.pigRider).toBeDefined(); + expect(data.pigRider).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.pigRider).toEqualTypeOf(); + expect(data.grenade).toBeDefined(); + expect(data.grenade).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.grenade).toEqualTypeOf(); + expect(data.engineer).toBeDefined(); + expect(data.engineer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.engineer).toEqualTypeOf(); + expect(data.magician).toBeDefined(); + expect(data.magician).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.magician).toEqualTypeOf(); + expect(data.default).toBeDefined(); + expect(data.default).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.default).toEqualTypeOf(); + expect(data.jester).toBeDefined(); + expect(data.jester).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.jester).toEqualTypeOf(); + expect(data.fisherman).toBeDefined(); + expect(data.fisherman).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.fisherman).toEqualTypeOf(); + expect(data.archeologist).toBeDefined(); + expect(data.archeologist).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.archeologist).toEqualTypeOf(); + expect(data.defaultTeams).toBeDefined(); + expect(data.defaultTeams).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.defaultTeams).toEqualTypeOf(); + expect(data.fallenAngel).toBeDefined(); + expect(data.fallenAngel).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.fallenAngel).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsAttacking.ts b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsAttacking.ts new file mode 100644 index 000000000..bad1570fc --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsAttacking.ts @@ -0,0 +1,46 @@ +import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.ts'; + +class SkyWarsTeamsKitsAttacking { + scout: SkyWarsMode; + knight: SkyWarsMode; + snowman: SkyWarsMode; + hunter: SkyWarsMode; + enderman: SkyWarsMode; + energix: SkyWarsMode; + slime: SkyWarsMode; + salmon: SkyWarsMode; + sloth: SkyWarsMode; + pigRider: SkyWarsMode; + grenade: SkyWarsMode; + engineer: SkyWarsMode; + magician: SkyWarsMode; + default: SkyWarsMode; + jester: SkyWarsMode; + fisherman: SkyWarsMode; + archeologist: SkyWarsMode; + defaultTeams: SkyWarsMode; + fallenAngel: SkyWarsMode; + constructor(data: Record) { + this.scout = new SkyWarsMode(data, 'kit_attacking_team_scout'); + this.knight = new SkyWarsMode(data, 'kit_attacking_team_knight'); + this.snowman = new SkyWarsMode(data, 'kit_attacking_team_snowman'); + this.hunter = new SkyWarsMode(data, 'kit_attacking_team_hunter'); + this.enderman = new SkyWarsMode(data, 'kit_attacking_team_enderman'); + this.energix = new SkyWarsMode(data, 'kit_attacking_team_energix'); + this.slime = new SkyWarsMode(data, 'kit_attacking_team_slime'); + this.salmon = new SkyWarsMode(data, 'kit_attacking_team_salmon'); + this.sloth = new SkyWarsMode(data, 'kit_attacking_team_sloth'); + this.pigRider = new SkyWarsMode(data, 'kit_attacking_team_pig-rider'); + this.grenade = new SkyWarsMode(data, 'kit_attacking_team_grenade'); + this.engineer = new SkyWarsMode(data, 'kit_attacking_team_engineer'); + this.magician = new SkyWarsMode(data, 'kit_attacking_team_magician'); + this.default = new SkyWarsMode(data, 'kit_attacking_team_default'); + this.jester = new SkyWarsMode(data, 'kit_attacking_team_jester'); + this.fisherman = new SkyWarsMode(data, 'kit_attacking_team_fisherman'); + this.archeologist = new SkyWarsMode(data, 'kit_attacking_team_archeologist'); + this.defaultTeams = new SkyWarsMode(data, 'kit_attacking_teams_default'); + this.fallenAngel = new SkyWarsMode(data, 'kit_attacking_team_fallen-angel'); + } +} + +export default SkyWarsTeamsKitsAttacking; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsDefending.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsDefending.test.ts new file mode 100644 index 000000000..652874162 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsDefending.test.ts @@ -0,0 +1,37 @@ +import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.js'; +import SkyWarsTeamsKitsDefending from './SkyWarsTeamsKitsDefending.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsTeamsKitsDefending', () => { + const data = new SkyWarsTeamsKitsDefending({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsTeamsKitsDefending); + expectTypeOf(data).toEqualTypeOf(); + expect(data.armorer).toBeDefined(); + expect(data.armorer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.armorer).toEqualTypeOf(); + expect(data.baseballPlayer).toBeDefined(); + expect(data.baseballPlayer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.baseballPlayer).toEqualTypeOf(); + expect(data.guardian).toBeDefined(); + expect(data.guardian).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.guardian).toEqualTypeOf(); + expect(data.batguy).toBeDefined(); + expect(data.batguy).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.batguy).toEqualTypeOf(); + expect(data.frog).toBeDefined(); + expect(data.frog).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.frog).toEqualTypeOf(); + expect(data.disco).toBeDefined(); + expect(data.disco).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.disco).toEqualTypeOf(); + expect(data.farmer).toBeDefined(); + expect(data.farmer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.farmer).toEqualTypeOf(); + expect(data.cactus).toBeDefined(); + expect(data.cactus).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.cactus).toEqualTypeOf(); + expect(data.golem).toBeDefined(); + expect(data.golem).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.golem).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsDefending.ts b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsDefending.ts new file mode 100644 index 000000000..b4841efdc --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsDefending.ts @@ -0,0 +1,26 @@ +import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.ts'; + +class SkyWarsTeamsKitsDefending { + armorer: SkyWarsMode; + baseballPlayer: SkyWarsMode; + guardian: SkyWarsMode; + batguy: SkyWarsMode; + frog: SkyWarsMode; + disco: SkyWarsMode; + farmer: SkyWarsMode; + cactus: SkyWarsMode; + golem: SkyWarsMode; + constructor(data: Record) { + this.armorer = new SkyWarsMode(data, 'kit_defending_team_armorer'); + this.baseballPlayer = new SkyWarsMode(data, 'kit_defending_team_baseball-player'); + this.guardian = new SkyWarsMode(data, 'kit_defending_team_guardian'); + this.batguy = new SkyWarsMode(data, 'kit_defending_team_batguy'); + this.frog = new SkyWarsMode(data, 'kit_defending_team_frog'); + this.disco = new SkyWarsMode(data, 'kit_defending_team_disco'); + this.farmer = new SkyWarsMode(data, 'kit_defending_team_farmer'); + this.cactus = new SkyWarsMode(data, 'kit_defending_team_cactus'); + this.golem = new SkyWarsMode(data, 'kit_defending_team_golem'); + } +} + +export default SkyWarsTeamsKitsDefending; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsMining.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsMining.test.ts new file mode 100644 index 000000000..fdf8d8328 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsMining.test.ts @@ -0,0 +1,22 @@ +import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.js'; +import SkyWarsTeamsKitsMining from './SkyWarsTeamsKitsMining.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsTeamsKitsMining', () => { + const data = new SkyWarsTeamsKitsMining({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsTeamsKitsMining); + expectTypeOf(data).toEqualTypeOf(); + expect(data.default).toBeDefined(); + expect(data.default).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.default).toEqualTypeOf(); + expect(data.cannoneer).toBeDefined(); + expect(data.cannoneer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.cannoneer).toEqualTypeOf(); + expect(data.speleologist).toBeDefined(); + expect(data.speleologist).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.speleologist).toEqualTypeOf(); + expect(data.defaultTeams).toBeDefined(); + expect(data.defaultTeams).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.defaultTeams).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsMining.ts b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsMining.ts new file mode 100644 index 000000000..7bb11c689 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsMining.ts @@ -0,0 +1,16 @@ +import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.ts'; + +class SkyWarsTeamsKitsMining { + default: SkyWarsMode; + cannoneer: SkyWarsMode; + speleologist: SkyWarsMode; + defaultTeams: SkyWarsMode; + constructor(data: Record) { + this.default = new SkyWarsMode(data, 'kit_mining_team_default'); + this.cannoneer = new SkyWarsMode(data, 'kit_mining_team_cannoneer'); + this.speleologist = new SkyWarsMode(data, 'kit_mining_team_speleologist'); + this.defaultTeams = new SkyWarsMode(data, 'kit_mining_teams_default'); + } +} + +export default SkyWarsTeamsKitsMining; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsSupporting.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsSupporting.test.ts new file mode 100644 index 000000000..e68e792a0 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsSupporting.test.ts @@ -0,0 +1,43 @@ +import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.js'; +import SkyWarsTeamsKitsSupporting from './SkyWarsTeamsKitsSupporting.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('SkyWarsTeamsKitsSupporting', () => { + const data = new SkyWarsTeamsKitsSupporting({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(SkyWarsTeamsKitsSupporting); + expectTypeOf(data).toEqualTypeOf(); + expect(data.healer).toBeDefined(); + expect(data.healer).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.healer).toEqualTypeOf(); + expect(data.ecologist).toBeDefined(); + expect(data.ecologist).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.ecologist).toEqualTypeOf(); + expect(data.armorsmith).toBeDefined(); + expect(data.armorsmith).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.armorsmith).toEqualTypeOf(); + expect(data.rookie).toBeDefined(); + expect(data.rookie).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.rookie).toEqualTypeOf(); + expect(data.enchanter).toBeDefined(); + expect(data.enchanter).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.enchanter).toEqualTypeOf(); + expect(data.pyro).toBeDefined(); + expect(data.pyro).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.pyro).toEqualTypeOf(); + expect(data.pharaoh).toBeDefined(); + expect(data.pharaoh).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.pharaoh).toEqualTypeOf(); + expect(data.warlock).toBeDefined(); + expect(data.warlock).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.warlock).toEqualTypeOf(); + expect(data.zookeeper).toBeDefined(); + expect(data.zookeeper).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.zookeeper).toEqualTypeOf(); + expect(data.princess).toBeDefined(); + expect(data.princess).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.princess).toEqualTypeOf(); + expect(data.troll).toBeDefined(); + expect(data.troll).toBeInstanceOf(SkyWarsMode); + expectTypeOf(data.troll).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsSupporting.ts b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsSupporting.ts new file mode 100644 index 000000000..df8214657 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsSupporting.ts @@ -0,0 +1,30 @@ +import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.ts'; + +class SkyWarsTeamsKitsSupporting { + healer: SkyWarsMode; + ecologist: SkyWarsMode; + armorsmith: SkyWarsMode; + rookie: SkyWarsMode; + enchanter: SkyWarsMode; + pyro: SkyWarsMode; + pharaoh: SkyWarsMode; + warlock: SkyWarsMode; + zookeeper: SkyWarsMode; + princess: SkyWarsMode; + troll: SkyWarsMode; + constructor(data: Record) { + this.healer = new SkyWarsMode(data, 'kit_supporting_team_healer'); + this.ecologist = new SkyWarsMode(data, 'kit_supporting_team_ecologist'); + this.armorsmith = new SkyWarsMode(data, 'kit_supporting_team_armorsmith'); + this.rookie = new SkyWarsMode(data, 'kit_supporting_team_rookie'); + this.enchanter = new SkyWarsMode(data, 'kit_supporting_team_enchanter'); + this.pyro = new SkyWarsMode(data, 'kit_supporting_team_pyro'); + this.pharaoh = new SkyWarsMode(data, 'kit_supporting_team_pharaoh'); + this.warlock = new SkyWarsMode(data, 'kit_supporting_team_warlock'); + this.zookeeper = new SkyWarsMode(data, 'kit_supporting_team_zookeeper'); + this.princess = new SkyWarsMode(data, 'kit_supporting_team_princess'); + this.troll = new SkyWarsMode(data, 'kit_supporting_team_troll'); + } +} + +export default SkyWarsTeamsKitsSupporting; diff --git a/src/Types/Player.ts b/src/Types/Player.ts index af5a30be5..f01e5a4fc 100644 --- a/src/Types/Player.ts +++ b/src/Types/Player.ts @@ -21,7 +21,6 @@ export type ArenaBrawlRunes = 'slowing' | 'energy' | 'damage' | 'tank' | 'speed' export type MiniWallsKits = 'soldier' | 'archer' | 'builder'; export type WoolWarsClassNames = 'ASSAULT' | 'TANK' | 'GOLEM' | 'SWORDSMAN' | 'ENGINEER' | 'ARCHER'; export type SmashHeoresModes = 'normal' | '2v2' | 'teams'; -export type SkyWarsBaseModes = 'solo' | 'team'; export type MegaWallsModes = 'face_off' | 'gvg'; export type SpeedUHCModes = 'solo' | 'solo_normal' | 'solo_insane' | 'team' | 'team_normal' | 'team_insane'; export type UHCModes = 'solo' | 'red_vs_blue' | 'no_diamonds' | 'brawl' | 'solo_brawl' | 'duo_brawl'; @@ -93,15 +92,6 @@ export type MegaWallsKits = | 'renegade' | 'snowman'; -export type SkyWarsModes = - | 'mega' - | 'mega_doubles' - | 'lab' - | 'solo_normal' - | 'solo_insane' - | 'team_normal' - | 'team_insane'; - export type SmashHeoresHeros = | 'THE_BULK' | 'CAKE_MONSTER' @@ -259,72 +249,6 @@ export type QuakecraftSights = | 'PINK' | 'GREEN'; -export type SkyWarsKitNames = - | 'kit_mythical_end-lord' - | 'kit_supporting_team_armorsmith' - | 'ecologist' - | 'rookie' - | 'enchanter' - | 'snowman' - | 'armorsmith' - | 'scout' - | 'knight' - | 'armorer' - | 'energix' - | 'enderchest' - | 'healer' - | 'frog' - | 'grenade' - | 'batguy' - | 'pharaoh' - | 'disco' - | 'princess' - | 'enderman' - | 'pyro' - | 'speleologist' - | 'farmer' - | 'cannoneer' - | 'fisherman' - | 'troll' - | 'hunter' - | 'guardian' - | 'engineer' - | 'salmon' - | 'slime' - | 'magician' - | 'sloth' - | 'zookeeper' - | 'jester' - | 'golem' - | 'cactus' - | 'warlock' - | 'archeologist' - | 'kit_advanced_solo_pig-rider' - | 'kit_attacking_team_scout' - | 'kit_basic_solo_archeologist' - | 'kit_basic_solo_frog' - | 'kit_defending_team_armorer' - | 'kit_advanced_solo_armorer' - | 'kit_defending_team_batguy' - | 'kit_supporting_team_ecologist' - | 'kit_basic_solo_disco' - | 'kit_attacking_team_knight' - | 'kit_advanced_solo_farmer' - | 'kit_advanced_solo_hunter' - | 'kit_basic_solo_ecologist' - | 'kit_supporting_team_rookie' - | 'kit_supporting_team_healer' - | 'kit_mining_team_cannoneer' - | 'kit_defending_team_disco' - | 'kit_mining_team_default' - | 'kit_advanced_solo_pyro' - | 'kit_defending_team_baseball-player' - | 'kit_basic_solo_speleologist' - | 'kit_attacking_team_energix' - | 'kit_defending_team_frog' - | 'kit_advanced_solo_enderman' - | 'kit_basic_solo_baseball-player'; - export type UHCKits = | 'ARCHERY_TOOLS' | 'WORKING_TOOLS' @@ -412,19 +336,6 @@ export type BedWarsPrestige = | 'Mystic' | 'Eternal'; -export type SkyWarsPrestige = - | 'Iron' - | 'Gold' - | 'Diamond' - | 'Emerald' - | 'Sapphire' - | 'Ruby' - | 'Crystal' - | 'Opal' - | 'Amethyst' - | 'Rainbow' - | 'Mythic'; - export type TurboKartRacersHorn = | 'DEFAULT' | 'SHY' @@ -1608,6 +1519,9 @@ export type BuildBattleTitle = export type LeaderboardSettingsResetType = 'MONTHLY' | 'NEVER' | 'WEEKLY'; +export type PrivateGameSettingsGameSpeed = 'No Speed' | 'Speed I' | 'Speed II' | 'Speed III'; +export type PrivateGameSettingsHealthBuff = 'Normal Health' | 'Double Health' | 'Triple Health'; + export type MurderMysteryDescentMode = 'ASSASSINS' | 'CLASSIC' | 'INFECTION'; export type MurderMysteryMode = | 'MURDER_ASSASSINS' @@ -2843,9 +2757,7 @@ export type BedWarsChallengeName = | 'STOP_LIGHT' | 'TOXIC_RAIN'; export type BedWarsPrivateGameSettingsEventTime = '0.5x - Slower' | '1x - Normal' | '2x - Faster' | '4x - Fastest'; -export type BedWarsPrivateGameSettingsHealthBuff = 'Normal Health' | 'Double Health' | 'Triple Health'; export type BedWarsPrivateGameSettingsRespawnTime = '1 Second' | '5 Seconds' | '10 Seconds'; -export type BedWarsPrivateGameSettingsGameSpeed = 'No Speed' | 'Speed I' | 'Speed II' | 'Speed III'; export type BedWarsSettingsDeposit = 'ENABLED' | 'DISABLED' | 'HOLOGRAMS_HIDDEN'; export type BedWarsSettingsSlumberItemNotification = 'CHAT_MESSAGES' | 'ABOVE_HOTBAR' | 'DISABLED'; export type BedWarsSlumberBag = @@ -4031,3 +3943,328 @@ export type PlayerGeneralSelectedCosmetic = 'random_cosmetic' | 'random_favorite export type BedWarsPracticeModeId = 'BOW' | 'BRIDGING' | 'FIREBALL_JUMPING' | 'MLG' | 'PEARL_CLUTCHING'; export type BedWarsPracticeBridgingRecordsDistances = '100' | '50' | '30'; export type BedWarsPracticeBridgingRecordsElevations = 'NONE' | 'SLIGHT' | 'STAIRCASE'; + +export type SkyWarsModeSolo = 'solo_normal' | 'solo_insane' | 'lab_solo' | 'solo'; +export type SkyWarsModeTeam = 'team_normal' | 'team_insane' | 'team'; +export type SkyWarsModeMege = 'mega_doubles_normal' | 'mega_doubles' | 'mega_normal' | 'mega'; +export type SkyWarsModeMini = 'mini_normal' | 'mini'; +export type SkyWarsModeRanked = 'ranked_normal' | 'ranked'; +export type SkyWarsModeTourney = 'crazytourney_normal' | 'tourney_crazytourney' | 'crazytourney' | 'tourney'; +export type SkyWarsModeId = + | SkyWarsModeSolo + | SkyWarsModeTeam + | SkyWarsModeMege + | SkyWarsModeMini + | SkyWarsModeRanked + | SkyWarsModeTourney + | 'lab'; + +export type SkyWarsMythicKitId = + | 'kit_mythical_chronobreaker' + | 'kit_mythical_nether-lord' + | 'kit_mythical_end-lord' + | 'kit_mythical_monster-trainer' + | 'kit_mythical_cryomancer' + | 'kit_mythical_thundermeister' + | 'kit_mythical_fishmonger'; +export type SkyWarsBasicSoloKitId = + | 'kit_basic_solo_default' + | 'kit_basic_solo_armorsmith' + | 'kit_basic_solo_ecologist' + | 'kit_basic_solo_fisherman' + | 'kit_basic_solo_speleologist' + | 'kit_basic_solo_troll' + | 'kit_basic_solo_snowman' + | 'kit_basic_solo_rookie' + | 'kit_basic_solo_scout' + | 'kit_basic_solo_energix' + | 'kit_basic_solo_grenade' + | 'kit_basic_solo_pharaoh' + | 'kit_basic_solo_disco' + | 'kit_basic_solo_frog' + | 'kit_basic_solo_baseball-player' + | 'kit_basic_solo_princess' + | 'kit_basic_solo_batguy' + | 'kit_basic_solo_healer' + | 'kit_basic_solo_cactus' + | 'kit_basic_solo_warlock' + | 'kit_basic_solo_archeologist' + | 'kit_basic_solo_fallen-angel'; +export type SkyWarsAdvancedSoloKitId = + | 'kit_advanced_solo_farmer' + | 'kit_advanced_solo_enchanter' + | 'kit_advanced_solo_hunter' + | 'kit_advanced_solo_knight' + | 'kit_advanced_solo_armorer' + | 'kit_advanced_solo_cannoneer' + | 'kit_advanced_solo_pyro' + | 'kit_advanced_solo_salmon' + | 'kit_advanced_solo_zookeeper' + | 'kit_advanced_solo_enderman' + | 'kit_advanced_solo_slime' + | 'kit_advanced_solo_pig-rider' + | 'kit_advanced_solo_sloth' + | 'kit_advanced_solo_jester' + | 'kit_advanced_solo_guardian' + | 'kit_advanced_solo_engineer' + | 'kit_advanced_solo_magician'; +export type SkyWarsMiniSoloKitId = + | 'kit_mini_solo_athlete' + | 'kit_mini_solo_scout' + | 'kit_mini_solo_champion' + | 'kit_mini_solo_magician' + | 'kit_mini_solo_bowman' + | 'kit_mini_solo_healer' + | 'kit_mini_solo_pyromancer' + | 'kit_mini_solo_armorer' + | 'kit_mini_solo_blacksmith' + | 'kit_mini_solo_hound' + | 'kit_mini_solo_paladin'; +export type SkyWarsBasicLabSoloKitId = + | 'lab_kit_basic_solo_scout' + | 'lab_kit_basic_solo_ecologist' + | 'lab_kit_basic_solo_speleologist' + | 'lab_kit_basic_solo_armorsmith' + | 'lab_kit_basic_solo_energix' + | 'lab_kit_basic_solo_baseball-player' + | 'lab_kit_basic_solo_disco' + | 'lab_kit_basic_solo_pharaoh' + | 'lab_kit_basic_solo_default' + | 'lab_kit_basic_solo_frog' + | 'lab_kit_basic_solo_grenade' + | 'lab_kit_basic_solo_fisherman' + | 'lab_kit_basic_solo_rookie' + | 'lab_kit_basic_solo_troll' + | 'lab_kit_basic_solo_snowman' + | 'lab_kit_basic_solo_princess' + | 'lab_kit_basic_solo_batguy'; +export type SkyWarsAdvancedLabSoloKitId = + | 'lab_kit_advanced_solo_armorer' + | 'lab_kit_advanced_solo_salmon' + | 'lab_kit_advanced_solo_knight' + | 'lab_kit_advanced_solo_pyro' + | 'lab_kit_advanced_solo_zookeeper' + | 'lab_kit_advanced_solo_slime' + | 'lab_kit_advanced_solo_farmer' + | 'lab_kit_advanced_solo_enchanter' + | 'lab_kit_advanced_solo_jester' + | 'lab_kit_advanced_solo_engineer' + | 'lab_kit_advanced_solo_enderman' + | 'lab_kit_advanced_solo_cannoneer' + | 'lab_kit_advanced_solo_hunter' + | 'lab_kit_advanced_solo_sloth' + | 'lab_kit_advanced_solo_pig-rider' + | 'lab_kit_advanced_solo_magician'; +export type SkyWarsLabSoloKitId = + | SkyWarsBasicLabSoloKitId + | SkyWarsAdvancedLabSoloKitId + | 'lab_kit_enderchest_solo_enderchest'; +export type SkyWarsBasicTourneySoloKitId = + | 'tourney_kit_basic_solo_frog' + | 'tourney_kit_basic_solo_disco' + | 'tourney_kit_basic_solo_armorsmith' + | 'tourney_kit_basic_solo_fisherman' + | 'tourney_kit_basic_solo_pharaoh' + | 'tourney_kit_basic_solo_ecologist' + | 'tourney_kit_basic_solo_healer' + | 'tourney_kit_basic_solo_energix' + | 'tourney_kit_basic_solo_speleologist' + | 'tourney_kit_basic_solo_cactus' + | 'tourney_kit_basic_solo_rookie' + | 'tourney_kit_basic_solo_baseball-player' + | 'tourney_kit_basic_solo_default' + | 'tourney_kit_basic_solo_scout' + | 'tourney_kit_basic_solo_snowman' + | 'tourney_kit_basic_solo_princess' + | 'tourney_kit_basic_solo_grenade' + | 'tourney_kit_basic_solo_troll' + | 'tourney_kit_basic_solo_warlock' + | 'tourney_kit_basic_solo_batguy'; +export type SkyWarsAdvancedTourneySoloKitId = + | 'tourney_kit_advanced_solo_armorer' + | 'tourney_kit_advanced_solo_enderman' + | 'tourney_kit_advanced_solo_knight' + | 'tourney_kit_advanced_solo_enchanter' + | 'tourney_kit_advanced_solo_farmer' + | 'tourney_kit_advanced_solo_cannoneer' + | 'tourney_kit_advanced_solo_jester' + | 'tourney_kit_advanced_solo_hunter' + | 'tourney_kit_advanced_solo_magician' + | 'tourney_kit_advanced_solo_zookeeper' + | 'tourney_kit_advanced_solo_slime' + | 'tourney_kit_advanced_solo_engineer' + | 'tourney_kit_advanced_solo_pig-rider' + | 'tourney_kit_advanced_solo_guardian'; +export type SkyWarsTourneySoloKitId = + | SkyWarsBasicTourneySoloKitId + | SkyWarsAdvancedTourneySoloKitId + | 'tourney_kit_enderchest_solo_enderchest'; +export type SkyWarsSoloKitId = + | SkyWarsTourneySoloKitId + | SkyWarsLabSoloKitId + | SkyWarsBasicSoloKitId + | SkyWarsAdvancedSoloKitId + | SkyWarsMiniSoloKitId + | 'kit_enderchest_solo_enderchest'; + +export type SkyWarsMegaKitId = + | 'kit_mega_mega_default' + | 'kit_mega_mega_hunter' + | 'kit_mega_mega_scout' + | 'kit_mega_mega_baseball-player' + | 'kit_mega_mega_armorer' + | 'kit_mega_mega_knight' + | 'kit_mega_mega_cannoneer' + | 'kit_mega_mega_hellhound' + | 'kit_mega_mega_witch' + | 'kit_mega_mega_fisherman' + | 'kit_mega_mega_armorsmith' + | 'kit_mega_mega_pyromaniac' + | 'kit_mega_mega_paladin' + | 'kit_mega_mega_healer' + | 'kit_mega_mega_skeletor' + | 'kit_mega_mega_enderman'; + +export type SkyWarsRankedPerkId = + | 'kit_ranked_ranked_default' + | 'kit_ranked_ranked_scout' + | 'kit_ranked_ranked_armorer' + | 'kit_ranked_ranked_bowman' + | 'kit_ranked_ranked_champion' + | 'kit_ranked_ranked_pyromancer' + | 'kit_ranked_ranked_hound' + | 'kit_ranked_ranked_athlete' + | 'kit_ranked_ranked_magician' + | 'kit_ranked_ranked_healer' + | 'kit_ranked_ranked_paladin' + | 'kit_ranked_ranked_blacksmith'; + +export type SkyWarsMiningTeamsKitId = + | 'kit_mining_team_default' + | 'kit_mining_team_cannoneer' + | 'kit_mining_team_speleologist' + | 'kit_mining_teams_default'; +export type SkyWarsDefendingTeamsKitId = + | 'kit_defending_team_armorer' + | 'kit_defending_team_baseball-player' + | 'kit_defending_team_guardian' + | 'kit_defending_team_batguy' + | 'kit_defending_team_frog' + | 'kit_defending_team_disco' + | 'kit_defending_team_farmer' + | 'kit_defending_team_cactus' + | 'kit_defending_team_golem'; +export type SkyWarsSupportingTeamsKitId = + | 'kit_supporting_team_healer' + | 'kit_supporting_team_ecologist' + | 'kit_supporting_team_armorsmith' + | 'kit_supporting_team_rookie' + | 'kit_supporting_team_enchanter' + | 'kit_supporting_team_pyro' + | 'kit_supporting_team_pharaoh' + | 'kit_supporting_team_warlock' + | 'kit_supporting_team_zookeeper' + | 'kit_supporting_team_princess' + | 'kit_supporting_team_troll'; +export type SkyWarsAttackingTeamsKitId = + | 'kit_attacking_team_scout' + | 'kit_attacking_team_knight' + | 'kit_attacking_team_snowman' + | 'kit_attacking_team_hunter' + | 'kit_attacking_team_enderman' + | 'kit_attacking_team_energix' + | 'kit_attacking_team_slime' + | 'kit_attacking_team_salmon' + | 'kit_attacking_team_sloth' + | 'kit_attacking_team_pig-rider' + | 'kit_attacking_team_grenade' + | 'kit_attacking_team_engineer' + | 'kit_attacking_team_magician' + | 'kit_attacking_team_default' + | 'kit_attacking_team_jester' + | 'kit_attacking_team_fisherman' + | 'kit_attacking_team_archeologist' + | 'kit_attacking_teams_default' + | 'kit_attacking_team_fallen-angel'; +export type SkyWarsTeamsKitId = + | SkyWarsMiningTeamsKitId + | SkyWarsDefendingTeamsKitId + | SkyWarsSupportingTeamsKitId + | SkyWarsAttackingTeamsKitId + | 'kit_enderchest_team_enderchest'; + +export type SkyWarsKitId = + | SkyWarsSoloKitId + | SkyWarsMegaKitId + | SkyWarsMythicKitId + | SkyWarsRankedPerkId + | SkyWarsTeamsKitId; +export type SkyWarsKillType = '' | 'melee' | 'void' | 'bow' | 'mob' | 'fall'; +export type SkyWarsSoloPerkId = + | 'ender_mastery' + | 'arrow_recovery' + | 'mining_expertise' + | 'blazing_arrows' + | 'instant_smelting' + | 'resistance_boost' + | 'speed_boost' + | 'bulldozer' + | 'marksmanship' + | 'juggernaut' + | 'knowledge' + | 'fat' + | 'nourishment' + | 'annoy' + | 'revenge' + | 'lucky_charm' + | 'bridger' + | 'environmental_expert' + | 'necromancer' + | 'black_magic' + | 'robbery' + | 'frost' + | 'barbarian' + | 'savior'; +export type SkyWarsMegePerkId = + | 'rusher' + | 'mining_expertise' + | 'ender_mastery' + | 'blazing_arrows' + | 'arrow_recovery' + | 'juggernaut' + | 'tank' + | 'nourishment' + | 'notoriety' + | 'instant_smelting' + | 'marksmanship' + | 'environmental_expert' + | 'bridger' + | 'lucky_charm' + | 'black_magic' + | 'necromancer' + | 'telekinesis'; +export type SkyWarsTeamsPerkId = + | 'instant_smelting' + | 'ender_mastery' + | 'resistance_boost' + | 'mining_expertise' + | 'juggernaut' + | 'blazing_arrows' + | 'arrow_recovery' + | 'speed_boost' + | 'fat' + | 'nourishment' + | 'knowledge' + | 'savior' + | 'marksmanship' + | 'bridger' + | 'lucky_charm' + | 'necromancer' + | 'black_magic' + | 'environmental_expert' + | 'robbery' + | 'frost' + | 'annoy-o-mite' + | 'bulldozer' + | 'barbarian'; +export type SkyWarsPerkId = SkyWarsSoloPerkId | SkyWarsMegePerkId | SkyWarsTeamsPerkId; diff --git a/src/Utils/ParseBedWarsMode.ts b/src/Utils/ParseBedWarsMode.ts deleted file mode 100644 index 4f0ceb938..000000000 --- a/src/Utils/ParseBedWarsMode.ts +++ /dev/null @@ -1,3 +0,0 @@ -export default function ParseBedWarsMode(mode?: string): string { - return mode && mode.trim() !== '' ? `${mode.replace(/_$/, '')}_` : ''; -} diff --git a/src/Utils/ParseMode.ts b/src/Utils/ParseMode.ts new file mode 100644 index 000000000..6723d4d55 --- /dev/null +++ b/src/Utils/ParseMode.ts @@ -0,0 +1,11 @@ +export function ParseModeBefore(mode?: string): string { + return mode && mode.trim() !== '' ? `${mode.replace(/_$/, '')}_` : ''; +} + +export function ParseModeAfter(mode?: string): string { + return mode && mode.trim() !== '' ? `_${mode.replace(/_$/, '')}` : ''; +} + +export function ParseModeBeforeAfter(mode?: string): string { + return mode && mode.trim() !== '' ? `_${mode.replace(/_$/, '')}_` : ''; +} diff --git a/src/index.ts b/src/index.ts index 41bda3327..1e1ec6f3a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -20,8 +20,8 @@ export * from './Utils/Constants.js'; export * from './Utils/Divide.js'; export * from './Utils/Guild.js'; export * from './Utils/Oscillation.js'; -export * from './Utils/ParseBedWarsMode.js'; export * from './Utils/ParseBoosterType.js'; +export * from './Utils/ParseMode.js'; export * from './Utils/RemoveSnakeCase.js'; export * from './Utils/Romanize.js'; export * from './Utils/SkyBlockUtils.js'; @@ -33,6 +33,7 @@ import ArcadeOptions from './Structures/MiniGames/Arcade/ArcadeOptions.js'; import ArenaBrawl from './Structures/MiniGames/ArenaBrawl/ArenaBrawl.js'; import ArenaBrawlMode from './Structures/MiniGames/ArenaBrawl/ArenaBrawlMode.js'; import BaseAchievement from './Structures/Static/Achievements/BaseAchievement.js'; +import BaseKillDeathsType from './Structures/MiniGames/Shared/BaseKillDeathsType.js'; import BedWars from './Structures/MiniGames/BedWars/BedWars.js'; import BedWarsBeds from './Structures/MiniGames/BedWars/BedWarsBeds.js'; import BedWarsBoxes from './Structures/MiniGames/BedWars/BedWarsBoxes.js'; @@ -345,11 +346,36 @@ import SkyBlockSkill from './Structures/SkyBlock/Skills/SkyBlockSkill.js'; import SkyBlockSkillLevel from './Structures/SkyBlock/Skills/SkyBlockSkillLevel.js'; import SkyBlockSkills from './Structures/SkyBlock/Skills/SkyBlockSkills.js'; import SkyWars from './Structures/MiniGames/SkyWars/SkyWars.js'; -import SkyWarsKit from './Structures/MiniGames/SkyWars/SkyWarsKit.js'; -import SkyWarsKits from './Structures/MiniGames/SkyWars/SkyWarsKits.js'; -import SkyWarsMode from './Structures/MiniGames/SkyWars/SkyWarsMode.js'; -import SkyWarsModeStats from './Structures/MiniGames/SkyWars/SkyWarsModeStats.js'; -import SkyWarsPackages from './Structures/MiniGames/SkyWars/SkyWarsPackages.js'; +import SkyWarsHeads from './Structures/MiniGames/SkyWars/SkyWarsHeads.js'; +import SkyWarsKillsDeaths from './Structures/MiniGames/SkyWars/SkyWarsKillsDeaths.js'; +import SkyWarsKillsDeathsType from './Structures/MiniGames/SkyWars/SkyWarsKillsDeathsType.js'; +import SkyWarsKitsMythic from './Structures/MiniGames/SkyWars/SkyWarsKitsMythics/SkyWarsKitsMythic.js'; +import SkyWarsKitsMythics from './Structures/MiniGames/SkyWars/SkyWarsKitsMythics/SkyWarsKitsMythics.js'; +import SkyWarsMega from './Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMega.js'; +import SkyWarsMegaKits from './Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMegaKits.js'; +import SkyWarsMini from './Structures/MiniGames/SkyWars/SkyWarsMini.js'; +import SkyWarsMode from './Structures/MiniGames/SkyWars/SkyWarsMode/SkyWarsMode.js'; +import SkyWarsModePerk from './Structures/MiniGames/SkyWars/SkyWarsMode/SkyWarsModePerk.js'; +import SkyWarsPrivateGames from './Structures/MiniGames/SkyWars/SkyWarsPrivateGames.js'; +import SkyWarsRanked from './Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRanked.js'; +import SkyWarsRankedKits from './Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRankedKits.js'; +import SkyWarsSolo from './Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSolo.js'; +import SkyWarsSoloKits from './Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKits.js'; +import SkyWarsSoloKitsAdvanced from './Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsAdvanced.js'; +import SkyWarsSoloKitsBasic from './Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsBasic.js'; +import SkyWarsSoloKitsLab from './Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLab.js'; +import SkyWarsSoloKitsLabAdvanced from './Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabAdvanced.js'; +import SkyWarsSoloKitsLabBasic from './Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabBasic.js'; +import SkyWarsSoloKitsMini from './Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsMini.js'; +import SkyWarsSoloKitsTourney from './Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourney.js'; +import SkyWarsSoloKitsTourneyAdvanced from './Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyAdvanced.js'; +import SkyWarsSoloKitsTourneyBasic from './Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyBasic.js'; +import SkyWarsTeams from './Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeams.js'; +import SkyWarsTeamsKits from './Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKits.js'; +import SkyWarsTeamsKitsAttacking from './Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsAttacking.js'; +import SkyWarsTeamsKitsDefending from './Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsDefending.js'; +import SkyWarsTeamsKitsMining from './Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsMining.js'; +import SkyWarsTeamsKitsSupporting from './Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsSupporting.js'; import SmashHeoresHero from './Structures/MiniGames/SmashHeroes/SmashHeoresHero.js'; import SmashHeroes from './Structures/MiniGames/SmashHeroes/SmashHeroes.js'; import SmashHeroesMode from './Structures/MiniGames/SmashHeroes/SmashHeroesMode.js'; @@ -389,6 +415,7 @@ export { ArenaBrawl, ArenaBrawlMode, BaseAchievement, + BaseKillDeathsType, BedWars, BedWarsBeds, BedWarsBoxes, @@ -701,11 +728,36 @@ export { SkyBlockSkillLevel, SkyBlockSkills, SkyWars, - SkyWarsKit, - SkyWarsKits, + SkyWarsHeads, + SkyWarsKillsDeaths, + SkyWarsKillsDeathsType, + SkyWarsKitsMythic, + SkyWarsKitsMythics, + SkyWarsMega, + SkyWarsMegaKits, + SkyWarsMini, SkyWarsMode, - SkyWarsModeStats, - SkyWarsPackages, + SkyWarsModePerk, + SkyWarsPrivateGames, + SkyWarsRanked, + SkyWarsRankedKits, + SkyWarsSolo, + SkyWarsSoloKits, + SkyWarsSoloKitsAdvanced, + SkyWarsSoloKitsBasic, + SkyWarsSoloKitsLab, + SkyWarsSoloKitsLabAdvanced, + SkyWarsSoloKitsLabBasic, + SkyWarsSoloKitsMini, + SkyWarsSoloKitsTourney, + SkyWarsSoloKitsTourneyAdvanced, + SkyWarsSoloKitsTourneyBasic, + SkyWarsTeams, + SkyWarsTeamsKits, + SkyWarsTeamsKitsAttacking, + SkyWarsTeamsKitsDefending, + SkyWarsTeamsKitsMining, + SkyWarsTeamsKitsSupporting, SmashHeoresHero, SmashHeroes, SmashHeroesMode, @@ -746,6 +798,7 @@ export default { ArenaBrawl, ArenaBrawlMode, BaseAchievement, + BaseKillDeathsType, BedWars, BedWarsBeds, BedWarsBoxes, @@ -1058,11 +1111,36 @@ export default { SkyBlockSkillLevel, SkyBlockSkills, SkyWars, - SkyWarsKit, - SkyWarsKits, + SkyWarsHeads, + SkyWarsKillsDeaths, + SkyWarsKillsDeathsType, + SkyWarsKitsMythic, + SkyWarsKitsMythics, + SkyWarsMega, + SkyWarsMegaKits, + SkyWarsMini, SkyWarsMode, - SkyWarsModeStats, - SkyWarsPackages, + SkyWarsModePerk, + SkyWarsPrivateGames, + SkyWarsRanked, + SkyWarsRankedKits, + SkyWarsSolo, + SkyWarsSoloKits, + SkyWarsSoloKitsAdvanced, + SkyWarsSoloKitsBasic, + SkyWarsSoloKitsLab, + SkyWarsSoloKitsLabAdvanced, + SkyWarsSoloKitsLabBasic, + SkyWarsSoloKitsMini, + SkyWarsSoloKitsTourney, + SkyWarsSoloKitsTourneyAdvanced, + SkyWarsSoloKitsTourneyBasic, + SkyWarsTeams, + SkyWarsTeamsKits, + SkyWarsTeamsKitsAttacking, + SkyWarsTeamsKitsDefending, + SkyWarsTeamsKitsMining, + SkyWarsTeamsKitsSupporting, SmashHeoresHero, SmashHeroes, SmashHeroesMode, From 59a3277bc8c36955ffe91836283a452edde37a2c Mon Sep 17 00:00:00 2001 From: Jacob Date: Sat, 20 Dec 2025 00:50:40 +0800 Subject: [PATCH 096/124] Release 12.0.0-19 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1ef900ce8..bdf13a8e9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hypixel-api-reborn", - "version": "12.0.0-18", + "version": "12.0.0-19", "description": "Feature-rich Hypixel API wrapper for Node.js", "main": "dist/index.js", "types": "dist/index.d.ts", From 4d3ecc81b2b9be47ac36b70d5506effba62ae3ef Mon Sep 17 00:00:00 2001 From: Jacob Date: Sun, 21 Dec 2025 14:24:26 +0800 Subject: [PATCH 097/124] feat(SkyWarsLevel) Adds data about SkyWars Levels Signed-off-by: Jacob --- .../MiniGames/SkyWars/SkyWars.test.ts | 6 +++ src/Structures/MiniGames/SkyWars/SkyWars.ts | 50 +++++++++++++++++++ src/Utils/Constants.ts | 13 +++++ 3 files changed, 69 insertions(+) diff --git a/src/Structures/MiniGames/SkyWars/SkyWars.test.ts b/src/Structures/MiniGames/SkyWars/SkyWars.test.ts index bc1bd9732..424a64b07 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWars.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWars.test.ts @@ -40,6 +40,12 @@ test('SkyWars', () => { expect(data.xp).toBeDefined(); expect(data.xp).toBeGreaterThanOrEqual(0); expectTypeOf(data.xp).toEqualTypeOf(); + expect(data.level).toBeDefined(); + expectTypeOf(data.level).toEqualTypeOf(); + expect(data.levelWithProgress).toBeDefined(); + expectTypeOf(data.levelWithProgress).toEqualTypeOf<{ currentXp: number; required: number }>(); + expect(data.levelFormatted).toBeDefined(); + expectTypeOf(data.levelFormatted).toEqualTypeOf(); expect(data.mythicalKits).toBeDefined(); expect(data.mythicalKits).toBeInstanceOf(SkyWarsKitsMythics); expectTypeOf(data.mythicalKits).toEqualTypeOf(); diff --git a/src/Structures/MiniGames/SkyWars/SkyWars.ts b/src/Structures/MiniGames/SkyWars/SkyWars.ts index 6ae002689..64a819722 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWars.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWars.ts @@ -5,6 +5,13 @@ import SkyWarsMode from './SkyWarsMode/SkyWarsMode.ts'; import SkyWarsPrivateGames from './SkyWarsPrivateGames.ts'; import SkyWarsSolo from './SkyWarsSolo/SkyWarsSolo.ts'; import SkyWarsTeams from './SkyWarsTeams/SkyWarsTeams.js'; +import { + SKYWARS_CONSTANT_LEVELING_XP, + SKYWARS_CONSTANT_XP_TO_NEXT_LEVEL, + SKYWARS_LEVEL_MAX, + SKYWARS_TOTAL_XP, + SKYWARS_XP_TO_NEXT_LEVEL +} from '../../../Utils/Constants.ts'; import { weekAB } from '../../../Utils/Oscillation.ts'; import type { ShopSort } from '../../../Types/Player.ts'; @@ -21,6 +28,9 @@ class SkyWars extends SkyWarsMode { coins: number; tokens: number; xp: number; + level: number; + levelWithProgress: { currentXp: number; required: number }; + levelFormatted: string | null; mythicalKits: SkyWarsKitsMythics; selectedPrestigeIcon: string | 'UNKNOWN'; angelOfDeathLevel: number; @@ -71,6 +81,14 @@ class SkyWars extends SkyWarsMode { this.tokens = data?.cosmetic_tokens || 0; this.heads = data?.heads || 0; this.xp = data?.skywars_experience || 0; + this.level = SkyWars.getLevel(this.xp); + this.levelWithProgress = SkyWars.getLevelProgress(this.xp, this.level); + this.levelFormatted = data?.levelFormatted + ? data?.levelFormatted + ?.replace(/§l/gm, '**') + ?.replace(/§([a-f]|[1-9])/gm, '') + ?.replace(/§r/gm, '') + : null; this.mythicalKits = new SkyWarsKitsMythics(data); this.selectedPrestigeIcon = data?.selected_prestige_icon || 'UNKNOWN'; this.angelOfDeathLevel = data?.angel_of_death_level || 0; @@ -107,6 +125,38 @@ class SkyWars extends SkyWarsMode { this.mega = new SkyWarsMega(data); this.mini = new SkyWarsMini(data); } + + // Credit: https://github.com/Statsify/statsify/blob/main/packages/schemas/src/player/gamemodes/skywars/util.ts#L27-L38 + static getLevel(xp: number): number { + if (xp >= SKYWARS_CONSTANT_LEVELING_XP) { + const level = + Math.floor((xp - SKYWARS_CONSTANT_LEVELING_XP) / SKYWARS_CONSTANT_XP_TO_NEXT_LEVEL) + + SKYWARS_XP_TO_NEXT_LEVEL.length; + + return Math.min(level, SKYWARS_LEVEL_MAX); + } + + const level = SKYWARS_TOTAL_XP.findIndex((x) => x > xp); + return level; + } + + // Credit: https://github.com/Statsify/statsify/blob/main/packages/schemas/src/player/gamemodes/skywars/util.ts#L40-L63 + static getLevelProgress(xp: number, level: number): { currentXp: number; required: number } { + let currentXp = xp; + + if (xp >= SKYWARS_CONSTANT_LEVELING_XP) { + currentXp -= SKYWARS_CONSTANT_LEVELING_XP; + currentXp %= SKYWARS_CONSTANT_XP_TO_NEXT_LEVEL; + return { currentXp, required: level >= SKYWARS_LEVEL_MAX ? 0 : SKYWARS_CONSTANT_XP_TO_NEXT_LEVEL }; + } + + for (const element of SKYWARS_XP_TO_NEXT_LEVEL) { + if (currentXp < element) break; + currentXp -= element; + } + + return { currentXp, required: SKYWARS_XP_TO_NEXT_LEVEL[SKYWARS_TOTAL_XP.findIndex((x) => x > xp)] || 0 }; + } } export default SkyWars; diff --git a/src/Utils/Constants.ts b/src/Utils/Constants.ts index 5179fd46b..4656b752f 100644 --- a/src/Utils/Constants.ts +++ b/src/Utils/Constants.ts @@ -2678,3 +2678,16 @@ export const BedWarsPrestiges: { prestige: BedWarsPrestige; requirement: number { prestige: 'Mystic', requirement: 4900 }, { prestige: 'Eternal', requirement: 5000 } ]; + +// Credit: https://github.com/Statsify/statsify/blob/main/packages/schemas/src/player/gamemodes/skywars/util.ts#L12-L25 +export const SKYWARS_XP_TO_NEXT_LEVEL = [ + 0, 10, 25, 50, 75, 100, 250, 500, 750, 1000, 1250, 1500, 1750, 2000, 2500, 3000, 3500, 4000, 4500 +]; + +export const SKYWARS_TOTAL_XP = SKYWARS_XP_TO_NEXT_LEVEL.map((_, index) => + SKYWARS_XP_TO_NEXT_LEVEL.slice(0, index + 1).reduce((acc, xp) => acc + xp, 0) +); + +export const SKYWARS_CONSTANT_LEVELING_XP = SKYWARS_XP_TO_NEXT_LEVEL.reduce((acc, xp) => acc + xp, 0); +export const SKYWARS_CONSTANT_XP_TO_NEXT_LEVEL = 5000; +export const SKYWARS_LEVEL_MAX = 10_000; From 7688aa2a12dadd81f4cd828100dd4973a570b6b7 Mon Sep 17 00:00:00 2001 From: Jacob Date: Sun, 21 Dec 2025 14:50:34 +0800 Subject: [PATCH 098/124] feat(SkyWarsActiveKit) Adds ActiveKit to every mode Signed-off-by: Jacob --- .../MiniGames/SkyWars/SkyWars.test.ts | 1 + .../SkyWarsKitsMythics/SkyWarsKitsMythic.ts | 4 +- .../SkyWars/SkyWarsMega/SkyWarsMega.test.ts | 2 +- .../SkyWarsMega/SkyWarsMegaKits.test.ts | 66 +++++++------- .../SkyWars/SkyWarsMega/SkyWarsMegaKits.ts | 66 +++++++------- .../SkyWarsMode/BaseSkyWarsMode.test.ts | 89 ++++++++++++++++++ .../SkyWars/SkyWarsMode/BaseSkyWarsMode.ts | 65 ++++++++++++++ .../SkyWars/SkyWarsMode/SkyWarsMode.test.ts | 82 +---------------- .../SkyWars/SkyWarsMode/SkyWarsMode.ts | 65 ++------------ .../SkyWarsRanked/SkyWarsRanked.test.ts | 6 +- .../SkyWars/SkyWarsRanked/SkyWarsRanked.ts | 8 +- .../SkyWarsRanked/SkyWarsRankedKits.test.ts | 50 +++++------ .../SkyWarsRanked/SkyWarsRankedKits.ts | 50 +++++------ .../SkyWarsSoloKits/SkyWarsSoloKits.test.ts | 6 +- .../SkyWarsSoloKits/SkyWarsSoloKits.ts | 6 +- .../SkyWarsSoloKitsAdvanced.test.ts | 70 +++++++-------- .../SkyWarsSoloKitsAdvanced.ts | 70 +++++++-------- .../SkyWarsSoloKitsBasic.test.ts | 90 +++++++++---------- .../SkyWarsSoloKits/SkyWarsSoloKitsBasic.ts | 90 +++++++++---------- .../SkyWarsSoloKitsLab.test.ts | 6 +- .../SkyWarsSoloKitsLab/SkyWarsSoloKitsLab.ts | 6 +- .../SkyWarsSoloKitsLabAdvanced.test.ts | 66 +++++++------- .../SkyWarsSoloKitsLabAdvanced.ts | 66 +++++++------- .../SkyWarsSoloKitsLabBasic.test.ts | 70 +++++++-------- .../SkyWarsSoloKitsLabBasic.ts | 70 +++++++-------- .../SkyWarsSoloKitsMini.test.ts | 46 +++++----- .../SkyWarsSoloKits/SkyWarsSoloKitsMini.ts | 46 +++++----- .../SkyWarsSoloKitsTourney.test.ts | 6 +- .../SkyWarsSoloKitsTourney.ts | 6 +- .../SkyWarsSoloKitsTourneyAdvanced.test.ts | 54 +++++------ .../SkyWarsSoloKitsTourneyAdvanced.ts | 54 +++++------ .../SkyWarsSoloKitsTourneyBasic.test.ts | 82 ++++++++--------- .../SkyWarsSoloKitsTourneyBasic.ts | 82 ++++++++--------- .../SkyWarsTeamsKits/SkyWarsTeamsKits.test.ts | 6 +- .../SkyWarsTeamsKits/SkyWarsTeamsKits.ts | 6 +- .../SkyWarsTeamsKitsAttacking.test.ts | 78 ++++++++-------- .../SkyWarsTeamsKitsAttacking.ts | 78 ++++++++-------- .../SkyWarsTeamsKitsDefending.test.ts | 38 ++++---- .../SkyWarsTeamsKitsDefending.ts | 38 ++++---- .../SkyWarsTeamsKitsMining.test.ts | 18 ++-- .../SkyWarsTeamsKitsMining.ts | 18 ++-- .../SkyWarsTeamsKitsSupporting.test.ts | 46 +++++----- .../SkyWarsTeamsKitsSupporting.ts | 46 +++++----- src/index.ts | 3 + 44 files changed, 975 insertions(+), 946 deletions(-) create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsMode/BaseSkyWarsMode.test.ts create mode 100644 src/Structures/MiniGames/SkyWars/SkyWarsMode/BaseSkyWarsMode.ts diff --git a/src/Structures/MiniGames/SkyWars/SkyWars.test.ts b/src/Structures/MiniGames/SkyWars/SkyWars.test.ts index 424a64b07..c40aca42e 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWars.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWars.test.ts @@ -41,6 +41,7 @@ test('SkyWars', () => { expect(data.xp).toBeGreaterThanOrEqual(0); expectTypeOf(data.xp).toEqualTypeOf(); expect(data.level).toBeDefined(); + expect(data.level).toBeGreaterThanOrEqual(0); expectTypeOf(data.level).toEqualTypeOf(); expect(data.levelWithProgress).toBeDefined(); expectTypeOf(data.levelWithProgress).toEqualTypeOf<{ currentXp: number; required: number }>(); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsKitsMythics/SkyWarsKitsMythic.ts b/src/Structures/MiniGames/SkyWars/SkyWarsKitsMythics/SkyWarsKitsMythic.ts index 7967a4dcf..3beea15d2 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsKitsMythics/SkyWarsKitsMythic.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsKitsMythics/SkyWarsKitsMythic.ts @@ -1,8 +1,8 @@ -import SkyWarsMode from '../SkyWarsMode/SkyWarsMode.ts'; +import BaseSkyWarsMode from '../SkyWarsMode/BaseSkyWarsMode.ts'; import { ParseModeAfter, ParseModeBefore } from '../../../../Utils/ParseMode.ts'; import type { SkyWarsMythicKitId } from '../../../../Types/Player.ts'; -class SkyWarsKitsMythic extends SkyWarsMode { +class SkyWarsKitsMythic extends BaseSkyWarsMode { autoEquipArmor: boolean; xp: number; constructor(data: Record, kit?: SkyWarsMythicKitId) { diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMega.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMega.test.ts index d74866ff6..ead59da72 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMega.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMega.test.ts @@ -1,6 +1,6 @@ import SkyWarsMega from './SkyWarsMega.js'; import SkyWarsMegaKits from './SkyWarsMegaKits.js'; -import SkyWarsMode from '../SkyWarsMode/SkyWarsMode.js'; +import SkyWarsMode from '../SkyWarsMode/SkyWarsMode.ts'; import SkyWarsModePerk from '../SkyWarsMode/SkyWarsModePerk.js'; import { expect, expectTypeOf, test } from 'vitest'; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMegaKits.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMegaKits.test.ts index 468d09935..ace3ccbf3 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMegaKits.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMegaKits.test.ts @@ -1,5 +1,5 @@ +import BaseSkyWarsMode from '../SkyWarsMode/BaseSkyWarsMode.js'; import SkyWarsMegaKits from './SkyWarsMegaKits.js'; -import SkyWarsMode from '../SkyWarsMode/SkyWarsMode.js'; import { expect, expectTypeOf, test } from 'vitest'; test('SkyWarsMegaKits', () => { @@ -8,51 +8,51 @@ test('SkyWarsMegaKits', () => { expect(data).toBeInstanceOf(SkyWarsMegaKits); expectTypeOf(data).toEqualTypeOf(); expect(data.default).toBeDefined(); - expect(data.default).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.default).toEqualTypeOf(); + expect(data.default).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.default).toEqualTypeOf(); expect(data.hunter).toBeDefined(); - expect(data.hunter).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.hunter).toEqualTypeOf(); + expect(data.hunter).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.hunter).toEqualTypeOf(); expect(data.scout).toBeDefined(); - expect(data.scout).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.scout).toEqualTypeOf(); + expect(data.scout).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.scout).toEqualTypeOf(); expect(data.baseballPlayer).toBeDefined(); - expect(data.baseballPlayer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.baseballPlayer).toEqualTypeOf(); + expect(data.baseballPlayer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.baseballPlayer).toEqualTypeOf(); expect(data.armorer).toBeDefined(); - expect(data.armorer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.armorer).toEqualTypeOf(); + expect(data.armorer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.armorer).toEqualTypeOf(); expect(data.knight).toBeDefined(); - expect(data.knight).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.knight).toEqualTypeOf(); + expect(data.knight).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.knight).toEqualTypeOf(); expect(data.cannoneer).toBeDefined(); - expect(data.cannoneer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.cannoneer).toEqualTypeOf(); + expect(data.cannoneer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.cannoneer).toEqualTypeOf(); expect(data.hellhound).toBeDefined(); - expect(data.hellhound).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.hellhound).toEqualTypeOf(); + expect(data.hellhound).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.hellhound).toEqualTypeOf(); expect(data.witch).toBeDefined(); - expect(data.witch).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.witch).toEqualTypeOf(); + expect(data.witch).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.witch).toEqualTypeOf(); expect(data.fisherman).toBeDefined(); - expect(data.fisherman).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.fisherman).toEqualTypeOf(); + expect(data.fisherman).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.fisherman).toEqualTypeOf(); expect(data.armorsmith).toBeDefined(); - expect(data.armorsmith).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.armorsmith).toEqualTypeOf(); + expect(data.armorsmith).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.armorsmith).toEqualTypeOf(); expect(data.pyromaniac).toBeDefined(); - expect(data.pyromaniac).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.pyromaniac).toEqualTypeOf(); + expect(data.pyromaniac).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.pyromaniac).toEqualTypeOf(); expect(data.paladin).toBeDefined(); - expect(data.paladin).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.paladin).toEqualTypeOf(); + expect(data.paladin).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.paladin).toEqualTypeOf(); expect(data.healer).toBeDefined(); - expect(data.healer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.healer).toEqualTypeOf(); + expect(data.healer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.healer).toEqualTypeOf(); expect(data.skeletor).toBeDefined(); - expect(data.skeletor).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.skeletor).toEqualTypeOf(); + expect(data.skeletor).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.skeletor).toEqualTypeOf(); expect(data.enderman).toBeDefined(); - expect(data.enderman).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.enderman).toEqualTypeOf(); + expect(data.enderman).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.enderman).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMegaKits.ts b/src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMegaKits.ts index ae3b5420e..fd15d55d4 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMegaKits.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsMega/SkyWarsMegaKits.ts @@ -1,39 +1,39 @@ -import SkyWarsMode from '../SkyWarsMode/SkyWarsMode.ts'; +import BaseSkyWarsMode from '../SkyWarsMode/BaseSkyWarsMode.ts'; class SkyWarsMegaKits { - default: SkyWarsMode; - hunter: SkyWarsMode; - scout: SkyWarsMode; - baseballPlayer: SkyWarsMode; - armorer: SkyWarsMode; - knight: SkyWarsMode; - cannoneer: SkyWarsMode; - hellhound: SkyWarsMode; - witch: SkyWarsMode; - fisherman: SkyWarsMode; - armorsmith: SkyWarsMode; - pyromaniac: SkyWarsMode; - paladin: SkyWarsMode; - healer: SkyWarsMode; - skeletor: SkyWarsMode; - enderman: SkyWarsMode; + default: BaseSkyWarsMode; + hunter: BaseSkyWarsMode; + scout: BaseSkyWarsMode; + baseballPlayer: BaseSkyWarsMode; + armorer: BaseSkyWarsMode; + knight: BaseSkyWarsMode; + cannoneer: BaseSkyWarsMode; + hellhound: BaseSkyWarsMode; + witch: BaseSkyWarsMode; + fisherman: BaseSkyWarsMode; + armorsmith: BaseSkyWarsMode; + pyromaniac: BaseSkyWarsMode; + paladin: BaseSkyWarsMode; + healer: BaseSkyWarsMode; + skeletor: BaseSkyWarsMode; + enderman: BaseSkyWarsMode; constructor(data: Record) { - this.default = new SkyWarsMode(data, 'kit_mega_mega_default'); - this.hunter = new SkyWarsMode(data, 'kit_mega_mega_hunter'); - this.scout = new SkyWarsMode(data, 'kit_mega_mega_scout'); - this.baseballPlayer = new SkyWarsMode(data, 'kit_mega_mega_baseball-player'); - this.armorer = new SkyWarsMode(data, 'kit_mega_mega_armorer'); - this.knight = new SkyWarsMode(data, 'kit_mega_mega_knight'); - this.cannoneer = new SkyWarsMode(data, 'kit_mega_mega_cannoneer'); - this.hellhound = new SkyWarsMode(data, 'kit_mega_mega_hellhound'); - this.witch = new SkyWarsMode(data, 'kit_mega_mega_witch'); - this.fisherman = new SkyWarsMode(data, 'kit_mega_mega_fisherman'); - this.armorsmith = new SkyWarsMode(data, 'kit_mega_mega_armorsmith'); - this.pyromaniac = new SkyWarsMode(data, 'kit_mega_mega_pyromaniac'); - this.paladin = new SkyWarsMode(data, 'kit_mega_mega_paladin'); - this.healer = new SkyWarsMode(data, 'kit_mega_mega_healer'); - this.skeletor = new SkyWarsMode(data, 'kit_mega_mega_skeletor'); - this.enderman = new SkyWarsMode(data, 'kit_mega_mega_enderman'); + this.default = new BaseSkyWarsMode(data, 'kit_mega_mega_default'); + this.hunter = new BaseSkyWarsMode(data, 'kit_mega_mega_hunter'); + this.scout = new BaseSkyWarsMode(data, 'kit_mega_mega_scout'); + this.baseballPlayer = new BaseSkyWarsMode(data, 'kit_mega_mega_baseball-player'); + this.armorer = new BaseSkyWarsMode(data, 'kit_mega_mega_armorer'); + this.knight = new BaseSkyWarsMode(data, 'kit_mega_mega_knight'); + this.cannoneer = new BaseSkyWarsMode(data, 'kit_mega_mega_cannoneer'); + this.hellhound = new BaseSkyWarsMode(data, 'kit_mega_mega_hellhound'); + this.witch = new BaseSkyWarsMode(data, 'kit_mega_mega_witch'); + this.fisherman = new BaseSkyWarsMode(data, 'kit_mega_mega_fisherman'); + this.armorsmith = new BaseSkyWarsMode(data, 'kit_mega_mega_armorsmith'); + this.pyromaniac = new BaseSkyWarsMode(data, 'kit_mega_mega_pyromaniac'); + this.paladin = new BaseSkyWarsMode(data, 'kit_mega_mega_paladin'); + this.healer = new BaseSkyWarsMode(data, 'kit_mega_mega_healer'); + this.skeletor = new BaseSkyWarsMode(data, 'kit_mega_mega_skeletor'); + this.enderman = new BaseSkyWarsMode(data, 'kit_mega_mega_enderman'); } } diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsMode/BaseSkyWarsMode.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsMode/BaseSkyWarsMode.test.ts new file mode 100644 index 000000000..2b25ecef2 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsMode/BaseSkyWarsMode.test.ts @@ -0,0 +1,89 @@ +import BaseSkyWarsMode from './BaseSkyWarsMode.js'; +import SkyWarsHeads from '../SkyWarsHeads.js'; +import SkyWarsKillsDeaths from '../SkyWarsKillsDeaths.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BaseSkyWarsMode', () => { + const data = new BaseSkyWarsMode({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeInstanceOf(SkyWarsKillsDeaths); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeInstanceOf(SkyWarsKillsDeaths); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.heads).toBeDefined(); + expect(data.heads).toBeInstanceOf(SkyWarsHeads); + expectTypeOf(data.heads).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLRatio).toBeDefined(); + expect(data.WLRatio).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLRatio).toEqualTypeOf(); + expect(data.gamesPlayed).toBeDefined(); + expect(data.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gamesPlayed).toEqualTypeOf(); + expect(data.timePlayed).toBeDefined(); + expect(data.timePlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.timePlayed).toEqualTypeOf(); + expect(data.winstreak).toBeDefined(); + expect(data.winstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winstreak).toEqualTypeOf(); + expect(data.survivedPlayers).toBeDefined(); + expect(data.survivedPlayers).toBeGreaterThanOrEqual(0); + expectTypeOf(data.survivedPlayers).toEqualTypeOf(); + expect(data.chestsOpened).toBeDefined(); + expect(data.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.chestsOpened).toEqualTypeOf(); + expect(data.killstreak).toBeDefined(); + expect(data.killstreak).toBeGreaterThanOrEqual(0); + expectTypeOf(data.killstreak).toEqualTypeOf(); + expect(data.longestBowKill).toBeDefined(); + expect(data.longestBowKill).toBeGreaterThanOrEqual(0); + expectTypeOf(data.longestBowKill).toEqualTypeOf(); + expect(data.fastestWin).toBeDefined(); + expect(data.fastestWin).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fastestWin).toEqualTypeOf(); + expect(data.assists).toBeDefined(); + expect(data.assists).toBeGreaterThanOrEqual(0); + expectTypeOf(data.assists).toEqualTypeOf(); + expect(data.mostKillsGame).toBeDefined(); + expect(data.mostKillsGame).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mostKillsGame).toEqualTypeOf(); + expect(data.longestBowShot).toBeDefined(); + expect(data.longestBowShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.longestBowShot).toEqualTypeOf(); + expect(data.arrowsHit).toBeDefined(); + expect(data.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arrowsHit).toEqualTypeOf(); + expect(data.arrowsShot).toBeDefined(); + expect(data.arrowsShot).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arrowsShot).toEqualTypeOf(); + expect(data.shard).toBeDefined(); + expect(data.shard).toBeGreaterThanOrEqual(0); + expectTypeOf(data.shard).toEqualTypeOf(); + expect(data.mobsKilled).toBeDefined(); + expect(data.mobsKilled).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mobsKilled).toEqualTypeOf(); + expect(data.blocksBroken).toBeDefined(); + expect(data.blocksBroken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksBroken).toEqualTypeOf(); + expect(data.blocksPlaced).toBeDefined(); + expect(data.blocksPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksPlaced).toEqualTypeOf(); + expect(data.eggThrown).toBeDefined(); + expect(data.eggThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.eggThrown).toEqualTypeOf(); + expect(data.enderpearlsThrown).toBeDefined(); + expect(data.enderpearlsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.enderpearlsThrown).toEqualTypeOf(); + expect(data.itemsEnchanted).toBeDefined(); + expect(data.itemsEnchanted).toBeGreaterThanOrEqual(0); + expectTypeOf(data.itemsEnchanted).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsMode/BaseSkyWarsMode.ts b/src/Structures/MiniGames/SkyWars/SkyWarsMode/BaseSkyWarsMode.ts new file mode 100644 index 000000000..7b01cea56 --- /dev/null +++ b/src/Structures/MiniGames/SkyWars/SkyWarsMode/BaseSkyWarsMode.ts @@ -0,0 +1,65 @@ +import Divide from '../../../../Utils/Divide.ts'; +import SkyWarsHeads from '../SkyWarsHeads.ts'; +import SkyWarsKillsDeaths from '../SkyWarsKillsDeaths.ts'; +import { ParseModeAfter } from '../../../../Utils/ParseMode.ts'; +import type { SkyWarsKitId, SkyWarsModeId } from '../../../../Types/Player.ts'; + +class BaseSkyWarsMode { + kills: SkyWarsKillsDeaths; + deaths: SkyWarsKillsDeaths; + heads: SkyWarsHeads; + wins: number; + losses: number; + WLRatio: number; + gamesPlayed: number; + timePlayed: number; + winstreak: number; + survivedPlayers: number; + chestsOpened: number; + killstreak: number; + longestBowKill: number; + fastestWin: number; + assists: number; + mostKillsGame: number; + longestBowShot: number; + arrowsHit: number; + arrowsShot: number; + shard: number; + mobsKilled: number; + blocksBroken: number; + blocksPlaced: number; + eggThrown: number; + enderpearlsThrown: number; + itemsEnchanted: number; + constructor(data: Record, mode?: SkyWarsModeId | SkyWarsKitId) { + mode = ParseModeAfter(mode) as SkyWarsModeId; + this.kills = new SkyWarsKillsDeaths(data, mode); + this.deaths = new SkyWarsKillsDeaths(data, mode); + this.heads = new SkyWarsHeads(data, mode); + this.wins = data?.[`wins${mode}`] || 0; + this.losses = data?.[`losses${mode}`] || 0; + this.WLRatio = Divide(this.wins, this.losses) || 0; + this.gamesPlayed = data?.[`games${mode}`] || 0; + this.timePlayed = data?.[`time_played${mode}`] || 0; + this.winstreak = data?.[`winstreak${mode}`] || 0; + this.survivedPlayers = data?.[`survived_players${mode}`] || 0; + this.chestsOpened = data?.[`chests_opened${mode}`] || 0; + this.killstreak = data?.[`killstreak${mode}`] || 0; + this.longestBowKill = data?.[`longest_bow_kill${mode}`] || 0; + this.fastestWin = data?.[`fastest_win${mode}`] || 0; + this.assists = data?.[`assists${mode}`] || 0; + this.mostKillsGame = data?.[`most_kills_game${mode}`] || 0; + this.longestBowShot = data?.[`longest_bow_shot${mode}`] || 0; + this.arrowsHit = data?.[`arrows_hit${mode}`] || 0; + this.arrowsShot = data?.[`arrows_shot${mode}`] || 0; + this.shard = data?.[`shard${mode}`] || 0; + this.mobsKilled = data?.[`mobs_killed${mode}`] || 0; + this.blocksBroken = data?.[`blocks_broken${mode}`] || 0; + this.blocksPlaced = data?.[`blocks_placed${mode}`] || 0; + this.eggThrown = data?.[`egg_thrown${mode}`] || 0; + this.enderpearlsThrown = data?.[`enderpearls_thrown${mode}`] || 0; + this.itemsEnchanted = data?.[`items_enchanted${mode}`] || 0; + } +} + +export default BaseSkyWarsMode; diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsMode/SkyWarsMode.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsMode/SkyWarsMode.test.ts index 22226c896..88a3de79c 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsMode/SkyWarsMode.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsMode/SkyWarsMode.test.ts @@ -1,5 +1,3 @@ -import SkyWarsHeads from '../SkyWarsHeads.js'; -import SkyWarsKillsDeaths from '../SkyWarsKillsDeaths.js'; import SkyWarsMode from './SkyWarsMode.js'; import { expect, expectTypeOf, test } from 'vitest'; @@ -8,82 +6,6 @@ test('SkyWarsMode', () => { expect(data).toBeDefined(); expect(data).toBeInstanceOf(SkyWarsMode); expectTypeOf(data).toEqualTypeOf(); - expect(data.kills).toBeDefined(); - expect(data.kills).toBeInstanceOf(SkyWarsKillsDeaths); - expectTypeOf(data.kills).toEqualTypeOf(); - expect(data.deaths).toBeDefined(); - expect(data.deaths).toBeInstanceOf(SkyWarsKillsDeaths); - expectTypeOf(data.deaths).toEqualTypeOf(); - expect(data.heads).toBeDefined(); - expect(data.heads).toBeInstanceOf(SkyWarsHeads); - expectTypeOf(data.heads).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.losses).toBeDefined(); - expect(data.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.losses).toEqualTypeOf(); - expect(data.WLRatio).toBeDefined(); - expect(data.WLRatio).toBeGreaterThanOrEqual(0); - expectTypeOf(data.WLRatio).toEqualTypeOf(); - expect(data.gamesPlayed).toBeDefined(); - expect(data.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.gamesPlayed).toEqualTypeOf(); - expect(data.timePlayed).toBeDefined(); - expect(data.timePlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.timePlayed).toEqualTypeOf(); - expect(data.winstreak).toBeDefined(); - expect(data.winstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winstreak).toEqualTypeOf(); - expect(data.survivedPlayers).toBeDefined(); - expect(data.survivedPlayers).toBeGreaterThanOrEqual(0); - expectTypeOf(data.survivedPlayers).toEqualTypeOf(); - expect(data.chestsOpened).toBeDefined(); - expect(data.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.chestsOpened).toEqualTypeOf(); - expect(data.killstreak).toBeDefined(); - expect(data.killstreak).toBeGreaterThanOrEqual(0); - expectTypeOf(data.killstreak).toEqualTypeOf(); - expect(data.longestBowKill).toBeDefined(); - expect(data.longestBowKill).toBeGreaterThanOrEqual(0); - expectTypeOf(data.longestBowKill).toEqualTypeOf(); - expect(data.fastestWin).toBeDefined(); - expect(data.fastestWin).toBeGreaterThanOrEqual(0); - expectTypeOf(data.fastestWin).toEqualTypeOf(); - expect(data.assists).toBeDefined(); - expect(data.assists).toBeGreaterThanOrEqual(0); - expectTypeOf(data.assists).toEqualTypeOf(); - expect(data.mostKillsGame).toBeDefined(); - expect(data.mostKillsGame).toBeGreaterThanOrEqual(0); - expectTypeOf(data.mostKillsGame).toEqualTypeOf(); - expect(data.longestBowShot).toBeDefined(); - expect(data.longestBowShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.longestBowShot).toEqualTypeOf(); - expect(data.arrowsHit).toBeDefined(); - expect(data.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arrowsHit).toEqualTypeOf(); - expect(data.arrowsShot).toBeDefined(); - expect(data.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arrowsShot).toEqualTypeOf(); - expect(data.shard).toBeDefined(); - expect(data.shard).toBeGreaterThanOrEqual(0); - expectTypeOf(data.shard).toEqualTypeOf(); - expect(data.mobsKilled).toBeDefined(); - expect(data.mobsKilled).toBeGreaterThanOrEqual(0); - expectTypeOf(data.mobsKilled).toEqualTypeOf(); - expect(data.blocksBroken).toBeDefined(); - expect(data.blocksBroken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blocksBroken).toEqualTypeOf(); - expect(data.blocksPlaced).toBeDefined(); - expect(data.blocksPlaced).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blocksPlaced).toEqualTypeOf(); - expect(data.eggThrown).toBeDefined(); - expect(data.eggThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.eggThrown).toEqualTypeOf(); - expect(data.enderpearlsThrown).toBeDefined(); - expect(data.enderpearlsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.enderpearlsThrown).toEqualTypeOf(); - expect(data.itemsEnchanted).toBeDefined(); - expect(data.itemsEnchanted).toBeGreaterThanOrEqual(0); - expectTypeOf(data.itemsEnchanted).toEqualTypeOf(); + expect(data.activeKit).toBeDefined(); + expectTypeOf(data.activeKit).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsMode/SkyWarsMode.ts b/src/Structures/MiniGames/SkyWars/SkyWarsMode/SkyWarsMode.ts index ef1a968a7..1afb156f1 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsMode/SkyWarsMode.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsMode/SkyWarsMode.ts @@ -1,64 +1,13 @@ -import Divide from '../../../../Utils/Divide.ts'; -import SkyWarsHeads from '../SkyWarsHeads.ts'; -import SkyWarsKillsDeaths from '../SkyWarsKillsDeaths.ts'; +import BaseSkyWarsMode from './BaseSkyWarsMode.ts'; import { ParseModeAfter } from '../../../../Utils/ParseMode.ts'; -import type { SkyWarsKitId, SkyWarsModeId } from '../../../../Types/Player.ts'; +import type { SkyWarsModeId } from '../../../../Types/Player.ts'; -class SkyWarsMode { - kills: SkyWarsKillsDeaths; - deaths: SkyWarsKillsDeaths; - heads: SkyWarsHeads; - wins: number; - losses: number; - WLRatio: number; - gamesPlayed: number; - timePlayed: number; - winstreak: number; - survivedPlayers: number; - chestsOpened: number; - killstreak: number; - longestBowKill: number; - fastestWin: number; - assists: number; - mostKillsGame: number; - longestBowShot: number; - arrowsHit: number; - arrowsShot: number; - shard: number; - mobsKilled: number; - blocksBroken: number; - blocksPlaced: number; - eggThrown: number; - enderpearlsThrown: number; - itemsEnchanted: number; - constructor(data: Record, mode?: SkyWarsModeId | SkyWarsKitId) { +class SkyWarsMode extends BaseSkyWarsMode { + activeKit: string | 'UNKNOWN'; + constructor(data: Record, mode?: SkyWarsModeId) { mode = ParseModeAfter(mode) as SkyWarsModeId; - this.kills = new SkyWarsKillsDeaths(data, mode); - this.deaths = new SkyWarsKillsDeaths(data, mode); - this.heads = new SkyWarsHeads(data, mode); - this.wins = data?.[`wins${mode}`] || 0; - this.losses = data?.[`losses${mode}`] || 0; - this.WLRatio = Divide(this.wins, this.losses) || 0; - this.gamesPlayed = data?.[`games${mode}`] || 0; - this.timePlayed = data?.[`time_played${mode}`] || 0; - this.winstreak = data?.[`winstreak${mode}`] || 0; - this.survivedPlayers = data?.[`survived_players${mode}`] || 0; - this.chestsOpened = data?.[`chests_opened${mode}`] || 0; - this.killstreak = data?.[`killstreak${mode}`] || 0; - this.longestBowKill = data?.[`longest_bow_kill${mode}`] || 0; - this.fastestWin = data?.[`fastest_win${mode}`] || 0; - this.assists = data?.[`assists${mode}`] || 0; - this.mostKillsGame = data?.[`most_kills_game${mode}`] || 0; - this.longestBowShot = data?.[`longest_bow_shot${mode}`] || 0; - this.arrowsHit = data?.[`arrows_hit${mode}`] || 0; - this.arrowsShot = data?.[`arrows_shot${mode}`] || 0; - this.shard = data?.[`shard${mode}`] || 0; - this.mobsKilled = data?.[`mobs_killed${mode}`] || 0; - this.blocksBroken = data?.[`blocks_broken${mode}`] || 0; - this.blocksPlaced = data?.[`blocks_placed${mode}`] || 0; - this.eggThrown = data?.[`egg_thrown${mode}`] || 0; - this.enderpearlsThrown = data?.[`enderpearls_thrown${mode}`] || 0; - this.itemsEnchanted = data?.[`items_enchanted${mode}`] || 0; + super(data, mode); + this.activeKit = data?.[`activeKit${mode.toUpperCase()}`] || 'UNKNOWN'; } } diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRanked.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRanked.test.ts index 10f5f398d..2208179f0 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRanked.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRanked.test.ts @@ -1,4 +1,4 @@ -import SkyWarsMode from '../SkyWarsMode/SkyWarsMode.ts'; +import BaseSkyWarsMode from '../SkyWarsMode/BaseSkyWarsMode.ts'; import SkyWarsRanked from './SkyWarsRanked.js'; import SkyWarsRankedKits from './SkyWarsRankedKits.js'; import { expect, expectTypeOf, test } from 'vitest'; @@ -9,8 +9,8 @@ test('SkyWarsRanked', () => { expect(data).toBeInstanceOf(SkyWarsRanked); expectTypeOf(data).toEqualTypeOf(); expect(data.normal).toBeDefined(); - expect(data.normal).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.normal).toEqualTypeOf(); + expect(data.normal).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.normal).toEqualTypeOf(); expect(data.kits).toBeDefined(); expect(data.kits).toBeInstanceOf(SkyWarsRankedKits); expectTypeOf(data.kits).toEqualTypeOf(); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRanked.ts b/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRanked.ts index 3f7bcb194..de836f32a 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRanked.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRanked.ts @@ -1,12 +1,12 @@ -import SkyWarsMode from '../SkyWarsMode/SkyWarsMode.ts'; +import BaseSkyWarsMode from '../SkyWarsMode/BaseSkyWarsMode.ts'; import SkyWarsRankedKits from './SkyWarsRankedKits.ts'; -class SkyWarsRanked extends SkyWarsMode { - normal: SkyWarsMode; +class SkyWarsRanked extends BaseSkyWarsMode { + normal: BaseSkyWarsMode; kits: SkyWarsRankedKits; constructor(data: Record) { super(data, 'ranked'); - this.normal = new SkyWarsMode(data, 'ranked_normal'); + this.normal = new BaseSkyWarsMode(data, 'ranked_normal'); this.kits = new SkyWarsRankedKits(data); } } diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRankedKits.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRankedKits.test.ts index b74db3976..d6a2ac67d 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRankedKits.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRankedKits.test.ts @@ -1,4 +1,4 @@ -import SkyWarsMode from '../SkyWarsMode/SkyWarsMode.js'; +import BaseSkyWarsMode from '../SkyWarsMode/BaseSkyWarsMode.js'; import SkyWarsRankedKits from './SkyWarsRankedKits.js'; import { expect, expectTypeOf, test } from 'vitest'; @@ -8,39 +8,39 @@ test('SkyWarsRankedKits', () => { expect(data).toBeInstanceOf(SkyWarsRankedKits); expectTypeOf(data).toEqualTypeOf(); expect(data.default).toBeDefined(); - expect(data.default).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.default).toEqualTypeOf(); + expect(data.default).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.default).toEqualTypeOf(); expect(data.scout).toBeDefined(); - expect(data.scout).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.scout).toEqualTypeOf(); + expect(data.scout).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.scout).toEqualTypeOf(); expect(data.armorer).toBeDefined(); - expect(data.armorer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.armorer).toEqualTypeOf(); + expect(data.armorer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.armorer).toEqualTypeOf(); expect(data.bowman).toBeDefined(); - expect(data.bowman).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.bowman).toEqualTypeOf(); + expect(data.bowman).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.bowman).toEqualTypeOf(); expect(data.champion).toBeDefined(); - expect(data.champion).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.champion).toEqualTypeOf(); + expect(data.champion).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.champion).toEqualTypeOf(); expect(data.pyromancer).toBeDefined(); - expect(data.pyromancer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.pyromancer).toEqualTypeOf(); + expect(data.pyromancer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.pyromancer).toEqualTypeOf(); expect(data.hound).toBeDefined(); - expect(data.hound).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.hound).toEqualTypeOf(); + expect(data.hound).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.hound).toEqualTypeOf(); expect(data.athlete).toBeDefined(); - expect(data.athlete).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.athlete).toEqualTypeOf(); + expect(data.athlete).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.athlete).toEqualTypeOf(); expect(data.magician).toBeDefined(); - expect(data.magician).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.magician).toEqualTypeOf(); + expect(data.magician).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.magician).toEqualTypeOf(); expect(data.healer).toBeDefined(); - expect(data.healer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.healer).toEqualTypeOf(); + expect(data.healer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.healer).toEqualTypeOf(); expect(data.paladin).toBeDefined(); - expect(data.paladin).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.paladin).toEqualTypeOf(); + expect(data.paladin).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.paladin).toEqualTypeOf(); expect(data.blacksmith).toBeDefined(); - expect(data.blacksmith).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.blacksmith).toEqualTypeOf(); + expect(data.blacksmith).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.blacksmith).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRankedKits.ts b/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRankedKits.ts index 910b35665..9ea5f8c24 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRankedKits.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsRanked/SkyWarsRankedKits.ts @@ -1,31 +1,31 @@ -import SkyWarsMode from '../SkyWarsMode/SkyWarsMode.ts'; +import BaseSkyWarsMode from '../SkyWarsMode/BaseSkyWarsMode.ts'; class SkyWarsRankedKits { - default: SkyWarsMode; - scout: SkyWarsMode; - armorer: SkyWarsMode; - bowman: SkyWarsMode; - champion: SkyWarsMode; - pyromancer: SkyWarsMode; - hound: SkyWarsMode; - athlete: SkyWarsMode; - magician: SkyWarsMode; - healer: SkyWarsMode; - paladin: SkyWarsMode; - blacksmith: SkyWarsMode; + default: BaseSkyWarsMode; + scout: BaseSkyWarsMode; + armorer: BaseSkyWarsMode; + bowman: BaseSkyWarsMode; + champion: BaseSkyWarsMode; + pyromancer: BaseSkyWarsMode; + hound: BaseSkyWarsMode; + athlete: BaseSkyWarsMode; + magician: BaseSkyWarsMode; + healer: BaseSkyWarsMode; + paladin: BaseSkyWarsMode; + blacksmith: BaseSkyWarsMode; constructor(data: Record) { - this.default = new SkyWarsMode(data, 'kit_ranked_ranked_default'); - this.scout = new SkyWarsMode(data, 'kit_ranked_ranked_scout'); - this.armorer = new SkyWarsMode(data, 'kit_ranked_ranked_armorer'); - this.bowman = new SkyWarsMode(data, 'kit_ranked_ranked_bowman'); - this.champion = new SkyWarsMode(data, 'kit_ranked_ranked_champion'); - this.pyromancer = new SkyWarsMode(data, 'kit_ranked_ranked_pyromancer'); - this.hound = new SkyWarsMode(data, 'kit_ranked_ranked_hound'); - this.athlete = new SkyWarsMode(data, 'kit_ranked_ranked_athlete'); - this.magician = new SkyWarsMode(data, 'kit_ranked_ranked_magician'); - this.healer = new SkyWarsMode(data, 'kit_ranked_ranked_healer'); - this.paladin = new SkyWarsMode(data, 'kit_ranked_ranked_paladin'); - this.blacksmith = new SkyWarsMode(data, 'kit_ranked_ranked_blacksmith'); + this.default = new BaseSkyWarsMode(data, 'kit_ranked_ranked_default'); + this.scout = new BaseSkyWarsMode(data, 'kit_ranked_ranked_scout'); + this.armorer = new BaseSkyWarsMode(data, 'kit_ranked_ranked_armorer'); + this.bowman = new BaseSkyWarsMode(data, 'kit_ranked_ranked_bowman'); + this.champion = new BaseSkyWarsMode(data, 'kit_ranked_ranked_champion'); + this.pyromancer = new BaseSkyWarsMode(data, 'kit_ranked_ranked_pyromancer'); + this.hound = new BaseSkyWarsMode(data, 'kit_ranked_ranked_hound'); + this.athlete = new BaseSkyWarsMode(data, 'kit_ranked_ranked_athlete'); + this.magician = new BaseSkyWarsMode(data, 'kit_ranked_ranked_magician'); + this.healer = new BaseSkyWarsMode(data, 'kit_ranked_ranked_healer'); + this.paladin = new BaseSkyWarsMode(data, 'kit_ranked_ranked_paladin'); + this.blacksmith = new BaseSkyWarsMode(data, 'kit_ranked_ranked_blacksmith'); } } diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKits.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKits.test.ts index 10c528ae5..95e48dbd0 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKits.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKits.test.ts @@ -1,4 +1,4 @@ -import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.js'; +import BaseSkyWarsMode from '../../SkyWarsMode/BaseSkyWarsMode.js'; import SkyWarsSoloKits from './SkyWarsSoloKits.js'; import SkyWarsSoloKitsAdvanced from './SkyWarsSoloKitsAdvanced.js'; import SkyWarsSoloKitsBasic from './SkyWarsSoloKitsBasic.js'; @@ -28,6 +28,6 @@ test('SkyWarsSoloKits', () => { expect(data.tourney).toBeInstanceOf(SkyWarsSoloKitsTourney); expectTypeOf(data.tourney).toEqualTypeOf(); expect(data.enderChest).toBeDefined(); - expect(data.enderChest).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.enderChest).toEqualTypeOf(); + expect(data.enderChest).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.enderChest).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKits.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKits.ts index 1917f8745..5e347feac 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKits.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKits.ts @@ -1,4 +1,4 @@ -import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.ts'; +import BaseSkyWarsMode from '../../SkyWarsMode/BaseSkyWarsMode.ts'; import SkyWarsSoloKitsAdvanced from './SkyWarsSoloKitsAdvanced.ts'; import SkyWarsSoloKitsBasic from './SkyWarsSoloKitsBasic.ts'; import SkyWarsSoloKitsLab from './SkyWarsSoloKitsLab/SkyWarsSoloKitsLab.ts'; @@ -11,14 +11,14 @@ class SkyWarsSoloKits { advanced: SkyWarsSoloKitsAdvanced; mini: SkyWarsSoloKitsMini; tourney: SkyWarsSoloKitsTourney; - enderChest: SkyWarsMode; + enderChest: BaseSkyWarsMode; constructor(data: Record) { this.lab = new SkyWarsSoloKitsLab(data); this.basic = new SkyWarsSoloKitsBasic(data); this.advanced = new SkyWarsSoloKitsAdvanced(data); this.mini = new SkyWarsSoloKitsMini(data); this.tourney = new SkyWarsSoloKitsTourney(data); - this.enderChest = new SkyWarsMode(data, 'kit_enderchest_solo_enderchest'); + this.enderChest = new BaseSkyWarsMode(data, 'kit_enderchest_solo_enderchest'); } } diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsAdvanced.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsAdvanced.test.ts index c2ba2d6b5..9e7b297e5 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsAdvanced.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsAdvanced.test.ts @@ -1,4 +1,4 @@ -import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.js'; +import BaseSkyWarsMode from '../../SkyWarsMode/BaseSkyWarsMode.js'; import SkyWarsSoloKitsAdvanced from './SkyWarsSoloKitsAdvanced.js'; import { expect, expectTypeOf, test } from 'vitest'; @@ -8,54 +8,54 @@ test('SkyWarsSoloKitsAdvanced', () => { expect(data).toBeInstanceOf(SkyWarsSoloKitsAdvanced); expectTypeOf(data).toEqualTypeOf(); expect(data.farmer).toBeDefined(); - expect(data.farmer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.farmer).toEqualTypeOf(); + expect(data.farmer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.farmer).toEqualTypeOf(); expect(data.enchanter).toBeDefined(); - expect(data.enchanter).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.enchanter).toEqualTypeOf(); + expect(data.enchanter).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.enchanter).toEqualTypeOf(); expect(data.hunter).toBeDefined(); - expect(data.hunter).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.hunter).toEqualTypeOf(); + expect(data.hunter).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.hunter).toEqualTypeOf(); expect(data.knight).toBeDefined(); - expect(data.knight).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.knight).toEqualTypeOf(); + expect(data.knight).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.knight).toEqualTypeOf(); expect(data.armorer).toBeDefined(); - expect(data.armorer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.armorer).toEqualTypeOf(); + expect(data.armorer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.armorer).toEqualTypeOf(); expect(data.cannoneer).toBeDefined(); - expect(data.cannoneer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.cannoneer).toEqualTypeOf(); + expect(data.cannoneer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.cannoneer).toEqualTypeOf(); expect(data.pyro).toBeDefined(); - expect(data.pyro).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.pyro).toEqualTypeOf(); + expect(data.pyro).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.pyro).toEqualTypeOf(); expect(data.salmon).toBeDefined(); - expect(data.salmon).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.salmon).toEqualTypeOf(); + expect(data.salmon).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.salmon).toEqualTypeOf(); expect(data.zookeeper).toBeDefined(); - expect(data.zookeeper).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.zookeeper).toEqualTypeOf(); + expect(data.zookeeper).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.zookeeper).toEqualTypeOf(); expect(data.enderman).toBeDefined(); - expect(data.enderman).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.enderman).toEqualTypeOf(); + expect(data.enderman).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.enderman).toEqualTypeOf(); expect(data.slime).toBeDefined(); - expect(data.slime).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.slime).toEqualTypeOf(); + expect(data.slime).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.slime).toEqualTypeOf(); expect(data.pigRider).toBeDefined(); - expect(data.pigRider).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.pigRider).toEqualTypeOf(); + expect(data.pigRider).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.pigRider).toEqualTypeOf(); expect(data.sloth).toBeDefined(); - expect(data.sloth).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.sloth).toEqualTypeOf(); + expect(data.sloth).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.sloth).toEqualTypeOf(); expect(data.jester).toBeDefined(); - expect(data.jester).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.jester).toEqualTypeOf(); + expect(data.jester).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.jester).toEqualTypeOf(); expect(data.guardian).toBeDefined(); - expect(data.guardian).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.guardian).toEqualTypeOf(); + expect(data.guardian).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.guardian).toEqualTypeOf(); expect(data.engineer).toBeDefined(); - expect(data.engineer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.engineer).toEqualTypeOf(); + expect(data.engineer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.engineer).toEqualTypeOf(); expect(data.magician).toBeDefined(); - expect(data.magician).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.magician).toEqualTypeOf(); + expect(data.magician).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.magician).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsAdvanced.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsAdvanced.ts index 46784eda6..936f9722f 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsAdvanced.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsAdvanced.ts @@ -1,41 +1,41 @@ -import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.ts'; +import BaseSkyWarsMode from '../../SkyWarsMode/BaseSkyWarsMode.ts'; class SkyWarsSoloKitsAdvanced { - farmer: SkyWarsMode; - enchanter: SkyWarsMode; - hunter: SkyWarsMode; - knight: SkyWarsMode; - armorer: SkyWarsMode; - cannoneer: SkyWarsMode; - pyro: SkyWarsMode; - salmon: SkyWarsMode; - zookeeper: SkyWarsMode; - enderman: SkyWarsMode; - slime: SkyWarsMode; - pigRider: SkyWarsMode; - sloth: SkyWarsMode; - jester: SkyWarsMode; - guardian: SkyWarsMode; - engineer: SkyWarsMode; - magician: SkyWarsMode; + farmer: BaseSkyWarsMode; + enchanter: BaseSkyWarsMode; + hunter: BaseSkyWarsMode; + knight: BaseSkyWarsMode; + armorer: BaseSkyWarsMode; + cannoneer: BaseSkyWarsMode; + pyro: BaseSkyWarsMode; + salmon: BaseSkyWarsMode; + zookeeper: BaseSkyWarsMode; + enderman: BaseSkyWarsMode; + slime: BaseSkyWarsMode; + pigRider: BaseSkyWarsMode; + sloth: BaseSkyWarsMode; + jester: BaseSkyWarsMode; + guardian: BaseSkyWarsMode; + engineer: BaseSkyWarsMode; + magician: BaseSkyWarsMode; constructor(data: Record) { - this.farmer = new SkyWarsMode(data, 'kit_advanced_solo_farmer'); - this.enchanter = new SkyWarsMode(data, 'kit_advanced_solo_enchanter'); - this.hunter = new SkyWarsMode(data, 'kit_advanced_solo_hunter'); - this.knight = new SkyWarsMode(data, 'kit_advanced_solo_knight'); - this.armorer = new SkyWarsMode(data, 'kit_advanced_solo_armorer'); - this.cannoneer = new SkyWarsMode(data, 'kit_advanced_solo_cannoneer'); - this.pyro = new SkyWarsMode(data, 'kit_advanced_solo_pyro'); - this.salmon = new SkyWarsMode(data, 'kit_advanced_solo_salmon'); - this.zookeeper = new SkyWarsMode(data, 'kit_advanced_solo_zookeeper'); - this.enderman = new SkyWarsMode(data, 'kit_advanced_solo_enderman'); - this.slime = new SkyWarsMode(data, 'kit_advanced_solo_slime'); - this.pigRider = new SkyWarsMode(data, 'kit_advanced_solo_pig-rider'); - this.sloth = new SkyWarsMode(data, 'kit_advanced_solo_sloth'); - this.jester = new SkyWarsMode(data, 'kit_advanced_solo_jester'); - this.guardian = new SkyWarsMode(data, 'kit_advanced_solo_guardian'); - this.engineer = new SkyWarsMode(data, 'kit_advanced_solo_engineer'); - this.magician = new SkyWarsMode(data, 'kit_advanced_solo_magician'); + this.farmer = new BaseSkyWarsMode(data, 'kit_advanced_solo_farmer'); + this.enchanter = new BaseSkyWarsMode(data, 'kit_advanced_solo_enchanter'); + this.hunter = new BaseSkyWarsMode(data, 'kit_advanced_solo_hunter'); + this.knight = new BaseSkyWarsMode(data, 'kit_advanced_solo_knight'); + this.armorer = new BaseSkyWarsMode(data, 'kit_advanced_solo_armorer'); + this.cannoneer = new BaseSkyWarsMode(data, 'kit_advanced_solo_cannoneer'); + this.pyro = new BaseSkyWarsMode(data, 'kit_advanced_solo_pyro'); + this.salmon = new BaseSkyWarsMode(data, 'kit_advanced_solo_salmon'); + this.zookeeper = new BaseSkyWarsMode(data, 'kit_advanced_solo_zookeeper'); + this.enderman = new BaseSkyWarsMode(data, 'kit_advanced_solo_enderman'); + this.slime = new BaseSkyWarsMode(data, 'kit_advanced_solo_slime'); + this.pigRider = new BaseSkyWarsMode(data, 'kit_advanced_solo_pig-rider'); + this.sloth = new BaseSkyWarsMode(data, 'kit_advanced_solo_sloth'); + this.jester = new BaseSkyWarsMode(data, 'kit_advanced_solo_jester'); + this.guardian = new BaseSkyWarsMode(data, 'kit_advanced_solo_guardian'); + this.engineer = new BaseSkyWarsMode(data, 'kit_advanced_solo_engineer'); + this.magician = new BaseSkyWarsMode(data, 'kit_advanced_solo_magician'); } } diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsBasic.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsBasic.test.ts index 58f14b9db..492ffeb77 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsBasic.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsBasic.test.ts @@ -1,4 +1,4 @@ -import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.js'; +import BaseSkyWarsMode from '../../SkyWarsMode/BaseSkyWarsMode.js'; import SkyWarsSoloKitsBasic from './SkyWarsSoloKitsBasic.js'; import { expect, expectTypeOf, test } from 'vitest'; @@ -8,69 +8,69 @@ test('SkyWarsSoloKitsBasic', () => { expect(data).toBeInstanceOf(SkyWarsSoloKitsBasic); expectTypeOf(data).toEqualTypeOf(); expect(data.default).toBeDefined(); - expect(data.default).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.default).toEqualTypeOf(); + expect(data.default).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.default).toEqualTypeOf(); expect(data.armorsmith).toBeDefined(); - expect(data.armorsmith).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.armorsmith).toEqualTypeOf(); + expect(data.armorsmith).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.armorsmith).toEqualTypeOf(); expect(data.ecologist).toBeDefined(); - expect(data.ecologist).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.ecologist).toEqualTypeOf(); + expect(data.ecologist).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.ecologist).toEqualTypeOf(); expect(data.fisherman).toBeDefined(); - expect(data.fisherman).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.fisherman).toEqualTypeOf(); + expect(data.fisherman).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.fisherman).toEqualTypeOf(); expect(data.speleologist).toBeDefined(); - expect(data.speleologist).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.speleologist).toEqualTypeOf(); + expect(data.speleologist).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.speleologist).toEqualTypeOf(); expect(data.troll).toBeDefined(); - expect(data.troll).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.troll).toEqualTypeOf(); + expect(data.troll).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.troll).toEqualTypeOf(); expect(data.snowman).toBeDefined(); - expect(data.snowman).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.snowman).toEqualTypeOf(); + expect(data.snowman).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.snowman).toEqualTypeOf(); expect(data.rookie).toBeDefined(); - expect(data.rookie).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.rookie).toEqualTypeOf(); + expect(data.rookie).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.rookie).toEqualTypeOf(); expect(data.scout).toBeDefined(); - expect(data.scout).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.scout).toEqualTypeOf(); + expect(data.scout).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.scout).toEqualTypeOf(); expect(data.energix).toBeDefined(); - expect(data.energix).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.energix).toEqualTypeOf(); + expect(data.energix).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.energix).toEqualTypeOf(); expect(data.grenade).toBeDefined(); - expect(data.grenade).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.grenade).toEqualTypeOf(); + expect(data.grenade).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.grenade).toEqualTypeOf(); expect(data.pharaoh).toBeDefined(); - expect(data.pharaoh).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.pharaoh).toEqualTypeOf(); + expect(data.pharaoh).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.pharaoh).toEqualTypeOf(); expect(data.disco).toBeDefined(); - expect(data.disco).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.disco).toEqualTypeOf(); + expect(data.disco).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.disco).toEqualTypeOf(); expect(data.frog).toBeDefined(); - expect(data.frog).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.frog).toEqualTypeOf(); + expect(data.frog).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.frog).toEqualTypeOf(); expect(data.baseballPlayer).toBeDefined(); - expect(data.baseballPlayer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.baseballPlayer).toEqualTypeOf(); + expect(data.baseballPlayer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.baseballPlayer).toEqualTypeOf(); expect(data.princess).toBeDefined(); - expect(data.princess).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.princess).toEqualTypeOf(); + expect(data.princess).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.princess).toEqualTypeOf(); expect(data.batguy).toBeDefined(); - expect(data.batguy).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.batguy).toEqualTypeOf(); + expect(data.batguy).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.batguy).toEqualTypeOf(); expect(data.healer).toBeDefined(); - expect(data.healer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.healer).toEqualTypeOf(); + expect(data.healer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.healer).toEqualTypeOf(); expect(data.cactus).toBeDefined(); - expect(data.cactus).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.cactus).toEqualTypeOf(); + expect(data.cactus).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.cactus).toEqualTypeOf(); expect(data.warlock).toBeDefined(); - expect(data.warlock).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.warlock).toEqualTypeOf(); + expect(data.warlock).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.warlock).toEqualTypeOf(); expect(data.archeologist).toBeDefined(); - expect(data.archeologist).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.archeologist).toEqualTypeOf(); + expect(data.archeologist).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.archeologist).toEqualTypeOf(); expect(data.fallenAngel).toBeDefined(); - expect(data.fallenAngel).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.fallenAngel).toEqualTypeOf(); + expect(data.fallenAngel).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.fallenAngel).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsBasic.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsBasic.ts index b96323e7d..0d45e7d7f 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsBasic.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsBasic.ts @@ -1,51 +1,51 @@ -import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.ts'; +import BaseSkyWarsMode from '../../SkyWarsMode/BaseSkyWarsMode.ts'; class SkyWarsSoloKitsBasic { - default: SkyWarsMode; - armorsmith: SkyWarsMode; - ecologist: SkyWarsMode; - fisherman: SkyWarsMode; - speleologist: SkyWarsMode; - troll: SkyWarsMode; - snowman: SkyWarsMode; - rookie: SkyWarsMode; - scout: SkyWarsMode; - energix: SkyWarsMode; - grenade: SkyWarsMode; - pharaoh: SkyWarsMode; - disco: SkyWarsMode; - frog: SkyWarsMode; - baseballPlayer: SkyWarsMode; - princess: SkyWarsMode; - batguy: SkyWarsMode; - healer: SkyWarsMode; - cactus: SkyWarsMode; - warlock: SkyWarsMode; - archeologist: SkyWarsMode; - fallenAngel: SkyWarsMode; + default: BaseSkyWarsMode; + armorsmith: BaseSkyWarsMode; + ecologist: BaseSkyWarsMode; + fisherman: BaseSkyWarsMode; + speleologist: BaseSkyWarsMode; + troll: BaseSkyWarsMode; + snowman: BaseSkyWarsMode; + rookie: BaseSkyWarsMode; + scout: BaseSkyWarsMode; + energix: BaseSkyWarsMode; + grenade: BaseSkyWarsMode; + pharaoh: BaseSkyWarsMode; + disco: BaseSkyWarsMode; + frog: BaseSkyWarsMode; + baseballPlayer: BaseSkyWarsMode; + princess: BaseSkyWarsMode; + batguy: BaseSkyWarsMode; + healer: BaseSkyWarsMode; + cactus: BaseSkyWarsMode; + warlock: BaseSkyWarsMode; + archeologist: BaseSkyWarsMode; + fallenAngel: BaseSkyWarsMode; constructor(data: Record) { - this.default = new SkyWarsMode(data, 'kit_basic_solo_default'); - this.armorsmith = new SkyWarsMode(data, 'kit_basic_solo_armorsmith'); - this.ecologist = new SkyWarsMode(data, 'kit_basic_solo_ecologist'); - this.fisherman = new SkyWarsMode(data, 'kit_basic_solo_fisherman'); - this.speleologist = new SkyWarsMode(data, 'kit_basic_solo_speleologist'); - this.troll = new SkyWarsMode(data, 'kit_basic_solo_troll'); - this.snowman = new SkyWarsMode(data, 'kit_basic_solo_snowman'); - this.rookie = new SkyWarsMode(data, 'kit_basic_solo_rookie'); - this.scout = new SkyWarsMode(data, 'kit_basic_solo_scout'); - this.energix = new SkyWarsMode(data, 'kit_basic_solo_energix'); - this.grenade = new SkyWarsMode(data, 'kit_basic_solo_grenade'); - this.pharaoh = new SkyWarsMode(data, 'kit_basic_solo_pharaoh'); - this.disco = new SkyWarsMode(data, 'kit_basic_solo_disco'); - this.frog = new SkyWarsMode(data, 'kit_basic_solo_frog'); - this.baseballPlayer = new SkyWarsMode(data, 'kit_basic_solo_baseball-player'); - this.princess = new SkyWarsMode(data, 'kit_basic_solo_princess'); - this.batguy = new SkyWarsMode(data, 'kit_basic_solo_batguy'); - this.healer = new SkyWarsMode(data, 'kit_basic_solo_healer'); - this.cactus = new SkyWarsMode(data, 'kit_basic_solo_cactus'); - this.warlock = new SkyWarsMode(data, 'kit_basic_solo_warlock'); - this.archeologist = new SkyWarsMode(data, 'kit_basic_solo_archeologist'); - this.fallenAngel = new SkyWarsMode(data, 'kit_basic_solo_fallen-angel'); + this.default = new BaseSkyWarsMode(data, 'kit_basic_solo_default'); + this.armorsmith = new BaseSkyWarsMode(data, 'kit_basic_solo_armorsmith'); + this.ecologist = new BaseSkyWarsMode(data, 'kit_basic_solo_ecologist'); + this.fisherman = new BaseSkyWarsMode(data, 'kit_basic_solo_fisherman'); + this.speleologist = new BaseSkyWarsMode(data, 'kit_basic_solo_speleologist'); + this.troll = new BaseSkyWarsMode(data, 'kit_basic_solo_troll'); + this.snowman = new BaseSkyWarsMode(data, 'kit_basic_solo_snowman'); + this.rookie = new BaseSkyWarsMode(data, 'kit_basic_solo_rookie'); + this.scout = new BaseSkyWarsMode(data, 'kit_basic_solo_scout'); + this.energix = new BaseSkyWarsMode(data, 'kit_basic_solo_energix'); + this.grenade = new BaseSkyWarsMode(data, 'kit_basic_solo_grenade'); + this.pharaoh = new BaseSkyWarsMode(data, 'kit_basic_solo_pharaoh'); + this.disco = new BaseSkyWarsMode(data, 'kit_basic_solo_disco'); + this.frog = new BaseSkyWarsMode(data, 'kit_basic_solo_frog'); + this.baseballPlayer = new BaseSkyWarsMode(data, 'kit_basic_solo_baseball-player'); + this.princess = new BaseSkyWarsMode(data, 'kit_basic_solo_princess'); + this.batguy = new BaseSkyWarsMode(data, 'kit_basic_solo_batguy'); + this.healer = new BaseSkyWarsMode(data, 'kit_basic_solo_healer'); + this.cactus = new BaseSkyWarsMode(data, 'kit_basic_solo_cactus'); + this.warlock = new BaseSkyWarsMode(data, 'kit_basic_solo_warlock'); + this.archeologist = new BaseSkyWarsMode(data, 'kit_basic_solo_archeologist'); + this.fallenAngel = new BaseSkyWarsMode(data, 'kit_basic_solo_fallen-angel'); } } diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLab.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLab.test.ts index dbd8072db..3feef3746 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLab.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLab.test.ts @@ -1,4 +1,4 @@ -import SkyWarsMode from '../../../SkyWarsMode/SkyWarsMode.js'; +import BaseSkyWarsMode from '../../../SkyWarsMode/BaseSkyWarsMode.js'; import SkyWarsSoloKitsLab from './SkyWarsSoloKitsLab.js'; import SkyWarsSoloKitsLabAdvanced from './SkyWarsSoloKitsLabAdvanced.js'; import SkyWarsSoloKitsLabBasic from './SkyWarsSoloKitsLabBasic.js'; @@ -16,6 +16,6 @@ test('SkyWarsSoloKitsLab', () => { expect(data.advanced).toBeInstanceOf(SkyWarsSoloKitsLabAdvanced); expectTypeOf(data.advanced).toEqualTypeOf(); expect(data.enderChest).toBeDefined(); - expect(data.enderChest).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.enderChest).toEqualTypeOf(); + expect(data.enderChest).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.enderChest).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLab.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLab.ts index 37d0ef78c..1c5d308b2 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLab.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLab.ts @@ -1,15 +1,15 @@ -import SkyWarsMode from '../../../SkyWarsMode/SkyWarsMode.ts'; +import BaseSkyWarsMode from '../../../SkyWarsMode/BaseSkyWarsMode.ts'; import SkyWarsSoloKitsLabAdvanced from './SkyWarsSoloKitsLabAdvanced.ts'; import SkyWarsSoloKitsLabBasic from './SkyWarsSoloKitsLabBasic.js'; class SkyWarsSoloKitsLab { basic: SkyWarsSoloKitsLabBasic; advanced: SkyWarsSoloKitsLabAdvanced; - enderChest: SkyWarsMode; + enderChest: BaseSkyWarsMode; constructor(data: Record) { this.basic = new SkyWarsSoloKitsLabBasic(data); this.advanced = new SkyWarsSoloKitsLabAdvanced(data); - this.enderChest = new SkyWarsMode(data, 'lab_kit_enderchest_solo_enderchest'); + this.enderChest = new BaseSkyWarsMode(data, 'lab_kit_enderchest_solo_enderchest'); } } diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabAdvanced.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabAdvanced.test.ts index 02fd92fcf..b148abb4a 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabAdvanced.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabAdvanced.test.ts @@ -1,4 +1,4 @@ -import SkyWarsMode from '../../../SkyWarsMode/SkyWarsMode.js'; +import BaseSkyWarsMode from '../../../SkyWarsMode/BaseSkyWarsMode.js'; import SkyWarsSoloKitsLabAdvanced from './SkyWarsSoloKitsLabAdvanced.js'; import { expect, expectTypeOf, test } from 'vitest'; @@ -8,51 +8,51 @@ test('SkyWarsSoloKitsLabAdvanced', () => { expect(data).toBeInstanceOf(SkyWarsSoloKitsLabAdvanced); expectTypeOf(data).toEqualTypeOf(); expect(data.armorer).toBeDefined(); - expect(data.armorer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.armorer).toEqualTypeOf(); + expect(data.armorer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.armorer).toEqualTypeOf(); expect(data.salmon).toBeDefined(); - expect(data.salmon).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.salmon).toEqualTypeOf(); + expect(data.salmon).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.salmon).toEqualTypeOf(); expect(data.knight).toBeDefined(); - expect(data.knight).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.knight).toEqualTypeOf(); + expect(data.knight).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.knight).toEqualTypeOf(); expect(data.pyro).toBeDefined(); - expect(data.pyro).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.pyro).toEqualTypeOf(); + expect(data.pyro).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.pyro).toEqualTypeOf(); expect(data.zookeeper).toBeDefined(); - expect(data.zookeeper).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.zookeeper).toEqualTypeOf(); + expect(data.zookeeper).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.zookeeper).toEqualTypeOf(); expect(data.slime).toBeDefined(); - expect(data.slime).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.slime).toEqualTypeOf(); + expect(data.slime).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.slime).toEqualTypeOf(); expect(data.farmer).toBeDefined(); - expect(data.farmer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.farmer).toEqualTypeOf(); + expect(data.farmer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.farmer).toEqualTypeOf(); expect(data.enchanter).toBeDefined(); - expect(data.enchanter).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.enchanter).toEqualTypeOf(); + expect(data.enchanter).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.enchanter).toEqualTypeOf(); expect(data.jester).toBeDefined(); - expect(data.jester).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.jester).toEqualTypeOf(); + expect(data.jester).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.jester).toEqualTypeOf(); expect(data.engineer).toBeDefined(); - expect(data.engineer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.engineer).toEqualTypeOf(); + expect(data.engineer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.engineer).toEqualTypeOf(); expect(data.enderman).toBeDefined(); - expect(data.enderman).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.enderman).toEqualTypeOf(); + expect(data.enderman).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.enderman).toEqualTypeOf(); expect(data.cannoneer).toBeDefined(); - expect(data.cannoneer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.cannoneer).toEqualTypeOf(); + expect(data.cannoneer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.cannoneer).toEqualTypeOf(); expect(data.hunter).toBeDefined(); - expect(data.hunter).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.hunter).toEqualTypeOf(); + expect(data.hunter).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.hunter).toEqualTypeOf(); expect(data.sloth).toBeDefined(); - expect(data.sloth).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.sloth).toEqualTypeOf(); + expect(data.sloth).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.sloth).toEqualTypeOf(); expect(data.pigRider).toBeDefined(); - expect(data.pigRider).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.pigRider).toEqualTypeOf(); + expect(data.pigRider).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.pigRider).toEqualTypeOf(); expect(data.magician).toBeDefined(); - expect(data.magician).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.magician).toEqualTypeOf(); + expect(data.magician).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.magician).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabAdvanced.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabAdvanced.ts index 6b98203bd..b603fb230 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabAdvanced.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabAdvanced.ts @@ -1,39 +1,39 @@ -import SkyWarsMode from '../../../SkyWarsMode/SkyWarsMode.ts'; +import BaseSkyWarsMode from '../../../SkyWarsMode/BaseSkyWarsMode.ts'; class SkyWarsSoloKitsLabAdvanced { - armorer: SkyWarsMode; - salmon: SkyWarsMode; - knight: SkyWarsMode; - pyro: SkyWarsMode; - zookeeper: SkyWarsMode; - slime: SkyWarsMode; - farmer: SkyWarsMode; - enchanter: SkyWarsMode; - jester: SkyWarsMode; - engineer: SkyWarsMode; - enderman: SkyWarsMode; - cannoneer: SkyWarsMode; - hunter: SkyWarsMode; - sloth: SkyWarsMode; - pigRider: SkyWarsMode; - magician: SkyWarsMode; + armorer: BaseSkyWarsMode; + salmon: BaseSkyWarsMode; + knight: BaseSkyWarsMode; + pyro: BaseSkyWarsMode; + zookeeper: BaseSkyWarsMode; + slime: BaseSkyWarsMode; + farmer: BaseSkyWarsMode; + enchanter: BaseSkyWarsMode; + jester: BaseSkyWarsMode; + engineer: BaseSkyWarsMode; + enderman: BaseSkyWarsMode; + cannoneer: BaseSkyWarsMode; + hunter: BaseSkyWarsMode; + sloth: BaseSkyWarsMode; + pigRider: BaseSkyWarsMode; + magician: BaseSkyWarsMode; constructor(data: Record) { - this.armorer = new SkyWarsMode(data, 'lab_kit_advanced_solo_armorer'); - this.salmon = new SkyWarsMode(data, 'lab_kit_advanced_solo_salmon'); - this.knight = new SkyWarsMode(data, 'lab_kit_advanced_solo_knight'); - this.pyro = new SkyWarsMode(data, 'lab_kit_advanced_solo_pyro'); - this.zookeeper = new SkyWarsMode(data, 'lab_kit_advanced_solo_zookeeper'); - this.slime = new SkyWarsMode(data, 'lab_kit_advanced_solo_slime'); - this.farmer = new SkyWarsMode(data, 'lab_kit_advanced_solo_farmer'); - this.enchanter = new SkyWarsMode(data, 'lab_kit_advanced_solo_enchanter'); - this.jester = new SkyWarsMode(data, 'lab_kit_advanced_solo_jester'); - this.engineer = new SkyWarsMode(data, 'lab_kit_advanced_solo_engineer'); - this.enderman = new SkyWarsMode(data, 'lab_kit_advanced_solo_enderman'); - this.cannoneer = new SkyWarsMode(data, 'lab_kit_advanced_solo_cannoneer'); - this.hunter = new SkyWarsMode(data, 'lab_kit_advanced_solo_hunter'); - this.sloth = new SkyWarsMode(data, 'lab_kit_advanced_solo_sloth'); - this.pigRider = new SkyWarsMode(data, 'lab_kit_advanced_solo_pig-rider'); - this.magician = new SkyWarsMode(data, 'lab_kit_advanced_solo_magician'); + this.armorer = new BaseSkyWarsMode(data, 'lab_kit_advanced_solo_armorer'); + this.salmon = new BaseSkyWarsMode(data, 'lab_kit_advanced_solo_salmon'); + this.knight = new BaseSkyWarsMode(data, 'lab_kit_advanced_solo_knight'); + this.pyro = new BaseSkyWarsMode(data, 'lab_kit_advanced_solo_pyro'); + this.zookeeper = new BaseSkyWarsMode(data, 'lab_kit_advanced_solo_zookeeper'); + this.slime = new BaseSkyWarsMode(data, 'lab_kit_advanced_solo_slime'); + this.farmer = new BaseSkyWarsMode(data, 'lab_kit_advanced_solo_farmer'); + this.enchanter = new BaseSkyWarsMode(data, 'lab_kit_advanced_solo_enchanter'); + this.jester = new BaseSkyWarsMode(data, 'lab_kit_advanced_solo_jester'); + this.engineer = new BaseSkyWarsMode(data, 'lab_kit_advanced_solo_engineer'); + this.enderman = new BaseSkyWarsMode(data, 'lab_kit_advanced_solo_enderman'); + this.cannoneer = new BaseSkyWarsMode(data, 'lab_kit_advanced_solo_cannoneer'); + this.hunter = new BaseSkyWarsMode(data, 'lab_kit_advanced_solo_hunter'); + this.sloth = new BaseSkyWarsMode(data, 'lab_kit_advanced_solo_sloth'); + this.pigRider = new BaseSkyWarsMode(data, 'lab_kit_advanced_solo_pig-rider'); + this.magician = new BaseSkyWarsMode(data, 'lab_kit_advanced_solo_magician'); } } diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabBasic.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabBasic.test.ts index 86f519e98..01bf7e74d 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabBasic.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabBasic.test.ts @@ -1,4 +1,4 @@ -import SkyWarsMode from '../../../SkyWarsMode/SkyWarsMode.js'; +import BaseSkyWarsMode from '../../../SkyWarsMode/BaseSkyWarsMode.js'; import SkyWarsSoloKitsLabBasic from './SkyWarsSoloKitsLabBasic.js'; import { expect, expectTypeOf, test } from 'vitest'; @@ -8,54 +8,54 @@ test('SkyWarsSoloKitsLabBasic', () => { expect(data).toBeInstanceOf(SkyWarsSoloKitsLabBasic); expectTypeOf(data).toEqualTypeOf(); expect(data.default).toBeDefined(); - expect(data.default).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.default).toEqualTypeOf(); + expect(data.default).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.default).toEqualTypeOf(); expect(data.scout).toBeDefined(); - expect(data.scout).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.scout).toEqualTypeOf(); + expect(data.scout).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.scout).toEqualTypeOf(); expect(data.ecologist).toBeDefined(); - expect(data.ecologist).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.ecologist).toEqualTypeOf(); + expect(data.ecologist).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.ecologist).toEqualTypeOf(); expect(data.speleologist).toBeDefined(); - expect(data.speleologist).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.speleologist).toEqualTypeOf(); + expect(data.speleologist).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.speleologist).toEqualTypeOf(); expect(data.armorsmith).toBeDefined(); - expect(data.armorsmith).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.armorsmith).toEqualTypeOf(); + expect(data.armorsmith).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.armorsmith).toEqualTypeOf(); expect(data.energix).toBeDefined(); - expect(data.energix).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.energix).toEqualTypeOf(); + expect(data.energix).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.energix).toEqualTypeOf(); expect(data.baseballPlayer).toBeDefined(); - expect(data.baseballPlayer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.baseballPlayer).toEqualTypeOf(); + expect(data.baseballPlayer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.baseballPlayer).toEqualTypeOf(); expect(data.disco).toBeDefined(); - expect(data.disco).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.disco).toEqualTypeOf(); + expect(data.disco).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.disco).toEqualTypeOf(); expect(data.pharaoh).toBeDefined(); - expect(data.pharaoh).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.pharaoh).toEqualTypeOf(); + expect(data.pharaoh).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.pharaoh).toEqualTypeOf(); expect(data.frog).toBeDefined(); - expect(data.frog).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.frog).toEqualTypeOf(); + expect(data.frog).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.frog).toEqualTypeOf(); expect(data.grenade).toBeDefined(); - expect(data.grenade).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.grenade).toEqualTypeOf(); + expect(data.grenade).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.grenade).toEqualTypeOf(); expect(data.fisherman).toBeDefined(); - expect(data.fisherman).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.fisherman).toEqualTypeOf(); + expect(data.fisherman).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.fisherman).toEqualTypeOf(); expect(data.rookie).toBeDefined(); - expect(data.rookie).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.rookie).toEqualTypeOf(); + expect(data.rookie).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.rookie).toEqualTypeOf(); expect(data.troll).toBeDefined(); - expect(data.troll).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.troll).toEqualTypeOf(); + expect(data.troll).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.troll).toEqualTypeOf(); expect(data.snowman).toBeDefined(); - expect(data.snowman).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.snowman).toEqualTypeOf(); + expect(data.snowman).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.snowman).toEqualTypeOf(); expect(data.princess).toBeDefined(); - expect(data.princess).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.princess).toEqualTypeOf(); + expect(data.princess).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.princess).toEqualTypeOf(); expect(data.batguy).toBeDefined(); - expect(data.batguy).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.batguy).toEqualTypeOf(); + expect(data.batguy).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.batguy).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabBasic.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabBasic.ts index 9eac077c9..2e69232a1 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabBasic.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsLab/SkyWarsSoloKitsLabBasic.ts @@ -1,41 +1,41 @@ -import SkyWarsMode from '../../../SkyWarsMode/SkyWarsMode.ts'; +import BaseSkyWarsMode from '../../../SkyWarsMode/BaseSkyWarsMode.ts'; class SkyWarsSoloKitsLabBasic { - default: SkyWarsMode; - scout: SkyWarsMode; - ecologist: SkyWarsMode; - speleologist: SkyWarsMode; - armorsmith: SkyWarsMode; - energix: SkyWarsMode; - baseballPlayer: SkyWarsMode; - disco: SkyWarsMode; - pharaoh: SkyWarsMode; - frog: SkyWarsMode; - grenade: SkyWarsMode; - fisherman: SkyWarsMode; - rookie: SkyWarsMode; - troll: SkyWarsMode; - snowman: SkyWarsMode; - princess: SkyWarsMode; - batguy: SkyWarsMode; + default: BaseSkyWarsMode; + scout: BaseSkyWarsMode; + ecologist: BaseSkyWarsMode; + speleologist: BaseSkyWarsMode; + armorsmith: BaseSkyWarsMode; + energix: BaseSkyWarsMode; + baseballPlayer: BaseSkyWarsMode; + disco: BaseSkyWarsMode; + pharaoh: BaseSkyWarsMode; + frog: BaseSkyWarsMode; + grenade: BaseSkyWarsMode; + fisherman: BaseSkyWarsMode; + rookie: BaseSkyWarsMode; + troll: BaseSkyWarsMode; + snowman: BaseSkyWarsMode; + princess: BaseSkyWarsMode; + batguy: BaseSkyWarsMode; constructor(data: Record) { - this.default = new SkyWarsMode(data, 'lab_kit_basic_solo_default'); - this.scout = new SkyWarsMode(data, 'lab_kit_basic_solo_scout'); - this.ecologist = new SkyWarsMode(data, 'lab_kit_basic_solo_ecologist'); - this.speleologist = new SkyWarsMode(data, 'lab_kit_basic_solo_speleologist'); - this.armorsmith = new SkyWarsMode(data, 'lab_kit_basic_solo_armorsmith'); - this.energix = new SkyWarsMode(data, 'lab_kit_basic_solo_energix'); - this.baseballPlayer = new SkyWarsMode(data, 'lab_kit_basic_solo_baseball-player'); - this.disco = new SkyWarsMode(data, 'lab_kit_basic_solo_disco'); - this.pharaoh = new SkyWarsMode(data, 'lab_kit_basic_solo_pharaoh'); - this.frog = new SkyWarsMode(data, 'lab_kit_basic_solo_frog'); - this.grenade = new SkyWarsMode(data, 'lab_kit_basic_solo_grenade'); - this.fisherman = new SkyWarsMode(data, 'lab_kit_basic_solo_fisherman'); - this.rookie = new SkyWarsMode(data, 'lab_kit_basic_solo_rookie'); - this.troll = new SkyWarsMode(data, 'lab_kit_basic_solo_troll'); - this.snowman = new SkyWarsMode(data, 'lab_kit_basic_solo_snowman'); - this.princess = new SkyWarsMode(data, 'lab_kit_basic_solo_princess'); - this.batguy = new SkyWarsMode(data, 'lab_kit_basic_solo_batguy'); + this.default = new BaseSkyWarsMode(data, 'lab_kit_basic_solo_default'); + this.scout = new BaseSkyWarsMode(data, 'lab_kit_basic_solo_scout'); + this.ecologist = new BaseSkyWarsMode(data, 'lab_kit_basic_solo_ecologist'); + this.speleologist = new BaseSkyWarsMode(data, 'lab_kit_basic_solo_speleologist'); + this.armorsmith = new BaseSkyWarsMode(data, 'lab_kit_basic_solo_armorsmith'); + this.energix = new BaseSkyWarsMode(data, 'lab_kit_basic_solo_energix'); + this.baseballPlayer = new BaseSkyWarsMode(data, 'lab_kit_basic_solo_baseball-player'); + this.disco = new BaseSkyWarsMode(data, 'lab_kit_basic_solo_disco'); + this.pharaoh = new BaseSkyWarsMode(data, 'lab_kit_basic_solo_pharaoh'); + this.frog = new BaseSkyWarsMode(data, 'lab_kit_basic_solo_frog'); + this.grenade = new BaseSkyWarsMode(data, 'lab_kit_basic_solo_grenade'); + this.fisherman = new BaseSkyWarsMode(data, 'lab_kit_basic_solo_fisherman'); + this.rookie = new BaseSkyWarsMode(data, 'lab_kit_basic_solo_rookie'); + this.troll = new BaseSkyWarsMode(data, 'lab_kit_basic_solo_troll'); + this.snowman = new BaseSkyWarsMode(data, 'lab_kit_basic_solo_snowman'); + this.princess = new BaseSkyWarsMode(data, 'lab_kit_basic_solo_princess'); + this.batguy = new BaseSkyWarsMode(data, 'lab_kit_basic_solo_batguy'); } } diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsMini.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsMini.test.ts index 42af36ad6..7150a0ef9 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsMini.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsMini.test.ts @@ -1,4 +1,4 @@ -import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.js'; +import BaseSkyWarsMode from '../../SkyWarsMode/BaseSkyWarsMode.js'; import SkyWarsSoloKitsMini from './SkyWarsSoloKitsMini.js'; import { expect, expectTypeOf, test } from 'vitest'; @@ -8,36 +8,36 @@ test('SkyWarsSoloKitsMini', () => { expect(data).toBeInstanceOf(SkyWarsSoloKitsMini); expectTypeOf(data).toEqualTypeOf(); expect(data.athlete).toBeDefined(); - expect(data.athlete).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.athlete).toEqualTypeOf(); + expect(data.athlete).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.athlete).toEqualTypeOf(); expect(data.scout).toBeDefined(); - expect(data.scout).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.scout).toEqualTypeOf(); + expect(data.scout).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.scout).toEqualTypeOf(); expect(data.champion).toBeDefined(); - expect(data.champion).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.champion).toEqualTypeOf(); + expect(data.champion).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.champion).toEqualTypeOf(); expect(data.magician).toBeDefined(); - expect(data.magician).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.magician).toEqualTypeOf(); + expect(data.magician).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.magician).toEqualTypeOf(); expect(data.bowman).toBeDefined(); - expect(data.bowman).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.bowman).toEqualTypeOf(); + expect(data.bowman).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.bowman).toEqualTypeOf(); expect(data.healer).toBeDefined(); - expect(data.healer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.healer).toEqualTypeOf(); + expect(data.healer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.healer).toEqualTypeOf(); expect(data.pyromancer).toBeDefined(); - expect(data.pyromancer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.pyromancer).toEqualTypeOf(); + expect(data.pyromancer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.pyromancer).toEqualTypeOf(); expect(data.armorer).toBeDefined(); - expect(data.armorer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.armorer).toEqualTypeOf(); + expect(data.armorer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.armorer).toEqualTypeOf(); expect(data.blacksmith).toBeDefined(); - expect(data.blacksmith).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.blacksmith).toEqualTypeOf(); + expect(data.blacksmith).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.blacksmith).toEqualTypeOf(); expect(data.hound).toBeDefined(); - expect(data.hound).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.hound).toEqualTypeOf(); + expect(data.hound).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.hound).toEqualTypeOf(); expect(data.paladin).toBeDefined(); - expect(data.paladin).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.paladin).toEqualTypeOf(); + expect(data.paladin).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.paladin).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsMini.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsMini.ts index 8647a8e6c..f9eef776e 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsMini.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsMini.ts @@ -1,29 +1,29 @@ -import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.ts'; +import BaseSkyWarsMode from '../../SkyWarsMode/BaseSkyWarsMode.ts'; class SkyWarsSoloKitsMini { - athlete: SkyWarsMode; - scout: SkyWarsMode; - champion: SkyWarsMode; - magician: SkyWarsMode; - bowman: SkyWarsMode; - healer: SkyWarsMode; - pyromancer: SkyWarsMode; - armorer: SkyWarsMode; - blacksmith: SkyWarsMode; - hound: SkyWarsMode; - paladin: SkyWarsMode; + athlete: BaseSkyWarsMode; + scout: BaseSkyWarsMode; + champion: BaseSkyWarsMode; + magician: BaseSkyWarsMode; + bowman: BaseSkyWarsMode; + healer: BaseSkyWarsMode; + pyromancer: BaseSkyWarsMode; + armorer: BaseSkyWarsMode; + blacksmith: BaseSkyWarsMode; + hound: BaseSkyWarsMode; + paladin: BaseSkyWarsMode; constructor(data: Record) { - this.athlete = new SkyWarsMode(data, 'kit_mini_solo_athlete'); - this.scout = new SkyWarsMode(data, 'kit_mini_solo_scout'); - this.champion = new SkyWarsMode(data, 'kit_mini_solo_champion'); - this.magician = new SkyWarsMode(data, 'kit_mini_solo_magician'); - this.bowman = new SkyWarsMode(data, 'kit_mini_solo_bowman'); - this.healer = new SkyWarsMode(data, 'kit_mini_solo_healer'); - this.pyromancer = new SkyWarsMode(data, 'kit_mini_solo_pyromancer'); - this.armorer = new SkyWarsMode(data, 'kit_mini_solo_armorer'); - this.blacksmith = new SkyWarsMode(data, 'kit_mini_solo_blacksmith'); - this.hound = new SkyWarsMode(data, 'kit_mini_solo_hound'); - this.paladin = new SkyWarsMode(data, 'kit_mini_solo_paladin'); + this.athlete = new BaseSkyWarsMode(data, 'kit_mini_solo_athlete'); + this.scout = new BaseSkyWarsMode(data, 'kit_mini_solo_scout'); + this.champion = new BaseSkyWarsMode(data, 'kit_mini_solo_champion'); + this.magician = new BaseSkyWarsMode(data, 'kit_mini_solo_magician'); + this.bowman = new BaseSkyWarsMode(data, 'kit_mini_solo_bowman'); + this.healer = new BaseSkyWarsMode(data, 'kit_mini_solo_healer'); + this.pyromancer = new BaseSkyWarsMode(data, 'kit_mini_solo_pyromancer'); + this.armorer = new BaseSkyWarsMode(data, 'kit_mini_solo_armorer'); + this.blacksmith = new BaseSkyWarsMode(data, 'kit_mini_solo_blacksmith'); + this.hound = new BaseSkyWarsMode(data, 'kit_mini_solo_hound'); + this.paladin = new BaseSkyWarsMode(data, 'kit_mini_solo_paladin'); } } diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourney.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourney.test.ts index 83d5ed50f..6b47a0d23 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourney.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourney.test.ts @@ -1,4 +1,4 @@ -import SkyWarsMode from '../../../SkyWarsMode/SkyWarsMode.js'; +import BaseSkyWarsMode from '../../../SkyWarsMode/BaseSkyWarsMode.js'; import SkyWarsSoloKitsTourney from './SkyWarsSoloKitsTourney.js'; import SkyWarsSoloKitsTourneyAdvanced from './SkyWarsSoloKitsTourneyAdvanced.js'; import SkyWarsSoloKitsTourneyBasic from './SkyWarsSoloKitsTourneyBasic.js'; @@ -16,6 +16,6 @@ test('SkyWarsSoloKitsTourney', () => { expect(data.advanced).toBeInstanceOf(SkyWarsSoloKitsTourneyAdvanced); expectTypeOf(data.advanced).toEqualTypeOf(); expect(data.enderChest).toBeDefined(); - expect(data.enderChest).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.enderChest).toEqualTypeOf(); + expect(data.enderChest).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.enderChest).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourney.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourney.ts index 1c7f093eb..2be391133 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourney.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourney.ts @@ -1,15 +1,15 @@ -import SkyWarsMode from '../../../SkyWarsMode/SkyWarsMode.ts'; +import BaseSkyWarsMode from '../../../SkyWarsMode/BaseSkyWarsMode.ts'; import SkyWarsSoloKitsTourneyAdvanced from './SkyWarsSoloKitsTourneyAdvanced.ts'; import SkyWarsSoloKitsTourneyBasic from './SkyWarsSoloKitsTourneyBasic.ts'; class SkyWarsSoloKitsTourney { basic: SkyWarsSoloKitsTourneyBasic; advanced: SkyWarsSoloKitsTourneyAdvanced; - enderChest: SkyWarsMode; + enderChest: BaseSkyWarsMode; constructor(data: Record) { this.basic = new SkyWarsSoloKitsTourneyBasic(data); this.advanced = new SkyWarsSoloKitsTourneyAdvanced(data); - this.enderChest = new SkyWarsMode(data, 'tourney_kit_enderchest_solo_enderchest'); + this.enderChest = new BaseSkyWarsMode(data, 'tourney_kit_enderchest_solo_enderchest'); } } diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyAdvanced.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyAdvanced.test.ts index c688beac2..857dcc548 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyAdvanced.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyAdvanced.test.ts @@ -1,4 +1,4 @@ -import SkyWarsMode from '../../../SkyWarsMode/SkyWarsMode.js'; +import BaseSkyWarsMode from '../../../SkyWarsMode/BaseSkyWarsMode.js'; import SkyWarsSoloKitsTourneyAdvanced from './SkyWarsSoloKitsTourneyAdvanced.js'; import { expect, expectTypeOf, test } from 'vitest'; @@ -8,42 +8,42 @@ test('SkyWarsSoloKitsTourneyAdvanced', () => { expect(data).toBeInstanceOf(SkyWarsSoloKitsTourneyAdvanced); expectTypeOf(data).toEqualTypeOf(); expect(data.armorer).toBeDefined(); - expect(data.armorer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.armorer).toEqualTypeOf(); + expect(data.armorer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.armorer).toEqualTypeOf(); expect(data.enderman).toBeDefined(); - expect(data.enderman).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.enderman).toEqualTypeOf(); + expect(data.enderman).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.enderman).toEqualTypeOf(); expect(data.knight).toBeDefined(); - expect(data.knight).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.knight).toEqualTypeOf(); + expect(data.knight).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.knight).toEqualTypeOf(); expect(data.enchanter).toBeDefined(); - expect(data.enchanter).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.enchanter).toEqualTypeOf(); + expect(data.enchanter).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.enchanter).toEqualTypeOf(); expect(data.farmer).toBeDefined(); - expect(data.farmer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.farmer).toEqualTypeOf(); + expect(data.farmer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.farmer).toEqualTypeOf(); expect(data.cannoneer).toBeDefined(); - expect(data.cannoneer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.cannoneer).toEqualTypeOf(); + expect(data.cannoneer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.cannoneer).toEqualTypeOf(); expect(data.jester).toBeDefined(); - expect(data.jester).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.jester).toEqualTypeOf(); + expect(data.jester).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.jester).toEqualTypeOf(); expect(data.hunter).toBeDefined(); - expect(data.hunter).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.hunter).toEqualTypeOf(); + expect(data.hunter).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.hunter).toEqualTypeOf(); expect(data.magician).toBeDefined(); - expect(data.magician).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.magician).toEqualTypeOf(); + expect(data.magician).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.magician).toEqualTypeOf(); expect(data.zookeeper).toBeDefined(); - expect(data.zookeeper).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.zookeeper).toEqualTypeOf(); + expect(data.zookeeper).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.zookeeper).toEqualTypeOf(); expect(data.slime).toBeDefined(); - expect(data.slime).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.slime).toEqualTypeOf(); + expect(data.slime).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.slime).toEqualTypeOf(); expect(data.engineer).toBeDefined(); - expect(data.engineer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.engineer).toEqualTypeOf(); + expect(data.engineer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.engineer).toEqualTypeOf(); expect(data.pigRider).toBeDefined(); - expect(data.pigRider).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.pigRider).toEqualTypeOf(); + expect(data.pigRider).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.pigRider).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyAdvanced.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyAdvanced.ts index 19a4906af..5e1f821df 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyAdvanced.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyAdvanced.ts @@ -1,33 +1,33 @@ -import SkyWarsMode from '../../../SkyWarsMode/SkyWarsMode.ts'; +import BaseSkyWarsMode from '../../../SkyWarsMode/BaseSkyWarsMode.ts'; class SkyWarsSoloKitsTourneyAdvanced { - armorer: SkyWarsMode; - enderman: SkyWarsMode; - knight: SkyWarsMode; - enchanter: SkyWarsMode; - farmer: SkyWarsMode; - cannoneer: SkyWarsMode; - jester: SkyWarsMode; - hunter: SkyWarsMode; - magician: SkyWarsMode; - zookeeper: SkyWarsMode; - slime: SkyWarsMode; - engineer: SkyWarsMode; - pigRider: SkyWarsMode; + armorer: BaseSkyWarsMode; + enderman: BaseSkyWarsMode; + knight: BaseSkyWarsMode; + enchanter: BaseSkyWarsMode; + farmer: BaseSkyWarsMode; + cannoneer: BaseSkyWarsMode; + jester: BaseSkyWarsMode; + hunter: BaseSkyWarsMode; + magician: BaseSkyWarsMode; + zookeeper: BaseSkyWarsMode; + slime: BaseSkyWarsMode; + engineer: BaseSkyWarsMode; + pigRider: BaseSkyWarsMode; constructor(data: Record) { - this.armorer = new SkyWarsMode(data, 'tourney_kit_advanced_solo_armorer'); - this.enderman = new SkyWarsMode(data, 'tourney_kit_advanced_solo_enderman'); - this.knight = new SkyWarsMode(data, 'tourney_kit_advanced_solo_knight'); - this.enchanter = new SkyWarsMode(data, 'tourney_kit_advanced_solo_enchanter'); - this.farmer = new SkyWarsMode(data, 'tourney_kit_advanced_solo_farmer'); - this.cannoneer = new SkyWarsMode(data, 'tourney_kit_advanced_solo_cannoneer'); - this.jester = new SkyWarsMode(data, 'tourney_kit_advanced_solo_jester'); - this.hunter = new SkyWarsMode(data, 'tourney_kit_advanced_solo_hunter'); - this.magician = new SkyWarsMode(data, 'tourney_kit_advanced_solo_magician'); - this.zookeeper = new SkyWarsMode(data, 'tourney_kit_advanced_solo_zookeeper'); - this.slime = new SkyWarsMode(data, 'tourney_kit_advanced_solo_slime'); - this.engineer = new SkyWarsMode(data, 'tourney_kit_advanced_solo_engineer'); - this.pigRider = new SkyWarsMode(data, 'tourney_kit_advanced_solo_pig-rider'); + this.armorer = new BaseSkyWarsMode(data, 'tourney_kit_advanced_solo_armorer'); + this.enderman = new BaseSkyWarsMode(data, 'tourney_kit_advanced_solo_enderman'); + this.knight = new BaseSkyWarsMode(data, 'tourney_kit_advanced_solo_knight'); + this.enchanter = new BaseSkyWarsMode(data, 'tourney_kit_advanced_solo_enchanter'); + this.farmer = new BaseSkyWarsMode(data, 'tourney_kit_advanced_solo_farmer'); + this.cannoneer = new BaseSkyWarsMode(data, 'tourney_kit_advanced_solo_cannoneer'); + this.jester = new BaseSkyWarsMode(data, 'tourney_kit_advanced_solo_jester'); + this.hunter = new BaseSkyWarsMode(data, 'tourney_kit_advanced_solo_hunter'); + this.magician = new BaseSkyWarsMode(data, 'tourney_kit_advanced_solo_magician'); + this.zookeeper = new BaseSkyWarsMode(data, 'tourney_kit_advanced_solo_zookeeper'); + this.slime = new BaseSkyWarsMode(data, 'tourney_kit_advanced_solo_slime'); + this.engineer = new BaseSkyWarsMode(data, 'tourney_kit_advanced_solo_engineer'); + this.pigRider = new BaseSkyWarsMode(data, 'tourney_kit_advanced_solo_pig-rider'); } } diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyBasic.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyBasic.test.ts index 16f6aae39..ac08d161a 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyBasic.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyBasic.test.ts @@ -1,4 +1,4 @@ -import SkyWarsMode from '../../../SkyWarsMode/SkyWarsMode.js'; +import BaseSkyWarsMode from '../../../SkyWarsMode/BaseSkyWarsMode.js'; import SkyWarsSoloKitsTourneyBasic from './SkyWarsSoloKitsTourneyBasic.js'; import { expect, expectTypeOf, test } from 'vitest'; @@ -8,63 +8,63 @@ test('SkyWarsSoloKitsTourneyBasic', () => { expect(data).toBeInstanceOf(SkyWarsSoloKitsTourneyBasic); expectTypeOf(data).toEqualTypeOf(); expect(data.frog).toBeDefined(); - expect(data.frog).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.frog).toEqualTypeOf(); + expect(data.frog).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.frog).toEqualTypeOf(); expect(data.disco).toBeDefined(); - expect(data.disco).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.disco).toEqualTypeOf(); + expect(data.disco).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.disco).toEqualTypeOf(); expect(data.armorsmith).toBeDefined(); - expect(data.armorsmith).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.armorsmith).toEqualTypeOf(); + expect(data.armorsmith).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.armorsmith).toEqualTypeOf(); expect(data.fisherman).toBeDefined(); - expect(data.fisherman).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.fisherman).toEqualTypeOf(); + expect(data.fisherman).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.fisherman).toEqualTypeOf(); expect(data.pharaoh).toBeDefined(); - expect(data.pharaoh).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.pharaoh).toEqualTypeOf(); + expect(data.pharaoh).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.pharaoh).toEqualTypeOf(); expect(data.ecologist).toBeDefined(); - expect(data.ecologist).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.ecologist).toEqualTypeOf(); + expect(data.ecologist).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.ecologist).toEqualTypeOf(); expect(data.healer).toBeDefined(); - expect(data.healer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.healer).toEqualTypeOf(); + expect(data.healer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.healer).toEqualTypeOf(); expect(data.energix).toBeDefined(); - expect(data.energix).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.energix).toEqualTypeOf(); + expect(data.energix).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.energix).toEqualTypeOf(); expect(data.speleologist).toBeDefined(); - expect(data.speleologist).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.speleologist).toEqualTypeOf(); + expect(data.speleologist).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.speleologist).toEqualTypeOf(); expect(data.cactus).toBeDefined(); - expect(data.cactus).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.cactus).toEqualTypeOf(); + expect(data.cactus).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.cactus).toEqualTypeOf(); expect(data.rookie).toBeDefined(); - expect(data.rookie).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.rookie).toEqualTypeOf(); + expect(data.rookie).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.rookie).toEqualTypeOf(); expect(data.baseballPlayer).toBeDefined(); - expect(data.baseballPlayer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.baseballPlayer).toEqualTypeOf(); + expect(data.baseballPlayer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.baseballPlayer).toEqualTypeOf(); expect(data.default).toBeDefined(); - expect(data.default).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.default).toEqualTypeOf(); + expect(data.default).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.default).toEqualTypeOf(); expect(data.scout).toBeDefined(); - expect(data.scout).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.scout).toEqualTypeOf(); + expect(data.scout).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.scout).toEqualTypeOf(); expect(data.snowman).toBeDefined(); - expect(data.snowman).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.snowman).toEqualTypeOf(); + expect(data.snowman).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.snowman).toEqualTypeOf(); expect(data.princess).toBeDefined(); - expect(data.princess).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.princess).toEqualTypeOf(); + expect(data.princess).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.princess).toEqualTypeOf(); expect(data.grenade).toBeDefined(); - expect(data.grenade).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.grenade).toEqualTypeOf(); + expect(data.grenade).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.grenade).toEqualTypeOf(); expect(data.troll).toBeDefined(); - expect(data.troll).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.troll).toEqualTypeOf(); + expect(data.troll).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.troll).toEqualTypeOf(); expect(data.warlock).toBeDefined(); - expect(data.warlock).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.warlock).toEqualTypeOf(); + expect(data.warlock).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.warlock).toEqualTypeOf(); expect(data.batguy).toBeDefined(); - expect(data.batguy).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.batguy).toEqualTypeOf(); + expect(data.batguy).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.batguy).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyBasic.ts b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyBasic.ts index dd589319c..c6cb949c0 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyBasic.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsSolo/SkyWarsSoloKits/SkyWarsSoloKitsTourney/SkyWarsSoloKitsTourneyBasic.ts @@ -1,47 +1,47 @@ -import SkyWarsMode from '../../../SkyWarsMode/SkyWarsMode.ts'; +import BaseSkyWarsMode from '../../../SkyWarsMode/BaseSkyWarsMode.ts'; class SkyWarsSoloKitsTourneyBasic { - frog: SkyWarsMode; - disco: SkyWarsMode; - armorsmith: SkyWarsMode; - fisherman: SkyWarsMode; - pharaoh: SkyWarsMode; - ecologist: SkyWarsMode; - healer: SkyWarsMode; - energix: SkyWarsMode; - speleologist: SkyWarsMode; - cactus: SkyWarsMode; - rookie: SkyWarsMode; - baseballPlayer: SkyWarsMode; - default: SkyWarsMode; - scout: SkyWarsMode; - snowman: SkyWarsMode; - princess: SkyWarsMode; - grenade: SkyWarsMode; - troll: SkyWarsMode; - warlock: SkyWarsMode; - batguy: SkyWarsMode; + frog: BaseSkyWarsMode; + disco: BaseSkyWarsMode; + armorsmith: BaseSkyWarsMode; + fisherman: BaseSkyWarsMode; + pharaoh: BaseSkyWarsMode; + ecologist: BaseSkyWarsMode; + healer: BaseSkyWarsMode; + energix: BaseSkyWarsMode; + speleologist: BaseSkyWarsMode; + cactus: BaseSkyWarsMode; + rookie: BaseSkyWarsMode; + baseballPlayer: BaseSkyWarsMode; + default: BaseSkyWarsMode; + scout: BaseSkyWarsMode; + snowman: BaseSkyWarsMode; + princess: BaseSkyWarsMode; + grenade: BaseSkyWarsMode; + troll: BaseSkyWarsMode; + warlock: BaseSkyWarsMode; + batguy: BaseSkyWarsMode; constructor(data: Record) { - this.frog = new SkyWarsMode(data, 'tourney_kit_basic_solo_frog'); - this.disco = new SkyWarsMode(data, 'tourney_kit_basic_solo_disco'); - this.armorsmith = new SkyWarsMode(data, 'tourney_kit_basic_solo_armorsmith'); - this.fisherman = new SkyWarsMode(data, 'tourney_kit_basic_solo_fisherman'); - this.pharaoh = new SkyWarsMode(data, 'tourney_kit_basic_solo_pharaoh'); - this.ecologist = new SkyWarsMode(data, 'tourney_kit_basic_solo_ecologist'); - this.healer = new SkyWarsMode(data, 'tourney_kit_basic_solo_healer'); - this.energix = new SkyWarsMode(data, 'tourney_kit_basic_solo_energix'); - this.speleologist = new SkyWarsMode(data, 'tourney_kit_basic_solo_speleologist'); - this.cactus = new SkyWarsMode(data, 'tourney_kit_basic_solo_cactus'); - this.rookie = new SkyWarsMode(data, 'tourney_kit_basic_solo_rookie'); - this.baseballPlayer = new SkyWarsMode(data, 'tourney_kit_basic_solo_baseball-player'); - this.default = new SkyWarsMode(data, 'tourney_kit_basic_solo_default'); - this.scout = new SkyWarsMode(data, 'tourney_kit_basic_solo_scout'); - this.snowman = new SkyWarsMode(data, 'tourney_kit_basic_solo_snowman'); - this.princess = new SkyWarsMode(data, 'tourney_kit_basic_solo_princess'); - this.grenade = new SkyWarsMode(data, 'tourney_kit_basic_solo_grenade'); - this.troll = new SkyWarsMode(data, 'tourney_kit_basic_solo_troll'); - this.warlock = new SkyWarsMode(data, 'tourney_kit_basic_solo_warlock'); - this.batguy = new SkyWarsMode(data, 'tourney_kit_basic_solo_batguy'); + this.frog = new BaseSkyWarsMode(data, 'tourney_kit_basic_solo_frog'); + this.disco = new BaseSkyWarsMode(data, 'tourney_kit_basic_solo_disco'); + this.armorsmith = new BaseSkyWarsMode(data, 'tourney_kit_basic_solo_armorsmith'); + this.fisherman = new BaseSkyWarsMode(data, 'tourney_kit_basic_solo_fisherman'); + this.pharaoh = new BaseSkyWarsMode(data, 'tourney_kit_basic_solo_pharaoh'); + this.ecologist = new BaseSkyWarsMode(data, 'tourney_kit_basic_solo_ecologist'); + this.healer = new BaseSkyWarsMode(data, 'tourney_kit_basic_solo_healer'); + this.energix = new BaseSkyWarsMode(data, 'tourney_kit_basic_solo_energix'); + this.speleologist = new BaseSkyWarsMode(data, 'tourney_kit_basic_solo_speleologist'); + this.cactus = new BaseSkyWarsMode(data, 'tourney_kit_basic_solo_cactus'); + this.rookie = new BaseSkyWarsMode(data, 'tourney_kit_basic_solo_rookie'); + this.baseballPlayer = new BaseSkyWarsMode(data, 'tourney_kit_basic_solo_baseball-player'); + this.default = new BaseSkyWarsMode(data, 'tourney_kit_basic_solo_default'); + this.scout = new BaseSkyWarsMode(data, 'tourney_kit_basic_solo_scout'); + this.snowman = new BaseSkyWarsMode(data, 'tourney_kit_basic_solo_snowman'); + this.princess = new BaseSkyWarsMode(data, 'tourney_kit_basic_solo_princess'); + this.grenade = new BaseSkyWarsMode(data, 'tourney_kit_basic_solo_grenade'); + this.troll = new BaseSkyWarsMode(data, 'tourney_kit_basic_solo_troll'); + this.warlock = new BaseSkyWarsMode(data, 'tourney_kit_basic_solo_warlock'); + this.batguy = new BaseSkyWarsMode(data, 'tourney_kit_basic_solo_batguy'); } } diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKits.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKits.test.ts index f9cdd8e7e..32b7e3c33 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKits.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKits.test.ts @@ -1,4 +1,4 @@ -import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.js'; +import BaseSkyWarsMode from '../../SkyWarsMode/BaseSkyWarsMode.js'; import SkyWarsTeamsKits from './SkyWarsTeamsKits.js'; import SkyWarsTeamsKitsAttacking from './SkyWarsTeamsKitsAttacking.js'; import SkyWarsTeamsKitsDefending from './SkyWarsTeamsKitsDefending.js'; @@ -24,6 +24,6 @@ test('SkyWarsTeamsKits', () => { expect(data.attacking).toBeInstanceOf(SkyWarsTeamsKitsAttacking); expectTypeOf(data.attacking).toEqualTypeOf(); expect(data.enderChest).toBeDefined(); - expect(data.enderChest).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.enderChest).toEqualTypeOf(); + expect(data.enderChest).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.enderChest).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKits.ts b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKits.ts index 9ea0ff743..144647f33 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKits.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKits.ts @@ -1,4 +1,4 @@ -import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.ts'; +import BaseSkyWarsMode from '../../SkyWarsMode/BaseSkyWarsMode.ts'; import SkyWarsTeamsKitsAttacking from './SkyWarsTeamsKitsAttacking.ts'; import SkyWarsTeamsKitsDefending from './SkyWarsTeamsKitsDefending.ts'; import SkyWarsTeamsKitsMining from './SkyWarsTeamsKitsMining.ts'; @@ -9,13 +9,13 @@ class SkyWarsTeamsKits { defending: SkyWarsTeamsKitsDefending; supporting: SkyWarsTeamsKitsSupporting; attacking: SkyWarsTeamsKitsAttacking; - enderChest: SkyWarsMode; + enderChest: BaseSkyWarsMode; constructor(data: Record) { this.mining = new SkyWarsTeamsKitsMining(data); this.defending = new SkyWarsTeamsKitsDefending(data); this.supporting = new SkyWarsTeamsKitsSupporting(data); this.attacking = new SkyWarsTeamsKitsAttacking(data); - this.enderChest = new SkyWarsMode(data, 'kit_enderchest_team_enderchest'); + this.enderChest = new BaseSkyWarsMode(data, 'kit_enderchest_team_enderchest'); } } diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsAttacking.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsAttacking.test.ts index 1d81050b6..898631e9b 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsAttacking.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsAttacking.test.ts @@ -1,4 +1,4 @@ -import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.js'; +import BaseSkyWarsMode from '../../SkyWarsMode/BaseSkyWarsMode.js'; import SkyWarsTeamsKitsAttacking from './SkyWarsTeamsKitsAttacking.js'; import { expect, expectTypeOf, test } from 'vitest'; @@ -8,60 +8,60 @@ test('SkyWarsTeamsKitsAttacking', () => { expect(data).toBeInstanceOf(SkyWarsTeamsKitsAttacking); expectTypeOf(data).toEqualTypeOf(); expect(data.scout).toBeDefined(); - expect(data.scout).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.scout).toEqualTypeOf(); + expect(data.scout).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.scout).toEqualTypeOf(); expect(data.knight).toBeDefined(); - expect(data.knight).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.knight).toEqualTypeOf(); + expect(data.knight).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.knight).toEqualTypeOf(); expect(data.snowman).toBeDefined(); - expect(data.snowman).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.snowman).toEqualTypeOf(); + expect(data.snowman).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.snowman).toEqualTypeOf(); expect(data.hunter).toBeDefined(); - expect(data.hunter).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.hunter).toEqualTypeOf(); + expect(data.hunter).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.hunter).toEqualTypeOf(); expect(data.enderman).toBeDefined(); - expect(data.enderman).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.enderman).toEqualTypeOf(); + expect(data.enderman).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.enderman).toEqualTypeOf(); expect(data.energix).toBeDefined(); - expect(data.energix).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.energix).toEqualTypeOf(); + expect(data.energix).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.energix).toEqualTypeOf(); expect(data.slime).toBeDefined(); - expect(data.slime).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.slime).toEqualTypeOf(); + expect(data.slime).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.slime).toEqualTypeOf(); expect(data.salmon).toBeDefined(); - expect(data.salmon).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.salmon).toEqualTypeOf(); + expect(data.salmon).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.salmon).toEqualTypeOf(); expect(data.sloth).toBeDefined(); - expect(data.sloth).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.sloth).toEqualTypeOf(); + expect(data.sloth).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.sloth).toEqualTypeOf(); expect(data.pigRider).toBeDefined(); - expect(data.pigRider).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.pigRider).toEqualTypeOf(); + expect(data.pigRider).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.pigRider).toEqualTypeOf(); expect(data.grenade).toBeDefined(); - expect(data.grenade).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.grenade).toEqualTypeOf(); + expect(data.grenade).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.grenade).toEqualTypeOf(); expect(data.engineer).toBeDefined(); - expect(data.engineer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.engineer).toEqualTypeOf(); + expect(data.engineer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.engineer).toEqualTypeOf(); expect(data.magician).toBeDefined(); - expect(data.magician).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.magician).toEqualTypeOf(); + expect(data.magician).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.magician).toEqualTypeOf(); expect(data.default).toBeDefined(); - expect(data.default).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.default).toEqualTypeOf(); + expect(data.default).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.default).toEqualTypeOf(); expect(data.jester).toBeDefined(); - expect(data.jester).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.jester).toEqualTypeOf(); + expect(data.jester).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.jester).toEqualTypeOf(); expect(data.fisherman).toBeDefined(); - expect(data.fisherman).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.fisherman).toEqualTypeOf(); + expect(data.fisherman).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.fisherman).toEqualTypeOf(); expect(data.archeologist).toBeDefined(); - expect(data.archeologist).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.archeologist).toEqualTypeOf(); + expect(data.archeologist).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.archeologist).toEqualTypeOf(); expect(data.defaultTeams).toBeDefined(); - expect(data.defaultTeams).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.defaultTeams).toEqualTypeOf(); + expect(data.defaultTeams).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.defaultTeams).toEqualTypeOf(); expect(data.fallenAngel).toBeDefined(); - expect(data.fallenAngel).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.fallenAngel).toEqualTypeOf(); + expect(data.fallenAngel).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.fallenAngel).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsAttacking.ts b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsAttacking.ts index bad1570fc..f84d5b029 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsAttacking.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsAttacking.ts @@ -1,45 +1,45 @@ -import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.ts'; +import BaseSkyWarsMode from '../../SkyWarsMode/BaseSkyWarsMode.ts'; class SkyWarsTeamsKitsAttacking { - scout: SkyWarsMode; - knight: SkyWarsMode; - snowman: SkyWarsMode; - hunter: SkyWarsMode; - enderman: SkyWarsMode; - energix: SkyWarsMode; - slime: SkyWarsMode; - salmon: SkyWarsMode; - sloth: SkyWarsMode; - pigRider: SkyWarsMode; - grenade: SkyWarsMode; - engineer: SkyWarsMode; - magician: SkyWarsMode; - default: SkyWarsMode; - jester: SkyWarsMode; - fisherman: SkyWarsMode; - archeologist: SkyWarsMode; - defaultTeams: SkyWarsMode; - fallenAngel: SkyWarsMode; + scout: BaseSkyWarsMode; + knight: BaseSkyWarsMode; + snowman: BaseSkyWarsMode; + hunter: BaseSkyWarsMode; + enderman: BaseSkyWarsMode; + energix: BaseSkyWarsMode; + slime: BaseSkyWarsMode; + salmon: BaseSkyWarsMode; + sloth: BaseSkyWarsMode; + pigRider: BaseSkyWarsMode; + grenade: BaseSkyWarsMode; + engineer: BaseSkyWarsMode; + magician: BaseSkyWarsMode; + default: BaseSkyWarsMode; + jester: BaseSkyWarsMode; + fisherman: BaseSkyWarsMode; + archeologist: BaseSkyWarsMode; + defaultTeams: BaseSkyWarsMode; + fallenAngel: BaseSkyWarsMode; constructor(data: Record) { - this.scout = new SkyWarsMode(data, 'kit_attacking_team_scout'); - this.knight = new SkyWarsMode(data, 'kit_attacking_team_knight'); - this.snowman = new SkyWarsMode(data, 'kit_attacking_team_snowman'); - this.hunter = new SkyWarsMode(data, 'kit_attacking_team_hunter'); - this.enderman = new SkyWarsMode(data, 'kit_attacking_team_enderman'); - this.energix = new SkyWarsMode(data, 'kit_attacking_team_energix'); - this.slime = new SkyWarsMode(data, 'kit_attacking_team_slime'); - this.salmon = new SkyWarsMode(data, 'kit_attacking_team_salmon'); - this.sloth = new SkyWarsMode(data, 'kit_attacking_team_sloth'); - this.pigRider = new SkyWarsMode(data, 'kit_attacking_team_pig-rider'); - this.grenade = new SkyWarsMode(data, 'kit_attacking_team_grenade'); - this.engineer = new SkyWarsMode(data, 'kit_attacking_team_engineer'); - this.magician = new SkyWarsMode(data, 'kit_attacking_team_magician'); - this.default = new SkyWarsMode(data, 'kit_attacking_team_default'); - this.jester = new SkyWarsMode(data, 'kit_attacking_team_jester'); - this.fisherman = new SkyWarsMode(data, 'kit_attacking_team_fisherman'); - this.archeologist = new SkyWarsMode(data, 'kit_attacking_team_archeologist'); - this.defaultTeams = new SkyWarsMode(data, 'kit_attacking_teams_default'); - this.fallenAngel = new SkyWarsMode(data, 'kit_attacking_team_fallen-angel'); + this.scout = new BaseSkyWarsMode(data, 'kit_attacking_team_scout'); + this.knight = new BaseSkyWarsMode(data, 'kit_attacking_team_knight'); + this.snowman = new BaseSkyWarsMode(data, 'kit_attacking_team_snowman'); + this.hunter = new BaseSkyWarsMode(data, 'kit_attacking_team_hunter'); + this.enderman = new BaseSkyWarsMode(data, 'kit_attacking_team_enderman'); + this.energix = new BaseSkyWarsMode(data, 'kit_attacking_team_energix'); + this.slime = new BaseSkyWarsMode(data, 'kit_attacking_team_slime'); + this.salmon = new BaseSkyWarsMode(data, 'kit_attacking_team_salmon'); + this.sloth = new BaseSkyWarsMode(data, 'kit_attacking_team_sloth'); + this.pigRider = new BaseSkyWarsMode(data, 'kit_attacking_team_pig-rider'); + this.grenade = new BaseSkyWarsMode(data, 'kit_attacking_team_grenade'); + this.engineer = new BaseSkyWarsMode(data, 'kit_attacking_team_engineer'); + this.magician = new BaseSkyWarsMode(data, 'kit_attacking_team_magician'); + this.default = new BaseSkyWarsMode(data, 'kit_attacking_team_default'); + this.jester = new BaseSkyWarsMode(data, 'kit_attacking_team_jester'); + this.fisherman = new BaseSkyWarsMode(data, 'kit_attacking_team_fisherman'); + this.archeologist = new BaseSkyWarsMode(data, 'kit_attacking_team_archeologist'); + this.defaultTeams = new BaseSkyWarsMode(data, 'kit_attacking_teams_default'); + this.fallenAngel = new BaseSkyWarsMode(data, 'kit_attacking_team_fallen-angel'); } } diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsDefending.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsDefending.test.ts index 652874162..bf72180e8 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsDefending.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsDefending.test.ts @@ -1,4 +1,4 @@ -import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.js'; +import BaseSkyWarsMode from '../../SkyWarsMode/BaseSkyWarsMode.js'; import SkyWarsTeamsKitsDefending from './SkyWarsTeamsKitsDefending.js'; import { expect, expectTypeOf, test } from 'vitest'; @@ -8,30 +8,30 @@ test('SkyWarsTeamsKitsDefending', () => { expect(data).toBeInstanceOf(SkyWarsTeamsKitsDefending); expectTypeOf(data).toEqualTypeOf(); expect(data.armorer).toBeDefined(); - expect(data.armorer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.armorer).toEqualTypeOf(); + expect(data.armorer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.armorer).toEqualTypeOf(); expect(data.baseballPlayer).toBeDefined(); - expect(data.baseballPlayer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.baseballPlayer).toEqualTypeOf(); + expect(data.baseballPlayer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.baseballPlayer).toEqualTypeOf(); expect(data.guardian).toBeDefined(); - expect(data.guardian).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.guardian).toEqualTypeOf(); + expect(data.guardian).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.guardian).toEqualTypeOf(); expect(data.batguy).toBeDefined(); - expect(data.batguy).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.batguy).toEqualTypeOf(); + expect(data.batguy).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.batguy).toEqualTypeOf(); expect(data.frog).toBeDefined(); - expect(data.frog).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.frog).toEqualTypeOf(); + expect(data.frog).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.frog).toEqualTypeOf(); expect(data.disco).toBeDefined(); - expect(data.disco).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.disco).toEqualTypeOf(); + expect(data.disco).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.disco).toEqualTypeOf(); expect(data.farmer).toBeDefined(); - expect(data.farmer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.farmer).toEqualTypeOf(); + expect(data.farmer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.farmer).toEqualTypeOf(); expect(data.cactus).toBeDefined(); - expect(data.cactus).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.cactus).toEqualTypeOf(); + expect(data.cactus).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.cactus).toEqualTypeOf(); expect(data.golem).toBeDefined(); - expect(data.golem).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.golem).toEqualTypeOf(); + expect(data.golem).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.golem).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsDefending.ts b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsDefending.ts index b4841efdc..fd416c527 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsDefending.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsDefending.ts @@ -1,25 +1,25 @@ -import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.ts'; +import BaseSkyWarsMode from '../../SkyWarsMode/BaseSkyWarsMode.ts'; class SkyWarsTeamsKitsDefending { - armorer: SkyWarsMode; - baseballPlayer: SkyWarsMode; - guardian: SkyWarsMode; - batguy: SkyWarsMode; - frog: SkyWarsMode; - disco: SkyWarsMode; - farmer: SkyWarsMode; - cactus: SkyWarsMode; - golem: SkyWarsMode; + armorer: BaseSkyWarsMode; + baseballPlayer: BaseSkyWarsMode; + guardian: BaseSkyWarsMode; + batguy: BaseSkyWarsMode; + frog: BaseSkyWarsMode; + disco: BaseSkyWarsMode; + farmer: BaseSkyWarsMode; + cactus: BaseSkyWarsMode; + golem: BaseSkyWarsMode; constructor(data: Record) { - this.armorer = new SkyWarsMode(data, 'kit_defending_team_armorer'); - this.baseballPlayer = new SkyWarsMode(data, 'kit_defending_team_baseball-player'); - this.guardian = new SkyWarsMode(data, 'kit_defending_team_guardian'); - this.batguy = new SkyWarsMode(data, 'kit_defending_team_batguy'); - this.frog = new SkyWarsMode(data, 'kit_defending_team_frog'); - this.disco = new SkyWarsMode(data, 'kit_defending_team_disco'); - this.farmer = new SkyWarsMode(data, 'kit_defending_team_farmer'); - this.cactus = new SkyWarsMode(data, 'kit_defending_team_cactus'); - this.golem = new SkyWarsMode(data, 'kit_defending_team_golem'); + this.armorer = new BaseSkyWarsMode(data, 'kit_defending_team_armorer'); + this.baseballPlayer = new BaseSkyWarsMode(data, 'kit_defending_team_baseball-player'); + this.guardian = new BaseSkyWarsMode(data, 'kit_defending_team_guardian'); + this.batguy = new BaseSkyWarsMode(data, 'kit_defending_team_batguy'); + this.frog = new BaseSkyWarsMode(data, 'kit_defending_team_frog'); + this.disco = new BaseSkyWarsMode(data, 'kit_defending_team_disco'); + this.farmer = new BaseSkyWarsMode(data, 'kit_defending_team_farmer'); + this.cactus = new BaseSkyWarsMode(data, 'kit_defending_team_cactus'); + this.golem = new BaseSkyWarsMode(data, 'kit_defending_team_golem'); } } diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsMining.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsMining.test.ts index fdf8d8328..28814e45e 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsMining.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsMining.test.ts @@ -1,4 +1,4 @@ -import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.js'; +import BaseSkyWarsMode from '../../SkyWarsMode/BaseSkyWarsMode.js'; import SkyWarsTeamsKitsMining from './SkyWarsTeamsKitsMining.js'; import { expect, expectTypeOf, test } from 'vitest'; @@ -8,15 +8,15 @@ test('SkyWarsTeamsKitsMining', () => { expect(data).toBeInstanceOf(SkyWarsTeamsKitsMining); expectTypeOf(data).toEqualTypeOf(); expect(data.default).toBeDefined(); - expect(data.default).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.default).toEqualTypeOf(); + expect(data.default).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.default).toEqualTypeOf(); expect(data.cannoneer).toBeDefined(); - expect(data.cannoneer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.cannoneer).toEqualTypeOf(); + expect(data.cannoneer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.cannoneer).toEqualTypeOf(); expect(data.speleologist).toBeDefined(); - expect(data.speleologist).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.speleologist).toEqualTypeOf(); + expect(data.speleologist).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.speleologist).toEqualTypeOf(); expect(data.defaultTeams).toBeDefined(); - expect(data.defaultTeams).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.defaultTeams).toEqualTypeOf(); + expect(data.defaultTeams).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.defaultTeams).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsMining.ts b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsMining.ts index 7bb11c689..d081d5c96 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsMining.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsMining.ts @@ -1,15 +1,15 @@ -import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.ts'; +import BaseSkyWarsMode from '../../SkyWarsMode/BaseSkyWarsMode.ts'; class SkyWarsTeamsKitsMining { - default: SkyWarsMode; - cannoneer: SkyWarsMode; - speleologist: SkyWarsMode; - defaultTeams: SkyWarsMode; + default: BaseSkyWarsMode; + cannoneer: BaseSkyWarsMode; + speleologist: BaseSkyWarsMode; + defaultTeams: BaseSkyWarsMode; constructor(data: Record) { - this.default = new SkyWarsMode(data, 'kit_mining_team_default'); - this.cannoneer = new SkyWarsMode(data, 'kit_mining_team_cannoneer'); - this.speleologist = new SkyWarsMode(data, 'kit_mining_team_speleologist'); - this.defaultTeams = new SkyWarsMode(data, 'kit_mining_teams_default'); + this.default = new BaseSkyWarsMode(data, 'kit_mining_team_default'); + this.cannoneer = new BaseSkyWarsMode(data, 'kit_mining_team_cannoneer'); + this.speleologist = new BaseSkyWarsMode(data, 'kit_mining_team_speleologist'); + this.defaultTeams = new BaseSkyWarsMode(data, 'kit_mining_teams_default'); } } diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsSupporting.test.ts b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsSupporting.test.ts index e68e792a0..610d97c2c 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsSupporting.test.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsSupporting.test.ts @@ -1,4 +1,4 @@ -import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.js'; +import BaseSkyWarsMode from '../../SkyWarsMode/BaseSkyWarsMode.js'; import SkyWarsTeamsKitsSupporting from './SkyWarsTeamsKitsSupporting.js'; import { expect, expectTypeOf, test } from 'vitest'; @@ -8,36 +8,36 @@ test('SkyWarsTeamsKitsSupporting', () => { expect(data).toBeInstanceOf(SkyWarsTeamsKitsSupporting); expectTypeOf(data).toEqualTypeOf(); expect(data.healer).toBeDefined(); - expect(data.healer).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.healer).toEqualTypeOf(); + expect(data.healer).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.healer).toEqualTypeOf(); expect(data.ecologist).toBeDefined(); - expect(data.ecologist).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.ecologist).toEqualTypeOf(); + expect(data.ecologist).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.ecologist).toEqualTypeOf(); expect(data.armorsmith).toBeDefined(); - expect(data.armorsmith).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.armorsmith).toEqualTypeOf(); + expect(data.armorsmith).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.armorsmith).toEqualTypeOf(); expect(data.rookie).toBeDefined(); - expect(data.rookie).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.rookie).toEqualTypeOf(); + expect(data.rookie).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.rookie).toEqualTypeOf(); expect(data.enchanter).toBeDefined(); - expect(data.enchanter).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.enchanter).toEqualTypeOf(); + expect(data.enchanter).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.enchanter).toEqualTypeOf(); expect(data.pyro).toBeDefined(); - expect(data.pyro).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.pyro).toEqualTypeOf(); + expect(data.pyro).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.pyro).toEqualTypeOf(); expect(data.pharaoh).toBeDefined(); - expect(data.pharaoh).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.pharaoh).toEqualTypeOf(); + expect(data.pharaoh).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.pharaoh).toEqualTypeOf(); expect(data.warlock).toBeDefined(); - expect(data.warlock).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.warlock).toEqualTypeOf(); + expect(data.warlock).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.warlock).toEqualTypeOf(); expect(data.zookeeper).toBeDefined(); - expect(data.zookeeper).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.zookeeper).toEqualTypeOf(); + expect(data.zookeeper).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.zookeeper).toEqualTypeOf(); expect(data.princess).toBeDefined(); - expect(data.princess).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.princess).toEqualTypeOf(); + expect(data.princess).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.princess).toEqualTypeOf(); expect(data.troll).toBeDefined(); - expect(data.troll).toBeInstanceOf(SkyWarsMode); - expectTypeOf(data.troll).toEqualTypeOf(); + expect(data.troll).toBeInstanceOf(BaseSkyWarsMode); + expectTypeOf(data.troll).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsSupporting.ts b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsSupporting.ts index df8214657..0f9413bc8 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsSupporting.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsTeams/SkyWarsTeamsKits/SkyWarsTeamsKitsSupporting.ts @@ -1,29 +1,29 @@ -import SkyWarsMode from '../../SkyWarsMode/SkyWarsMode.ts'; +import BaseSkyWarsMode from '../../SkyWarsMode/BaseSkyWarsMode.ts'; class SkyWarsTeamsKitsSupporting { - healer: SkyWarsMode; - ecologist: SkyWarsMode; - armorsmith: SkyWarsMode; - rookie: SkyWarsMode; - enchanter: SkyWarsMode; - pyro: SkyWarsMode; - pharaoh: SkyWarsMode; - warlock: SkyWarsMode; - zookeeper: SkyWarsMode; - princess: SkyWarsMode; - troll: SkyWarsMode; + healer: BaseSkyWarsMode; + ecologist: BaseSkyWarsMode; + armorsmith: BaseSkyWarsMode; + rookie: BaseSkyWarsMode; + enchanter: BaseSkyWarsMode; + pyro: BaseSkyWarsMode; + pharaoh: BaseSkyWarsMode; + warlock: BaseSkyWarsMode; + zookeeper: BaseSkyWarsMode; + princess: BaseSkyWarsMode; + troll: BaseSkyWarsMode; constructor(data: Record) { - this.healer = new SkyWarsMode(data, 'kit_supporting_team_healer'); - this.ecologist = new SkyWarsMode(data, 'kit_supporting_team_ecologist'); - this.armorsmith = new SkyWarsMode(data, 'kit_supporting_team_armorsmith'); - this.rookie = new SkyWarsMode(data, 'kit_supporting_team_rookie'); - this.enchanter = new SkyWarsMode(data, 'kit_supporting_team_enchanter'); - this.pyro = new SkyWarsMode(data, 'kit_supporting_team_pyro'); - this.pharaoh = new SkyWarsMode(data, 'kit_supporting_team_pharaoh'); - this.warlock = new SkyWarsMode(data, 'kit_supporting_team_warlock'); - this.zookeeper = new SkyWarsMode(data, 'kit_supporting_team_zookeeper'); - this.princess = new SkyWarsMode(data, 'kit_supporting_team_princess'); - this.troll = new SkyWarsMode(data, 'kit_supporting_team_troll'); + this.healer = new BaseSkyWarsMode(data, 'kit_supporting_team_healer'); + this.ecologist = new BaseSkyWarsMode(data, 'kit_supporting_team_ecologist'); + this.armorsmith = new BaseSkyWarsMode(data, 'kit_supporting_team_armorsmith'); + this.rookie = new BaseSkyWarsMode(data, 'kit_supporting_team_rookie'); + this.enchanter = new BaseSkyWarsMode(data, 'kit_supporting_team_enchanter'); + this.pyro = new BaseSkyWarsMode(data, 'kit_supporting_team_pyro'); + this.pharaoh = new BaseSkyWarsMode(data, 'kit_supporting_team_pharaoh'); + this.warlock = new BaseSkyWarsMode(data, 'kit_supporting_team_warlock'); + this.zookeeper = new BaseSkyWarsMode(data, 'kit_supporting_team_zookeeper'); + this.princess = new BaseSkyWarsMode(data, 'kit_supporting_team_princess'); + this.troll = new BaseSkyWarsMode(data, 'kit_supporting_team_troll'); } } diff --git a/src/index.ts b/src/index.ts index 1e1ec6f3a..917cbb46b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -34,6 +34,7 @@ import ArenaBrawl from './Structures/MiniGames/ArenaBrawl/ArenaBrawl.js'; import ArenaBrawlMode from './Structures/MiniGames/ArenaBrawl/ArenaBrawlMode.js'; import BaseAchievement from './Structures/Static/Achievements/BaseAchievement.js'; import BaseKillDeathsType from './Structures/MiniGames/Shared/BaseKillDeathsType.js'; +import BaseSkyWarsMode from './Structures/MiniGames/SkyWars/SkyWarsMode/BaseSkyWarsMode.js'; import BedWars from './Structures/MiniGames/BedWars/BedWars.js'; import BedWarsBeds from './Structures/MiniGames/BedWars/BedWarsBeds.js'; import BedWarsBoxes from './Structures/MiniGames/BedWars/BedWarsBoxes.js'; @@ -416,6 +417,7 @@ export { ArenaBrawlMode, BaseAchievement, BaseKillDeathsType, + BaseSkyWarsMode, BedWars, BedWarsBeds, BedWarsBoxes, @@ -799,6 +801,7 @@ export default { ArenaBrawlMode, BaseAchievement, BaseKillDeathsType, + BaseSkyWarsMode, BedWars, BedWarsBeds, BedWarsBoxes, From 82e39bc4937c89d8bfa132554f33015b63ad328e Mon Sep 17 00:00:00 2001 From: Jacob Date: Sun, 21 Dec 2025 14:56:14 +0800 Subject: [PATCH 099/124] Release 12.0.0-20 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bdf13a8e9..304a5d088 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hypixel-api-reborn", - "version": "12.0.0-19", + "version": "12.0.0-20", "description": "Feature-rich Hypixel API wrapper for Node.js", "main": "dist/index.js", "types": "dist/index.d.ts", From bc7ad1eb16e82142da8aa56378ca5b1dc394aea7 Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 7 Jan 2026 20:15:07 +0800 Subject: [PATCH 100/124] fix(Player): Not Parsing YouTube Rank Co-authored-by: mic0 <59290502+mic0ishere@users.noreply.github.com> --- src/Structures/Player/Player.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Structures/Player/Player.ts b/src/Structures/Player/Player.ts index fefb69812..776f5c061 100644 --- a/src/Structures/Player/Player.ts +++ b/src/Structures/Player/Player.ts @@ -111,6 +111,8 @@ class Player { return 'Admin'; case 'GAME_MASTER': return 'Game Master'; + case 'YOUTUBER': + return 'YouTube'; default: return null; } From 77ec2bb7b1334aa52d51436426a15547dacd6e09 Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 7 Jan 2026 20:16:21 +0800 Subject: [PATCH 101/124] fix(BedWarsTwoFour): Using `four_four` and not `two_four` Co-authored-by: mic0 <59290502+mic0ishere@users.noreply.github.com> --- src/Structures/MiniGames/BedWars/BedWarsTwoFour.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Structures/MiniGames/BedWars/BedWarsTwoFour.ts b/src/Structures/MiniGames/BedWars/BedWarsTwoFour.ts index 14ef2f8f2..4009854e9 100644 --- a/src/Structures/MiniGames/BedWars/BedWarsTwoFour.ts +++ b/src/Structures/MiniGames/BedWars/BedWarsTwoFour.ts @@ -3,7 +3,7 @@ import BedWarsMode from './BedWarsMode.js'; class BedWarsTwoFour extends BedWarsMode { tourney: BedWarsMode; constructor(data: Record) { - super(data, 'four_four'); + super(data, 'two_four'); this.tourney = new BedWarsMode(data, 'tourney_bedwars_two_four_0'); } } From 80bae9828646f6e18af8b48092d209e24abdc216 Mon Sep 17 00:00:00 2001 From: Jack <59290502+mic0ishere@users.noreply.github.com> Date: Thu, 8 Jan 2026 14:57:12 +0100 Subject: [PATCH 102/124] feat(SkyWars): Ranked Gamemode (#693) --- src/Structures/MiniGames/SkyWars/SkyWars.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Structures/MiniGames/SkyWars/SkyWars.ts b/src/Structures/MiniGames/SkyWars/SkyWars.ts index 64a819722..b6ce77f27 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWars.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWars.ts @@ -66,6 +66,7 @@ class SkyWars extends SkyWarsMode { teams: SkyWarsTeams; mega: SkyWarsMega; mini: SkyWarsMini; + ranked: SkyWarsMode; constructor(data: Record) { super(data); this.activeKillEffect = data?.active_killeffect || 'UNKNOWN'; @@ -124,6 +125,7 @@ class SkyWars extends SkyWarsMode { this.teams = new SkyWarsTeams(data); this.mega = new SkyWarsMega(data); this.mini = new SkyWarsMini(data); + this.ranked = new SkyWarsMode(data, 'ranked'); } // Credit: https://github.com/Statsify/statsify/blob/main/packages/schemas/src/player/gamemodes/skywars/util.ts#L27-L38 From eaec7a75acda6c9816d07d385df2c8079c0821cb Mon Sep 17 00:00:00 2001 From: Jack <59290502+mic0ishere@users.noreply.github.com> Date: Thu, 8 Jan 2026 14:59:54 +0100 Subject: [PATCH 103/124] feat(BedWars): Castle mode (#692) --- src/Structures/MiniGames/BedWars/BedWars.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Structures/MiniGames/BedWars/BedWars.ts b/src/Structures/MiniGames/BedWars/BedWars.ts index a312687d5..994d11dc9 100644 --- a/src/Structures/MiniGames/BedWars/BedWars.ts +++ b/src/Structures/MiniGames/BedWars/BedWars.ts @@ -71,6 +71,7 @@ class BedWars extends BedWarsMode { fourThree: BedWarsFourThree; fourFour: BedWarsFourFour; twoFour: BedWarsTwoFour; + castle: BedWarsMode; constructor(data: Record) { super(data); this.experience = data?.Experience || 0; @@ -113,6 +114,7 @@ class BedWars extends BedWarsMode { this.fourThree = new BedWarsFourThree(data || {}); this.fourFour = new BedWarsFourFour(data || {}); this.twoFour = new BedWarsTwoFour(data || {}); + this.castle = new BedWarsMode(data, 'castle'); } static getPrestige(level: number): BedWarsPrestige { From 0114a619933acc0af6d95fc8729fd19d3725d28f Mon Sep 17 00:00:00 2001 From: Jacob Date: Mon, 12 Jan 2026 20:21:36 +0800 Subject: [PATCH 104/124] fix(SkyWarsKillsDeathsType): Ratio not being created --- src/Structures/MiniGames/SkyWars/SkyWarsKillsDeathsType.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsKillsDeathsType.ts b/src/Structures/MiniGames/SkyWars/SkyWarsKillsDeathsType.ts index 5bb678941..0270e0c9f 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsKillsDeathsType.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsKillsDeathsType.ts @@ -1,6 +1,7 @@ import BaseKillsDeathsType from '../Shared/BaseKillDeathsType.ts'; import { ParseModeAfter, ParseModeBefore } from '../../../Utils/ParseMode.ts'; import type { SkyWarsKillType, SkyWarsKitId, SkyWarsModeId } from '../../../Types/Player.ts'; +import Divide from '../../../Utils/Divide.ts'; class SkyWarsKillsDeathsType extends BaseKillsDeathsType { constructor(data: Record, type?: SkyWarsKillType, mode?: SkyWarsModeId | SkyWarsKitId) { @@ -9,6 +10,7 @@ class SkyWarsKillsDeathsType extends BaseKillsDeathsType { super(data); this.kills = data?.[`${type}kills${mode}`] || 0; this.deaths = data?.[`${type}kills${mode}`] || 0; + this.ratio = Divide(this.kills, this.deaths); } } From 585e70547e5999bee2969cb24985c0bf418b1b5a Mon Sep 17 00:00:00 2001 From: Jacob Date: Mon, 12 Jan 2026 20:21:55 +0800 Subject: [PATCH 105/124] fix(BedWarsKillsDeathsType): Ratio not being created --- .../BedWars/BedWarsKillsDeaths/BedWarsKillsDeathsType.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeathsType.ts b/src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeathsType.ts index 50749ea9b..e92cc675c 100644 --- a/src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeathsType.ts +++ b/src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeathsType.ts @@ -1,6 +1,7 @@ import BaseKillsDeathsType from '../../Shared/BaseKillDeathsType.ts'; import { ParseModeBefore } from '../../../../Utils/ParseMode.ts'; import type { BedWarsFinalType, BedWarsModeId } from '../../../../Types/Player.js'; +import Divide from '../../../../Utils/Divide.ts'; class BedWarsKillsDeathsType extends BaseKillsDeathsType { constructor(data: Record, type?: BedWarsFinalType, mode?: BedWarsModeId, finals: boolean = false) { @@ -9,6 +10,7 @@ class BedWarsKillsDeathsType extends BaseKillsDeathsType { super(data); this.kills = data?.[`${mode}${type}${finals ? 'final_' : ''}kills_bedwars`] || 0; this.deaths = data?.[`${mode}${type}${finals ? 'final_' : ''}deaths_bedwars`] || 0; + this.ratio = Divide(this.kills, this.deaths); } } From bfd15b3a347fac2859a409349740b43b1c380fac Mon Sep 17 00:00:00 2001 From: Jacob Date: Mon, 12 Jan 2026 20:29:15 +0800 Subject: [PATCH 106/124] fix(ParseMode) Co-authored-by: Jack <59290502+mic0ishere@users.noreply.github.com> --- src/Utils/ParseMode.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Utils/ParseMode.ts b/src/Utils/ParseMode.ts index 6723d4d55..0bd5759fb 100644 --- a/src/Utils/ParseMode.ts +++ b/src/Utils/ParseMode.ts @@ -1,11 +1,11 @@ export function ParseModeBefore(mode?: string): string { - return mode && mode.trim() !== '' ? `${mode.replace(/_$/, '')}_` : ''; + return mode?.trim() ? `${mode.trim().replace(/_+$/, '')}_` : ''; } export function ParseModeAfter(mode?: string): string { - return mode && mode.trim() !== '' ? `_${mode.replace(/_$/, '')}` : ''; + return mode?.trim() ? `_${mode.trim().replace(/^_+/, '')}` : ''; } export function ParseModeBeforeAfter(mode?: string): string { - return mode && mode.trim() !== '' ? `_${mode.replace(/_$/, '')}_` : ''; + return mode?.trim() ? `_${mode.trim().replace(/^_+|_+$/g, '')}_` : ''; } From e0e900675db1d8edb6f005d4f909ed2eddb2f4d1 Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 14 Jan 2026 01:39:26 +0800 Subject: [PATCH 107/124] fix: eslint --- .../BedWars/BedWarsKillsDeaths/BedWarsKillsDeathsType.ts | 2 +- src/Structures/MiniGames/SkyWars/SkyWarsKillsDeathsType.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeathsType.ts b/src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeathsType.ts index e92cc675c..de5681ade 100644 --- a/src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeathsType.ts +++ b/src/Structures/MiniGames/BedWars/BedWarsKillsDeaths/BedWarsKillsDeathsType.ts @@ -1,7 +1,7 @@ import BaseKillsDeathsType from '../../Shared/BaseKillDeathsType.ts'; +import Divide from '../../../../Utils/Divide.ts'; import { ParseModeBefore } from '../../../../Utils/ParseMode.ts'; import type { BedWarsFinalType, BedWarsModeId } from '../../../../Types/Player.js'; -import Divide from '../../../../Utils/Divide.ts'; class BedWarsKillsDeathsType extends BaseKillsDeathsType { constructor(data: Record, type?: BedWarsFinalType, mode?: BedWarsModeId, finals: boolean = false) { diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsKillsDeathsType.ts b/src/Structures/MiniGames/SkyWars/SkyWarsKillsDeathsType.ts index 0270e0c9f..975fadb71 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsKillsDeathsType.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsKillsDeathsType.ts @@ -1,7 +1,7 @@ import BaseKillsDeathsType from '../Shared/BaseKillDeathsType.ts'; +import Divide from '../../../Utils/Divide.ts'; import { ParseModeAfter, ParseModeBefore } from '../../../Utils/ParseMode.ts'; import type { SkyWarsKillType, SkyWarsKitId, SkyWarsModeId } from '../../../Types/Player.ts'; -import Divide from '../../../Utils/Divide.ts'; class SkyWarsKillsDeathsType extends BaseKillsDeathsType { constructor(data: Record, type?: SkyWarsKillType, mode?: SkyWarsModeId | SkyWarsKitId) { From dc9d3bfb7821e102be1401afdb2c0b03860502fd Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 14 Jan 2026 01:40:21 +0800 Subject: [PATCH 108/124] Release 12.0.0-21 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 304a5d088..002a3a6a0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hypixel-api-reborn", - "version": "12.0.0-20", + "version": "12.0.0-21", "description": "Feature-rich Hypixel API wrapper for Node.js", "main": "dist/index.js", "types": "dist/index.d.ts", From 5076bcfb35faefb359b4686f0ee8ef2f8e60f1b7 Mon Sep 17 00:00:00 2001 From: Jacob Date: Thu, 15 Jan 2026 13:42:16 +0800 Subject: [PATCH 109/124] fix(SkyWarsKillsDeathsType): deaths grabbing kills data --- src/Structures/MiniGames/SkyWars/SkyWarsKillsDeathsType.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Structures/MiniGames/SkyWars/SkyWarsKillsDeathsType.ts b/src/Structures/MiniGames/SkyWars/SkyWarsKillsDeathsType.ts index 975fadb71..40ef6cf2d 100644 --- a/src/Structures/MiniGames/SkyWars/SkyWarsKillsDeathsType.ts +++ b/src/Structures/MiniGames/SkyWars/SkyWarsKillsDeathsType.ts @@ -9,7 +9,7 @@ class SkyWarsKillsDeathsType extends BaseKillsDeathsType { mode = ParseModeAfter(mode) as SkyWarsModeId; super(data); this.kills = data?.[`${type}kills${mode}`] || 0; - this.deaths = data?.[`${type}kills${mode}`] || 0; + this.deaths = data?.[`${type}deaths${mode}`] || 0; this.ratio = Divide(this.kills, this.deaths); } } From 77db3c0495f8d620a9eca773c587ed314cf80f0e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 15 Jan 2026 05:46:23 +0000 Subject: [PATCH 110/124] chore(deps): Update all non-major dependencies (#685) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docs/pnpm-lock.yaml | 256 +++++++++--------- docs/pnpm-workspace.yaml | 6 +- package.json | 16 +- pnpm-lock.yaml | 547 +++++++++++++++++++++------------------ 4 files changed, 434 insertions(+), 391 deletions(-) diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index 0a79829c9..9719b1b12 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -10,17 +10,17 @@ catalogs: specifier: 12.0.0-15 version: 12.0.0-15 prettier: - specifier: ^3.6.2 - version: 3.6.2 + specifier: ^3.8.0 + version: 3.8.0 tsx: - specifier: ^4.20.6 - version: 4.20.6 + specifier: ^4.21.0 + version: 4.21.0 typescript: specifier: ^5.9.3 version: 5.9.3 yaml: - specifier: ^2.8.1 - version: 2.8.1 + specifier: ^2.8.2 + version: 2.8.2 importers: @@ -28,16 +28,16 @@ importers: devDependencies: prettier: specifier: 'catalog:' - version: 3.6.2 + version: 3.8.0 tsx: specifier: 'catalog:' - version: 4.20.6 + version: 4.21.0 typescript: specifier: 'catalog:' version: 5.9.3 yaml: specifier: 'catalog:' - version: 2.8.1 + version: 2.8.2 JavaScript/SettingUpClient/Code: dependencies: @@ -59,7 +59,7 @@ importers: devDependencies: tsx: specifier: 'catalog:' - version: 4.20.6 + version: 4.21.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -72,165 +72,165 @@ importers: devDependencies: tsx: specifier: 'catalog:' - version: 4.20.6 + version: 4.21.0 typescript: specifier: 'catalog:' version: 5.9.3 packages: - '@esbuild/aix-ppc64@0.25.11': - resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.11': - resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.11': - resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.11': - resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.11': - resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.11': - resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} + '@esbuild/darwin-x64@0.27.2': + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.11': - resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.11': - resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} + '@esbuild/freebsd-x64@0.27.2': + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.11': - resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.11': - resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} + '@esbuild/linux-arm@0.27.2': + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.11': - resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.11': - resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} + '@esbuild/linux-loong64@0.27.2': + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.11': - resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} + '@esbuild/linux-mips64el@0.27.2': + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.11': - resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} + '@esbuild/linux-ppc64@0.27.2': + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.11': - resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.11': - resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.11': - resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} + '@esbuild/linux-x64@0.27.2': + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.11': - resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.11': - resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} + '@esbuild/netbsd-x64@0.27.2': + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.11': - resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.11': - resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.11': - resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} + '@esbuild/openharmony-arm64@0.27.2': + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.11': - resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} + '@esbuild/sunos-x64@0.27.2': + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.11': - resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} + '@esbuild/win32-arm64@0.27.2': + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.11': - resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.11': - resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} + '@esbuild/win32-x64@0.27.2': + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -255,8 +255,8 @@ packages: entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - esbuild@0.25.11: - resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} engines: {node: '>=18'} hasBin: true @@ -302,8 +302,8 @@ packages: resolution: {integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==} engines: {node: '>= 8.0.0'} - prettier@3.6.2: - resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + prettier@3.8.0: + resolution: {integrity: sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA==} engines: {node: '>=14'} hasBin: true @@ -345,8 +345,8 @@ packages: string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - tsx@4.20.6: - resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==} + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} engines: {node: '>=18.0.0'} hasBin: true @@ -366,89 +366,89 @@ packages: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} - yaml@2.8.1: - resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} engines: {node: '>= 14.6'} hasBin: true snapshots: - '@esbuild/aix-ppc64@0.25.11': + '@esbuild/aix-ppc64@0.27.2': optional: true - '@esbuild/android-arm64@0.25.11': + '@esbuild/android-arm64@0.27.2': optional: true - '@esbuild/android-arm@0.25.11': + '@esbuild/android-arm@0.27.2': optional: true - '@esbuild/android-x64@0.25.11': + '@esbuild/android-x64@0.27.2': optional: true - '@esbuild/darwin-arm64@0.25.11': + '@esbuild/darwin-arm64@0.27.2': optional: true - '@esbuild/darwin-x64@0.25.11': + '@esbuild/darwin-x64@0.27.2': optional: true - '@esbuild/freebsd-arm64@0.25.11': + '@esbuild/freebsd-arm64@0.27.2': optional: true - '@esbuild/freebsd-x64@0.25.11': + '@esbuild/freebsd-x64@0.27.2': optional: true - '@esbuild/linux-arm64@0.25.11': + '@esbuild/linux-arm64@0.27.2': optional: true - '@esbuild/linux-arm@0.25.11': + '@esbuild/linux-arm@0.27.2': optional: true - '@esbuild/linux-ia32@0.25.11': + '@esbuild/linux-ia32@0.27.2': optional: true - '@esbuild/linux-loong64@0.25.11': + '@esbuild/linux-loong64@0.27.2': optional: true - '@esbuild/linux-mips64el@0.25.11': + '@esbuild/linux-mips64el@0.27.2': optional: true - '@esbuild/linux-ppc64@0.25.11': + '@esbuild/linux-ppc64@0.27.2': optional: true - '@esbuild/linux-riscv64@0.25.11': + '@esbuild/linux-riscv64@0.27.2': optional: true - '@esbuild/linux-s390x@0.25.11': + '@esbuild/linux-s390x@0.27.2': optional: true - '@esbuild/linux-x64@0.25.11': + '@esbuild/linux-x64@0.27.2': optional: true - '@esbuild/netbsd-arm64@0.25.11': + '@esbuild/netbsd-arm64@0.27.2': optional: true - '@esbuild/netbsd-x64@0.25.11': + '@esbuild/netbsd-x64@0.27.2': optional: true - '@esbuild/openbsd-arm64@0.25.11': + '@esbuild/openbsd-arm64@0.27.2': optional: true - '@esbuild/openbsd-x64@0.25.11': + '@esbuild/openbsd-x64@0.27.2': optional: true - '@esbuild/openharmony-arm64@0.25.11': + '@esbuild/openharmony-arm64@0.27.2': optional: true - '@esbuild/sunos-x64@0.25.11': + '@esbuild/sunos-x64@0.27.2': optional: true - '@esbuild/win32-arm64@0.25.11': + '@esbuild/win32-arm64@0.27.2': optional: true - '@esbuild/win32-ia32@0.25.11': + '@esbuild/win32-ia32@0.27.2': optional: true - '@esbuild/win32-x64@0.25.11': + '@esbuild/win32-x64@0.27.2': optional: true abort-controller@3.0.0: @@ -473,34 +473,34 @@ snapshots: entities@2.2.0: {} - esbuild@0.25.11: + esbuild@0.27.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.11 - '@esbuild/android-arm': 0.25.11 - '@esbuild/android-arm64': 0.25.11 - '@esbuild/android-x64': 0.25.11 - '@esbuild/darwin-arm64': 0.25.11 - '@esbuild/darwin-x64': 0.25.11 - '@esbuild/freebsd-arm64': 0.25.11 - '@esbuild/freebsd-x64': 0.25.11 - '@esbuild/linux-arm': 0.25.11 - '@esbuild/linux-arm64': 0.25.11 - '@esbuild/linux-ia32': 0.25.11 - '@esbuild/linux-loong64': 0.25.11 - '@esbuild/linux-mips64el': 0.25.11 - '@esbuild/linux-ppc64': 0.25.11 - '@esbuild/linux-riscv64': 0.25.11 - '@esbuild/linux-s390x': 0.25.11 - '@esbuild/linux-x64': 0.25.11 - '@esbuild/netbsd-arm64': 0.25.11 - '@esbuild/netbsd-x64': 0.25.11 - '@esbuild/openbsd-arm64': 0.25.11 - '@esbuild/openbsd-x64': 0.25.11 - '@esbuild/openharmony-arm64': 0.25.11 - '@esbuild/sunos-x64': 0.25.11 - '@esbuild/win32-arm64': 0.25.11 - '@esbuild/win32-ia32': 0.25.11 - '@esbuild/win32-x64': 0.25.11 + '@esbuild/aix-ppc64': 0.27.2 + '@esbuild/android-arm': 0.27.2 + '@esbuild/android-arm64': 0.27.2 + '@esbuild/android-x64': 0.27.2 + '@esbuild/darwin-arm64': 0.27.2 + '@esbuild/darwin-x64': 0.27.2 + '@esbuild/freebsd-arm64': 0.27.2 + '@esbuild/freebsd-x64': 0.27.2 + '@esbuild/linux-arm': 0.27.2 + '@esbuild/linux-arm64': 0.27.2 + '@esbuild/linux-ia32': 0.27.2 + '@esbuild/linux-loong64': 0.27.2 + '@esbuild/linux-mips64el': 0.27.2 + '@esbuild/linux-ppc64': 0.27.2 + '@esbuild/linux-riscv64': 0.27.2 + '@esbuild/linux-s390x': 0.27.2 + '@esbuild/linux-x64': 0.27.2 + '@esbuild/netbsd-arm64': 0.27.2 + '@esbuild/netbsd-x64': 0.27.2 + '@esbuild/openbsd-arm64': 0.27.2 + '@esbuild/openbsd-x64': 0.27.2 + '@esbuild/openharmony-arm64': 0.27.2 + '@esbuild/sunos-x64': 0.27.2 + '@esbuild/win32-arm64': 0.27.2 + '@esbuild/win32-ia32': 0.27.2 + '@esbuild/win32-x64': 0.27.2 event-target-shim@5.0.1: {} @@ -536,7 +536,7 @@ snapshots: dependencies: clone: 2.1.2 - prettier@3.6.2: {} + prettier@3.8.0: {} prismarine-nbt@2.7.0: dependencies: @@ -579,9 +579,9 @@ snapshots: dependencies: safe-buffer: 5.2.1 - tsx@4.20.6: + tsx@4.21.0: dependencies: - esbuild: 0.25.11 + esbuild: 0.27.2 get-tsconfig: 4.12.0 optionalDependencies: fsevents: 2.3.3 @@ -599,4 +599,4 @@ snapshots: xmlbuilder@11.0.1: {} - yaml@2.8.1: {} + yaml@2.8.2: {} diff --git a/docs/pnpm-workspace.yaml b/docs/pnpm-workspace.yaml index 4cbb18986..84a2682a5 100644 --- a/docs/pnpm-workspace.yaml +++ b/docs/pnpm-workspace.yaml @@ -4,9 +4,9 @@ packages: - ./JavaScript/SettingUpClient/Code - ./JavaScript/SkyHelperNetworth/Code catalog: - tsx: ^4.20.6 + tsx: ^4.21.0 typescript: ^5.9.3 - prettier: ^3.6.2 + prettier: ^3.8.0 hypixel-api-reborn: 12.0.0-15 - yaml: ^2.8.1 + yaml: ^2.8.2 skyhelper-networth: ^2.5.1 diff --git a/package.json b/package.json index 002a3a6a0..0bb7c3602 100644 --- a/package.json +++ b/package.json @@ -37,9 +37,9 @@ "packageManager": "pnpm@9.7.1", "author": "Kathund", "dependencies": { - "minecraft-data": "^3.100.0", + "minecraft-data": "^3.102.3", "node-cache": "^5.1.2", - "prismarine-nbt": "^2.7.0", + "prismarine-nbt": "^2.8.0", "rss-parser": "^3.13.0" }, "license": "MIT", @@ -53,26 +53,26 @@ "publisher": "Kathund", "devDependencies": { "@8hobbies/typedoc-plugin-404": "^3.2.1", - "@eslint/js": "^9.39.1", + "@eslint/js": "^9.39.2", "@j4cobi/eslint-plugin-sort-imports": "^1.0.2", - "@stylistic/eslint-plugin": "^5.6.0", + "@stylistic/eslint-plugin": "^5.7.0", "@types/eslint": "^9.6.1", "@types/node": "^20.19.5", "@types/xml2js": "^0.4.14", "@vitest/coverage-v8": "^3.2.4", "@vitest/ui": "^3.2.4", "dotenv": "^17.2.3", - "eslint": "^9.39.1", + "eslint": "^9.39.2", "eslint-config-prettier": "^10.1.8", "eslint-plugin-import": "^2.32.0", "globals": "^16.5.0", - "prettier": "^3.6.2", - "tsx": "^4.20.6", + "prettier": "^3.8.0", + "tsx": "^4.21.0", "typedoc": "^0.27.9", "typedoc-material-theme": "^1.4.1", "typedoc-plugin-rename-defaults": "^0.7.3", "typescript": "^5.9.3", - "typescript-eslint": "^8.47.0", + "typescript-eslint": "^8.53.0", "vitest": "^3.2.4", "xml2js": "^0.6.2" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f719d3514..ef22b1a3c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,14 +9,14 @@ importers: .: dependencies: minecraft-data: - specifier: ^3.100.0 - version: 3.100.0 + specifier: ^3.102.3 + version: 3.102.3 node-cache: specifier: ^5.1.2 version: 5.1.2 prismarine-nbt: - specifier: ^2.7.0 - version: 2.7.0 + specifier: ^2.8.0 + version: 2.8.0 rss-parser: specifier: ^3.13.0 version: 3.13.0 @@ -25,14 +25,14 @@ importers: specifier: ^3.2.1 version: 3.2.1(typedoc@0.27.9(typescript@5.9.3)) '@eslint/js': - specifier: ^9.39.1 - version: 9.39.1 + specifier: ^9.39.2 + version: 9.39.2 '@j4cobi/eslint-plugin-sort-imports': specifier: ^1.0.2 - version: 1.0.2(eslint@9.39.1)(typescript@5.9.3) + version: 1.0.2(eslint@9.39.2)(typescript@5.9.3) '@stylistic/eslint-plugin': - specifier: ^5.6.0 - version: 5.6.0(eslint@9.39.1) + specifier: ^5.7.0 + version: 5.7.0(eslint@9.39.2) '@types/eslint': specifier: ^9.6.1 version: 9.6.1 @@ -52,23 +52,23 @@ importers: specifier: ^17.2.3 version: 17.2.3 eslint: - specifier: ^9.39.1 - version: 9.39.1 + specifier: ^9.39.2 + version: 9.39.2 eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@9.39.1) + version: 10.1.8(eslint@9.39.2) eslint-plugin-import: specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1) + version: 2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2) globals: specifier: ^16.5.0 version: 16.5.0 prettier: - specifier: ^3.6.2 - version: 3.6.2 + specifier: ^3.8.0 + version: 3.8.0 tsx: - specifier: ^4.20.6 - version: 4.20.6 + specifier: ^4.21.0 + version: 4.21.0 typedoc: specifier: ^0.27.9 version: 0.27.9(typescript@5.9.3) @@ -82,8 +82,8 @@ importers: specifier: ^5.9.3 version: 5.9.3 typescript-eslint: - specifier: ^8.47.0 - version: 8.47.0(eslint@9.39.1)(typescript@5.9.3) + specifier: ^8.53.0 + version: 8.53.0(eslint@9.39.2)(typescript@5.9.3) vitest: specifier: ^3.2.4 version: 3.2.4(@types/node@20.19.25)(@vitest/ui@3.2.4) @@ -130,8 +130,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.25.12': - resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -142,8 +142,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.25.12': - resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -154,8 +154,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.25.12': - resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -166,8 +166,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.12': - resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -178,8 +178,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.25.12': - resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -190,8 +190,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.12': - resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + '@esbuild/darwin-x64@0.27.2': + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -202,8 +202,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.12': - resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -214,8 +214,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.12': - resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + '@esbuild/freebsd-x64@0.27.2': + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -226,8 +226,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.12': - resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -238,8 +238,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.12': - resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + '@esbuild/linux-arm@0.27.2': + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -250,8 +250,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.25.12': - resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -262,8 +262,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.12': - resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + '@esbuild/linux-loong64@0.27.2': + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -274,8 +274,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.12': - resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + '@esbuild/linux-mips64el@0.27.2': + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -286,8 +286,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.12': - resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + '@esbuild/linux-ppc64@0.27.2': + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -298,8 +298,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.12': - resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -310,8 +310,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.12': - resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -322,14 +322,14 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.12': - resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + '@esbuild/linux-x64@0.27.2': + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.12': - resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -340,14 +340,14 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.12': - resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + '@esbuild/netbsd-x64@0.27.2': + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.12': - resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -358,14 +358,14 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.12': - resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.12': - resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + '@esbuild/openharmony-arm64@0.27.2': + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] @@ -376,8 +376,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.12': - resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + '@esbuild/sunos-x64@0.27.2': + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -388,8 +388,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.12': - resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + '@esbuild/win32-arm64@0.27.2': + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -400,8 +400,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.12': - resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -412,8 +412,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.12': - resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + '@esbuild/win32-x64@0.27.2': + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -424,10 +424,20 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/regexpp@4.12.1': resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint/config-array@0.21.1': resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -444,8 +454,8 @@ packages: resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.39.1': - resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} + '@eslint/js@9.39.2': + resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.7': @@ -645,8 +655,8 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@stylistic/eslint-plugin@5.6.0': - resolution: {integrity: sha512-owEc4B8ME+O/xyZOkLVyLqPMsUgJXIM4XzCm5Vt3WvRXpyoOfYxgA+JkEiFqXPCI8+Nc2BzAT+KGAK7QleGs8Q==} + '@stylistic/eslint-plugin@5.7.0': + resolution: {integrity: sha512-PsSugIf9ip1H/mWKj4bi/BlEoerxXAda9ByRFsYuwsmr6af9NxJL0AaiNXs8Le7R21QR5KMiD/KdxZZ71LjAxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=9.0.0' @@ -684,23 +694,23 @@ packages: '@types/xml2js@0.4.14': resolution: {integrity: sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==} - '@typescript-eslint/eslint-plugin@8.47.0': - resolution: {integrity: sha512-fe0rz9WJQ5t2iaLfdbDc9T80GJy0AeO453q8C3YCilnGozvOyCG5t+EZtg7j7D88+c3FipfP/x+wzGnh1xp8ZA==} + '@typescript-eslint/eslint-plugin@8.53.0': + resolution: {integrity: sha512-eEXsVvLPu8Z4PkFibtuFJLJOTAV/nPdgtSjkGoPpddpFk3/ym2oy97jynY6ic2m6+nc5M8SE1e9v/mHKsulcJg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.47.0 + '@typescript-eslint/parser': ^8.53.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.47.0': - resolution: {integrity: sha512-lJi3PfxVmo0AkEY93ecfN+r8SofEqZNGByvHAI3GBLrvt1Cw6H5k1IM02nSzu0RfUafr2EvFSw0wAsZgubNplQ==} + '@typescript-eslint/parser@8.53.0': + resolution: {integrity: sha512-npiaib8XzbjtzS2N4HlqPvlpxpmZ14FjSJrteZpPxGUaYPlvhzlzUZ4mZyABo0EFrOWnvyd0Xxroq//hKhtAWg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.47.0': - resolution: {integrity: sha512-2X4BX8hUeB5JcA1TQJ7GjcgulXQ+5UkNb0DL8gHsHUHdFoiCTJoYLTpib3LtSDPZsRET5ygN4qqIWrHyYIKERA==} + '@typescript-eslint/project-service@8.53.0': + resolution: {integrity: sha512-Bl6Gdr7NqkqIP5yP9z1JU///Nmes4Eose6L1HwpuVHwScgDPPuEWbUVhvlZmb8hy0vX9syLk5EGNL700WcBlbg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -709,18 +719,18 @@ packages: resolution: {integrity: sha512-u2oITX3BJwzWCapoZ/pXw6BCOl8rJP4Ij/3wPoGvY8XwvXflOzd1kLrDUUUAIEdJSFh+ASwdTHqtan9xSg8buw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.47.0': - resolution: {integrity: sha512-a0TTJk4HXMkfpFkL9/WaGTNuv7JWfFTQFJd6zS9dVAjKsojmv9HT55xzbEpnZoY+VUb+YXLMp+ihMLz/UlZfDg==} + '@typescript-eslint/scope-manager@8.53.0': + resolution: {integrity: sha512-kWNj3l01eOGSdVBnfAF2K1BTh06WS0Yet6JUgb9Cmkqaz3Jlu0fdVUjj9UI8gPidBWSMqDIglmEXifSgDT/D0g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.47.0': - resolution: {integrity: sha512-ybUAvjy4ZCL11uryalkKxuT3w3sXJAuWhOoGS3T/Wu+iUu1tGJmk5ytSY8gbdACNARmcYEB0COksD2j6hfGK2g==} + '@typescript-eslint/tsconfig-utils@8.53.0': + resolution: {integrity: sha512-K6Sc0R5GIG6dNoPdOooQ+KtvT5KCKAvTcY8h2rIuul19vxH5OTQk7ArKkd4yTzkw66WnNY0kPPzzcmWA+XRmiA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.47.0': - resolution: {integrity: sha512-QC9RiCmZ2HmIdCEvhd1aJELBlD93ErziOXXlHEZyuBo3tBiAZieya0HLIxp+DoDWlsQqDawyKuNEhORyku+P8A==} + '@typescript-eslint/type-utils@8.53.0': + resolution: {integrity: sha512-BBAUhlx7g4SmcLhn8cnbxoxtmS7hcq39xKCgiutL3oNx1TaIp+cny51s8ewnKMpVUKQUGb41RAUWZ9kxYdovuw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -730,8 +740,8 @@ packages: resolution: {integrity: sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.47.0': - resolution: {integrity: sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==} + '@typescript-eslint/types@8.53.0': + resolution: {integrity: sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@8.28.0': @@ -740,8 +750,8 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/typescript-estree@8.47.0': - resolution: {integrity: sha512-k6ti9UepJf5NpzCjH31hQNLHQWupTRPhZ+KFF8WtTuTpy7uHPfeg2NM7cP27aCGajoEplxJDFVCEm9TGPYyiVg==} + '@typescript-eslint/typescript-estree@8.53.0': + resolution: {integrity: sha512-pw0c0Gdo7Z4xOG987u3nJ8akL9093yEEKv8QTJ+Bhkghj1xyj8cgPaavlr9rq8h7+s6plUJ4QJYw2gCZodqmGw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -753,8 +763,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.47.0': - resolution: {integrity: sha512-g7XrNf25iL4TJOiPqatNuaChyqt49a/onq5YsJ9+hXeugK+41LVg7AxikMfM02PC6jbNtZLCJj6AUcQXJS/jGQ==} + '@typescript-eslint/utils@8.53.0': + resolution: {integrity: sha512-XDY4mXTez3Z1iRDI5mbRhH4DFSt46oaIFsLg+Zn97+sYrXACziXSQcSelMybnVZ5pa1P6xYkPr5cMJyunM1ZDA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -764,8 +774,8 @@ packages: resolution: {integrity: sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.47.0': - resolution: {integrity: sha512-SIV3/6eftCy1bNzCQoPmbWsRLujS8t5iDIZ4spZOBHqrM+yfX2ogg8Tt3PDTAVKw3sSCiUgg30uOAvK2r9zGjQ==} + '@typescript-eslint/visitor-keys@8.53.0': + resolution: {integrity: sha512-LZ2NqIHFhvFwxG0qZeLL9DvdNAHPGCY5dIRwBhyYeU+LfLhcStE1ImjsuTG/WaVh3XysGaeLW8Rqq7cGkPCFvw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitest/coverage-v8@3.2.4': @@ -1067,8 +1077,8 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.25.12: - resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} engines: {node: '>=18'} hasBin: true @@ -1128,8 +1138,12 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.39.1: - resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} + eslint-visitor-keys@5.0.0: + resolution: {integrity: sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@9.39.2: + resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1142,6 +1156,10 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@11.0.0: + resolution: {integrity: sha512-+gMeWRrIh/NsG+3NaLeWHuyeyk70p2tbvZIWBYcqQ4/7Xvars6GYTZNhF1sIeLcc6Wb11He5ffz3hsHyXFrw5A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} @@ -1286,9 +1304,6 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -1556,8 +1571,8 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - minecraft-data@3.100.0: - resolution: {integrity: sha512-viEmZHxANjuvVg5e6VTxbEtvn2ku5EOP9SBt/LJAVaDhAhX8HeJY/zLhH31W/zFDNxC+S0J5pdkM+fPK+/gAJQ==} + minecraft-data@3.102.3: + resolution: {integrity: sha512-JxUPTUlamQ04GSK7YI3657BRurHLBRAhsmPb4gajd4z/p6t3LJh4l0HWIyNHRpJbQiUCIjn+mhos5oB+yqH0mQ==} minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1688,13 +1703,13 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.6.2: - resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + prettier@3.8.0: + resolution: {integrity: sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA==} engines: {node: '>=14'} hasBin: true - prismarine-nbt@2.7.0: - resolution: {integrity: sha512-Du9OLQAcCj3y29YtewOJbbV4ARaSUEJiTguw0PPQbPBy83f+eCyDRkyBpnXTi/KPyEpgYCzsjGzElevLpFoYGQ==} + prismarine-nbt@2.8.0: + resolution: {integrity: sha512-5D6FUZq0PNtf3v/41ImDlwThVesOv5adyqCRMZLzmkUGEmRJNNh5C6AsnvrClBftXs+IF0yqPnZoj8kcNPiMGg==} process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} @@ -1785,6 +1800,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -1936,11 +1956,17 @@ packages: peerDependencies: typescript: '>=4.8.4' + ts-api-utils@2.4.0: + resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tsx@4.20.6: - resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==} + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} engines: {node: '>=18.0.0'} hasBin: true @@ -1982,8 +2008,8 @@ packages: peerDependencies: typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x - typescript-eslint@8.47.0: - resolution: {integrity: sha512-Lwe8i2XQ3WoMjua/r1PHrCTpkubPYJCAfOurtn+mtTzqB6jNd+14n9UN1bJ4s3F49x9ixAm0FLflB/JzQ57M8Q==} + typescript-eslint@8.53.0: + resolution: {integrity: sha512-xHURCQNxZ1dsWn0sdOaOfCSQG0HKeqSj9OexIxrz6ypU6wHYOdX2I3D2b8s8wFSsSOYJb+6q283cLiLlkEsBYw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -2159,157 +2185,164 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/aix-ppc64@0.25.12': + '@esbuild/aix-ppc64@0.27.2': optional: true '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm64@0.25.12': + '@esbuild/android-arm64@0.27.2': optional: true '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-arm@0.25.12': + '@esbuild/android-arm@0.27.2': optional: true '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/android-x64@0.25.12': + '@esbuild/android-x64@0.27.2': optional: true '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.25.12': + '@esbuild/darwin-arm64@0.27.2': optional: true '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/darwin-x64@0.25.12': + '@esbuild/darwin-x64@0.27.2': optional: true '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.25.12': + '@esbuild/freebsd-arm64@0.27.2': optional: true '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.25.12': + '@esbuild/freebsd-x64@0.27.2': optional: true '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm64@0.25.12': + '@esbuild/linux-arm64@0.27.2': optional: true '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-arm@0.25.12': + '@esbuild/linux-arm@0.27.2': optional: true '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-ia32@0.25.12': + '@esbuild/linux-ia32@0.27.2': optional: true '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-loong64@0.25.12': + '@esbuild/linux-loong64@0.27.2': optional: true '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-mips64el@0.25.12': + '@esbuild/linux-mips64el@0.27.2': optional: true '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-ppc64@0.25.12': + '@esbuild/linux-ppc64@0.27.2': optional: true '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.25.12': + '@esbuild/linux-riscv64@0.27.2': optional: true '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-s390x@0.25.12': + '@esbuild/linux-s390x@0.27.2': optional: true '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/linux-x64@0.25.12': + '@esbuild/linux-x64@0.27.2': optional: true - '@esbuild/netbsd-arm64@0.25.12': + '@esbuild/netbsd-arm64@0.27.2': optional: true '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.25.12': + '@esbuild/netbsd-x64@0.27.2': optional: true - '@esbuild/openbsd-arm64@0.25.12': + '@esbuild/openbsd-arm64@0.27.2': optional: true '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.25.12': + '@esbuild/openbsd-x64@0.27.2': optional: true - '@esbuild/openharmony-arm64@0.25.12': + '@esbuild/openharmony-arm64@0.27.2': optional: true '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.25.12': + '@esbuild/sunos-x64@0.27.2': optional: true '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-arm64@0.25.12': + '@esbuild/win32-arm64@0.27.2': optional: true '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-ia32@0.25.12': + '@esbuild/win32-ia32@0.27.2': optional: true '@esbuild/win32-x64@0.21.5': optional: true - '@esbuild/win32-x64@0.25.12': + '@esbuild/win32-x64@0.27.2': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1)': + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2)': dependencies: - eslint: 9.39.1 + eslint: 9.39.2 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2)': + dependencies: + eslint: 9.39.2 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} + '@eslint-community/regexpp@4.12.2': {} + '@eslint/config-array@0.21.1': dependencies: '@eslint/object-schema': 2.1.7 @@ -2340,7 +2373,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.39.1': {} + '@eslint/js@9.39.2': {} '@eslint/object-schema@2.1.7': {} @@ -2379,9 +2412,9 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@j4cobi/eslint-plugin-sort-imports@1.0.2(eslint@9.39.1)(typescript@5.9.3)': + '@j4cobi/eslint-plugin-sort-imports@1.0.2(eslint@9.39.2)(typescript@5.9.3)': dependencies: - '@typescript-eslint/utils': 8.28.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.28.0(eslint@9.39.2)(typescript@5.9.3) transitivePeerDependencies: - eslint - supports-color @@ -2502,13 +2535,13 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} - '@stylistic/eslint-plugin@5.6.0(eslint@9.39.1)': + '@stylistic/eslint-plugin@5.7.0(eslint@9.39.2)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) - '@typescript-eslint/types': 8.47.0 - eslint: 9.39.1 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) + '@typescript-eslint/types': 8.53.0 + eslint: 9.39.2 + eslint-visitor-keys: 5.0.0 + espree: 11.0.0 estraverse: 5.3.0 picomatch: 4.0.3 @@ -2545,39 +2578,38 @@ snapshots: dependencies: '@types/node': 20.19.25 - '@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.53.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3)': dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.47.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.47.0 - '@typescript-eslint/type-utils': 8.47.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/utils': 8.47.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.47.0 - eslint: 9.39.1 - graphemer: 1.4.0 + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.53.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.53.0 + '@typescript-eslint/type-utils': 8.53.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/utils': 8.53.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.53.0 + eslint: 9.39.2 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.3) + ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/parser@8.53.0(eslint@9.39.2)(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.47.0 - '@typescript-eslint/types': 8.47.0 - '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.47.0 + '@typescript-eslint/scope-manager': 8.53.0 + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.53.0 debug: 4.4.3 - eslint: 9.39.1 + eslint: 9.39.2 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.47.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.53.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.47.0(typescript@5.9.3) - '@typescript-eslint/types': 8.47.0 + '@typescript-eslint/tsconfig-utils': 8.53.0(typescript@5.9.3) + '@typescript-eslint/types': 8.53.0 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: @@ -2588,30 +2620,30 @@ snapshots: '@typescript-eslint/types': 8.28.0 '@typescript-eslint/visitor-keys': 8.28.0 - '@typescript-eslint/scope-manager@8.47.0': + '@typescript-eslint/scope-manager@8.53.0': dependencies: - '@typescript-eslint/types': 8.47.0 - '@typescript-eslint/visitor-keys': 8.47.0 + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/visitor-keys': 8.53.0 - '@typescript-eslint/tsconfig-utils@8.47.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.53.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.47.0(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.53.0(eslint@9.39.2)(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.47.0 - '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.47.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.53.0(eslint@9.39.2)(typescript@5.9.3) debug: 4.4.3 - eslint: 9.39.1 - ts-api-utils: 2.1.0(typescript@5.9.3) + eslint: 9.39.2 + ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.28.0': {} - '@typescript-eslint/types@8.47.0': {} + '@typescript-eslint/types@8.53.0': {} '@typescript-eslint/typescript-estree@8.28.0(typescript@5.9.3)': dependencies: @@ -2627,40 +2659,39 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.47.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.53.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.47.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.47.0(typescript@5.9.3) - '@typescript-eslint/types': 8.47.0 - '@typescript-eslint/visitor-keys': 8.47.0 + '@typescript-eslint/project-service': 8.53.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.53.0(typescript@5.9.3) + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/visitor-keys': 8.53.0 debug: 4.4.3 - fast-glob: 3.3.3 - is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 - ts-api-utils: 2.1.0(typescript@5.9.3) + semver: 7.7.3 + tinyglobby: 0.2.15 + ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.28.0(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/utils@8.28.0(eslint@9.39.2)(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2) '@typescript-eslint/scope-manager': 8.28.0 '@typescript-eslint/types': 8.28.0 '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.9.3) - eslint: 9.39.1 + eslint: 9.39.2 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.47.0(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/utils@8.53.0(eslint@9.39.2)(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) - '@typescript-eslint/scope-manager': 8.47.0 - '@typescript-eslint/types': 8.47.0 - '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) - eslint: 9.39.1 + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) + '@typescript-eslint/scope-manager': 8.53.0 + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.9.3) + eslint: 9.39.2 typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -2670,9 +2701,9 @@ snapshots: '@typescript-eslint/types': 8.28.0 eslint-visitor-keys: 4.2.1 - '@typescript-eslint/visitor-keys@8.47.0': + '@typescript-eslint/visitor-keys@8.53.0': dependencies: - '@typescript-eslint/types': 8.47.0 + '@typescript-eslint/types': 8.53.0 eslint-visitor-keys: 4.2.1 '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@20.19.25)(@vitest/ui@3.2.4))': @@ -3090,40 +3121,40 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - esbuild@0.25.12: + esbuild@0.27.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.12 - '@esbuild/android-arm': 0.25.12 - '@esbuild/android-arm64': 0.25.12 - '@esbuild/android-x64': 0.25.12 - '@esbuild/darwin-arm64': 0.25.12 - '@esbuild/darwin-x64': 0.25.12 - '@esbuild/freebsd-arm64': 0.25.12 - '@esbuild/freebsd-x64': 0.25.12 - '@esbuild/linux-arm': 0.25.12 - '@esbuild/linux-arm64': 0.25.12 - '@esbuild/linux-ia32': 0.25.12 - '@esbuild/linux-loong64': 0.25.12 - '@esbuild/linux-mips64el': 0.25.12 - '@esbuild/linux-ppc64': 0.25.12 - '@esbuild/linux-riscv64': 0.25.12 - '@esbuild/linux-s390x': 0.25.12 - '@esbuild/linux-x64': 0.25.12 - '@esbuild/netbsd-arm64': 0.25.12 - '@esbuild/netbsd-x64': 0.25.12 - '@esbuild/openbsd-arm64': 0.25.12 - '@esbuild/openbsd-x64': 0.25.12 - '@esbuild/openharmony-arm64': 0.25.12 - '@esbuild/sunos-x64': 0.25.12 - '@esbuild/win32-arm64': 0.25.12 - '@esbuild/win32-ia32': 0.25.12 - '@esbuild/win32-x64': 0.25.12 + '@esbuild/aix-ppc64': 0.27.2 + '@esbuild/android-arm': 0.27.2 + '@esbuild/android-arm64': 0.27.2 + '@esbuild/android-x64': 0.27.2 + '@esbuild/darwin-arm64': 0.27.2 + '@esbuild/darwin-x64': 0.27.2 + '@esbuild/freebsd-arm64': 0.27.2 + '@esbuild/freebsd-x64': 0.27.2 + '@esbuild/linux-arm': 0.27.2 + '@esbuild/linux-arm64': 0.27.2 + '@esbuild/linux-ia32': 0.27.2 + '@esbuild/linux-loong64': 0.27.2 + '@esbuild/linux-mips64el': 0.27.2 + '@esbuild/linux-ppc64': 0.27.2 + '@esbuild/linux-riscv64': 0.27.2 + '@esbuild/linux-s390x': 0.27.2 + '@esbuild/linux-x64': 0.27.2 + '@esbuild/netbsd-arm64': 0.27.2 + '@esbuild/netbsd-x64': 0.27.2 + '@esbuild/openbsd-arm64': 0.27.2 + '@esbuild/openbsd-x64': 0.27.2 + '@esbuild/openharmony-arm64': 0.27.2 + '@esbuild/sunos-x64': 0.27.2 + '@esbuild/win32-arm64': 0.27.2 + '@esbuild/win32-ia32': 0.27.2 + '@esbuild/win32-x64': 0.27.2 escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.8(eslint@9.39.1): + eslint-config-prettier@10.1.8(eslint@9.39.2): dependencies: - eslint: 9.39.1 + eslint: 9.39.2 eslint-import-resolver-node@0.3.9: dependencies: @@ -3133,17 +3164,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.53.0(eslint@9.39.2)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.47.0(eslint@9.39.1)(typescript@5.9.3) - eslint: 9.39.1 + '@typescript-eslint/parser': 8.53.0(eslint@9.39.2)(typescript@5.9.3) + eslint: 9.39.2 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -3152,9 +3183,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.39.1 + eslint: 9.39.2 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.53.0(eslint@9.39.2)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -3166,7 +3197,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.47.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.53.0(eslint@9.39.2)(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -3181,15 +3212,17 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.39.1: + eslint-visitor-keys@5.0.0: {} + + eslint@9.39.2: dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.1 '@eslint/config-helpers': 0.4.2 '@eslint/core': 0.17.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.39.1 + '@eslint/js': 9.39.2 '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 @@ -3226,6 +3259,12 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 4.2.1 + espree@11.0.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 5.0.0 + esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -3373,8 +3412,6 @@ snapshots: gopd@1.2.0: {} - graphemer@1.4.0: {} - has-bigints@1.1.0: {} has-flag@4.0.0: {} @@ -3639,7 +3676,7 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - minecraft-data@3.100.0: {} + minecraft-data@3.102.3: {} minimatch@3.1.2: dependencies: @@ -3760,9 +3797,9 @@ snapshots: prelude-ls@1.2.1: {} - prettier@3.6.2: {} + prettier@3.8.0: {} - prismarine-nbt@2.7.0: + prismarine-nbt@2.8.0: dependencies: protodef: 1.18.0 @@ -3887,6 +3924,8 @@ snapshots: semver@7.7.1: {} + semver@7.7.3: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -4056,6 +4095,10 @@ snapshots: dependencies: typescript: 5.9.3 + ts-api-utils@2.4.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -4063,9 +4106,9 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tsx@4.20.6: + tsx@4.21.0: dependencies: - esbuild: 0.25.12 + esbuild: 0.27.2 get-tsconfig: 4.13.0 optionalDependencies: fsevents: 2.3.3 @@ -4126,13 +4169,13 @@ snapshots: typescript: 5.9.3 yaml: 2.8.1 - typescript-eslint@8.47.0(eslint@9.39.1)(typescript@5.9.3): + typescript-eslint@8.53.0(eslint@9.39.2)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/parser': 8.47.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.47.0(eslint@9.39.1)(typescript@5.9.3) - eslint: 9.39.1 + '@typescript-eslint/eslint-plugin': 8.53.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/parser': 8.53.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.53.0(eslint@9.39.2)(typescript@5.9.3) + eslint: 9.39.2 typescript: 5.9.3 transitivePeerDependencies: - supports-color From 1261ba324d6ad78aaeb26361f88746bfe099c805 Mon Sep 17 00:00:00 2001 From: Saad Nadeem <88615188+BridgeSenseDev@users.noreply.github.com> Date: Fri, 16 Jan 2026 19:32:42 +0000 Subject: [PATCH 111/124] feat(Zombies): Handle maps and modes (#694) --- .../MiniGames/Arcade/Zombies/Zombies.test.ts | 31 ++++++++- .../MiniGames/Arcade/Zombies/Zombies.ts | 14 +++- .../Arcade/Zombies/ZombiesMap.test.ts | 69 +++++++++++++++++-- .../MiniGames/Arcade/Zombies/ZombiesMap.ts | 33 +++++++-- .../Arcade/Zombies/ZombiesMapMode.test.ts | 45 ++++++++++++ .../Arcade/Zombies/ZombiesMapMode.ts | 32 +++++++++ src/Types/Player.ts | 1 + 7 files changed, 209 insertions(+), 16 deletions(-) create mode 100644 src/Structures/MiniGames/Arcade/Zombies/ZombiesMapMode.test.ts create mode 100644 src/Structures/MiniGames/Arcade/Zombies/ZombiesMapMode.ts diff --git a/src/Structures/MiniGames/Arcade/Zombies/Zombies.test.ts b/src/Structures/MiniGames/Arcade/Zombies/Zombies.test.ts index 948dd2c5c..960e08c0a 100644 --- a/src/Structures/MiniGames/Arcade/Zombies/Zombies.test.ts +++ b/src/Structures/MiniGames/Arcade/Zombies/Zombies.test.ts @@ -1,4 +1,5 @@ import Zombies from './Zombies.js'; +import ZombiesMap from './ZombiesMap.js'; import { expect, expectTypeOf, test } from 'vitest'; test('Zombies', () => { @@ -12,9 +13,9 @@ test('Zombies', () => { expect(data.basketballZombieKills).toBeDefined(); expect(data.basketballZombieKills).toBeGreaterThanOrEqual(0); expectTypeOf(data.basketballZombieKills).toEqualTypeOf(); - expect(data.bestRoundZombies).toBeDefined(); - expect(data.bestRoundZombies).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bestRoundZombies).toEqualTypeOf(); + expect(data.bestRound).toBeDefined(); + expect(data.bestRound).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bestRound).toEqualTypeOf(); expect(data.blazeZombieKills).toBeDefined(); expect(data.blazeZombieKills).toBeGreaterThanOrEqual(0); expectTypeOf(data.blazeZombieKills).toEqualTypeOf(); @@ -323,4 +324,28 @@ test('Zombies', () => { expectTypeOf(data.zombieKills).toEqualTypeOf(); expect(data.hideTutorials).toBeDefined(); expectTypeOf(data.hideTutorials).toEqualTypeOf(); + expect(data.alienArcadium).toBeDefined(); + expect(data.alienArcadium).toBeInstanceOf(ZombiesMap); + expectTypeOf(data.alienArcadium).toEqualTypeOf(); + expect(data.alienArcadium.normal).toBeUndefined(); + expect(data.alienArcadium.hard).toBeUndefined(); + expect(data.alienArcadium.rip).toBeUndefined(); + expect(data.badBlood).toBeDefined(); + expect(data.badBlood).toBeInstanceOf(ZombiesMap); + expect(data.badBlood.normal).toBeDefined(); + expect(data.badBlood.hard).toBeDefined(); + expect(data.badBlood.rip).toBeDefined(); + expectTypeOf(data.badBlood).toEqualTypeOf(); + expect(data.deadEnd).toBeDefined(); + expect(data.deadEnd).toBeInstanceOf(ZombiesMap); + expectTypeOf(data.deadEnd).toEqualTypeOf(); + expect(data.deadEnd.normal).toBeDefined(); + expect(data.deadEnd.hard).toBeDefined(); + expect(data.deadEnd.rip).toBeDefined(); + expect(data.prison).toBeDefined(); + expect(data.prison).toBeInstanceOf(ZombiesMap); + expectTypeOf(data.prison).toEqualTypeOf(); + expect(data.prison.normal).toBeDefined(); + expect(data.prison.hard).toBeDefined(); + expect(data.prison.rip).toBeDefined(); }); diff --git a/src/Structures/MiniGames/Arcade/Zombies/Zombies.ts b/src/Structures/MiniGames/Arcade/Zombies/Zombies.ts index bd4570426..f96fe3c4f 100644 --- a/src/Structures/MiniGames/Arcade/Zombies/Zombies.ts +++ b/src/Structures/MiniGames/Arcade/Zombies/Zombies.ts @@ -1,7 +1,9 @@ +import ZombiesMap from './ZombiesMap.js'; + class Zombies { basicZombieKills: number; basketballZombieKills: number; - bestRoundZombies: number; + bestRound: number; blazeZombieKills: number; blobZombieKills: number; bombZombieKills: number; @@ -105,10 +107,14 @@ class Zombies { wormZombieKills: number; zombieKills: number; hideTutorials: boolean; + alienArcadium: ZombiesMap; + badBlood: ZombiesMap; + deadEnd: ZombiesMap; + prison: ZombiesMap; constructor(data: Record) { this.basicZombieKills = data?.basic_zombie_kills_zombies || 0; this.basketballZombieKills = data?.basketball_zombie_zombie_kills_zombies || 0; - this.bestRoundZombies = data?.best_round_zombies || 0; + this.bestRound = data?.best_round_zombies || 0; this.blazeZombieKills = data?.blaze_zombie_kills_zombies || 0; this.blobZombieKills = data?.blob_zombie_kills_zombies || 0; this.bombZombieKills = data?.bomb_zombie_kills_zombies || 0; @@ -212,6 +218,10 @@ class Zombies { this.wormZombieKills = data?.worm_zombie_kills_zombies || 0; this.zombieKills = data?.zombie_kills_zombies || 0; this.hideTutorials = data?.zombies_hideTutorials || false; + this.alienArcadium = new ZombiesMap(data, 'alienarcadium', false); + this.badBlood = new ZombiesMap(data, 'badblood', true); + this.deadEnd = new ZombiesMap(data, 'deadend', true); + this.prison = new ZombiesMap(data, 'prison', true); } } diff --git a/src/Structures/MiniGames/Arcade/Zombies/ZombiesMap.test.ts b/src/Structures/MiniGames/Arcade/Zombies/ZombiesMap.test.ts index b2a660405..5167aa5b3 100644 --- a/src/Structures/MiniGames/Arcade/Zombies/ZombiesMap.test.ts +++ b/src/Structures/MiniGames/Arcade/Zombies/ZombiesMap.test.ts @@ -1,17 +1,21 @@ import ZombiesMap from './ZombiesMap.js'; +import ZombiesMapMode from './ZombiesMapMode.js'; import { expect, expectTypeOf, test } from 'vitest'; -test('ZombiesMap', () => { - const data = new ZombiesMap({ stats: 'meow' }, 'alienarcadium'); +test('ZombiesMap (alienarcadium)', () => { + const data = new ZombiesMap({ stats: 'meow' }, 'alienarcadium', false); expect(data).toBeDefined(); expect(data).toBeInstanceOf(ZombiesMap); expectTypeOf(data).toEqualTypeOf(); - expect(data.bestRoundZombies).toBeDefined(); - expect(data.bestRoundZombies).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bestRoundZombies).toEqualTypeOf(); + expect(data.bestRound).toBeDefined(); + expect(data.bestRound).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bestRound).toEqualTypeOf(); expect(data.deaths).toBeDefined(); expect(data.deaths).toBeGreaterThanOrEqual(0); expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.doorsOpened).toBeDefined(); + expect(data.doorsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.doorsOpened).toEqualTypeOf(); expect(data.fastestTime10).toBeDefined(); expect(data.fastestTime10).toBeGreaterThanOrEqual(0); expectTypeOf(data.fastestTime10).toEqualTypeOf(); @@ -39,4 +43,59 @@ test('ZombiesMap', () => { expect(data.zombieKills).toBeDefined(); expect(data.zombieKills).toBeGreaterThanOrEqual(0); expectTypeOf(data.zombieKills).toEqualTypeOf(); + expect(data.normal).toBeUndefined(); + expect(data.hard).toBeUndefined(); + expect(data.rip).toBeUndefined(); +}); + +test('ZombiesMap (deadend)', () => { + const data = new ZombiesMap({ stats: 'meow' }, 'deadend', true); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(ZombiesMap); + expectTypeOf(data).toEqualTypeOf(); + expect(data.bestRound).toBeDefined(); + expect(data.bestRound).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bestRound).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.doorsOpened).toBeDefined(); + expect(data.doorsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.doorsOpened).toEqualTypeOf(); + expect(data.fastestTime10).toBeDefined(); + expect(data.fastestTime10).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fastestTime10).toEqualTypeOf(); + expect(data.fastestTime20).toBeDefined(); + expect(data.fastestTime20).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fastestTime20).toEqualTypeOf(); + expect(data.fastestTime30).toBeDefined(); + expect(data.fastestTime30).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fastestTime30).toEqualTypeOf(); + expect(data.playersRevived).toBeDefined(); + expect(data.playersRevived).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playersRevived).toEqualTypeOf(); + expect(data.timesKnockedDown).toBeDefined(); + expect(data.timesKnockedDown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.timesKnockedDown).toEqualTypeOf(); + expect(data.totalRoundsSurvived).toBeDefined(); + expect(data.totalRoundsSurvived).toBeGreaterThanOrEqual(0); + expectTypeOf(data.totalRoundsSurvived).toEqualTypeOf(); + expect(data.windowsRepaired).toBeDefined(); + expect(data.windowsRepaired).toBeGreaterThanOrEqual(0); + expectTypeOf(data.windowsRepaired).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.zombieKills).toBeDefined(); + expect(data.zombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.zombieKills).toEqualTypeOf(); + expect(data.normal).toBeDefined(); + expect(data.normal).toBeInstanceOf(ZombiesMapMode); + expectTypeOf(data.normal).toEqualTypeOf(); + expect(data.hard).toBeDefined(); + expect(data.hard).toBeInstanceOf(ZombiesMapMode); + expectTypeOf(data.hard).toEqualTypeOf(); + expect(data.rip).toBeDefined(); + expect(data.rip).toBeInstanceOf(ZombiesMapMode); + expectTypeOf(data.rip).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/Arcade/Zombies/ZombiesMap.ts b/src/Structures/MiniGames/Arcade/Zombies/ZombiesMap.ts index c699d5544..092421ccb 100644 --- a/src/Structures/MiniGames/Arcade/Zombies/ZombiesMap.ts +++ b/src/Structures/MiniGames/Arcade/Zombies/ZombiesMap.ts @@ -1,8 +1,15 @@ +import ZombiesMapMode from './ZombiesMapMode.js'; import type { ArcadeZombiesMaps } from '../../../../Types/Player.js'; +function minPositive(...values: number[]): number { + const positives = values.filter((v) => v > 0); + return positives.length > 0 ? Math.min(...positives) : 0; +} + class ZombiesMap { - bestRoundZombies: number; + bestRound: number; deaths: number; + doorsOpened: number; fastestTime10: number; fastestTime20: number; fastestTime30: number; @@ -12,18 +19,32 @@ class ZombiesMap { windowsRepaired: number; wins: number; zombieKills: number; - constructor(data: Record, map: ArcadeZombiesMaps) { - this.bestRoundZombies = data?.[`best_round_zombies_${map}`] || 0; + normal?: ZombiesMapMode; + hard?: ZombiesMapMode; + rip?: ZombiesMapMode; + constructor(data: Record, map: ArcadeZombiesMaps, hasModes: boolean = false) { + this.bestRound = data?.[`best_round_zombies_${map}`] || 0; this.deaths = data?.[`deaths_zombies_${map}`] || 0; - this.fastestTime10 = data?.[`fastest_time_10_zombies_${map}`] || 0; - this.fastestTime20 = data?.[`fastest_time_20_zombies_${map}`] || 0; - this.fastestTime30 = data?.[`fastest_time_30_zombies_${map}`] || 0; + this.doorsOpened = data?.[`doors_opened_zombies_${map}`] || 0; this.playersRevived = data?.[`players_revived_zombies_${map}`] || 0; this.timesKnockedDown = data?.[`times_knocked_down_zombies_${map}`] || 0; this.totalRoundsSurvived = data?.[`total_rounds_survived_zombies_${map}`] || 0; this.windowsRepaired = data?.[`windows_repaired_zombies_${map}`] || 0; this.wins = data?.[`wins_zombies_${map}`] || 0; this.zombieKills = data?.[`zombie_kills_zombies_${map}`] || 0; + + if (hasModes) { + this.normal = new ZombiesMapMode(data, map, 'normal'); + this.hard = new ZombiesMapMode(data, map, 'hard'); + this.rip = new ZombiesMapMode(data, map, 'rip'); + this.fastestTime10 = minPositive(this.normal.fastestTime10, this.hard.fastestTime10, this.rip.fastestTime10); + this.fastestTime20 = minPositive(this.normal.fastestTime20, this.hard.fastestTime20, this.rip.fastestTime20); + this.fastestTime30 = minPositive(this.normal.fastestTime30, this.hard.fastestTime30, this.rip.fastestTime30); + } else { + this.fastestTime10 = data?.[`fastest_time_10_zombies_${map}_normal`] || 0; + this.fastestTime20 = data?.[`fastest_time_20_zombies_${map}_normal`] || 0; + this.fastestTime30 = data?.[`fastest_time_30_zombies_${map}_normal`] || 0; + } } } diff --git a/src/Structures/MiniGames/Arcade/Zombies/ZombiesMapMode.test.ts b/src/Structures/MiniGames/Arcade/Zombies/ZombiesMapMode.test.ts new file mode 100644 index 000000000..26bdb40b5 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/Zombies/ZombiesMapMode.test.ts @@ -0,0 +1,45 @@ +import ZombiesMapMode from './ZombiesMapMode.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('ZombiesMapMode', () => { + const data = new ZombiesMapMode({ stats: 'meow' }, 'deadend', 'normal'); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(ZombiesMapMode); + expectTypeOf(data).toEqualTypeOf(); + expect(data.bestRound).toBeDefined(); + expect(data.bestRound).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bestRound).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.doorsOpened).toBeDefined(); + expect(data.doorsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.doorsOpened).toEqualTypeOf(); + expect(data.fastestTime10).toBeDefined(); + expect(data.fastestTime10).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fastestTime10).toEqualTypeOf(); + expect(data.fastestTime20).toBeDefined(); + expect(data.fastestTime20).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fastestTime20).toEqualTypeOf(); + expect(data.fastestTime30).toBeDefined(); + expect(data.fastestTime30).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fastestTime30).toEqualTypeOf(); + expect(data.playersRevived).toBeDefined(); + expect(data.playersRevived).toBeGreaterThanOrEqual(0); + expectTypeOf(data.playersRevived).toEqualTypeOf(); + expect(data.timesKnockedDown).toBeDefined(); + expect(data.timesKnockedDown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.timesKnockedDown).toEqualTypeOf(); + expect(data.totalRoundsSurvived).toBeDefined(); + expect(data.totalRoundsSurvived).toBeGreaterThanOrEqual(0); + expectTypeOf(data.totalRoundsSurvived).toEqualTypeOf(); + expect(data.windowsRepaired).toBeDefined(); + expect(data.windowsRepaired).toBeGreaterThanOrEqual(0); + expectTypeOf(data.windowsRepaired).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.zombieKills).toBeDefined(); + expect(data.zombieKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.zombieKills).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/Arcade/Zombies/ZombiesMapMode.ts b/src/Structures/MiniGames/Arcade/Zombies/ZombiesMapMode.ts new file mode 100644 index 000000000..065fd9f23 --- /dev/null +++ b/src/Structures/MiniGames/Arcade/Zombies/ZombiesMapMode.ts @@ -0,0 +1,32 @@ +import type { ArcadeZombiesDifficulty, ArcadeZombiesMaps } from '../../../../Types/Player.js'; + +class ZombiesMapMode { + bestRound: number; + deaths: number; + doorsOpened: number; + fastestTime10: number; + fastestTime20: number; + fastestTime30: number; + playersRevived: number; + timesKnockedDown: number; + totalRoundsSurvived: number; + windowsRepaired: number; + wins: number; + zombieKills: number; + constructor(data: Record, map: ArcadeZombiesMaps, mode: ArcadeZombiesDifficulty) { + this.bestRound = data?.[`best_round_zombies_${map}_${mode}`] || 0; + this.deaths = data?.[`deaths_zombies_${map}_${mode}`] || 0; + this.doorsOpened = data?.[`doors_opened_zombies_${map}_${mode}`] || 0; + this.fastestTime10 = data?.[`fastest_time_10_zombies_${map}_${mode}`] || 0; + this.fastestTime20 = data?.[`fastest_time_20_zombies_${map}_${mode}`] || 0; + this.fastestTime30 = data?.[`fastest_time_30_zombies_${map}_${mode}`] || 0; + this.playersRevived = data?.[`players_revived_zombies_${map}_${mode}`] || 0; + this.timesKnockedDown = data?.[`times_knocked_down_zombies_${map}_${mode}`] || 0; + this.totalRoundsSurvived = data?.[`total_rounds_survived_zombies_${map}_${mode}`] || 0; + this.windowsRepaired = data?.[`windows_repaired_zombies_${map}_${mode}`] || 0; + this.wins = data?.[`wins_zombies_${map}_${mode}`] || 0; + this.zombieKills = data?.[`zombie_kills_zombies_${map}_${mode}`] || 0; + } +} + +export default ZombiesMapMode; diff --git a/src/Types/Player.ts b/src/Types/Player.ts index f01e5a4fc..c13bb52cb 100644 --- a/src/Types/Player.ts +++ b/src/Types/Player.ts @@ -2499,6 +2499,7 @@ export type ArcadePartyGamesGame = | 'volcano' | 'workshop'; export type ArcadeZombiesMaps = 'alienarcadium' | 'badblood' | 'deadend' | 'prison'; +export type ArcadeZombiesDifficulty = 'normal' | 'hard' | 'rip'; export type ArcadeEnderSpleefTrail = 'BLUE' | 'DEFAULT' | 'GREEN' | 'RAINBOW' | 'RED'; export type ArcadeHoleInTheWallColor = 'CYAN' | 'DEFAULT' | 'FROSTED' | 'GREEN' | 'PUMPKIN' | 'RED' | 'YELLOW'; export type ArcadeThrowOutDisguise = 'COW' | 'PIG' | 'SHEEP' | 'SNOWMAN' | 'ZOMBIE'; From efa7bc46da21e6d2895ca3da191f483c0f7c08dc Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 21 Jan 2026 11:43:42 +0800 Subject: [PATCH 112/124] feat(Tests) --- src/Structures/Boosters/Booster.test.ts | 21 ++++++++++ src/Structures/Boosters/Booster.ts | 14 +++---- src/Structures/Player/Player.ts | 6 +-- .../Player/PlayerCosmetics/PlayerCosmetics.ts | 18 ++++----- ...SeasonalChristmasYearAdventRewards.test.ts | 13 ++++++ ...kyBlockMemberCrimsonIsleTrophyFish.test.ts | 28 +++++++++++++ .../SkyBlockMemberCrimsonIsleTrophyFish.ts | 40 +++++++++---------- .../Member/Dungeons/SkyBlockMemberDungeons.ts | 2 +- src/Types/Player.ts | 10 ++--- 9 files changed, 105 insertions(+), 47 deletions(-) diff --git a/src/Structures/Boosters/Booster.test.ts b/src/Structures/Boosters/Booster.test.ts index 697af0ade..508929548 100644 --- a/src/Structures/Boosters/Booster.test.ts +++ b/src/Structures/Boosters/Booster.test.ts @@ -42,3 +42,24 @@ test('Booster', () => { expect(data.toString()).toBe(`${data.purchaser}'s booster in ${data.game}`); expectTypeOf(data.toString()).toEqualTypeOf(); }); + +test('Booster parseType (STACKED)', () => { + const type = Booster.parseType({ stacked: true }); + expect(type).toBeDefined(); + expectTypeOf(type).toEqualTypeOf(); + expect(type).toBe('STACKED'); +}); + +test('Booster parseType (QUEUED)', () => { + const type = Booster.parseType({ stacked: false }); + expect(type).toBeDefined(); + expectTypeOf(type).toEqualTypeOf(); + expect(type).toBe('QUEUED'); +}); + +test('Booster parseType (ACTIVE)', () => { + const type = Booster.parseType({}); + expect(type).toBeDefined(); + expectTypeOf(type).toEqualTypeOf(); + expect(type).toBe('ACTIVE'); +}); diff --git a/src/Structures/Boosters/Booster.ts b/src/Structures/Boosters/Booster.ts index 5406a89e0..d5d5bbfb6 100644 --- a/src/Structures/Boosters/Booster.ts +++ b/src/Structures/Boosters/Booster.ts @@ -2,12 +2,6 @@ import Game from '../Game.js'; import type RequestData from '../../Private/RequestData.js'; import type { BoosterType } from '../../Types/Booster.js'; -export function parseType(data: Record): BoosterType { - if (data.stacked === true) return 'STACKED'; - if (!data.stacked) return 'QUEUED'; - return 'ACTIVE'; -} - class Booster { purchaser: string; amount: number; @@ -29,7 +23,7 @@ class Booster { this.activated = new Date(data.dateActivated); this.game = new Game(data.gameType); this.isActive = Array.isArray(data.stacked); - this.type = parseType(data); + this.type = Booster.parseType(data); this.stackers = Array.isArray(data.stacked) ? Array.from(data.stacked) : []; this.expired = data.length < 0; } @@ -41,6 +35,12 @@ class Booster { isRaw(): this is RequestData { return false; } + + static parseType(data: Record): BoosterType { + if (data.stacked === true) return 'STACKED'; + if (data.stacked === false) return 'QUEUED'; + return 'ACTIVE'; + } } export default Booster; diff --git a/src/Structures/Player/Player.ts b/src/Structures/Player/Player.ts index 776f5c061..86088a759 100644 --- a/src/Structures/Player/Player.ts +++ b/src/Structures/Player/Player.ts @@ -107,10 +107,8 @@ class Player { } } else if (player.rank) { switch (player.rank) { - case 'ADMIN': - return 'Admin'; - case 'GAME_MASTER': - return 'Game Master'; + case 'STAFF': + return 'Staff'; case 'YOUTUBER': return 'YouTube'; default: diff --git a/src/Structures/Player/PlayerCosmetics/PlayerCosmetics.ts b/src/Structures/Player/PlayerCosmetics/PlayerCosmetics.ts index 8a27fe022..501456494 100644 --- a/src/Structures/Player/PlayerCosmetics/PlayerCosmetics.ts +++ b/src/Structures/Player/PlayerCosmetics/PlayerCosmetics.ts @@ -40,41 +40,41 @@ class PlayerCosmetics { this.cosmetics.filter((x) => x.startsWith('pet_')) ); - this.unlockedSuits = (this.cosmetics || []) + this.unlockedSuits = this.cosmetics .filter((x) => x.startsWith('suit_')) .map((x) => x.replace('suit_', '') as PlayerCosmeticsSuit); - this.unlockedHats = (this.cosmetics || []) + this.unlockedHats = this.cosmetics .filter((x) => x.startsWith('hat_')) .map((x) => x.replace('hat_', '') as PlayerCosmeticsHat); this.selectedGadget = data?.currentGadget || null; - this.unlockedGadgets = (this.cosmetics || []) + this.unlockedGadgets = this.cosmetics .filter((x) => x.startsWith('gadget_')) .map((x) => x.replace('gadget_', '') as PlayerCosmeticsGadget); - this.unlockedMorphs = (this.cosmetics || []) + this.unlockedMorphs = this.cosmetics .filter((x) => x.startsWith('morph_')) .map((x) => x.replace('morph_', '') as PlayerCosmeticsMorph); - this.unlockedCloaks = (this.cosmetics || []) + this.unlockedCloaks = this.cosmetics .filter((x) => x.startsWith('cloak_')) .map((x) => x.replace('cloak_', '') as PlayerCosmeticsCloak); - this.unlockedTaunts = (this.cosmetics || []) + this.unlockedTaunts = this.cosmetics .filter((x) => x.startsWith('taunt_')) .map((x) => x.replace('taunt_', '') as PlayerCosmeticsTaunt); - this.unlockedRankColors = (this.cosmetics || []) + this.unlockedRankColors = this.cosmetics .filter((x) => x.startsWith('rankcolor_')) .map((x) => x.replace('rankcolor_', '') as PlayerCosmeticsRankColor); this.selectedParticlePack = data?.particlePack || null; - this.unlockedParticlePacks = (this.cosmetics || []) + this.unlockedParticlePacks = this.cosmetics .filter((x) => x.startsWith('particlepack_')) .map((x) => x.replace('particlepack_', '') as PlayerCosmeticsParticlePack); - this.unlockedClickEffects = (this.cosmetics || []) + this.unlockedClickEffects = this.cosmetics .filter((x) => x.startsWith('clickeffects_')) .map((x) => x.replace('clickeffects_', '') as PlayerCosmeticsClickEffects); } diff --git a/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYearAdventRewards.test.ts b/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYearAdventRewards.test.ts index 923a1a129..e6bca9327 100644 --- a/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYearAdventRewards.test.ts +++ b/src/Structures/Player/PlayerSeasonal/Christmas/PlayerSeasonalChristmasYearAdventRewards.test.ts @@ -57,3 +57,16 @@ test('PlayerSeasonalChristmasYearAdventRewards', () => { expect(data.day25).toBeDefined(); expectTypeOf(data.day25).toEqualTypeOf(); }); + +test('PlayerSeasonalChristmasYearAdventRewards (Valid Dates)', () => { + const input: Record = {}; + for (let i = 1; i <= 25; i++) { + input[`day${i}`] = `2025-12-${String(i).padStart(2, '0')}T00:00:00.000Z`; + } + const data = new PlayerSeasonalChristmasYearAdventRewards(input); + for (let i = 1; i <= 25; i++) { + const key = `day${i}` as keyof PlayerSeasonalChristmasYearAdventRewards; + expect(data[key]).toBeInstanceOf(Date); + expect((data[key] as Date).toISOString()).toBe(`2025-12-${String(i).padStart(2, '0')}T00:00:00.000Z`); + } +}); diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.test.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.test.ts index 132138116..49392fb05 100644 --- a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.test.ts +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.test.ts @@ -74,3 +74,31 @@ test('SkyBlockMemberCrimsonIsleTrophyFish', () => { expect(data.toString()).toBe(data.rank); expectTypeOf(data.toString()).toEqualTypeOf(); }); + +test('SkyBlockMemberCrimsonIsleTrophyFish getTrophyFishRank (Bronze)', () => { + const rank = SkyBlockMemberCrimsonIsleTrophyFish.getTrophyFishRank(1); + expect(rank).toBeDefined(); + expectTypeOf(rank).toEqualTypeOf(); + expect(rank).toBe('Bronze'); +}); + +test('SkyBlockMemberCrimsonIsleTrophyFish getTrophyFishRank (Silver)', () => { + const rank = SkyBlockMemberCrimsonIsleTrophyFish.getTrophyFishRank(2); + expect(rank).toBeDefined(); + expectTypeOf(rank).toEqualTypeOf(); + expect(rank).toBe('Silver'); +}); + +test('SkyBlockMemberCrimsonIsleTrophyFish getTrophyFishRank (Gold)', () => { + const rank = SkyBlockMemberCrimsonIsleTrophyFish.getTrophyFishRank(3); + expect(rank).toBeDefined(); + expectTypeOf(rank).toEqualTypeOf(); + expect(rank).toBe('Gold'); +}); + +test('SkyBlockMemberCrimsonIsleTrophyFish getTrophyFishRank (Diamond)', () => { + const rank = SkyBlockMemberCrimsonIsleTrophyFish.getTrophyFishRank(4); + expect(rank).toBeDefined(); + expectTypeOf(rank).toEqualTypeOf(); + expect(rank).toBe('Diamond'); +}); diff --git a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.ts b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.ts index c927726bf..0c3ebba4b 100644 --- a/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.ts +++ b/src/Structures/SkyBlock/Member/CrimsonIsle/SkyBlockMemberCrimsonIsleTrophyFish/SkyBlockMemberCrimsonIsleTrophyFish.ts @@ -25,25 +25,25 @@ class SkyBlockMemberCrimsonIsleTrophyFish { caught: SkyBlockMemberCrimsonIsleTrophyFishCaught; constructor(data: Record) { const rewards = data?.rewards || [1]; - this.rank = this.getTrophyFishRank(rewards[rewards.length - 1]); - this.gusher = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'gusher'); - this.blobfish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'blobfish'); - this.lavaHorse = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'lava_horse'); - this.goldenFish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'golden_fish'); - this.volcanicStonefish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'volcanic_stonefish'); - this.slugfish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'slugfish'); - this.vanille = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'vanille'); - this.obfuscatedFish1 = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'obfuscated_fish_1'); - this.obfuscatedFish2 = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'obfuscated_fish_2'); - this.obfuscatedFish3 = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'obfuscated_fish_3'); - this.sulphurSkitter = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'sulphur_skitter'); - this.skeletonFish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'skeleton_fish'); - this.manaRay = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'mana_ray'); - this.flyfish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'flyfish'); - this.steamingHotFlounder = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'steaming_hot_flounder'); - this.soulFish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'soul_fish'); - this.karateFish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'karate_fish'); - this.moldfin = new SkyBlockMemberCrimsonIsleTrophyFishFish(data || {}, 'moldfin'); + this.rank = SkyBlockMemberCrimsonIsleTrophyFish.getTrophyFishRank(rewards[rewards.length - 1]); + this.gusher = new SkyBlockMemberCrimsonIsleTrophyFishFish(data, 'gusher'); + this.blobfish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data, 'blobfish'); + this.lavaHorse = new SkyBlockMemberCrimsonIsleTrophyFishFish(data, 'lava_horse'); + this.goldenFish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data, 'golden_fish'); + this.volcanicStonefish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data, 'volcanic_stonefish'); + this.slugfish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data, 'slugfish'); + this.vanille = new SkyBlockMemberCrimsonIsleTrophyFishFish(data, 'vanille'); + this.obfuscatedFish1 = new SkyBlockMemberCrimsonIsleTrophyFishFish(data, 'obfuscated_fish_1'); + this.obfuscatedFish2 = new SkyBlockMemberCrimsonIsleTrophyFishFish(data, 'obfuscated_fish_2'); + this.obfuscatedFish3 = new SkyBlockMemberCrimsonIsleTrophyFishFish(data, 'obfuscated_fish_3'); + this.sulphurSkitter = new SkyBlockMemberCrimsonIsleTrophyFishFish(data, 'sulphur_skitter'); + this.skeletonFish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data, 'skeleton_fish'); + this.manaRay = new SkyBlockMemberCrimsonIsleTrophyFishFish(data, 'mana_ray'); + this.flyfish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data, 'flyfish'); + this.steamingHotFlounder = new SkyBlockMemberCrimsonIsleTrophyFishFish(data, 'steaming_hot_flounder'); + this.soulFish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data, 'soul_fish'); + this.karateFish = new SkyBlockMemberCrimsonIsleTrophyFishFish(data, 'karate_fish'); + this.moldfin = new SkyBlockMemberCrimsonIsleTrophyFishFish(data, 'moldfin'); this.caught = new SkyBlockMemberCrimsonIsleTrophyFishCaught(this); } @@ -51,7 +51,7 @@ class SkyBlockMemberCrimsonIsleTrophyFish { return this.rank; } - private getTrophyFishRank(level: number): CrimsonIsleTrophyFishRank { + static getTrophyFishRank(level: number): CrimsonIsleTrophyFishRank { switch (level) { case 2: return 'Silver'; diff --git a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeons.ts b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeons.ts index 8b5ed1bf8..d98f6aa59 100644 --- a/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeons.ts +++ b/src/Structures/SkyBlock/Member/Dungeons/SkyBlockMemberDungeons.ts @@ -17,7 +17,7 @@ class SkyBlockMemberDungeons { this.catacombs = new SkyBlockMemberDungeonsMode(data?.dungeon_types || {}, 'catacombs'); this.masterCatacombs = new SkyBlockMemberDungeonsMode(data?.dungeon_types || {}, 'master_catacombs'); this.level = getLevelByXp(data?.dungeon_types?.catacombs?.experience || 0, { type: 'dungeoneering' }); - this.classes = new SkyBlockMemberDungeonsClasses(data || {}); + this.classes = new SkyBlockMemberDungeonsClasses(data); this.unlockedJournals = data?.dungeon_journal?.unlocked_journals || []; this.treasures = (data?.treasures?.runs || []).map( (run: Record) => new SkyBlockMemberDungeonsTreasureRun(run, data?.treasures?.chests) diff --git a/src/Types/Player.ts b/src/Types/Player.ts index c13bb52cb..9df78448f 100644 --- a/src/Types/Player.ts +++ b/src/Types/Player.ts @@ -403,14 +403,12 @@ export type PlayerRank = | 'MVP' | 'MVP+' | 'MVP++' - | 'Game Master' - | 'Admin' | 'YouTube' - | 'Events' - | 'Mojang' - | 'Owner' + | 'Staff' + | 'Innit' | 'PIG+++' - | 'Innit'; + | 'Mojang' + | 'Events'; export interface LevelProgress { level: number; From f5bc18f6be4cfe3c01119fadc5b1723982c0809e Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 21 Jan 2026 11:46:29 +0800 Subject: [PATCH 113/124] refactor(scripts): rename lint to eslint It's what I use everywhere else and it confuses me --- .github/CONTRIBUTING.md | 2 +- .github/PULL_REQUEST_TEMPLATE.md | 2 +- .github/workflows/ci-cd.yml | 2 +- package.json | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index f5fbf0e6e..5e7944f5d 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -58,7 +58,7 @@ new feature, make sure to include tests for it. If you are fixing a bug, make su information. When making a pull request we have a few requirements: - Tests must pass (`pnpm test`) -- Code must be linted (`pnpm lint`) +- Code must be linted (`pnpm eslint`) - Code must be formatted (`pnpm prettier`) - A clear and detailed description of the changes that you have done - Checkboxes for the changes you made diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 36576c886..529a93d41 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -18,7 +18,7 @@ - [ ] I've fixed bug. (_optional_ you can mention a issue if there is one) - [ ] I've corrected the spelling in README, documentation, etc. - [ ] I've tested my code. (`pnpm test`) -- [ ] I've check for issues. (`pnpm lint`) +- [ ] I've check for issues. (`pnpm eslint`) - [ ] I've fixed my formatting. (`pnpm prettier`) diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml index 01138f4b6..b9a8743e0 100644 --- a/.github/workflows/ci-cd.yml +++ b/.github/workflows/ci-cd.yml @@ -75,7 +75,7 @@ jobs: run: pnpm i - name: Check eslint - run: pnpm lint:check + run: pnpm eslint:check build: name: build diff --git a/package.json b/package.json index 0bb7c3602..8618abdc0 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,8 @@ "url": "https://github.com/Hypixel-API-Reborn/hypixel-api-reborn/issues" }, "scripts": { - "lint": "pnpm lint:check --fix", - "lint:check": "pnpm exec eslint", + "eslint:check": "pnpm exec eslint . ", + "eslint": "pnpm eslint:check --fix", "prettier:check": "pnpm exec prettier --check .", "prettier": "pnpm exec prettier --write .", "build": "pnpm exec tsc", From 27499d63ee9449aee538997513674d48253a0ff3 Mon Sep 17 00:00:00 2001 From: Jacob Date: Thu, 22 Jan 2026 14:06:19 +0800 Subject: [PATCH 114/124] fix(BedWars): Missind Slumber Data --- src/Structures/MiniGames/BedWars/BedWars.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/Structures/MiniGames/BedWars/BedWars.ts b/src/Structures/MiniGames/BedWars/BedWars.ts index 994d11dc9..cfdf0f694 100644 --- a/src/Structures/MiniGames/BedWars/BedWars.ts +++ b/src/Structures/MiniGames/BedWars/BedWars.ts @@ -29,6 +29,7 @@ import type { PlayerGeneralSelectedCosmetic, ShopSort } from '../../../Types/Player.js'; +import BedWarsSlumber from './BedWarsSlumber/BedWarsSlumber.ts'; class BedWars extends BedWarsMode { experience: number; @@ -72,6 +73,7 @@ class BedWars extends BedWarsMode { fourFour: BedWarsFourFour; twoFour: BedWarsTwoFour; castle: BedWarsMode; + slumber: BedWarsSlumber; constructor(data: Record) { super(data); this.experience = data?.Experience || 0; @@ -109,12 +111,13 @@ class BedWars extends BedWarsMode { this.figurines = new BedWarsFigurines(data?.figurines || {}); this.privateGameSettings = new BedWarsPrivateGameSettings(data?.privategames || {}); this.settings = new BedWarsSettings(data?.settings || {}); - this.eightOne = new BedWarsEightOne(data || {}); - this.eightTwo = new BedWarsEightTwo(data || {}); - this.fourThree = new BedWarsFourThree(data || {}); - this.fourFour = new BedWarsFourFour(data || {}); - this.twoFour = new BedWarsTwoFour(data || {}); + this.eightOne = new BedWarsEightOne(data); + this.eightTwo = new BedWarsEightTwo(data); + this.fourThree = new BedWarsFourThree(data); + this.fourFour = new BedWarsFourFour(data); + this.twoFour = new BedWarsTwoFour(data); this.castle = new BedWarsMode(data, 'castle'); + this.slumber = new BedWarsSlumber(data?.slumber || {}); } static getPrestige(level: number): BedWarsPrestige { From 5cae25dd194469100d8c1b81511a377db5f1418b Mon Sep 17 00:00:00 2001 From: Jacob Date: Sat, 24 Jan 2026 12:08:26 +0800 Subject: [PATCH 115/124] fix: eslint --- src/Structures/MiniGames/BedWars/BedWars.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Structures/MiniGames/BedWars/BedWars.ts b/src/Structures/MiniGames/BedWars/BedWars.ts index cfdf0f694..8f31dbd5b 100644 --- a/src/Structures/MiniGames/BedWars/BedWars.ts +++ b/src/Structures/MiniGames/BedWars/BedWars.ts @@ -8,6 +8,7 @@ import BedWarsFourThree from './BedWarsFourThree.ts'; import BedWarsMode from './BedWarsMode.js'; import BedWarsPrivateGameSettings from './BedWarsPrivateGameSettings.js'; import BedWarsSettings from './BedWarsSettings.js'; +import BedWarsSlumber from './BedWarsSlumber/BedWarsSlumber.ts'; import BedWarsTwoFour from './BedWarsTwoFour.ts'; import { BedWarsPrestiges } from '../../../Utils/Constants.js'; import type { @@ -29,7 +30,6 @@ import type { PlayerGeneralSelectedCosmetic, ShopSort } from '../../../Types/Player.js'; -import BedWarsSlumber from './BedWarsSlumber/BedWarsSlumber.ts'; class BedWars extends BedWarsMode { experience: number; From 0fd5e46d2aa0b447e3dbff0897f4e73fbeaddf7b Mon Sep 17 00:00:00 2001 From: Jacob Date: Sat, 24 Jan 2026 14:30:39 +0800 Subject: [PATCH 116/124] refactor(BlitzSurvivalGames) --- .../BlitzSurvivalGames.test.ts | 318 ++++++++++-------- .../BlitzSurvivalGames/BlitzSurvivalGames.ts | 238 +++++++------ .../BlitzSurvivalGamesData.ts | 77 +++++ .../BlitzSurvivalGamesKit.ts | 54 +-- .../BlitzSurvivalGamesPrivateGames.ts | 26 ++ src/Types/Player.ts | 190 ++++++++--- src/index.ts | 6 + 7 files changed, 581 insertions(+), 328 deletions(-) create mode 100644 src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesData.ts create mode 100644 src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesPrivateGames.ts diff --git a/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.test.ts b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.test.ts index 37eeb9632..251f856c3 100644 --- a/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.test.ts +++ b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.test.ts @@ -1,193 +1,215 @@ import BlitzSurvivalGames from './BlitzSurvivalGames.js'; -import BlitzSurvivalGamesKit from './BlitzSurvivalGamesKit.js'; +import BlitzSurvivalGamesPrivateGames from './BlitzSurvivalGamesPrivateGames.js'; +import LeaderboardSettings from '../Shared/LeaderboardSettings.js'; import { expect, expectTypeOf, test } from 'vitest'; -import type { BlitzSurvivalGamesKits } from '../../../Types/Player.js'; +import type { + BlitzSurvivalGamesAura, + BlitzSurvivalGamesFinisher, + BlitzSurvivalGamesKillEffect, + BlitzSurvivalGamesKitName, + BlitzSurvivalGamesLeaderboardSettingsMode, + BlitzSurvivalGamesTaunt, + BlitzSurvivalGamesVictoryDance +} from '../../../Types/Player.js'; test('BlitzSurvivalGames', () => { const data = new BlitzSurvivalGames({ stats: 'meow' }); expect(data).toBeDefined(); expect(data).toBeInstanceOf(BlitzSurvivalGames); expectTypeOf(data).toEqualTypeOf(); + expect(data.aura).toBeDefined(); + expectTypeOf(data.aura).toEqualTypeOf(); + expect(data.auraToggle).toBeDefined(); + expectTypeOf(data.auraToggle).toEqualTypeOf(); + expect(data.blood).toBeDefined(); + expectTypeOf(data.blood).toEqualTypeOf(); + expect(data.chosenTaunt).toBeDefined(); + expectTypeOf(data.chosenTaunt).toEqualTypeOf(); + expect(data.chosenVictoryDance).toBeDefined(); + expectTypeOf(data.chosenVictoryDance).toEqualTypeOf(); + expect(data.chosenFinisher).toBeDefined(); + expectTypeOf(data.chosenFinisher).toEqualTypeOf(); expect(data.coins).toBeDefined(); expect(data.coins).toBeGreaterThanOrEqual(0); expectTypeOf(data.coins).toEqualTypeOf(); - expect(data.kills).toBeDefined(); - expect(data.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.kills).toEqualTypeOf(); - expect(data.kit).toBeDefined(); - expectTypeOf(data.kit).toEqualTypeOf(); - expect(data.killsSolo).toBeDefined(); - expect(data.killsSolo).toBeGreaterThanOrEqual(0); - expectTypeOf(data.killsSolo).toEqualTypeOf(); - expect(data.killsTeams).toBeDefined(); - expect(data.killsTeams).toBeGreaterThanOrEqual(0); - expectTypeOf(data.killsTeams).toEqualTypeOf(); - expect(data.deaths).toBeDefined(); - expect(data.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.deaths).toEqualTypeOf(); - expect(data.KDR).toBeDefined(); - expect(data.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.KDR).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.winsSolo).toBeDefined(); - expect(data.winsSolo).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winsSolo).toEqualTypeOf(); - expect(data.winsTeam).toBeDefined(); - expect(data.winsTeam).toBeGreaterThanOrEqual(0); - expectTypeOf(data.winsTeam).toEqualTypeOf(); - expect(data.gamesPlayed).toBeDefined(); - expect(data.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.gamesPlayed).toEqualTypeOf(); - expect(data.losses).toBeDefined(); - expect(data.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.losses).toEqualTypeOf(); - expect(data.WLR).toBeDefined(); - expect(data.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.WLR).toEqualTypeOf(); - expect(data.arrowsShot).toBeDefined(); - expect(data.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arrowsShot).toEqualTypeOf(); - expect(data.arrowsHit).toBeDefined(); - expect(data.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arrowsHit).toEqualTypeOf(); - expect(data.bowAccuracy).toBeDefined(); - expect(data.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowAccuracy).toEqualTypeOf(); - expect(data.damage).toBeDefined(); - expect(data.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.damage).toEqualTypeOf(); - expect(data.damageTaken).toBeDefined(); - expect(data.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.damageTaken).toEqualTypeOf(); - expect(data.potionsDrunk).toBeDefined(); - expect(data.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.potionsDrunk).toEqualTypeOf(); - expect(data.potionsThrown).toBeDefined(); - expect(data.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.potionsThrown).toEqualTypeOf(); - expect(data.mobsSpawned).toBeDefined(); - expect(data.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.mobsSpawned).toEqualTypeOf(); - expect(data.playTime).toBeDefined(); - expect(data.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.playTime).toEqualTypeOf(); - expect(data.blitzUses).toBeDefined(); - expect(data.blitzUses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.blitzUses).toEqualTypeOf(); - expect(data.chestsOpened).toBeDefined(); - expect(data.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.chestsOpened).toEqualTypeOf(); + expect(data.packages).toBeDefined(); + expectTypeOf(data.packages).toEqualTypeOf(); + expect(data.monthlyKills).toBeDefined(); + expect(data.monthlyKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.monthlyKills).toEqualTypeOf(); + expect(data.monthlyKillsA).toBeDefined(); + expect(data.monthlyKillsA).toBeGreaterThanOrEqual(0); + expectTypeOf(data.monthlyKillsA).toEqualTypeOf(); + expect(data.monthlyKillsB).toBeDefined(); + expect(data.monthlyKillsB).toBeGreaterThanOrEqual(0); + expectTypeOf(data.monthlyKillsB).toEqualTypeOf(); + expect(data.weeklyKills).toBeDefined(); + expect(data.weeklyKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.weeklyKills).toEqualTypeOf(); + expect(data.weeklyKillsA).toBeDefined(); + expect(data.weeklyKillsA).toBeGreaterThanOrEqual(0); + expectTypeOf(data.weeklyKillsA).toEqualTypeOf(); + expect(data.weeklyKillsB).toBeDefined(); + expect(data.weeklyKillsB).toBeGreaterThanOrEqual(0); + expectTypeOf(data.weeklyKillsB).toEqualTypeOf(); + expect(data.autoArmor).toBeDefined(); + expectTypeOf(data.autoArmor).toEqualTypeOf(); + expect(data.defaultKit).toBeDefined(); + expectTypeOf(data.defaultKit).toEqualTypeOf(); + expect(data.combatTracker).toBeDefined(); + expectTypeOf(data.combatTracker).toEqualTypeOf(); + expect(data.alternativeKillMessageEnabled).toBeDefined(); + expectTypeOf(data.alternativeKillMessageEnabled).toEqualTypeOf(); + expect(data.prefersFullKitsMenu).toBeDefined(); + expectTypeOf(data.prefersFullKitsMenu).toEqualTypeOf(); + expect(data.disablePrestigeFinisher).toBeDefined(); + expectTypeOf(data.disablePrestigeFinisher).toEqualTypeOf(); + expect(data.toggled).toBeDefined(); + expectTypeOf(data.toggled).toEqualTypeOf(); + expect(data.fancyMode).toBeDefined(); + expectTypeOf(data.fancyMode).toEqualTypeOf(); + expect(data.afterKillEffect).toBeDefined(); + expectTypeOf(data.afterKillEffect).toEqualTypeOf(); + expect(data.leaderboardSettings).toBeDefined(); + expectTypeOf(data.leaderboardSettings).toEqualTypeOf< + LeaderboardSettings + >(); + expect(data.privateGames).toBeDefined(); + expect(data.privateGames).toBeInstanceOf(BlitzSurvivalGamesPrivateGames); + expectTypeOf(data.privateGames).toEqualTypeOf(); + expect(data.arachnologist).toBeDefined(); + expect(data.arachnologist).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.arachnologist).toEqualTypeOf(); expect(data.archer).toBeDefined(); expect(data.archer).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.archer).toEqualTypeOf(); - expect(data.meatmaster).toBeDefined(); - expect(data.meatmaster).toBeInstanceOf(BlitzSurvivalGamesKit); - expectTypeOf(data.meatmaster).toEqualTypeOf(); - expect(data.speleologist).toBeDefined(); - expect(data.speleologist).toBeInstanceOf(BlitzSurvivalGamesKit); - expectTypeOf(data.speleologist).toEqualTypeOf(); + expect(data.armorer).toBeDefined(); + expect(data.armorer).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.armorer).toEqualTypeOf(); + expect(data.astronaut).toBeDefined(); + expect(data.astronaut).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.astronaut).toEqualTypeOf(); + expect(data.backup).toBeDefined(); + expect(data.backup).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.backup).toEqualTypeOf(); expect(data.baker).toBeDefined(); expect(data.baker).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.baker).toEqualTypeOf(); - expect(data.knight).toBeDefined(); - expect(data.knight).toBeInstanceOf(BlitzSurvivalGamesKit); - expectTypeOf(data.knight).toEqualTypeOf(); + expect(data.blaze).toBeDefined(); + expect(data.blaze).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.blaze).toEqualTypeOf(); + expect(data.creepertamer).toBeDefined(); + expect(data.creepertamer).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.creepertamer).toEqualTypeOf(); + expect(data.diver).toBeDefined(); + expect(data.diver).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.diver).toEqualTypeOf(); + expect(data.donkeytamer).toBeDefined(); + expect(data.donkeytamer).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.donkeytamer).toEqualTypeOf(); + expect(data.farmer).toBeDefined(); + expect(data.farmer).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.farmer).toEqualTypeOf(); + expect(data.fisherman).toBeDefined(); + expect(data.fisherman).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.fisherman).toEqualTypeOf(); + expect(data.florist).toBeDefined(); + expect(data.florist).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.florist).toEqualTypeOf(); + expect(data.golem).toBeDefined(); + expect(data.golem).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.golem).toEqualTypeOf(); expect(data.guardian).toBeDefined(); expect(data.guardian).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.guardian).toEqualTypeOf(); - expect(data.scout).toBeDefined(); - expect(data.scout).toBeInstanceOf(BlitzSurvivalGamesKit); - expectTypeOf(data.scout).toEqualTypeOf(); + expect(data.horsetamer).toBeDefined(); + expect(data.horsetamer).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.horsetamer).toEqualTypeOf(); expect(data.hunter).toBeDefined(); expect(data.hunter).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.hunter).toEqualTypeOf(); expect(data.hypeTrain).toBeDefined(); expect(data.hypeTrain).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.hypeTrain).toEqualTypeOf(); - expect(data.fisherman).toBeDefined(); - expect(data.fisherman).toBeInstanceOf(BlitzSurvivalGamesKit); - expectTypeOf(data.fisherman).toEqualTypeOf(); - expect(data.armorer).toBeDefined(); - expect(data.armorer).toBeInstanceOf(BlitzSurvivalGamesKit); - expectTypeOf(data.armorer).toEqualTypeOf(); - expect(data.horsetamer).toBeDefined(); - expect(data.horsetamer).toBeInstanceOf(BlitzSurvivalGamesKit); - expectTypeOf(data.horsetamer).toEqualTypeOf(); - expect(data.astronaut).toBeDefined(); - expect(data.astronaut).toBeInstanceOf(BlitzSurvivalGamesKit); - expectTypeOf(data.astronaut).toEqualTypeOf(); - expect(data.troll).toBeDefined(); - expect(data.troll).toBeInstanceOf(BlitzSurvivalGamesKit); - expectTypeOf(data.troll).toEqualTypeOf(); + expect(data.jockey).toBeDefined(); + expect(data.jockey).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.jockey).toEqualTypeOf(); + expect(data.knight).toBeDefined(); + expect(data.knight).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.knight).toEqualTypeOf(); + expect(data.meatmaster).toBeDefined(); + expect(data.meatmaster).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.meatmaster).toEqualTypeOf(); + expect(data.milkman).toBeDefined(); + expect(data.milkman).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.milkman).toEqualTypeOf(); + expect(data.necromancer).toBeDefined(); + expect(data.necromancer).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.necromancer).toEqualTypeOf(); + expect(data.paladin).toBeDefined(); + expect(data.paladin).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.paladin).toEqualTypeOf(); + expect(data.phoenix).toBeDefined(); + expect(data.phoenix).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.phoenix).toEqualTypeOf(); + expect(data.pigman).toBeDefined(); + expect(data.pigman).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.pigman).toEqualTypeOf(); + expect(data.rambo).toBeDefined(); + expect(data.rambo).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.rambo).toEqualTypeOf(); + expect(data.random).toBeDefined(); + expect(data.random).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.random).toEqualTypeOf(); + expect(data.ranger).toBeDefined(); + expect(data.ranger).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.ranger).toEqualTypeOf(); expect(data.reaper).toBeDefined(); expect(data.reaper).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.reaper).toEqualTypeOf(); - expect(data.shark).toBeDefined(); - expect(data.shark).toBeInstanceOf(BlitzSurvivalGamesKit); - expectTypeOf(data.shark).toEqualTypeOf(); expect(data.reddragon).toBeDefined(); expect(data.reddragon).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.reddragon).toEqualTypeOf(); - expect(data.toxicologist).toBeDefined(); - expect(data.toxicologist).toBeInstanceOf(BlitzSurvivalGamesKit); - expectTypeOf(data.toxicologist).toEqualTypeOf(); expect(data.rogue).toBeDefined(); expect(data.rogue).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.rogue).toEqualTypeOf(); - expect(data.warlock).toBeDefined(); - expect(data.warlock).toBeInstanceOf(BlitzSurvivalGamesKit); - expectTypeOf(data.warlock).toEqualTypeOf(); + expect(data.scout).toBeDefined(); + expect(data.scout).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.scout).toEqualTypeOf(); + expect(data.shadowKnight).toBeDefined(); + expect(data.shadowKnight).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.shadowKnight).toEqualTypeOf(); + expect(data.shark).toBeDefined(); + expect(data.shark).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.shark).toEqualTypeOf(); expect(data.slimeyslime).toBeDefined(); expect(data.slimeyslime).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.slimeyslime).toEqualTypeOf(); - expect(data.jockey).toBeDefined(); - expect(data.jockey).toBeInstanceOf(BlitzSurvivalGamesKit); - expectTypeOf(data.jockey).toEqualTypeOf(); - expect(data.golem).toBeDefined(); - expect(data.golem).toBeInstanceOf(BlitzSurvivalGamesKit); - expectTypeOf(data.golem).toEqualTypeOf(); + expect(data.snowman).toBeDefined(); + expect(data.snowman).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.snowman).toEqualTypeOf(); + expect(data.speleologist).toBeDefined(); + expect(data.speleologist).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.speleologist).toEqualTypeOf(); + expect(data.tim).toBeDefined(); + expect(data.tim).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.tim).toEqualTypeOf(); + expect(data.toxicologist).toBeDefined(); + expect(data.toxicologist).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.toxicologist).toEqualTypeOf(); + expect(data.troll).toBeDefined(); + expect(data.troll).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.troll).toEqualTypeOf(); expect(data.viking).toBeDefined(); expect(data.viking).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.viking).toEqualTypeOf(); - expect(data.shadowKnight).toBeDefined(); - expect(data.shadowKnight).toBeInstanceOf(BlitzSurvivalGamesKit); - expectTypeOf(data.shadowKnight).toEqualTypeOf(); - expect(data.pigman).toBeDefined(); - expect(data.pigman).toBeInstanceOf(BlitzSurvivalGamesKit); - expectTypeOf(data.pigman).toEqualTypeOf(); - expect(data.paladin).toBeDefined(); - expect(data.paladin).toBeInstanceOf(BlitzSurvivalGamesKit); - expectTypeOf(data.paladin).toEqualTypeOf(); - expect(data.necromancer).toBeDefined(); - expect(data.necromancer).toBeInstanceOf(BlitzSurvivalGamesKit); - expectTypeOf(data.necromancer).toEqualTypeOf(); - expect(data.florist).toBeDefined(); - expect(data.florist).toBeInstanceOf(BlitzSurvivalGamesKit); - expectTypeOf(data.florist).toEqualTypeOf(); - expect(data.diver).toBeDefined(); - expect(data.diver).toBeInstanceOf(BlitzSurvivalGamesKit); - expectTypeOf(data.diver).toEqualTypeOf(); - expect(data.arachnologist).toBeDefined(); - expect(data.arachnologist).toBeInstanceOf(BlitzSurvivalGamesKit); - expectTypeOf(data.arachnologist).toEqualTypeOf(); - expect(data.blaze).toBeDefined(); - expect(data.blaze).toBeInstanceOf(BlitzSurvivalGamesKit); - expectTypeOf(data.blaze).toEqualTypeOf(); + expect(data.warlock).toBeDefined(); + expect(data.warlock).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.warlock).toEqualTypeOf(); + expect(data.warrior).toBeDefined(); + expect(data.warrior).toBeInstanceOf(BlitzSurvivalGamesKit); + expectTypeOf(data.warrior).toEqualTypeOf(); expect(data.wolftamer).toBeDefined(); expect(data.wolftamer).toBeInstanceOf(BlitzSurvivalGamesKit); expectTypeOf(data.wolftamer).toEqualTypeOf(); - expect(data.tim).toBeDefined(); - expect(data.tim).toBeInstanceOf(BlitzSurvivalGamesKit); - expectTypeOf(data.tim).toEqualTypeOf(); - expect(data.farmer).toBeDefined(); - expect(data.farmer).toBeInstanceOf(BlitzSurvivalGamesKit); - expectTypeOf(data.farmer).toEqualTypeOf(); - expect(data.creepertamer).toBeDefined(); - expect(data.creepertamer).toBeInstanceOf(BlitzSurvivalGamesKit); - expectTypeOf(data.creepertamer).toEqualTypeOf(); - expect(data.snowman).toBeDefined(); - expect(data.snowman).toBeInstanceOf(BlitzSurvivalGamesKit); - expectTypeOf(data.snowman).toEqualTypeOf(); }); diff --git a/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.ts b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.ts index 660056293..647282396 100644 --- a/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.ts +++ b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.ts @@ -1,131 +1,163 @@ -import BlitzSurvivalGamesKit from './BlitzSurvivalGamesKit.js'; -import Divide from '../../../Utils/Divide.js'; -import type { BlitzSurvivalGamesKits } from '../../../Types/Player.js'; +import BlitzSurvivalGamesData from './BlitzSurvivalGamesData.ts'; +import BlitzSurvivalGamesKit from './BlitzSurvivalGamesKit.ts'; +import BlitzSurvivalGamesPrivateGames from './BlitzSurvivalGamesPrivateGames.ts'; +import LeaderboardSettings from '../Shared/LeaderboardSettings.js'; +import { monthAB } from '../../../Utils/Oscillation.ts'; +import type { + BlitzSurvivalGamesAura, + BlitzSurvivalGamesFinisher, + BlitzSurvivalGamesKillEffect, + BlitzSurvivalGamesKitName, + BlitzSurvivalGamesLeaderboardSettingsMode, + BlitzSurvivalGamesTaunt, + BlitzSurvivalGamesVictoryDance +} from '../../../Types/Player.ts'; -class BlitzSurvivalGames { +class BlitzSurvivalGames extends BlitzSurvivalGamesData { + aura: BlitzSurvivalGamesAura | 'UNKNOWN'; + auraToggle: boolean; + blood: boolean; + chosenTaunt: BlitzSurvivalGamesTaunt; + chosenVictoryDance: BlitzSurvivalGamesVictoryDance | 'UNKNOWN'; + chosenFinisher: BlitzSurvivalGamesFinisher | 'UNKNOWN'; coins: number; - kills: number; - kit: BlitzSurvivalGamesKits | 'None'; - killsSolo: number; - killsTeams: number; - deaths: number; - KDR: number; - wins: number; - winsSolo: number; - winsTeam: number; - gamesPlayed: number; - losses: number; - WLR: number; - arrowsShot: number; - arrowsHit: number; - bowAccuracy: number; - damage: number; - damageTaken: number; - potionsDrunk: number; - potionsThrown: number; - mobsSpawned: number; - playTime: number; - blitzUses: number; - chestsOpened: number; + packages: string[]; + monthlyKills: number; + monthlyKillsA: number; + monthlyKillsB: number; + weeklyKills: number; + weeklyKillsA: number; + weeklyKillsB: number; + autoArmor: boolean; + defaultKit: BlitzSurvivalGamesKitName | 'UNKNOWN'; + combatTracker: boolean; + alternativeKillMessageEnabled: boolean; + prefersFullKitsMenu: boolean; + disablePrestigeFinisher: boolean; + toggled: boolean; + fancyMode: boolean; + afterKillEffect: BlitzSurvivalGamesKillEffect; + leaderboardSettings: LeaderboardSettings; + privateGames: BlitzSurvivalGamesPrivateGames; + arachnologist: BlitzSurvivalGamesKit; archer: BlitzSurvivalGamesKit; - meatmaster: BlitzSurvivalGamesKit; - speleologist: BlitzSurvivalGamesKit; + armorer: BlitzSurvivalGamesKit; + astronaut: BlitzSurvivalGamesKit; + backup: BlitzSurvivalGamesKit; baker: BlitzSurvivalGamesKit; - knight: BlitzSurvivalGamesKit; + blaze: BlitzSurvivalGamesKit; + creepertamer: BlitzSurvivalGamesKit; + diver: BlitzSurvivalGamesKit; + donkeytamer: BlitzSurvivalGamesKit; + farmer: BlitzSurvivalGamesKit; + fisherman: BlitzSurvivalGamesKit; + florist: BlitzSurvivalGamesKit; + golem: BlitzSurvivalGamesKit; guardian: BlitzSurvivalGamesKit; - scout: BlitzSurvivalGamesKit; + horsetamer: BlitzSurvivalGamesKit; hunter: BlitzSurvivalGamesKit; hypeTrain: BlitzSurvivalGamesKit; - fisherman: BlitzSurvivalGamesKit; - armorer: BlitzSurvivalGamesKit; - horsetamer: BlitzSurvivalGamesKit; - astronaut: BlitzSurvivalGamesKit; - troll: BlitzSurvivalGamesKit; + jockey: BlitzSurvivalGamesKit; + knight: BlitzSurvivalGamesKit; + meatmaster: BlitzSurvivalGamesKit; + milkman: BlitzSurvivalGamesKit; + necromancer: BlitzSurvivalGamesKit; + paladin: BlitzSurvivalGamesKit; + phoenix: BlitzSurvivalGamesKit; + pigman: BlitzSurvivalGamesKit; + rambo: BlitzSurvivalGamesKit; + random: BlitzSurvivalGamesKit; + ranger: BlitzSurvivalGamesKit; reaper: BlitzSurvivalGamesKit; - shark: BlitzSurvivalGamesKit; reddragon: BlitzSurvivalGamesKit; - toxicologist: BlitzSurvivalGamesKit; rogue: BlitzSurvivalGamesKit; - warlock: BlitzSurvivalGamesKit; + scout: BlitzSurvivalGamesKit; + shadowKnight: BlitzSurvivalGamesKit; + shark: BlitzSurvivalGamesKit; slimeyslime: BlitzSurvivalGamesKit; - jockey: BlitzSurvivalGamesKit; - golem: BlitzSurvivalGamesKit; + snowman: BlitzSurvivalGamesKit; + speleologist: BlitzSurvivalGamesKit; + tim: BlitzSurvivalGamesKit; + toxicologist: BlitzSurvivalGamesKit; + troll: BlitzSurvivalGamesKit; viking: BlitzSurvivalGamesKit; - shadowKnight: BlitzSurvivalGamesKit; - pigman: BlitzSurvivalGamesKit; - paladin: BlitzSurvivalGamesKit; - necromancer: BlitzSurvivalGamesKit; - florist: BlitzSurvivalGamesKit; - diver: BlitzSurvivalGamesKit; - arachnologist: BlitzSurvivalGamesKit; - blaze: BlitzSurvivalGamesKit; + warlock: BlitzSurvivalGamesKit; + warrior: BlitzSurvivalGamesKit; wolftamer: BlitzSurvivalGamesKit; - tim: BlitzSurvivalGamesKit; - farmer: BlitzSurvivalGamesKit; - creepertamer: BlitzSurvivalGamesKit; - snowman: BlitzSurvivalGamesKit; constructor(data: Record) { - this.coins = data?.coins || data?.tokens || 0; - this.kills = data?.kills || 0; - this.kit = data?.defaultkit || 'None'; - this.killsSolo = data?.kills_solo_normal || 0; - this.killsTeams = data?.kills_teams_normal || 0; - this.deaths = data?.deaths || 0; - this.KDR = Divide(this.kills, this.deaths); - this.wins = data?.wins || 0; - this.winsSolo = data?.wins_solo_normal || 0; - this.winsTeam = data?.wins_teams || 0; - this.gamesPlayed = data?.games_played || 0; - this.losses = this.gamesPlayed - this.wins; - this.WLR = Divide(this.wins, this.losses); - this.arrowsShot = data?.arrows_fired || 0; - this.arrowsHit = data?.arrows_hit || 0; - this.bowAccuracy = Divide(this.arrowsHit, this.arrowsShot); - this.damage = data?.damage || 0; - this.damageTaken = data?.damage_taken || 0; - this.potionsDrunk = data?.potions_drunk || 0; - this.potionsThrown = data?.potions_thrown || 0; - this.mobsSpawned = data?.mobs_spawned || 0; - this.playTime = data?.time_played || 0; - this.blitzUses = data?.blitz_uses || 0; - this.chestsOpened = data?.chests_opened || 0; + super(data); + this.aura = data?.aura || 'UNKNOWN'; + this.auraToggle = data?.auratoggle || false; + this.blood = data?.blood || true; + this.chosenTaunt = data?.chosen_taunt || 'DEFAULT'; + this.chosenVictoryDance = data?.chosen_victorydance || 'UNKNOWN'; + this.chosenFinisher = data?.chosen_finisher || 'UNKNOWN'; + this.coins = data?.coins || 0; + this.packages = data?.packages || []; + this.monthlyKills = parseInt(data?.[`monthly_kills_${monthAB()}`] || 0, 10); + this.monthlyKillsA = data?.monthly_kills_a || 0; + this.monthlyKillsB = data?.monthly_kills_b || 0; + this.weeklyKills = parseInt(data?.[`weekly_kills_${monthAB()}`] || 0, 10); + this.weeklyKillsA = data?.weekly_kills_a || 0; + this.weeklyKillsB = data?.weekly_kills_b || 0; + this.autoArmor = data?.autoarmor || true; + this.defaultKit = data?.defaultkit || 'UNKNOWN'; + this.combatTracker = data?.combatTracker || true; + this.alternativeKillMessageEnabled = data?.alternative_kill_message_enabled || true; + this.prefersFullKitsMenu = data?.prefers_full_kits_menu || true; + this.disablePrestigeFinisher = data?.disableprestigefinisher || true; + this.toggled = data?.toggled || true; + this.fancyMode = data?.fancyMode || false; + this.afterKillEffect = data?.afterkill || 'rapid_fire'; + this.leaderboardSettings = new LeaderboardSettings( + data?.leaderboardSettings || {} + ); + this.privateGames = new BlitzSurvivalGamesPrivateGames(data?.privategames || {}); + this.arachnologist = new BlitzSurvivalGamesKit(data, 'arachnologist'); this.archer = new BlitzSurvivalGamesKit(data, 'archer'); - this.meatmaster = new BlitzSurvivalGamesKit(data, 'meatmaster'); - this.speleologist = new BlitzSurvivalGamesKit(data, 'speleologist'); + this.armorer = new BlitzSurvivalGamesKit(data, 'armorer'); + this.astronaut = new BlitzSurvivalGamesKit(data, 'astronaut'); + this.backup = new BlitzSurvivalGamesKit(data, 'backup'); this.baker = new BlitzSurvivalGamesKit(data, 'baker'); - this.knight = new BlitzSurvivalGamesKit(data, 'knight'); + this.blaze = new BlitzSurvivalGamesKit(data, 'blaze'); + this.creepertamer = new BlitzSurvivalGamesKit(data, 'creepertamer'); + this.diver = new BlitzSurvivalGamesKit(data, 'diver'); + this.donkeytamer = new BlitzSurvivalGamesKit(data, 'donkeytamer'); + this.farmer = new BlitzSurvivalGamesKit(data, 'farmer'); + this.fisherman = new BlitzSurvivalGamesKit(data, 'fisherman'); + this.florist = new BlitzSurvivalGamesKit(data, 'florist'); + this.golem = new BlitzSurvivalGamesKit(data, 'golem'); this.guardian = new BlitzSurvivalGamesKit(data, 'guardian'); - this.scout = new BlitzSurvivalGamesKit(data, 'scout'); + this.horsetamer = new BlitzSurvivalGamesKit(data, 'horsetamer'); this.hunter = new BlitzSurvivalGamesKit(data, 'hunter'); this.hypeTrain = new BlitzSurvivalGamesKit(data, 'hype train'); - this.fisherman = new BlitzSurvivalGamesKit(data, 'fisherman'); - this.armorer = new BlitzSurvivalGamesKit(data, 'armorer'); - this.horsetamer = new BlitzSurvivalGamesKit(data, 'horsetamer'); - this.astronaut = new BlitzSurvivalGamesKit(data, 'astronaut'); - this.troll = new BlitzSurvivalGamesKit(data, 'troll'); + this.jockey = new BlitzSurvivalGamesKit(data, 'jockey'); + this.knight = new BlitzSurvivalGamesKit(data, 'knight'); + this.meatmaster = new BlitzSurvivalGamesKit(data, 'meatmaster'); + this.milkman = new BlitzSurvivalGamesKit(data, 'milkman'); + this.necromancer = new BlitzSurvivalGamesKit(data, 'necromancer'); + this.paladin = new BlitzSurvivalGamesKit(data, 'paladin'); + this.phoenix = new BlitzSurvivalGamesKit(data, 'phoenix'); + this.pigman = new BlitzSurvivalGamesKit(data, 'pigman'); + this.rambo = new BlitzSurvivalGamesKit(data, 'rambo'); + this.random = new BlitzSurvivalGamesKit(data, 'random'); + this.ranger = new BlitzSurvivalGamesKit(data, 'ranger'); this.reaper = new BlitzSurvivalGamesKit(data, 'reaper'); - this.shark = new BlitzSurvivalGamesKit(data, 'shark'); this.reddragon = new BlitzSurvivalGamesKit(data, 'reddragon'); - this.toxicologist = new BlitzSurvivalGamesKit(data, 'toxicologist'); this.rogue = new BlitzSurvivalGamesKit(data, 'rogue'); - this.warlock = new BlitzSurvivalGamesKit(data, 'warlock'); + this.scout = new BlitzSurvivalGamesKit(data, 'scout'); + this.shadowKnight = new BlitzSurvivalGamesKit(data, 'shadow knight'); + this.shark = new BlitzSurvivalGamesKit(data, 'shark'); this.slimeyslime = new BlitzSurvivalGamesKit(data, 'slimeyslime'); - this.jockey = new BlitzSurvivalGamesKit(data, 'jockey'); - this.golem = new BlitzSurvivalGamesKit(data, 'golem'); + this.snowman = new BlitzSurvivalGamesKit(data, 'snowman'); + this.speleologist = new BlitzSurvivalGamesKit(data, 'speleologist'); + this.tim = new BlitzSurvivalGamesKit(data, 'tim'); + this.toxicologist = new BlitzSurvivalGamesKit(data, 'toxicologist'); + this.troll = new BlitzSurvivalGamesKit(data, 'troll'); this.viking = new BlitzSurvivalGamesKit(data, 'viking'); - this.shadowKnight = new BlitzSurvivalGamesKit(data, 'shadow knight'); - this.pigman = new BlitzSurvivalGamesKit(data, 'pigman'); - this.paladin = new BlitzSurvivalGamesKit(data, 'paladin'); - this.necromancer = new BlitzSurvivalGamesKit(data, 'necromancer'); - this.florist = new BlitzSurvivalGamesKit(data, 'florist'); - this.diver = new BlitzSurvivalGamesKit(data, 'diver'); - this.arachnologist = new BlitzSurvivalGamesKit(data, 'arachnologist'); - this.blaze = new BlitzSurvivalGamesKit(data, 'blaze'); + this.warlock = new BlitzSurvivalGamesKit(data, 'warlock'); + this.warrior = new BlitzSurvivalGamesKit(data, 'warrior'); this.wolftamer = new BlitzSurvivalGamesKit(data, 'wolftamer'); - this.tim = new BlitzSurvivalGamesKit(data, 'tim'); - this.farmer = new BlitzSurvivalGamesKit(data, 'farmer'); - this.creepertamer = new BlitzSurvivalGamesKit(data, 'creepertamer'); - this.snowman = new BlitzSurvivalGamesKit(data, 'snowman'); } } diff --git a/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesData.ts b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesData.ts new file mode 100644 index 000000000..02ef91605 --- /dev/null +++ b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesData.ts @@ -0,0 +1,77 @@ +import Divide from '../../../Utils/Divide.ts'; +import { ParseModeAfter } from '../../../Utils/ParseMode.ts'; +import type { BlitzSurvivalGamesKitId } from '../../../Types/Player.ts'; + +class BlitzSurvivalGamesData { + wins: number; + winsTeams: number; + gamesPlayed: number; + losses: number; + WLRatio: number; + arrowsHit: number; + arrowsFired: number; + bowAccuracy: number; + blocksTraveledBoat: number; + blocksTraveledHorse: number; + blocksTraveledMinecart: number; + blocksTraveledPig: number; + bottlesThrown: number; + chestsOpened: number; + damage: number; + damageTaken: number; + eggsCollected: number; + eggsThrown: number; + explosiveKills: number; + fallDamage: number; + fallKills: number; + itemsEnchanted: number; + kills: number; + deaths: number; + KDRatio: number; + mobsSpawned: number; + potionsDrunk: number; + potionsThrown: number; + railsPlaced: number; + snowballsThrown: number; + tauntKills: number; + timePlayed: number; + tntPlaced: number; + constructor(data: Record, kitName?: BlitzSurvivalGamesKitId) { + kitName = ParseModeAfter(kitName) as BlitzSurvivalGamesKitId; + this.wins = data?.[`wins${kitName}`] || 0; + this.winsTeams = data?.[`wins_teams${kitName}`] || 0; + this.gamesPlayed = data?.[`games_played${kitName}`] || 0; + this.losses = this.gamesPlayed - this.wins; + this.WLRatio = Divide(this.wins, this.losses); + this.arrowsHit = data?.[`arrows_hit${kitName}`] || 0; + this.arrowsFired = data?.[`arrows_fired${kitName}`] || 0; + this.bowAccuracy = Divide(this.arrowsHit, this.arrowsFired); + this.blocksTraveledBoat = data?.[`blocks_traveled_boat${kitName}`] || 0; + this.blocksTraveledHorse = data?.[`blocks_traveled_horse${kitName}`] || 0; + this.blocksTraveledMinecart = data?.[`blocks_traveled_minecart${kitName}`] || 0; + this.blocksTraveledPig = data?.[`blocks_traveled_pig${kitName}`] || 0; + this.bottlesThrown = data?.[`bottles_thrown${kitName}`] || 0; + this.chestsOpened = data?.[`chests_opened${kitName}`] || 0; + this.damage = data?.[`damage${kitName}`] || 0; + this.damageTaken = data?.[`damage_taken${kitName}`] || 0; + this.eggsCollected = data?.[`eggs_collected${kitName}`] || 0; + this.eggsThrown = data?.[`eggs_thrown${kitName}`] || 0; + this.explosiveKills = data?.[`explosive_kills${kitName}`] || 0; + this.fallDamage = data?.[`fall_damage${kitName}`] || 0; + this.fallKills = data?.[`fall_kills${kitName}`] || 0; + this.itemsEnchanted = data?.[`items_enchanted${kitName}`] || 0; + this.kills = data?.[`kills${kitName}`] || 0; + this.deaths = data?.[`deaths_${kitName}`] || 0; + this.KDRatio = Divide(this.kills, this.deaths); + this.mobsSpawned = data?.[`mobs_spawned${kitName}`] || 0; + this.potionsDrunk = data?.[`potions_drunk${kitName}`] || 0; + this.potionsThrown = data?.[`potions_thrown${kitName}`] || 0; + this.railsPlaced = data?.[`rails_placed${kitName}`] || 0; + this.snowballsThrown = data?.[`snowballs_thrown${kitName}`] || 0; + this.tauntKills = data?.[`taunt_kills${kitName}`] || 0; + this.timePlayed = data?.[`time_played${kitName}`] || 0; + this.tntPlaced = data?.[`tnt_placed${kitName}`] || 0; + } +} + +export default BlitzSurvivalGamesData; diff --git a/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesKit.ts b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesKit.ts index 185688ac3..373ec3287 100644 --- a/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesKit.ts +++ b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesKit.ts @@ -1,46 +1,22 @@ -import Divide from '../../../Utils/Divide.js'; -import type { BlitzSurvivalGamesKits } from '../../../Types/Player.js'; +import BlitzSurvivalGamesData from './BlitzSurvivalGamesData.ts'; +import { ParseModeAfter } from '../../../Utils/ParseMode.ts'; +import type { BlitzSurvivalGamesKitId } from '../../../Types/Player.ts'; -class BlitzSurvivalGamesKit { +class BlitzSurvivalGamesKit extends BlitzSurvivalGamesData { level: number; exp: number; - kills: number; - deaths: number; - KDR: number; - wins: number; - gamesPlayed: number; - losses: number; - WLR: number; - arrowsShot: number; - arrowsHit: number; - bowAccuracy: number; - damage: number; - damageTaken: number; - potionsDrunk: number; - potionsThrown: number; - playTime: number; - mobsSpawned: number; - chestsOpened: number; - constructor(data: Record, kitName: BlitzSurvivalGamesKits) { + prestige: number; + inventory: Record; + constructor(data: Record, kitName: BlitzSurvivalGamesKitId) { + super(data, kitName); this.level = data?.[kitName] || 0; - this.exp = data?.[`exp_${kitName}`] || 0; - this.kills = data?.[`kills_${kitName}`] || 0; - this.deaths = data?.[`deaths_${kitName}`] || 0; - this.KDR = Divide(this.kills, this.deaths); - this.wins = data?.[`wins_${kitName}`] || 0; - this.gamesPlayed = data?.[`games_played_${kitName}`] || 0; - this.losses = this.gamesPlayed - this.wins; - this.WLR = Divide(this.wins, this.losses); - this.arrowsShot = data?.[`arrows_fired_${kitName}`] || 0; - this.arrowsHit = data?.[`arrows_hit_${kitName}`] || 0; - this.bowAccuracy = Divide(this.arrowsHit, this.arrowsShot); - this.damage = data?.[`damage_${kitName}`] || 0; - this.damageTaken = data?.[`damage_taken_${kitName}`] || 0; - this.potionsDrunk = data?.[`potions_drunk_${kitName}`] || 0; - this.potionsThrown = data?.[`potions_thrown_${kitName}`] || 0; - this.playTime = data?.[`time_played_${kitName}`] || 0; - this.mobsSpawned = data?.[`mobs_spawned_${kitName}`] || 0; - this.chestsOpened = data?.[`chests_opened_${kitName}`] || 0; + kitName = ParseModeAfter(kitName) as BlitzSurvivalGamesKitId; + this.exp = data?.[`exp${kitName}`] || 0; + this.prestige = data?.[`p${kitName}`] || 0; + this.inventory = + data?.[ + `${kitName.replaceAll('_', '').charAt(0).toUpperCase()}${kitName.replaceAll('_', '').slice(1)}Inventory` + ] || {}; } } diff --git a/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesPrivateGames.ts b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesPrivateGames.ts new file mode 100644 index 000000000..8d78005a0 --- /dev/null +++ b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesPrivateGames.ts @@ -0,0 +1,26 @@ +import type { + BlitzSurvivalGamesPrivateGamesExtraStars, + PrivateGameSettingsGameSpeed, + PrivateGameSettingsHealthBuff +} from '../../../Types/Player.ts'; + +class BlitzSurvivalGamesPrivateGames { + healthBuff: PrivateGameSettingsHealthBuff | 'UNKNOWN'; + lowGravity: boolean; + speed: PrivateGameSettingsGameSpeed | 'UNKNOWN'; + extraBlitzStars: BlitzSurvivalGamesPrivateGamesExtraStars; + oneHitOneKill: boolean; + nightTime: boolean; + noKits: boolean; + constructor(data: Record) { + this.healthBuff = data?.health_buff || 'UNKNOWN'; + this.lowGravity = data?.low_gravity || false; + this.speed = data?.speed || 'UNKNOWN'; + this.extraBlitzStars = data?.extra_blitz_stars || '1 Star - Normal'; + this.oneHitOneKill = data?.one_hit_one_kill_blitz || false; + this.nightTime = data?.enable_night_time || false; + this.noKits = data?.no_kits || false; + } +} + +export default BlitzSurvivalGamesPrivateGames; diff --git a/src/Types/Player.ts b/src/Types/Player.ts index 9df78448f..1bf5e6e6d 100644 --- a/src/Types/Player.ts +++ b/src/Types/Player.ts @@ -25,44 +25,6 @@ export type MegaWallsModes = 'face_off' | 'gvg'; export type SpeedUHCModes = 'solo' | 'solo_normal' | 'solo_insane' | 'team' | 'team_normal' | 'team_insane'; export type UHCModes = 'solo' | 'red_vs_blue' | 'no_diamonds' | 'brawl' | 'solo_brawl' | 'duo_brawl'; export type CopsAndCrimsGamemodes = 'deathmatch' | 'gungame'; -export type BlitzSurvivalGamesKits = - | 'archer' - | 'meatmaster' - | 'speleologist' - | 'baker' - | 'knight' - | 'guardian' - | 'scout' - | 'hunter' - | 'hype train' - | 'fisherman' - | 'armorer' - | 'horsetamer' - | 'astronaut' - | 'troll' - | 'reaper' - | 'shark' - | 'reddragon' - | 'toxicologist' - | 'rogue' - | 'warlock' - | 'slimeyslime' - | 'jockey' - | 'golem' - | 'viking' - | 'shadow knight' - | 'pigman' - | 'paladin' - | 'necromancer' - | 'florist' - | 'diver' - | 'arachnologist' - | 'blaze' - | 'wolftamer' - | 'tim' - | 'farmer' - | 'creepertamer' - | 'snowman'; export type MegaWallsKits = | 'cow' @@ -4267,3 +4229,155 @@ export type SkyWarsTeamsPerkId = | 'bulldozer' | 'barbarian'; export type SkyWarsPerkId = SkyWarsSoloPerkId | SkyWarsMegePerkId | SkyWarsTeamsPerkId; + +export type BlitzSurvivalGamesKitId = + | 'arachnologist' + | 'archer' + | 'armorer' + | 'astronaut' + | 'backup' + | 'baker' + | 'blaze' + | 'creepertamer' + | 'diver' + | 'donkeytamer' + | 'farmer' + | 'fisherman' + | 'florist' + | 'golem' + | 'guardian' + | 'horsetamer' + | 'hunter' + | 'hype train' + | 'jockey' + | 'knight' + | 'meatmaster' + | 'milkman' + | 'necromancer' + | 'paladin' + | 'phoenix' + | 'pigman' + | 'rambo' + | 'random' + | 'ranger' + | 'reaper' + | 'reddragon' + | 'rogue' + | 'scout' + | 'shadow knight' + | 'shark' + | 'slimeyslime' + | 'snowman' + | 'speleologist' + | 'tim' + | 'toxicologist' + | 'troll' + | 'viking' + | 'warlock' + | 'warrior' + | 'wolftamer'; +export type BlitzSurvivalGamesKitName = + | 'Arachnologist' + | 'Archer' + | 'Armorer' + | 'Astronaut' + | 'Baker' + | 'Blaze' + | 'Creepertamer' + | 'Diver' + | 'Donkeytamer' + | 'Farmer' + | 'Fisherman' + | 'Florist' + | 'Golem' + | 'Guardian' + | 'Horsetamer' + | 'Hunter' + | 'Hype Train' + | 'Jockey' + | 'Knight' + | 'MeatMaster' + | 'Meatmaster' + | 'Milkman' + | 'Necromancer' + | 'Paladin' + | 'Phoenix' + | 'Pigman' + | 'Ranger' + | 'Reaper' + | 'RedDragon' + | 'Rogue' + | 'Scout' + | 'Shadow Knight' + | 'SlimeySlime' + | 'Snowman' + | 'Speleologist' + | 'Tim' + | 'Toxicologist' + | 'Troll' + | 'Viking' + | 'Warlock' + | 'Warrior' + | 'Wolftamer'; +export type BlitzSurvivalGamesAura = + | 'BLUE_PARTICLE' + | 'DAYLIGHT_PARTICLE' + | 'DRAGON_EGG_PARTICLE' + | 'DUST_PARTICLE' + | 'ENCHANTING_PARTICLE' + | 'FLOWER_TRAIL' + | 'GREEN_PARTICLE' + | 'LAVA_PARTICLE' + | 'MYCELIUM_TRAIL' + | 'NETHERRACK_TRAIL' + | 'PORTAL_PARTICLE' + | 'RAINBOW_PARTICLE' + | 'RED_PARTICLE' + | 'SLIME_PARTICLE' + | 'SNOW_PARTICLE' + | 'TRON_BLUE_TRAIL' + | 'TRON_GREEN_TRAIL' + | 'TRON_RAINBOW_TRAIL' + | 'TRON_RED_TRAIL' + | 'WATER_PARTICLE' + | 'WHEAT_TRAIL'; +export type BlitzSurvivalGamesTaunt = + | 'DEFAULT' + | 'BAT_DUDE' + | 'CHICKEN_DANCE' + | 'COOKIE' + | 'FIREWORK' + | 'I_REFUSE' + | 'KILLER_BUNNY' + | 'PIG_DANCE' + | 'PRESTIGE' + | 'RICH_JAMES' + | 'SHEEP_PARADE' + | 'VILLAGER_MUSIC_BAND' + | 'WOLF_PACK'; +export type BlitzSurvivalGamesVictoryDance = + | 'BLAZING_SPEED' + | 'COLORFUL_CHICKEN_RAIN' + | 'CREEPER' + | 'DRAGON_RIDER' + | 'EARTH' + | 'LEAPING_BUNNY' + | 'METEOR_SHOWER' + | 'PLAYER_FIREWORK'; +export type BlitzSurvivalGamesFinisher = + | 'CREEPER_FIREWORK' + | 'EXPLOSIONS' + | 'GRAVESTONE' + | 'INFESTATION' + | 'LIGHTNING_STRIKE' + | 'RABBIT_GIFT' + | 'REKT_HOLOGRAM' + | 'SQUID_MISSILE'; +export type BlitzSurvivalGamesKillEffect = 'gravedigger' | 'random' | 'rapid_fire' | 'regeneration' | 'resistance'; +export type BlitzSurvivalGamesLeaderboardSettingsMode = 'ALL_MODES' | 'SOLO' | 'TEAMS'; +export type BlitzSurvivalGamesPrivateGamesExtraStars = + | '1 Star - Normal' + | '2 Stars' + | '3 Stars' + | '4 Stars' + | '5 Stars'; diff --git a/src/index.ts b/src/index.ts index 917cbb46b..f49e3ac87 100644 --- a/src/index.ts +++ b/src/index.ts @@ -74,7 +74,9 @@ import BedWarsSlumberRoom from './Structures/MiniGames/BedWars/BedWarsSlumber/Be import BedWarsSlumberSandman from './Structures/MiniGames/BedWars/BedWarsSlumber/BedWarsSlumberSandman.js'; import BedWarsTwoFour from './Structures/MiniGames/BedWars/BedWarsTwoFour.js'; import BlitzSurvivalGames from './Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.js'; +import BlitzSurvivalGamesData from './Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesData.js'; import BlitzSurvivalGamesKit from './Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesKit.js'; +import BlitzSurvivalGamesPrivateGames from './Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesPrivateGames.js'; import BlockingDead from './Structures/MiniGames/Arcade/BlockingDead.js'; import Booster from './Structures/Boosters/Booster.js'; import BowSpleef from './Structures/MiniGames/TNTGames/BowSpleef.js'; @@ -457,7 +459,9 @@ export { BedWarsSlumberSandman, BedWarsTwoFour, BlitzSurvivalGames, + BlitzSurvivalGamesData, BlitzSurvivalGamesKit, + BlitzSurvivalGamesPrivateGames, BlockingDead, Booster, BowSpleef, @@ -841,7 +845,9 @@ export default { BedWarsSlumberSandman, BedWarsTwoFour, BlitzSurvivalGames, + BlitzSurvivalGamesData, BlitzSurvivalGamesKit, + BlitzSurvivalGamesPrivateGames, BlockingDead, Booster, BowSpleef, From e03423b681ef86fc7a21f8983c620e73d2e7be88 Mon Sep 17 00:00:00 2001 From: Jacob Date: Sat, 24 Jan 2026 14:32:04 +0800 Subject: [PATCH 117/124] feat(generateBasicTests): parsing in a path --- .github/scripts/generateBasicTests.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/generateBasicTests.ts b/.github/scripts/generateBasicTests.ts index 0f40994e3..1f59518b2 100644 --- a/.github/scripts/generateBasicTests.ts +++ b/.github/scripts/generateBasicTests.ts @@ -293,7 +293,7 @@ async function getIgnoredTypes(): Promise { (async () => { const ignoredTypes = await getIgnoredTypes(); - const structuresPaths = await scanDirectory('./src/Structures/'); + const structuresPaths = await scanDirectory(process.argv[2] ?? './src/Structures/'); for (const file of structuresPaths) { await parseFile(file, ignoredTypes); } From c33578e4eb851dc75375a4960cc2f7aafd23cb24 Mon Sep 17 00:00:00 2001 From: Jacob Date: Sat, 24 Jan 2026 14:42:00 +0800 Subject: [PATCH 118/124] feat(ci/cd): Checking index is updated --- .github/scripts/generateAPIIndexFile.ts | 32 +++++++++++++ .github/scripts/generateIndexFile.ts | 34 +------------ .github/workflows/ci-cd.yml | 64 ++++++++++++++++++++++++- package.json | 1 + 4 files changed, 97 insertions(+), 34 deletions(-) create mode 100644 .github/scripts/generateAPIIndexFile.ts diff --git a/.github/scripts/generateAPIIndexFile.ts b/.github/scripts/generateAPIIndexFile.ts new file mode 100644 index 000000000..b93335f01 --- /dev/null +++ b/.github/scripts/generateAPIIndexFile.ts @@ -0,0 +1,32 @@ +import { format } from 'prettier'; +import { readFileSync, writeFileSync } from 'fs'; +import { scanDirectory } from './Utils'; + +const prettierConfig = JSON.parse(readFileSync('.prettierrc').toString('utf-8')); + +(async () => { + const lines: string[] = ['/* v8 ignore next 10000 */', '']; + + const importNames: string[] = []; + + const apiPaths = await scanDirectory('./src/API/', { goDeep: false, replaceSrc: true }); + const fixedAPIPaths: string[] = []; + + apiPaths.forEach((path) => { + const importName = path.split('.ts')[0].split('/')[path.split('.ts')[0].split('/').length - 1]; + importNames.push(importName); + const fixedPath = path.replaceAll('.ts', '.js').replaceAll('./API/', './'); + fixedAPIPaths.push(`import ${importName} from '${fixedPath}';`); + }); + + fixedAPIPaths.sort().forEach((path) => lines.push(path)); + + lines.push(''); + lines.push('export default {'); + importNames.sort().forEach((importName) => lines.push(`${importName},`)); + lines.push('};'); + lines.push(''); + + const formatted = await format(lines.join('\n'), { ...prettierConfig, filepath: './src/API/index.ts' }); + writeFileSync('./src/API/index.ts', formatted); +})(); diff --git a/.github/scripts/generateIndexFile.ts b/.github/scripts/generateIndexFile.ts index fbb3acba7..4a0b3566a 100644 --- a/.github/scripts/generateIndexFile.ts +++ b/.github/scripts/generateIndexFile.ts @@ -4,7 +4,7 @@ import { scanDirectory } from './Utils'; const prettierConfig = JSON.parse(readFileSync('.prettierrc').toString('utf-8')); -async function generateBaseIndex() { +(async () => { const lines: string[] = [ '/* v8 ignore next 10000 */', '/* eslint-disable @stylistic/max-len */', @@ -61,34 +61,4 @@ async function generateBaseIndex() { const formatted = await format(lines.join('\n'), { ...prettierConfig, filepath: './src/index.ts' }); writeFileSync('./src/index.ts', formatted); -} - -async function generateAPIIndex() { - const lines: string[] = ['/* v8 ignore next 10000 */', '']; - - const importNames: string[] = []; - - const apiPaths = await scanDirectory('./src/API/', { goDeep: false, replaceSrc: true }); - const fixedAPIPaths: string[] = []; - - apiPaths.forEach((path) => { - const importName = path.split('.ts')[0].split('/')[path.split('.ts')[0].split('/').length - 1]; - importNames.push(importName); - const fixedPath = path.replaceAll('.ts', '.js').replaceAll('./API/', './'); - fixedAPIPaths.push(`import ${importName} from '${fixedPath}';`); - }); - - fixedAPIPaths.sort().forEach((path) => lines.push(path)); - - lines.push(''); - lines.push('export default {'); - importNames.sort().forEach((importName) => lines.push(`${importName},`)); - lines.push('};'); - lines.push(''); - - const formatted = await format(lines.join('\n'), { ...prettierConfig, filepath: './src/API/index.ts' }); - writeFileSync('./src/API/index.ts', formatted); -} - -generateBaseIndex(); -generateAPIIndex(); +})(); diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml index b9a8743e0..cdddaaacf 100644 --- a/.github/workflows/ci-cd.yml +++ b/.github/workflows/ci-cd.yml @@ -77,9 +77,69 @@ jobs: - name: Check eslint run: pnpm eslint:check + index: + name: check building (index) + needs: [pnpm] + runs-on: ubuntu-latest + steps: + - name: Git checkout + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + + - name: Use Node.js ${{ env.NODE_VERSION }} + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + cache: 'pnpm' + + - name: Install node dependencies + run: pnpm i + + - name: Run index generation + run: pnpm scripts:generate:index + + - name: Check index + run: | + if ! git diff --exit-code --quiet -- src/index.ts; then + echo "Index file isn't up to date. Please run 'pnpm scripts:gneerate:index'" + exit 1 + fi + + api-index: + name: check building (API index) + needs: [pnpm] + runs-on: ubuntu-latest + steps: + - name: Git checkout + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + + - name: Use Node.js ${{ env.NODE_VERSION }} + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + cache: 'pnpm' + + - name: Install node dependencies + run: pnpm i + + - name: Run API index generation + run: pnpm scripts:generate:index:api + + - name: Check API index + run: | + if ! git diff --exit-code --quiet -- src/API/index.ts; then + echo "Index file isn't up to date. Please run 'pnpm scripts:gneerate:index:api'" + exit 1 + fi + build: name: build - needs: [pnpm, eslint] + needs: [pnpm, eslint, index, api-index] runs-on: ubuntu-latest steps: - name: Git checkout @@ -102,7 +162,7 @@ jobs: tests: name: tests - needs: [pnpm, eslint, build] + needs: [pnpm, eslint, index, api-index, build] runs-on: ubuntu-latest steps: - name: Git checkout diff --git a/package.json b/package.json index 8618abdc0..6b5bdae58 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "test:coverage:check": "pnpm exec tsx .github/scripts/checkCoverage.ts", "test:ui": "pnpm exec vitest --ui --coverage", "scripts:generate:index": "pnpm exec tsx .github/scripts/generateIndexFile.ts", + "scripts:generate:index:api": "pnpm exec tsx .github/scripts/generateAPIIndexFile.ts", "docgen": "pnpm exec typedoc" }, "engines": { From fa11f08661bbc3b4a804dc6ad2224d8762da3570 Mon Sep 17 00:00:00 2001 From: Jacob Date: Sat, 24 Jan 2026 14:43:34 +0800 Subject: [PATCH 119/124] fix(index) --- src/index.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index f49e3ac87..fb58c2ea6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -408,6 +408,7 @@ import WoolWars from './Structures/MiniGames/WoolGames/WoolWars.js'; import WoolWarsClass from './Structures/MiniGames/WoolGames/WoolWarsClass.js'; import Zombies from './Structures/MiniGames/Arcade/Zombies/Zombies.js'; import ZombiesMap from './Structures/MiniGames/Arcade/Zombies/ZombiesMap.js'; +import ZombiesMapMode from './Structures/MiniGames/Arcade/Zombies/ZombiesMapMode.js'; export { Client, @@ -792,7 +793,8 @@ export { WoolWars, WoolWarsClass, Zombies, - ZombiesMap + ZombiesMap, + ZombiesMapMode }; export default { @@ -1178,5 +1180,6 @@ export default { WoolWars, WoolWarsClass, Zombies, - ZombiesMap + ZombiesMap, + ZombiesMapMode }; From b4fd52daf5ea0ade8ffcbd89fb45ea715f5a74c9 Mon Sep 17 00:00:00 2001 From: Jacob Date: Mon, 26 Jan 2026 22:08:44 +0800 Subject: [PATCH 120/124] feat(package): prepare script (#696) --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 6b5bdae58..ad384fad1 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,8 @@ "test:ui": "pnpm exec vitest --ui --coverage", "scripts:generate:index": "pnpm exec tsx .github/scripts/generateIndexFile.ts", "scripts:generate:index:api": "pnpm exec tsx .github/scripts/generateAPIIndexFile.ts", - "docgen": "pnpm exec typedoc" + "docgen": "pnpm exec typedoc", + "prepare": "pnpm build" }, "engines": { "node": ">=20.19.5" From 6132b49540aca601ba3b80cce122bcc279df10b2 Mon Sep 17 00:00:00 2001 From: Jacob Date: Mon, 26 Jan 2026 22:17:40 +0800 Subject: [PATCH 121/124] Release 12.0.0-22 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ad384fad1..811f9d56a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hypixel-api-reborn", - "version": "12.0.0-21", + "version": "12.0.0-22", "description": "Feature-rich Hypixel API wrapper for Node.js", "main": "dist/index.js", "types": "dist/index.d.ts", From 1b387ae87ea47a8be7c39ef146419d1f6d34a9df Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 11 Feb 2026 14:56:10 +0800 Subject: [PATCH 122/124] fix(BlitzSurvivalGames): tests --- .../BlitzSurvivalGames.test.ts | 1 + .../BlitzSurvivalGamesData.test.ts | 108 ++++++++++++++++++ .../BlitzSurvivalGamesKit.test.ts | 56 +-------- .../BlitzSurvivalGamesPrivateGames.test.ts | 28 +++++ 4 files changed, 142 insertions(+), 51 deletions(-) create mode 100644 src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesData.test.ts create mode 100644 src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesPrivateGames.test.ts diff --git a/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.test.ts b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.test.ts index 251f856c3..4a0fa7a3f 100644 --- a/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.test.ts +++ b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGames.test.ts @@ -1,4 +1,5 @@ import BlitzSurvivalGames from './BlitzSurvivalGames.js'; +import BlitzSurvivalGamesKit from './BlitzSurvivalGamesKit.js'; import BlitzSurvivalGamesPrivateGames from './BlitzSurvivalGamesPrivateGames.js'; import LeaderboardSettings from '../Shared/LeaderboardSettings.js'; import { expect, expectTypeOf, test } from 'vitest'; diff --git a/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesData.test.ts b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesData.test.ts new file mode 100644 index 000000000..7af5ba63c --- /dev/null +++ b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesData.test.ts @@ -0,0 +1,108 @@ +import BlitzSurvivalGamesData from './BlitzSurvivalGamesData.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('BlitzSurvivalGamesData', () => { + const data = new BlitzSurvivalGamesData({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BlitzSurvivalGamesData); + expectTypeOf(data).toEqualTypeOf(); + expect(data.wins).toBeDefined(); + expect(data.wins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.wins).toEqualTypeOf(); + expect(data.winsTeams).toBeDefined(); + expect(data.winsTeams).toBeGreaterThanOrEqual(0); + expectTypeOf(data.winsTeams).toEqualTypeOf(); + expect(data.gamesPlayed).toBeDefined(); + expect(data.gamesPlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gamesPlayed).toEqualTypeOf(); + expect(data.losses).toBeDefined(); + expect(data.losses).toBeGreaterThanOrEqual(0); + expectTypeOf(data.losses).toEqualTypeOf(); + expect(data.WLRatio).toBeDefined(); + expect(data.WLRatio).toBeGreaterThanOrEqual(0); + expectTypeOf(data.WLRatio).toEqualTypeOf(); + expect(data.arrowsHit).toBeDefined(); + expect(data.arrowsHit).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arrowsHit).toEqualTypeOf(); + expect(data.arrowsFired).toBeDefined(); + expect(data.arrowsFired).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arrowsFired).toEqualTypeOf(); + expect(data.bowAccuracy).toBeDefined(); + expect(data.bowAccuracy).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowAccuracy).toEqualTypeOf(); + expect(data.blocksTraveledBoat).toBeDefined(); + expect(data.blocksTraveledBoat).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksTraveledBoat).toEqualTypeOf(); + expect(data.blocksTraveledHorse).toBeDefined(); + expect(data.blocksTraveledHorse).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksTraveledHorse).toEqualTypeOf(); + expect(data.blocksTraveledMinecart).toBeDefined(); + expect(data.blocksTraveledMinecart).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksTraveledMinecart).toEqualTypeOf(); + expect(data.blocksTraveledPig).toBeDefined(); + expect(data.blocksTraveledPig).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blocksTraveledPig).toEqualTypeOf(); + expect(data.bottlesThrown).toBeDefined(); + expect(data.bottlesThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bottlesThrown).toEqualTypeOf(); + expect(data.chestsOpened).toBeDefined(); + expect(data.chestsOpened).toBeGreaterThanOrEqual(0); + expectTypeOf(data.chestsOpened).toEqualTypeOf(); + expect(data.damage).toBeDefined(); + expect(data.damage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.damage).toEqualTypeOf(); + expect(data.damageTaken).toBeDefined(); + expect(data.damageTaken).toBeGreaterThanOrEqual(0); + expectTypeOf(data.damageTaken).toEqualTypeOf(); + expect(data.eggsCollected).toBeDefined(); + expect(data.eggsCollected).toBeGreaterThanOrEqual(0); + expectTypeOf(data.eggsCollected).toEqualTypeOf(); + expect(data.eggsThrown).toBeDefined(); + expect(data.eggsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.eggsThrown).toEqualTypeOf(); + expect(data.explosiveKills).toBeDefined(); + expect(data.explosiveKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.explosiveKills).toEqualTypeOf(); + expect(data.fallDamage).toBeDefined(); + expect(data.fallDamage).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fallDamage).toEqualTypeOf(); + expect(data.fallKills).toBeDefined(); + expect(data.fallKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fallKills).toEqualTypeOf(); + expect(data.itemsEnchanted).toBeDefined(); + expect(data.itemsEnchanted).toBeGreaterThanOrEqual(0); + expectTypeOf(data.itemsEnchanted).toEqualTypeOf(); + expect(data.kills).toBeDefined(); + expect(data.kills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kills).toEqualTypeOf(); + expect(data.deaths).toBeDefined(); + expect(data.deaths).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deaths).toEqualTypeOf(); + expect(data.KDRatio).toBeDefined(); + expect(data.KDRatio).toBeGreaterThanOrEqual(0); + expectTypeOf(data.KDRatio).toEqualTypeOf(); + expect(data.mobsSpawned).toBeDefined(); + expect(data.mobsSpawned).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mobsSpawned).toEqualTypeOf(); + expect(data.potionsDrunk).toBeDefined(); + expect(data.potionsDrunk).toBeGreaterThanOrEqual(0); + expectTypeOf(data.potionsDrunk).toEqualTypeOf(); + expect(data.potionsThrown).toBeDefined(); + expect(data.potionsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.potionsThrown).toEqualTypeOf(); + expect(data.railsPlaced).toBeDefined(); + expect(data.railsPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.railsPlaced).toEqualTypeOf(); + expect(data.snowballsThrown).toBeDefined(); + expect(data.snowballsThrown).toBeGreaterThanOrEqual(0); + expectTypeOf(data.snowballsThrown).toEqualTypeOf(); + expect(data.tauntKills).toBeDefined(); + expect(data.tauntKills).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tauntKills).toEqualTypeOf(); + expect(data.timePlayed).toBeDefined(); + expect(data.timePlayed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.timePlayed).toEqualTypeOf(); + expect(data.tntPlaced).toBeDefined(); + expect(data.tntPlaced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.tntPlaced).toEqualTypeOf(); +}); diff --git a/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesKit.test.ts b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesKit.test.ts index 126284ed2..a39a72967 100644 --- a/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesKit.test.ts +++ b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesKit.test.ts @@ -12,55 +12,9 @@ test('BlitzSurvivalGamesKit', () => { expect(data.exp).toBeDefined(); expect(data.exp).toBeGreaterThanOrEqual(0); expectTypeOf(data.exp).toEqualTypeOf(); - expect(data.kills).toBeDefined(); - expect(data.kills).toBeGreaterThanOrEqual(0); - expectTypeOf(data.kills).toEqualTypeOf(); - expect(data.deaths).toBeDefined(); - expect(data.deaths).toBeGreaterThanOrEqual(0); - expectTypeOf(data.deaths).toEqualTypeOf(); - expect(data.KDR).toBeDefined(); - expect(data.KDR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.KDR).toEqualTypeOf(); - expect(data.wins).toBeDefined(); - expect(data.wins).toBeGreaterThanOrEqual(0); - expectTypeOf(data.wins).toEqualTypeOf(); - expect(data.gamesPlayed).toBeDefined(); - expect(data.gamesPlayed).toBeGreaterThanOrEqual(0); - expectTypeOf(data.gamesPlayed).toEqualTypeOf(); - expect(data.losses).toBeDefined(); - expect(data.losses).toBeGreaterThanOrEqual(0); - expectTypeOf(data.losses).toEqualTypeOf(); - expect(data.WLR).toBeDefined(); - expect(data.WLR).toBeGreaterThanOrEqual(0); - expectTypeOf(data.WLR).toEqualTypeOf(); - expect(data.arrowsShot).toBeDefined(); - expect(data.arrowsShot).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arrowsShot).toEqualTypeOf(); - expect(data.arrowsHit).toBeDefined(); - expect(data.arrowsHit).toBeGreaterThanOrEqual(0); - expectTypeOf(data.arrowsHit).toEqualTypeOf(); - expect(data.bowAccuracy).toBeDefined(); - expect(data.bowAccuracy).toBeGreaterThanOrEqual(0); - expectTypeOf(data.bowAccuracy).toEqualTypeOf(); - expect(data.damage).toBeDefined(); - expect(data.damage).toBeGreaterThanOrEqual(0); - expectTypeOf(data.damage).toEqualTypeOf(); - expect(data.damageTaken).toBeDefined(); - expect(data.damageTaken).toBeGreaterThanOrEqual(0); - expectTypeOf(data.damageTaken).toEqualTypeOf(); - expect(data.potionsDrunk).toBeDefined(); - expect(data.potionsDrunk).toBeGreaterThanOrEqual(0); - expectTypeOf(data.potionsDrunk).toEqualTypeOf(); - expect(data.potionsThrown).toBeDefined(); - expect(data.potionsThrown).toBeGreaterThanOrEqual(0); - expectTypeOf(data.potionsThrown).toEqualTypeOf(); - expect(data.playTime).toBeDefined(); - expect(data.playTime).toBeGreaterThanOrEqual(0); - expectTypeOf(data.playTime).toEqualTypeOf(); - expect(data.mobsSpawned).toBeDefined(); - expect(data.mobsSpawned).toBeGreaterThanOrEqual(0); - expectTypeOf(data.mobsSpawned).toEqualTypeOf(); - expect(data.chestsOpened).toBeDefined(); - expect(data.chestsOpened).toBeGreaterThanOrEqual(0); - expectTypeOf(data.chestsOpened).toEqualTypeOf(); + expect(data.prestige).toBeDefined(); + expect(data.prestige).toBeGreaterThanOrEqual(0); + expectTypeOf(data.prestige).toEqualTypeOf(); + expect(data.inventory).toBeDefined(); + expectTypeOf(data.inventory).toEqualTypeOf>(); }); diff --git a/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesPrivateGames.test.ts b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesPrivateGames.test.ts new file mode 100644 index 000000000..c61a8c063 --- /dev/null +++ b/src/Structures/MiniGames/BlitzSurvivalGames/BlitzSurvivalGamesPrivateGames.test.ts @@ -0,0 +1,28 @@ +import BlitzSurvivalGamesPrivateGames from './BlitzSurvivalGamesPrivateGames.js'; +import { expect, expectTypeOf, test } from 'vitest'; +import type { + BlitzSurvivalGamesPrivateGamesExtraStars, + PrivateGameSettingsGameSpeed, + PrivateGameSettingsHealthBuff +} from '../../../Types/Player.js'; + +test('BlitzSurvivalGamesPrivateGames', () => { + const data = new BlitzSurvivalGamesPrivateGames({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(BlitzSurvivalGamesPrivateGames); + expectTypeOf(data).toEqualTypeOf(); + expect(data.healthBuff).toBeDefined(); + expectTypeOf(data.healthBuff).toEqualTypeOf(); + expect(data.lowGravity).toBeDefined(); + expectTypeOf(data.lowGravity).toEqualTypeOf(); + expect(data.speed).toBeDefined(); + expectTypeOf(data.speed).toEqualTypeOf(); + expect(data.extraBlitzStars).toBeDefined(); + expectTypeOf(data.extraBlitzStars).toEqualTypeOf(); + expect(data.oneHitOneKill).toBeDefined(); + expectTypeOf(data.oneHitOneKill).toEqualTypeOf(); + expect(data.nightTime).toBeDefined(); + expectTypeOf(data.nightTime).toEqualTypeOf(); + expect(data.noKits).toBeDefined(); + expectTypeOf(data.noKits).toEqualTypeOf(); +}); From 1cbc318a35a0a7331c8d633b36ca60517b33b3fc Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 11 Feb 2026 15:27:15 +0800 Subject: [PATCH 123/124] refactor(getGameCounts) --- src/API/getGameCounts.test.ts | 2 +- src/API/getGameCounts.ts | 2 +- src/Client.ts | 2 +- src/Structures/GameCounts.ts | 29 ----- .../Arcade/GameCountsArcade.test.ts | 13 ++ .../GameCounts/Arcade/GameCountsArcade.ts | 12 ++ .../Arcade/GameCountsArcadeModes.test.ts | 78 ++++++++++++ .../Arcade/GameCountsArcadeModes.ts | 52 ++++++++ .../GameCountsBattleGround.test.ts | 13 ++ .../BattleGround/GameCountsBattleGround.ts | 12 ++ .../GameCountsBattleGroundModes.test.ts | 18 +++ .../GameCountsBattleGroundModes.ts | 12 ++ .../BedWars/GameCountsBedWars.test.ts | 13 ++ .../GameCounts/BedWars/GameCountsBedWars.ts | 12 ++ .../BedWars/GameCountsBedWarsModes.test.ts | 75 +++++++++++ .../BedWars/GameCountsBedWarsModes.ts | 50 ++++++++ .../BuildBattle/GameCountsBuildBattle.test.ts | 13 ++ .../BuildBattle/GameCountsBuildBattle.ts | 12 ++ .../GameCountsBuildBattleModes.test.ts | 27 ++++ .../BuildBattle/GameCountsBuildBattleModes.ts | 18 +++ .../GameCounts/Duels/GameCountsDuels.test.ts | 13 ++ .../GameCounts/Duels/GameCountsDuels.ts | 12 ++ .../Duels/GameCountsDuelsModes.test.ts | 93 ++++++++++++++ .../GameCounts/Duels/GameCountsDuelsModes.ts | 62 +++++++++ .../GameCounts}/GameCounts.test.ts | 4 + .../Static/GameCounts/GameCounts.ts | 21 ++++ .../GameCounts/GameCountsBasicModes.test.ts | 15 +++ .../Static/GameCounts/GameCountsBasicModes.ts | 10 ++ .../Static/GameCounts/GameCountsGames.test.ts | 110 ++++++++++++++++ .../Static/GameCounts/GameCountsGames.ts | 81 ++++++++++++ .../GameCounts/GameCountsGeneric.test.ts | 12 ++ .../Static/GameCounts/GameCountsGeneric.ts | 8 ++ .../Legacy/GameCountsLegacy.test.ts | 13 ++ .../GameCounts/Legacy/GameCountsLegacy.ts | 12 ++ .../Legacy/GameCountsLegacyModes.test.ts | 27 ++++ .../Legacy/GameCountsLegacyModes.ts | 18 +++ .../GameCounts/MCGO/GameCountsMCGO.test.ts | 13 ++ .../Static/GameCounts/MCGO/GameCountsMCGO.ts | 12 ++ .../MCGO/GameCountsMCGOModes.test.ts | 18 +++ .../GameCounts/MCGO/GameCountsMCGOModes.ts | 12 ++ .../GameCountsMurderMystery.test.ts | 13 ++ .../MurderMystery/GameCountsMurderMystery.ts | 12 ++ .../GameCountsMurderMysteryModes.test.ts | 21 ++++ .../GameCountsMurderMysteryModes.ts | 14 +++ .../GameCounts/Pit/GameCountsPit.test.ts | 13 ++ .../Static/GameCounts/Pit/GameCountsPit.ts | 12 ++ .../GameCounts/Pit/GameCountsPitModes.test.ts | 12 ++ .../GameCounts/Pit/GameCountsPitModes.ts | 8 ++ .../Replay/GameCountsReplay.test.ts | 13 ++ .../GameCounts/Replay/GameCountsReplay.ts | 12 ++ .../Replay/GameCountsReplayModes.test.ts | 12 ++ .../Replay/GameCountsReplayModes.ts | 8 ++ .../SkyBlock/GameCountsSkyBlock.test.ts | 13 ++ .../GameCounts/SkyBlock/GameCountsSkyBlock.ts | 12 ++ .../SkyBlock/GameCountsSkyBlockModes.test.ts | 72 +++++++++++ .../SkyBlock/GameCountsSkyBlockModes.ts | 48 +++++++ .../SkyWars/GameCountsSkyWars.test.ts | 13 ++ .../GameCounts/SkyWars/GameCountsSkyWars.ts | 12 ++ .../SkyWars/GameCountsSkyWarsModes.test.ts | 45 +++++++ .../SkyWars/GameCountsSkyWarsModes.ts | 33 +++++ .../SpeedUHC/GameCountsSpeedUHC.test.ts | 13 ++ .../GameCounts/SpeedUHC/GameCountsSpeedUHC.ts | 12 ++ .../SuperSmash/GameCountsSuperSmash.test.ts | 13 ++ .../SuperSmash/GameCountsSuperSmash.ts | 12 ++ .../GameCountsSuperSmashModes.test.ts | 18 +++ .../SuperSmash/GameCountsSuperSmashModes.ts | 15 +++ .../GameCountsSurvivalGames.test.ts | 13 ++ .../SurvivalGames/GameCountsSurvivalGames.ts | 12 ++ .../TNTGames/GameCountsTNTGames.test.ts | 13 ++ .../GameCounts/TNTGames/GameCountsTNTGames.ts | 12 ++ .../TNTGames/GameCountsTNTGamesModes.test.ts | 24 ++++ .../TNTGames/GameCountsTNTGamesModes.ts | 16 +++ .../GameCounts/UHC/GameCountsUHC.test.ts | 13 ++ .../Static/GameCounts/UHC/GameCountsUHC.ts | 12 ++ .../GameCounts/UHC/GameCountsUHCModes.test.ts | 18 +++ .../GameCounts/UHC/GameCountsUHCModes.ts | 12 ++ .../Walls3/GameCountsWalls3.test.ts | 13 ++ .../GameCounts/Walls3/GameCountsWalls3.ts | 12 ++ .../Walls3/GameCountsWalls3Modes.test.ts | 15 +++ .../Walls3/GameCountsWalls3Modes.ts | 10 ++ .../WoolGames/GameCountsWoolGames.test.ts | 13 ++ .../WoolGames/GameCountsWoolGames.ts | 12 ++ .../GameCountsWoolGamesModes.test.ts | 18 +++ .../WoolGames/GameCountsWoolGamesModes.ts | 12 ++ src/index.ts | 119 +++++++++++++++++- 85 files changed, 1848 insertions(+), 33 deletions(-) delete mode 100644 src/Structures/GameCounts.ts create mode 100644 src/Structures/Static/GameCounts/Arcade/GameCountsArcade.test.ts create mode 100644 src/Structures/Static/GameCounts/Arcade/GameCountsArcade.ts create mode 100644 src/Structures/Static/GameCounts/Arcade/GameCountsArcadeModes.test.ts create mode 100644 src/Structures/Static/GameCounts/Arcade/GameCountsArcadeModes.ts create mode 100644 src/Structures/Static/GameCounts/BattleGround/GameCountsBattleGround.test.ts create mode 100644 src/Structures/Static/GameCounts/BattleGround/GameCountsBattleGround.ts create mode 100644 src/Structures/Static/GameCounts/BattleGround/GameCountsBattleGroundModes.test.ts create mode 100644 src/Structures/Static/GameCounts/BattleGround/GameCountsBattleGroundModes.ts create mode 100644 src/Structures/Static/GameCounts/BedWars/GameCountsBedWars.test.ts create mode 100644 src/Structures/Static/GameCounts/BedWars/GameCountsBedWars.ts create mode 100644 src/Structures/Static/GameCounts/BedWars/GameCountsBedWarsModes.test.ts create mode 100644 src/Structures/Static/GameCounts/BedWars/GameCountsBedWarsModes.ts create mode 100644 src/Structures/Static/GameCounts/BuildBattle/GameCountsBuildBattle.test.ts create mode 100644 src/Structures/Static/GameCounts/BuildBattle/GameCountsBuildBattle.ts create mode 100644 src/Structures/Static/GameCounts/BuildBattle/GameCountsBuildBattleModes.test.ts create mode 100644 src/Structures/Static/GameCounts/BuildBattle/GameCountsBuildBattleModes.ts create mode 100644 src/Structures/Static/GameCounts/Duels/GameCountsDuels.test.ts create mode 100644 src/Structures/Static/GameCounts/Duels/GameCountsDuels.ts create mode 100644 src/Structures/Static/GameCounts/Duels/GameCountsDuelsModes.test.ts create mode 100644 src/Structures/Static/GameCounts/Duels/GameCountsDuelsModes.ts rename src/Structures/{ => Static/GameCounts}/GameCounts.test.ts (77%) create mode 100644 src/Structures/Static/GameCounts/GameCounts.ts create mode 100644 src/Structures/Static/GameCounts/GameCountsBasicModes.test.ts create mode 100644 src/Structures/Static/GameCounts/GameCountsBasicModes.ts create mode 100644 src/Structures/Static/GameCounts/GameCountsGames.test.ts create mode 100644 src/Structures/Static/GameCounts/GameCountsGames.ts create mode 100644 src/Structures/Static/GameCounts/GameCountsGeneric.test.ts create mode 100644 src/Structures/Static/GameCounts/GameCountsGeneric.ts create mode 100644 src/Structures/Static/GameCounts/Legacy/GameCountsLegacy.test.ts create mode 100644 src/Structures/Static/GameCounts/Legacy/GameCountsLegacy.ts create mode 100644 src/Structures/Static/GameCounts/Legacy/GameCountsLegacyModes.test.ts create mode 100644 src/Structures/Static/GameCounts/Legacy/GameCountsLegacyModes.ts create mode 100644 src/Structures/Static/GameCounts/MCGO/GameCountsMCGO.test.ts create mode 100644 src/Structures/Static/GameCounts/MCGO/GameCountsMCGO.ts create mode 100644 src/Structures/Static/GameCounts/MCGO/GameCountsMCGOModes.test.ts create mode 100644 src/Structures/Static/GameCounts/MCGO/GameCountsMCGOModes.ts create mode 100644 src/Structures/Static/GameCounts/MurderMystery/GameCountsMurderMystery.test.ts create mode 100644 src/Structures/Static/GameCounts/MurderMystery/GameCountsMurderMystery.ts create mode 100644 src/Structures/Static/GameCounts/MurderMystery/GameCountsMurderMysteryModes.test.ts create mode 100644 src/Structures/Static/GameCounts/MurderMystery/GameCountsMurderMysteryModes.ts create mode 100644 src/Structures/Static/GameCounts/Pit/GameCountsPit.test.ts create mode 100644 src/Structures/Static/GameCounts/Pit/GameCountsPit.ts create mode 100644 src/Structures/Static/GameCounts/Pit/GameCountsPitModes.test.ts create mode 100644 src/Structures/Static/GameCounts/Pit/GameCountsPitModes.ts create mode 100644 src/Structures/Static/GameCounts/Replay/GameCountsReplay.test.ts create mode 100644 src/Structures/Static/GameCounts/Replay/GameCountsReplay.ts create mode 100644 src/Structures/Static/GameCounts/Replay/GameCountsReplayModes.test.ts create mode 100644 src/Structures/Static/GameCounts/Replay/GameCountsReplayModes.ts create mode 100644 src/Structures/Static/GameCounts/SkyBlock/GameCountsSkyBlock.test.ts create mode 100644 src/Structures/Static/GameCounts/SkyBlock/GameCountsSkyBlock.ts create mode 100644 src/Structures/Static/GameCounts/SkyBlock/GameCountsSkyBlockModes.test.ts create mode 100644 src/Structures/Static/GameCounts/SkyBlock/GameCountsSkyBlockModes.ts create mode 100644 src/Structures/Static/GameCounts/SkyWars/GameCountsSkyWars.test.ts create mode 100644 src/Structures/Static/GameCounts/SkyWars/GameCountsSkyWars.ts create mode 100644 src/Structures/Static/GameCounts/SkyWars/GameCountsSkyWarsModes.test.ts create mode 100644 src/Structures/Static/GameCounts/SkyWars/GameCountsSkyWarsModes.ts create mode 100644 src/Structures/Static/GameCounts/SpeedUHC/GameCountsSpeedUHC.test.ts create mode 100644 src/Structures/Static/GameCounts/SpeedUHC/GameCountsSpeedUHC.ts create mode 100644 src/Structures/Static/GameCounts/SuperSmash/GameCountsSuperSmash.test.ts create mode 100644 src/Structures/Static/GameCounts/SuperSmash/GameCountsSuperSmash.ts create mode 100644 src/Structures/Static/GameCounts/SuperSmash/GameCountsSuperSmashModes.test.ts create mode 100644 src/Structures/Static/GameCounts/SuperSmash/GameCountsSuperSmashModes.ts create mode 100644 src/Structures/Static/GameCounts/SurvivalGames/GameCountsSurvivalGames.test.ts create mode 100644 src/Structures/Static/GameCounts/SurvivalGames/GameCountsSurvivalGames.ts create mode 100644 src/Structures/Static/GameCounts/TNTGames/GameCountsTNTGames.test.ts create mode 100644 src/Structures/Static/GameCounts/TNTGames/GameCountsTNTGames.ts create mode 100644 src/Structures/Static/GameCounts/TNTGames/GameCountsTNTGamesModes.test.ts create mode 100644 src/Structures/Static/GameCounts/TNTGames/GameCountsTNTGamesModes.ts create mode 100644 src/Structures/Static/GameCounts/UHC/GameCountsUHC.test.ts create mode 100644 src/Structures/Static/GameCounts/UHC/GameCountsUHC.ts create mode 100644 src/Structures/Static/GameCounts/UHC/GameCountsUHCModes.test.ts create mode 100644 src/Structures/Static/GameCounts/UHC/GameCountsUHCModes.ts create mode 100644 src/Structures/Static/GameCounts/Walls3/GameCountsWalls3.test.ts create mode 100644 src/Structures/Static/GameCounts/Walls3/GameCountsWalls3.ts create mode 100644 src/Structures/Static/GameCounts/Walls3/GameCountsWalls3Modes.test.ts create mode 100644 src/Structures/Static/GameCounts/Walls3/GameCountsWalls3Modes.ts create mode 100644 src/Structures/Static/GameCounts/WoolGames/GameCountsWoolGames.test.ts create mode 100644 src/Structures/Static/GameCounts/WoolGames/GameCountsWoolGames.ts create mode 100644 src/Structures/Static/GameCounts/WoolGames/GameCountsWoolGamesModes.test.ts create mode 100644 src/Structures/Static/GameCounts/WoolGames/GameCountsWoolGamesModes.ts diff --git a/src/API/getGameCounts.test.ts b/src/API/getGameCounts.test.ts index 50d36b96b..f5854e8d1 100644 --- a/src/API/getGameCounts.test.ts +++ b/src/API/getGameCounts.test.ts @@ -1,5 +1,5 @@ import Client from '../Client.js'; -import GameCounts from '../Structures/GameCounts.js'; +import GameCounts from '../Structures/Static/GameCounts/GameCounts.js'; import RequestData from '../Private/RequestData.js'; import { expect, expectTypeOf, test } from 'vitest'; diff --git a/src/API/getGameCounts.ts b/src/API/getGameCounts.ts index 619508d1f..bacc2b892 100644 --- a/src/API/getGameCounts.ts +++ b/src/API/getGameCounts.ts @@ -1,5 +1,5 @@ import Endpoint from '../Private/Endpoint.js'; -import GameCounts from '../Structures/GameCounts.js'; +import GameCounts from '../Structures/Static/GameCounts/GameCounts.ts'; import RequestData from '../Private/RequestData.js'; import type { RequestOptions } from '../Types/Requests.js'; diff --git a/src/Client.ts b/src/Client.ts index 5ee260b03..3c9178ffa 100644 --- a/src/Client.ts +++ b/src/Client.ts @@ -8,7 +8,7 @@ import Updater from './Private/Updater.js'; import type Achievements from './Structures/Static/Achievements/Achievements.js'; import type Booster from './Structures/Boosters/Booster.js'; import type Challenges from './Structures/Static/Challenges.js'; -import type GameCounts from './Structures/GameCounts.js'; +import type GameCounts from './Structures/Static/GameCounts/GameCounts.ts'; import type Guild from './Structures/Guild/Guild.js'; import type GuildAchievements from './Structures/Static/Achievements/GuildAchievements.js'; import type House from './Structures/House.js'; diff --git a/src/Structures/GameCounts.ts b/src/Structures/GameCounts.ts deleted file mode 100644 index 59f180b4c..000000000 --- a/src/Structures/GameCounts.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { MiniGamesString } from '../Utils/Constants.js'; -import { RemoveSnakeCaseString, recursive } from '../Utils/RemoveSnakeCase.js'; -import type RequestData from '../Private/RequestData.js'; - -class GameCounts { - playerCount: number; - [x: string]: object | number; - constructor(data: Record) { - this.playerCount = data.playerCount || 0; - for (const game in data.games) { - if (Object.prototype.hasOwnProperty.call(MiniGamesString, game)) { - const objectName = (MiniGamesString[game] || 'UNKNOWN').toUpperCase().replace(/ +/g, '_'); - this[RemoveSnakeCaseString(objectName)] = recursive(data.games[game], true); - } else { - this[RemoveSnakeCaseString(game)] = recursive(data.games[game], true); - } - } - } - - toString(): number { - return this.playerCount; - } - - isRaw(): this is RequestData { - return false; - } -} - -export default GameCounts; diff --git a/src/Structures/Static/GameCounts/Arcade/GameCountsArcade.test.ts b/src/Structures/Static/GameCounts/Arcade/GameCountsArcade.test.ts new file mode 100644 index 000000000..f635ac3d9 --- /dev/null +++ b/src/Structures/Static/GameCounts/Arcade/GameCountsArcade.test.ts @@ -0,0 +1,13 @@ +import GameCountsArcade from './GameCountsArcade.js'; +import GameCountsArcadeModes from './GameCountsArcadeModes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsArcade', () => { + const data = new GameCountsArcade({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsArcade); + expectTypeOf(data).toEqualTypeOf(); + expect(data.modes).toBeDefined(); + expect(data.modes).toBeInstanceOf(GameCountsArcadeModes); + expectTypeOf(data.modes).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/Arcade/GameCountsArcade.ts b/src/Structures/Static/GameCounts/Arcade/GameCountsArcade.ts new file mode 100644 index 000000000..8a3303a3e --- /dev/null +++ b/src/Structures/Static/GameCounts/Arcade/GameCountsArcade.ts @@ -0,0 +1,12 @@ +import GameCountsArcadeModes from './GameCountsArcadeModes.ts'; +import GameCountsGeneric from '../GameCountsGeneric.ts'; + +class GameCountsArcade extends GameCountsGeneric { + modes: GameCountsArcadeModes; + constructor(data: Record) { + super(data); + this.modes = new GameCountsArcadeModes(data?.modes); + } +} + +export default GameCountsArcade; diff --git a/src/Structures/Static/GameCounts/Arcade/GameCountsArcadeModes.test.ts b/src/Structures/Static/GameCounts/Arcade/GameCountsArcadeModes.test.ts new file mode 100644 index 000000000..943d855d3 --- /dev/null +++ b/src/Structures/Static/GameCounts/Arcade/GameCountsArcadeModes.test.ts @@ -0,0 +1,78 @@ +import GameCountsArcadeModes from './GameCountsArcadeModes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsArcadeModes', () => { + const data = new GameCountsArcadeModes({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsArcadeModes); + expectTypeOf(data).toEqualTypeOf(); + expect(data.party).toBeDefined(); + expect(data.party).toBeGreaterThanOrEqual(0); + expectTypeOf(data.party).toEqualTypeOf(); + expect(data.holeInTheWall).toBeDefined(); + expect(data.holeInTheWall).toBeGreaterThanOrEqual(0); + expectTypeOf(data.holeInTheWall).toEqualTypeOf(); + expect(data.defender).toBeDefined(); + expect(data.defender).toBeGreaterThanOrEqual(0); + expectTypeOf(data.defender).toEqualTypeOf(); + expect(data.miniWalls).toBeDefined(); + expect(data.miniWalls).toBeGreaterThanOrEqual(0); + expectTypeOf(data.miniWalls).toEqualTypeOf(); + expect(data.simonSays).toBeDefined(); + expect(data.simonSays).toBeGreaterThanOrEqual(0); + expectTypeOf(data.simonSays).toEqualTypeOf(); + expect(data.zombiesBadBlood).toBeDefined(); + expect(data.zombiesBadBlood).toBeGreaterThanOrEqual(0); + expectTypeOf(data.zombiesBadBlood).toEqualTypeOf(); + expect(data.hideAndSeekPartyPooper).toBeDefined(); + expect(data.hideAndSeekPartyPooper).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hideAndSeekPartyPooper).toEqualTypeOf(); + expect(data.dayOne).toBeDefined(); + expect(data.dayOne).toBeGreaterThanOrEqual(0); + expectTypeOf(data.dayOne).toEqualTypeOf(); + expect(data.drawTheirThing).toBeDefined(); + expect(data.drawTheirThing).toBeGreaterThanOrEqual(0); + expectTypeOf(data.drawTheirThing).toEqualTypeOf(); + expect(data.zombiesAlianArcadium).toBeDefined(); + expect(data.zombiesAlianArcadium).toBeGreaterThanOrEqual(0); + expectTypeOf(data.zombiesAlianArcadium).toEqualTypeOf(); + expect(data.pixelParty).toBeDefined(); + expect(data.pixelParty).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pixelParty).toEqualTypeOf(); + expect(data.oneInTheQuiver).toBeDefined(); + expect(data.oneInTheQuiver).toBeGreaterThanOrEqual(0); + expectTypeOf(data.oneInTheQuiver).toEqualTypeOf(); + expect(data.soccer).toBeDefined(); + expect(data.soccer).toBeGreaterThanOrEqual(0); + expectTypeOf(data.soccer).toEqualTypeOf(); + expect(data.zombiesPrison).toBeDefined(); + expect(data.zombiesPrison).toBeGreaterThanOrEqual(0); + expectTypeOf(data.zombiesPrison).toEqualTypeOf(); + expect(data.ender).toBeDefined(); + expect(data.ender).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ender).toEqualTypeOf(); + expect(data.throwOut).toBeDefined(); + expect(data.throwOut).toBeGreaterThanOrEqual(0); + expectTypeOf(data.throwOut).toEqualTypeOf(); + expect(data.starWars).toBeDefined(); + expect(data.starWars).toBeGreaterThanOrEqual(0); + expectTypeOf(data.starWars).toEqualTypeOf(); + expect(data.dragonWars2).toBeDefined(); + expect(data.dragonWars2).toBeGreaterThanOrEqual(0); + expectTypeOf(data.dragonWars2).toEqualTypeOf(); + expect(data.dropper).toBeDefined(); + expect(data.dropper).toBeGreaterThanOrEqual(0); + expectTypeOf(data.dropper).toEqualTypeOf(); + expect(data.zombiesDeadEnd).toBeDefined(); + expect(data.zombiesDeadEnd).toBeGreaterThanOrEqual(0); + expectTypeOf(data.zombiesDeadEnd).toEqualTypeOf(); + expect(data.disasters).toBeDefined(); + expect(data.disasters).toBeGreaterThanOrEqual(0); + expectTypeOf(data.disasters).toEqualTypeOf(); + expect(data.farmHunt).toBeDefined(); + expect(data.farmHunt).toBeGreaterThanOrEqual(0); + expectTypeOf(data.farmHunt).toEqualTypeOf(); + expect(data.hideAndSeekPropHunt).toBeDefined(); + expect(data.hideAndSeekPropHunt).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hideAndSeekPropHunt).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/Arcade/GameCountsArcadeModes.ts b/src/Structures/Static/GameCounts/Arcade/GameCountsArcadeModes.ts new file mode 100644 index 000000000..f8f28fe44 --- /dev/null +++ b/src/Structures/Static/GameCounts/Arcade/GameCountsArcadeModes.ts @@ -0,0 +1,52 @@ +class GameCountsArcadeModes { + party: number; + holeInTheWall: number; + defender: number; + miniWalls: number; + simonSays: number; + zombiesBadBlood: number; + hideAndSeekPartyPooper: number; + dayOne: number; + drawTheirThing: number; + zombiesAlianArcadium: number; + pixelParty: number; + oneInTheQuiver: number; + soccer: number; + zombiesPrison: number; + ender: number; + throwOut: number; + starWars: number; + dragonWars2: number; + dropper: number; + zombiesDeadEnd: number; + disasters: number; + farmHunt: number; + hideAndSeekPropHunt: number; + constructor(data: Record) { + this.party = data?.PARTY || 0; + this.holeInTheWall = data?.HOLE_IN_THE_WALL || 0; + this.defender = data?.DEFENDER || 0; + this.miniWalls = data?.MINI_WALLS || 0; + this.simonSays = data?.SIMON_SAYS || 0; + this.zombiesBadBlood = data?.ZOMBIES_BAD_BLOOD || 0; + this.hideAndSeekPartyPooper = data?.HIDE_AND_SEEK_PARTY_POOPER || 0; + this.dayOne = data?.DAYONE || 0; + this.drawTheirThing = data?.DRAW_THEIR_THING || 0; + this.zombiesAlianArcadium = data?.ZOMBIES_ALIEN_ARCADIUM || 0; + this.pixelParty = data?.PIXEL_PARTY || 0; + this.oneInTheQuiver = data?.ONEINTHEQUIVER || 0; + this.soccer = data?.SOCCER || 0; + this.zombiesPrison = data?.ZOMBIES_PRISON || 0; + this.ender = data?.ENDER || 0; + this.throwOut = data?.THROW_OUT || 0; + this.starWars = data?.STARWARS || 0; + this.dragonWars2 = data?.DRAGONWARS2 || 0; + this.dropper = data?.DROPPER || 0; + this.zombiesDeadEnd = data?.ZOMBIES_DEAD_END || 0; + this.disasters = data?.DISASTERS || 0; + this.farmHunt = data?.FARM_HUNT || 0; + this.hideAndSeekPropHunt = data?.HIDE_AND_SEEK_PROP_HUNT || 0; + } +} + +export default GameCountsArcadeModes; diff --git a/src/Structures/Static/GameCounts/BattleGround/GameCountsBattleGround.test.ts b/src/Structures/Static/GameCounts/BattleGround/GameCountsBattleGround.test.ts new file mode 100644 index 000000000..42af9b0f7 --- /dev/null +++ b/src/Structures/Static/GameCounts/BattleGround/GameCountsBattleGround.test.ts @@ -0,0 +1,13 @@ +import GameCountsBattleGround from './GameCountsBattleGround.js'; +import GameCountsBattleGroundModes from './GameCountsBattleGroundModes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsBattleGround', () => { + const data = new GameCountsBattleGround({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsBattleGround); + expectTypeOf(data).toEqualTypeOf(); + expect(data.modes).toBeDefined(); + expect(data.modes).toBeInstanceOf(GameCountsBattleGroundModes); + expectTypeOf(data.modes).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/BattleGround/GameCountsBattleGround.ts b/src/Structures/Static/GameCounts/BattleGround/GameCountsBattleGround.ts new file mode 100644 index 000000000..cd9bb9bde --- /dev/null +++ b/src/Structures/Static/GameCounts/BattleGround/GameCountsBattleGround.ts @@ -0,0 +1,12 @@ +import GameCountsBattleGroundModes from './GameCountsBattleGroundModes.js'; +import GameCountsGeneric from '../GameCountsGeneric.ts'; + +class GameCountsBattleGround extends GameCountsGeneric { + modes: GameCountsBattleGroundModes; + constructor(data: Record) { + super(data); + this.modes = new GameCountsBattleGroundModes(data?.modes); + } +} + +export default GameCountsBattleGround; diff --git a/src/Structures/Static/GameCounts/BattleGround/GameCountsBattleGroundModes.test.ts b/src/Structures/Static/GameCounts/BattleGround/GameCountsBattleGroundModes.test.ts new file mode 100644 index 000000000..5aa21ff15 --- /dev/null +++ b/src/Structures/Static/GameCounts/BattleGround/GameCountsBattleGroundModes.test.ts @@ -0,0 +1,18 @@ +import GameCountsBattleGroundMods from './GameCountsBattleGroundModes.ts'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsBattleGroundMods', () => { + const data = new GameCountsBattleGroundMods({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsBattleGroundMods); + expectTypeOf(data).toEqualTypeOf(); + expect(data.ctfMini).toBeDefined(); + expect(data.ctfMini).toBeGreaterThanOrEqual(0); + expectTypeOf(data.ctfMini).toEqualTypeOf(); + expect(data.domination).toBeDefined(); + expect(data.domination).toBeGreaterThanOrEqual(0); + expectTypeOf(data.domination).toEqualTypeOf(); + expect(data.teamDeathmatch).toBeDefined(); + expect(data.teamDeathmatch).toBeGreaterThanOrEqual(0); + expectTypeOf(data.teamDeathmatch).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/BattleGround/GameCountsBattleGroundModes.ts b/src/Structures/Static/GameCounts/BattleGround/GameCountsBattleGroundModes.ts new file mode 100644 index 000000000..eab4f4eda --- /dev/null +++ b/src/Structures/Static/GameCounts/BattleGround/GameCountsBattleGroundModes.ts @@ -0,0 +1,12 @@ +class GameCountsBattleGroundMods { + ctfMini: number; + domination: number; + teamDeathmatch: number; + constructor(data: Record) { + this.ctfMini = data?.ctf_mini || 0; + this.domination = data?.domination || 0; + this.teamDeathmatch = data?.team_deathmatch || 0; + } +} + +export default GameCountsBattleGroundMods; diff --git a/src/Structures/Static/GameCounts/BedWars/GameCountsBedWars.test.ts b/src/Structures/Static/GameCounts/BedWars/GameCountsBedWars.test.ts new file mode 100644 index 000000000..813255180 --- /dev/null +++ b/src/Structures/Static/GameCounts/BedWars/GameCountsBedWars.test.ts @@ -0,0 +1,13 @@ +import GameCountsBedWars from './GameCountsBedWars.js'; +import GameCountsGameCountsBedWarsModes from './GameCountsBedWarsModes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsBedWars', () => { + const data = new GameCountsBedWars({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsBedWars); + expectTypeOf(data).toEqualTypeOf(); + expect(data.modes).toBeDefined(); + expect(data.modes).toBeInstanceOf(GameCountsGameCountsBedWarsModes); + expectTypeOf(data.modes).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/BedWars/GameCountsBedWars.ts b/src/Structures/Static/GameCounts/BedWars/GameCountsBedWars.ts new file mode 100644 index 000000000..521691a96 --- /dev/null +++ b/src/Structures/Static/GameCounts/BedWars/GameCountsBedWars.ts @@ -0,0 +1,12 @@ +import GameCountsGameCountsBedWarsModes from './GameCountsBedWarsModes.js'; +import GameCountsGeneric from '../GameCountsGeneric.ts'; + +class GameCountsBedWars extends GameCountsGeneric { + modes: GameCountsGameCountsBedWarsModes; + constructor(data: Record) { + super(data); + this.modes = new GameCountsGameCountsBedWarsModes(data?.modes); + } +} + +export default GameCountsBedWars; diff --git a/src/Structures/Static/GameCounts/BedWars/GameCountsBedWarsModes.test.ts b/src/Structures/Static/GameCounts/BedWars/GameCountsBedWarsModes.test.ts new file mode 100644 index 000000000..408d4c68f --- /dev/null +++ b/src/Structures/Static/GameCounts/BedWars/GameCountsBedWarsModes.test.ts @@ -0,0 +1,75 @@ +import GameCountsBedWarsModes from './GameCountsBedWarsModes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsBedWarsModes', () => { + const data = new GameCountsBedWarsModes({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsBedWarsModes); + expectTypeOf(data).toEqualTypeOf(); + expect(data.twoFour).toBeDefined(); + expect(data.twoFour).toBeGreaterThanOrEqual(0); + expectTypeOf(data.twoFour).toEqualTypeOf(); + expect(data.fourFourRush).toBeDefined(); + expect(data.fourFourRush).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fourFourRush).toEqualTypeOf(); + expect(data.eightOneOneBlock).toBeDefined(); + expect(data.eightOneOneBlock).toBeGreaterThanOrEqual(0); + expectTypeOf(data.eightOneOneBlock).toEqualTypeOf(); + expect(data.eightOne).toBeDefined(); + expect(data.eightOne).toBeGreaterThanOrEqual(0); + expectTypeOf(data.eightOne).toEqualTypeOf(); + expect(data.eightTwoRush).toBeDefined(); + expect(data.eightTwoRush).toBeGreaterThanOrEqual(0); + expectTypeOf(data.eightTwoRush).toEqualTypeOf(); + expect(data.eightTwoVoidless).toBeDefined(); + expect(data.eightTwoVoidless).toBeGreaterThanOrEqual(0); + expectTypeOf(data.eightTwoVoidless).toEqualTypeOf(); + expect(data.fourFourArmed).toBeDefined(); + expect(data.fourFourArmed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fourFourArmed).toEqualTypeOf(); + expect(data.eightTwoArmed).toBeDefined(); + expect(data.eightTwoArmed).toBeGreaterThanOrEqual(0); + expectTypeOf(data.eightTwoArmed).toEqualTypeOf(); + expect(data.eightTwoUnderworld).toBeDefined(); + expect(data.eightTwoUnderworld).toBeGreaterThanOrEqual(0); + expectTypeOf(data.eightTwoUnderworld).toEqualTypeOf(); + expect(data.eightTwoSwap).toBeDefined(); + expect(data.eightTwoSwap).toBeGreaterThanOrEqual(0); + expectTypeOf(data.eightTwoSwap).toEqualTypeOf(); + expect(data.fourFourUnderworld).toBeDefined(); + expect(data.fourFourUnderworld).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fourFourUnderworld).toEqualTypeOf(); + expect(data.eightTwo).toBeDefined(); + expect(data.eightTwo).toBeGreaterThanOrEqual(0); + expectTypeOf(data.eightTwo).toEqualTypeOf(); + expect(data.fourFour).toBeDefined(); + expect(data.fourFour).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fourFour).toEqualTypeOf(); + expect(data.fourFourTultimate).toBeDefined(); + expect(data.fourFourTultimate).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fourFourTultimate).toEqualTypeOf(); + expect(data.practice).toBeDefined(); + expect(data.practice).toBeGreaterThanOrEqual(0); + expectTypeOf(data.practice).toEqualTypeOf(); + expect(data.eightTwoLuck).toBeDefined(); + expect(data.eightTwoLuck).toBeGreaterThanOrEqual(0); + expectTypeOf(data.eightTwoLuck).toEqualTypeOf(); + expect(data.fourFourSwap).toBeDefined(); + expect(data.fourFourSwap).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fourFourSwap).toEqualTypeOf(); + expect(data.fourFourVoidless).toBeDefined(); + expect(data.fourFourVoidless).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fourFourVoidless).toEqualTypeOf(); + expect(data.fourThrww).toBeDefined(); + expect(data.fourThrww).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fourThrww).toEqualTypeOf(); + expect(data.fourFourLucky).toBeDefined(); + expect(data.fourFourLucky).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fourFourLucky).toEqualTypeOf(); + expect(data.castle).toBeDefined(); + expect(data.castle).toBeGreaterThanOrEqual(0); + expectTypeOf(data.castle).toEqualTypeOf(); + expect(data.eightTwoUltimate).toBeDefined(); + expect(data.eightTwoUltimate).toBeGreaterThanOrEqual(0); + expectTypeOf(data.eightTwoUltimate).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/BedWars/GameCountsBedWarsModes.ts b/src/Structures/Static/GameCounts/BedWars/GameCountsBedWarsModes.ts new file mode 100644 index 000000000..000a4aa8a --- /dev/null +++ b/src/Structures/Static/GameCounts/BedWars/GameCountsBedWarsModes.ts @@ -0,0 +1,50 @@ +class GameCountsBedWarsModes { + twoFour: number; + fourFourRush: number; + eightOneOneBlock: number; + eightOne: number; + eightTwoRush: number; + eightTwoVoidless: number; + fourFourArmed: number; + eightTwoArmed: number; + eightTwoUnderworld: number; + eightTwoSwap: number; + fourFourUnderworld: number; + eightTwo: number; + fourFour: number; + fourFourTultimate: number; + practice: number; + eightTwoLuck: number; + fourFourSwap: number; + fourFourVoidless: number; + fourThrww: number; + fourFourLucky: number; + castle: number; + eightTwoUltimate: number; + constructor(data: Record) { + this.twoFour = data?.BEDWARS_TWO_FOUR || 0; + this.fourFourRush = data?.BEDWARS_FOUR_FOUR_RUSH || 0; + this.eightOneOneBlock = data?.BEDWARS_EIGHT_ONE_ONEBLOCK || 0; + this.eightOne = data?.BEDWARS_EIGHT_ONE || 0; + this.eightTwoRush = data?.BEDWARS_EIGHT_TWO_RUSH || 0; + this.eightTwoVoidless = data?.BEDWARS_EIGHT_TWO_VOIDLESS || 0; + this.fourFourArmed = data?.BEDWARS_FOUR_FOUR_ARMED || 0; + this.eightTwoArmed = data?.BEDWARS_EIGHT_TWO_ARMED || 0; + this.eightTwoUnderworld = data?.BEDWARS_EIGHT_TWO_UNDERWORLD || 0; + this.eightTwoSwap = data?.BEDWARS_EIGHT_TWO_SWAP || 0; + this.fourFourUnderworld = data?.BEDWARS_FOUR_FOUR_UNDERWORLD || 0; + this.eightTwo = data?.BEDWARS_EIGHT_TWO || 0; + this.fourFour = data?.BEDWARS_FOUR_FOUR || 0; + this.fourFourTultimate = data?.BEDWARS_FOUR_FOUR_ULTIMATE || 0; + this.practice = data?.BEDWARS_PRACTICE || 0; + this.eightTwoLuck = data?.BEDWARS_EIGHT_TWO_LUCKY || 0; + this.fourFourSwap = data?.BEDWARS_FOUR_FOUR_SWAP || 0; + this.fourFourVoidless = data?.BEDWARS_FOUR_FOUR_VOIDLESS || 0; + this.fourThrww = data?.BEDWARS_FOUR_THREE || 0; + this.fourFourLucky = data?.BEDWARS_FOUR_FOUR_LUCKY || 0; + this.castle = data?.BEDWARS_CASTLE || 0; + this.eightTwoUltimate = data?.BEDWARS_EIGHT_TWO_ULTIMATE || 0; + } +} + +export default GameCountsBedWarsModes; diff --git a/src/Structures/Static/GameCounts/BuildBattle/GameCountsBuildBattle.test.ts b/src/Structures/Static/GameCounts/BuildBattle/GameCountsBuildBattle.test.ts new file mode 100644 index 000000000..683f31b31 --- /dev/null +++ b/src/Structures/Static/GameCounts/BuildBattle/GameCountsBuildBattle.test.ts @@ -0,0 +1,13 @@ +import GameCountsBuildBattle from './GameCountsBuildBattle.js'; +import GameCountsGameCountsBuildBattleModes from './GameCountsBuildBattleModes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsBuildBattle', () => { + const data = new GameCountsBuildBattle({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsBuildBattle); + expectTypeOf(data).toEqualTypeOf(); + expect(data.modes).toBeDefined(); + expect(data.modes).toBeInstanceOf(GameCountsGameCountsBuildBattleModes); + expectTypeOf(data.modes).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/BuildBattle/GameCountsBuildBattle.ts b/src/Structures/Static/GameCounts/BuildBattle/GameCountsBuildBattle.ts new file mode 100644 index 000000000..ecda29ce7 --- /dev/null +++ b/src/Structures/Static/GameCounts/BuildBattle/GameCountsBuildBattle.ts @@ -0,0 +1,12 @@ +import GameCountsGameCountsBuildBattleModes from './GameCountsBuildBattleModes.js'; +import GameCountsGeneric from '../GameCountsGeneric.ts'; + +class GameCountsBuildBattle extends GameCountsGeneric { + modes: GameCountsGameCountsBuildBattleModes; + constructor(data: Record) { + super(data); + this.modes = new GameCountsGameCountsBuildBattleModes(data?.modes); + } +} + +export default GameCountsBuildBattle; diff --git a/src/Structures/Static/GameCounts/BuildBattle/GameCountsBuildBattleModes.test.ts b/src/Structures/Static/GameCounts/BuildBattle/GameCountsBuildBattleModes.test.ts new file mode 100644 index 000000000..2c78005e9 --- /dev/null +++ b/src/Structures/Static/GameCounts/BuildBattle/GameCountsBuildBattleModes.test.ts @@ -0,0 +1,27 @@ +import GameCountsBuildBattleModes from './GameCountsBuildBattleModes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsBuildBattleModes', () => { + const data = new GameCountsBuildBattleModes({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsBuildBattleModes); + expectTypeOf(data).toEqualTypeOf(); + expect(data.soloNormalLatest).toBeDefined(); + expect(data.soloNormalLatest).toBeGreaterThanOrEqual(0); + expectTypeOf(data.soloNormalLatest).toEqualTypeOf(); + expect(data.speedBuilders).toBeDefined(); + expect(data.speedBuilders).toBeGreaterThanOrEqual(0); + expectTypeOf(data.speedBuilders).toEqualTypeOf(); + expect(data.guessTheBuild).toBeDefined(); + expect(data.guessTheBuild).toBeGreaterThanOrEqual(0); + expectTypeOf(data.guessTheBuild).toEqualTypeOf(); + expect(data.teamsNormal).toBeDefined(); + expect(data.teamsNormal).toBeGreaterThanOrEqual(0); + expectTypeOf(data.teamsNormal).toEqualTypeOf(); + expect(data.soloPro).toBeDefined(); + expect(data.soloPro).toBeGreaterThanOrEqual(0); + expectTypeOf(data.soloPro).toEqualTypeOf(); + expect(data.soloNormal).toBeDefined(); + expect(data.soloNormal).toBeGreaterThanOrEqual(0); + expectTypeOf(data.soloNormal).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/BuildBattle/GameCountsBuildBattleModes.ts b/src/Structures/Static/GameCounts/BuildBattle/GameCountsBuildBattleModes.ts new file mode 100644 index 000000000..c343afbe1 --- /dev/null +++ b/src/Structures/Static/GameCounts/BuildBattle/GameCountsBuildBattleModes.ts @@ -0,0 +1,18 @@ +class GameCountsBuildBattleModes { + soloNormalLatest: number; + speedBuilders: number; + guessTheBuild: number; + teamsNormal: number; + soloPro: number; + soloNormal: number; + constructor(data: Record) { + this.soloNormalLatest = data?.BUILD_BATTLE_SOLO_NORMAL_LATEST || 0; + this.speedBuilders = data?.BUILD_BATTLE_SPEED_BUILDERS || 0; + this.guessTheBuild = data?.BUILD_BATTLE_GUESS_THE_BUILD || 0; + this.teamsNormal = data?.BUILD_BATTLE_TEAMS_NORMAL || 0; + this.soloPro = data?.BUILD_BATTLE_SOLO_PRO || 0; + this.soloNormal = data?.BUILD_BATTLE_SOLO_NORMAL || 0; + } +} + +export default GameCountsBuildBattleModes; diff --git a/src/Structures/Static/GameCounts/Duels/GameCountsDuels.test.ts b/src/Structures/Static/GameCounts/Duels/GameCountsDuels.test.ts new file mode 100644 index 000000000..d197bc7fd --- /dev/null +++ b/src/Structures/Static/GameCounts/Duels/GameCountsDuels.test.ts @@ -0,0 +1,13 @@ +import GaemCountsDuels from './GameCountsDuels.ts'; +import GameCountsGameCountsDuelsModes from './GameCountsDuelsModes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GaemCountsDuels', () => { + const data = new GaemCountsDuels({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GaemCountsDuels); + expectTypeOf(data).toEqualTypeOf(); + expect(data.modes).toBeDefined(); + expect(data.modes).toBeInstanceOf(GameCountsGameCountsDuelsModes); + expectTypeOf(data.modes).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/Duels/GameCountsDuels.ts b/src/Structures/Static/GameCounts/Duels/GameCountsDuels.ts new file mode 100644 index 000000000..db11f662a --- /dev/null +++ b/src/Structures/Static/GameCounts/Duels/GameCountsDuels.ts @@ -0,0 +1,12 @@ +import GameCountsGameCountsDuelsModes from './GameCountsDuelsModes.js'; +import GameCountsGeneric from '../GameCountsGeneric.ts'; + +class GaemCountsDuels extends GameCountsGeneric { + modes: GameCountsGameCountsDuelsModes; + constructor(data: Record) { + super(data); + this.modes = new GameCountsGameCountsDuelsModes(data?.modes); + } +} + +export default GaemCountsDuels; diff --git a/src/Structures/Static/GameCounts/Duels/GameCountsDuelsModes.test.ts b/src/Structures/Static/GameCounts/Duels/GameCountsDuelsModes.test.ts new file mode 100644 index 000000000..5d2e37647 --- /dev/null +++ b/src/Structures/Static/GameCounts/Duels/GameCountsDuelsModes.test.ts @@ -0,0 +1,93 @@ +import GameCountsDuelsModes from './GameCountsDuelsModes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsDuelsModes', () => { + const data = new GameCountsDuelsModes({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsDuelsModes); + expectTypeOf(data).toEqualTypeOf(); + expect(data.bowSpleefDuel).toBeDefined(); + expect(data.bowSpleefDuel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowSpleefDuel).toEqualTypeOf(); + expect(data.bowDuel).toBeDefined(); + expect(data.bowDuel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowDuel).toEqualTypeOf(); + expect(data.megaWallsDuel).toBeDefined(); + expect(data.megaWallsDuel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megaWallsDuel).toEqualTypeOf(); + expect(data.UHCFour).toBeDefined(); + expect(data.UHCFour).toBeGreaterThanOrEqual(0); + expectTypeOf(data.UHCFour).toEqualTypeOf(); + expect(data.UHCMeetup).toBeDefined(); + expect(data.UHCMeetup).toBeGreaterThanOrEqual(0); + expectTypeOf(data.UHCMeetup).toEqualTypeOf(); + expect(data.quakeDuel).toBeDefined(); + expect(data.quakeDuel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.quakeDuel).toEqualTypeOf(); + expect(data.skyWarsDoubles).toBeDefined(); + expect(data.skyWarsDoubles).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skyWarsDoubles).toEqualTypeOf(); + expect(data.UHCDoubles).toBeDefined(); + expect(data.UHCDoubles).toBeGreaterThanOrEqual(0); + expectTypeOf(data.UHCDoubles).toEqualTypeOf(); + expect(data.bridgeFour).toBeDefined(); + expect(data.bridgeFour).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridgeFour).toEqualTypeOf(); + expect(data.duelsSumoDuel).toBeDefined(); + expect(data.duelsSumoDuel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.duelsSumoDuel).toEqualTypeOf(); + expect(data.bridgeThrees).toBeDefined(); + expect(data.bridgeThrees).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridgeThrees).toEqualTypeOf(); + expect(data.twoOneDuels).toBeDefined(); + expect(data.twoOneDuels).toBeGreaterThanOrEqual(0); + expectTypeOf(data.twoOneDuels).toEqualTypeOf(); + expect(data.opDuel).toBeDefined(); + expect(data.opDuel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.opDuel).toEqualTypeOf(); + expect(data.duelsArena).toBeDefined(); + expect(data.duelsArena).toBeGreaterThanOrEqual(0); + expectTypeOf(data.duelsArena).toEqualTypeOf(); + expect(data.twoOneRust).toBeDefined(); + expect(data.twoOneRust).toBeGreaterThanOrEqual(0); + expectTypeOf(data.twoOneRust).toEqualTypeOf(); + expect(data.comboDuel).toBeDefined(); + expect(data.comboDuel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.comboDuel).toEqualTypeOf(); + expect(data.bridgeDoubles).toBeDefined(); + expect(data.bridgeDoubles).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridgeDoubles).toEqualTypeOf(); + expect(data.boxingDuel).toBeDefined(); + expect(data.boxingDuel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.boxingDuel).toEqualTypeOf(); + expect(data.UHCDuel).toBeDefined(); + expect(data.UHCDuel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.UHCDuel).toEqualTypeOf(); + expect(data.classicDoubles).toBeDefined(); + expect(data.classicDoubles).toBeGreaterThanOrEqual(0); + expectTypeOf(data.classicDoubles).toEqualTypeOf(); + expect(data.spleefDuel).toBeDefined(); + expect(data.spleefDuel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.spleefDuel).toEqualTypeOf(); + expect(data.opDuels).toBeDefined(); + expect(data.opDuels).toBeGreaterThanOrEqual(0); + expectTypeOf(data.opDuels).toEqualTypeOf(); + expect(data.parkourEight).toBeDefined(); + expect(data.parkourEight).toBeGreaterThanOrEqual(0); + expectTypeOf(data.parkourEight).toEqualTypeOf(); + expect(data.blitzDuel).toBeDefined(); + expect(data.blitzDuel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.blitzDuel).toEqualTypeOf(); + expect(data.classicDuel).toBeDefined(); + expect(data.classicDuel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.classicDuel).toEqualTypeOf(); + expect(data.pottionDuel).toBeDefined(); + expect(data.pottionDuel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.pottionDuel).toEqualTypeOf(); + expect(data.bridgeDuel).toBeDefined(); + expect(data.bridgeDuel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bridgeDuel).toEqualTypeOf(); + expect(data.skyWarsDuel).toBeDefined(); + expect(data.skyWarsDuel).toBeGreaterThanOrEqual(0); + expectTypeOf(data.skyWarsDuel).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/Duels/GameCountsDuelsModes.ts b/src/Structures/Static/GameCounts/Duels/GameCountsDuelsModes.ts new file mode 100644 index 000000000..bc59d3acb --- /dev/null +++ b/src/Structures/Static/GameCounts/Duels/GameCountsDuelsModes.ts @@ -0,0 +1,62 @@ +class GameCountsDuelsModes { + bowSpleefDuel: number; + bowDuel: number; + megaWallsDuel: number; + UHCFour: number; + UHCMeetup: number; + quakeDuel: number; + skyWarsDoubles: number; + UHCDoubles: number; + bridgeFour: number; + duelsSumoDuel: number; + bridgeThrees: number; + twoOneDuels: number; + opDuel: number; + duelsArena: number; + twoOneRust: number; + comboDuel: number; + bridgeDoubles: number; + boxingDuel: number; + UHCDuel: number; + classicDoubles: number; + spleefDuel: number; + opDuels: number; + parkourEight: number; + blitzDuel: number; + classicDuel: number; + pottionDuel: number; + bridgeDuel: number; + skyWarsDuel: number; + constructor(data: Record) { + this.bowSpleefDuel = data?.DUELS_BOWSPLEEF_DUEL || 0; + this.bowDuel = data?.DUELS_BOW_DUEL || 0; + this.megaWallsDuel = data?.DUELS_MW_DUEL || 0; + this.UHCFour = data?.DUELS_UHC_FOUR || 0; + this.UHCMeetup = data?.DUELS_UHC_MEETUP || 0; + this.quakeDuel = data?.DUELS_QUAKE_DUEL || 0; + this.skyWarsDoubles = data?.DUELS_SW_DOUBLES || 0; + this.UHCDoubles = data?.DUELS_UHC_DOUBLES || 0; + this.bridgeFour = data?.DUELS_BRIDGE_FOUR || 0; + this.duelsSumoDuel = data?.DUELS_SUMO_DUEL || 0; + this.bridgeThrees = data?.DUELS_BRIDGE_THREES || 0; + this.twoOneDuels = data?.BEDWARS_TWO_ONE_DUELS || 0; + this.opDuel = data?.DUELS_OP_DUEL || 0; + this.duelsArena = data?.DUELS_DUEL_ARENA || 0; + this.twoOneRust = data?.BEDWARS_TWO_ONE_DUELS_RUSH || 0; + this.comboDuel = data?.DUELS_COMBO_DUEL || 0; + this.bridgeDoubles = data?.DUELS_BRIDGE_DOUBLES || 0; + this.boxingDuel = data?.DUELS_BOXING_DUEL || 0; + this.UHCDuel = data?.DUELS_UHC_DUEL || 0; + this.classicDoubles = data?.DUELS_CLASSIC_DOUBLES || 0; + this.spleefDuel = data?.DUELS_SPLEEF_DUEL || 0; + this.opDuels = data?.DUELS_OP_DOUBLES || 0; + this.parkourEight = data?.DUELS_PARKOUR_EIGHT || 0; + this.blitzDuel = data?.DUELS_BLITZ_DUEL || 0; + this.classicDuel = data?.DUELS_CLASSIC_DUEL || 0; + this.pottionDuel = data?.DUELS_POTION_DUEL || 0; + this.bridgeDuel = data?.DUELS_BRIDGE_DUEL || 0; + this.skyWarsDuel = data?.DUELS_SW_DUEL || 0; + } +} + +export default GameCountsDuelsModes; diff --git a/src/Structures/GameCounts.test.ts b/src/Structures/Static/GameCounts/GameCounts.test.ts similarity index 77% rename from src/Structures/GameCounts.test.ts rename to src/Structures/Static/GameCounts/GameCounts.test.ts index 2f0441db9..c8e010098 100644 --- a/src/Structures/GameCounts.test.ts +++ b/src/Structures/Static/GameCounts/GameCounts.test.ts @@ -1,3 +1,4 @@ +import GameCountGames from './GameCountsGames.js'; import GameCounts from './GameCounts.js'; import { expect, expectTypeOf, test } from 'vitest'; @@ -9,6 +10,9 @@ test('GameCounts', () => { expect(data.playerCount).toBeDefined(); expect(data.playerCount).toBeGreaterThanOrEqual(0); expectTypeOf(data.playerCount).toEqualTypeOf(); + expect(data.games).toBeDefined(); + expect(data.games).toBeInstanceOf(GameCountGames); + expectTypeOf(data.games).toEqualTypeOf(); expect(data.toString).toBeDefined(); expectTypeOf(data.toString).toEqualTypeOf<() => number>(); expect(data.toString()).toBeDefined(); diff --git a/src/Structures/Static/GameCounts/GameCounts.ts b/src/Structures/Static/GameCounts/GameCounts.ts new file mode 100644 index 000000000..926e70804 --- /dev/null +++ b/src/Structures/Static/GameCounts/GameCounts.ts @@ -0,0 +1,21 @@ +import GameCountGames from './GameCountsGames.ts'; +import type RequestData from '../../../Private/RequestData.ts'; + +class GameCounts { + playerCount: number; + games: GameCountGames; + constructor(data: Record) { + this.playerCount = data?.playerCount || 0; + this.games = new GameCountGames(data.games); + } + + toString(): number { + return this.playerCount; + } + + isRaw(): this is RequestData { + return false; + } +} + +export default GameCounts; diff --git a/src/Structures/Static/GameCounts/GameCountsBasicModes.test.ts b/src/Structures/Static/GameCounts/GameCountsBasicModes.test.ts new file mode 100644 index 000000000..5ac0b5e16 --- /dev/null +++ b/src/Structures/Static/GameCounts/GameCountsBasicModes.test.ts @@ -0,0 +1,15 @@ +import GameCountsBasicModes from './GameCountsBasicModes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsBasicModes', () => { + const data = new GameCountsBasicModes({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsBasicModes); + expectTypeOf(data).toEqualTypeOf(); + expect(data.soloNormal).toBeDefined(); + expect(data.soloNormal).toBeGreaterThanOrEqual(0); + expectTypeOf(data.soloNormal).toEqualTypeOf(); + expect(data.teamNormal).toBeDefined(); + expect(data.teamNormal).toBeGreaterThanOrEqual(0); + expectTypeOf(data.teamNormal).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/GameCountsBasicModes.ts b/src/Structures/Static/GameCounts/GameCountsBasicModes.ts new file mode 100644 index 000000000..4724edeed --- /dev/null +++ b/src/Structures/Static/GameCounts/GameCountsBasicModes.ts @@ -0,0 +1,10 @@ +class GameCountsBasicModes { + soloNormal: number; + teamNormal: number; + constructor(data: Record) { + this.soloNormal = data?.solo_normal || 0; + this.teamNormal = data?.team_normal || 0; + } +} + +export default GameCountsBasicModes; diff --git a/src/Structures/Static/GameCounts/GameCountsGames.test.ts b/src/Structures/Static/GameCounts/GameCountsGames.test.ts new file mode 100644 index 000000000..42aa97786 --- /dev/null +++ b/src/Structures/Static/GameCounts/GameCountsGames.test.ts @@ -0,0 +1,110 @@ +import GaemCountsDuels from './Duels/GameCountsDuels.js'; +import GameCountGames from './GameCountsGames.ts'; +import GameCountsArcade from './Arcade/GameCountsArcade.js'; +import GameCountsBattleGround from './BattleGround/GameCountsBattleGround.js'; +import GameCountsBedWars from './BedWars/GameCountsBedWars.js'; +import GameCountsBuildBattle from './BuildBattle/GameCountsBuildBattle.js'; +import GameCountsGeneric from './GameCountsGeneric.js'; +import GameCountsLegacy from './Legacy/GameCountsLegacy.js'; +import GameCountsMCGO from './MCGO/GameCountsMCGO.js'; +import GameCountsMurderMystery from './MurderMystery/GameCountsMurderMystery.js'; +import GameCountsPit from './Pit/GameCountsPit.js'; +import GameCountsReplay from './Replay/GameCountsReplay.js'; +import GameCountsSkyBlock from './SkyBlock/GameCountsSkyBlock.js'; +import GameCountsSkyWars from './SkyWars/GameCountsSkyWars.js'; +import GameCountsSpeedUHC from './SpeedUHC/GameCountsSpeedUHC.js'; +import GameCountsSuperSmash from './SuperSmash/GameCountsSuperSmash.js'; +import GameCountsSurvivalGames from './SurvivalGames/GameCountsSurvivalGames.js'; +import GameCountsTNTGames from './TNTGames/GameCountsTNTGames.js'; +import GameCountsWoolGames from './WoolGames/GameCountsWoolGames.js'; +import UHC from './UHC/GameCountsUHC.js'; +import Walls3 from './Walls3/GameCountsWalls3.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountGames', () => { + const data = new GameCountGames({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountGames); + expectTypeOf(data).toEqualTypeOf(); + expect(data.mainLobby).toBeDefined(); + expect(data.mainLobby).toBeInstanceOf(GameCountsGeneric); + expectTypeOf(data.mainLobby).toEqualTypeOf(); + expect(data.tournamentLobby).toBeDefined(); + expect(data.tournamentLobby).toBeInstanceOf(GameCountsGeneric); + expectTypeOf(data.tournamentLobby).toEqualTypeOf(); + expect(data.smp).toBeDefined(); + expect(data.smp).toBeInstanceOf(GameCountsGeneric); + expectTypeOf(data.smp).toEqualTypeOf(); + expect(data.legacy).toBeDefined(); + expect(data.legacy).toBeInstanceOf(GameCountsLegacy); + expectTypeOf(data.legacy).toEqualTypeOf(); + expect(data.SkyBlock).toBeDefined(); + expect(data.SkyBlock).toBeInstanceOf(GameCountsSkyBlock); + expectTypeOf(data.SkyBlock).toEqualTypeOf(); + expect(data.UHC).toBeDefined(); + expect(data.UHC).toBeInstanceOf(UHC); + expectTypeOf(data.UHC).toEqualTypeOf(); + expect(data.skywars).toBeDefined(); + expect(data.skywars).toBeInstanceOf(GameCountsSkyWars); + expectTypeOf(data.skywars).toEqualTypeOf(); + expect(data.replay).toBeDefined(); + expect(data.replay).toBeInstanceOf(GameCountsReplay); + expectTypeOf(data.replay).toEqualTypeOf(); + expect(data.speedUHC).toBeDefined(); + expect(data.speedUHC).toBeInstanceOf(GameCountsSpeedUHC); + expectTypeOf(data.speedUHC).toEqualTypeOf(); + expect(data.arcade).toBeDefined(); + expect(data.arcade).toBeInstanceOf(GameCountsArcade); + expectTypeOf(data.arcade).toEqualTypeOf(); + expect(data.housing).toBeDefined(); + expect(data.housing).toBeInstanceOf(GameCountsGeneric); + expectTypeOf(data.housing).toEqualTypeOf(); + expect(data.battleGround).toBeDefined(); + expect(data.battleGround).toBeInstanceOf(GameCountsBattleGround); + expectTypeOf(data.battleGround).toEqualTypeOf(); + expect(data.superSmash).toBeDefined(); + expect(data.superSmash).toBeInstanceOf(GameCountsSuperSmash); + expectTypeOf(data.superSmash).toEqualTypeOf(); + expect(data.bedwars).toBeDefined(); + expect(data.bedwars).toBeInstanceOf(GameCountsBedWars); + expectTypeOf(data.bedwars).toEqualTypeOf(); + expect(data.duels).toBeDefined(); + expect(data.duels).toBeInstanceOf(GaemCountsDuels); + expectTypeOf(data.duels).toEqualTypeOf(); + expect(data.walls3).toBeDefined(); + expect(data.walls3).toBeInstanceOf(Walls3); + expectTypeOf(data.walls3).toEqualTypeOf(); + expect(data.murderMystery).toBeDefined(); + expect(data.murderMystery).toBeInstanceOf(GameCountsMurderMystery); + expectTypeOf(data.murderMystery).toEqualTypeOf(); + expect(data.survivalGames).toBeDefined(); + expect(data.survivalGames).toBeInstanceOf(GameCountsSurvivalGames); + expectTypeOf(data.survivalGames).toEqualTypeOf(); + expect(data.buildBattle).toBeDefined(); + expect(data.buildBattle).toBeInstanceOf(GameCountsBuildBattle); + expectTypeOf(data.buildBattle).toEqualTypeOf(); + expect(data.pit).toBeDefined(); + expect(data.pit).toBeInstanceOf(GameCountsPit); + expectTypeOf(data.pit).toEqualTypeOf(); + expect(data.woolGames).toBeDefined(); + expect(data.woolGames).toBeInstanceOf(GameCountsWoolGames); + expectTypeOf(data.woolGames).toEqualTypeOf(); + expect(data.tntGames).toBeDefined(); + expect(data.tntGames).toBeInstanceOf(GameCountsTNTGames); + expectTypeOf(data.tntGames).toEqualTypeOf(); + expect(data.MCGO).toBeDefined(); + expect(data.MCGO).toBeInstanceOf(GameCountsMCGO); + expectTypeOf(data.MCGO).toEqualTypeOf(); + expect(data.prototype).toBeDefined(); + expect(data.prototype).toBeInstanceOf(GameCountsGeneric); + expectTypeOf(data.prototype).toEqualTypeOf(); + expect(data.limbo).toBeDefined(); + expect(data.limbo).toBeInstanceOf(GameCountsGeneric); + expectTypeOf(data.limbo).toEqualTypeOf(); + expect(data.idle).toBeDefined(); + expect(data.idle).toBeInstanceOf(GameCountsGeneric); + expectTypeOf(data.idle).toEqualTypeOf(); + expect(data.queue).toBeDefined(); + expect(data.queue).toBeInstanceOf(GameCountsGeneric); + expectTypeOf(data.queue).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/GameCountsGames.ts b/src/Structures/Static/GameCounts/GameCountsGames.ts new file mode 100644 index 000000000..b0707c396 --- /dev/null +++ b/src/Structures/Static/GameCounts/GameCountsGames.ts @@ -0,0 +1,81 @@ +import GaemCountsDuels from './Duels/GameCountsDuels.js'; +import GameCountsArcade from './Arcade/GameCountsArcade.js'; +import GameCountsBattleGround from './BattleGround/GameCountsBattleGround.js'; +import GameCountsBedWars from './BedWars/GameCountsBedWars.js'; +import GameCountsBuildBattle from './BuildBattle/GameCountsBuildBattle.js'; +import GameCountsGeneric from './GameCountsGeneric.ts'; +import GameCountsLegacy from './Legacy/GameCountsLegacy.js'; +import GameCountsMCGO from './MCGO/GameCountsMCGO.js'; +import GameCountsMurderMystery from './MurderMystery/GameCountsMurderMystery.js'; +import GameCountsPit from './Pit/GameCountsPit.js'; +import GameCountsReplay from './Replay/GameCountsReplay.js'; +import GameCountsSkyBlock from './SkyBlock/GameCountsSkyBlock.js'; +import GameCountsSkyWars from './SkyWars/GameCountsSkyWars.js'; +import GameCountsSpeedUHC from './SpeedUHC/GameCountsSpeedUHC.js'; +import GameCountsSuperSmash from './SuperSmash/GameCountsSuperSmash.js'; +import GameCountsSurvivalGames from './SurvivalGames/GameCountsSurvivalGames.js'; +import GameCountsTNTGames from './TNTGames/GameCountsTNTGames.js'; +import GameCountsWoolGames from './WoolGames/GameCountsWoolGames.js'; +import UHC from './UHC/GameCountsUHC.js'; +import Walls3 from './Walls3/GameCountsWalls3.js'; + +class GameCountGames { + mainLobby: GameCountsGeneric; + tournamentLobby: GameCountsGeneric; + smp: GameCountsGeneric; + legacy: GameCountsLegacy; + SkyBlock: GameCountsSkyBlock; + UHC: UHC; + skywars: GameCountsSkyWars; + replay: GameCountsReplay; + speedUHC: GameCountsSpeedUHC; + arcade: GameCountsArcade; + housing: GameCountsGeneric; + battleGround: GameCountsBattleGround; + superSmash: GameCountsSuperSmash; + bedwars: GameCountsBedWars; + duels: GaemCountsDuels; + walls3: Walls3; + murderMystery: GameCountsMurderMystery; + survivalGames: GameCountsSurvivalGames; + buildBattle: GameCountsBuildBattle; + pit: GameCountsPit; + woolGames: GameCountsWoolGames; + tntGames: GameCountsTNTGames; + MCGO: GameCountsMCGO; + prototype: GameCountsGeneric; + limbo: GameCountsGeneric; + idle: GameCountsGeneric; + queue: GameCountsGeneric; + constructor(data: Record) { + this.mainLobby = new GameCountsGeneric(data?.MAIN_LOBBY); + this.tournamentLobby = new GameCountsGeneric(data?.TOURNAMENT_LOBBY); + this.smp = new GameCountsGeneric(data?.SMP); + this.legacy = new GameCountsLegacy(data?.LEGACY); + this.SkyBlock = new GameCountsSkyBlock(data?.SKYBLOCK); + this.UHC = new UHC(data?.UHC); + this.skywars = new GameCountsSkyWars(data?.SKYWARS); + this.replay = new GameCountsReplay(data?.REPLAY); + this.speedUHC = new GameCountsSpeedUHC(data?.SPEED_UHC); + this.arcade = new GameCountsArcade(data?.ARCADE); + this.housing = new GameCountsGeneric(data?.HOUSING); + this.battleGround = new GameCountsBattleGround(data?.BATTLEGROUND); + this.superSmash = new GameCountsSuperSmash(data?.SUPER_SMASH); + this.bedwars = new GameCountsBedWars(data?.BEDWARS); + this.duels = new GaemCountsDuels(data?.DUELS); + this.walls3 = new Walls3(data?.WALLS3); + this.murderMystery = new GameCountsMurderMystery(data?.MURDER_MYSTERY); + this.survivalGames = new GameCountsSurvivalGames(data?.SURVIVAL_GAMES); + this.buildBattle = new GameCountsBuildBattle(data?.BUILD_BATTLE); + this.pit = new GameCountsPit(data?.PIT); + this.woolGames = new GameCountsWoolGames(data?.WOOL_GAMES); + this.tntGames = new GameCountsTNTGames(data?.TNTGAMES); + this.MCGO = new GameCountsMCGO(data?.MCGO); + this.prototype = new GameCountsGeneric(data?.PROTOTYPE); + this.limbo = new GameCountsGeneric(data?.LIMBO); + this.idle = new GameCountsGeneric(data?.IDLE); + this.queue = new GameCountsGeneric(data?.QUEUE); + } +} + +export default GameCountGames; diff --git a/src/Structures/Static/GameCounts/GameCountsGeneric.test.ts b/src/Structures/Static/GameCounts/GameCountsGeneric.test.ts new file mode 100644 index 000000000..a9e9a12c8 --- /dev/null +++ b/src/Structures/Static/GameCounts/GameCountsGeneric.test.ts @@ -0,0 +1,12 @@ +import GameCountsGeneric from './GameCountsGeneric.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsGeneric', () => { + const data = new GameCountsGeneric({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsGeneric); + expectTypeOf(data).toEqualTypeOf(); + expect(data.players).toBeDefined(); + expect(data.players).toBeGreaterThanOrEqual(0); + expectTypeOf(data.players).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/GameCountsGeneric.ts b/src/Structures/Static/GameCounts/GameCountsGeneric.ts new file mode 100644 index 000000000..d82f6b8b6 --- /dev/null +++ b/src/Structures/Static/GameCounts/GameCountsGeneric.ts @@ -0,0 +1,8 @@ +class GameCountsGeneric { + players: number; + constructor(data: Record) { + this.players = data?.players || 0; + } +} + +export default GameCountsGeneric; diff --git a/src/Structures/Static/GameCounts/Legacy/GameCountsLegacy.test.ts b/src/Structures/Static/GameCounts/Legacy/GameCountsLegacy.test.ts new file mode 100644 index 000000000..395041100 --- /dev/null +++ b/src/Structures/Static/GameCounts/Legacy/GameCountsLegacy.test.ts @@ -0,0 +1,13 @@ +import GameCountsGameCountsLegacyModes from './GameCountsLegacyModes.js'; +import GameCountsLegacy from './GameCountsLegacy.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsLegacy', () => { + const data = new GameCountsLegacy({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsLegacy); + expectTypeOf(data).toEqualTypeOf(); + expect(data.modes).toBeDefined(); + expect(data.modes).toBeInstanceOf(GameCountsGameCountsLegacyModes); + expectTypeOf(data.modes).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/Legacy/GameCountsLegacy.ts b/src/Structures/Static/GameCounts/Legacy/GameCountsLegacy.ts new file mode 100644 index 000000000..39c2e220e --- /dev/null +++ b/src/Structures/Static/GameCounts/Legacy/GameCountsLegacy.ts @@ -0,0 +1,12 @@ +import GameCountsGameCountsLegacyModes from './GameCountsLegacyModes.js'; +import GameCountsGeneric from '../GameCountsGeneric.ts'; + +class GameCountsLegacy extends GameCountsGeneric { + modes: GameCountsGameCountsLegacyModes; + constructor(data: Record) { + super(data); + this.modes = new GameCountsGameCountsLegacyModes(data?.modes); + } +} + +export default GameCountsLegacy; diff --git a/src/Structures/Static/GameCounts/Legacy/GameCountsLegacyModes.test.ts b/src/Structures/Static/GameCounts/Legacy/GameCountsLegacyModes.test.ts new file mode 100644 index 000000000..58c504db4 --- /dev/null +++ b/src/Structures/Static/GameCounts/Legacy/GameCountsLegacyModes.test.ts @@ -0,0 +1,27 @@ +import GameCountsLegacyModes from './GameCountsLegacyModes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsLegacyModes', () => { + const data = new GameCountsLegacyModes({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsLegacyModes); + expectTypeOf(data).toEqualTypeOf(); + expect(data.vampireZ).toBeDefined(); + expect(data.vampireZ).toBeGreaterThanOrEqual(0); + expectTypeOf(data.vampireZ).toEqualTypeOf(); + expect(data.walls).toBeDefined(); + expect(data.walls).toBeGreaterThanOrEqual(0); + expectTypeOf(data.walls).toEqualTypeOf(); + expect(data.quakecraft).toBeDefined(); + expect(data.quakecraft).toBeGreaterThanOrEqual(0); + expectTypeOf(data.quakecraft).toEqualTypeOf(); + expect(data.gingerbread).toBeDefined(); + expect(data.gingerbread).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gingerbread).toEqualTypeOf(); + expect(data.paintball).toBeDefined(); + expect(data.paintball).toBeGreaterThanOrEqual(0); + expectTypeOf(data.paintball).toEqualTypeOf(); + expect(data.arena).toBeDefined(); + expect(data.arena).toBeGreaterThanOrEqual(0); + expectTypeOf(data.arena).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/Legacy/GameCountsLegacyModes.ts b/src/Structures/Static/GameCounts/Legacy/GameCountsLegacyModes.ts new file mode 100644 index 000000000..3c1f36982 --- /dev/null +++ b/src/Structures/Static/GameCounts/Legacy/GameCountsLegacyModes.ts @@ -0,0 +1,18 @@ +class GameCountsLegacyModes { + vampireZ: number; + walls: number; + quakecraft: number; + gingerbread: number; + paintball: number; + arena: number; + constructor(data: Record) { + this.vampireZ = data?.VAMPIREZ || 0; + this.walls = data?.WALLS || 0; + this.quakecraft = data?.QUAKECRAFT || 0; + this.gingerbread = data?.GINGERBREAD || 0; + this.paintball = data?.PAINTBALL || 0; + this.arena = data?.ARENA || 0; + } +} + +export default GameCountsLegacyModes; diff --git a/src/Structures/Static/GameCounts/MCGO/GameCountsMCGO.test.ts b/src/Structures/Static/GameCounts/MCGO/GameCountsMCGO.test.ts new file mode 100644 index 000000000..aed4fff51 --- /dev/null +++ b/src/Structures/Static/GameCounts/MCGO/GameCountsMCGO.test.ts @@ -0,0 +1,13 @@ +import GameCountsGameCountsMCGOModes from './GameCountsMCGOModes.js'; +import GameCountsMCGO from './GameCountsMCGO.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsMCGO', () => { + const data = new GameCountsMCGO({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsMCGO); + expectTypeOf(data).toEqualTypeOf(); + expect(data.modes).toBeDefined(); + expect(data.modes).toBeInstanceOf(GameCountsGameCountsMCGOModes); + expectTypeOf(data.modes).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/MCGO/GameCountsMCGO.ts b/src/Structures/Static/GameCounts/MCGO/GameCountsMCGO.ts new file mode 100644 index 000000000..955efbb05 --- /dev/null +++ b/src/Structures/Static/GameCounts/MCGO/GameCountsMCGO.ts @@ -0,0 +1,12 @@ +import GameCountsGameCountsMCGOModes from './GameCountsMCGOModes.js'; +import GameCountsGeneric from '../GameCountsGeneric.ts'; + +class GameCountsMCGO extends GameCountsGeneric { + modes: GameCountsGameCountsMCGOModes; + constructor(data: Record) { + super(data); + this.modes = new GameCountsGameCountsMCGOModes(data?.modes); + } +} + +export default GameCountsMCGO; diff --git a/src/Structures/Static/GameCounts/MCGO/GameCountsMCGOModes.test.ts b/src/Structures/Static/GameCounts/MCGO/GameCountsMCGOModes.test.ts new file mode 100644 index 000000000..9e073c8b8 --- /dev/null +++ b/src/Structures/Static/GameCounts/MCGO/GameCountsMCGOModes.test.ts @@ -0,0 +1,18 @@ +import GameCountsMCGOModes from './GameCountsMCGOModes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsMCGOModes', () => { + const data = new GameCountsMCGOModes({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsMCGOModes); + expectTypeOf(data).toEqualTypeOf(); + expect(data.normal).toBeDefined(); + expect(data.normal).toBeGreaterThanOrEqual(0); + expectTypeOf(data.normal).toEqualTypeOf(); + expect(data.gungame).toBeDefined(); + expect(data.gungame).toBeGreaterThanOrEqual(0); + expectTypeOf(data.gungame).toEqualTypeOf(); + expect(data.deathmatch).toBeDefined(); + expect(data.deathmatch).toBeGreaterThanOrEqual(0); + expectTypeOf(data.deathmatch).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/MCGO/GameCountsMCGOModes.ts b/src/Structures/Static/GameCounts/MCGO/GameCountsMCGOModes.ts new file mode 100644 index 000000000..4e5c96d77 --- /dev/null +++ b/src/Structures/Static/GameCounts/MCGO/GameCountsMCGOModes.ts @@ -0,0 +1,12 @@ +class GameCountsMCGOModes { + normal: number; + gungame: number; + deathmatch: number; + constructor(data: Record) { + this.normal = data?.normal || 0; + this.gungame = data?.gungame || 0; + this.deathmatch = data?.deathmatch || 0; + } +} + +export default GameCountsMCGOModes; diff --git a/src/Structures/Static/GameCounts/MurderMystery/GameCountsMurderMystery.test.ts b/src/Structures/Static/GameCounts/MurderMystery/GameCountsMurderMystery.test.ts new file mode 100644 index 000000000..97f0493df --- /dev/null +++ b/src/Structures/Static/GameCounts/MurderMystery/GameCountsMurderMystery.test.ts @@ -0,0 +1,13 @@ +import GameCountsGameCountsMurderMysteryModes from './GameCountsMurderMysteryModes.js'; +import GameCountsMurderMystery from './GameCountsMurderMystery.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsMurderMystery', () => { + const data = new GameCountsMurderMystery({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsMurderMystery); + expectTypeOf(data).toEqualTypeOf(); + expect(data.modes).toBeDefined(); + expect(data.modes).toBeInstanceOf(GameCountsGameCountsMurderMysteryModes); + expectTypeOf(data.modes).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/MurderMystery/GameCountsMurderMystery.ts b/src/Structures/Static/GameCounts/MurderMystery/GameCountsMurderMystery.ts new file mode 100644 index 000000000..402d0e737 --- /dev/null +++ b/src/Structures/Static/GameCounts/MurderMystery/GameCountsMurderMystery.ts @@ -0,0 +1,12 @@ +import GameCountsGameCountsMurderMysteryModes from './GameCountsMurderMysteryModes.js'; +import GameCountsGeneric from '../GameCountsGeneric.ts'; + +class GameCountsMurderMystery extends GameCountsGeneric { + modes: GameCountsGameCountsMurderMysteryModes; + constructor(data: Record) { + super(data); + this.modes = new GameCountsGameCountsMurderMysteryModes(data?.modes); + } +} + +export default GameCountsMurderMystery; diff --git a/src/Structures/Static/GameCounts/MurderMystery/GameCountsMurderMysteryModes.test.ts b/src/Structures/Static/GameCounts/MurderMystery/GameCountsMurderMysteryModes.test.ts new file mode 100644 index 000000000..38e247902 --- /dev/null +++ b/src/Structures/Static/GameCounts/MurderMystery/GameCountsMurderMysteryModes.test.ts @@ -0,0 +1,21 @@ +import GameCountsMurderMysteryModes from './GameCountsMurderMysteryModes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsMurderMysteryModes', () => { + const data = new GameCountsMurderMysteryModes({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsMurderMysteryModes); + expectTypeOf(data).toEqualTypeOf(); + expect(data.doubleUp).toBeDefined(); + expect(data.doubleUp).toBeGreaterThanOrEqual(0); + expectTypeOf(data.doubleUp).toEqualTypeOf(); + expect(data.infection).toBeDefined(); + expect(data.infection).toBeGreaterThanOrEqual(0); + expectTypeOf(data.infection).toEqualTypeOf(); + expect(data.assassins).toBeDefined(); + expect(data.assassins).toBeGreaterThanOrEqual(0); + expectTypeOf(data.assassins).toEqualTypeOf(); + expect(data.classic).toBeDefined(); + expect(data.classic).toBeGreaterThanOrEqual(0); + expectTypeOf(data.classic).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/MurderMystery/GameCountsMurderMysteryModes.ts b/src/Structures/Static/GameCounts/MurderMystery/GameCountsMurderMysteryModes.ts new file mode 100644 index 000000000..520ab2ee2 --- /dev/null +++ b/src/Structures/Static/GameCounts/MurderMystery/GameCountsMurderMysteryModes.ts @@ -0,0 +1,14 @@ +class GameCountsMurderMysteryModes { + doubleUp: number; + infection: number; + assassins: number; + classic: number; + constructor(data: Record) { + this.doubleUp = data?.MURDER_DOUBLE_UP || 0; + this.infection = data?.MURDER_INFECTION || 0; + this.assassins = data?.MURDER_ASSASSINS || 0; + this.classic = data?.MURDER_CLASSIC || 0; + } +} + +export default GameCountsMurderMysteryModes; diff --git a/src/Structures/Static/GameCounts/Pit/GameCountsPit.test.ts b/src/Structures/Static/GameCounts/Pit/GameCountsPit.test.ts new file mode 100644 index 000000000..1d39b055a --- /dev/null +++ b/src/Structures/Static/GameCounts/Pit/GameCountsPit.test.ts @@ -0,0 +1,13 @@ +import GameCountsGameCountsPitModes from './GameCountsPitModes.js'; +import GameCountsPit from './GameCountsPit.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsPit', () => { + const data = new GameCountsPit({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsPit); + expectTypeOf(data).toEqualTypeOf(); + expect(data.modes).toBeDefined(); + expect(data.modes).toBeInstanceOf(GameCountsGameCountsPitModes); + expectTypeOf(data.modes).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/Pit/GameCountsPit.ts b/src/Structures/Static/GameCounts/Pit/GameCountsPit.ts new file mode 100644 index 000000000..9e0ebbc24 --- /dev/null +++ b/src/Structures/Static/GameCounts/Pit/GameCountsPit.ts @@ -0,0 +1,12 @@ +import GameCountsGameCountsPitModes from './GameCountsPitModes.js'; +import GameCountsGeneric from '../GameCountsGeneric.ts'; + +class GameCountsPit extends GameCountsGeneric { + modes: GameCountsGameCountsPitModes; + constructor(data: Record) { + super(data); + this.modes = new GameCountsGameCountsPitModes(data?.modes); + } +} + +export default GameCountsPit; diff --git a/src/Structures/Static/GameCounts/Pit/GameCountsPitModes.test.ts b/src/Structures/Static/GameCounts/Pit/GameCountsPitModes.test.ts new file mode 100644 index 000000000..921e32221 --- /dev/null +++ b/src/Structures/Static/GameCounts/Pit/GameCountsPitModes.test.ts @@ -0,0 +1,12 @@ +import GameCountsPitModes from './GameCountsPitModes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsPitModes', () => { + const data = new GameCountsPitModes({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsPitModes); + expectTypeOf(data).toEqualTypeOf(); + expect(data.PIT).toBeDefined(); + expect(data.PIT).toBeGreaterThanOrEqual(0); + expectTypeOf(data.PIT).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/Pit/GameCountsPitModes.ts b/src/Structures/Static/GameCounts/Pit/GameCountsPitModes.ts new file mode 100644 index 000000000..590f48ddd --- /dev/null +++ b/src/Structures/Static/GameCounts/Pit/GameCountsPitModes.ts @@ -0,0 +1,8 @@ +class GameCountsPitModes { + PIT: number; + constructor(data: Record) { + this.PIT = data?.PIT || 0; + } +} + +export default GameCountsPitModes; diff --git a/src/Structures/Static/GameCounts/Replay/GameCountsReplay.test.ts b/src/Structures/Static/GameCounts/Replay/GameCountsReplay.test.ts new file mode 100644 index 000000000..df1bdff12 --- /dev/null +++ b/src/Structures/Static/GameCounts/Replay/GameCountsReplay.test.ts @@ -0,0 +1,13 @@ +import GameCountsGameContsReplayModes from './GameCountsReplayModes.js'; +import GameCountsReplay from './GameCountsReplay.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsReplay', () => { + const data = new GameCountsReplay({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsReplay); + expectTypeOf(data).toEqualTypeOf(); + expect(data.modes).toBeDefined(); + expect(data.modes).toBeInstanceOf(GameCountsGameContsReplayModes); + expectTypeOf(data.modes).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/Replay/GameCountsReplay.ts b/src/Structures/Static/GameCounts/Replay/GameCountsReplay.ts new file mode 100644 index 000000000..88378fb03 --- /dev/null +++ b/src/Structures/Static/GameCounts/Replay/GameCountsReplay.ts @@ -0,0 +1,12 @@ +import GameCountsGameContsReplayModes from './GameCountsReplayModes.js'; +import GameCountsGeneric from '../GameCountsGeneric.ts'; + +class GameCountsReplay extends GameCountsGeneric { + modes: GameCountsGameContsReplayModes; + constructor(data: Record) { + super(data); + this.modes = new GameCountsGameContsReplayModes(data?.modes); + } +} + +export default GameCountsReplay; diff --git a/src/Structures/Static/GameCounts/Replay/GameCountsReplayModes.test.ts b/src/Structures/Static/GameCounts/Replay/GameCountsReplayModes.test.ts new file mode 100644 index 000000000..e7b0aab6f --- /dev/null +++ b/src/Structures/Static/GameCounts/Replay/GameCountsReplayModes.test.ts @@ -0,0 +1,12 @@ +import GameContsReplayModes from './GameCountsReplayModes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameContsReplayModes', () => { + const data = new GameContsReplayModes({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameContsReplayModes); + expectTypeOf(data).toEqualTypeOf(); + expect(data.base).toBeDefined(); + expect(data.base).toBeGreaterThanOrEqual(0); + expectTypeOf(data.base).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/Replay/GameCountsReplayModes.ts b/src/Structures/Static/GameCounts/Replay/GameCountsReplayModes.ts new file mode 100644 index 000000000..bbfdb6d84 --- /dev/null +++ b/src/Structures/Static/GameCounts/Replay/GameCountsReplayModes.ts @@ -0,0 +1,8 @@ +class GameContsReplayModes { + base: number; + constructor(data: Record) { + this.base = data?.BASE || 0; + } +} + +export default GameContsReplayModes; diff --git a/src/Structures/Static/GameCounts/SkyBlock/GameCountsSkyBlock.test.ts b/src/Structures/Static/GameCounts/SkyBlock/GameCountsSkyBlock.test.ts new file mode 100644 index 000000000..20086fe05 --- /dev/null +++ b/src/Structures/Static/GameCounts/SkyBlock/GameCountsSkyBlock.test.ts @@ -0,0 +1,13 @@ +import GameCountsGameCountsSkyBlockModes from './GameCountsSkyBlockModes.js'; +import GameCountsSkyBlock from './GameCountsSkyBlock.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsSkyBlock', () => { + const data = new GameCountsSkyBlock({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsSkyBlock); + expectTypeOf(data).toEqualTypeOf(); + expect(data.modes).toBeDefined(); + expect(data.modes).toBeInstanceOf(GameCountsGameCountsSkyBlockModes); + expectTypeOf(data.modes).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/SkyBlock/GameCountsSkyBlock.ts b/src/Structures/Static/GameCounts/SkyBlock/GameCountsSkyBlock.ts new file mode 100644 index 000000000..55b979e9c --- /dev/null +++ b/src/Structures/Static/GameCounts/SkyBlock/GameCountsSkyBlock.ts @@ -0,0 +1,12 @@ +import GameCountsGameCountsSkyBlockModes from './GameCountsSkyBlockModes.js'; +import GameCountsGeneric from '../GameCountsGeneric.ts'; + +class GameCountsSkyBlock extends GameCountsGeneric { + modes: GameCountsGameCountsSkyBlockModes; + constructor(data: Record) { + super(data); + this.modes = new GameCountsGameCountsSkyBlockModes(data?.modes); + } +} + +export default GameCountsSkyBlock; diff --git a/src/Structures/Static/GameCounts/SkyBlock/GameCountsSkyBlockModes.test.ts b/src/Structures/Static/GameCounts/SkyBlock/GameCountsSkyBlockModes.test.ts new file mode 100644 index 000000000..a3c046174 --- /dev/null +++ b/src/Structures/Static/GameCounts/SkyBlock/GameCountsSkyBlockModes.test.ts @@ -0,0 +1,72 @@ +import GameCountsSkyBlockModes from './GameCountsSkyBlockModes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsSkyBlockModes', () => { + const data = new GameCountsSkyBlockModes({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsSkyBlockModes); + expectTypeOf(data).toEqualTypeOf(); + expect(data.instanced).toBeDefined(); + expect(data.instanced).toBeGreaterThanOrEqual(0); + expectTypeOf(data.instanced).toEqualTypeOf(); + expect(data.foraging2).toBeDefined(); + expect(data.foraging2).toBeGreaterThanOrEqual(0); + expectTypeOf(data.foraging2).toEqualTypeOf(); + expect(data.garden).toBeDefined(); + expect(data.garden).toBeGreaterThanOrEqual(0); + expectTypeOf(data.garden).toEqualTypeOf(); + expect(data.dungeonHub).toBeDefined(); + expect(data.dungeonHub).toBeGreaterThanOrEqual(0); + expectTypeOf(data.dungeonHub).toEqualTypeOf(); + expect(data.fishing1).toBeDefined(); + expect(data.fishing1).toBeGreaterThanOrEqual(0); + expectTypeOf(data.fishing1).toEqualTypeOf(); + expect(data.farming1).toBeDefined(); + expect(data.farming1).toBeGreaterThanOrEqual(0); + expectTypeOf(data.farming1).toEqualTypeOf(); + expect(data.mining2).toBeDefined(); + expect(data.mining2).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mining2).toEqualTypeOf(); + expect(data.darkAuction).toBeDefined(); + expect(data.darkAuction).toBeGreaterThanOrEqual(0); + expectTypeOf(data.darkAuction).toEqualTypeOf(); + expect(data.kuudra).toBeDefined(); + expect(data.kuudra).toBeGreaterThanOrEqual(0); + expectTypeOf(data.kuudra).toEqualTypeOf(); + expect(data.crimsonIsle).toBeDefined(); + expect(data.crimsonIsle).toBeGreaterThanOrEqual(0); + expectTypeOf(data.crimsonIsle).toEqualTypeOf(); + expect(data.mining3).toBeDefined(); + expect(data.mining3).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mining3).toEqualTypeOf(); + expect(data.crystalHollows).toBeDefined(); + expect(data.crystalHollows).toBeGreaterThanOrEqual(0); + expectTypeOf(data.crystalHollows).toEqualTypeOf(); + expect(data.dynamic).toBeDefined(); + expect(data.dynamic).toBeGreaterThanOrEqual(0); + expectTypeOf(data.dynamic).toEqualTypeOf(); + expect(data.combat3).toBeDefined(); + expect(data.combat3).toBeGreaterThanOrEqual(0); + expectTypeOf(data.combat3).toEqualTypeOf(); + expect(data.combat1).toBeDefined(); + expect(data.combat1).toBeGreaterThanOrEqual(0); + expectTypeOf(data.combat1).toEqualTypeOf(); + expect(data.foraging1).toBeDefined(); + expect(data.foraging1).toBeGreaterThanOrEqual(0); + expectTypeOf(data.foraging1).toEqualTypeOf(); + expect(data.hub).toBeDefined(); + expect(data.hub).toBeGreaterThanOrEqual(0); + expectTypeOf(data.hub).toEqualTypeOf(); + expect(data.dungeon).toBeDefined(); + expect(data.dungeon).toBeGreaterThanOrEqual(0); + expectTypeOf(data.dungeon).toEqualTypeOf(); + expect(data.mining1).toBeDefined(); + expect(data.mining1).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mining1).toEqualTypeOf(); + expect(data.rift).toBeDefined(); + expect(data.rift).toBeGreaterThanOrEqual(0); + expectTypeOf(data.rift).toEqualTypeOf(); + expect(data.mineshaft).toBeDefined(); + expect(data.mineshaft).toBeGreaterThanOrEqual(0); + expectTypeOf(data.mineshaft).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/SkyBlock/GameCountsSkyBlockModes.ts b/src/Structures/Static/GameCounts/SkyBlock/GameCountsSkyBlockModes.ts new file mode 100644 index 000000000..e8443f9c5 --- /dev/null +++ b/src/Structures/Static/GameCounts/SkyBlock/GameCountsSkyBlockModes.ts @@ -0,0 +1,48 @@ +class GameCountsSkyBlockModes { + instanced: number; + foraging2: number; + garden: number; + dungeonHub: number; + fishing1: number; + farming1: number; + mining2: number; + darkAuction: number; + kuudra: number; + crimsonIsle: number; + mining3: number; + crystalHollows: number; + dynamic: number; + combat3: number; + combat1: number; + foraging1: number; + hub: number; + dungeon: number; + mining1: number; + rift: number; + mineshaft: number; + constructor(data: Record) { + this.instanced = data?.instanced || 0; + this.foraging2 = data?.foraging_2 || 0; + this.garden = data?.garden || 0; + this.dungeonHub = data?.dungeon_hub || 0; + this.fishing1 = data?.fishing_1 || 0; + this.farming1 = data?.farming_1 || 0; + this.mining2 = data?.mining_2 || 0; + this.darkAuction = data?.dark_auction || 0; + this.kuudra = data?.kuudra || 0; + this.crimsonIsle = data?.crimson_isle || 0; + this.mining3 = data?.mining_3 || 0; + this.crystalHollows = data?.crystal_hollows || 0; + this.dynamic = data?.dynamic || 0; + this.combat3 = data?.combat_3 || 0; + this.combat1 = data?.combat_1 || 0; + this.foraging1 = data?.foraging_1 || 0; + this.hub = data?.hub || 0; + this.dungeon = data?.dungeon || 0; + this.mining1 = data?.mining_1 || 0; + this.rift = data?.rift || 0; + this.mineshaft = data?.mineshaft || 0; + } +} + +export default GameCountsSkyBlockModes; diff --git a/src/Structures/Static/GameCounts/SkyWars/GameCountsSkyWars.test.ts b/src/Structures/Static/GameCounts/SkyWars/GameCountsSkyWars.test.ts new file mode 100644 index 000000000..5581d9833 --- /dev/null +++ b/src/Structures/Static/GameCounts/SkyWars/GameCountsSkyWars.test.ts @@ -0,0 +1,13 @@ +import GameCountsMCGOModes from './GameCountsSkyWarsModes.js'; +import GameCountsSkyWars from './GameCountsSkyWars.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsSkyWars', () => { + const data = new GameCountsSkyWars({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsSkyWars); + expectTypeOf(data).toEqualTypeOf(); + expect(data.modes).toBeDefined(); + expect(data.modes).toBeInstanceOf(GameCountsMCGOModes); + expectTypeOf(data.modes).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/SkyWars/GameCountsSkyWars.ts b/src/Structures/Static/GameCounts/SkyWars/GameCountsSkyWars.ts new file mode 100644 index 000000000..ca08c5af5 --- /dev/null +++ b/src/Structures/Static/GameCounts/SkyWars/GameCountsSkyWars.ts @@ -0,0 +1,12 @@ +import GameCountsGeneric from '../GameCountsGeneric.ts'; +import GameCountsMCGOModes from './GameCountsSkyWarsModes.js'; + +class GameCountsSkyWars extends GameCountsGeneric { + modes: GameCountsMCGOModes; + constructor(data: Record) { + super(data); + this.modes = new GameCountsMCGOModes(data?.modes); + } +} + +export default GameCountsSkyWars; diff --git a/src/Structures/Static/GameCounts/SkyWars/GameCountsSkyWarsModes.test.ts b/src/Structures/Static/GameCounts/SkyWars/GameCountsSkyWarsModes.test.ts new file mode 100644 index 000000000..ee5501220 --- /dev/null +++ b/src/Structures/Static/GameCounts/SkyWars/GameCountsSkyWarsModes.test.ts @@ -0,0 +1,45 @@ +import GameCountsSkyWarsModes from './GameCountsSkyWarsModes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsSkyWarsModes', () => { + const data = new GameCountsSkyWarsModes({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsSkyWarsModes); + expectTypeOf(data).toEqualTypeOf(); + expect(data.soloInsaneLucky).toBeDefined(); + expect(data.soloInsaneLucky).toBeGreaterThanOrEqual(0); + expectTypeOf(data.soloInsaneLucky).toEqualTypeOf(); + expect(data.soloInsaneSlime).toBeDefined(); + expect(data.soloInsaneSlime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.soloInsaneSlime).toEqualTypeOf(); + expect(data.teamsInsaneSlime).toBeDefined(); + expect(data.teamsInsaneSlime).toBeGreaterThanOrEqual(0); + expectTypeOf(data.teamsInsaneSlime).toEqualTypeOf(); + expect(data.teamsInsaneRush).toBeDefined(); + expect(data.teamsInsaneRush).toBeGreaterThanOrEqual(0); + expectTypeOf(data.teamsInsaneRush).toEqualTypeOf(); + expect(data.teamsInsaneLucky).toBeDefined(); + expect(data.teamsInsaneLucky).toBeGreaterThanOrEqual(0); + expectTypeOf(data.teamsInsaneLucky).toEqualTypeOf(); + expect(data.soloInsaneHuntersVsBeasts).toBeDefined(); + expect(data.soloInsaneHuntersVsBeasts).toBeGreaterThanOrEqual(0); + expectTypeOf(data.soloInsaneHuntersVsBeasts).toEqualTypeOf(); + expect(data.soloInsaneTntMadness).toBeDefined(); + expect(data.soloInsaneTntMadness).toBeGreaterThanOrEqual(0); + expectTypeOf(data.soloInsaneTntMadness).toEqualTypeOf(); + expect(data.megaDoubles).toBeDefined(); + expect(data.megaDoubles).toBeGreaterThanOrEqual(0); + expectTypeOf(data.megaDoubles).toEqualTypeOf(); + expect(data.miniNormal).toBeDefined(); + expect(data.miniNormal).toBeGreaterThanOrEqual(0); + expectTypeOf(data.miniNormal).toEqualTypeOf(); + expect(data.soloInsaneRush).toBeDefined(); + expect(data.soloInsaneRush).toBeGreaterThanOrEqual(0); + expectTypeOf(data.soloInsaneRush).toEqualTypeOf(); + expect(data.soloInsane).toBeDefined(); + expect(data.soloInsane).toBeGreaterThanOrEqual(0); + expectTypeOf(data.soloInsane).toEqualTypeOf(); + expect(data.teamsInsaneTntMadness).toBeDefined(); + expect(data.teamsInsaneTntMadness).toBeGreaterThanOrEqual(0); + expectTypeOf(data.teamsInsaneTntMadness).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/SkyWars/GameCountsSkyWarsModes.ts b/src/Structures/Static/GameCounts/SkyWars/GameCountsSkyWarsModes.ts new file mode 100644 index 000000000..5ad1f6724 --- /dev/null +++ b/src/Structures/Static/GameCounts/SkyWars/GameCountsSkyWarsModes.ts @@ -0,0 +1,33 @@ +import GameCountsBasicModes from '../GameCountsBasicModes.ts'; + +class GameCountsSkyWarsModes extends GameCountsBasicModes { + soloInsaneLucky: number; + soloInsaneSlime: number; + teamsInsaneSlime: number; + teamsInsaneRush: number; + teamsInsaneLucky: number; + soloInsaneHuntersVsBeasts: number; + soloInsaneTntMadness: number; + megaDoubles: number; + miniNormal: number; + soloInsaneRush: number; + soloInsane: number; + teamsInsaneTntMadness: number; + constructor(data: Record) { + super(data); + this.soloInsaneLucky = data?.solo_insane_lucky || 0; + this.soloInsaneSlime = data?.solo_insane_slime || 0; + this.teamsInsaneSlime = data?.teams_insane_slime || 0; + this.teamsInsaneRush = data?.teams_insane_rush || 0; + this.teamsInsaneLucky = data?.teams_insane_lucky || 0; + this.soloInsaneHuntersVsBeasts = data?.solo_insane_hunters_vs_beasts || 0; + this.soloInsaneTntMadness = data?.solo_insane_tnt_madness || 0; + this.megaDoubles = data?.mega_doubles || 0; + this.miniNormal = data?.mini_normal || 0; + this.soloInsaneRush = data?.solo_insane_rush || 0; + this.soloInsane = data?.solo_insane || 0; + this.teamsInsaneTntMadness = data?.teams_insane_tnt_madness || 0; + } +} + +export default GameCountsSkyWarsModes; diff --git a/src/Structures/Static/GameCounts/SpeedUHC/GameCountsSpeedUHC.test.ts b/src/Structures/Static/GameCounts/SpeedUHC/GameCountsSpeedUHC.test.ts new file mode 100644 index 000000000..84d91da9b --- /dev/null +++ b/src/Structures/Static/GameCounts/SpeedUHC/GameCountsSpeedUHC.test.ts @@ -0,0 +1,13 @@ +import GameCountsBasicModes from '../GameCountsBasicModes.js'; +import GameCountsSpeedUHC from './GameCountsSpeedUHC.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsSpeedUHC', () => { + const data = new GameCountsSpeedUHC({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsSpeedUHC); + expectTypeOf(data).toEqualTypeOf(); + expect(data.modes).toBeDefined(); + expect(data.modes).toBeInstanceOf(GameCountsBasicModes); + expectTypeOf(data.modes).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/SpeedUHC/GameCountsSpeedUHC.ts b/src/Structures/Static/GameCounts/SpeedUHC/GameCountsSpeedUHC.ts new file mode 100644 index 000000000..6bdbb75c3 --- /dev/null +++ b/src/Structures/Static/GameCounts/SpeedUHC/GameCountsSpeedUHC.ts @@ -0,0 +1,12 @@ +import GameCountsBasicModes from '../GameCountsBasicModes.ts'; +import GameCountsGeneric from '../GameCountsGeneric.ts'; + +class GameCountsSpeedUHC extends GameCountsGeneric { + modes: GameCountsBasicModes; + constructor(data: Record) { + super(data); + this.modes = new GameCountsBasicModes(data?.modes); + } +} + +export default GameCountsSpeedUHC; diff --git a/src/Structures/Static/GameCounts/SuperSmash/GameCountsSuperSmash.test.ts b/src/Structures/Static/GameCounts/SuperSmash/GameCountsSuperSmash.test.ts new file mode 100644 index 000000000..cfc687f03 --- /dev/null +++ b/src/Structures/Static/GameCounts/SuperSmash/GameCountsSuperSmash.test.ts @@ -0,0 +1,13 @@ +import GameCountsGameCountsSuperSmashModes from './GameCountsSuperSmashModes.js'; +import GameCountsSuperSmash from './GameCountsSuperSmash.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsSuperSmash', () => { + const data = new GameCountsSuperSmash({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsSuperSmash); + expectTypeOf(data).toEqualTypeOf(); + expect(data.modes).toBeDefined(); + expect(data.modes).toBeInstanceOf(GameCountsGameCountsSuperSmashModes); + expectTypeOf(data.modes).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/SuperSmash/GameCountsSuperSmash.ts b/src/Structures/Static/GameCounts/SuperSmash/GameCountsSuperSmash.ts new file mode 100644 index 000000000..d0d9b4501 --- /dev/null +++ b/src/Structures/Static/GameCounts/SuperSmash/GameCountsSuperSmash.ts @@ -0,0 +1,12 @@ +import GameCountsGameCountsSuperSmashModes from './GameCountsSuperSmashModes.js'; +import GameCountsGeneric from '../GameCountsGeneric.ts'; + +class GameCountsSuperSmash extends GameCountsGeneric { + modes: GameCountsGameCountsSuperSmashModes; + constructor(data: Record) { + super(data); + this.modes = new GameCountsGameCountsSuperSmashModes(data?.modes); + } +} + +export default GameCountsSuperSmash; diff --git a/src/Structures/Static/GameCounts/SuperSmash/GameCountsSuperSmashModes.test.ts b/src/Structures/Static/GameCounts/SuperSmash/GameCountsSuperSmashModes.test.ts new file mode 100644 index 000000000..d6d85a64f --- /dev/null +++ b/src/Structures/Static/GameCounts/SuperSmash/GameCountsSuperSmashModes.test.ts @@ -0,0 +1,18 @@ +import GameCountsSuperSmashModes from './GameCountsSuperSmashModes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsSuperSmashModes', () => { + const data = new GameCountsSuperSmashModes({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsSuperSmashModes); + expectTypeOf(data).toEqualTypeOf(); + expect(data['1v1Normal']).toBeDefined(); + expect(data['1v1Normal']).toBeGreaterThanOrEqual(0); + expectTypeOf(data['1v1Normal']).toEqualTypeOf(); + expect(data.friendsNormal).toBeDefined(); + expect(data.friendsNormal).toBeGreaterThanOrEqual(0); + expectTypeOf(data.friendsNormal).toEqualTypeOf(); + expect(data['2v2Normal']).toBeDefined(); + expect(data['2v2Normal']).toBeGreaterThanOrEqual(0); + expectTypeOf(data['2v2Normal']).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/SuperSmash/GameCountsSuperSmashModes.ts b/src/Structures/Static/GameCounts/SuperSmash/GameCountsSuperSmashModes.ts new file mode 100644 index 000000000..9cab04b12 --- /dev/null +++ b/src/Structures/Static/GameCounts/SuperSmash/GameCountsSuperSmashModes.ts @@ -0,0 +1,15 @@ +import GameCountsBasicModes from '../GameCountsBasicModes.ts'; + +class GameCountsSuperSmashModes extends GameCountsBasicModes { + '1v1Normal': number; + friendsNormal: number; + '2v2Normal': number; + constructor(data: Record) { + super(data); + this['1v1Normal'] = data?.['1v1_normal'] || 0; + this.friendsNormal = data?.friends_normal || 0; + this['2v2Normal'] = data?.['.2v2_normal'] || 0; + } +} + +export default GameCountsSuperSmashModes; diff --git a/src/Structures/Static/GameCounts/SurvivalGames/GameCountsSurvivalGames.test.ts b/src/Structures/Static/GameCounts/SurvivalGames/GameCountsSurvivalGames.test.ts new file mode 100644 index 000000000..363f03f9f --- /dev/null +++ b/src/Structures/Static/GameCounts/SurvivalGames/GameCountsSurvivalGames.test.ts @@ -0,0 +1,13 @@ +import GameCountsBasicModes from '../GameCountsBasicModes.js'; +import GameCountsSurvivalGames from './GameCountsSurvivalGames.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsSurvivalGames', () => { + const data = new GameCountsSurvivalGames({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsSurvivalGames); + expectTypeOf(data).toEqualTypeOf(); + expect(data.modes).toBeDefined(); + expect(data.modes).toBeInstanceOf(GameCountsBasicModes); + expectTypeOf(data.modes).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/SurvivalGames/GameCountsSurvivalGames.ts b/src/Structures/Static/GameCounts/SurvivalGames/GameCountsSurvivalGames.ts new file mode 100644 index 000000000..f85cac829 --- /dev/null +++ b/src/Structures/Static/GameCounts/SurvivalGames/GameCountsSurvivalGames.ts @@ -0,0 +1,12 @@ +import GameCountsBasicModes from '../GameCountsBasicModes.ts'; +import GameCountsGeneric from '../GameCountsGeneric.ts'; + +class GameCountsSurvivalGames extends GameCountsGeneric { + modes: GameCountsBasicModes; + constructor(data: Record) { + super(data); + this.modes = new GameCountsBasicModes(data?.modes); + } +} + +export default GameCountsSurvivalGames; diff --git a/src/Structures/Static/GameCounts/TNTGames/GameCountsTNTGames.test.ts b/src/Structures/Static/GameCounts/TNTGames/GameCountsTNTGames.test.ts new file mode 100644 index 000000000..e1d6554ae --- /dev/null +++ b/src/Structures/Static/GameCounts/TNTGames/GameCountsTNTGames.test.ts @@ -0,0 +1,13 @@ +import GameCountsTNTGames from './GameCountsTNTGames.js'; +import GameCountsTNTGamesModes from './GameCountsTNTGamesModes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsTNTGames', () => { + const data = new GameCountsTNTGames({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsTNTGames); + expectTypeOf(data).toEqualTypeOf(); + expect(data.modes).toBeDefined(); + expect(data.modes).toBeInstanceOf(GameCountsTNTGamesModes); + expectTypeOf(data.modes).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/TNTGames/GameCountsTNTGames.ts b/src/Structures/Static/GameCounts/TNTGames/GameCountsTNTGames.ts new file mode 100644 index 000000000..adb4b1a0f --- /dev/null +++ b/src/Structures/Static/GameCounts/TNTGames/GameCountsTNTGames.ts @@ -0,0 +1,12 @@ +import GameCountsGeneric from '../GameCountsGeneric.ts'; +import GameCountsTNTGamesModes from './GameCountsTNTGamesModes.js'; + +class GameCountsTNTGames extends GameCountsGeneric { + modes: GameCountsTNTGamesModes; + constructor(data: Record) { + super(data); + this.modes = new GameCountsTNTGamesModes(data?.modes); + } +} + +export default GameCountsTNTGames; diff --git a/src/Structures/Static/GameCounts/TNTGames/GameCountsTNTGamesModes.test.ts b/src/Structures/Static/GameCounts/TNTGames/GameCountsTNTGamesModes.test.ts new file mode 100644 index 000000000..e54847c8d --- /dev/null +++ b/src/Structures/Static/GameCounts/TNTGames/GameCountsTNTGamesModes.test.ts @@ -0,0 +1,24 @@ +import GameCountsTNTGamesModes from './GameCountsTNTGamesModes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsTNTGamesModes', () => { + const data = new GameCountsTNTGamesModes({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsTNTGamesModes); + expectTypeOf(data).toEqualTypeOf(); + expect(data.PVPRun).toBeDefined(); + expect(data.PVPRun).toBeGreaterThanOrEqual(0); + expectTypeOf(data.PVPRun).toEqualTypeOf(); + expect(data.TNTTag).toBeDefined(); + expect(data.TNTTag).toBeGreaterThanOrEqual(0); + expectTypeOf(data.TNTTag).toEqualTypeOf(); + expect(data.TNTRun).toBeDefined(); + expect(data.TNTRun).toBeGreaterThanOrEqual(0); + expectTypeOf(data.TNTRun).toEqualTypeOf(); + expect(data.bowSpleef).toBeDefined(); + expect(data.bowSpleef).toBeGreaterThanOrEqual(0); + expectTypeOf(data.bowSpleef).toEqualTypeOf(); + expect(data.capture).toBeDefined(); + expect(data.capture).toBeGreaterThanOrEqual(0); + expectTypeOf(data.capture).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/TNTGames/GameCountsTNTGamesModes.ts b/src/Structures/Static/GameCounts/TNTGames/GameCountsTNTGamesModes.ts new file mode 100644 index 000000000..8c69e61ea --- /dev/null +++ b/src/Structures/Static/GameCounts/TNTGames/GameCountsTNTGamesModes.ts @@ -0,0 +1,16 @@ +class GameCountsTNTGamesModes { + PVPRun: number; + TNTTag: number; + TNTRun: number; + bowSpleef: number; + capture: number; + constructor(data: Record) { + this.PVPRun = data?.PVPRUN || 0; + this.TNTTag = data?.TNTAG || 0; + this.TNTRun = data?.TNTRUN || 0; + this.bowSpleef = data?.BOWSPLEEF || 0; + this.capture = data?.CAPTURE || 0; + } +} + +export default GameCountsTNTGamesModes; diff --git a/src/Structures/Static/GameCounts/UHC/GameCountsUHC.test.ts b/src/Structures/Static/GameCounts/UHC/GameCountsUHC.test.ts new file mode 100644 index 000000000..f7be84b49 --- /dev/null +++ b/src/Structures/Static/GameCounts/UHC/GameCountsUHC.test.ts @@ -0,0 +1,13 @@ +import GameCountsUHC from './GameCountsUHC.js'; +import GameCountsUHCModes from './GameCountsUHCModes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsUHC', () => { + const data = new GameCountsUHC({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsUHC); + expectTypeOf(data).toEqualTypeOf(); + expect(data.modes).toBeDefined(); + expect(data.modes).toBeInstanceOf(GameCountsUHCModes); + expectTypeOf(data.modes).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/UHC/GameCountsUHC.ts b/src/Structures/Static/GameCounts/UHC/GameCountsUHC.ts new file mode 100644 index 000000000..b5571e0f1 --- /dev/null +++ b/src/Structures/Static/GameCounts/UHC/GameCountsUHC.ts @@ -0,0 +1,12 @@ +import GameCountsGeneric from '../GameCountsGeneric.ts'; +import GameCountsUHCModes from './GameCountsUHCModes.js'; + +class GameCountsUHC extends GameCountsGeneric { + modes: GameCountsUHCModes; + constructor(data: Record) { + super(data); + this.modes = new GameCountsUHCModes(data?.modes); + } +} + +export default GameCountsUHC; diff --git a/src/Structures/Static/GameCounts/UHC/GameCountsUHCModes.test.ts b/src/Structures/Static/GameCounts/UHC/GameCountsUHCModes.test.ts new file mode 100644 index 000000000..728b165ef --- /dev/null +++ b/src/Structures/Static/GameCounts/UHC/GameCountsUHCModes.test.ts @@ -0,0 +1,18 @@ +import GameCountsUHCModes from './GameCountsUHCModes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsUHCModes', () => { + const data = new GameCountsUHCModes({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsUHCModes); + expectTypeOf(data).toEqualTypeOf(); + expect(data.teams).toBeDefined(); + expect(data.teams).toBeGreaterThanOrEqual(0); + expectTypeOf(data.teams).toEqualTypeOf(); + expect(data.solo).toBeDefined(); + expect(data.solo).toBeGreaterThanOrEqual(0); + expectTypeOf(data.solo).toEqualTypeOf(); + expect(data.brawlDuo).toBeDefined(); + expect(data.brawlDuo).toBeGreaterThanOrEqual(0); + expectTypeOf(data.brawlDuo).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/UHC/GameCountsUHCModes.ts b/src/Structures/Static/GameCounts/UHC/GameCountsUHCModes.ts new file mode 100644 index 000000000..85048b96f --- /dev/null +++ b/src/Structures/Static/GameCounts/UHC/GameCountsUHCModes.ts @@ -0,0 +1,12 @@ +class GameCountsUHCModes { + teams: number; + solo: number; + brawlDuo: number; + constructor(data: Record) { + this.teams = data?.TEAMS || 0; + this.solo = data?.SOLO || 0; + this.brawlDuo = data?.BRAWL_DUO || 0; + } +} + +export default GameCountsUHCModes; diff --git a/src/Structures/Static/GameCounts/Walls3/GameCountsWalls3.test.ts b/src/Structures/Static/GameCounts/Walls3/GameCountsWalls3.test.ts new file mode 100644 index 000000000..7477bab8e --- /dev/null +++ b/src/Structures/Static/GameCounts/Walls3/GameCountsWalls3.test.ts @@ -0,0 +1,13 @@ +import GameCountsWalls3 from './GameCountsWalls3.js'; +import GameCountsWalls3Modes from './GameCountsWalls3Modes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsWalls3', () => { + const data = new GameCountsWalls3({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsWalls3); + expectTypeOf(data).toEqualTypeOf(); + expect(data.modes).toBeDefined(); + expect(data.modes).toBeInstanceOf(GameCountsWalls3Modes); + expectTypeOf(data.modes).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/Walls3/GameCountsWalls3.ts b/src/Structures/Static/GameCounts/Walls3/GameCountsWalls3.ts new file mode 100644 index 000000000..78c5eb822 --- /dev/null +++ b/src/Structures/Static/GameCounts/Walls3/GameCountsWalls3.ts @@ -0,0 +1,12 @@ +import GameCountsGeneric from '../GameCountsGeneric.ts'; +import GameCountsWalls3Modes from './GameCountsWalls3Modes.js'; + +class GameCountsWalls3 extends GameCountsGeneric { + modes: GameCountsWalls3Modes; + constructor(data: Record) { + super(data); + this.modes = new GameCountsWalls3Modes(data?.modes); + } +} + +export default GameCountsWalls3; diff --git a/src/Structures/Static/GameCounts/Walls3/GameCountsWalls3Modes.test.ts b/src/Structures/Static/GameCounts/Walls3/GameCountsWalls3Modes.test.ts new file mode 100644 index 000000000..bad3d4dc7 --- /dev/null +++ b/src/Structures/Static/GameCounts/Walls3/GameCountsWalls3Modes.test.ts @@ -0,0 +1,15 @@ +import GameCountsWalls3Modes from './GameCountsWalls3Modes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsWalls3Modes', () => { + const data = new GameCountsWalls3Modes({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsWalls3Modes); + expectTypeOf(data).toEqualTypeOf(); + expect(data.standard).toBeDefined(); + expect(data.standard).toBeGreaterThanOrEqual(0); + expectTypeOf(data.standard).toEqualTypeOf(); + expect(data.faceOff).toBeDefined(); + expect(data.faceOff).toBeGreaterThanOrEqual(0); + expectTypeOf(data.faceOff).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/Walls3/GameCountsWalls3Modes.ts b/src/Structures/Static/GameCounts/Walls3/GameCountsWalls3Modes.ts new file mode 100644 index 000000000..a4f456329 --- /dev/null +++ b/src/Structures/Static/GameCounts/Walls3/GameCountsWalls3Modes.ts @@ -0,0 +1,10 @@ +class GameCountsWalls3Modes { + standard: number; + faceOff: number; + constructor(data: Record) { + this.standard = data?.standard || 0; + this.faceOff = data?.face_off || 0; + } +} + +export default GameCountsWalls3Modes; diff --git a/src/Structures/Static/GameCounts/WoolGames/GameCountsWoolGames.test.ts b/src/Structures/Static/GameCounts/WoolGames/GameCountsWoolGames.test.ts new file mode 100644 index 000000000..52abe92be --- /dev/null +++ b/src/Structures/Static/GameCounts/WoolGames/GameCountsWoolGames.test.ts @@ -0,0 +1,13 @@ +import GameCountsGameCountsWoolGamesModes from './GameCountsWoolGamesModes.js'; +import GameCountsWoolGames from './GameCountsWoolGames.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsWoolGames', () => { + const data = new GameCountsWoolGames({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsWoolGames); + expectTypeOf(data).toEqualTypeOf(); + expect(data.modes).toBeDefined(); + expect(data.modes).toBeInstanceOf(GameCountsGameCountsWoolGamesModes); + expectTypeOf(data.modes).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/WoolGames/GameCountsWoolGames.ts b/src/Structures/Static/GameCounts/WoolGames/GameCountsWoolGames.ts new file mode 100644 index 000000000..476656fd7 --- /dev/null +++ b/src/Structures/Static/GameCounts/WoolGames/GameCountsWoolGames.ts @@ -0,0 +1,12 @@ +import GameCountsGameCountsWoolGamesModes from './GameCountsWoolGamesModes.js'; +import GameCountsGeneric from '../GameCountsGeneric.ts'; + +class GameCountsWoolGames extends GameCountsGeneric { + modes: GameCountsGameCountsWoolGamesModes; + constructor(data: Record) { + super(data); + this.modes = new GameCountsGameCountsWoolGamesModes(data?.modes); + } +} + +export default GameCountsWoolGames; diff --git a/src/Structures/Static/GameCounts/WoolGames/GameCountsWoolGamesModes.test.ts b/src/Structures/Static/GameCounts/WoolGames/GameCountsWoolGamesModes.test.ts new file mode 100644 index 000000000..089c7ada7 --- /dev/null +++ b/src/Structures/Static/GameCounts/WoolGames/GameCountsWoolGamesModes.test.ts @@ -0,0 +1,18 @@ +import GameCountsWoolGamesModes from './GameCountsWoolGamesModes.js'; +import { expect, expectTypeOf, test } from 'vitest'; + +test('GameCountsWoolGamesModes', () => { + const data = new GameCountsWoolGamesModes({ stats: 'meow' }); + expect(data).toBeDefined(); + expect(data).toBeInstanceOf(GameCountsWoolGamesModes); + expectTypeOf(data).toEqualTypeOf(); + expect(data.captureTheWoolTwoTwenty).toBeDefined(); + expect(data.captureTheWoolTwoTwenty).toBeGreaterThanOrEqual(0); + expectTypeOf(data.captureTheWoolTwoTwenty).toEqualTypeOf(); + expect(data.sheepWarsTwoSix).toBeDefined(); + expect(data.sheepWarsTwoSix).toBeGreaterThanOrEqual(0); + expectTypeOf(data.sheepWarsTwoSix).toEqualTypeOf(); + expect(data.woolWarsTwoFour).toBeDefined(); + expect(data.woolWarsTwoFour).toBeGreaterThanOrEqual(0); + expectTypeOf(data.woolWarsTwoFour).toEqualTypeOf(); +}); diff --git a/src/Structures/Static/GameCounts/WoolGames/GameCountsWoolGamesModes.ts b/src/Structures/Static/GameCounts/WoolGames/GameCountsWoolGamesModes.ts new file mode 100644 index 000000000..47c44afb3 --- /dev/null +++ b/src/Structures/Static/GameCounts/WoolGames/GameCountsWoolGamesModes.ts @@ -0,0 +1,12 @@ +class GameCountsWoolGamesModes { + captureTheWoolTwoTwenty: number; + sheepWarsTwoSix: number; + woolWarsTwoFour: number; + constructor(data: Record) { + this.captureTheWoolTwoTwenty = data?.capture_the_wool_two_twenty || 0; + this.sheepWarsTwoSix = data?.sheep_wars_two_six || 0; + this.woolWarsTwoFour = data?.wool_wars_two_four || 0; + } +} + +export default GameCountsWoolGamesModes; diff --git a/src/index.ts b/src/index.ts index fb58c2ea6..dbdfc893b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -112,7 +112,46 @@ import GalaxyWars from './Structures/MiniGames/Arcade/GalaxyWars.js'; import Game from './Structures/Game.js'; import GameAchievements from './Structures/Static/Achievements/GameAchievements.js'; import GameChallenges from './Structures/Static/GameChallenges.js'; -import GameCounts from './Structures/GameCounts.js'; +import GameCounts from './Structures/Static/GameCounts/GameCounts.js'; +import GameCountsArcade from './Structures/Static/GameCounts/Arcade/GameCountsArcade.js'; +import GameCountsArcadeModes from './Structures/Static/GameCounts/Arcade/GameCountsArcadeModes.js'; +import GameCountsBasicModes from './Structures/Static/GameCounts/GameCountsBasicModes.js'; +import GameCountsBattleGround from './Structures/Static/GameCounts/BattleGround/GameCountsBattleGround.js'; +import GameCountsBattleGroundModes from './Structures/Static/GameCounts/BattleGround/GameCountsBattleGroundModes.js'; +import GameCountsBedWars from './Structures/Static/GameCounts/BedWars/GameCountsBedWars.js'; +import GameCountsBedWarsModes from './Structures/Static/GameCounts/BedWars/GameCountsBedWarsModes.js'; +import GameCountsBuildBattle from './Structures/Static/GameCounts/BuildBattle/GameCountsBuildBattle.js'; +import GameCountsBuildBattleModes from './Structures/Static/GameCounts/BuildBattle/GameCountsBuildBattleModes.js'; +import GameCountsDuels from './Structures/Static/GameCounts/Duels/GameCountsDuels.js'; +import GameCountsDuelsModes from './Structures/Static/GameCounts/Duels/GameCountsDuelsModes.js'; +import GameCountsGames from './Structures/Static/GameCounts/GameCountsGames.js'; +import GameCountsGeneric from './Structures/Static/GameCounts/GameCountsGeneric.js'; +import GameCountsLegacy from './Structures/Static/GameCounts/Legacy/GameCountsLegacy.js'; +import GameCountsLegacyModes from './Structures/Static/GameCounts/Legacy/GameCountsLegacyModes.js'; +import GameCountsMCGO from './Structures/Static/GameCounts/MCGO/GameCountsMCGO.js'; +import GameCountsMCGOModes from './Structures/Static/GameCounts/MCGO/GameCountsMCGOModes.js'; +import GameCountsMurderMystery from './Structures/Static/GameCounts/MurderMystery/GameCountsMurderMystery.js'; +import GameCountsMurderMysteryModes from './Structures/Static/GameCounts/MurderMystery/GameCountsMurderMysteryModes.js'; +import GameCountsPit from './Structures/Static/GameCounts/Pit/GameCountsPit.js'; +import GameCountsPitModes from './Structures/Static/GameCounts/Pit/GameCountsPitModes.js'; +import GameCountsReplay from './Structures/Static/GameCounts/Replay/GameCountsReplay.js'; +import GameCountsReplayModes from './Structures/Static/GameCounts/Replay/GameCountsReplayModes.js'; +import GameCountsSkyBlock from './Structures/Static/GameCounts/SkyBlock/GameCountsSkyBlock.js'; +import GameCountsSkyBlockModes from './Structures/Static/GameCounts/SkyBlock/GameCountsSkyBlockModes.js'; +import GameCountsSkyWars from './Structures/Static/GameCounts/SkyWars/GameCountsSkyWars.js'; +import GameCountsSkyWarsModes from './Structures/Static/GameCounts/SkyWars/GameCountsSkyWarsModes.js'; +import GameCountsSpeedUHC from './Structures/Static/GameCounts/SpeedUHC/GameCountsSpeedUHC.js'; +import GameCountsSuperSmash from './Structures/Static/GameCounts/SuperSmash/GameCountsSuperSmash.js'; +import GameCountsSuperSmashModes from './Structures/Static/GameCounts/SuperSmash/GameCountsSuperSmashModes.js'; +import GameCountsSurvivalGames from './Structures/Static/GameCounts/SurvivalGames/GameCountsSurvivalGames.js'; +import GameCountsTNTGames from './Structures/Static/GameCounts/TNTGames/GameCountsTNTGames.js'; +import GameCountsTNTGamesModes from './Structures/Static/GameCounts/TNTGames/GameCountsTNTGamesModes.js'; +import GameCountsUHC from './Structures/Static/GameCounts/UHC/GameCountsUHC.js'; +import GameCountsUHCModes from './Structures/Static/GameCounts/UHC/GameCountsUHCModes.js'; +import GameCountsWalls3 from './Structures/Static/GameCounts/Walls3/GameCountsWalls3.js'; +import GameCountsWalls3Modes from './Structures/Static/GameCounts/Walls3/GameCountsWalls3Modes.js'; +import GameCountsWoolGames from './Structures/Static/GameCounts/WoolGames/GameCountsWoolGames.js'; +import GameCountsWoolGamesModes from './Structures/Static/GameCounts/WoolGames/GameCountsWoolGamesModes.js'; import GameQuests from './Structures/Static/GameQuests.js'; import GrinchSimulator from './Structures/MiniGames/Arcade/GrinchSimulator.js'; import Guild from './Structures/Guild/Guild.js'; @@ -499,6 +538,45 @@ export { GameAchievements, GameChallenges, GameCounts, + GameCountsArcade, + GameCountsArcadeModes, + GameCountsBasicModes, + GameCountsBattleGround, + GameCountsBattleGroundModes, + GameCountsBedWars, + GameCountsBedWarsModes, + GameCountsBuildBattle, + GameCountsBuildBattleModes, + GameCountsDuels, + GameCountsDuelsModes, + GameCountsGames, + GameCountsGeneric, + GameCountsLegacy, + GameCountsLegacyModes, + GameCountsMCGO, + GameCountsMCGOModes, + GameCountsMurderMystery, + GameCountsMurderMysteryModes, + GameCountsPit, + GameCountsPitModes, + GameCountsReplay, + GameCountsReplayModes, + GameCountsSkyBlock, + GameCountsSkyBlockModes, + GameCountsSkyWars, + GameCountsSkyWarsModes, + GameCountsSpeedUHC, + GameCountsSuperSmash, + GameCountsSuperSmashModes, + GameCountsSurvivalGames, + GameCountsTNTGames, + GameCountsTNTGamesModes, + GameCountsUHC, + GameCountsUHCModes, + GameCountsWalls3, + GameCountsWalls3Modes, + GameCountsWoolGames, + GameCountsWoolGamesModes, GameQuests, GrinchSimulator, Guild, @@ -886,6 +964,45 @@ export default { GameAchievements, GameChallenges, GameCounts, + GameCountsArcade, + GameCountsArcadeModes, + GameCountsBasicModes, + GameCountsBattleGround, + GameCountsBattleGroundModes, + GameCountsBedWars, + GameCountsBedWarsModes, + GameCountsBuildBattle, + GameCountsBuildBattleModes, + GameCountsDuels, + GameCountsDuelsModes, + GameCountsGames, + GameCountsGeneric, + GameCountsLegacy, + GameCountsLegacyModes, + GameCountsMCGO, + GameCountsMCGOModes, + GameCountsMurderMystery, + GameCountsMurderMysteryModes, + GameCountsPit, + GameCountsPitModes, + GameCountsReplay, + GameCountsReplayModes, + GameCountsSkyBlock, + GameCountsSkyBlockModes, + GameCountsSkyWars, + GameCountsSkyWarsModes, + GameCountsSpeedUHC, + GameCountsSuperSmash, + GameCountsSuperSmashModes, + GameCountsSurvivalGames, + GameCountsTNTGames, + GameCountsTNTGamesModes, + GameCountsUHC, + GameCountsUHCModes, + GameCountsWalls3, + GameCountsWalls3Modes, + GameCountsWoolGames, + GameCountsWoolGamesModes, GameQuests, GrinchSimulator, Guild, From 49fcb3ee965a492fc74b38db881e77da1720f340 Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 11 Feb 2026 15:31:36 +0800 Subject: [PATCH 124/124] Release 12.0.0-23 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 811f9d56a..1bff57b71 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hypixel-api-reborn", - "version": "12.0.0-22", + "version": "12.0.0-23", "description": "Feature-rich Hypixel API wrapper for Node.js", "main": "dist/index.js", "types": "dist/index.d.ts",